diff --git a/Dockers/strapi/strapi/CODE_OF_CONDUCT.md b/Dockers/strapi/strapi/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..4748c9d --- /dev/null +++ b/Dockers/strapi/strapi/CODE_OF_CONDUCT.md @@ -0,0 +1,83 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience +- Focusing on what is best not just for us as individuals, but for the overall community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or advances of any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email address, without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at hi@strapi.io. All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of actions. + +**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder][mozilla coc]. + +For answers to common questions about this code of conduct, see the FAQ at [https://www.contributor-covenant.org/faq][faq]. Translations are available at [https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[mozilla coc]: https://github.com/mozilla/diversity +[faq]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/Dockers/strapi/strapi/CONTRIBUTING.md b/Dockers/strapi/strapi/CONTRIBUTING.md new file mode 100644 index 0000000..62b5bb0 --- /dev/null +++ b/Dockers/strapi/strapi/CONTRIBUTING.md @@ -0,0 +1,244 @@ +# Contribute to Strapi + +Strapi is an open-source project administered by [the Strapi team](https://strapi.io/about-us). We appreciate your interest and efforts to contribute to Strapi. See the [LICENSE](https://github.com/strapi/strapi/blob/main/LICENSE) licensing information. All work done is available on GitHub. + +We highly appreciate your effort to contribute, but we recommend you talk to a maintainer before spending a lot of time making a pull request that may not align with the project roadmap. Whether it is from Strapi or contributors, every pull request goes through the same process. + +## Feature Requests + +Feature Requests by the community are highly encouraged. Feel free to submit a new one or upvote an existing feature request on [feedback.strapi.io](https://feedback.strapi.io/). + +## Request For Comments (RFC) + +Larger chunks of changes to Strapi that might affect many users require a thorough design phase before starting working on a PR. We will do our best to respond as soon as possible, but since we need to discuss these proposals thoroughly, please do not expect them to be merged and accepted immediately. + +The Request For Comments process will help us create consensus among the core team and include as much feedback as possible from the community for these upcoming changes. + +A Request For Comments has to be created on the [strapi/rfcs](https://github.com/strapi/rfcs) repository. + +## Code of Conduct + +This project, and everyone participating in it, are governed by the [Strapi Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold it. Make sure to read the [full text](CODE_OF_CONDUCT.md) to understand which type of actions may or may not be tolerated. + +## Contributor License Agreement (CLA) + +### Individual contribution + +You need to sign a Contributor License Agreement (CLA) to accept your pull request. You only need to do this once. If you submit a pull request for the first time, you can complete your CLA [here](https://cla.strapi.io/strapi/strapi), or our CLA bot will automatically ask you to sign before merging the pull request. + +### Company contribution + +If you make contributions to our repositories on behalf of your company, we will need a Corporate Contributor License Agreement (CLA) signed. To do that, please get in touch with us at [contributions@strapi.io](mailto:contributions@strapi.io). + +## Documentation + +Pull requests related to fixing documentation for the latest release should be directed towards the [documentation repository](https://github.com/strapi/documentation). Please follow the [documentation contributing guide](https://github.com/strapi/documentation/blob/main/CONTRIBUTING.md) for more information. + +## Bugs + +Strapi is using [GitHub issues](https://github.com/strapi/strapi/issues) to manage bugs. We keep a close eye on them. Before filing a new issue, try to ensure your problem does not already exist. + +--- + +## Before Submitting a Pull Request + +The Strapi core team will review your pull request and either merge it, request changes, or close it. + +## Contribution Prerequisites + +- You have [Node.js](https://nodejs.org/en/) at version `>= v18 and <= v22` and [Yarn](https://yarnpkg.com/en/) at v1.2.0+ installed. +- You are familiar with [Git](https://git-scm.com). + +**Before submitting your pull request** make sure the following requirements are fulfilled: + +- Fork the repository and create your new branch from `develop`. +- Run `yarn install` in the root of the repository. +- Run `yarn setup` in the root of the repository. +- If you've fixed a bug or added code that should be tested, please make sure to add tests +- Ensure the following test suites are passing: + - `yarn test:unit` + - `yarn test:front` + - `yarn test:e2e --setup --concurrency=1` + - you **_may_** need to install Playwright browsers first: `yarn playwright install` +- Make sure your code lints by running `yarn lint`. +- If your contribution fixes an existing issue, please make sure to link it in your pull request. + +## Development Workflow + +### 1. Fork the [repository](https://github.com/strapi/strapi) + +[Go to the repository](https://github.com/strapi/strapi) and fork it using your own GitHub account. + +### 2. Clone your repository + +```bash +git clone git@github.com:YOUR_USERNAME/strapi.git +``` + +### 3. Install the dependencies + +Go to the root of the repository and run the setup: + +```bash +cd strapi +yarn install +yarn setup + +``` + +### 4. Start the example application + +```bash +cd ./examples/getstarted +yarn develop +``` + +Make sure to read the [`getstarted` application README](https://github.com/strapi/strapi/blob/main/examples/getstarted/README.md) for more details. + +### 5. Running the administration panel in development mode + +Start the administration panel server for development: + +```bash +cd ./packages/core/admin +yarn watch +``` + +Run the example application but watching the admin panel: + +```bash +cd ./examples/getstarted +yarn develop --watch-admin +``` + +Both commands must be running at same time; now you will be able to see the admin panel changes on the application example. + +**Awesome! You are now able to contribute to Strapi.** + +### 6. Available commands + +- `yarn watch` starts yarn watch in all packages. +- `yarn build` builds the `strapi-helper-plugin` (use this command when you develop in the administration panel). +- `yarn commit` runs an interactive commit CLI to help you write a good commit message inline with our git conventions. +- `yarn setup` installs dependencies. +- `yarn lint` lints the codebase. +- `yarn test:clean` removes the coverage reports. +- `yarn test:front` runs front-end related tests. +- `yarn test:front:watch` runs an interactive test watcher for the front-end. +- `yarn test:unit` runs the back-end unit tests. +- `yarn test:api` runs the api integration tests. +- `yarn test:generate-app` generates a test application. +- `yarn test:run-app` runs a test application. +- `yarn test:start-app` starts the test application. + +--- + +## Running the API Integration tests + +The API integration tests require a Strapi app to be able to run. You can generate a "test app" using `yarn test:generate-app `: + +```bash +$ yarn test:generate-app --db=sqlite +$ yarn test:generate-app --db=postgres +$ yarn test:generate-app --db=mysql +``` + +A new app is required every time you run the API integration tests, otherwise the test suite will fail. A command is available to make this process easier: `yarn test:api`. + +This command runs tests using jest behind the scenes. Options for jest can be passed to the command. (e.g. to update snapshots `yarn test:api -u`). + +### Changing the database + +By default the script run by `test:api` generates an app that uses `sqlite` as a database. But you can run the test suites using different databases: + +```bash +$ yarn test:api --db=sqlite +$ yarn test:api --db=postgres +$ yarn test:api --db=mysql +``` + +### Running the tests for the Enterprise Edition (EE) + +The test suites run the tests for the Community Edition (CE) version of Strapi by default. +In order to run the Enterprise Edition tests you need a valid license. To specify a license, you can use the environment variable `STRAPI_LICENSE`: + +```bash +$ STRAPI_LICENSE= yarn test:api +``` + +--- + +## Git Conventions + +### Commit messages + +We use the following convention: + +``` +type: subject + +body +``` + +The goal of this convention is to help us generate changelogs that can be communicated to our users. + +#### Type + +The types are based on our GitHub label, here are a subset: + +- `fix` – When fixing an issue. +- `chore` – When doing some cleanup, working on tooling, some refactoring. (usually reserved for **internal** work) +- `doc` – When writing documentation. +- `feat` – When working on a feature. + +You can see the complete list [here](https://github.com/strapi/strapi/blob/1cb6f95889ccaad897759cfa14d2804adeaeb7ee/.commitlintrc.ts#L11). + +#### Subject + +The subject of a commit should be a summary of what the commit is about. It should not describe what the code is doing: + +- `feat: what the feature is` +- `fix: what the problem is` +- `chore: what the PR is about` +- `doc: what is documented` + +Examples: + +- `feat: introduce document service` +- `fix: unable to publish documents due to missing permissions` +- `chore: refactor data-fetching in EditView to use react-query` +- `doc: document service API reference` + +> ⚠️ For a `fix` commit the message should explain what the commit is fixing. Not what the solution is. + +--- + +## Miscellaneous + +### Repository Organization + +We chose to use a monorepo design using [Yarn Workspaces](https://yarnpkg.com/en/docs/workspaces) in the way [React](https://github.com/facebook/react/tree/master/packages) or [Babel](https://github.com/babel/babel/tree/master/packages) does. This allows us to maintain the whole ecosystem keep it up-to-date and consistent. + +We do our best to keep the develop branch as clean as possible, with tests passing at all times. However, the develop branch can move faster than the release cycle. Therefore check the [releases on npm](https://www.npmjs.com/package/@strapi/strapi) so that you are always up-to-date with the latest stable version. + +### Reporting an issue + +Before submitting an issue you need to make sure: + +- You are experiencing a technical issue with Strapi. +- You have already searched for related [issues](https://github.com/strapi/strapi/issues) and found none open (if you found a related _closed_ issue, please link to it from your post). +- You are not asking a question about how to use Strapi or about whether Strapi has a certain feature. For general help using Strapi, you may: + - Refer to the [official Strapi documentation](https://docs.strapi.io). + - Ask a member of the community in the [Strapi Discord Community](https://discord.strapi.io/). + - Ask a question on the [Strapi community forum](https://forum.strapi.io). +- Your issue title is concise, on-topic, and polite. +- You provide steps to reproduce the issue. +- You have tried all the following (if relevant), and your issue remains: + - Make sure you have the right application started. + - Make sure the [issue template] is respected. + - Make sure your issue body is readable and [well formatted](https://guides.github.com/features/mastering-markdown). + - Make sure you've stopped the Strapi server with CTRL+C and restarted it. + - Make sure your application has a clean `node_modules` directory, meaning: + - you didn't link any dependencies (e.g., by running `yarn link`) + - you haven't made any inline changes to files in the `node_modules` directory + - you don't have any global dependency loops. If you aren't sure, the easiest way to double-check any of the above is to run: `$ rm -rf node_modules && yarn cache clean && yarn install && yarn setup`. diff --git a/Dockers/strapi/strapi/LICENSE b/Dockers/strapi/strapi/LICENSE new file mode 100644 index 0000000..f63cf15 --- /dev/null +++ b/Dockers/strapi/strapi/LICENSE @@ -0,0 +1,15 @@ +Copyright (c) 2015-present Strapi Solutions SAS + +Portions of the Strapi software are licensed as follows: + +* If you are accessing or using any component of the software that resides under an "ee/" directory, then you are deemed to be using our “Enterprise Edition” of the software and you understand and agree that the software is not licensed under the "MIT Expat" license as set forth below but instead, all the software you access is licensed under the license defined in "strapi/packages/core/admin/ee/LICENSE" and located at https://github.com/strapi/strapi/blob/a76b557047e9ef1c168dbf1b6cf879bcc3022de6/packages/core/admin/ee/LICENSE, unless (a) you or the company you represent has signed an alternative agreement referencing this code, then such signed agreement applies or (b) you are using the software in connection with a subscription to our cloud offering, then the terms of the agreement relevant to the cloud offering which you have assented to apply and the software licenses included in that agreement shall apply. + +* If (a) you are not accessing or using the software that resides under an “ee/” directory and therefore you are only accessing or using our “Community Edition” of the Software and (b) you have no registered account on our cloud offering, then we are providing you the software under the "MIT Expat" license as set forth below. + +MIT Expat License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Dockers/strapi/strapi/README.md b/Dockers/strapi/strapi/README.md index 931729f..3af722b 100644 --- a/Dockers/strapi/strapi/README.md +++ b/Dockers/strapi/strapi/README.md @@ -1,61 +1,168 @@ -# 🚀 Getting started with Strapi +

+ + Strapi logo + + + Strapi logo + +

-Strapi comes with a full featured [Command Line Interface](https://docs.strapi.io/dev-docs/cli) (CLI) which lets you scaffold and manage your project in seconds. +

Open-source headless CMS, self-hosted or Cloud you’re in control.

+

The leading open-source headless CMS, 100% JavaScript/TypeScript, flexible and fully customizable.

+

Cloud · Try live demo

+
-### `develop` +

+ + NPM Version + + + Tests + + + Strapi on Discord + + + Strapi Nightly Release Build Status + +

-Start your Strapi application with autoReload enabled. [Learn more](https://docs.strapi.io/dev-docs/cli#strapi-develop) +
-``` -npm run develop -# or -yarn develop +

+ + Administration panel + +

+ +
+ +Strapi Community Edition is a free and open-source headless CMS enabling you to manage any content, anywhere. + +- **Self-hosted or Cloud**: You can host and scale Strapi projects the way you want. You can save time by deploying to [Strapi Cloud](https://cloud.strapi.io/signups?source=github1) or deploy to the hosting platform you want\*\*: AWS, Azure, Google Cloud, DigitalOcean. +- **Modern Admin Panel**: Elegant, entirely customizable and a fully extensible admin panel. +- **Multi-database support**: You can choose the database you prefer: PostgreSQL, MySQL, MariaDB, and SQLite. +- **Customizable**: You can quickly build your logic by fully customizing APIs, routes, or plugins to fit your needs perfectly. +- **Blazing Fast and Robust**: Built on top of Node.js and TypeScript, Strapi delivers reliable and solid performance. +- **Front-end Agnostic**: Use any front-end framework (React, Next.js, Vue, Angular, etc.), mobile apps or even IoT. +- **Secure by default**: Reusable policies, CORS, CSP, P3P, Xframe, XSS, and more. +- **Powerful CLI**: Scaffold projects and APIs on the fly. + +## Getting Started + +Read the Getting Started tutorial or follow the steps below: + +### ⏳ Installation + +Install Strapi with this **Quickstart** command to create a Strapi project instantly: + +- (Use **yarn** to install the Strapi project (recommended). [Install yarn with these docs](https://yarnpkg.com/lang/en/docs/install/).) + +```bash +yarn create strapi ``` -### `start` +**or** -Start your Strapi application with autoReload disabled. [Learn more](https://docs.strapi.io/dev-docs/cli#strapi-start) +- (Using npx to install the Strapi project.) -``` -npm run start -# or -yarn start +```bash +npx create-strapi@latest ``` -### `build` +This command generates a brand new project with the default features (authentication, permissions, content management, content type builder & file upload). -Build your admin panel. [Learn more](https://docs.strapi.io/dev-docs/cli#strapi-build) +Enjoy 🎉 -``` -npm run build -# or -yarn build -``` +### 🖐 Requirements -## ⚙️ Deployment +Complete installation requirements can be found in the documentation under Installation Requirements. -Strapi gives you many possible deployment options for your project including [Strapi Cloud](https://cloud.strapi.io). Browse the [deployment section of the documentation](https://docs.strapi.io/dev-docs/deployment) to find the best solution for your use case. +**Supported operating systems**: -``` -yarn strapi deploy -``` +| OS | Recommended | Minimum | +| --------------- | ----------- | ---------- | +| Ubuntu | 24.04 | LTS | +| Debian | 11 | LTS | +| RHEL | 9 | LTS | +| macOS | 14 | 12 | +| Windows Desktop | 11 | 10 | +| Windows Server | No Support | No Support | +| Docker | N/A | N/A | -## 📚 Learn more +(Please note that Strapi may work on other operating systems, but these are not tested nor officially supported at this time.) -- [Resource center](https://strapi.io/resource-center) - Strapi resource center. -- [Strapi documentation](https://docs.strapi.io) - Official Strapi documentation. -- [Strapi tutorials](https://strapi.io/tutorials) - List of tutorials made by the core team and the community. -- [Strapi blog](https://strapi.io/blog) - Official Strapi blog containing articles made by the Strapi team and the community. -- [Changelog](https://strapi.io/changelog) - Find out about the Strapi product updates, new features and general improvements. +**Node:** -Feel free to check out the [Strapi GitHub repository](https://github.com/strapi/strapi). Your feedback and contributions are welcome! +Strapi only supports maintenance and LTS versions of Node.js. Please refer to the Node.js release schedule for more information. NPM versions installed by default with Node.js are supported. Generally it's recommended to use yarn over npm where possible. -## ✨ Community +| Strapi Version | Recommended | Minimum | +| --------------- | ----------- | ------- | +| 5.0.0 and up | 20.x | 18.x | +| 4.14.5 and up | 20.x | 18.x | +| 4.11.0 and up | 18.x | 16.x | +| 4.3.9 to 4.10.x | 18.x | 14.x | +| 4.0.x to 4.3.8 | 16.x | 14.x | -- [Discord](https://discord.strapi.io) - Come chat with the Strapi community including the core team. -- [Forum](https://forum.strapi.io/) - Place to discuss, ask questions and find answers, show your Strapi project and get feedback or just talk with other Community members. -- [Awesome Strapi](https://github.com/strapi/awesome-strapi) - A curated list of awesome things related to Strapi. +**Database:** ---- +| Database | Recommended | Minimum | +| ---------- | ----------- | ------- | +| MySQL | 8.0 | 8.0 | +| MariaDB | 11.2 | 10.3 | +| PostgreSQL | 16.0 | 14.0 | +| SQLite | 3 | 3 | -🤫 Psst! [Strapi is hiring](https://strapi.io/careers). +**We recommend always using the latest version of Strapi stable to start your new projects**. + +## Features + +- **Content Types Builder**: Build the most flexible publishing experience for your content managers, by giving them the freedom to create any page on the go with [fields](https://docs.strapi.io/user-docs/content-manager/writing-content#filling-up-fields), components and [Dynamic Zones](https://docs.strapi.io/user-docs/content-manager/writing-content#dynamic-zones). +- **Media Library**: Upload your images, videos, audio or documents to the media library. Easily find the right asset, edit and reuse it. +- **Internationalization**: The Internationalization (i18n) plugin allows Strapi users to create, manage and distribute localized content in different languages, called "locales" +- **Role Based Access Control**: Create an unlimited number of custom roles and permissions for admin and end users. +- **GraphQL or REST**: Consume the API using REST or GraphQL + +You can unlock additional features such as SSO, Audit Logs, Review Workflows in [Strapi Cloud](https://cloud.strapi.io/login?source=github1) or [Strapi Enterprise](https://strapi.io/enterprise?source=github1). + +**[See more on our website](https://strapi.io/overview)**. + +## Contributing + +Please read our [Contributing Guide](./CONTRIBUTING.md) before submitting a Pull Request to the project. + +## Community support + +For general help using Strapi, please refer to [the official Strapi documentation](https://docs.strapi.io). For additional help, you can use one of these channels to ask a question: + +- [Discord](https://discord.strapi.io) (For live discussion with the Community and Strapi team) +- [GitHub](https://github.com/strapi/strapi) (Bug reports, Contributions) +- [Community Forum](https://forum.strapi.io) (Questions and Discussions) +- [Feedback section](https://feedback.strapi.io) (Roadmap, Feature requests) +- [Twitter](https://twitter.com/strapijs) (Get the news fast) +- [Facebook](https://www.facebook.com/Strapi-616063331867161) +- [YouTube Channel](https://www.youtube.com/strapi) (Learn from Video Tutorials) + +## Migration + +Follow our [migration guides](https://docs.strapi.io/developer-docs/latest/update-migration-guides/migration-guides.html) on the documentation to keep your projects up-to-date. + +## Roadmap + +Check out our [roadmap](https://feedback.strapi.io) to get informed of the latest features released and the upcoming ones. You may also give us insights and vote for a specific feature. + +## Documentation + +See our dedicated [repository](https://github.com/strapi/documentation) for the Strapi documentation, or view our documentation live: + +- [Developer docs](https://docs.strapi.io/developer-docs/latest/getting-started/introduction.html) +- [User guide](https://docs.strapi.io/user-docs/latest/getting-started/introduction.html) +- [Cloud guide](https://docs.strapi.io/cloud/intro) + +## Try live demo + +See for yourself what's under the hood by getting access to a [hosted Strapi project](https://strapi.io/demo) with sample data. + +## License + +See the [LICENSE](./LICENSE) file for licensing information. diff --git a/Dockers/strapi/strapi/SECURITY.md b/Dockers/strapi/strapi/SECURITY.md new file mode 100644 index 0000000..ff84686 --- /dev/null +++ b/Dockers/strapi/strapi/SECURITY.md @@ -0,0 +1,94 @@ +# Security Policy + +## Supported Versions + +As of September 2025 (and until this document is updated), only the v4.x.x and v5.x.x _GA_ or _STABLE_ releases of Strapi are supported for updates and bug fixes. Any previous versions are currently not supported and users are advised to use them "at their own risk". + +**Note**: The v4.x.x LTS version will only receive high/critical severity fixes until April 2026. Any Medium/Low severity issues will not be fixed unless specific exceptions are made. + +| Version | Release Tag | Support Starts | Support Ends | Security Updates Until | Notes | +| ------- | ----------- | -------------- | -------------- | ---------------------- | ------------------ | +| 5.x.x | GA / Stable | September 2024 | Further Notice | Further Notice | LTS | +| 5.x.x | RC | N/A | September 2024 | N/A | End Of Life | +| 5.x.x | Beta | N/A | N/A | N/A | End Of Life | +| 5.x.x | Alpha | N/A | N/A | N/A | End Of Life | +| 4.x.x | GA / Stable | November 2021 | October 2025 | April 2026 | Maintanence Period | +| 4.x.x | Beta | N/A | N/A | N/A | End Of Life | +| 4.x.x | Alpha | N/A | N/A | N/A | End Of Life | +| 3.x.x | N/A | N/A | N/A | N/A | End Of Life | + +## Reporting a Vulnerability + +Please report (suspected) security vulnerabilities via GitHub's security advisory reporting system: +Submit your vulnerability via [this link](https://github.com/strapi/strapi/security/advisories/new) + +**Strapi does not currently and has no plans to offer any bug bounties, swag, or any other reward for reporting vulnerabilities.** + +During our public disclosure, we can give credit to the reporter and link to any social accounts you wish to have us add, including linking to your own blog post detailing the vulnerability. + +Please note the following requirements (all are required): + +- Summary of the suspected vulnerability +- Detailed information as to what the suspected vulnerability does and what it has access to +- Proof of Concept (Code samples at minimum, reproduction video optional) + - POC must include how the vulnerability can actually access sensitive data, simply triggering an alert popup in a browser is not a security vulnerability +- Impact summary (who does this impact and how) + +Optionally you may also add your estimated CVSS 3.1 score, though we may adjust. There is no need to submit a CVE request as we will do that as part of the advisory process. + +You will receive a response from us within 72 hours. If the issue is confirmed, we will release a patch as soon as possible depending on complexity but historically within a few days. + +Please note that we follow a very strict internal and public disclosure policy, typically a patch will be issued and included in a release. We then will place a warning that a security vulnerability has been patched and delay detailed disclosure from 2 to 8 weeks depending on the severity of the issue. If you have any resources such as blog posts that you intend to publish on and would like us to include these in our disclosure please advise us ASAP. + +Before doing any public disclosure we do ask that you speak to us first to ensure we are not releasing too much information before a patch is available and time has been given to users to upgrade their projects. + +## Specific Exclusions + +Pursuant to the [CNA Operational Rules](https://www.cve.org/resourcessupport/allresources/cnarules) there are certain exclusions that apply that SHOULD NOT be reported to us as vulnerabilities, these include but are not limited to: + +- Vulnerable packages and/or libraries that have vulnerabilities in them (CNA Operational Rule 4.1.12) but are used by Strapi UNLESS there is significant proof that the libraries cause a new vulnerability within Strapi (CNA Operational Rule 4.1.14): + > 4.1.12 The act of updating Product dependencies MUST NOT be determined to be a Vulnerability, regardless of whether the dependencies have Vulnerabilities. For example, updating a library to address a Vulnerability in that library MUST NOT be determined to be a new Vulnerability in a Product that uses the library, and a Vulnerability advisory for the Product SHOULD reference the CVE ID for the Vulnerability in the library. +- End of Life versions of Strapi (CNA Operational Rule 4.1.13) + > 4.1.13 The state of a Product being EOL, by itself, MUST NOT be determined to be a Vulnerability. +- If the vulnerability is the result of improper configuration made by an authorized user assuming they are either well-documented or well-understood (CNA Operational Rule 4.1.3) + > 4.1.3 Well-documented or commonly understood non-default configuration or runtime changes made by an authorized user SHOULD NOT be determined to be Vulnerabilities. +- Conditions or behaviors that do not lead to a security impact (CNA Operational Rule 4.1.2) + > 4.1.2 Conditions or behaviors that do not lead to a security impact SHOULD NOT be determined to be Vulnerabilities. Examples of security impacts include an increase in access for an attacker, a decrease in availability of a target, or another violation of security policy. + +In addition to the above stated rules, we will also apply some generic rules as well: + +- Any intentions to make threats against any team member, employee, or representative of Strapi or its partners +- Any intentions to extort or otherwise blackmail a team member, employee, or representative of Strapi or its partners +- Any vulnerability report made with malicious intent (such as overwhelming security resource personnel) + +If any of these cases apply to a vulnerability report then the report will be immediately rejected and closed. In cases where applicable we will also report these people to any applicable authorities or security program groups. + +## Security Process Summary + +Below is a breakdown of our security process in order to set expectations: + +- Initial submission of vulnerability via GitHub's Advisory system +- Begin internal tracking and communication to reporter +- Internal validation of vulnerability +- Internal notification and scheduling for patch development +- Begin development of patch +- Validation of patch (Internal and with the reporter) +- GitHub advisory cleanup +- Requesting of CVE via GitHub +- Disclosure and communication draft +- Patch released with initial warning via patch notes +- Email communication to Strapi Enterprise customers +- Mandatory waiting period (between 2 to 8 weeks) +- Publishing GitHub Advisory & CVE +- Public disclosure (via blog post) +- Email communication to Strapi Enterprise customers + +## Other reporting platforms and bounties + +Strapi does not support other reporting platforms, all security vulnerabilities must be made via GitHub Advisory system. If you are unable to report via this method you may open a security ticket with us by emailing security@strapi.io and we will create one on your behalf but if you do not have a GitHub user account we will not be able to share the private fork, pull request, or any other information with you during the process. + +List of some (though not all) platforms **we do not support**: + +- huntr.dev +- Direct email or communication to Strapi employees (Discord, Slack, or Email) +- Stack Overflow diff --git a/Dockers/strapi/strapi/codecov.yml b/Dockers/strapi/strapi/codecov.yml new file mode 100644 index 0000000..07b2663 --- /dev/null +++ b/Dockers/strapi/strapi/codecov.yml @@ -0,0 +1,10 @@ +comment: + branches: + - main + +github_checks: + annotations: false + +ignore: + - '**/*.md' + - '**/*.mdx' diff --git a/Dockers/strapi/strapi/docker-compose.dev.yml b/Dockers/strapi/strapi/docker-compose.dev.yml new file mode 100644 index 0000000..4d7487f --- /dev/null +++ b/Dockers/strapi/strapi/docker-compose.dev.yml @@ -0,0 +1,32 @@ +version: '3' + +services: + postgres: + image: postgres + restart: always + volumes: + - pgdata:/var/lib/postgresql/data + environment: + POSTGRES_USER: strapi + POSTGRES_PASSWORD: strapi + POSTGRES_DB: strapi + ports: + - '5432:5432' + + mysql: + image: mysql:8 + restart: always + environment: + MYSQL_DATABASE: strapi + MYSQL_USER: strapi + MYSQL_PASSWORD: strapi + MYSQL_ROOT_HOST: '%' + MYSQL_ROOT_PASSWORD: strapi + volumes: + - mysqldata:/var/lib/mysql + ports: + - '3306:3306' + +volumes: + pgdata: + mysqldata: diff --git a/Dockers/strapi/strapi/docker-compose.test.yml b/Dockers/strapi/strapi/docker-compose.test.yml new file mode 100644 index 0000000..2539917 --- /dev/null +++ b/Dockers/strapi/strapi/docker-compose.test.yml @@ -0,0 +1,32 @@ +version: '3' + +services: + postgres: + image: postgres + restart: always + volumes: + - pgdata_test:/var/lib/postgresql/data + environment: + POSTGRES_USER: strapi + POSTGRES_PASSWORD: strapi + POSTGRES_DB: strapi_test + ports: + - '5432:5432' + + mysql: + image: mysql:8 + restart: always + environment: + MYSQL_DATABASE: strapi_test + MYSQL_USER: strapi + MYSQL_PASSWORD: strapi + MYSQL_ROOT_HOST: '%' + MYSQL_ROOT_PASSWORD: strapi + volumes: + - mysqldata_test:/var/lib/mysql + ports: + - '3306:3306' + +volumes: + pgdata_test: + mysqldata_test: diff --git a/Dockers/strapi/strapi/docs/.eslintrc.docs.js b/Dockers/strapi/strapi/docs/.eslintrc.docs.js new file mode 100644 index 0000000..11a4680 --- /dev/null +++ b/Dockers/strapi/strapi/docs/.eslintrc.docs.js @@ -0,0 +1,9 @@ +module.exports = { + parserOptions: { + sourceType: 'module', + }, + plugins: ['react'], + rules: { + 'react/prop-types': 0, + }, +}; diff --git a/Dockers/strapi/strapi/docs/.gitignore b/Dockers/strapi/strapi/docs/.gitignore new file mode 100644 index 0000000..a21eebd --- /dev/null +++ b/Dockers/strapi/strapi/docs/.gitignore @@ -0,0 +1,21 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader +/docs/exports + +# 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/Dockers/strapi/strapi/docs/README.md b/Dockers/strapi/strapi/docs/README.md new file mode 100644 index 0000000..ba733ca --- /dev/null +++ b/Dockers/strapi/strapi/docs/README.md @@ -0,0 +1,29 @@ +# Strapi contributor documentation + +> If you are looking for the official Strapi documentation, it is available [here](https://docs.strapi.io) + +This documentation is a contributor documentation made for anyone that wants to contribute to the project. + +To run the documentation website, follow the instructions below. + +### 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. diff --git a/Dockers/strapi/strapi/docs/babel.config.js b/Dockers/strapi/strapi/docs/babel.config.js new file mode 100644 index 0000000..e00595d --- /dev/null +++ b/Dockers/strapi/strapi/docs/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/Dockers/strapi/strapi/docs/docs/api/Strapi.mdx b/Dockers/strapi/strapi/docs/docs/api/Strapi.mdx new file mode 100644 index 0000000..a76ac4b --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/api/Strapi.mdx @@ -0,0 +1,661 @@ +--- +title: Strapi (WIP) +slug: /api/Strapi +tags: + - class + - public + - global + +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +import Type from '@site/docs/api/components/type'; + +# Strapi + +:::info + +Current state: **Stable** + +::: + +The Strapi class is the main object used in Strapi projects. +An instance of Strapi class is available as a global in any Strapi project: `global.strapi`. + +## Class: Strapi + +### `new Strapi(opts)` + +- `opts`: Object Options that can be used on Strapi startup + - `autoReload`: Boolean **Default:** true + - If false, deactivate auto reload + - If you modify any file in your Strapi project, it reloads your nodejs app + - If any content-type is changed, it will reload the nodejs app + - `serveAdminPanel`: Boolean **Default:** true + - Should the admin panel be loaded and serve as a web client + - The admin panel build will not be delivered if false + - `appDir`: String **Default:** `process.cwd()` + - The directory relative or absolute path where Strapi will write every file (schemas, generated APIs, controllers or services) + - `distDir`: String **Default:** appDir value + - The directory relative or absolute path where Strapi will read configurations, schemas and any compiled code + +Instances of the Strapi class can be created using the new keyword. + +Strapi extends the [Container](./container) class. + +```javascript +const strapiInstance = new Strapi(); +``` + +### `strapi.dirs` + +- Object + +Stored paths of file system. + +- `dirs.dist`: [StrapiPathObject](#strapipathobject) + - Build folder +- `dirs.app`: [StrapiPathObject](#strapipathobject) + - Sources folder +- `dirs.static`: Object Define path to directories involving web client display + - `public`: String Path to the folder to serve publicly (like files, images, etc..) + +#### StrapiPathObject + +- Object + +A set of paths to specific Strapi project parts. + +- `root`: String Root path +- `src`: String Sources route path to project files +- `api`: String Path to the folder containing project developers' API files (content-types, controllers, services, routes, etc..) +- `components`: String Path to the folder containing project developers' components +- `policies`: String Path to the folder where the Strapi project developers' policies are stored + - A set of functions that check the state of the data and prevent the access to the API accordingly +- `middlewares`: String Path to the folder where the Strapi project developers' middlewares are stored + - A set of function that wrap around routes and requests +- `config`: String Path to the folder containing project developers' config files + +### `strapi.isLoaded` + +- Boolean + + - `true`: Everything (all `register` and `bootstrap` functions available in your strapi project) has been loaded + - `false`: There is something loading + +Note: `register` functions are called before the `bootstrap` functions. + +### `strapi.reload()` + +Reload the app. + +This function defines itself at the construction of the Strapi class. + +### `strapi.server` + +- [StrapiServer](./strapi-server) + +Strapi server object. + +### `strapi.fs` + +- [StrapiFS](StrapiFS) + +Wrapper around [FS NodeJS module](https://nodejs.org/docs/latest-v18.x/api/fs.html). + +### `strapi.eventHub` + +- [EventHub](EventHub) + +The `strapi.eventHub` object is used to manipulate events within a Strapi project. It is an instance of the built-in EventEmitter class from Node.js, which provides a simple way to emit and listen for events. + +The `strapi.eventHub` object is created using the `createEventHub()` function in the [EventHub](EventHub) module of the Strapi core. This function returns a new instance of the EventHub class, which extends the EventEmitter class and adds some additional functionality specific to Strapi. + +#### Examples: + +```javascript +// Listen for a 'user.updated' event and log the data +strapi.eventHub.on('user.updated', (data) => { + console.log(`User ${data.id} has been updated`); +}); + +// Emit a 'user.created' event with some data +strapi.eventHub.emit('user.created', { username: 'johndoe', email: 'johndoe@example.com' }); +``` + +In this example, we are emitting a `user.created` event with some data attached to it, and then listening for a user.updated event and logging the data. These events can be used to trigger actions within the Strapi application or to communicate with external systems. + +For more information on how to use the EventEmitter class and its methods, see the [Node.js documentation](ttps://nodejs.org/docs/latest-v18.x/api/events.html#class-eventemitter). + +### `strapi.startupLogger` + +- [StartupLogger](StartupLogger) + +Object containing predefined logger functions. Used for Strapi startup. (do not use as a logger elsewhere) + +### `strapi.log` + +- [Winston](https://github.com/winstonjs/winston#creating-your-own-logger) + +A logger provided by Strapi that uses the Winston logging library. It is the result of calling the `winston.createLogger()` function with the configuration defined by the user of the Strapi application. + +The logger provides various methods for logging messages at different levels of severity, including error, warn, info, verbose, debug, and silly. The logging level can be set via the configuration to control which messages are logged. + +#### Examples + +```javascript +// Log an error message +strapi.log.error('Failed to start server', { error: err }); + +// Log a warning message +strapi.log.warn('Server is running in development mode'); + +// Log an informational message +strapi.log.info(`Server started on port ${PORT}`); + +// Log a verbose message +strapi.log.verbose('Application state', { user: currentUser }); + +// Log a debug message +strapi.log.debug('API request received', { method: req.method, path: req.path }); + +// Log a silly message +strapi.log.silly('Entered loop', { count: i }); +``` + +In these examples, we are logging messages at different levels of severity, including error, warn, info, verbose, debug, and silly. We are also passing in metadata as an object in the second parameter of each logging method. + +The messages logged by strapi.log will be output according to the logging configuration set by the user of the Strapi application. This configuration determines which messages are logged and where they are logged (e.g. console, file, etc.). + +### `strapi.cron` + +- [CronService](Cron) + +Module to schedule cron jobs for Strapi project. It is an instance of a custom Cron object. + +### `strapi.telemetry` + +- [TelemetryService](Telemetry) + +The `strapi.telemetry` property provides access to the telemetry service instance. This service collects anonymous usage data about your Strapi application to help the Strapi team improve the product. + +By default, the telemetry service is enabled, but you can disable it by setting the telemetryDisabled property to true in your application's package.json file, or by setting the `STRAPI_TELEMETRY_DISABLED` environment variable to true. You can also disable telemetry programmatically by setting the isDisabled property of the `strapi.telemetry` instance to true. + +### `strapi.requestContext` + +- Object Context Storage + + - `run(store, cb)`: Function + - `store`: Any Value that should be retrieved + - `cb`: Function Callback + - `get()` Function + +The request context stores the ctx object from KoaJS on each request. This allows users to have access to the context from anywhere through the Strapi instance. + +### `strapi.customFields` + +- Object + + - `register(customField)`: Function Register a new custom field + +This property is a shortcut to `strapi.get('custom-fields').add(customField)`. + +#### Examples + +```javascript +strapi.customFields.register({ + name: 'color', + plugin: 'color-picker', + type: 'string', +}); +``` + +### `strapi.config` + +- Object + +Shortcut to `strapi.get('config')`. + +See the [config container](#config). + +### `strapi.services` + +- Object[] + +Shortcut to `strapi.get('services').getAll()`. + +See the [services' container](#services). + +### `strapi.service(uid)` + +- `uid`: String + +Shortcut to `strapi.get('services').get(uid)`. + +See the [services' container](#services). + +### `strapi.controllers` + +- Object[] + +Shortcut to `strapi.get('controllers').getAll()`. + +See the [controllers' container](#controllers). + +### `strapi.controller(uid)` + +- `uid`: String + +Shortcut to `strapi.get('controllers').get(uid)`. + +See the [controllers' container](#controllers). + +### `strapi.contentTypes` + +- Object[] + +Shortcut to `strapi.get('content-types').getAll()`. + +See the [content-types' container](#content-types). + +### `strapi.contentType(name)` + +- `name`: String + +Shortcut to `strapi.get('content-types').get(name)`. + +See the [content-types' container](#content-types). + +### `strapi.policies` + +- Object[] + +Shortcut to `strapi.get('policies').getAll()`. + +See the [policies' container](#policies). + +### `strapi.policy(name)` + +- `name`: String + +Shortcut to `strapi.get('policies').get(name)`. + +See the [policies' container](#policies). + +### `strapi.middlewares` + +- Object[] + +Shortcut to `strapi.get('middlewares').getAll()`. + +See the [middlewares container](#middlewares). + +### `strapi.middleware(name)` + +- `name`: String + +Shortcut to `strapi.get('middlewares').get(name)`. + +See the [middlewares container](#middlewares). + +### `strapi.plugins` + +- Object[] + +Shortcut to `strapi.get('plugins').getAll()`. + +See the [plugins' container](#plugins). + +### `strapi.plugin(name)` + +- `name`: String + +Shortcut to `strapi.get('plugins').get(name)`. + +See the [plugins' container](#plugins). + +### `strapi.hooks` + +- Object[] + +Shortcut to `strapi.get('hooks').getAll()`. + +See the [hooks' container](#hooks). + +### `strapi.hook(name)` + +- `name`: String + +Shortcut to `strapi.get('hooks').get(name)`. + +See the [hooks' container](#hooks). + +### `strapi.apis` + +- Object[] + +Shortcut to `strapi.get('apis').getAll()`. + +See the [apis container](#apis). + +### `strapi.api(name)` + +- `name`: String + +Shortcut to `strapi.get('apis').get(name)`. + +See the [apis container](#apis). + +### `strapi.auth` + +- Object + +Shortcut to `strapi.get('auth')`. + +See the [auth' container](#auth). + +### `strapi.contentAPI` + +- Object + +Shortcut to `strapi.get('content-api')`. + +See the [content-api container](#content-api). + +### `strapi.sanitizers` + +- Object + +Shortcut to `strapi.get('sanitizers')`. + +See the [sanitizers' container](#sanitizers). + +### `strapi.validators` + +- Object + +Shortcut to `strapi.get('validators')`. + +See the [validators' container](#validators). + +### `strapi.start()` + +- Returns: Promise + +:::info +TODO +::: + +### `strapi.destroy()` + +- Returns: Promise + +:::info +TODO +::: + +### `strapi.sendStartupTelemetry()` + +:::info +TODO +::: + +### `strapi.openAdmin({ isInitialized })` + +- Returns: Promise + +:::info +TODO +::: + +### `strapi.postListen()` + +- Returns: Promise + +:::info +TODO +::: + +### `strapi.listen()` + +- Returns: Promise + +:::info +TODO +::: + +### `strapi.stopWithError()` + +:::info +TODO +::: + +### `strapi.stop(exitCode)` + +:::info +TODO +::: + +### `strapi.loadAdmin()` + +- Returns: Promise + +:::info +TODO +::: + +### `strapi.loadPlugins()` + +- Returns: Promise + +:::info +TODO +::: + +### `strapi.loadPolicies()` + +- Returns: Promise + +:::info +TODO +::: + +### `strapi.loadAPIs()` + +- Returns: Promise + +:::info +TODO +::: + +### `strapi.loadComponents()` + +- Returns: Promise + +:::info +TODO +::: + +### `strapi.loadMiddlewares()` + +- Returns: Promise + +:::info +TODO +::: + +### `strapi.loadApp()` + +- Returns: Promise + +:::info +TODO +::: + +### `strapi.loadSanitizers()` + +- Returns: Promise + +:::info +TODO +::: + +### `strapi.registerInternalHooks()` + +:::info +TODO +::: + +### `strapi.register()` + +- Returns: Promise + +:::info +TODO +::: + +### `strapi.bootstrap()` + +- Returns: Promise + +:::info +TODO +::: + +### `strapi.load()` + +- Returns: Promise + +:::info +TODO +::: + +### `strapi.reload()` + +:::info +TODO +::: + +### `strapi.runLifecyclesFunctions()` + +- Returns: Promise + +:::info +TODO +::: + +### `strapi.getModel(uid)` + +- `uid`: String + +:::info +TODO +::: + +### `strapi.db.query(uid)` + +- `uid`: String + +:::info +TODO +::: + +## Strapi containers + +The strapi containers are accessible via `strapi.get('name-of-the-container')`. + +### `config` + +- Object + + - `get(path, defaultValue)`: Function + - `path`: String + - `defaultValue`: Any + - Returns: Any - The value located at `path` or, if undefined, `defaultValue`. + - `set(path, value)`: Function + - `path`: String - Where the value should be stored + - `value`: Any + - `has(path)`: Function + - `path`: String + - Returns: Boolean - Does the `path` match a value stored in the config container. + - `launchedAt`: Number **Default:** `Date.now()` + Date in milliseconds when the server has started + - `serveAdminPanel`: Boolean **Default:** `true` + See [Strapi constructor](#new-strapiopts) options + - `autoReload`: Boolean **Default:** `false` + See [Strapi constructor](#new-strapiopts) options + - `environment`: String - process.env.NODE_ENV + - `uuid`: String - string extracted from `package.json` located in `strapi.uuid` + - `packageJsonStrapi`: Object - object extracted from `package.json` located in `strapi` (except uuid) + - `info`: Object + - everything stored in the `package.json` + - `strapi`: String - Current version of Strapi + +Every file stored under the `config` folder will be injected in this config container object. + +### `services` + +:::info +TODO +::: + +### `controllers` + +:::info +TODO +::: + +### `content-types` + +:::info +TODO +::: + +### `policies` + +:::info +TODO +::: + +### `plugins` + +:::info +TODO +::: + +### `hooks` + +:::info +TODO +::: + +### `apis` + +:::info +TODO +::: + +### `auth` + +:::info +TODO +::: + +### `content-api` + +:::info +TODO +::: + +### `sanitizers` + +:::info +TODO +::: + +### `validators` + +:::info +TODO +::: diff --git a/Dockers/strapi/strapi/docs/docs/api/api.mdx b/Dockers/strapi/strapi/docs/docs/api/api.mdx new file mode 100644 index 0000000..e881dc0 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/api/api.mdx @@ -0,0 +1,30 @@ +--- +title: API (WIP) +slug: /api/API +tags: + - module + - public + +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +import Type from '@site/docs/api/components/type'; + +# API + +:::info + +Current state: **Stable** + +::: + +The Strapi API module permits to generate a Strapi API object that wrap all the functionalities around Strapi endpoints + +## Module: API + +### `createAPI(strapi, opts)` + +:::info +TODO +::: diff --git a/Dockers/strapi/strapi/docs/docs/api/components/type.jsx b/Dockers/strapi/strapi/docs/docs/api/components/type.jsx new file mode 100644 index 0000000..e1f2c5e --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/api/components/type.jsx @@ -0,0 +1,13 @@ +import React from 'react'; + +export default function Type({ children }) { + return ( + + <{children}> + + ); +} diff --git a/Dockers/strapi/strapi/docs/docs/api/container.mdx b/Dockers/strapi/strapi/docs/docs/api/container.mdx new file mode 100644 index 0000000..5a852a4 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/api/container.mdx @@ -0,0 +1,99 @@ +--- +title: Container +slug: /api/container +tags: + - module + - public + +toc_min_heading_level: 2 +toc_max_heading_level: 5 +--- + +import Type from '@site/docs/api/components/type'; + +# Container + +:::info + +Current state: **Stable** + +::: + +The container module permits to generate containers. + +## Module: container + +### class Container + +### `new Container()` + +- Returns: Container + +```javascript +const container = new Container(); + +container.add('config', { + get: (configName) => {}, + set: (configName, value) => {}, +}); + +const dbConfig = container.get('config').get('database'); +``` + +### `container.add(name, resolver)` + +- `name`: String UID of the content +- `resolver`: Function | Any + - As a function, the function will be executed when the first get method is called on this content. The result of this function will define the content of this UID. + - `resolver(context, args)` + - `context`: Container The container instance + - `args`: Any Anything to be used by the resolver function + - As anything else, this value will be resolved when getting this specified content through its UID. + +Register a new content to be accessed inside the container. If the name is already used, it will throw an error. + +```javascript +const container = new Container(); + +container.add('config', (container, args) => {}); +// or +container.add('services', {}); +``` + +### `container.get(name, args)` + +- `name`: String UID of the content +- `args`: Any Value that will be passed to the resolver (if function) + +Get the value stored for a specific `name`. + +```javascript +const container = new Container(); + +container.add('config', { db: 'sqlite' }); + +const config = container.get('config'); +// config.db === 'sqlite' +``` + +⚠️ If the **resolver**, used in the [register function](#containerregistername-resolver), is a **function**, the value will be the result of this resolver function with `args` as parameter on the first call to `get`. + +Please pay attention that the resolver result value isn't awaited. So if resolver returns a promise, the value stored will be a promise. + +```javascript +const container = new Container(); + +container.add('boolean', (bool) => bool); + +// First call - The value is resolved through the resolver above "(bool) => bool" +container.get('boolean', true); +// true + +// Any further call will use the previously set value +container.get('boolean'); +// true + +// Even if we try to push a new value +container.get('boolean', false); +// true +``` diff --git a/Dockers/strapi/strapi/docs/docs/api/cron.mdx b/Dockers/strapi/strapi/docs/docs/api/cron.mdx new file mode 100644 index 0000000..a05c041 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/api/cron.mdx @@ -0,0 +1,201 @@ +--- +title: Cron Service +slug: /api/Cron +tags: + - module + - public + +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +import Type from '@site/docs/api/components/type'; + +# Cron + +:::info + +Current state: **Stable** + +::: + +The Strapi Cron Service provides a way to add, remove, start, and stop cron jobs in a Strapi application. + +## Module: Cron Service + +### createCronService() + +The `createCronService()` function returns an object that provides methods to manage cron jobs. + +## Methods + +### `cron.add(tasks)` + +- `tasks`: Object +- Returns: `this` + +Adds one or more cron tasks to the service. + +- Each key of the `tasks` object is the name of the task. +- Each value of the `tasks` object can be either a function, or an object with two properties: `task` and `options`. +- If the value is a function, it is used as the task to be executed when the cron expression is met. + - The key will be considered as the cron expression +- If the value is an object, its `task` property is used as the task function, and its `options` property is used as the cron expression options. + +#### Example + +```javascript +const { createCronService } = require('packages/core/strapi/lib/services/cron.js'); + +const cron = createCronService(); + +const task = () => { + console.log('Task executed!'); +}; + +cron.add({ + myTask: { + task, + options: '*/5 * * * *', // Executes every 5 minutes. + }, + '*/1 * * * *': () => console.log('A minute has passed.'), +}); +``` + +### `cron.remove(name)` + +- `name`: String +- Returns: `this` + +Removes a cron task from the service. + +- The `name` parameter is the name of the task to remove. + +#### Example + +```javascript +const { createCronService } = require('packages/core/strapi/lib/services/cron.js'); + +const cron = createCronService(); + +const task = () => { + console.log('Task executed!'); +}; + +cron.add({ + myTask: { + task, + options: '*/5 * * * *', // Executes every 5 minutes. + }, +}); + +cron.remove('myTask'); +``` + +### `cron.start()` + +- Returns: `this` + +Starts the cron service. + +- Schedules all the cron jobs. + +#### Example + +```javascript +const { createCronService } = require('packages/core/strapi/lib/services/cron.js'); + +const cron = createCronService(); + +const task = () => { + console.log('Task executed!'); +}; + +cron.add({ + myTask: { + task, + options: '*/5 * * * *', // Executes every 5 minutes. + }, +}); + +cron.start(); +``` + +### `cron.stop()` + +- Returns: `this` + +Stops the cron service. + +- Cancels all the scheduled jobs. + +#### Example + +```javascript +const { createCronService } = require('packages/core/strapi/lib/services/cron.js'); + +const cron = createCronService(); + +const task = () => { + console.log('Task executed!'); +}; + +cron.add({ + myTask: { + task, + options: '*/5 * * * *', // Executes every 5 minutes. + }, +}); + +// Start the scheduled cron jobs +cron.start(); +// Stops the cron jobs +cron.stop(); +``` + +### `cron.destroy()` + +- Returns: `this` + +Destroys the cron service. + +- Calls the `stop()` method. +- Clears the list of cron jobs. + +#### Example + +```javascript +const { createCronService } = require('packages/core/strapi/lib/services/cron.js'); + +const cron = createCronService(); + +const task = () => { + console.log('Task executed!'); +}; + +cron.add({ + myTask: { + task, + options: '*/5 * * * *', // Executes every 5 minutes. + }, +}); + +// Start the scheduled cron jobs +cron.start(); +// Stops the cron jobs and remove all scheduled tasks +cron.destroy(); +``` + +## Properties + +### `cron.jobs` + +- Array + + - Object + + - `job`: [Job](https://github.com/node-schedule/node-schedule) - Job object by node-schedule + - `options`: String - String representing the recurrence of the job ( like '_/5 _ \* \* \*' ) + - `name`: String - The name of the task associated to the job + +An array of the cron jobs added to the service. diff --git a/Dockers/strapi/strapi/docs/docs/api/event-hub.mdx b/Dockers/strapi/strapi/docs/docs/api/event-hub.mdx new file mode 100644 index 0000000..c976ca4 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/api/event-hub.mdx @@ -0,0 +1,30 @@ +--- +title: EventHub (WIP) +slug: /api/EventHub +tags: + - module + - public + +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +import Type from '@site/docs/api/components/type'; + +# Strapi Event Hub + +:::info + +Current state: **Stable** + +::: + +Strapi Event Hub module - description to be done + +## Module: EventHub + +### `createEventHub()` + +:::info +TODO +::: diff --git a/Dockers/strapi/strapi/docs/docs/api/startup-logger.mdx b/Dockers/strapi/strapi/docs/docs/api/startup-logger.mdx new file mode 100644 index 0000000..8beb200 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/api/startup-logger.mdx @@ -0,0 +1,85 @@ +--- +title: Startup Logger +slug: /api/StartupLogger +tags: + - module + - private + +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +import Type from '@site/docs/api/components/type'; + +# API + +:::info + +Current state: **Stable** + +::: + +This module is a simple logger for starting up Strapi with some useful information. + +## Module: Startup Logger + +### `logStats()` + +This log will display information about the instance of Strapi. The time launched, how many times it took and important configuration information. + +``` + Project information + +┌────────────────────┬──────────────────────────────────────────────────┐ +│ Time │ Wed Jan 01 2000 00:00:01 GMT+0200 (Central Euro… │ +│ Launched in │ 2000 ms │ +│ Environment │ development │ +│ Process PID │ 42 │ +│ Version │ 4.9.0 (node v18.12.1) │ +│ Edition │ Enterprise │ +│ Database │ postgres │ +└────────────────────┴──────────────────────────────────────────────────┘ +``` + +### `logFirstStartupMessage()` + +This log will display the first time Strapi project is launched. It will ask the user to create its first admin user in the admin panel. + +### `logDefaultStartupMessage()` + +Default message to display when the Strapi server is started. + +``` + Actions available + +Welcome back! +To manage your project 🚀, go to the administration panel at: +http://localhost:1337/admin + +To access the server ⚡️, go to: +http://localhost:1337 +``` + +### `logStartupMessage({ isInitialized })` + +- `isInitialized`: Boolean Has the Strapi project already been initialized? + +Will display the correct start-up message according to the specified boolean. + +:::note + +Can be disabled by setting the server config value: + +```javascript +// in config/server.js +{ + logger: { + startup: { + enabled: false; + } + }, + // ...the rest of your server config +} +``` + +::: diff --git a/Dockers/strapi/strapi/docs/docs/api/strapi-fs.mdx b/Dockers/strapi/strapi/docs/docs/api/strapi-fs.mdx new file mode 100644 index 0000000..23f207b --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/api/strapi-fs.mdx @@ -0,0 +1,46 @@ +--- +title: StrapiFS (WIP) +slug: /api/StrapiFS +tags: + - module + - public + +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +import Type from '@site/docs/api/components/type'; + +# Strapi File System + +:::info + +Current state: **Stable** + +::: + +The Strapi FS module is a wrapper around FS NodeJS module to manipulate local files. + +## Module: StrapiFS + +### `createStrapiFs(strapi)` + +### `strapiFs.writeAppFile(optPath, data)` + +:::caution +Deprecated +::: + +### `strapiFs.writePluginFile(plugin, optPath, data)` + +:::caution +Deprecated +::: + +### `strapiFs.removeAppFile(optPath)` + +:::caution +Deprecated +::: + +### `strapiFs.appendFile(optPath, data)` diff --git a/Dockers/strapi/strapi/docs/docs/api/strapi-server.mdx b/Dockers/strapi/strapi/docs/docs/api/strapi-server.mdx new file mode 100644 index 0000000..1e8946a --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/api/strapi-server.mdx @@ -0,0 +1,119 @@ +--- +title: Strapi server (WIP) +slug: /api/strapi-server +tags: + - module + - public + +toc_min_heading_level: 2 +toc_max_heading_level: 5 +--- + +import Type from '@site/docs/api/components/type'; + +# Strapi Server + +:::info + +Current state: **Stable** + +::: + +The Strapi server module permits to generate a Strapi http server. + +## Module: Strapi server + +### `createServer(strapi)` + +- `strapi`: [Strapi](Strapi) +- Returns: StrapiServer + +```javascript +const server = createServer(strapi); + +server.listRoutes(); +``` + +### `StrapiServer.app` + +- [KoaJS](https://devdocs.io/koa/index) + +Strapi projects are using KoaJS to run the NodeJS server. + +### `StrapiServer.router` + +- [@koa/router](https://github.com/ZijianHe/koa-router#router-) + +Strapi projects are using a dependency of KoaJS called @koa/router. + +### `StrapiServer.httpServer` + +- [http.Server](https://nodejs.org/docs/latest-v18.x/api/http.html) + +The Strapi's HTTP server. + +### `StrapiServer.api(name)` + +- `name`: String +- Returns: [StrapiAPIs](#strapiapis) + +Getter for apis available in Strapi + +### `StrapiServer.use(...args)` + +- [KoaApp.use](https://devdocs.io/koa/index#appusefunction) + +Shortcut for Koa `app.use(...args)` method. + +### `StrapiServer.routes(routes)` + +:::info +TODO +::: + +### `StrapiServer.mount()` + +:::info +TODO +::: + +### `StrapiServer.initRouting()` + +:::info +TODO +::: + +### `StrapiServer.initMiddlewares()` + +:::info +TODO +::: + +### `StrapiServer.listRoutes()` + +:::info +TODO +::: + +### `StrapiServer.listen(...args)` + +:::info +TODO +::: + +### `StrapiServer.destroy()` + +:::info +TODO +::: + +### `StrapiAPIs` + +- Object + +- `content-api`: [API](API) + - API used by external requesters +- `admin`: [API](API) + - API used by admin panel + +Strapi APIs is a map of all APIs available inside the Strapi project. diff --git a/Dockers/strapi/strapi/docs/docs/api/structure.example b/Dockers/strapi/strapi/docs/docs/api/structure.example new file mode 100644 index 0000000..2e603cb --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/api/structure.example @@ -0,0 +1,93 @@ +--- +title: API Reference example +tags: + - utils + - class + - public + - global + +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +import Type from '@site/docs/api/components/type'; + +# Name of Module + +:::info + +Current state: **Stable** | **Legacy** | **Deprecated** + +::: + +_**Stable** - can be use as is_ + +_**Legacy** - Old code that needs refactoring to match the current architecture of the code_ + +_**Deprecated** - Should **NOT** be used, this will be deleted anytime soon_ + +_Description with a general example on how to use this Class / Module_ + +## Class: Name of the class + +### Public variable (e.g. in an EventEmitter class `Event: 'close'`) + +### Static methods (e.g. `Static method: Class.default()`) + +### `new Class()` + +Instances of the Class class can be created using the new keyword. + +```javascript +const myClass = new Class(); +``` + +### `class.method(param1, param2)` + +- `param1`: String (can be linked to other API doc page). +- `param2`: Object + - `options1`: Number + +The `class.method()` method display the `param1` and then skip `param2` lines. + +#### Examples + +```javascript +const { Class } = require('pathToClassFile'); +const textLines = ['Welcome', "That's all", 'Thanks']; + +const classInstance = new Class(); + +for (const text of textLines) { + classInstance.method(text, 1); +} +// Prints: +// Welcome +// That's all +// Thanks +``` + +## Function: `name_of_the_function(param1, param2)` + +- `param1`: String (can be linked to other API doc page) +- `param2`: Object + - `options1`: Number + +The `name_of_the_function()` method display the `param1` and then skip `param2` lines. + +#### Examples + +```javascript +const { name_of_the_function } = require('pathToFunctionFile'); +const textLines = ['Welcome', "That's all", 'Thanks']; + +for (const text of textLines) { + name_of_the_function(text, 1); +} +// Prints: +// Welcome +// That's all +// Thanks +``` + +This structure is highly based on NodeJS API reference documentation. https://nodejs.org/api diff --git a/Dockers/strapi/strapi/docs/docs/api/telemetry.mdx b/Dockers/strapi/strapi/docs/docs/api/telemetry.mdx new file mode 100644 index 0000000..51d9fae --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/api/telemetry.mdx @@ -0,0 +1,106 @@ +--- +title: Telemetry Service +slug: /api/Telemetry +tags: + - module + - public + +toc_min_heading_level: 2 +toc_max_heading_level: 3 +--- + +import Type from '@site/docs/api/components/type'; + +# Telemetry + +:::info + +Current state: **Stable** + +::: + +The telemetry service is responsible for collecting and sending anonymous usage data to Strapi. This service is disabled by default, but can be enabled or disabled via configuration. + +## Usage Information + +The collected usage data is used to help Strapi improve the product by identifying areas of improvement, tracking feature adoption, and measuring performance. You can learn more about the usage data that is collected by visiting the following link: + +https://docs.strapi.io/developer-docs/latest/getting-started/usage-information.html + +## Module: Telemetry Service + +### createTelemetryInstance() + +- strapi: [Strapi](Strapi) - A strapi instance. + +The `createTelemetryInstance()` function returns an instance of the Telemetry service. + +#### Examples + +```javascript +const createTelemetryInstance = require('path/to/telemetry'); + +const telemetry = createTelemetryInstance(strapi); +``` + +## Methods + +### `telemetry.register()` + +Registers the telemetry instance. + +#### Examples + +```javascript +telemetry.register(); +``` + +### `telemetry.bootstrap()` + +Bootstraps the telemetry instance. + +#### Examples + +```javascript +telemetry.bootstrap(); +``` + +### `telemetry.destroy()` + +Destroys the telemetry instance. + +#### Examples + +```javascript +telemetry.destroy(); +``` + +### `telemetry.send(event, payload)` + +- `event`: String - The event to be sent. +- `payload`: [TelemetryPayload](#telemetrypayload) - The payload to be sent with the event. +- Returns: Promise + +Sends telemetry event with the given payload. + +#### Examples + +```javascript +telemetry.send('event_name', { key: 'value' }); +``` + +## Types + +### `TelemetryPayload` + +- Object + + - `eventProperties`: Object An object that contains additional information about the event. + - `userProperties`: Object An object that defines the identity of the user who triggered the event. + - `groupProperties`: Object An object that defines properties of the application or environment in which the event occurred. + +Examples of event properties in Strapi include model, containsRelationalFields, displayedFields, kind. These properties are specific to the event and are used to provide additional context about what happened. + +User properties can include information such as the user's operating system, node version, and hostname. These properties are typically used to group events by user or to filter events based on certain user characteristics. + +Group properties can include information such as the language(s) used in the application, the database being used, and the number of locales. These properties are typically used to group events by application version, environment, or other characteristics. diff --git a/Dockers/strapi/strapi/docs/docs/docs/00-intro.md b/Dockers/strapi/strapi/docs/docs/docs/00-intro.md new file mode 100644 index 0000000..0d6e333 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/00-intro.md @@ -0,0 +1,20 @@ +--- +title: Introduction +--- + +Hello & welcome to the contributor documentation of the Strapi Monorepo! Here you'll find both technical and conceptual documentation on the codebase. + +Generally speaking the documentation structure is as follows: + +```shell +core/ +├─ admin/ +├─ content-manager/ +│ ├─ documentation-file.mdx +├─ content-type-builder/ +plugins/ +├─ documentation/ +├─ i18n/ +``` + +This helps keep the documentation organized according to the file structure of the `packages` folder within the monorepo. From there however, is dependant on the documentation written, it will most likely change over time when the documentation grows and develops. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/_category_.json new file mode 100644 index 0000000..9a6bf86 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/_category_.json @@ -0,0 +1,6 @@ +{ + "position": 1, + "label": "Core", + "collapsible": true, + "collapsed": false +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/00-intro.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/00-intro.md new file mode 100644 index 0000000..eeab250 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/00-intro.md @@ -0,0 +1,16 @@ +--- +title: Introduction +tags: + - admin +--- + +# Admin + +This section is an overview of all the features related to admin: + +```mdx-code-block +import DocCardList from '@theme/DocCardList'; +import { useCurrentSidebarCategory } from '@docusaurus/theme-common'; + + +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/01-ee/00-intro.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/01-ee/00-intro.md new file mode 100644 index 0000000..c73687d --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/01-ee/00-intro.md @@ -0,0 +1,42 @@ +--- +title: Introduction +tags: + - enterprise-edition +--- + +# Admin Enterprise Edition + +This section is an overview of all the features related to the Enterprise Edition in Admin: + +```mdx-code-block +import DocCardList from '@theme/DocCardList'; +import { useCurrentSidebarCategory } from '@docusaurus/theme-common'; + + +``` + +# Promoting EE features in CE projects + +Everytime a new EE feature is added in Strapi, in the settings menu, you should add the following condition to ensure that the feature promotes itself in CE: + +`packages/core/admin/admin/src/hooks/useSettingsMenu/index.js` + +```js +... + + ...(!window.strapi.features.isEnabled(window.strapi.features.NEW_EE_FEATURE) && + window.strapi?.flags?.promoteEE + ? [ + { + intlLabel: { + id: 'Settings.new-ee-feature.page.title', + defaultMessage: 'NEW EE FEATURE', + }, + to: '/settings/purchase-new-ee-feature', + id: 'new-ee-feature', + licenseOnly: true, + }, + ] + : []), +... +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/01-ee/01-review-workflows.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/01-ee/01-review-workflows.md new file mode 100644 index 0000000..8cbb433 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/01-ee/01-review-workflows.md @@ -0,0 +1,176 @@ +--- +title: Review Workflows +description: Review workflow technical design +tags: + - review-workflows + - implementation + - tech design +--- + +# Review Workflows + +## Summary + +The review workflow feature is only available in the Enterprise Edition. +That is why, in part, it is completely decoupled from the code of the Community Edition. + +The purpose of this feature is to allow users to assign a tag to the various entities of their Strapi project. This tag is called a 'stage' and is available within what we will call a workflow. + +## Detailed backend design + +The Review Workflow feature have been built with one main consideration, to be decoupled from the Community Edition. As so, the implementation can relate a lot to how a plugin would be built. + +All the backend code related to Review Workflow can be found in `packages/core/admin/ee`. +This code is separated into several elements: + +- Content-types + - _strapi_workflows_: `packages/core/admin/ee/server/content-types/workflow/index.js` + - _strapi_workflows_stages_: `packages/core/admin/ee/server/content-types/workflow-stage/index.js` +- Controllers + - _workflows_: `packages/core/admin/ee/server/controllers/workflows/index.js` + - _stages_: `packages/core/admin/ee/server/controllers/workflows/stages/index.js` + - _assignees_: `packages/core/admin/ee/server/controllers/workflows/assignees/index.js` +- Middlewares + - [_DEPRECATED_] _contentTypeMiddleware_: `packages/core/admin/ee/server/middlewares/review-workflows.js` +- Routes + - `packages/core/admin/ee/server/routes/index.js` +- Services + - _review-workflows_: `packages/core/admin/ee/server/services/review-workflows/review-workflows.js` + - _workflows_: `packages/core/admin/ee/server/services/review-workflows/workflows.js` + - _stages_: `packages/core/admin/ee/server/services/review-workflows/stages.js` + - _metrics_: `packages/core/admin/ee/server/services/review-workflows/metrics.js` + - _weekly-metrics_: `packages/core/admin/ee/server/services/review-workflows/weekly-metrics.js` + - _validation_: `packages/core/admin/ee/server/services/review-workflows/validation.js` + - _assignees_: `packages/core/admin/ee/server/services/review-workflows/assignees.js` + - _stage-permissions_: `packages/core/admin/ee/server/services/review-workflows/stage-permissions.js` +- Utils file + - _Review workflows utils_: `packages/core/admin/ee/server/utils/review-workflows.js` +- A bootstrap and a register part + - `packages/core/admin/ee/server/bootstrap.js` + - `packages/core/admin/ee/server/register.js` + +### Content types + +#### strapi_workflows + +This content type stores the workflow information and is responsible for holding all the information about stages and their order. In MVP, only one workflow is stored inside the Strapi database. + +#### strapi_workflows_stages + +This content type store the stage information such as its name. + +### Controllers + +#### workflows + +Used to interact with the `strapi_workflows` content-type. + +#### stages + +Used to interact with the `strapi_workflows_stages` content-type. + +#### assignees + +Used to interact with the `admin_users` content-type entities related to review workflow enabled content types. + +### Middlewares + +#### contentTypeMiddleware - _DEPRECATED_ + +In order to properly manage the options for content-type in the root level of the object, it is necessary to relocate the `reviewWorkflows` option within the `options` object located inside the content-type data. By doing so, we can ensure that all options are consistently organized and easily accessible within their respective data structures. This will also make it simpler to maintain and update the options as needed, providing a more streamlined and efficient workflow for developers working with the system. Therefore, it is recommended to move the reviewWorkflows option to its appropriate location within the options object inside the content-type data before sending it to the admin API. + +### Routes + +The Admin API of the Enterprise Edition includes several routes related to the Review Workflow feature. Here is a list of those routes: + +#### GET `/review-workflows/workflows` + +This route returns a list of all workflows. + +#### POST `/review-workflows/workflows` + +This route creates a new workflow. + +#### GET `/review-workflows/workflows/:id` + +This route returns the details of a specific workflow identified by the id parameter. + +#### PUT `/review-workflows/workflows/:id` + +This route updates a specific workflow identified by the id parameter. + +#### DELETE `/review-workflows/workflows/:id` + +This route deletes a specific workflow identified by the id parameter. + +#### GET `/review-workflows/workflows/:workflow_id/stages` + +This route returns a list of all stages associated with a specific workflow identified by the workflow_id parameter. + +#### GET `/review-workflows/workflows/:workflow_id/stages/:id` + +This route returns the details of a specific stage identified by the id parameter and associated with the workflow identified by the workflow_id parameter. + +#### PUT `/review-workflows/workflows/:workflow_id/stages` + +This route updates the stages associated with a specific workflow identified by the workflow_id parameter. The updated stages are passed in the request body. + +#### PUT `/content-manager/(collection|single)-types/:model_uid/:id/stage` + +This route updates the stage of a specific entity identified by the id parameter and belonging to a specific collection identified by the model_uid parameter. The new stage value is passed in the request body. + +#### GET `/content-manager/(collection|single)-types/:model_uid/:id/stages` + +Returns a list of stages that a user has permission to transition into (based on the permission settings of a stage). + +#### PUT `/content-manager/(collection|single)-types/:model_uid/:id/assignee` + +This route updates the assignee of the entity identified by the model_uid and id parameters. The updated entity is passed to the request body. + +### Services + +The Review Workflow feature of the Enterprise Edition includes several services to manipulate workflows and stages. Here is a list of those services: + +#### review-workflows + +This service is used during the bootstrap and register phases of Strapi. Its primary responsibility is to migrate data on entities as needed and add the stage field to the entity schemas. + +#### workflows + +This service is used to manipulate the workflows entities. It provides functionalities to create, retrieve, and update workflows. + +#### stages + +This service is used to manipulate the stages entities and to update stages on other entities. It provides functionalities to create, retrieve, update, and delete stages. + +#### metrics + +This is the telemetry service used to gather information on the usage of this feature. It provides information on the number of workflows and stages created, as well as the frequency of stage updates on entities. + +#### weekly-metrics + +Once a week we report on review workflows usage statistic. This service is used to set up the cron job responsible for gathering and sending statistics on: number of active workflows, average number of stages in a workflow, maximum number of stages across all workflows and the content types on which review workflows is activated. + +#### assignees + +This service is used to interact with admin user assignee relations on review workflow enabled content types. It provides the ability to: find the Id of an entity assignee, update and delete (unassign) the assignee on an entity. + +#### stage-permissions + +This service is used to enable RBAC functionality for review workflow stages. Each entry of the `strapi_workflows_stages` has a manyToMany relation with `admin_permissions`. The permissions held in this relation indicate which roles can change the review stage of an entry in this stage. The service provides the ability to: register and unregister new stage permissions based on stage and role Ids and to find out whether a role can transition from a given stage. + +#### validation + +This service is used to ensure the feature is working as expected and validate the data to be valid. + +## Alternatives + +The Review Workflow feature is currently included as a core feature within the Strapi repository. However, there has been discussion about potentially moving it to a plugin in the future. While no decision has been made on this subject yet, it is possible that it may happen at some point in the future. + +## Resources + +- https://docs.strapi.io/user-docs/settings/review-workflows +- https://docs.strapi.io/user-docs/content-type-builder/creating-new-content-type#creating-a-new-content-type +- https://docs.strapi.io/user-docs/users-roles-permissions/configuring-administrator-roles#plugins-and-settings +- [Content Manager Review Workflows](../../content-manager/02-review-workflows.mdx) +- [Content Type Builder Review Workflows](../../content-type-builder/01-review-workflows.mdx) diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/01-ee/02-audit-logs.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/01-ee/02-audit-logs.md new file mode 100644 index 0000000..f22ec11 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/01-ee/02-audit-logs.md @@ -0,0 +1,62 @@ +--- +title: Audit Logs +description: Guide for Audit Logs +tags: + - settings + - audit-logs +--- + +# Audit Logs + +## Summary + +Audit Logs provide a way to view the history of all user actions at Admin API level. This includes actions related to entries (including publish actions), media (including its folders), users, login & logout of admin users, components, roles, and permissions, you can see the list of all the default events [here](https://github.com/strapi/strapi/blob/main/packages/core/admin/ee/server/services/audit-logs.js#L9). + +## Backend design + +The Audit Logs feature was built to take advantage of the eventHub. You can find the service and its core code at `packages/core/admin/ee/server/services`. + +### Audit Logs Local Provider + +To save audit log data, we utilize an Audit Logs local provider responsible for interacting with the database. This provider should return an object with a `register` function, and this function should return an object with functions to handle `saveEvent`, `findMany`, `findOne`, and `deleteExpiredEvents`. + +### Content types + +#### strapi_audit_logs + +This content type stores all the audit logs. For each allowed event, we save an entry in the audit logs content type. + +### Subscribing to all events + +The Audit Logs feature adds a subscriber to the [EventHub](/docs/core/strapi/event-hub), allowing it to listen to all events in the application. However, we don't save every event in the audit logs; we only save the default ones (see the defaultEvents array in the service file). + +### Retention days + +As the number of events in our Audit Logs can grow significantly, we run a daily job at midnight to delete logs that are older than the retention days defined. + +By default, the retention days are set to 90 days, but this value can be changed. For enterprise self-hosted projects, users can set a configuration variable (admin.auditLogs.retentionDays) and use that one. + +For cloud projects, the retention days are determined by the license. In a cloud project, users can set a custom retention days in the configuration, but this value cannot exceed the retention days defined by the license. + +In both cases, if we want to set a custom retention days we can modify the Admin Panel API config file (`./config/admin.js`). You can find all the possible options as well as other configurations for the Admin Panel on the [documentation page](https://docs.strapi.io/dev-docs/configurations/admin-panel#available-options). + +### Audit Logs format + +Every Audit Log has the following format: + +```typescript +type Event { + action: string, // Name of the event + date: Date, // When the event happens + userId: number, // Id of the user that trigger the event + payload?: Object, // Extra info of the event +}; +``` + +To understand how we obtain this information, we need to know how we emit an event with the Event Hub. To emit an event, we use the following function: (To see more info about the EventHub, click [here](/docs/core/strapi/event-hub) + +```typescript +strapi.eventHub.emit(name: Pick, payload: Pick); +``` + +First, we check the event is coming from admin requests and it's on our [default events](https://github.com/strapi/strapi/blob/main/packages/core/admin/ee/server/services/audit-logs.js#L9) list, then when creating our Audit Log, we retrieve the action and payload from this emitted event, where the first argument is the action or event name, and the second one is the payload. We obtain the user from the requestContext. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/01-ee/03-hooks/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/01-ee/03-hooks/_category_.json new file mode 100644 index 0000000..e1f16ed --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/01-ee/03-hooks/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Hooks", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/01-ee/03-hooks/use-license-limits.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/01-ee/03-hooks/use-license-limits.mdx new file mode 100644 index 0000000..bfd7898 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/01-ee/03-hooks/use-license-limits.mdx @@ -0,0 +1,72 @@ +--- +title: useLicenseLimits +description: API reference for the useLicenseLimits hook +tags: + - admin + - hooks + - users + - ee +--- + +An abstraction around `react-query`'s `useQuery` hook to fetch license limits for a project. + +## Usage + +```js +const { license, getFeature, isError, isLoading } = useLicenseLimits(options); +``` + +## Options + +### `enabled` + +Boolean flag which is passed onto react-query indicating whether the license check should be performed. This +can be useful if e.g. other permissions need to be checked before. + +## Result + +### `license` + +An object that contains the raw admin API response. + +### `getFeature(name: string)` + +Returns options for a given feature. If the feature was not found, it returns an empty object. This is mostly a +convenience method, to avoid having to filter the features array on the license object every time. + +#### Usage + +``` +const { getFeature } = useLicenseLimits(); + +const reviewWorkflowOptions = getFeature('review-workflows'); +``` + +## Typescript + +```ts +import { UseQueryResult } from 'react-query'; + +// Note: the list of attributes might be incomplete +interface License { + enforcementUserCount: number; + currentActiveUserCount: number; + permittedSeats: number; + shouldNotify: boolean; + shouldStopCreate: boolean; + licenseLimitStatus: 'OVER_LIMIT' | 'AT_LIMIT'; + isHostedOnStrapiCloud: boolean; + features: LicenseFeature[]; +} + +interface LicenseFeature { + name: string; + options?: object; +} + +type Options { + enabled?: boolean; +} + +type UseLicenseLimit = (options: Options) => Pick & { license: License, getFeature: (name: string) => object } +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/01-ee/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/01-ee/_category_.json new file mode 100644 index 0000000..01af54d --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/01-ee/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "EE", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/02-permissions/00-intro.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/02-permissions/00-intro.mdx new file mode 100644 index 0000000..6e2b583 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/02-permissions/00-intro.mdx @@ -0,0 +1,27 @@ +--- +title: Introduction +slug: /permissions-rbac +tags: + - permissions + - RBAC +--- + +# Permissions (RBAC) + +:::caution +This is not about the `user-permissions` plugin which is API orientated, this is about roles based access control commonly known as RBAC. +::: + +This section is an overview of all the features related to the Permissions core plugin: + +import DocCardList from '@theme/DocCardList'; +import { useCurrentSidebarCategory } from '@docusaurus/theme-common'; + + + +--- + +## ⚠️ To document ⚠️ + +- RBAC in the settings page of the admin app +- How RBAC works serverside diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/02-permissions/01-how-they-work.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/02-permissions/01-how-they-work.mdx new file mode 100644 index 0000000..a89232d --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/02-permissions/01-how-they-work.mdx @@ -0,0 +1,159 @@ +--- +title: How Permissions Work +tags: + - permissions + - RBAC +--- + +## Overview + +The RBAC permission system relies under the hood on the [CASL](https://casl.js.org) library. + +A `permission` is the combination of an `action`, a `subject`, some `properties` and some `conditions`. +The logic is that: a user can perform an `action` on a `subject` and some of its `properties` only if it its role has the `permission` and if the `conditions` associated to the permission pass. +The creation and edition of permissions is done through the [edit page](http://localhost:1337/admin/settings/roles/2) of a role by checking or unchecking checkboxes. + +Example 1: the action `update` can be applied on the subject `article` and property `title`, this result is the permission to update the title of an article. + +Example 2: the condition `isCreator` added to the previous permission will ensure that only the creator of the article can update the title. + +Example 3: the action `access the Marketplace page` has no subject to apply on. The permission only contains the action `admin::marketplace.read`. + +The permissions are attached to a role. Each role can have different permissions independentely. There is no inheritance system. +To check if an action can be performed by a user, frontend and backend simply retrieve the list of the permissions associated with the user's roles and check if it contains the permission associated with the action about to be performed. The backend also runs the associated conditions. + +:::tip +If a user has several role, the user will be allowed to perform an action if at least one of its roles is allowed to perform it. +::: + +## Actions + +### Action definition + +An action contains the following information: + +| key | description | type | required | Default value | example | +| ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | -------- | ------------- | -------------------------- | +| **uid** | An id that has to be unique within the plugin. | string | required | - | `'audit-logs.read'` | +| **pluginName** | Name of the plugin registrering the action. | string | - | `'api'` | `'admin'` | +| **section** | Name of the section among `contentTypes`, `plugins`, `settings` and `internal`. It will define in which permission tab the action will appear.
`internal` is not displayed in any tab but used for internal purposes. | string | required | - | `'settings'` | +| **category** | Name of the category. It will define in which category the action will appear. _Only for the plugins and settings section_. | string | - | - | `'audit logs'` | +| **subCategory** | Name of the subcategory. It will define in which subcategory or the category the action will appear. _Only for the plugins and settings section_. | string | - | - | `'options'` | +| **displayName** | Human name of the action. | string | required | - | `'Read'` | +| **subjects** | List of subjects the action can be applied to. _Only for the contentTypes section_. | array | - | - | `['api::article.article']` | +| **options** | Option object | object | - | `{}` | `{}` | +| **options.applyToProperties** | List of properties the action can be applied to. _Only for the contentTypes section_. | - | - | `[]` | `['fields', 'locale']` | + +import rbacEditPageImage from '@site/static/img/permissions/rbac-edit-page.png'; + +
+ Screenshot of the RBAC edit page showing the where are located the section, category, subcategory and display name +
+ Screenshot of the RBAC edit page showing the where are located the section, category, + subcategory and display name +
+
+ +:::note +`uid` and `pluginName` are used to create a global unique id. + +Examples: `admin::audit-logs.read`, `plugin::content-manager.explorer.create` +::: + +### Register an action + +An action can be registered in the backend during the `bootstrap` phase of the app. + +Example: + +```ts +// bootstrap.ts +module.exports = async () => { + const actions = [ + { + uid: 'provider-login.read', + displayName: 'Read', + pluginName: 'admin', + section: 'settings', + category: 'single sign on', + subCategory: 'options', + }, + ]; + await strapi.service('admin::permission').actionProvider.registerMany(actions); +}; +``` + +### Parametrize actions + +Actions can be parametrized with the `actionParameters` property. This property is an object that can contain any key/value pair. + +An example of the feature: + +- The action `review-workflows.stage.transition` can be parametrized with the `from` and `to` parameters, which are the ids of the stages a user can transition from and to. + +At the moment only Review Workflows use this feature internally. + +## Conditions + +### Condition definition + +A condition contains the following information: + +| key | description | type | required | default value | example | +| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | -------- | ------------- | -------------- | +| **displayName** | The condition name as shown in the admin panel | string | required | - | `'Is creator'` | +| **name** | A name that has to be unique within the plugin | string | required | - | `'is-creator'` | +| **plugin** | Name of the plugin that register the condition | string | - | `'api'` | `'admin'` | +| **category** | Name of the category. Conditions can be grouped into categories available in the admin panel | string | - | `'Default'` | `'admin'` | +| **handler** | A function used to verify the condition (see [docs.strapi.io](https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/configurations/optional/rbac.html#using-the-condition-handler)) | string | required | - | `'admin'` | + +:::note +Currently the user can choose to apply a condition on any action. There is no way to define a list of actions on which the condition can be applied to. This is why it is possible to set the condition `isCreator` on a the action `plugin::content-manager.explorer.create` even if it doesn't make sense. +::: +:::note +`name` and `plugin` are used to create a global unique id. + +Examples: `admin::is-creator` +::: + +### Registering a condition + +A condition can be registered in the backend during the `bootstrap` phase of the app. + +Example: + +```ts +// bootstrap.ts +module.exports = async () => { + const conditions = [ + { + displayName: 'Is creator', + name: 'is-creator', + plugin: 'admin', + handler: (user) => ({ 'createdBy.id': user.id }), + }, + ]; + await strapi.service('admin::permission').conditionProvider.registerMany(conditions); +}; +``` + +More information on how the handler works [here](https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/configurations/optional/rbac.html#using-the-condition-handler). + +## Permissions + +### Permission definition + +The permissions are modified in the admin panel (on the [edit page](http://localhost:1337/admin/settings/roles/2) of a role) and stored in the database with the following information: + +| key | description | type | required | example | +| -------------------- | -------------------------------------------------------------------------------------------------------------------------- | ------ | -------- | ------------------------------------------------------------- | +| **action** | Id of the action that will be permitted. | string | required | `'plugin::content-manager.explorer.update'` | +| **actionParameters** | Object to parametrize actions. | string | - | `{}` | +| **subject** | Id of the subject on which the action will be permitted. | string | - | `'api::article.article'` | +| **properties** | List of the properties of the subject on which the action will be permitted | object | - | `{ fields: ['title', 'description'], locales: ['en', 'fr'] }` | +| **conditions** | List of the conditions that will be ran against an entry to determine whether the action on this entry is permitted or not | array | - | `['admin::is-creator']` | + +A permission contains all needed information for the backend and the frontend to prevent users to perform non-permitted action. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/02-permissions/02-frontend/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/02-permissions/02-frontend/_category_.json new file mode 100644 index 0000000..050c324 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/02-permissions/02-frontend/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Frontend", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/02-permissions/02-frontend/fetching-permissions.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/02-permissions/02-frontend/fetching-permissions.mdx new file mode 100644 index 0000000..0d4d8cd --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/02-permissions/02-frontend/fetching-permissions.mdx @@ -0,0 +1,96 @@ +--- +title: Fetching Permissions +tags: + - permissions + - RBAC +--- + +This document lays out the code-flow of fetching the permissions in the CMS and how the data is then injected in to the app +to be used by components. + +## Where do we fetch them? + +At the very root of the entire admin panel we handle 4 routes: + +- Signing into the app +- Not Found +- Collecting information from a first time user +- The authenticated application (where you use the CMS) + +Permissions, along with other vital application information is fetched in in the `AuthenticatedApp` component, located +in the `packages/core/admin/admin/src/AuthenticatedApp` folder. The cache key (used with `react-query`'s `useQueries` hook) +for the particular call is `admin-users-permission`. + +## What do we fetch? + +Because permissions are based on users in this case the individual logged in, we fetch their permissions from the route: +`/admin/users/me/permissions`. An example can be seen below: + +```json +{ + "data": [ + { + "id": 426, + "action": "admin::api-tokens.access", + "subject": null, + "properties": {}, + "conditions": [] + }, + { + "id": 427, + "action": "admin::api-tokens.regenerate", + "subject": null, + "properties": {}, + "conditions": [] + }, + { + "id": 763, + "action": "plugin::content-manager.explorer.create", + "subject": "api::homepage.homepage", + "properties": { + "fields": ["title", "slug", "single", "multiple"], + "locales": ["en", "fr"] + }, + "conditions": [] + }, + { + "id": 765, + "action": "plugin::content-manager.explorer.read", + "subject": "api::homepage.homepage", + "properties": { + "fields": ["title", "slug", "single", "multiple"], + "locales": ["en", "fr"] + }, + "conditions": [] + }, + { + "id": 767, + "action": "plugin::content-manager.explorer.update", + "subject": "api::homepage.homepage", + "properties": { + "fields": ["title", "slug", "single", "multiple"], + "locales": ["en", "fr"] + }, + "conditions": [] + } + ] +} +``` + +An explanation on how these work can be found [here](../01-how-they-work.mdx). But as a quick overview we can see that permissions +typically associate to actions and in the case of the content manager they have subjects to be more granular and then fields & locales to +be even more granular. These actions are defined by domains of the application registered via the application as they also have effect +when calling APIs. + +## What do we do with the data? + +The data is then passed to the `RBACProvider` component which passes it to a public facing [React Context](https://beta.reactjs.org/learn/passing-data-deeply-with-context) +as well as injecting the information into the global `redux` store – see diagram below: + +diagram of how permissions get from the server to the application + +Inside the `RBACProviderContext` we also pass the ability to refetch the permissions. These two inconjunction with one another are accessed +via the `useRBACProvider` hook. You can see the API for this hook [here](../../02-permissions/02-frontend/using-permissions.mdx#typescript) diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/02-permissions/02-frontend/using-permissions.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/02-permissions/02-frontend/using-permissions.mdx new file mode 100644 index 0000000..72edd5f --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/02-permissions/02-frontend/using-permissions.mdx @@ -0,0 +1,126 @@ +--- +title: Using Permissions +tags: + - permissions + - RBAC + - useRBAC +--- + +Currently, there are a few different ways to use permissions in the application. This document will explain the different ways, how to use them and suggestions +on when is best to use them. It's advised that you've read [how they work](../01-how-they-work.mdx) and [fetching permissions](fetching-permissions.mdx) before reading this document so you have the full context. + +## Components + +There are two different wrapper components available to use. They are very similar but have different use cases. They are both +available in the `@strapi/strapi/admin`. + +### CheckPagePermissions + +Used to apply RBAC to a view/page of the application. If the user does not have the permissions to access this page they will +be redirect to the homepage. + +#### Usage + +```tsx +import { Page } from '@strapi/strapi/admin'; + +const permissions = [{ action: 'plugins::my-plugin.access', subject: null }]; + +const MyPage = () => { + return ( + +

aha you found me

+
+ ); +}; +``` + +#### Typescript + +```ts +interface Permission { + id: number; + action: string; + subject: string | null; + // This can be custom defined to the needs of the plugin/application + properties: Record; + conditions: Array; +} + +type CheckPagePermissionsProps = { + permissions: Permission[]; + children: React.ReactNode; +}; + +type CheckPagePermissions = (props: CheckPagePermissionsProps) => JSX.Element; +``` + +## useRBAC + +Is a wrapper around the [`hasPermissions`](#haspermissions) function which calls the `/admin/permissions/check` endpoint with a provided +list of permissions to assertain if a user can do a specific action. This hook is typically used with plugin permissions alongside the +global permissions object generated from the [`useRBACProvider`](#userbacprovider) hook which can either be passed or will be accessed internally. + +Because it's fetching, we also provide a `isLoading` state which can be used to show a loading state while the permissions are being fetched. +If the hook is unmouted before the fetch request completes, the request will be cancelled via an [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController). + +### Usage + +In the below example, we're checking if a user can "create" a post from the content-manager list view. If they can't, the button is `disabled`. + +```tsx +import { useRBAC } from '@strapi/strapi/admin'; + +const MyComponent = () => { + const { isLoading, allowedActions } = useRBAC({ + create: [ + { + action: 'plugin::content-manager.explorer.create', + subject: 'api::post.post', + }, + ], + }); + + if (isLoading) { + return

Loading...

; + } + + return ; +}; +``` + +### Typescript + +```ts +interface Permission { + id: number; + action: string; + subject: string | null; + // This can be custom defined to the needs of the plugin/application + properties: Record; + conditions: Array; +} + +interface PluginPermissions { + create: Permission[]; + read: Permission[]; + update: Permission[]; + delete: Permission[]; + publish: Permission[]; +} + +type UseRBAC = ( + pluginPermissions: PluginPermissions, + permissions?: Permission[] +) => { + isLoading: boolean; + setIsLoading: () => void; + allowedActions: { + canCreate: boolean; + canRead: boolean; + canUpdate: boolean; + canDelete: boolean; + canPublish: boolean; + }; +}; +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/02-permissions/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/02-permissions/_category_.json new file mode 100644 index 0000000..87f9973 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/02-permissions/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Permissions (RBAC)", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/03-settings/00-intro.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/03-settings/00-intro.mdx new file mode 100644 index 0000000..32806bb --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/03-settings/00-intro.mdx @@ -0,0 +1,17 @@ +--- +title: Introduction +slug: /settings/intro +tags: + - settings +--- + +# Settings + +This section is an overview of all the features related to Settings: + +```mdx-code-block +import DocCardList from '@theme/DocCardList'; +import { useCurrentSidebarCategory } from '@docusaurus/theme-common'; + + +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/03-settings/01-review-workflows.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/03-settings/01-review-workflows.mdx new file mode 100644 index 0000000..502dc9a --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/03-settings/01-review-workflows.mdx @@ -0,0 +1,133 @@ +--- +title: Review Workflows +slug: /settings/review-workflows +description: Guide for review workflows in settings. +tags: + - settings + - review-workflows +--- + +## Summary + +There are 3 views available to manage workflows and stages: List, Edit and Create. These pages are only **accessible in enterprise mode** and +if the user has the permission `admin::review-workflows.read`. + +Upon mount the settings pages injects themselves into the global redux store under the namespace `settings_review-workflows`. Redux is +then used for all state management updates. `Formik` is used to render and validate the edit and create views. It +is integrated with redux, so that all input components are controlled components. + +### License limits + +Most licenses have feature-based usage limits configured through Chargebee. These limits are exposed to the frontend through [`useLicenseLimits`](/docs/core/admin/ee/hooks/use-license-limits). +Offline licenses do not have these limits and therefore the endpoint does not return any. For offline licenses hard-coded limits apply: max. 200 workflows, max. 200 stages per workflow. + +The frontend aswell as the admin API restrict actions on the settings pages in various ways (more below), if the license limits are about to exceed or already exceeded. + +### List view + +The list-view displays all available workflows. + +#### License limits + +Displays a modal in case the user is at or above the license limit on page load. In case a user attempts to create a new workflow the same modal is shown again, in case that creation +would exceed the limit. + +### Edit & Create views + +The edit and create views allow workflows and stages to be edited (existing ones) and new workflows to be created. To enable a review-workflow on a content-type users select +from a list of all content-types (collections aswell as single-types) for each workflow. In case a content-type is already assigned to another content-type, the content-type +will be re-assigned to the new workflow. + +Stages always have a color assigned to them. Colors are stored as hex-codes in the database, to avoid coupling with the design-system and developers to know about possible color-names. The +admin app renders the color badges for a stage based in the matching theme-color and in case it doesn't find any the stored hex-code. It was not possible to normalize the hex-codes +to be uppercase everywhere (e.g. if they are created via lifecycle methods), so the frontend does the normalization. + +#### Form submission + +The form wrapping boths views submits all stages at once, because we expect the number of stages per workflow to be +rather small. Because of this we can simply re-order stages by sending them in a different order. Every stage that sends a corresponding `id` +attribute will be re-ordered and not created. + +Stages without an `id` property will be created in the database on submission. Stages that existed already, but are not submitted again will be deleted on submission. + +When editing a workflow and the `permissions` of a stage have not been modified by a user, they are sent as `undefined`. This special case allows users to edit a workflow without having to have +permissions to read `roles`, because the API won't update anything in the database. + +Users without read permissions for roles are able to create workflows, but they will not be able to define which roles can change a stage, so that stages of that workflow can only be changed +by the super-admin unless the roles are set. + +### Edit view + +Displays a license-limits modal in case the user is above the license limit on page load and upon form submission. + +#### Deletion of a stage + +If a stage is deleted, all **entities which are connected to that stage are moved to the previous stage**. Because a stage deletion +might have big effects on the database, a confirmation is shown before users save changes. + +Changes are only applied once the user clicks "Save". It is not possible to remove all stages from a workflow (neither in the UI nor the API). + +#### Create view + +Displays a license-limit modal in case the user is at or above the license limit on page load and upon form submission. + +### Hooks + +#### `useReviewWorkflows(queryParams)` + +This hook allows to fetch either one (if `params` contains an `id`) or all workflows. By default stages are populated. The +hooks returns a partial react-query result. + +```ts +useReviewWorkflows(queryParams: object): { + meta: { workflowCount: number } + workflows: Workflow[], + isLoading: boolean, + status: string, + refetch: () => Promise, +} +``` + +#### `useReviewWorkflowsStages({ id, layout }, reactQueryOptions)` + +This hook allows to fetch stages for a given workflow, that a user has permissions to transition to. + +```ts +type ContentTypeLayout { + uid: string; + kind: 'collectionType' | 'singleType'; +} + +useReviewWorkflowsStages({ id: number, layout: ContentTypeLayout }, reactQueryOptions): { + meta: { workflowCount: number, stagesCount: number } + stages: Stage[], + isLoading: boolean, + refetch: () => Promise, +} +``` + +### Data shapes + +```ts +type Stage { + id: number; + color: string; // hex code + name: string; // max-length: 255 characters + permissions: Permission[]; + createdAt: Date; + updatedAt: Date; +} + +type Workflow { + id: number; + name: string; // max-length: 255 characters, unique + contentTypes: number[]; + stages: Stage[]; + createdAt: Date; + updatedAt: Date; +} +``` + +### Endpoints + +For a list of all available endpoints please refer to the [detailed backend design documentation](/docs/core/admin/ee/review-workflows). diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/03-settings/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/03-settings/_category_.json new file mode 100644 index 0000000..b1e0a4c --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/03-settings/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Settings", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/04-features/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/04-features/_category_.json new file mode 100644 index 0000000..c71600d --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/04-features/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Features", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/04-features/hooks/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/04-features/hooks/_category_.json new file mode 100644 index 0000000..e1f16ed --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/04-features/hooks/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Hooks", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/04-features/hooks/use-admin-roles.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/04-features/hooks/use-admin-roles.mdx new file mode 100644 index 0000000..9c73e95 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/04-features/hooks/use-admin-roles.mdx @@ -0,0 +1,67 @@ +--- +title: useAdminRoles +description: API reference for the useAdminRoles hook +tags: + - admin + - hooks + - roles +--- + +An abstraction around `react-query`'s `useQuery` hook. It can be used to fetch one ore more admin role. + +## Usage + +The hooks can receive two optional parameters: + +1. query params: an object containing the query params to be sent to the API. They are going to be + stringified by `qs`. All params are equal except `id`, which is used to fetch a single users, if + it is passed. +2. options: an object containing the options to be passed to `useQuery`. + +It returns an object containing some of the react-query attributes. + +## Typescript + +```ts +import { UseQueryOptions } from 'react-query' + +type Role = object; + +useAdminRoles(queryParams: object, reactQueryOptions: UseQueryOptions): { + roles: Role[], + isLoading: boolean; + error: object; + isError: boolean; + refetch: () => Promise; +}; +``` + +### Fetch all roles + +```jsx +import { useAdminRoles } from 'path/to/hooks'; + +const MyComponent = ({ onMoveItem }) => { + const { roles, isLoading, refetch } = useAdminRoles(); + + return /* ... */; +}; +``` + +### Fetch one role + +```jsx +import { Box } from '@strapi/design-system'; + +import { useAdminRoles } from 'path/to/hooks'; + +const MyComponent = ({ onMoveItem }) => { + const { + users: [user], + isLoading, + refetch, + } = useAdminRoles({ id: 1 }); + + return /* ... */; +}; +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/04-features/hooks/use-document.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/04-features/hooks/use-document.mdx new file mode 100644 index 0000000..a208e47 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/04-features/hooks/use-document.mdx @@ -0,0 +1,47 @@ +--- +title: unstable_useDocument +description: API reference for the useDocument hook +tags: + - admin + - hooks + - document + - validations +--- + +:::caution +This hook is not stable and **likely to change**. Use at your own risk. +::: + +A hook that returns utilities to work with documents. + +## Usage + +``` +function Component() { + const { validate } = unstable_useDocument(); +} +``` + +At the moment, useDocument only returns a validate function. + +### `validate()` + +```ts +const validate( + entry: Entity, + { + contentType: Schema.ContentType, + components: { + [key: Schema.Component['uid']]: Schema.Component; + }, + isCreatingEntry?: boolean; + } +): { + errors: { [key: string]: TranslationMessage } +} +``` + +With this function, you can apply the same validations we use in the admin. Please be aware that for this function to work, you need to ensure the following: + +1. If you are validating an entry with relations/components/dynamic zones then it **MUST** be populated. Otherwise, the validations will pass even if there is an error on one populated field. +2. The correct schema for the contentType and the schemas for any components related to that content type are mandatory for this hook to function correctly. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/04-features/hooks/use-enterprise.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/04-features/hooks/use-enterprise.mdx new file mode 100644 index 0000000..ca95abc --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/04-features/hooks/use-enterprise.mdx @@ -0,0 +1,61 @@ +--- +title: useEnterprise +description: API reference for the useEnterprise hook +tags: + - admin + - hooks + - users +--- + +A hook that returns either community or enterprise-edition data-structures based on the global `window.strapi.isEE` flag. + +## Usage + +``` +import { CE_DATA } from './data'; + +function Component() { + const data = useEnterprise(CE_DATA, async () => (await import('./ee/data')).default); +} +``` + +It accepts an optional third argument to pass in options customizing the hook behavior: + +### `combine()` + +THe `combine` callback can be used as a custom "merge" function for the ce and ee arguments: + +``` +const data = useEnterprise({ a: 1 }, () => { b: 1 }, { combine(ce, ee) { return { ...ce, ...ee } } }); + +console.log(data); // { a: 1, b: 1 } +``` + +### `defaultValue` + +By default the hook returns `null` if `window.strapi.isEE` is true and the enterprise data structure is not yet loaded. Customizing +this value can help implementing various loading scenarios: + +``` +// display a loading state while an EE component is loading +const Component = useEnterprise(() =>

CE

, () =>

EE

, { + defaultValue: () =>
loading ...
+}) + +// display nothing while an EE component is loading, but don't block the overall rendering +const Component = useEnterprise(() =>

CE

, () =>

EE

, { + defaultValue: () => null +}) + +// display nothing while an EE component is loading +const Component = useEnterprise(() =>

CE

, () =>

EE

) + +if (!Component) { + return; +} +``` + +### `enabled` + +Similar to react-query this boolean flag allows disabling the EE import, e.g. when more than one condition needs to be applied. If `enabled` +is set to false, the first argument (CE_DATA) will be returned. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/04-features/nps.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/04-features/nps.md new file mode 100644 index 0000000..51b42d6 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/04-features/nps.md @@ -0,0 +1,30 @@ +--- +title: NPS +tags: + - admin + - nps +--- + +## What does it do + +The NPS survey is shown to users to get their feedback about Strapi. It is based on a rating scale from 0 to 10, and we also invite users to provide additional comments. + +## When do we show the survey? + +The NPS survey is only displayed to admin users who have selected the "Keep me updated" checkbox during registration. The survey is displayed after 5 minutes of activity. + +The survey is shown to eligible users based on the following rules: + +- If a user responds to the survey, the survey will be presented again within 90 days. +- If a user does not respond to the survey the first time after their last response, the survey will be presented again after 7 days. +- If a user does not respond to the survey for the second or subsequent time after their last response, the survey will be presented again after 90 days. + +## Where data is submitted + +The data is sent to this endpoint: `https://analytics.strapi.io/submit-nps`. + +## Hooks + +### useNpsSurveySettings + +This hook uses the `usePersistentState` hook from the helper-plugin (more information available [here](/docs/core/helper-plugin/hooks/use-persistent-state)). It is exported so that it can be used during the registration process to determine whether users have selected the "Keep me updated" checkbox. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/05-guided-tour.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/05-guided-tour.md new file mode 100644 index 0000000..d1f1561 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/05-guided-tour.md @@ -0,0 +1,382 @@ +# Guided Tour + +The Guided Tour provides an interactive onboarding experience that guides new users through key features of the admin panel. This documentation explains how the system works and how to create new guided tours. + +## Architecture Overview + +The Guided Tour system is built with a modular architecture consisting of: + +- **Context Provider** (`Context.tsx`) - Global state management and persistence +- **Tour Factory** (`Tours.tsx`) - Tour factory and GuidedTourTooltip +- **Steps** (`Steps`) - Step factory, reusable step components, and tour specific step components +- **Overview Component** (`Overview.tsx`) - Homepage tour overview and progress tracking + +## Core Concepts + +### 1. Tours and Steps + +Tours are collections of steps that guide users through specific workflows. Each step will display its content in a popover. + +```typescript +const tours = { + contentTypeBuilder: createTour('contentTypeBuilder', [ + { + name: 'Introduction', + content: (Step) => ( + + + + + + ), + }, + // ... more steps + ]), +}; +``` + +### 2. State Management + +The tour state is managed through a React Context with a reducer pattern: + +```typescript +type State = { + tours: Tour; // Tour progress for each tour + enabled: boolean; // Whether tours are globally enabled + completedActions: ExtendedCompletedActions; // User-completed actions +}; +``` + +### 3. Conditional Steps + +Steps can be conditionally displayed based on user actions: + +```typescript +{ + name: 'ConditionalStep', + when: (completedActions) => completedActions.includes('didCreateContent'), + content: (Step) => (/* step content */) +} +``` + +### 4. Excluding Steps from Step Count + +Some steps shouldn't be counted in the step count displayed to the user. Use `excludeFromStepCount` to exclude them: + +```typescript +{ + name: 'Welcome', + excludeFromStepCount: true, + content: (Step) => ( + + + + + + ) +} +``` + +`createTour()` will add a `_meta` property to the tour object that provides information about the number of steps in the tour (total steps) and then the number of steps that will actually be displayed to the user: + +- `_meta.totalStepCount` - The total number of steps defined for the tour +- `_meta.displayedStepCount` - The total number of steps - the number of steps with `excludeFromStepCount: true` + +## Usage Guide + +### Creating a New Tour + +1. **Define the tour structure** in `Tours.tsx`: + +```typescript +const myNewTour = createTour('myNewTour', [ + { + name: 'Introduction', + content: (Step) => ( + + + + + + ), + }, + { + name: 'MainAction', + content: (Step) => ( + + + + + + ), + }, + { + name: 'Finish', + content: (Step) => ( + + + + + + ), + when: (completedActions) => completedActions.includes('didCompleteMainAction'), + }, +]); + +// Add to the tours object +const tours = { + // ... existing tours + myNewTour, +} as const; +``` + +2. **Add tour components to Strapi**: + +Wrap the element that should be the anchor for the step popover. + +```tsx +import { tours } from '@strapi/admin/strapi-admin'; + +const MyComponent = () => { + return ( +
+ +

My Feature Title

+
+ + + + +
+ ); +}; +``` + +3. **Mark actions complete** to trigger conditional steps: + +```tsx +import { useGuidedTour } from './Context'; + +const MyComponent = () => { + const dispatch = useGuidedTour('MyComponent', (s) => s.dispatch); + + const handleMainAction = () => { + // Perform the action + performMainAction(); + + // Track the completion + dispatch({ + type: 'set_completed_actions', + payload: ['didCompleteSomeAction'], + }); + }; +}; +``` + +### Step Components API + +Each step provides three main components: + +#### Step.Root + +The container for the popover with positioning options. Wraps and receives the same props as the [Radix popover](https://www.radix-ui.com/primitives/docs/components/popover). + +```tsx + +``` + +#### Step.Title + +The step title with i18n support: + +```tsx + + +// Or with custom content: + + + +``` + +#### Step.Content + +The step content with i18n support: + +```tsx + + +// Or with custom content: + + + +``` + +#### Step.Actions + +Action buttons with built-in functionality: + +```tsx + + +// Or with custom actions: + + + +``` + +## State Management + +### State + +The guided tour system initializes with a default state structure defined in the Context: + +```typescript +type State = { + tours: Tour; + enabled: boolean; + completedActions: ExtendedCompletedActions; +}; +``` + +Example: + +```typescript +const initialState = { + tours: { + contentManager: { + currentStep: 0, + isCompleted: false, + }, + }, + enabled: true, + completedActions: ['didCreateSchema'], +}; +``` + +### Actions + +The tour reducer handles these actions: + +- `next_step` - Advance to the next step in a tour +- `previous_step` - Go back to the previous step in a tour +- `go_to_step` - Go to a specific step +- `skip_tour` - Mark a tour as completed (skipped) +- `skip_all_tours` - Disable all tours globally +- `reset_all_tours` - Reset all tours to initial state +- `set_completed_actions` - Update the list of completed user actions + +### Using the Hook + +```tsx +import { useGuidedTour } from './Context'; + +const MyComponent = () => { + const state = useGuidedTour('MyComponent', (s) => s.state); + const dispatch = useGuidedTour('MyComponent', (s) => s.dispatch); + + const currentTour = state.tours.myNewTour; + const isEnabled = state.enabled; + const completedActions = state.completedActions; + + // Dispatch actions + const handleNext = () => { + dispatch({ type: 'next_step', payload: 'myNewTour' }); + }; +}; +``` + +### Persistence + +Tour state is automatically persisted to localStorage using the `usePersistentState` hook with the key `STRAPI_GUIDED_TOUR`. + +## Backend Integration + +Tours integrate with the backend through: + +`useGetGuidedTourMetaQuery()` + +- Fetches relative metadata from the server such as `isFirstSuperAdminUser` + +## E2E Testing + +Tours are tested in the e2e test suite `tests/e2e/tests/admin/guided-tour.spec.ts` + +## API Reference + +### Types + +```typescript +// Tour configuration +type TourStep

= { + name: P; + content: Content; + when?: (completedActions: ExtendedCompletedActions) => boolean; + excludeFromStepCount?: boolean; // Exclude from "Step X of Y" counting +}; + +// State management +type State = { + tours: Tour; + enabled: boolean; + completedActions: ExtendedCompletedActions; +}; + +type Action = + | { type: 'next_step'; payload: ValidTourName } + | { type: 'skip_tour'; payload: ValidTourName } + | { type: 'previous_step'; payload: ValidTourName } + | { type: 'go_to_step'; payload: { tourName: ValidTourName; step: number } } + | { type: 'set_completed_actions'; payload: ExtendedCompletedActions } + | { type: 'skip_all_tours' } + | { type: 'reset_all_tours' }; + +// Tour metadata +type TourMeta = { + totalStepCount: number; + displayedStepCount: number; +}; + +// Step components +type Step = { + Root: React.ForwardRefExoticComponent; + Title: (props: StepProps) => React.ReactNode; + Content: (props: StepProps) => React.ReactNode; + Actions: (props: ActionsProps & { to?: string } & FlexProps) => React.ReactNode; +}; + +// Tour object includes both steps and metadata +type Tour = Components & { _meta: TourMeta }; +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/_category_.json new file mode 100644 index 0000000..5ef3c18 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/admin/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Admin", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/authentication/00-sessions-and-jwt.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/authentication/00-sessions-and-jwt.md new file mode 100644 index 0000000..81f9774 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/authentication/00-sessions-and-jwt.md @@ -0,0 +1,118 @@ +--- +title: Sessions and JWT +description: How admin and Content API authentication works with SessionManager, tokens, and configuration. +--- + +This page summarizes how authentication works in this repository for: + +- Admin (back office) +- Content API via users-permissions plugin (UP) + +It is intentionally concise for contributors working in the monorepo. + +## SessionManager + +Core provides a `SessionManager` that issues: + +- Short‑lived access tokens (JWT, used in `Authorization: Bearer `) +- Refresh/session tokens (JWT, stored/handled differently per origin) + +Per-origin configuration is defined at bootstrap time with: + +- `jwtSecret` +- `accessTokenLifespan` (seconds) +- `maxRefreshTokenLifespan`, `idleRefreshTokenLifespan` (seconds) +- `maxSessionLifespan`, `idleSessionLifespan` (seconds) + +Each origin stores session rows in `admin::session` (hidden content-type) using the table/collection `strapi_sessions`, containing `userId`, `sessionId`, `deviceId`, `origin`, `expiresAt`, `absoluteExpiresAt`, `status`, `type`. + +### Public API (per origin) + +- `generateRefreshToken(userId, deviceId?, { type?: 'refresh' | 'session' })` +- `rotateRefreshToken(refreshToken)` +- `generateAccessToken(refreshToken)` +- `validateAccessToken(token)` +- `invalidateRefreshToken(userId, deviceId?)` +- `isSessionActive(sessionId)` + +Locations: + +- Core service: `packages/core/core/src/services/session-manager.ts` +- Types: `packages/core/types/src/modules/session-manager.ts` + +## Admin authentication + +Admin defines an origin `admin` with config under `admin.auth.sessions.*`. + +- Login/Register/Reset password create a refresh/session token and set an httpOnly cookie `strapi_admin_refresh`. +- The response includes the short‑lived access token in `data.token`. +- Clients use `Authorization: Bearer ` for subsequent admin requests. + +Endpoints (admin server): + +- `POST /admin/login` +- `POST /admin/register` and `POST /admin/register-admin` +- `POST /admin/reset-password` +- `POST /admin/access-token` — rotates the refresh cookie and returns `{ data: { token } }` +- `POST /admin/logout` — clears cookie and revokes refresh tokens; body may include `{ deviceId }` to revoke a single device + +Optional request fields on login/register: + +- `deviceId` (UUID). When provided, enables device-scoped revocation. +- `rememberMe` (boolean). When true, uses the long-lived refresh family and sets a persistent cookie; otherwise uses session family (session cookie). + +Configuration: + +- `admin.auth.secret` — required JWT secret used by admin origin +- `admin.auth.sessions.accessTokenLifespan` (default 1800) +- `admin.auth.sessions.maxRefreshTokenLifespan` (default 30 days) +- `admin.auth.sessions.idleRefreshTokenLifespan` (default 7 days) +- `admin.auth.sessions.maxSessionLifespan` (default 7 days) +- `admin.auth.sessions.idleSessionLifespan` (default 1 hour) +- Cookie options (applied to `strapi_admin_refresh`): + - `admin.auth.cookie.domain` (or `admin.auth.domain`) + - `admin.auth.cookie.path` (default `/admin`) + - `admin.auth.cookie.sameSite` (default `lax`) + +Key files: + +- Bootstrap/config: `packages/core/admin/server/src/bootstrap.ts` +- Routes: `packages/core/admin/server/src/routes/authentication.ts` +- Controller: `packages/core/admin/server/src/controllers/authentication.ts` +- Strategy (Bearer access token validation): `packages/core/admin/server/src/strategies/admin.ts` + +## Content API (users-permissions) + +The users-permissions (UP) plugin supports two modes, controlled by `plugin::users-permissions.jwtManagement`: + +- `legacy-support` (default): issues long‑lived `jwt` configured by `plugin::users-permissions.jwt`. +- `refresh`: uses `SessionManager` to issue short‑lived access tokens (`jwt`) and separate `refreshToken`. + +When `jwtManagement` is `refresh`: + +- Login/Register/Provider callback responses include `{ jwt, refreshToken }`. +- New endpoints: + - `POST /api/auth/refresh` — body `{ refreshToken }`, returns `{ jwt }` and rotates the refresh token + - `POST /api/auth/logout` — revokes sessions for the authenticated user; optional `{ deviceId }` in body to revoke only one device + +Configuration keys: + +- `plugin::users-permissions.jwtManagement`: `'legacy-support' | 'refresh'` +- `plugin::users-permissions.sessions.accessTokenLifespan` +- `plugin::users-permissions.sessions.maxRefreshTokenLifespan` +- `plugin::users-permissions.sessions.idleRefreshTokenLifespan` + - `plugin::users-permissions.sessions.maxSessionLifespan` + - `plugin::users-permissions.sessions.idleSessionLifespan` + +Key files: + +- Plugin bootstrap/config: `packages/plugins/users-permissions/server/bootstrap/index.js`, `packages/plugins/users-permissions/server/config.js` +- Controller: `packages/plugins/users-permissions/server/controllers/auth.js` +- Routes: `packages/plugins/users-permissions/server/routes/content-api/auth.js` +- JWT service: `packages/plugins/users-permissions/server/services/jwt.js` + +## Notes + +- Access tokens are always used in the `Authorization` header as `Bearer `. +- Admin refresh tokens are stored in an httpOnly cookie and are not exposed to JavaScript. +- Device-bound sessions allow targeted logout by `deviceId`. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/configuration/00-intro.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/configuration/00-intro.md new file mode 100644 index 0000000..4045f08 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/configuration/00-intro.md @@ -0,0 +1,114 @@ +--- +title: Introduction +tags: + - configuration +--- + +# Configuration + +This section is an overview of how configuration files are loaded in Strapi and how they should be used. + +## Config loading + +Loading of configuration is the very first thing Strapi does in bootstrap (after setting signal handlers), which is necessary because most of the Strapi bootstrap process depends on values from the configuration. + +This means that configuration loading happens even before Strapi creates a logger. Therefore any errors or warnings from the configuration unfortunately must output to `console` + +NOTE: For now. in theory, we could define some configuration files that do not depend on being passed a `strapi` object and could provide logger settings in there, but at this time we do not have that capability. + +Currently, Strapi loads every .js and .json file within a project's `./config` directory directly into the strapi config object. That is, if there is a file called `./config/myconfig.js` it will be loaded automatically and accessible from `strapi.config.get('myconfig')` + +(NOT YET IMPLEMENTED) Starting in Strapi v5, will load every defined value from the `STRAPI_` environment namespace into the configuration, using underscore (\_) as the object delimiter. For example, if you define `STRAPI_ADMIN_APP_KEYS=abcd,efg` it will be available from `strapi.config.get('admin.app.keys')` as `['abcd', 'efg']` + +Along with that feature, all configuration values will become case-insensitive. That is, accessing `strapi.config.get('admin.App.Keys')` will return the same value as `strapi.config.get('admin.app.keys')`. + +## Base Strapi Configurations + +The following are considered 'base' Strapi configurations and a description of what each file contains is given, so that new settings can be placed in the appropriate place. + +A Strapi configuration file must export either an object, or a function that returns an object. + +WARNING: There are some discrepancies where certain configuration files such as middlewares may return an array and some files may not be able to export a function. Please confirm before use, and update this documentation when exceptions are found. + +(NOT YET IMPLEMENTED) Starting in Strapi v5, the contents of the base configurations will be strictly defined and no values that are not created by Strapi will be allowed in them; that is, an error will be thrown on unrecognized values. Any user additions must go in separate configuration namespaces. + +### Base Config Names + +#### admin + +Defines settings related to the Strapi admin panel, such as the 'autoopen' option for `yarn develop` + +#### server + +Defines settings related to the Strapi backend server, such as 'host' and 'port' + +#### database + +Defines the database configuration options. + +NOTE: Most of this is defined by Knex, be careful when adding options that they are compatible or placed in the appropriate location + +#### api + +Content API configuration, for example the 'rest.maxLimit' option to set the maximum `limit` available in a query. + +#### features + +Feature flags for enabling and configuring future features that would be breaking changes and cannot be enabled by default, or experimental features that are not ready for public stable release. + +#### plugins + +Contains plugin configurations, with each root-level value the id of a plugin, for example, 'users-permissions' + +IMPORTANT: Plugins are not loaded like other Strapi configurations into the `plugins.` namespace, because they are loaded during the module loading. +That means that in an example plugins.js file like below, its values are accessible at, for example, `strapi.config.get('plugin::graphql.endpoint')` + +``` +module.exports = () => ({ + graphql: { + enabled: true, + config: { + endpoint: '/graphql', + + defaultLimit: 25, + maxLimit: 100, + + apolloServer: { + tracing: true, + }, + }, + }, +}); +``` + +NOTE: Because this configuration contains user and plugin keys and Strapi does not yet provide a method to extend the definitions, this configuration is not strictly typed and will not be loaded from the environment variables + +#### middlewares + +The configuration of middlewares. + +NOTE: This is the only configuration that is currently an array rather than an object. It also very loosely typed. Future improvements are planned to strongly type all the built-in Strapi middlewares. + +### Typings + +Most of the base configurations have been typed, although they are not currently publicly available. They can be found in: `packages/core/types/src/types/core/config` + +Any time a new configuration option is added to Strapi, it must also be added to the types for the appropriate config file (and once the env var loading feature is available, a parser for it such as string, integer, stringArray, etc must be defined) + +In Strapi v5, they will be used for: + +- user-facing config factories to assist in typing project configuration +- as part of the environment variable configuration loading to validate the structure of the base config file parsers to parse and strongly type values from the environment + +### Configuration filename restrictions + +In Strapi v5, environment variables with the prefix `STRAPI_` will be loaded automatically into Strapi configuration. Because of that, some naming restrictions have been added to prevent conflicts. + +- filenames without extension must be case-insensitive unique (ie, only one file among ADMIN.js and admin.js or admin.js and admin.json) +- All base Strapi configurations and a set of restricted names currently found in `packages/core/core/src/configuration/config-loader.ts` may not be used **even as prefixes** + +IMPORTANT: Any new base Strapi configurations should also be limited to a-z0-9, no special characters! This is necessary to allow environment variable loading. The same restriction does not apply to user config files, but if not followed that file will not support autoloading env. + +### Base attribute name restrictions + +Configuration options defined for Strapi configurations must include only a-zA-Z0-9! If a key is used with a special character, underscore, or dash, it will not be configurable from the environment variables, and people will get angry that it was poorly designed. Please use camelCase like all existing Strapi configuration keys. There are not currently any special characters defined in Strapi configurations, with the sole exception of plugins.js 'users-permissions', please keep it that way. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/configuration/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/configuration/_category_.json new file mode 100644 index 0000000..48eb56a --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/configuration/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Configuration", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/00-intro.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/00-intro.md new file mode 100644 index 0000000..5f047ce --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/00-intro.md @@ -0,0 +1,20 @@ +--- +title: Introduction +tags: + - content-manager +--- + +# Content Manager + +## What is the Content Manager? + +The content-manager is a plugin that allows users to write / update & delete their content, it's currently held within the `@strapi/admin` package, but from V5 will be removed back to to its own plugin. At its very basic form, the CM is just a table & a few forms. There are a few public APIs to manipulate these forms & tables as well as some universal hooks exported for user's to additionally interact with within their own plugins outside of the CM plugin & within. + +## Sections + +```mdx-code-block +import DocCardList from '@theme/DocCardList'; +import { useCurrentSidebarCategory } from '@docusaurus/theme-common'; + + item.label !== "Introduction")} /> +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/01-documents.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/01-documents.md new file mode 100644 index 0000000..3b15468 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/01-documents.md @@ -0,0 +1,27 @@ +--- +title: Documents +description: An introduction to documents in the content-manager +tags: + - content-manager + - documents +--- + +At the very core of the CM is the concept of a document. Although the logic for creating a document lives primarily within the `@strapi/core` package, we still need to understand what they are to interact with them. Introduced for the _new_ draft & publish feature in V5 (Q1 2024), documents are essentially a matrix of entries, this matrix grows in complexity based on the amount of dimensions your doucment has. For example, having Draft & Publish and Internationalisation (with 2 locales) enabled would give you 4 entries within the document – a draft for each locale and a published entry for each locale. + +:::note +Draft & Publish is optional on content-types +::: + +## Getting Documents + +We get documents via the [`useDocument`](./hooks/use-document.mdx) hook, which requires us to understand which "model" we want – the model is basically which content-type e.g. `api::article.article`, the "kind" of content-type e.g. `single-type` or `collection-type` and the specific `id` of said document. Using these three parameters we can fetch any document, without passing specific parameters e.g. `locale` we get a default version defined by the user's application. However, all dimensions should be queryable to narrow down the point on the document matrix to a specific entry e.g. `published & 'en-GB'`. + +## Interacting with Documents + +There are universal actions that can be performed on documents, these are: + +- `create` – creates a new document +- `update` – updates an existing document +- `delete` – deletes an existing document + +Documents that are `collection-types` additionally can be cloned. If a document has draft & published enabled then we can additionally publish & unpublish the document. All of this functionality is exposed via the [`useDocumentActions`](./hooks/use-document-actions.mdx) hook. Additional actions can be added by plugins via APIs. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/02-layouts.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/02-layouts.md new file mode 100644 index 0000000..5b7c475 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/02-layouts.md @@ -0,0 +1,133 @@ +--- +title: Layouts +description: How layouts work with the List & Edit view +tags: + - content-manager + - layouts + - edit-view + - list-view +--- + +Layouts are fundamental to how the CM renders its list & edit views. The edit view's layout can be manipulated via plugins using the `'Admin/CM/pages/EditView/mutate-edit-view-layout'` hook. Meanwhile the list view can currently only have table columns injected. + +## What is a layout? + +A layout is simply a data-structure we iterate over to understand how to render the views. For both List & Edit view their structures have explicitly been designed to be similar: + +```ts +interface ListLayout { + layout: ListFieldLayout[]; + components?: never; + metadatas: object; + settings: object; +} + +interface EditLayout { + layout: Array>; + components: Record>; + metadatas: object; + settings: object; +} +``` + +The above types have been simplified for the purpose of explanation, but you can see from the `components` property of the `EditLayout` that it's essentially the same as its parent, just a nested and organised per component. This consistency allows us to easily iterate over the layouts and render the views using the same components for the general layout & component layouts. + +## How are they made? + +The layout is a combination of a content-types's schema & its configuration file, while their data-structures are similar they differ at the very root interface. + +### EditView + +The very base level interface for the EditView layout is an `EditFieldLayout` which is primarily derived from the `InputProps` of our Form Components: + +```ts +interface InputProps { + disabled?: boolean; + hint?: string; + label: string; + name: string; + placeholder?: string; + required?: boolean; + type: Exclude< + Attribute.Kind, + 'media' | 'blocks' | 'richtext' | 'uid' | 'dynamiczone' | 'component' | 'relation' + >; +} + +interface EditFieldSharedProps extends Omit { + mainField?: string; + size: number; + unique?: boolean; + visible?: boolean; +} + +/** + * Map over all the types in Attribute Types and use that to create a union of new types where the attribute type + * is under the property attribute and the type is under the property type. + */ +type EditFieldLayout = { + [K in Attribute.Kind]: EditFieldSharedProps & { + attribute: Extract; + type: K; + }; +}[Attribute.Kind]; +``` + +The excluded `type` values are unique to the content-manager and as such aren't expected to be rendered as universal form inputs. This data-structure is passed to the `InputRenderer` component to render any form input (previously known as `GenericInputs` from the helper-plugin). Notice how these inputs don't recieve their `value`, `onChange` or `error` prop. These are extracted from the `Form` using `useField(name)`: + +```ts +export const StringInput = forwardRef( + ({ disabled, label, hint, name, placeholder, required }, ref) => { + const field = useField(name); + + return ( + + ); + } +); +``` + +To handle the CM specific inputs, the EditView domain has its own `InputRenderer` component which follows the same principle but this will additionally handle attributes like custom-fields etc. The EditView them "simply" renders over its layout, passing props to the `InputRenderer`, if there's a dynamic-zone or component we recursively render the layout by utilising the `components` property of the `EditLayout` data-structure, as previously said, because this follows the same structure as its parent, we can iterate over it the exact same way rendering _any fields_ required, incl. deeply nested components and dynamic-zones. + +### ListView + +Because the list view is essentailly a giant table, its data-structure is considerably simpler than the edit view: + +```ts +interface ListFieldLayout { + /** + * The attribute data from the content-type's schema for the field + */ + attribute: Attribute.Any | { type: 'custom' }; // custom attributes are expected to use `cellFormatter`. + /** + * Typically used by plugins to render a custom cell + */ + cellFormatter?: ( + data: { [key: string]: unknown }, + header: Omit + ) => React.ReactNode; + label: string | MessageDescriptor; + /** + * the name of the attribute we use to display the actual name e.g. relations + * are just ids, so we use the mainField to display something meaninginful by + * looking at the target's schema + */ + mainField?: string; + name: string; + searchable?: boolean; + sortable?: boolean; +} +``` + +The `cellFormatter` property is paramount to plugin developers being able to inject their own columns, because we, most likely, will not have the components necessary to render the data the plugin provides. This is why they receive the data for the entire row & the header that they injected via the `'Admin/CM/pages/ListView/inject-column-in-table'` hook. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/03-RBAC.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/03-RBAC.md new file mode 100644 index 0000000..558794c --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/03-RBAC.md @@ -0,0 +1,64 @@ +--- +title: RBAC +description: How RBAC work with documents in the content-manager +tags: + - content-manager + - RBAC + - edit-view + - documents +--- + +:::note +This is not a detailed breakdown of permissions within strapi, if you're looking for this you should look at [Permissions Intro](../admin/02-permissions/00-intro.mdx). +::: + +Each document's permission's object will contain `properties.fields` which is an array of strings, we can use these to understand which properties can be created / updated etc. Via the subject of the permission. + +```json +// An example permission object +{ + "id": 666, + "action": "plugin::content-manager.explorer.create", + "actionParameters": {}, + "subject": "api::article.article", + "properties": { + "fields": ["short_text", "blocks", "single_compo.name", "single_compo.test", "dynamiczone"] + }, + "conditions": [] +} +``` + +The above permissions relate to what fields the user can create on the article content-type. The list of fields are their names in the schema, not their labels (which can be overridden in the EditViewSettings), components are dot separated paths where the component name will be the first part of said path, repeatable compoenents **will not** have indexes in the path and finally, in dynamic zones all fields are always allowed. + +## DocumentRBAC Component + +The `DocumentRBAC` component wraps the ListView & EditView pages providing + +- if a user can `create/read/update/delete/publish` a document at all +- the list of fields for each action +- a utility function to check if a user `canAction` + +```ts +interface DocumentRBACContextValue { + canCreate?: boolean; + canCreateFields: string[]; + canDelete?: boolean; + canPublish?: boolean; + canRead?: boolean; + canReadFields: string[]; + canUpdate?: boolean; + canUpdateFields: string[]; + canUserAction: ( + fieldName: string, + fieldsUserCanAction: string[], + fieldType: Attribute.Kind + ) => boolean; + isLoading: boolean; +} +``` + +:::note +Because the `useRBAC` hook fetches data from the API to check against `conditions` of a permission, we optionally have the `isLoading` returned incase a component needs to await this. +::: + +Using all this information, we can disabled & hide fields in the application based on the user's permissions. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/03-content-releases.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/03-content-releases.mdx new file mode 100644 index 0000000..2a0c0f1 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/03-content-releases.mdx @@ -0,0 +1,20 @@ +--- +title: Content Releases +description: Guide for content releases in the content-manager. +tags: + - content-manager + - content-releases +--- + +## Summary + +Content releases is an enterprise feature so you need a valid license. +Additionally, your user role must be granted specific Permissions, such as `plugin::content-releases.read` and `plugin::content-releases.create-action`. You can modify these permissions in the Settings section. The capability to add entries to a release within the content manager is available through the content-manager edit view. + +### Edit view + +If the feature is enabled with the correct license, and the user has the necessary permissions enabled, a 'Releases' section will appear on the right side of the Edit View. The 'Releases' section has an 'Add to release' button. Clicking this button opens a modal allowing you to assign the entry to a specific release and specify the desired action (Publish/Unpublish). + +In the event that no releases are present, users need to create a release first, which can be done on the [Content Releases](../content-releases/00-intro.md) page. + +If the user's permissions also includes the `plugin::content-releases.delete-action`, the user can access additional options by clicking the 'More' button (represented by three dots) in the releases sidebar. This will reveal the 'Remove from release' button, providing the ability to detach the entry from the selected release. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/04-relations.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/04-relations.mdx new file mode 100644 index 0000000..2034024 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/04-relations.mdx @@ -0,0 +1,225 @@ +--- +title: Relations +description: Conceptual guide to relations in the Content Manager focussing on the technical decisions taken. +tags: + - content-manager + - relations + - redux-store +--- + +## Summary + +Relations are a term used to describe how two or more entities are connected. Previously in the sidebar of an entity, +in Nov2020 we released a refactor that moved these fields into the main editing flow for a better editor experience +and to improve performance of the CMS application when many relations were used. + +An example of the relations input in the CMS edit view + +_above: An example of the relations input in the CMS edit view_ + +## Data management in frontend + +a diagram overview explaining how state management works in relations + +_above: A high-level diagram of how relations state management works_ + +### Preparing relation fields in the store + +When you first open an existing entity, we call the admin API and put the data into the store to pre-populate fields +with existing values. However, its important to know when you have fields with `type === 'relation'` in your schema +that the data you receive will not be an array, but rather an object with the count of how many relations in that +field exist. For example, a section of the response may look like this: + +```json +{ + "my_relations": { + "count": 6 + } +} +``` + +So without intervention, your inputs would try to append new relations to the `my_relations` object, which would not +work. Instead of this, before calling the redux action `INIT_FORM` we recursively find the paths fields based on the +following conditions: + +- The field is a relation +- The field is a component +- The field is a repeatable component +- The field is a dynamic zone + +These paths _do not_ take into account index values. So if you have a repetable component field where the schema looks like: + +```json +{ + "repeatable_single_component_relation": { + "type": "component", + "repeatable": true, + "component": "basic.relation" + } +} +``` + +and the components looks like: + +```json +{ + "basic.relation": { + "attributes": { + "id": { + "type": "integer" + }, + "categories": { + "type": "relation", + "relation": "oneToMany", + "target": "api::category.category", + "targetModel": "api::category.category", + "relationType": "oneToMany" + }, + "my_name": { + "type": "string" + } + } + } +} +``` + +Then the path to the relation field would be `repeatable_single_component_relation.categories`. Even though when +relations are added the path to the field in the redux store would be `repeatable_single_component_relation.0.categories`. + +Inside the reducer we reduce the array of `relationalFieldPaths` to an object with the `initialValues` clone as +as the base. If there is `modifiedData` in the browser i.e. you've made changes to the entity and saved those changes, +we just replace the first level of the field with the `modifiedData` so the data structure is preserved and we're not +loosing the relations we had already loaded in the component. If the first part of the path is highlighted as the +`relationalField` then we simply replace that intial object with an empty array. + +However, if the first part of the path is either a repeatable component, a dynamic zone or a regular component then we +recursively find the relation fields and replace the object with an array. This is handled by the `findLeafByPathAndReplace` +utility function. This function in short, takes an end path (in this case the relational field) and a primitive to replace +when it finds the endpath (an empty array in this case). It then recursively reduces the paths to the relational field mapping +through arrays if necessary (in the instance of repetable components for example) replacing the endpath with the primitive. + +When this is done, we have sucessfully prepared our initial data for usage with relations. + +### Handling updates to relation fields + +Because we've prepared the fields prior to the component loading, adding & removing relations, it's relatively easy to do so. +When a relation is added, we simply push the new relation to the array of relations. When a relation is removed, we simply +filter out the relation from the array of relations. This is handled inside the reducer actions `CONNECT_RELATION` & +`DISCONNECT_RELATION` respectively. + +:::note +Connecting relations adds the item to the end of the list, whilst loading more relations prepends to +the beginning of the list. This is the expected behaviour, to keep the order of the list in the UI in sync with the API response. +::: + +The `RelationInput` component takes the field in `modifiedData` as its source of truth. You could therefore consider this to +be the `browserState` and `initialData` to be the `serverState`. When relations are loaded they're added to both the `intialData` +and `modifiedData` objects, but when you connect/disconnect only the `modifiedData` is updated. This is useful when we're preparing +data for the api. + +### Cleaning data to be posted to the API + +The API to update the entity expects relations to be categorised into two groups, a `connect` array and `disconnect` array. +You could do this as the user interacts with the input but we found this to be confusing and then involved us managing three +different arrays which makes the code more complex. Instead, because the browser doesn't really care about whats new and removed +and we have a copy of the slice of data we're mutating from the server we can run a small diff algorithm to determine which +relations have been connected and which have been disconnected. Returning an object like so: + +```json +{ + "my_relations": { + "connect": [{ "id": 1 }, { "id": 2 }], + "disconnect": [] + } +} +``` + +## Frontend component architecture + +The input field for relation fields consist of two components: + +### `RelationInputDataManager` + +This container component handles data fetching and data normalization for the `RelationInput` component. This has been extracted from +the `RelationInput` so that Strapi is able to move the underlying component into the design-system if the community would need it +(most other input components can be consumed from there). + +### `RelationInput` + +This component is the presentational counterpart to the `RelationInputDataManager` component. It renders an input field based on the data passed from the data manager. + +Under the hood it is using `react-window` to render a list of relations in a virtualized view. Some fields need to render thousands of relations, which +would otherwise have a negative impact on the overall performance of the content-manager. + +## useRelation() hook + +This hook takes care of data-fetching and normalizes results relations aswell as search-results. + +```ts +const { relations: RelationResults, search: RelationResults, searchFor } = useRelation(reactQueryCacheKey: Array, options: Options); +``` + +### `Options` + +`option`s is a mandatory configuration and should implement the following shape: + +```ts +type Options = { + name: string; // name of the relation field + relation: RelationConfiguration; + search: SearchConfiguration; +} + +type RelationConfiguration = { + endpoint: string; // URL from where existing relations should be fetched + enabled: boolean; // defines whether relations should be fetched once the hook is called + pageParams: object; // additional query params which will be appended to `endpoint` + onLoad: (results: RelationResult[]) => void; // callback that will be fired after relations have been fetched (paginated) + normalizeArguments = { + mainFieldName: string; // name of the target model main field, determining which field to display (fallback: id) + shouldAddLink: boolean; // if the user is allowed to read the target model, the returned relations should include a link to the target + targetModel: object; // target content-type model + }; + pageGoal: number; // the current page-count of the already loaded relations used to keep the redux store and query cache in sync. +} + +type SearchConfiguration = { + endpoint: string; // URL from where new relations should be fetched + pageParams: object; // additional query params which will be appended to `endpoint` +} +``` + +### Return values + +`relations` and `search` both return a consistent relation format: + +```ts +type RelationResults = RelationResult[]; + +type RelationResult = { + id: number; + href?: string; // based on `shouldAddLink` and the `targetModel` + publicationState: 'draft' | 'published'; + mainField: string; // will fallback to "id" if not set +}; +``` + +#### `relations` + +`relations` refers to a [inifinite-query return type](https://tanstack.com/query/v4/docs/react/guides/infinite-queries) from react-query. It exposes paginated relational data +aswell as methods to check if there are more pages or fetch more paginated results. Relations for a given field are fetched as soon as the hook is called. + +#### `search` + +`search` refers to a [inifinite-query return type](https://tanstack.com/query/v4/docs/react/guides/infinite-queries) from react-query. It exposes paginated search results +for a relational field. Search results are only fetched after `searchFor()` has been called. + +#### `searchFor(string)` + +`searchFor` is a method which can be used to search for entities which haven't been connected with the source entity yet. The method accepts a search-term: `searchFor("term")`. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/_category_.json new file mode 100644 index 0000000..ad9837d --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Content Manager", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/features/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/features/_category_.json new file mode 100644 index 0000000..c71600d --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/features/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Features", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/features/review-workflows.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/features/review-workflows.mdx new file mode 100644 index 0000000..447c262 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/features/review-workflows.mdx @@ -0,0 +1,63 @@ +--- +title: Review Workflows +description: Guide for review workflows in the content-manager. +tags: + - content-manager + - review-workflows +--- + +## Summary + +Review workflows are disabled for all content-types by default and have to be enabled for each of them individually. More about how to +[enable review-workflows for a content-type](/docs/settings/review-workflows#edit--create-view). The feature itself is visible in two places +of the content-manager: list and edit view. + +### Nullish stages + +Entities which are not created through the admin API, content API or entity service will not have a stage assigned by default (e.g. lifecycle methods). This +means at any place in the admin app displaying a stage, it has to be prepared to receive `null` and should not crash. + +### List view + +If the feature is enabled for a content-type a new column will show up, displaying the current stage of an entity. If no stage was assigned to an entity, +the column is displayed as empty. + +The information which stage is currently assigned to an entity is send as part of the content-type response payload for each entity in the attribute `strapi_stage`. +Please refer to the [type definitions](/settings/review-workflows) for more information. + +```ts +{ + // ... entity attributes + strapi_stage?: Stage | null +} +``` + +`http://localhost:1337/content-manager/content-types` returns whether the feature is enabled for the content-type. `options.reviewWorkflows` is either `true`, `false` or `undefined`. + +**Note**: Downgrading from EE to CE won't delete the associated review workflow data and `http://localhost:1337/content-manager/content-types` still returns true. The admin app had to +add an additional check if the feature toggle returned in `http://localhost:1337/admin/project-type` is enabled. + +### Edit view + +If the feature is enabled on the current content-type, the selected stage will show up in the information sidebar next to the edit view. Users +can select any other stage of the current workflow provided they have the necessary permissions to change the current stage see [EE Review Workflows](../admin/01-ee/01-review-workflows.md). + +Stage assignments are decoupled from entities, meaning updating entity attributes won't set the selected stage at the same time. Instead the stage select +component will trigger an atomic update on the admin API to assign/ update a stage to the current entity. + +Because of this decoupling, stages **can not be assigned on entity creation** and only after they have been created. + +Information about which stage is currently assigned to an entity is sent as part of the entity response payload in the attribute `strapi_stage`. +Please refer to the [type definitions](/settings/review-workflows) for more information. + +```ts +{ + // ... entity attributes + strapi_stage?: Stage | null +} +``` + +#### License limits + +If the user has exceeded the license limit (based on their license) for either the number of workflows or the number of stages of the workflow assigned +to the entities content-type, any stage update action will trigger a license-limit overlay and abort the request. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/hooks/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/hooks/_category_.json new file mode 100644 index 0000000..e1f16ed --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/hooks/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Hooks", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/hooks/use-content-types.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/hooks/use-content-types.mdx new file mode 100644 index 0000000..ec0f64a --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/hooks/use-content-types.mdx @@ -0,0 +1,25 @@ +--- +title: useContentTypes +description: API reference for the useContentTypes hook in Strapi's Content Manager +tags: + - content-manager + - hooks + - fetch + - content-types + - components +--- + +An abstraction around `react-query` to fetch content-types and components. It returns the raw API response +for components. `collectionTypes` and `singleTypes` are filtered by `isDisplayed=true`. + +## Usage + +```jsx +import { useContentTypes } from 'path/to/hooks'; + +const MyComponent = () => { + const { isLoading, collectionTypes, singleTypes, components } = useContentTypes(); + + return (/* ... */); +}; +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/hooks/use-document-actions.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/hooks/use-document-actions.mdx new file mode 100644 index 0000000..53fa899 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/hooks/use-document-actions.mdx @@ -0,0 +1,109 @@ +--- +title: useDocumentActions +description: API reference for the useDocumentActions hook from Strapi's Content Manager +tags: + - content-manager + - hooks + - public API +--- + +:::warning +This hook is considered unstable and may change in a future release. +::: + +Contains all the operations that can be performed on a single document. Designed to be able to be +used anywhere within a Strapi app. The hooks will handle notifications should the operation fail, +however the response is always returned incase the user needs to handle side-effects. + +## Usage + +```tsx +import { Form } from '@strapi/admin/admin'; + +const { id, model, collectionType } = useParams<{ + id: string; + model: string; + collectionType: string; +}>(); +const { update } = useDocumentActions(); + +const handleSubmit = async (data) => { + await update({ collectionType, model, documentId: id }, data); +}; + +return

; +``` + +## Typescript + +```ts +type OperationResponse = + | Pick + | { error: BaseQueryError | SerializedError }; + +type UseDocumentActions = () => { + clone: ( + args: { + model: string; + documentId: string; + params: object; + }, + document: Omit, + trackerProperty?: Extract< + TrackingEvent, + { name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry' } + >['properties'] + ) => Promise>; + create: ( + args: { + model: string; + params?: object; + }, + document: Omit, + trackerProperty?: Extract< + TrackingEvent, + { name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry' } + >['properties'] + ) => Promise>; + delete: ( + args: { + collectionType: string; + model: string; + documentId: string; + }, + trackerProperty?: Extract< + TrackingEvent, + { name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry' } + >['properties'] + ) => Promise>; + getDocument: (args: { + collectionType: string; + model: string; + documentId?: string; + params?: object; + }) => Promise; + publish: (args: { + collectionType: string; + model: string; + documentId: string; + }) => Promise>; + update: ( + args: { + collectionType: string; + model: string; + documentId: string; + params: object; + }, + document: Document, + trackerProperty?: Extract< + TrackingEvent, + { name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry' } + >['properties'] + ) => Promise>; + unpublish: (args: { + collectionType: string; + model: string; + documentId: string; + }) => Promise>; +}; +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/hooks/use-document.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/hooks/use-document.mdx new file mode 100644 index 0000000..c0ec48d --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/hooks/use-document.mdx @@ -0,0 +1,75 @@ +--- +title: useDocument +description: API reference for the useDocument hook from Strapi's Content Manager +tags: + - content-manager + - hooks + - public API +--- + +:::warning +This hook is considered unstable and may change in a future release. +::: + +Returns a document based on the model, collection type & id passed as arguments. Also extracts its schema from the redux cache to be used for creating a validation schema. + +## Usage + +```tsx +const { id, model, collectionType } = useParams<{ + id: string; + model: string; + collectionType: string; +}>(); + +if (!model || !collectionType) return null; + +const { document, isLoading, validate } = useDocument({ + documentId: id, + model, + collectionType, + params: { locale: 'en-GB' }, +}); +const { update } = useDocumentActions(); + +const onSubmit = async (entity: Entity) => { + const errors = validate(entity); + + if (errors) { + // handle errors + } + + await update({ collectionType, model, documentId: id }, entity); +}; +``` + +### Content Manager + +If you're using this in the Strapi Content-Manager package, it is preferable to import `useDoc` instead. +This is because whilst it's a light wrapper around `useDocument` it automatically extracts the params from +react-router hooks to pre-provide the information for you e.g. `model` and `collectionType`. Saving us from +getting the params each time and validating that they are not `undefined`. + +## Typescript + +```ts +import type { Attribute } from '@strapi/strapi'; + +interface Document { + documentId: string; + [key: string]: Attribute.GetValue; +} + +interface UseDocumentArgs { + collectionType: string; + model: string; + documentId?: string; + params?: object; +} + +type UseDocument = (args: UseDocumentArgs) => { + document?: Document; + isLoading: boolean; + validate: (entity: Entity) => null | Record; +}; +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/hooks/use-drag-and-drop.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/hooks/use-drag-and-drop.mdx new file mode 100644 index 0000000..0b4f699 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/hooks/use-drag-and-drop.mdx @@ -0,0 +1,269 @@ +--- +title: useDragAndDrop +description: API reference for the useDragAndDrop hook in Strapi's Content Manager +tags: + - content-manager + - hooks + - drag-and-drop +--- + +An abstraction around `react-dnd`'s `useDrag` and `useDrop` hooks. It provides a simple API to handle drag and drop +events maintaining the same behaviour across the application e.g. + +1. When we consider the item to be above a new drop zone and move it immediately. +2. Item is above the drop zone, we move it when user drops it. + +This hook also wraps an internal hook `useKeyboardDragAndDrop` which implements keyboard accessibile drag and drop by +returning an onKeyDown handler to be passed to the component's drag icon button. + +## Usage + +:::note +The following examples assume that you have already set up the `DndProvider` with `HTML5Backend` in your application and +that you are somewhat familiar with `@strapi/design-system` components. +::: + +### Basic usage - Move items on hovering over drop zone + +Below is a basic example usage where we move items immediately and we're not interested in rendering custom previews in the DragLayer. +However, we do replace the current item with a placeholder. + +```jsx +import { Box, Flex, IconButton } from '@strapi/design-system'; +import { Drag } from '@strapi/icons'; + +import { useDragAndDrop } from 'path/to/hooks'; +import { composeRefs } from 'path/to/utils'; + +import { Placeholder } from './Placeholder'; + +const MyComponent = ({ onMoveItem }) => { + const [{ handlerId, isDragging, handleKeyDown }, myRef, dropRef, dragRef] = useDragAndDrop(true, { + type: 'my-type', + index, + onMoveItem, + }); + + const composedRefs = composeRefs(myRef, dragRef); + + return ( + + {isDragging ? ( + + ) : ( + + + + + {'My item'} + + )} + + ); +}; +``` + +### Basic usage - Move items on dropping over drop zone + +Below is a basic example usage where we move items immediately without custom previews in the DragLayer. We do not replace +the current item until its dropped and show a drop placeholder instead next to drop target using drag direction. + +```jsx +import { Box, Flex, IconButton } from '@strapi/design-system'; +import { Drag } from '@strapi/icons'; + +import { useDragAndDrop } from 'path/to/hooks'; +import { composeRefs } from 'path/to/utils'; + +import { Placeholder } from './Placeholder'; + +const MyComponent = ({ onDropItem }) => { + const [{ handlerId, handleKeyDown, isOverDropTarget, direction }, myRef, dropRef, dragRef] = + useDragAndDrop(true, { + type: 'my-type', + index, + onDropItem, + }); + + const composedRefs = composeRefs(myRef, dragRef); + + return ( + + {isOverDropTarget && } + + + + + {'My item'} + + + ); +}; +``` + +### Using custom previews + +The only really difference between the previous example and this one is that +we're using the `getEmptyImage` function from `react-dnd-html5-backend` to render custom previews in the DragLayer. + +```jsx +import { getEmptyImage } from 'react-dnd-html5-backend'; +import { Box, Flex, IconButton } from '@strapi/design-system'; +import { Drag } from '@strapi/icons'; + +import { useDragAndDrop } from 'path/to/hooks'; +import { composeRefs } from 'path/to/utils'; + +import { Placeholder } from './Placeholder'; + +const MyComponent = ({ onMoveItem }) => { + const [{ handlerId, isDragging, handleKeyDown }, myRef, dropRef, dragRef, dragPreviewRef] = + useDragAndDrop(true, { + type: 'my-type', + index, + onMoveItem, + }); + + // highlight-start + useEffect(() => { + dragPreviewRef(getEmptyImage()); + }, [dragPreviewRef]); + // highlight-end + + const composedRefs = composeRefs(myRef, dragRef); + + return ( + + {isDragging ? ( + + ) : ( + + + + + {'My item'} + + )} + + ); +}; +``` + +## Typescript + +```ts +import { Identifier } from 'dnd-core'; +import { ConnectDropTarget, ConnectDragSource, ConnectDragPreview } from 'react-dnd'; + +interface UseDragAndDropOptions { + index: number | Array; + onMoveItem?: (newIndex: number | Array, currentIndex: number | Array) => void; + /** + * @default "regular" + * Defines whether the change in index should be immediately over another + * dropzone or half way over it (regular). + */ + dropSensitivity?: 'immediate' | 'regular'; + item?: object; + /** + * @default 'STRAPI_DND' + */ + type?: string; + onCancel?: (index: number) => void; + onDropItem?: (currentIndex: number | Array, newIndex: number | Array) => void; + onEnd?: () => void; + onGrabItem?: (index: number) => void; + onStart?: () => void; +} + +type UseDragAndDropReturn = [ + props: { + handlerId: Identifier; + isDragging: boolean; + handleKeyDown: (event: KeyboardEvent) => void; + isOverDropTarget: boolean; + direction: string; + }, + objectRef: React.RefObject, + dropRef: ConnectDropTarget, + dragRef: ConnectDragSource, + dragPreviewRef: ConnectDragPreview, +]; + +type UseDragAndDrop = (active: boolean, options: UseDragAndDropOptions) => UseDragAndDropReturn; +``` + +## Accessibility + +Its advised to implement a [live text region](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Live_Regions) in the +parent component holding your individual dnd children. This should be done to inform the user of the current state of the drag and drop. +To implement this, you need to pass the `onDropItem`, `onGrabItem` and `onCancel` callbacks to the `useDragAndDrop` hook which are fired +only with the purpose of updating the live region, hence why they're optional. You would also update the live region as part of your +`onMoveItem` callback. There are generic messages that can be used in the `intl` provider, an example of using this may look like: + +```js +setLiveText( + formatMessage( + { + id: getTrad('dnd.drop-item'), + defaultMessage: `{item}, dropped. Final position in list: {position}.`, + }, + { + item: 'my item', + position: 1, + } + ) +); +``` + +## Further Reading + +- [react-dnd docs](https://react-dnd.github.io/react-dnd/docs/overview) +- [useDrag API](https://react-dnd.github.io/react-dnd/docs/api/use-drag) +- [useDrop API](https://react-dnd.github.io/react-dnd/docs/api/use-drop) +- [useDragLayer API](https://react-dnd.github.io/react-dnd/docs/api/use-drag-layer) + +## Troubleshooting + +### Firefox quirks + +You might notice in the [basic usage](#basic-usage) section this piece of code: + +```jsx + + + +``` + +In `firefox` the drag handler will not work if you click and drag when the element is a `button`, this is known [bug in the browser](https://bugzilla.mozilla.org/show_bug.cgi?id=568313). +Therefore the workaround is to use the `forwardedAs` prop to render a `div` instead of a `button` +and add the `role` and `tabIndex` props to make this accessible. The actual `IconButton` component +adds an accessible lable from the `aria-label` prop. So we don't have to concern ourselves with that. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/services/00-permission-checker.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/services/00-permission-checker.md new file mode 100644 index 0000000..c8c567f --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/services/00-permission-checker.md @@ -0,0 +1,153 @@ +# Permission Checker + +## Overview + +The **Permission Checker** is a service in Strapi that helps enforce access control policies by verifying user permissions for various actions on content entities. It provides methods to check, sanitize, and validate user actions based on their permissions. + +## Features + +- **Permission Checking**: Verify whether a user has the necessary permissions for a specific action. +- **Sanitization**: Remove unauthorized fields from input and output data. +- **Validation**: Ensure that queries and input data comply with permission rules. +- **Query Enforcement**: Modify queries to include permission constraints automatically. + +## Actions Supported + +The service defines the following actions: + +```ts +const ACTIONS = { + read: 'plugin::content-manager.explorer.read', + create: 'plugin::content-manager.explorer.create', + update: 'plugin::content-manager.explorer.update', + delete: 'plugin::content-manager.explorer.delete', + publish: 'plugin::content-manager.explorer.publish', + unpublish: 'plugin::content-manager.explorer.publish', + discard: 'plugin::content-manager.explorer.update', +} as const; +``` + +## Usage + +### Instantiating the Permission Checker + +To use the permission checker, retrieve it from the **content-manager** plugin: + +```ts +const permissionChecker = strapi + .plugin('content-manager') + .service('permission-checker') + .create({ userAbility, model }); +``` + +- `userAbility`: The user's ability object containing their permissions. Accessed on the request context object: `ctx.state.userAbility` +- `model`: The content type model for which permissions are checked. + +### Checking Permissions + +#### `can.()` + +Determines if the user **has** permission to perform a specific action. + +```ts +if (permissionChecker.can.create()) { + console.log('User can create content'); +} +``` + +#### `cannot.()` + +Determines if the user **does not** have permission to perform a specific action. + +```ts +if (permissionChecker.cannot.delete()) { + throw new errors.ForbiddenError('User is not allowed to delete content'); +} +``` + +### Sanitization Methods + +#### `sanitizeOutput(data, { action })` + +Cleans output data based on permissions. + +```ts +const sanitizedData = permissionChecker.sanitizeOutput(entity); +``` + +#### `sanitizeQuery(query, { action })` + +Cleans a query before execution. + +```ts +const safeQuery = permissionChecker.sanitizeQuery({ page: '1', pageSize: '10' }); +``` + +#### `sanitizeInput(action, data, entity)` + +Cleans input data before saving. + +```ts +const sanitizedInput = permissionChecker.sanitizeInput('create', inputData); +``` + +#### `sanitizeCreateInput(data)` + +Shortcut for sanitizing create input. + +```ts +const sanitizedCreateData = permissionChecker.sanitizeCreateInput(inputData); +``` + +#### `sanitizeUpdateInput(entity) => (data)` + +Shortcut for sanitizing update input. + +```ts +const sanitizedUpdateData = permissionChecker.sanitizeUpdateInput(existingEntity)(inputData); +``` + +### Validation Methods + +#### `validateQuery(query, { action })` + +Ensures a query is valid based on permissions. + +```ts +const validatedQuery = permissionChecker.validateQuery({ page: '1', pageSize: '10' }); +``` + +#### `validateInput(action, data, entity)` + +Ensures input data is valid before saving. + +```ts +permissionChecker.validateInput('update', inputData, existingEntity); +``` + +### Query Enforcement + +#### `sanitizedQuery.(query)` + +Modifies queries to enforce permissions automatically. + +```ts +const securedQuery = permissionChecker.sanitizedQuery.read({ sort: 'createdAt:desc' }); +``` + +## Exported Service + +```ts +export default ({ strapi }: { strapi: Core.Strapi }) => ({ + create: createPermissionChecker(strapi), +}); +``` + +## Example Usage in Strapi + +```ts +const canCreate = strapi.plugin('content-manager').service('permission-checker').can.create(); +if (!canCreate) { + throw new errors.ForbiddenError('User does not have permission to create content'); +} +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/services/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/services/_category_.json new file mode 100644 index 0000000..a7c7244 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-manager/services/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Services", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/00-intro.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/00-intro.md new file mode 100644 index 0000000..1cebb59 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/00-intro.md @@ -0,0 +1,36 @@ +--- +title: Introduction +tags: + - content-releases +--- + +# Content Releases + +A release contains various content entries, each capable of being assigned a specific action such as publish or unpublish. Within a release, entries may be in different locales or come from different content types. With a simple click of a button, a release can execute the designated action for each entry. Content Releases is an enterprise edition feature. + +### Architecture + +As opposed to other EE features built in the [EE folder](docs/docs/01-core/admin/01-ee/00-intro.md), Releases is built as a plugin. The plugin can be found in: + +``` +packages/core/content-releases +``` + +```mdx-code-block +import DocCardList from '@theme/DocCardList'; +import { useCurrentSidebarCategory } from '@docusaurus/theme-common'; + + +``` + +### Release's status + +Releases are assigned one of five statuses: + +- **Ready**: Indicates that the release is fully prepared for publishing, with no invalid entries present. +- **Blocked**: Release has at least one invalid entry preventing publishing. +- **Empty**: Release contains no entries and cannot be published. +- **Failed**: Indicates that the publishing attempt for the release has encountered an error with no changes since then. +- **Done**: Confirms that the release has been successfully published without encountering any errors. + +These statuses are dynamically updated based on actions such as creation, addition/removal of entries, updates, and publishing attempts. They provide a concise overview of release readiness and validity, ensuring smooth operations and data integrity. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/01-backend.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/01-backend.md new file mode 100644 index 0000000..847be88 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/01-backend.md @@ -0,0 +1,251 @@ +--- +title: Backend Design +description: Content Releases backend +tags: + - content-releases + - tech design +--- + +All backend code can be found in: + +``` + packages/core/content-releases/server +``` + +## Content-types + +The content-releases plugin creates two hidden content-types. + +### Release + +The `Release` content type stores all the information about a release and its associated Release Actions. It is saved in the database as `strapi_releases`. The schema can be found in: + +``` +packages/core/content-releases/server/src/content-types/release/schema.ts +``` + +### Release Action + +Th `Release Action` content type is associated with any entry from any content-type that has draft and publish enabled. It is responsible for storing the action to perform for an associated entry. It is saved in the database as `strapi_release_actions`. In v4, we used built-in polymorphic relations, but for v5, we stored `contentType`, `locale`, and `entryDocumentId` in the Release Action schema to create a "manual" relationship between actions and entries. This approach allows us to link a release action to a document ID instead of a specific entry ID, as the entry ID may change over time and is not reliable. + +The schema can be found in: + +``` +packages/core/content-releases/server/src/content-types/release-action/schema.ts +``` + +## Routes + +Release and Release Action routes are only accessible on the Admin API. + +### Release + +Release routes can be found in: + +``` +packages/core/content-releases/server/src/routes/release.ts +``` + +**Get all releases**: + +- method: `GET` +- endpoint: `/content-releases/` +- params: + ```ts + { + page: number; + pageSize: number; + } + ``` + +**Get all releases with/without an entry**: + +- method: `GET` +- endpoint: `/content-releases/getByDocumentAttached` +- params: + ```ts + { + contentTypeUid: string; + locale?: string; + documentId?: string; + hasEntryAttached?: boolean; + } + ``` + +**Get a single release** + +- method: `GET` +- endpoint: `/content-releases/:id` + +**Create a release**: + +- method: `POST` +- endpoint: `/content-releases/` +- body: + ```ts + { + name: string; + } + ``` + +**Update a release**: + +- method: `PUT` +- endpoint: `/content-releases/:id` +- body: + ```ts + { + name: string; + } + ``` + +**Delete a release**: + +- method: `DELETE` +- endpoint: `/content-releases/:id` + +**Publish a release**: + +- method: `POST` +- endpoint: `/content-releases/:id/publish` + +### Release Action + +**Create a release action** + +- method: `POST` +- endpoint: `/content-releases/:releaseId/actions` +- body: + + ```ts + { + type: 'publish' | 'unpublish', + contentType: string; + locale?: string; + entryDocumentId?: string; + } + ``` + +**Get release actions from a release** + +- method: `GET` +- endpoint: `/content-releases/:releaseId/actions` +- body: + ```ts + { + page: number; + pageSize: number; + } + ``` + +**Update a release action** + +- method: `PUT` +- endpoint: `/content-releases/:releaseId/actions/:actionId` +- body: + ```ts + { + type: 'publish' | 'unpublish'; + } + ``` + +**Delete a release action** + +- method: `DELETE` +- endpoint: `/content-releases/:releaseId/actions/:actionId` + +## Controllers + +### Release + +Handles requests to interact with the Release content type + +``` +packages/core/content-releases/server/src/controllers/release.ts +``` + +### Release Action + +Handles requests to interact with the Release Action content type + +## Services + +### Release + +Interacts with the database for Release CRUD operations + +``` +packages/core/content-releases/server/src/services/release.ts +``` + +### Release Actions + +Interacts with the database for Release Actions CRUD operations + +``` +packages/core/content-releases/server/src/services/release-action.ts +``` + +### Release Validation + +Exposes validation functions to run before performing operations on a Release + +``` +packages/core/content-releases/server/src/services/validation.ts +``` + +### Scheduling + +:::caution +Scheduling is still under development, but you can try it **at your own risk** with future flags. The future flag to enable scheduling is `contentReleasesScheduling`. +::: + +Exposes methods to schedule release date for releases. + +``` +packages/core/content-releases/server/src/services/scheduling.ts +``` + +### Release status update triggers: + +Considering that retrieving the status of all entries in a release is a heavy operation, we don't fetch it every time a user wants to access a release. Instead, we store the status in a field within the Release Content Type, and we only update it when an action that changes the status is triggered. These actions include: + +#### Creating a release: + +When creating a release, its status is automatically set to "Empty" as there are no entries initially. + +#### Adding an entry to a release: + +Upon adding an entry to a release, its status is recalculated to either "Ready" or "Blocked" based on the validity of the added entry. + +#### Removing an entry from a release: + +After removing an entry from a release, the status is recalculated to determine if the release is now "Ready", "Blocked", or "Empty". + +#### Updating a release: + +Whenever a release is updated, its status is recalculated based on the validity of the actions performed during the update. + +#### Publishing a release: + +During the publishing process, if successful, the status changes to "Done"; otherwise, it changes to "Failed". + +#### Listening to events on entries: + +When an entry is updated or deleted, the status of all releases containing that entry is recalculated to reflect any changes in validity. + +## Migrations + +We have two migrations that we run every time we sync the content types. + +### `deleteActionsOnDisableDraftAndPublish` + +When a user disables Draft and Publish in one Content Type we make sure to remove all the release actions related to entries of that content type to avoid errors. + +### `deleteActionsOnDeleteContentType` + +When a Content Type is deleted, delete all actions containing entries from that Content Type. + +## Subscribing to Lifecycles Events + +When an entry is deleted delete all actions containing that entry. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/02-frontend/00-intro.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/02-frontend/00-intro.md new file mode 100644 index 0000000..4ee8e68 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/02-frontend/00-intro.md @@ -0,0 +1,21 @@ +--- +title: Introduction +tags: + - content-releases + - tech design +--- + +## Summary + +There are two pages, ReleasesPage and ReleaseDetailsPage. To access these pages a user will need a valid Strapi license with the feature enabled and at lease `plugin::content-releases.read` permissions. + +Redux toolkit is used to manage content releases data (data retrieval, release creation and editing, and fetching release actions). `Formik` is used to create/edit a release and all input components are controlled components. + +### License limits + +Most licenses have feature-based usage limits configured through Chargebee. These limits are exposed to the frontend through [`useLicenseLimits`](/docs/core/admin/ee/hooks/use-license-limits). +If the license doesn't specify the number of maximum pending releases an hard-coded is used: max. 3 pending releases. + +### Endpoints + +For a list of all available endpoints please refer to the [detailed backend design documentation](/docs/core/content-releases/backend). diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/02-frontend/01-releases-page.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/02-frontend/01-releases-page.mdx new file mode 100644 index 0000000..306e7a0 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/02-frontend/01-releases-page.mdx @@ -0,0 +1,18 @@ +--- +title: Releases page +tags: + - content-releases + - tech design +--- + +### Overview + +The releases page provides a comprehensive display of all available content releases. Content is organized into two tabs: 'pending' (releases not yet published) and 'done' (releases already published). + +#### New Release Creation: + +If a user has the `plugin::content-releases.update` permissions, a 'New release' button will be visible in the header. Clicking the button opens a form requiring a name. The name of a pending release must be unique. + +#### License limits + +If the user reaches the limit of maximum pending releases defined on their license then the 'New release' button is disabled and a banner is displayed to inform the user. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/02-frontend/02-release-details-page.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/02-frontend/02-release-details-page.mdx new file mode 100644 index 0000000..f9688d3 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/02-frontend/02-release-details-page.mdx @@ -0,0 +1,37 @@ +--- +title: Release details page +tags: + - content-releases + - tech design +--- + +### Overview: + +The release details page allows users with appropriate permissions to do the following: + +#### Group entries: + +Entries in a release can be be grouped by the following options: + +- Content-Types: Group all entries with the same content type together +- Locales: Group all entries with the same locale together. +- Actions: Group all entries with the same action (publish/unpublish) together. + +#### Edit a release: + +If the user has the `plugin::content-releases.update` permissions, a "three dot" button will appear in the header giving access to a menu with an "Edit" option. +The Edit button opens a modal, enabling users to modify the release name. To save the changes, the new name must be unique (only for pending releases), non-empty, and distinctly modified. + +#### Delete a release: + +If the user has the `plugin::content-releases.delete` permissions, a "three dot" button will appear in the header giving access to a menu with a "Delete" option. Selecting this option triggers a confirmation modal. + +#### View Entry Status + +Each entry within a release is assigned a status, indicating its readiness for actions such as Publish/Unpublish or any validation errors present. If the entry has validation errors, a user can use the entry's "three dots" menu to access the "Edit entry" link which navigates directly to the entry in the content manager. + +Within the CM edit view, users can resolve any identified errors. Upon completion, clicking the "Refresh" button on the release details page updates the status of each entry to reflect any changes made. + +#### Publish a release: + +To execute the release of a content release, users can simply click on the "Publish" button (shown if you have the "plugin::content-releases.publish" permission). If any of the entries exhibit validation errors, the "Publish" action triggers a notification to alert users of the errors. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/02-frontend/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/02-frontend/_category_.json new file mode 100644 index 0000000..050c324 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/02-frontend/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Frontend", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/03-scheduling.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/03-scheduling.md new file mode 100644 index 0000000..9dcff92 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/03-scheduling.md @@ -0,0 +1,44 @@ +--- +title: Content Releases Scheduling +description: Content Releases Scheduling +tags: + - content-releases + - tech design +--- + +:::caution +Content Releases Scheduling is not yet a stable feature. Therefore, all the elements documented on this page are not currently visible. If you wish to try Releases Scheduling, you can enable it **at your own** risk using the `contentReleasesScheduling` feature flag. +::: + +Scheduling provides users with the ability to set a scheduled date for the release, automating its publication or unpublishing. When this happens, a webhook is triggered, providing the result of the attempt to publish the release. + +## How it works + +Everytime you create or update a release and add a scheduled date, the server responsible for handling this request will generate a new cronjob (utilizing node-schedule) for the selected date to publish the release. + +## Timezones + +When selecting a scheduled date, you have the option to choose a specific timezone; by default, your system timezone is selected. This measure is taken to prevent any potential confusion when selecting the publication time for a release. Consequently, if a user sets a schedule for 16:00 using the "Europe/Paris" timezone (UTC+01:00), another user accessing the same release will see the same time (16:00 (UTC+01:00)), regardless of their system's timezone. + +## Scheduling in a architecture with multiple Strapi instances + +It's possible that your Strapi project runs on multiple instances. In such cases, what happens with the cronjobs? Do they all run simultaneously, attempting to publish the release multiple times? To understand how we address this scenario, it's important to differentiate between two cases when scheduling a release: + +### Release scheduled on runtime + +If you have 3 Strapi instances running concurrently, and you distribute traffic among them using any method, there is not a big problem. This is because the server responsible for handling one request to create/update a release and add a schedule will be the only server with the associated cronjob. Then, there's no duplication, and potential race condition problems are avoided. + +### Starting a strapi instance + +The problem is starting a new Strapi instance, because we retrieve all scheduled releases and ensure that cronjobs are created for each one. Consequently, multiple Strapi instances might end up with the same cronjob for a release publish. To address this, we implement the following logic: + +a diagram overview explaining the publish release flow + +We set up a transaction that locks the release being published using SQL forUpdate. This means that any other processes attempting to access the release row will be put on hold until the first one finishes executing. + +If the validation of the release entries is successful, the publish action proceeds smoothly. In this scenario, we update the releasedAt column of the release with the current date and release the row lock. Subsequently, any incoming processes attempting to access the release would simply encounter an error because the release has already been published. + +On the other hand, if the publish process fails, we update the release's status to "failed". When the status is marked as failed, any subsequent attempts to publish will fail silently. The "failed" status only changes when a user makes alterations to the release. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/_category_.json new file mode 100644 index 0000000..03e08e1 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-releases/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Content Releases", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-type-builder/00-intro.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-type-builder/00-intro.md new file mode 100644 index 0000000..7f97168 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-type-builder/00-intro.md @@ -0,0 +1,17 @@ +--- +sidebar_position: 1 +title: Introduction +tags: + - content-type-builder +--- + +# Content Type Builder + +This section is an overview of all the features related to the Content Type Builder: + +```mdx-code-block +import DocCardList from '@theme/DocCardList'; +import { useCurrentSidebarCategory } from '@docusaurus/theme-common'; + + +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/content-type-builder/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-type-builder/_category_.json new file mode 100644 index 0000000..38c62f9 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/content-type-builder/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Content Type Builder", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/00-intro.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/00-intro.md new file mode 100644 index 0000000..387d4f7 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/00-intro.md @@ -0,0 +1,19 @@ +--- +title: Introduction +tags: + - data-transfer + - experimental +--- + +# Data Transfer + +This section is an overview of all the features related to the data-transfer package: + +```mdx-code-block +import DocCardList from '@theme/DocCardList'; +import { useCurrentSidebarCategory } from '@docusaurus/theme-common'; + + +``` + +Note: The data-transfer package is written in Typescript and any additions or changes must include all necessary typings. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/01-engine/01-engine.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/01-engine/01-engine.mdx new file mode 100644 index 0000000..a32f68f --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/01-engine/01-engine.mdx @@ -0,0 +1,531 @@ +--- +title: Transfer Engine +description: Conceptual guide to the data transfer engine +tags: + - data-transfer + - experimental +--- + +The transfer engine manages the data transfer process by facilitating communication between a source provider and a destination provider. + +## Architecture Overview + +```mermaid +flowchart LR + subgraph Ops["Stream Operations"] + direction LR + + subgraph ReadOps["Read Operations"] + direction TB + SR[Schema Read] + SR --> ER[Entity Read] + ER --> AR[Asset Read] + AR --> LR[Link Read] + LR --> CR[Config Read] + end + + subgraph Sources["Source Providers"] + direction TB + RSP[Remote Source Provider] + RSP --> LSP[Local Source Provider] + LSP --> FSP[File Source Provider] + style Sources fill:#f0f0ff,stroke:#d0d0ff + end + + subgraph Engine["Transfer Engine"] + direction TB + TE[Transfer Engine] + TE --> TF[Transform Stream] + TF --> PT[Progress Tracker] + style Engine fill:#f0f0ff,stroke:#d0d0ff + end + + subgraph Dests["Destination Providers"] + direction TB + RDP[Remote Destination Provider] + RDP --> LDP[Local Destination Provider] + LDP --> FDP[File Destination Provider] + style Dests fill:#f0f0ff,stroke:#d0d0ff + end + + subgraph WriteOps["Write Operations"] + direction TB + SW[Schema Write] + SW --> EW[Entity Write] + EW --> AW[Asset Write] + AW --> LW[Link Write] + LW --> CW[Config Write] + end + + ReadOps --> Sources + Sources --> Engine + Engine --> Dests + Dests --> WriteOps + end + + %% Styling + classDef provider fill:#fff0f0,stroke:#d0d0ff,color:black + classDef engine fill:#fff0f0,stroke:#d0d0ff,color:black + classDef stream fill:#c8ffc8,stroke:#a0ffa0,color:black + classDef ops fill:#f8f8f8,stroke:#e8e8e8,color:black + + class RSP,LSP,FSP,RDP,LDP,FDP provider + class TE,TF,PT engine + class SR,ER,AR,LR,CR,SW,EW,AW,LW,CW stream + class ReadOps,WriteOps ops + style Ops fill:#f8f8f8,stroke:#e8e8e8 +``` + +## Code location + +`packages/core/data-transfer/src/engine/index.ts` + +## The transfer process + +```mermaid +sequenceDiagram + participant Client + participant TE as Transfer Engine + participant SP as Source Provider + participant DP as Destination Provider + participant DH as Diff Handler + + rect rgb(230, 245, 230) + Note over Client,DP: 1️⃣ Bootstrap & Initialize Phase + Client->>+TE: Start Transfer + TE->>SP: Bootstrap + Note right of SP: Connect to files,
databases, etc. + TE->>DP: Bootstrap + Note right of DP: Setup connections,
prepare storage + TE->>SP: Get Metadata + SP-->>TE: Source Metadata + TE->>DP: Get Metadata + DP-->>TE: Destination Metadata + end + + rect rgb(230, 240, 250) + Note over Client,DP: 2️⃣ Integrity Check Phase + TE->>TE: Version Strategy Check + Note right of TE: Compare Strapi versions + alt Version Mismatch + TE->>Client: Version Validation Error + end + TE->>SP: Get Schemas + SP-->>TE: Source Schemas + TE->>DP: Get Schemas + DP-->>TE: Destination Schemas + TE->>TE: Schema Strategy Check + alt Schema Differences + TE->>+DH: onSchemaDiff + Note right of DH: Resolve schema
differences + alt Resolved + DH-->>-TE: Continue + else Unresolved + DH-->>TE: Schema Validation Error + end + end + end + + rect rgb(245, 235, 250) + Note over Client,DP: 3️⃣ Data Transfer Phase + + Note over TE,DP: Stage 1: Schemas + TE->>SP: Create Schemas ReadStream + TE->>DP: Create Schemas WriteStream + SP-->>DP: Stream Schema Data + + Note over TE,DP: Stage 2: Entities + TE->>SP: Create Entities ReadStream + TE->>DP: Create Entities WriteStream + SP-->>DP: Stream Entity Data + + Note over TE,DP: Stage 3: Assets + TE->>SP: Create Assets ReadStream + TE->>DP: Create Assets WriteStream + SP-->>DP: Stream Asset Files + + Note over TE,DP: Stage 4: Links + TE->>SP: Create Links ReadStream + TE->>DP: Create Links WriteStream + SP-->>DP: Stream Relation Data + + Note over TE,DP: Stage 5: Configuration + TE->>SP: Create Config ReadStream + TE->>DP: Create Config WriteStream + SP-->>DP: Stream Config Data + end + + rect rgb(255, 240, 230) + Note over Client,DP: 4️⃣ Cleanup Phase + TE->>SP: Close + SP-->>TE: Closed + TE->>DP: Close + DP-->>TE: Closed + TE->>-Client: Transfer Complete + end +``` + +A transfer starts by bootstrapping and initializing itself and the providers. That is the stage where providers attempt to make any necessary connections to files, databases, websockets, etc. + +After that, the integrity check between the source and destination is run, which validates the requirements set by the chosen schemaStrategy and versionStrategy. + +Note: Schema differences during this stage can be resolved programmatically by adding an `onSchemaDiff` handler. However, be aware that this interface is likely to change to a more generic engine handler (such as `engine.on('schemaDiff', handler)`) before this feature is stable. + +Once the integrity check has passed, the transfer begins by opening streams from the source to the destination one stage at a time. The following is a list of the stages in the order they are run: + +1. schemas - content type schemas. Note: with all built-in Strapi destination providers, only the Strapi file provider makes use of this data +2. entities - all entities (including components, dynamic zones, and media data but not media files) _without their relations_ +3. assets - the files from the /uploads folder +4. links - the relations between entities +5. configuration - the Strapi project configuration data + +Once all stages have been completed, the transfer waits for all providers to close and then emits a finish event and the transfer completes. + +## Setting up the transfer engine + +A transfer engine object is created by using `createTransferEngine`, which accepts a [source provider](./02-providers/01-source-providers.md), a [destination provider](./02-providers/02-destination-providers.md), and an options object. + +Note: By default, a transfer engine will transfer ALL data, including admin data, api tokens, etc. Transform filters must be used if you wish to exclude, as seen in the example below. An array called `DEFAULT_IGNORED_CONTENT_TYPES` is available from @strapi/data-transfer containing the uids that are excluded by default from the import, export, and transfer commands. If you intend to transfer admin data, be aware that this behavior will likely change in the future to automatically exclude the entire `admin::` uid namespace and will instead require them to be explicitly included. + +```typescript +const engine = createTransferEngine(source, destination, options); +``` + +### Engine Options + +An example using every available option: + +```typescript +const options = { + versionStrategy: 'ignore', // see versionStragy documentation + schemaStrategy: 'strict', // see schemaStragey documentation + exclude: [], // exclude these classifications of data; see CLI documentation of `--exclude` for list + only: [], // transfer only these classifications of data; see CLI documentation of `--only` for list + throttle: 0, // add a delay of this many millseconds between each item transferred + + // the keys of `transforms` are the stage names for which they are run + transforms: { + links: [ + { + // exclude all relations to ignored content types + filter(link) { + return ( + !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.left.type) && + !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.right.type) + ); + }, + }, + // Note: map exists for links but is not recommended + ], + entities: [ + { + // exclude all ignored content types + filter(entity) { + return !DEFAULT_IGNORED_CONTENT_TYPES.includes(entity.type); + }, + }, + { + map(entity) { + // remove somePrivateField from privateThing entities + if (entity.type === 'api::privateThing.privateThing') { + entity.somePrivateField = undefined; + } + + return entity; + }, + }, + ], + }, +}; +``` + +#### versionStrategy + +The following `versionStrategy` values may be used: + +`'ignore'` - allow transfer between any versions of Strapi +`'exact'` - require an exact version match (including tags such as -alpha and -beta) +`'major'` - require only the semver major version to match (but allow minor, patch, and tag to differ) +`'minor'` - require only the semver major and minor versions to match (but allow patch to differ) +`'patch'` - require only the semver major, minor, and patch version to match (but allow tag differences such as -alpha and -beta) + +The default `versionStrategy` used when one is not provided is `'ignore'`. + +#### schemaStrategy + +The follow `schemaStrategy` values may be used: + +`'ignore'` - bypass schema validation (transfer will attempt to run but throw errors on incompatible data type inserts) +`'strict'` - disallow mismatches that are expected to cause errors in the transfer, but allow certain non-data fields in the schema to differ +`'exact'` - schema must be identical with no changes + +Note: The "strict" schema strategy is defined as "anything expected to cause errors in the transfer" and is the default method for the import, export, and transfer CLI commands. Therefore, the technical functionality will always be subject to change. If you need to find the definition for the current version of Strapi, see `packages/core/data-transfer/src/engine/validation/schemas/index.ts` + +The default `schemaStrategy` used when one is not provided is `'strict'`. + +##### Handling Schema differences + +When a schema diff is discovered with a given schemaStrategy, an error is throw. However, before throwing the error the engine checks to see if there are any schema diff handlers set via `engine.onSchemaDiff(handler)` which allows errors to be bypassed (for example, by prompting the user if they wish to proceed). + +A diff handler is an optionally asynchronous middleware function that accepts a `context` and a `next` parameter. + +`context` is an object of type `SchemaDiffHandlerContext` + +```typescript +// type Diff can be found in /packages/core/data-transfer/src/utils/json.ts +type SchemaDiffHandlerContext = { + ignoredDiffs: Record; + diffs: Record; + source: ISourceProvider; + destination: IDestinationProvider; +}; +``` + +`next` is a function that is called, passing the modified `context` object, to proceed to the next middleware function. + +```typescript +const diffHandler = async (context, next) => { + const ignoreThese = {}; + // loop through the diffs + Object.entries(context.diffs).forEach(([uid, diffs]) => { + for (const [i, diff] of diffs) { + // get the path of the diff in the schema + const path = [uid].concat(diff.path).join('.'); + + // Allow a diff on the country schema displayName + if (path === 'api::country.country.info.displayName') { + if (!isArray(context.ignoredDiffs[uid])) { + context.ignoredDiffs[uid] = []; + } + context.ignoredDiffs[uid][i] = diff; + } + } + }); + + return next(context); +}; + +engine.onSchemaDiff(diffHandler); +``` + +After all the schemaDiffHandler middlewares have been run, another diff is run between `context.ignoredDiffs` and `context.diffs` and any remaining diffs that have not been ignored are thrown as fatal errors and the engine will abort the transfer. + +### Progress Tracking events + +The transfer engine allows tracking the progress of your transfer either directly with the engine.progress.data object, or with listeners using the engine.progress.stream PassThrough stream. The engine.progress.data object definition is of type TransferProgress. + +Here is an example that logs a message at the beginning and end of each stage, as well as a message after each item has been transferred + +```typescript +const progress = engine.progress.stream; + +progress.on(`stage::start`, ({ stage, data }) => { + console.log(`${stage} has started at ${data[stage].startTime}`); +}); + +progress.on('stage::finish', ({ stage, data }) => { + console.log(`${stage} has finished at ${data[stage].endTime}`); +}); + +progress.on('stage::progress', ({ stage, data }) => { + console.log('Transferred ${data[stage].bytes} bytes / ${data[stage].count} entities'); +}); +``` + +Note: There is currently no way for a source provider to give a "total" number of records expected to be transferred, but it is expected in a future update. + +The following events are available: + +`stage::start` - at the start of each stage +`stage::finish` - at the end of each stage +`stage::progress` - after each entitity in that stage has been transferred +`stage::skip` - when an entire stage is skipped (eg, when 'only' or 'exclude' are used) +`stage::error` - when there is an error thrown during a stage +`transfer::init` - at the very beginning of engine.transfer() +`transfer::start` - after bootstrapping and initializing the providers, when the transfer is about to start +`transfer::finish` - when the transfer has finished +`transfer::error` - when there is an error thrown during the transfer + +### Diagnostics events + +The engine includes a diagnostics reporter which can be used to listen for diagnostics information (debug messages, errors, etc). + +Here is an example for creating a diagnostics listener: + +```typescript +// listener function +const diagnosticListener: DiagnosticListener = (data: GenericDiagnostic) => { + // handle the diagnostics event, for example with custom logging +}; + +// add a generic listener +engine.diagnostics.onDiagnostic(diagnosticsListener); + +// add an error listener +engine.diagnostics.on('error', diagnosticListener); + +// add a warning listener +engine.diagnostics.on('warning', diagnosticListener); +``` + +To emit your own diagnostics event: + +```typescript +const event: ErrorDiagnostic = { + kind: 'error', + details: { + message: 'Your diagnostics message' + createdAt: new Date(), + }, + name: 'yourError', + severity: 'fatal', + error: new Error('your error message') +} + +engine.diagnostics.report(event); +``` + +Here is an excerpt of the relevant types used in the previous examples: + +```typescript +// engine/diagnostic.ts +// format of the data sent to the listener +export type GenericDiagnostic = { + kind: K; + details: { + message: string; + createdAt: Date; + } & T; +}; + +export type DiagnosticKind = 'error' | 'warning' | 'info'; + +export type Diagnostic = ErrorDiagnostic | WarningDiagnostic | InfoDiagnostic; + +export type ErrorDiagnosticSeverity = 'fatal' | 'error' | 'silly'; + +export type ErrorDiagnostic = GenericDiagnostic< + 'error', + { + name: string; + severity: ErrorDiagnosticSeverity; + error: Error; + } +>; + +export type WarningDiagnostic = GenericDiagnostic< + 'warning', + { + origin?: string; + } +>; + +export type InfoDiagnostic = GenericDiagnostic< + 'info', + { + params?: T; + } +>; +``` + +### Transforms + +Transforms allow you to manipulate the data that is sent from the source before it reaches the destination. + +## Filter (excluding data) + +Filters can be used to exclude data sent from the source before it is streamed to the destination. They are methods that accept an entity, link, schema, etc and return `true` to keep the entity and `false` to remove it. + +Here is an example that filters out all entities with an id higher than 100: + +```typescript +const options = { + ...otherOptions, + transforms: { + entities: [ + { + // exclude all ignored admin content types + filter(entity) { + return !DEFAULT_IGNORED_CONTENT_TYPES.includes(entity.type); + }, + }, + { + // exclude all entities with an id higher than 100 + filter(entity) { + return Number(entity.id) <= 100; + }, + }, + ], + links: [ + { + // exclude all relations to ignored content types + filter(link) { + return ( + !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.left.type) && + !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.right.type) + ); + }, + }, + { + // remember to exclude links as well or else an error will be thrown when attempting to link an entity we filtered + filter(entity) { + return Number(link.left.id) <= 100 || Number(link.right.id) <= 100) + }, + }, + ], + }, +}; +``` + +## Map (modifying data) + +Maps can be used to modify data sent from the source before it is streamed to the destination. They are methods that accept an entity, link, schema, etc and return the modified version of the object. + +This can be used, for example, to sanitize data between environments. + +Here is an example that removes a field called `somePrivateField` from a content type `privateThing`. + +```typescript +const options = { + ...otherOptions, + transforms: { + entities: [ + { + // exclude all ignored content types + filter(entity) { + return !DEFAULT_IGNORED_CONTENT_TYPES.includes(entity.type); + }, + }, + { + map(entity) { + // remove somePrivateField from privateThing entities + if (entity.type === 'api::privateThing.privateThing') { + entity.somePrivateField = undefined; + } + + return entity; + }, + }, + ], + }, +}; +``` + +By mapping schemas as well as entities, it's even possible (although complex!) to modify data structures between source and destination. + +## Running a transfer + +Running a transfer simply involves calling the asynchrounous engine.transfer() method. + +```typescript +const engine = createTransferEngine(source, destination, options); +try { + await engine.transfer(); +} catch (e) { + console.error('Something went wrong: ', e?.message); +} +``` + +Be aware that engine.transfer() throws on any fatal errors it encounters. + +Note: The transfer engine (and the providers) current only support a single `engine.transfer()` and must be re-instantiated if intended to run multiple times. In the future it is expected to allow them to be used for multiple transfers in a row, but that usage is untested and will result in unpredictable behavior. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/01-engine/02-stream-lifecycle.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/01-engine/02-stream-lifecycle.mdx new file mode 100644 index 0000000..3cc9bbc --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/01-engine/02-stream-lifecycle.mdx @@ -0,0 +1,355 @@ +--- +title: Stream Lifecycle +tags: + - providers + - data-transfer +--- + +# Stream Lifecycle in Data Transfer + +## Overview + +The transfer process consists of five sequential stages. Each stage follows the same stream lifecycle pattern but handles different types of data: + +```mermaid +flowchart LR + subgraph Process["Transfer Process"] + subgraph S1["1.Schemas Stage"] + direction TB + DB["Database Structure"] + CT["Content Type Configs"] + CD["Component Definitions"] + end + + subgraph S2["2.Entities Stage"] + direction TB + AC["Actual Content"] + CoD["Component Data"] + DZ["Dynamic Zone Data"] + MM["Media Metadata"] + end + + subgraph S3["3.Assets Stage"] + direction TB + UF["Upload Files"] + FM["File Metadata"] + FV["File Variants/Formats"] + end + + subgraph S4["4.Links Stage"] + direction TB + CTR["Content Type Relations"] + CR["Component Relations"] + MR["Media Relations"] + end + + subgraph S5["5.Configuration Stage"] + direction TB + SC["Strapi Configurations"] + PS["Project Settings"] + AC2["API Configurations"] + end + + S1 ==> S2 + S2 ==> S3 + S3 ==> S4 + S4 ==> S5 + end + + %% Styling + classDef stageClass fill:#f0f0ff,stroke:#d0d0ff,color:black + classDef itemClass fill:white,stroke:#d0d0ff,color:black + classDef processClass fill:#fafafa,stroke:#e0e0e0 + + class S1,S2,S3,S4,S5 stageClass + class DB,CT,CD,AC,CoD,DZ,MM,UF,FM,FV,CTR,CR,MR,SC,PS,AC2 itemClass + class Process processClass + + %% Link styling + linkStyle 0,1,2,3 stroke:#d0d0ff,stroke-width:2px +``` + +1. **Schemas Stage**: Content type definitions + + - Transfers database structure + - Content type configurations + - Component definitions + +2. **Entities Stage**: Content without relations + + - Actual content data + - Component data + - Dynamic zone data + - Media metadata (not files) + +3. **Assets Stage**: Media files + + - Files from /uploads folder + - File metadata + - File variants/formats + +4. **Links Stage**: Relations between entities + + - Content type relations + - Component relations + - Media relations + +5. **Configuration Stage**: Project settings + - Strapi configurations + - Project-specific settings + - API configurations + +## Stream Lifecycle Phases + +### 1. Stream Creation Phase + +During this phase, the Transfer Engine initializes and connects all necessary streams for the data transfer. + +```mermaid +sequenceDiagram + participant TE as Transfer Engine + participant SP as Source Provider + participant TR as Transform Stream + participant PT as Progress Tracker + participant DP as Destination Provider + + rect rgb(200, 255, 200) + Note over TE,DP: Stream Creation Phase + TE->>SP: createReadStream() + activate SP + SP-->>TE: Source Stream + TE->>TR: createTransformStream() + activate TR + TE->>PT: createProgressTracker() + activate PT + TE->>DP: createWriteStream() + activate DP + end +``` + +**Process:** + +1. The Transfer Engine requests a read stream from the Source Provider +2. A transform stream is created to handle data modifications +3. A progress tracker stream is initialized for monitoring +4. A write stream is requested from the Destination Provider + +**Example Implementation:** + +```typescript +async transferEntities(): Promise { + const stage: TransferStage = 'entities'; + + // 1. Create read stream from source + const source = await this.sourceProvider.createEntitiesReadStream?.(); + + // 2. Create transform stream for data modifications + const transform = this.#createStageTransformStream(stage); + + // 3. Create progress tracker + const tracker = this.#progressTracker(stage); + + // 4. Create write stream from destination + const destination = await this.destinationProvider.createEntitiesWriteStream?.(); + + // 5. Start the transfer + await this.#transferStage({ + stage, + source, + destination, + transform, + tracker + }); +} +``` + +### 2. Stream Pipeline Phase + +This phase represents the active data transfer process where data flows through the connected streams. + +```mermaid +sequenceDiagram + participant SP as Source Provider + participant TR as Transform Stream + participant PT as Progress Tracker + participant DP as Destination Provider + + rect rgb(255, 240, 240) + Note over SP,DP: Data Flow Through Pipeline + + SP->>TR: Read Data + Note over SP,TR: 1. Read entities from database + + TR->>PT: Transform Data + Note over TR,PT: 2. Filter specific content types + + PT->>DP: Track + Note over PT,DP: 3. Track progress + PT->>DP: Write + Note over PT,DP: 4. write to destination + end +``` + +**Process:** + +1. Source Provider reads data (e.g., from database, file system) +2. Data passes through transform stream for any modifications +3. Progress tracker monitors and reports transfer progress +4. Destination Provider writes processed data + +**Key Aspects:** + +- Data flows in chunks through the pipeline +- Each stream can process data asynchronously +- Progress events are emitted for monitoring +- Errors are caught and handled at each step + +**Example Flow:** + +```typescript +async #transferStage(options: { + stage: TransferStage; + source?: Readable; + destination?: Writable; + transform?: PassThrough; + tracker?: PassThrough; +}) { + const { stage, source, destination, transform, tracker } = options; + + // Create pipeline + let stream: Readable = source; + + // Add transform if provided + if (transform) { + stream = stream.pipe(transform); + } + + // Add progress tracker + if (tracker) { + stream = stream.pipe(tracker); + } + + // Connect to destination + await new Promise((resolve, reject) => { + this.#currentStream = stream + .pipe(destination) + .on('error', (error) => { + this.#emitStageUpdate('error', stage); + reject(error); + }) + .on('close', () => { + this.#emitStageUpdate('finish', stage); + resolve(); + }); + }); +} +``` + +### 3. Stream Closing Phase + +The closing phase handles the cleanup of resources and ensures proper completion of the transfer. + +```mermaid +sequenceDiagram + participant TE as Transfer Engine + participant SP as Source Provider + participant TR as Transform Stream + participant PT as Progress Tracker + participant DP as Destination Provider + + rect rgb(240, 240, 255) + Note over TE,DP: Cleanup Process + SP--xTE: Close Source + Note over SP,TE: 1. Close database connections + + TR--xTE: Close Transform + Note over TR,TE: 2. Clear transform buffers + + PT--xTE: Close Tracker + Note over PT,TE: 3. Final progress update + + DP--xTE: Close Destination + Note over DP,TE: 4. Commit transactions + end +``` + +**Process:** + +1. Source stream indicates end of data +2. Transform stream processes final data chunks +3. Progress tracker records final metrics +4. Destination stream completes writing +5. Resources are cleaned up + +**Example Implementation:** + +```typescript +async close(): Promise { + try { + // Clean up providers + const results = await Promise.allSettled([ + this.sourceProvider.close?.(), + this.destinationProvider.close?.() + ]); + + // Handle any cleanup errors + results.forEach((result) => { + if (result.status === 'rejected') { + this.reportError(result.reason, 'error'); + } + }); + + // Final cleanup + this.#currentStream = undefined; + this.progress.data = {}; + } catch (error) { + this.panic(error); + } +} +``` + +## Progress Tracking + +The transfer engine maintains progress information for each stage: + +```mermaid +flowchart LR + Start[stage::start] --> + Progress[stage::progress] --> + Finish[stage::finish] + + Progress -.-> Error[stage::error] + Start -.-> Skip[stage::skip] + + style Start fill:#c8ffc8 + style Progress fill:#f0f0ff + style Finish fill:#c8ffc8 + style Error fill:#ffebee + style Skip fill:#e3f2fd +``` + +Progress events are emitted throughout the transfer: + +- `stage::start`: When a stage begins +- `stage::progress`: During data transfer +- `stage::finish`: When a stage completes +- `stage::error`: If an error occurs +- `stage::skip`: If a stage is skipped + +```typescript +interface TransferProgress { + [stage: TransferStage]: { + count: number; // Number of items processed + bytes: number; // Amount of data transferred + startTime: number; // When stage started + endTime?: number; // When stage completed + aggregates?: { + // Optional grouped metrics + [key: string]: { + count: number; + bytes: number; + }; + }; + }; +} +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/00-overview.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/00-overview.md new file mode 100644 index 0000000..ab2d65c --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/00-overview.md @@ -0,0 +1,35 @@ +--- +title: Introduction +tags: + - providers + - data-transfer + - experimental +--- + +# Data Transfer Providers + +Data transfer providers are the interfaces for streaming data during a transfer. + +[Source providers](./01-source-providers.md) provide read streams for each stage in the transfer. + +[Destination providers](./02-destination-providers.md) provide write streams for each stage in the transfer. + +Strapi provides both source and destination providers for the following: + +- [Strapi file](./03-strapi-file/00-overview.md): a standardized file format designed for the transfer process +- [Local Strapi](./04-local-strapi/00-overview.md): a connection to a local Strapi project which uses its configured database connection to manage data +- [Remote Strapi](./05-remote-strapi/00-overview.md): a wrapper of local Strapi provider that adds a websocket interface to a running remote (network) instance of Strapi + +Each provider must provide the same interface for transferring data, but will usually include its own unique set of options to be passed in when initializing the provider. + +## Creating your own providers + +To create your own providers, you must implement the interface(s) defined in `ISourceProvider` and `IDestinationProvider` found in `packages/core/data-transfer/types/providers.d.ts`. + +It is not necessary to create both a source and destination provider, only the part necessary for your use. + +For examples, see the existing providers such as the local Strapi provider. + +## Asset Transfers + +Currently, all of the data-transfer providers only handle local media assets (the `/upload` folder). Provider media is currently in development. Therefore, everything related to asset transfers -- including Strapi file structure, restore strategy, and rollback for assets -- is currently treated as `unstable` and likely to change in the near future. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/01-source-providers.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/01-source-providers.md new file mode 100644 index 0000000..ca36222 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/01-source-providers.md @@ -0,0 +1,17 @@ +--- +title: Source Providers +tags: + - providers + - data-transfer + - experimental +--- + +# Source Providers + +## Source provider structure + +A source provider must implement the interface ISourceProvider found in `packages/core/data-transfer/types/providers.d.ts`. + +In short, it provides a set of `create{_stage_}ReadStream()` methods for each stage that provide a Readable stream, which will retrieve its data (ideally from its own stream) and then perform a `stream.write(entity)` for each entity, link (relation), asset (file), configuration entity, or content type schema depending on the stage. + +When each stage's stream has finished sending all the data, the stream must be closed before the transfer engine will continue to the next stage. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/02-destination-providers.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/02-destination-providers.md new file mode 100644 index 0000000..c422953 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/02-destination-providers.md @@ -0,0 +1,15 @@ +--- +title: Destination Providers +tags: + - providers + - data-transfer + - experimental +--- + +# Destination Providers + +## Destination provider structure + +A destination provider must implement the interface IDestinationProvider found in `packages/core/data-transfer/types/providers.d.ts`. + +In short, it provides a set of `create{_stage_}WriteStream()` methods for each stage that provide a Writable stream, which will be passed each entity, link (relation), asset (file), configuration entity, or content type schema (depending on the stage) piped from the Readable source provider stream. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/03-strapi-file/00-overview.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/03-strapi-file/00-overview.md new file mode 100644 index 0000000..28e939d --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/03-strapi-file/00-overview.md @@ -0,0 +1,15 @@ +--- +title: Overview +tags: + - experimental + - providers + - import + - export + - data-transfer +--- + +# Strapi Data File Providers + +Strapi data file providers transfer data to or from a [Strapi Data File](./01-file-structure.md). + +The files are optionally compressed and/or encrypted using a given key (password). diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/03-strapi-file/01-file-structure.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/03-strapi-file/01-file-structure.md new file mode 100644 index 0000000..5b1df3f --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/03-strapi-file/01-file-structure.md @@ -0,0 +1,57 @@ +--- +title: Strapi File Structure +tags: + - providers + - data-transfer + - experimental +--- + +# Strapi File Structure + +The Strapi file providers expect a .tar file (optionally compressed with gzip and/or encrypted with 'aes-128-ecb') that internally uses POSIX style file paths with the following structure: + +``` +./ +configuration +entities +links +metadata.json +schemas + +./configuration: +configuration_00001.jsonl + +./entities: +entities_00001.jsonl + +./links: +links_00001.jsonl + +./schemas: +schemas_00001.jsonl +``` + +## metadata.json + +This file provides metadata about the original source of the data. At minimum, it should include a createdAt timestamp and the version of Strapi that the file was created with (for compatibility checks). + +```json +{ + "createdAt": "2023-06-26T07:31:20.062Z", + "strapi": { + "version": "4.11.2" + } +} +``` + +## A directory for each stage of data + +There should also be a directory for each stage of data that includes sequentially numbered JSON Lines (.jsonl) files + +The files are named in the format: `{stage}\{stage}_{5-digit sequence number}.jsonl` + +Any number of files may be provided for each stage, as long as the sequence numbers are in order. That is, after first reading 00001, the file source provider will attempt to read file 00002 and if it is not found, it will consider the stage complete. + +### JSONL files + +[JSON Lines](https://jsonlines.org/) files are essentially JSON files, except that newline characters are used to delimit the JSON objects. This allows the provider to read in a single line at a time, rather than loading the entire file into memory, minimizing RAM usage during a transfer and allowing files containing any amount of data. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/03-strapi-file/02-source.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/03-strapi-file/02-source.md new file mode 100644 index 0000000..ca416fb --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/03-strapi-file/02-source.md @@ -0,0 +1,35 @@ +--- +title: Source +tags: + - providers + - data-transfer + - experimental +--- + +# Strapi File Source Provider + +This provider will open and read a Strapi Data File as a data source. + +## Provider Options + +The accepted options are defined in `ILocalFileSourceProviderOptions`. + +```typescript + file: { + path: string; // the file to load + }; + + encryption: { + enabled: boolean; // if the file is encrypted (and should be decrypted) + key?: string; // the key to decrypt the file + }; + + compression: { + enabled: boolean; // if the file is compressed (and should be decompressed) + }; +``` + +Note: When the Strapi CLI attempts to import a file, the options for compression and encryption are set based on the extension of the file being loaded, eg a file with the .gz extension will have the "compress" option set, and a file that includes the .enc extension will have the "encrypt" option set. + +When using the transfer engine programmatically, you may make the determination whether the file being loaded should be decrypted or compressed by setting +those options. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/03-strapi-file/03-destination.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/03-strapi-file/03-destination.md new file mode 100644 index 0000000..5092e0f --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/03-strapi-file/03-destination.md @@ -0,0 +1,34 @@ +--- +title: Destination +tags: + - providers + - data-transfer + - experimental +--- + +# Strapi File Destination Provider + +This provider will output a Strapi Data File. + +Note: this destination provider does not provide a schema or metadata, and will therefore never report a schema match error or version validation error + +## Provider Options + +The accepted options are defined in `ILocalFileDestinationProviderOptions`. + +```typescript + encryption: { + enabled: boolean; // if the file should be encrypted + key?: string; // the key to use when encryption.enabled is true + }; + + compression: { + enabled: boolean; // if the file should be compressed with gzip + }; + + file: { + path: string; // the filename to create + maxSize?: number; // the max size of a single backup file + maxSizeJsonl?: number; // the max lines of each jsonl file before creating the next file + }; +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/03-strapi-file/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/03-strapi-file/_category_.json new file mode 100644 index 0000000..6663af8 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/03-strapi-file/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "File Providers", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/04-local-strapi/00-overview.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/04-local-strapi/00-overview.md new file mode 100644 index 0000000..86872c1 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/04-local-strapi/00-overview.md @@ -0,0 +1,17 @@ +--- +title: Overview +tags: + - experimental + - providers + - import + - export + - data-transfer +--- + +# Local Strapi Providers + +The local Strapi provider allows using the local Strapi instance (the same project that the data transfer engine is being run from) as a data source. + +Creating a local Strapi data provider requires passing in an initialized `strapi` server object to interact with that server's Entity Service and Query Engine to manage the data. Therefore if the local Strapi project cannot be started (due to errors), the providers cannot be used. + +**Important**: When a transfer completes, the `strapi` object passed in is shut down automatically based on the `autoDestroy` option. If you are running a transfer via an external script, it is recommended to use `autoDestroy: true` to ensure it is shut down properly, but if you are running a transfer within a currently running Strapi instance you should set `autoDestroy: false` or your Strapi instance will be shut down at the end of the transfer. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/04-local-strapi/01-source.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/04-local-strapi/01-source.md new file mode 100644 index 0000000..7148f1f --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/04-local-strapi/01-source.md @@ -0,0 +1,21 @@ +--- +title: Source +tags: + - providers + - data-transfer + - experimental +--- + +# Local Strapi Source Provider + +This provider will retrieve data from an initialized `strapi` instance using its Entity Service and Query Engine. + +## Provider Options + +The accepted options are defined in `ILocalFileSourceProviderOptions`. + +```typescript + getStrapi(): Strapi.Strapi | Promise; // return an initialized instance of Strapi + + autoDestroy?: boolean; // shut down the instance returned by getStrapi() at the end of the transfer +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/04-local-strapi/02-destination.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/04-local-strapi/02-destination.md new file mode 100644 index 0000000..f8ba4b4 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/04-local-strapi/02-destination.md @@ -0,0 +1,56 @@ +--- +title: Destination +tags: + - providers + - data-transfer + - experimental +--- + +# Local Strapi Destination Provider + +This provider will insert data into an initialized `strapi` instance using its Entity Service and Query Engine. + +## Provider Options + +The accepted options are defined in `ILocalFileSourceProviderOptions`. + +```typescript + getStrapi(): Strapi.Strapi | Promise; // return an initialized instance of Strapi + autoDestroy?: boolean; // shut down the instance returned by getStrapi() at the end of the transfer + restore?: restore.IRestoreOptions; // the options to use when strategy is 'restore' + strategy: 'restore'; // conflict management strategy; only the restore strategy is available at this time +``` + +`strategy` defines the conflict management strategy used. Currently, only `"restore"` is available as an option. + +### Restore + +A conflict management strategy of "restore" deletes all existing Strapi data before a transfer to avoid any conflicts. + +The following restore options are available: + +```typecript +export interface IRestoreOptions { + assets?: boolean; // delete media library files before transfer + configuration?: { + webhook?: boolean; // delete webhooks before transfer + coreStore?: boolean; // delete core store before transfer + }; + entities?: { + include?: string[]; // only delete these stage entities before transfer + exclude?: string[]; // exclude these stage entities from deletion + filters?: ((contentType: ContentTypeSchema) => boolean)[]; // custom filters to exclude a content type from deletion + params?: { [uid: string]: unknown }; // params object passed to deleteMany before transfer for custom deletions + }; +} +``` + +### Rollbacks + +This local Strapi destination provider automatically provides a rollback mechanism on error. + +For Strapi data, that is done with a database transaction wrapped around the restore and the insertion of data and committing on succes and rolling back on failure. + +For Strapi assets (ie, the media library files) this is done by attempting to temporarily move the existing assets to a backup directory to `uploads_backup_{timestamp}`, and then deleting it on success, or deleting the failed import files and putting the backup back into place on failure. In some cases of failure, it may be impossible to move the backup files back into place, so you will need to manually restore the backup assets files. + +Note: Because of the need for write access, environments without filesystem permissions to move the assets folder (common for virtual environments where /uploads is mounted as a read-only drive) will be unable to include assets in a transfer and the asset stage must be excluded in order to run the transfer. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/04-local-strapi/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/04-local-strapi/_category_.json new file mode 100644 index 0000000..ed459a6 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/04-local-strapi/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Local Strapi Providers", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/05-remote-strapi/00-overview.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/05-remote-strapi/00-overview.md new file mode 100644 index 0000000..f83dd74 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/05-remote-strapi/00-overview.md @@ -0,0 +1,33 @@ +--- +title: Overview +tags: + - experimental + - providers + - import + - export + - data-transfer +--- + +# Remote Strapi Providers + +Remote Strapi providers connect to an instance of Strapi over a network using a websocket. + +Internally, the remote Strapi providers map websocket requests to a local Strapi provider of the instance it is running in. + +In order to use remote transfer providers, the remote Strapi server must have a value for `transfer.token.salt` configured in `config/admin.js` and the remote transfer feature must not be disabled. + +## Disabling Remote Transfers + +The remote transfer feature of a server can be completely disabled by setting the server config value: + +```javascript +// in config/server.js +{ + transfer: { + remote: { + enabled: false; + } + } + // ...the rest of your server config +} +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/05-remote-strapi/01-websocket.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/05-remote-strapi/01-websocket.md new file mode 100644 index 0000000..bae626b --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/05-remote-strapi/01-websocket.md @@ -0,0 +1,233 @@ +--- +title: Websocket +tags: + - providers + - data-transfer + - experimental +--- + +# WebSocket + +## Websocket Messages / Dispatcher + +The remote websocket server only accepts specific websocket messages which we call transfer commands. These commands must also be sent in a specific order, and an error messages will be returned if an unexpected message is received by the server. + +A message dispatcher object should be created to send messages to the server. See `packages/core/data-transfer/src/strapi/providers/utils.ts` for more inofrmation on the dispatcher. + +The dispatcher includes + +### dispatchCommand + +Accepts "commands" used for opening and closing a transfer. + +Allows the following `command` values: + +- `init`: for initializing a connection. Returns a transferID that must be sent with all future messages in this transfer +- `end`: for ending a connection + +### dispatchTransferStep + +Used for switching between stages of a transfer and streaming the actual data of a transfer. + +Accepts the following `action` values: + +- `start`: sent with a `step` value for the name of the step/stage + - any number of `stream`: sent with a `step` value and the `data` being sent (ie, an array of entities) +- `end`: sent with a `step` value for the step being ended + +### dispatchTransferAction + +Used for triggering 'actions' on the server equivalent to the local providers. + +- `bootstrap` +- `getMetadata` +- `beforeTransfer` +- `getSchemas` +- `rollback` (destination only) +- `close`: for completing a transfer (but doesn't close the connection) + +See `packages/core/data-transfer/dist/strapi/remote/handlers/pull.d.ts` and `packages/core/data-transfer/dist/strapi/remote/handlers/push.d.ts` for complete and precise definitions of the messages that must be sent. + +## Transfer Lifecycle + +```mermaid +sequenceDiagram + participant Client + participant Dispatcher + participant WebSocket + participant Server + + Note over Client,Server: Connection Phase + Client->>WebSocket: Create WebSocket Connection + Note right of WebSocket: /admin/transfer/runner/pull or push + Note right of WebSocket: Authorization: Bearer + + Client->>Dispatcher: Create Message Dispatcher + + Note over Client,Server: Initialization Phase + Dispatcher->>Server: dispatchCommand("init") + Server->>Dispatcher: Returns transferID + Note right of Dispatcher: All future messages include transferID + + Note over Client,Server: Transfer Actions Phase + Dispatcher->>Server: dispatchTransferAction("bootstrap") + Server->>Dispatcher: Response + + Dispatcher->>Server: dispatchTransferAction("getMetadata") + Server->>Dispatcher: Response + + Dispatcher->>Server: dispatchTransferAction("beforeTransfer") + Server->>Dispatcher: Response + + Dispatcher->>Server: dispatchTransferAction("getSchemas") + Server->>Dispatcher: Response + + Note over Client,Server: Transfer Steps Phase + loop Each Step (schemas, entities, assets, links, config) + Dispatcher->>Server: dispatchTransferStep(step, "start") + Server->>Dispatcher: Response + + loop Data Streaming + Dispatcher->>Server: dispatchTransferStep(step, "stream", data) + alt Success + Server->>Dispatcher: Response + else Timeout + Note over Dispatcher: Wait retryMessageTimeout + Dispatcher->>Server: Retry Message + end + end + + Dispatcher->>Server: dispatchTransferStep(step, "end") + Server->>Dispatcher: Response + end + + Note over Client,Server: Closing Phase + Dispatcher->>Server: dispatchTransferAction("close") + Server->>Dispatcher: Response + + Dispatcher->>Server: dispatchCommand("end") + Server->>Dispatcher: Response + + Client->>WebSocket: Close Connection +``` + +### 1. Connection Phase + +When the data transfer feature is enabled for a Strapi server (an `admin.transfer.token.salt` config value has been set and `server.transfer.remote.enabled` is not set to false), Strapi will create websocket servers available on the routes `/admin/transfer/runner/pull` and `/admin/transfer/runner/push`. + +**Create WebSocket Connection** + +- Opening a websocket connection on those routes requires a valid transfer token as a bearer token in the Authorization header.: + ``` + Authorization: Bearer + ``` +- Server validates the token and establishes the connection + +Please see the `bootstrap()` method of the remote providers for an example of how to make the initial connection to the Strapi websocket. + +**Event Listener Attachment** +Immediately after WebSocket creation, the following listeners are attached: + +- `'open'`: Handles successful connection establishment +- `'close'`: Manages connection termination +- `'error'`: Handles connection and transmission errors +- `'message'`: Processes incoming messages from server + +### 2. Initialization Phase + +Client sends initial command to establish transfer, server responds with unique transferID. + +```javascript +const transferID = await dispatcher.dispatchCommand('init'); +// All subsequent messages must include this transferID +``` + +All subsequent messages must include this transferID + +### 3. Transfer Actions Phase + +Sequential actions executed through `dispatchTransferAction`: + +1. `bootstrap`: Initializes transfer environment +2. `getMetadata`: Retrieves transfer metadata +3. `beforeTransfer`: Performs pre-transfer preparations +4. `getSchemas`: Retrieves content type schemas, used for validation between source and destination + +### 4. Transfer Steps Phase + +The main phase where actual data transfer occurs, processing different types of data (schemas, entities, assets, links, configuration) in sequence: + +**Stage Start** + +```javascript +dispatchTransferStep(action: "start", step) +``` + +**Data Streaming** + +```javascript +dispatchTransferStep(action:"stream", step, data) +``` + +**Stage Completion** + +```javascript +dispatchTransferStep(action:"end", step) +``` + +**Retry Mechanism** +During data transfer: + +- If server response not received within `retryMessageTimeout` +- System attempts retry up to `retryMessageMaxRetries` times +- Automatic retry on timeout +- Transfer aborts if max retries exceeded + +### 5.Closing Phase + +**Cleanup Actions** + +1. Send close action: + ```javascript + dispatchTransferAction('close'); + ``` +2. Send end command: + ```javascript + dispatchCommand({ command: 'end', params: { transferID } }); + ``` + +**Connection Termination** + +1. Remove event listeners in reverse order: + - Remove `message` listener + - Remove `error` listener + - Remove `open` listener + - Remove `close` listener +2. Close WebSocket connection + +## Message Timeouts and Retries + +```mermaid +stateDiagram-v2 + [*] --> Init + Init --> Ready: Connection Established + Ready --> Dispatching: Send Message + Dispatching --> WaitingResponse: Message Sent + WaitingResponse --> Ready: Response Received + WaitingResponse --> Retrying: Timeout + Retrying --> WaitingResponse: Retry Attempt + Retrying --> Error: Max Retries Exceeded + Error --> [*] + + note right of WaitingResponse + Configurable timeout + via retryMessageTimeout + end note + + note right of Retrying + Limited by + retryMessageMaxRetries + end note +``` + +Because the transfer relies on a message->response protocol, if the websocket server is unable to send a reply, for example due to network instability, the connection would halt. For this reason, each provider's options includes `retryMessageOptions` which attempt to resend a message after a given timeout is reached and a max retry option to abort the transfer after a given number of failed retry attempts. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/05-remote-strapi/02-source.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/05-remote-strapi/02-source.md new file mode 100644 index 0000000..390e1cc --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/05-remote-strapi/02-source.md @@ -0,0 +1,34 @@ +--- +title: Source +tags: + - providers + - data-transfer + - experimental +--- + +# Strapi Remote Source Provider + +The Strapi remote source provider connects to a remote Strapi websocket server and sends messages to move between stages and pull data. + +## Provider Options + +The remote source provider accepts `url`, `auth`, and `retryMessageOptions` described below. + +```typescript +interface ITransferTokenAuth { + type: 'token'; + token: string; +} + +export interface IRemoteStrapiDestinationProviderOptions + extends Pick { + url: URL; + auth?: ITransferTokenAuth; + retryMessageOptions?: { + retryMessageTimeout: number; // milliseconds to wait for a response from a message + retryMessageMaxRetries: number; // max number of retries for a message before aborting transfer + }; +} +``` + +Note: `url` must include the protocol `https` or `http` which will then be converted to `wss` or `ws` to make the connection. A secure connection is strongly recommended, especially given the high access level that the transfer token provides. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/05-remote-strapi/03-destination.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/05-remote-strapi/03-destination.md new file mode 100644 index 0000000..140ea95 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/05-remote-strapi/03-destination.md @@ -0,0 +1,34 @@ +--- +title: Destination +tags: + - providers + - data-transfer + - experimental +--- + +# Strapi Remote Destination Provider + +The Strapi remote destination provider connects to a remote Strapi websocket server and sends messages to move between stages and push data. + +## Provider Options + +The remote destination provider accepts the same `restore` and `strategy` options from local Strapi destination provider, plus `url`, `auth`, and `retryMessageOptions` described below. + +```typescript +interface ITransferTokenAuth { + type: 'token'; // the name of the auth strategy + token: string; // the transfer token +} + +export interface IRemoteStrapiDestinationProviderOptions + extends Pick { + url: URL; // the url of the remote Strapi admin + auth?: ITransferTokenAuth; + retryMessageOptions?: { + retryMessageTimeout: number; // milliseconds to wait for a response from a message + retryMessageMaxRetries: number; // max number of retries for a message before aborting transfer + }; +} +``` + +Note: `url` must include the protocol `https` or `http` which will then be converted to `wss` or `ws` to make the connection. A secure connection is strongly recommended, especially given the high access level that the transfer token provides. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/05-remote-strapi/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/05-remote-strapi/_category_.json new file mode 100644 index 0000000..248a1e6 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/05-remote-strapi/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Remote Strapi Providers", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/_category_.json new file mode 100644 index 0000000..906e287 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/02-providers/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Providers", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/_category_.json new file mode 100644 index 0000000..1425744 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/data-transfer/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Data Transfer", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/database/00-intro.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/database/00-intro.md new file mode 100644 index 0000000..c97f4fa --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/database/00-intro.md @@ -0,0 +1,17 @@ +--- +title: Introduction +slug: /database +tags: + - database +--- + +# Database + +This section is an overview of all the features related to the Database package: + +```mdx-code-block +import DocCardList from '@theme/DocCardList'; +import { useCurrentSidebarCategory } from '@docusaurus/theme-common'; + + +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/database/01-relations/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/database/01-relations/_category_.json new file mode 100644 index 0000000..b46947c --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/database/01-relations/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Relations", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/database/01-relations/reordering.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/database/01-relations/reordering.md new file mode 100644 index 0000000..0e6d93d --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/database/01-relations/reordering.md @@ -0,0 +1,118 @@ +--- +title: Reordering +description: Conceptual guide to relations reordering in the Database +tags: + - database + - relations + - reordering +--- + +Strapi allows you to reorder a relation list. + +An example of reordering in the CM + +This reordering feature is available in the Content Manager and the API. + +## Code location + +`packages/core/database/lib/entity-manager/relations-orderer.js` + +## How is the order stored in DB? + +- We store the order value of the relation in an `order` field. +- For bidirectional relations, we store the order value of the other side in an `inverse_order` field. + +We store order values for all type of relations, except for: + +- Polymorphic relations (too complicated to implement). +- One to one relations (as there is only one relation per pair) + +### Many to many (Addresses <-> Categories) + +many to many relation + +- `category_order` is the order value of the categories relations in an address entity. +- `address_order` is the order value of the addresses relations in a category entity. + +### One to one (Kitchensinks <-> Tags) + +one to one relation + +- there is no `order` fields as there is only one relation per pair. + +### One way relation (Restaurants <-> Categories) + +Where a restaurant has many categories: + +many way relation + +- `category_order` is the order value of the categories relations in a restaurant entity. +- There is no `restaurant_order` as it is a one way relation. + +## How to reorder relations in the DB layer + +See more on [Strapi Docs](https://docs.strapi.io/dev-docs/api/rest/relations#connect) + +The database layer should receive a payload shown below: + +```js + category: { + connect: [ + { id: 6, position: { after: 1} }, // It should be after relation id=1 + { id: 8, position: { end: true }}, // It should be at the end + ], + disconnect: [ + { id: 4 } + ] + } +``` + +## How does relations reordering work? + +We use fractional indexing. This means that we use decimal numbers to order the relations. See the following diagrams below for a more detailed understanding. + +### Simple example + +An example of reordering in the CM + +### Complex example + +An example of reordering in the CM + +### Algorithm steps + +From the `connect` array: + +- For every element, **load relations by id**, **from fields `after` or `before`**. +- Start computing based on the `after` and `before` relations: + - **Initialize** with after/before relations (**step 1**). Let's call these ones **init relations.** + - **Apply the updates** from the `connect` array, **sequentially**. + - If the update is of type `before`: + - Place the element with the given `id` **before** the specified element in the list. + - If the specified element is an `init relation`, place the element in between that relation and the one before it. + - To determine the order value, **order = beforeRelation.order - 0.5**. This ensures the element is placed before the `before` relation and after the one before it. + - Else **order = beforeRelation.order** + - If the update is of type `after`: + - Place the element with the given `id` **after** the specified element in the list. + - If the specified element is an `init relation`, place the element in between that relation and the one after it. + - To determine the order value, **order = beforeRelation.order + 0.5**. This ensures the element is placed before the `after` relation and before the one after it. + - Else **order = beforeRelation.order** + - If the update is of type `end`: + - Place at the **end** + - If placing after an init relation: **order = lastRelation.order + 0.5** + - Else **order = lastRelation.order** + - If the update is of type `start`: + -Place at the **start** + - **order = 0.5** + - `before/after`: If the **id does not exist in the current array**, **throw an error** + - If an **id** was **already in this array, remove the previous one** +- **Grouping by the order value**, and ignoring init relations + - Recalculate order values for each group, so there are no repeated numbers & they keep the same order. + - Example : `[ {id: 5 , order: 1.5}, {id: 3, order: 1.5 } ]` → `[ {id: 5 , order: 1.33}, {id: 3, order: 1.66 } ]` + - **Insert values in the database** + - **Update database order based on their order position.** (using ROW_NUMBER() clause) + +From the disconnect array: + +- Delete the relations from the database. +- Reorder the remaining elements in the database based on their position, using ROW_NUMBER() clause. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/database/02-transactions.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/database/02-transactions.md new file mode 100644 index 0000000..65dc6df --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/database/02-transactions.md @@ -0,0 +1,109 @@ +--- +title: Transactions +description: Conceptual guide to transactions in Strapi +tags: + - database + - experimental +--- + +:::caution +This is an experimental feature and is subject to change in future versions. +::: + +An API to wrap a set of operations in a transaction that ensures the integrity of data. + +## What are transactions + +Transactions are a set of operations that are executed together as a single unit. If any of the operations fail, the entire transaction fails and the data is rolled back to its previous state. If all operations succeed, the transaction is committed and the data is permanently saved to the database. + +## Usage + +Transactions are handled by passing a handler function into `strapi.db.transaction`: + +```js +await strapi.db.transaction(async ({ trx, rollback, commit, onCommit, onRollback }) => { + // It will implicitly use the transaction + await strapi.db.create(); + await strapi.db.create(); +}); +``` + +After the transaction handler is executed, the transaction is committed if all operations succeed. If any of the operations throws, the transaction is rolled back and the data is restored to its previous state. + +:::note +Every `strapi.db.query` operation performed in a transaction block will implicitly use the transaction. +::: + +### Transaction handler properties + +The handler function receives an object with the following properties: + +| Property | Description | +| ------------ | ------------------------------------------------------------------------------------------- | +| `trx` | The transaction object. It can be used to perform knex queries within the transaction. | +| `commit` | Function to commit the transaction. | +| `rollback` | Function to rollback the transaction. | +| `onCommit` | Function to register a callback that will be executed after the transaction is committed. | +| `onRollback` | Function to register a callback that will be executed after the transaction is rolled back. | + +### Nested transactions + +Transactions can be nested. When a transaction is nested, the inner transaction is committed or rolled back when the outer transaction is committed or rolled back. + +```js +await strapi.db.transaction(async () => { + // It will implicitly use the transaction + await strapi.db.create(); + + // Nested transactions will implicitly use the outer transaction + await strapi.db.transaction(async ({}) => { + await strapi.db.create(); + }); +}); +``` + +### onCommit and onRollback + +The `onCommit` and `onRollback` hooks can be used to execute code after the transaction is committed or rolled back. + +```js +await strapi.db.transaction(async ({ onCommit, onRollback }) => { + // It will implicitly use the transaction + await strapi.db.create(); + await strapi.db.create(); + + onCommit(() => { + // This will be executed after the transaction is committed + }); + + onRollback(() => { + // This will be executed after the transaction is rolled back + }); +}); +``` + +### Using knex queries + +Transactions can also be used with knex queries, but in those cases `.transacting(trx)` must be explicitly called. + +```js +await strapi.db.transaction(async ({ trx, rollback, commit }) => { + await knex('users').where('id', 1).update({ name: 'foo' }).transacting(trx); +}); +``` + +## When to use transactions + +Transactions should be used in cases where multiple operations should be executed together and their execution is dependent on each other. For example, when creating a new user, the user should be created in the database and a welcome email should be sent to the user. If the email fails to send, the user should not be created in the database. + +## When not to use transactions + +Transactions should not be used for operations that are not dependent on each other since it can result in performance penalties. + +## Potential problems of transactions + +Performing multiple operations within a transaction can lead to locking, which can block the execution of transactions from other processes until the original transaction is complete. + +Furthermore, transactions can stall if they are not committed or rolled back appropriately. + +For example, if a transaction is opened but there is a path in your code that does not close it, the transaction will be left open indefinitely and could cause instability until your server is restarted and the connection is forced to close. These issues can be difficult to debug, so use transactions with care in the cases they are necessary. diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/database/03-migrations.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/database/03-migrations.md new file mode 100644 index 0000000..d89fbd7 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/database/03-migrations.md @@ -0,0 +1,30 @@ +--- +title: Migrations +description: Conceptual guide to migrations in Strapi +tags: + - database + - migration +--- + +Strapi manages schema and data migrations in multiple ways. As much as possible we try to automatically sync the DB schema with the application configuration. However this in not sufficient to manage data migrations or schema migrations that are not reconcilable. + +![Migration flowchart](/img/database/migration-flow.png) + +## Internal migrations + +### Creating a migration + +- Add a migration file in `packages/core/database/src/migrations/internal-migrations` +- Import it in the `index.ts` file of the same folder and add it to the exported array as the last element. + +### Migration file format + +Every migration should follow this API + +```ts +export default { + name: 'name-of-migration', + async up(knex: Knex, db: Database): void {}, + async down(knex: Knex, db: Database): void {}, +}; +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/database/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/database/_category_.json new file mode 100644 index 0000000..0b1c7a8 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/database/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Database", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/helper-plugin/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/helper-plugin/_category_.json new file mode 100644 index 0000000..0f1d4dd --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/helper-plugin/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Helper Plugin", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/helper-plugin/hooks/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/helper-plugin/hooks/_category_.json new file mode 100644 index 0000000..e1f16ed --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/helper-plugin/hooks/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Hooks", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/helper-plugin/hooks/use-persistent-state.mdx b/Dockers/strapi/strapi/docs/docs/docs/01-core/helper-plugin/hooks/use-persistent-state.mdx new file mode 100644 index 0000000..6a4acd0 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/helper-plugin/hooks/use-persistent-state.mdx @@ -0,0 +1,27 @@ +--- +title: usePersistentState +description: API reference for the usePersistentState hook in Strapi +tags: + - hooks + - helper-plugin +--- + +Provides a easily usable hook to store data on the local storage. + +## Usage + +```js +import { usePersistentState } from '@strapi/helper-plugin'; + +const MyComponent = () => { + const [navbarOpened, setNavbarOpened] = usePersistentState('navbar-open', true); + + return ; +}; +``` + +## Typescript + +```ts +function usePersistentState(key: string, defaultValue: T): [T, Dispatch>]; +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/openapi/00-intro.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/openapi/00-intro.md new file mode 100644 index 0000000..240d315 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/openapi/00-intro.md @@ -0,0 +1,61 @@ +--- +title: Introduction +slug: /openapi +tags: + - openapi +--- + +# OpenAPI + +This section provides an overview of the OpenAPI package for Strapi. + +--- + +```mdx-code-block +import DocCardList from '@theme/DocCardList'; +import { useCurrentSidebarCategory } from '@docusaurus/theme-common'; + + +``` + +## Introduction + +The Strapi OpenAPI package offers a comprehensive set of utilities for creating and manipulating OpenAPI specifications based on Strapi applications. + +It features a user-friendly API, a maintainable and extensible codebase, and thorough documentation. + +:::info +For more information about OpenAPI, please refer to [the official specification](https://swagger.io/specification/) +::: + +## Context + +From Strapi `v3-alpha` through `v5` (since its [initial release in December 2018](https://medium.com/strapi/introducing-the-api-documentation-swagger-plugin-29092af2c880)), the [official documentation plugin](https://www.npmjs.com/package/@strapi/plugin-documentation) has been the standard solution for integrating Strapi with OpenAPI. + +This plugin provided automatic documentation generation, extensive customization options, and a Swagger UI interface. + +However, after six years of evolving the CMS, the documentation plugin has become outdated and prone to bugs. Meanwhile, new requirements have emerged from both the community (SDK generation, Swagger support, etc.) and internal tooling needs (Strapi client, API playground, etc.). + +It's within this context that we've developed this new package, designed to offer specialized features while remaining flexible enough for broad application. + +## Scope + +**What it does ✅** + +This package provides APIs and tools to: + +- Programmatically generate OpenAPI documents **specifically** tailored for Strapi applications +- Validate generated documents for compliance and accuracy +- Customize the document generation process to suit your needs + +**What it's not intended to be ❌** + +- A direct replacement for the documentation plugin (including Swagger UI) +- A generic OpenAPI specification generator for non-Strapi applications +- A tool for generating OpenAPI documents as static files +- A command-line interface (CLI) + +### Limitations + +- Currently unable to represent cyclical references (awaiting zod v4), which are temporarily represented as simple "any" objects +- Limited customization capabilities in the current version; these will be expanded in future releases (our priority is making it ready for client use before iterating further) diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/openapi/01-technologies.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/openapi/01-technologies.md new file mode 100644 index 0000000..3b23121 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/openapi/01-technologies.md @@ -0,0 +1,72 @@ +--- +title: Technologies +slug: /openapi/technologies +tags: + - openapi + - technologies + - dependencies +--- + +# OpenAPI + +This section provides an overview of the technologies used in the OpenAPI package + +--- + +## Tools + +The OpenAPI package uses the same tools as the rest of the Strapi monorepo packages: + +| Tool | Purpose | +| -------- | --------------- | +| Jest | Unit testing | +| Rollup | Build | +| Prettier | Code formatting | +| ESLint | Code linting | + +## Dependencies + +The package focuses on using a limited set of external dependencies to keep a light footprint. + +--- + +### [Zod to OpenAPI](https://github.com/asteasolutions/zod-to-openapi) + +> A library that uses [zod schemas](https://github.com/colinhacks/zod) to generate OpenAPI Swagger documentation. + +This library is used to transform `zod` schema obtained from Strapi routes objects into valid OpenAPI Schema. + +:::info +It is particularly useful to avoid leaking the OpenAPI domain logic into the Strapi core logic. +::: + +:::warning +The main pain point of using this library is **not being able to infer, represent, and transform cyclic dependencies between models** (_relations, components, dynamic zones, media_) **in the final schema** without leaking the OpenAPI domain to the Strapi core. + +Luckily, `zod` v4 will [soon go stable](https://v4.zod.dev/v4#wrapping-up) and offer the possibility to transform `zod` schema into JSON object natively **and** with cycles’ support. + +It would represent a huge opportunity to migrate away from this dependency and use `zod` only. + +For more information, see + +- https://v4.zod.dev/ +- https://v4.zod.dev/json-schema +- https://v4.zod.dev/metadata + ::: + +### [Debug](https://github.com/debug-js/debug) + +> A tiny JavaScript debugging utility modelled after Node.js core's debugging technique. Works in Node.js and web browsers. + +Used to provide detailed information about what is happening during the document generation processes. + +The root namespace for the package is `strapi:core:openapi` and each component adds its own suffix. + +:::tip +A small wrapper that automatically binds the correct default namespace can be found in the package utils: `src/utils/debug.ts` +::: + +### Types + +- [`@strapi/types`](https://github.com/strapi/strapi/tree/develop/packages/core/types) provides types to represent core Strapi objects like routes or an application +- [`openapi-types`](https://github.com/kogosoftwarellc/open-api/tree/main/packages/openapi-types) provides types to represent a full OpenAPI document and its sub-objects diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/openapi/02-architecture.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/openapi/02-architecture.md new file mode 100644 index 0000000..ba99066 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/openapi/02-architecture.md @@ -0,0 +1,187 @@ +--- +title: Architecture +slug: /openapi/architecture +tags: + - openapi + - architecture + - components +--- + +# OpenAPI + +This section explores the overall architecture and main components of the OpenAPI package. + +--- + +## Overview + +The package is organized into two main domains: + +### The Route Collection + +This domain provides objects that extract different sets of routes from a Strapi application. + +You can find related files in `src/routes`. + +:::info +This domain could potentially be moved to the Strapi core or Strapi utils in the future since it doesn't have any direct dependencies on OpenAPI itself. +::: + +### The OpenAPI Document Generation + +This domain contains all the components necessary to generate a valid OpenAPI document from a Strapi application: + +| Component | Path | +| ----------------- | ------------------------------------------ | +| OpenAPI Generator | `src/generator` | +| Assemblers | `src/assemblers` | +| Contexts | `src/context` | +| Registries | `src/registries` | +| Processors | `src/pre-processor`, `src/post-processors` | + +--- + +Additionally, the package centralizes all exports for the public API in an `src/exports.ts` file. + +This approach decouples the package root exports from the public programmatic API it exposes. + +## Design Pattern + +The package follows Object-Oriented Design principles and patterns to ensure code that's both maintainable and extensible: + +- **SOLID Principles**: Adheres to single responsibility, open/closed, Liskov substitution, interface segregation, and + dependency inversion principles +- **Dependency Injection**: Components receive dependencies through their constructors rather than creating them + internally +- **Factory Pattern**: Used to instantiate complex objects with configurable behaviors +- **Registry Pattern**: Maintains global state and configuration in a controlled manner (see Registries and Context) + +The architecture emphasizes: + +- Atomic components with single responsibilities, particularly for the assembly process (see Assemblers) +- Clear separation of concerns (orchestrator, routes collection, assembler, lifecycle, etc.) +- Extensible design that enables adding new capabilities without modifying existing code (see Assembler, Processors) + +This results in a modular system where each component focuses on a specific task while maintaining clear boundaries with +other parts of the system. + +## Components + +### Route Collector + +Orchestrates the route collection process based on provided providers and matchers: + +- **Providers** + - Collect sets of routes for specific purposes (Admin, Core API, plugins, etc.) +- **Matchers** + - Filter route collections based on rules +- **Rules** + - Match (or exclude) a single route based on specific criteria + +```mermaid +erDiagram + RouteCollector ||--o{ Provider: orchestrates + RouteCollector ||--o{ Matcher: uses + Provider ||--|{ Route: collects + Matcher ||--|{ Rule: contains + Provider ||--o{ Matcher: routesFilteredBy + Rule }o--|| Route: evaluates + + Provider { + string type + string source + } + + Route { + object info + string path + string method + string handler + } + + Matcher { + array rules + function match + } + + Rule { + function match + } + + RouteCollector { + array providers + array matchers + function collect + } +``` + +### OpenAPI Generator + +Generates valid OpenAPI documents from a Strapi application: + +- **Processors** + + - Lifecycle objects and methods + - **Pre-processors**: Prepare data and registries before assembly + - **Post-processors**: Clean up and finalize the output after assembly + +- **Assemblers** + + - Generate specific parts of the final document + - Each has a single responsibility + - **Sub-Assemblers** + - Specialized assemblers for nested components (operations, etc.) + - Are provided with custom contexts + +- **Context** + - Holds information and instances for assembly processes + - Maintains reference to the final built object in `context.output.data` + - **Registries** + - Data structures for storing/retrieving configurations and common objects + +```mermaid +erDiagram + OpenAPIGenerator ||--|{ PreProcessor: "uses before assembly" + OpenAPIGenerator ||--|{ PostProcessor: "uses after assembly" + OpenAPIGenerator ||--|{ Assembler: orchestrates + OpenAPIGenerator ||--|| Context: maintains + Context ||--|{ Registry: manages + PreProcessor }o--|| Context: "prepares" + PostProcessor }o--|| Context: "finalizes" + Assembler }o--|| Context: updates + Assembler ||--o{ Assembler: "contains nested" + + OpenAPIGenerator { + function generate + array assemblers + array preProcessors + array postProcessors + } + + PreProcessor { + function preProcess + } + + PostProcessor { + function postProcess + } + + Assembler { + function assemble + Assembler[] children + } + + Context { + object output + Strapi strapi + array routes + array registries + } + + Registry { + array entries + function add + function get + function has + } +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/openapi/03-usage.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/openapi/03-usage.md new file mode 100644 index 0000000..5ba8c36 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/openapi/03-usage.md @@ -0,0 +1,39 @@ +--- +title: Usage +slug: /openapi/usage +tags: + - openapi + - usage + - api +toc_max_heading_level: 4 +--- + +# OpenAPI + +This section explores the Strapi OpenAPI toolset + +--- + +## `generate` + +Generate an OpenAPI JSON document based on the given Strapi application. + +By default, it collects content API routes registered in the application, transforms them into OpenAPI path objects, and fills in other OpenAPI components. + +### Signature + +```typescript +function generate(strapi: Core.Strapi, options?: GeneratorOptions): GeneratorOutput; +``` + +### Parameters + +- `strapi`, the Strapi application to generate an OpenAPI specification for +- `options`, optional configuration for the generation process + +### Return Value + +A generation output object, containing: + +- `document`, the generated OpenAPI specification, as JSON. +- `stats`, statistics about the generation process diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/openapi/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/openapi/_category_.json new file mode 100644 index 0000000..a2be3c4 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/openapi/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "OpenAPI", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/permissions/00-intro.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/permissions/00-intro.md new file mode 100644 index 0000000..39200c8 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/permissions/00-intro.md @@ -0,0 +1,134 @@ +--- +title: Introduction +slug: /permissions +tags: + - engine + - permissions + - actions +--- + +# @strapi/permissions + +## Introduction + +The `@strapi/permissions` package is a sophisticated permission management system designed to provide flexible, granular +control over access rights in Strapi systems. + +Built on top of CASL's ability system, it extends the basic permission model with advanced features like parametrized +actions, conditional evaluation, and a hook system for custom behaviors. + +It serves as the backbone for building advanced implementations in Strapi, enabling developers to design customized +permission systems tailored to specific Strapi business objectives and application demands like RBAC, users and permissions, or API tokens. + +## Core Architecture + +### Engine + +```mermaid +graph TB + B[/Action Provider/]:::provider --> A([Permission Engine]):::engine + C[/Condition Provider/]:::provider --> A + A --> D{{Hook System}}:::hookSystem + A --> E([Ability Generator]):::generator + D --> H([Lifecycle Hooks]):::lifecycle + E --> I([CASL Integration]):::integration + H --> N([Permission Validation]):::hook + H --> O([Permission Formatting]):::hook + H --> P([Permission Evaluation]):::hook +``` + +### Domain + +```mermaid +graph TB + N([Domain]):::namespace --> A([Permission]):::permission + A --> B([Action]):::action + A --> C([Subject]):::subject + A --> D([Conditions]):::conditions + A --> E([Properties]):::properties + A --> F([ActionParameters]):::actionParameters +``` + +## Key Features + +### Dynamic Evaluation + +Runtime permission checking at the time of the request, ensuring that permissions align with the most current context +and data. + +_Example Use Case_: API endpoint access control, where user roles and data states impact access decisions dynamically. + +### Parametrized Actions + +Actions that leverage context-specific parameters to enable fine-grained control, allowing flexibility in defining +permissions. + +_Example Use Case_: `publish?postId=123`, restricting operation to a specific post identified by its ID. + +### Conditional Logic + +Implementation of complex permission rules that consider different conditions, enabling nuanced access control tailored +to resource state or user data. + +_Example Use Case_: Validate resource ownership by checking if the requesting user is the owner of a specific resource. + +### Hook System + +A modular mechanism to inject custom behaviors during various stages of the permission validation process, offering +extensibility and adaptability. + +_Example Use Case_: Implement audit logging for permission evaluations or perform additional data validation before +granting access. + +## Integration Example + +```typescript +import { engine, domain } from '@strapi/permissions'; + +// 1. Define Providers +const providers = { + action: providerFactory(), + condition: providerFactory(), +}; + +// 2. Register Custom Conditions +providers.condition.register({ + name: 'isOwner', + handler: (ctx) => ctx.user.id === ctx.resource.ownerId, +}); + +// 3. Create Engine +const permissionEngine = engine.new({ providers }); + +// 4. Define Permissions +const permissions = [ + domain.permission.create({ + action: 'read', + subject: 'article', + conditions: ['isPublished'], + }), + domain.permission.create({ + action: 'update', + subject: 'article', + conditions: ['isOwner'], + properties: { + fields: ['title', 'content'], + }, + }), +]; + +// 5. Generate Ability +const ability = await permissionEngine.generateAbility(permissions); + +// 6. Evaluate Permission +const canReadArticle = ability.can('read', 'article'); +``` + +--- + +```mdx-code-block +import DocCardList from '@theme/DocCardList'; +import { useCurrentSidebarCategory } from '@docusaurus/theme-common'; + + +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/permissions/01-engine.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/permissions/01-engine.md new file mode 100644 index 0000000..c09051a --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/permissions/01-engine.md @@ -0,0 +1,192 @@ +--- +title: Permission Engine +description: Conceptual guide to the permission engine +tags: + - permissions + - engine + - hooks +--- + +# Permission Engine + +The permission engine is the entity responsible for generating new ability instances based on provided permissions, +actions, and conditions. + +This is the abstraction used by other Strapi systems to create their custom permissions' engine: + +- [RBAC](https://github.com/strapi/strapi/blob/develop/packages/core/admin/server/src/services/permission/engine.ts) +- [Transfer Tokens](https://github.com/strapi/strapi/blob/develop/packages/core/admin/server/src/services/transfer/permission.ts) +- [API Tokens](https://github.com/strapi/strapi/blob/develop/packages/core/core/src/services/content-api/permissions/engine.ts) + +## Usage + +```typescript +import * as permissions from '@strapi/permissions'; + +const engine = permissions.engine.new({ + providers: { + action: myActionProvider, + condition: myConditionProvider, + }, +}); + +const permission = { + action: 'read', + subject: 'article', + conditions: ['isPublished'], +}; + +const ability = engine.generate([permission]); + +console.log('Can read article?:', ability.can('read', 'article')); +``` + +## Ability Generation Diagram + +```mermaid +sequenceDiagram + participant User + participant Engine + participant Hooks + participant Providers + participant Ability Builder + User ->> Engine: Generate Ability + loop permissions + Engine ->> Hooks: before-format::validate.permission + Hooks -->> Engine: Validation Result + Engine ->> Hooks: format.permission + Hooks -->> Engine: Formatted Permission + Engine ->> Hooks: after-format::validate.permission + Hooks -->> Engine: Validation Result + Engine ->> Hooks: before-evaluate.permission + alt permission has conditions + Engine ->> Providers: Resolve conditions + Providers -->> Engine: Resolved conditions + loop conditions + alt forbidden + note over Engine: skip permission + end + end + end + Engine ->> Hooks: before-register.permission + Engine ->> Ability Builder: Register permission in Ability + end + Engine -->> User: Ability +``` + +## Hook System + +### Available Hooks + +| Hook Name | Phase | Purpose | +| ---------------------------------- | ---------------- | ------------------------------------------------------------ | +| before-format::validate.permission | Pre-formatting | Initial validation | +| format.permission | Formatting | Transform permission | +| after-format::validate.permission | Post-formatting | Validate formatted permission | +| before-evaluate.permission | Pre-evaluation | Transform the permission after formatting and validation | +| before-register.permission | Pre-registration | Final modifications after evaluation but before registration | + +### Hook Implementation Example + +```typescript +const engine = permissions.engine.new({ providers }); + +// Validation hook +engine.on('before-format::validate.permission', ({ permission }) => { + if (permission.action === 'delete' && !permission.conditions.includes('isAdmin')) { + return false; // Prevent non-admin delete + } + return true; +}); + +// Format hook +engine.on('format.permission', ({ permission }) => { + // Add timestamp to tracking actions + if (permission.action.startsWith('track')) { + return { + ...permission, + timestamp: Date.now(), + }; + } + return permission; +}); +``` + +## Engine Configuration Options + +```typescript +interface EngineConfiguration { + providers: { + action: ActionProvider; + condition: ConditionProvider; + }; + abilityBuilderFactory?: () => CustomAbilityBuilder; +} +``` + +### Action Provider + +A provider instance that contains all available actions that can be used in permissions when generating abilities. + +### Condition Provider + +A provider instance mapping the conditions' name to their definitions. + +Used to resolve conditions by name when evaluating and registering a permission during the ability creation process. + +### Ability Builder Factory + +A factory that is used to create an ability instance out of multiple permissions. + +It must implement the `CustomAbilityBuilder` interface. + +## Advanced Usage Examples + +### Custom Ability Builder + +```typescript +const customAbilityBuilder = () => { + const { can, build } = new AbilityBuilder(Ability); + + return { + can(permission) { + // Custom permission logic + const { action, subject, properties = {}, condition } = permission; + return can(action, subject, properties.fields, condition); + }, + + build() { + return build({ + // Custom matcher implementation + conditionsMatcher: (rule, context) => { + // Custom condition matching logic + return true / false; + }, + }); + }, + }; +}; + +const engine = permissions.engine.new({ + providers, + abilityBuilderFactory: customAbilityBuilder, +}); +``` + +### Conditional Permission Chain + +```typescript +const permission = domain.permission.create({ + action: 'update', + subject: 'article', + conditions: ['isOwner'], +}); + +engine.on('before-evaluate.permission', ({ permission }) => { + // Add dynamic conditions based on context + if (permission.action === 'update') { + permission.conditions.push('isNotLocked'); + permission.conditions.push('isWithinBusinessHours'); + } +}); +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/permissions/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/permissions/_category_.json new file mode 100644 index 0000000..9f03443 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/permissions/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Permissions", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/strapi/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/strapi/_category_.json new file mode 100644 index 0000000..0adfa37 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/strapi/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Strapi", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/strapi/commands/00-overview.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/strapi/commands/00-overview.md new file mode 100644 index 0000000..57717c9 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/strapi/commands/00-overview.md @@ -0,0 +1,74 @@ +--- +title: Overview +tags: + - CLI + - commands +--- + +The CLI is largely contained to the `@strapi/strapi` package, however some packages are able to inject their own commands: + +- [`@strapi/data-transfer`](/docs/core/data-transfer/intro) + +## Structure of command + +The CLI is built with `commander` and as such every command we create can be described as: + +```ts +import { createCommand, Command } from 'commander'; + +type StrapiCommand = (params: { command: Command; argv: string[]; ctx: CLIContext }) => Command; + +// usage + +const myCommand: StrapiCommand = ({ argv, ctx }) => { + // do something + return createCommand('develop') + .alias('dev') + .option( + '--no-build', + '[deprecated]: there is middleware for the server, it is no longer a separate process' + ) + .action((options) => { + // do something with options & ctx + }); +}; +``` + +These actions are then combined together in the `@strapi/strapi` package to be used as a complete CLI, the context provided to each command +supplies a number of useful properties: + +```ts +interface CLIContext { + cwd: string; + logger: Logger; + tsconfig?: TsConfig; +} +``` + +### `logger` + +```ts +interface Logger { + warnings: number; + errors: number; + debug: (...args: unknown[]) => void; + info: (...args: unknown[]) => void; + warn: (...args: unknown[]) => void; + error: (...args: unknown[]) => void; + log: (...args: unknown[]) => void; + spinner: (text: string) => Pick; +} +``` + +The shared logger means that any command can accept `--debug` and `--silent` flags to control the output of the CLI. Due to incorperating `ora` into the logger, we can also provide a spinner for long running tasks but more importantly, easily silence them when `--silent` is passed. + +### `tsconfig` + +If `tsconfig` is not _defined_ we can conclude that the project is not a TS project. However, if it is we have access to where the tsconfig is located as well as the parsed config itself. + +```ts +interface TsConfig { + config: ts.ParsedCommandLine; + path: string; +} +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/strapi/commands/01-build.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/strapi/commands/01-build.md new file mode 100644 index 0000000..034f5e3 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/strapi/commands/01-build.md @@ -0,0 +1,192 @@ +--- +title: Build +tags: + - CLI + - commands + - admin + - build +--- + +The `build` command is used to build the strapi admin panel as a SPA ready to be served by the strapi server. + +## Usage + +```bash +strapi build +``` + +### Options + +```bash +Build the strapi admin app + +Options: + -d, --debug Enable debugging mode with verbose logs (default: false) + --minify Minify the output (default: true) + --no-optimization [deprecated]: use minify instead + --silent Don't log anything (default: false) + --sourcemap Produce sourcemaps (default: false) + --stats Print build statistics to the console (default: false) + -h, --help Display help for command +``` + +## How it works + +The build process for the admin panel is designed to be bundler agnostic, this means we can easily experiment and perhaps transition to new bundlers as they become available in the ecosystem. This is facilitated by the use of a [`BuildContext`](#buildcontext) that contains all the information needed to build the admin panel – if it's found more information is required this context can be tweaked to provide it. + +### Dependencies + +The first step of running the build command is to check if the required dependencies are installed at the root of the project. This provides better DX for: + +- miss-installed project +- monorepos +- incorrect/incompatible versions of packages for _certain_ packages like `styled-components` or `react`. + +The list of packages we explicity check for are: + +- `react` +- `react-dom` +- `styled-components` +- `react-router-dom` + +This is because there should only be one instance of these packages installed and used by the project at any one time, failure to do so can and most likely will, lead to bugs. This also means an incompatible version of these packages could cause unintended side effects e.g. if `react@19` was suddenly released but we had not tested it against the admin panel. + +We run a prompt to encourage the user to install these deps – however, this functionality has not yet been built. + +### BuildContext + +The build context is the heart of how the admin builds, as said above it's agnostic, it doesn't care if we're using webpack or vite or parcel. It's an object of data that can be used to preapre any bundler. It's shape looks like: + +```ts +interface BuildContext { + /** + * The absolute path to the app directory defined by the Strapi instance + */ + appDir: string; + /** + * If a user is deploying the project under a nested public path, we use + * this path so all asset paths will be rewritten accordingly + */ + basePath: string; + /** + * The customisations defined by the user in their app.js file + */ + customisations?: AppFile; + /** + * The current working directory + */ + cwd: string; + /** + * The absolute path to the dist directory + */ + distPath: string; + /** + * The relative path to the dist directory + */ + distDir: string; + /** + * The absolute path to the entry file + */ + entry: string; + /** + * The environment variables to be included in the JS bundle + */ + env: Record; + logger: CLIContext['logger']; + /** + * The build options + */ + options: Pick & Pick; + /** + * The plugins to be included in the JS bundle + * incl. internal plugins, third party plugins & local plugins + */ + plugins: Array<{ + path: string; + name: string; + importName: string; + }>; + /** + * The absolute path to the runtime directory + */ + runtimeDir: string; + /** + * The Strapi instance + */ + strapi: Strapi; + /** + * The browserslist target either loaded from the user's workspace or falling back to the default + */ + target: string[]; + tsconfig?: CLIContext['tsconfig']; +} +``` + +### Static Files + +The next step is to create a `runtime` folder in the root of the strapi project, a generic name `.strapi` is used and the build specifically uses a subfolder called `client`. This leaves more space for us to expand as and when we require it. We only generate two files for this – an `index.html` which is a static rendered React Component from the `@strapi/admin` package (DefaultDocument) & an `entry.js` file which calls the `renderAdmin` function & provides a mount point & plugin object. + +### Bundling + +We currently support both `webpack` & `vite` bundlers, with `vite` being the default. Because there is no global `strapi.config` file we don't have an already existing API to pass your own bundler. In the future we may decide to do this if there is a need. Each bundler supplies a build function & a develop function. We don't need a serve function because they're expected to produce the same `index.html` output defined by the static files step described above. + +## Node Usage + +```ts +import { build, BuildOptions } from '@strapi/admin/_internal'; + +const args: BuildOptions = { + // ... +}; + +await build(args); +``` + +### Options + +```ts +interface BuildOptions extends CLIContext { + /** + * The directory to build the command was ran from + */ + cwd: string; + /** + * The logger to use. + */ + logger: Logger; + /** + * Minify the output + * + * @default true + */ + minify?: boolean; + /** + * Generate sourcemaps – useful for debugging bugs in the admin panel UI. + */ + sourcemaps?: boolean; + /** + * Print stats for build + */ + stats?: boolean; + /** + * The tsconfig to use for the build. If undefined, this is not a TS project. + */ + tsconfig?: TsConfig; +} + +interface Logger { + warnings: number; + errors: number; + debug: (...args: unknown[]) => void; + info: (...args: unknown[]) => void; + warn: (...args: unknown[]) => void; + error: (...args: unknown[]) => void; + log: (...args: unknown[]) => void; + spinner: (text: string) => Pick; +} + +interface TsConfig { + config: ts.ParsedCommandLine; + path: string; +} +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/strapi/commands/02-develop.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/strapi/commands/02-develop.md new file mode 100644 index 0000000..e14ffcd --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/strapi/commands/02-develop.md @@ -0,0 +1,91 @@ +--- +title: Develop +tags: + - CLI + - commands + - admin + - development +--- + +The `develop` command is used to develop your strapi node application e.g. creating content-types in the `content-type-builder` as well as "watching" the admin panel with webpack for local development whether in the strapi monorepo or in a standalone project. + +## Usage + +```bash +strapi develop +``` + +### Options + +```bash +Start your Strapi application in development mode + +Options: + --polling Watch for file changes in network directories (default: false) + --watch-admin Watch the admin panel for hot changes + --open Open the admin in your browser (default: true) + -h, --help Display help for command +``` + +## How it works + +The develop command sets itself up much like the [build](build) command. Once we've injected our middlewares, we load the strapi instance and then generate the types based off the user's instance as well as potentially compiling any TS server code if we're in a TS project. The final step is to watch the project directory so we can restart the strapi instance in real-time as a user is developing their project & being the actual strapi instance. + +## Node Usage + +```ts +import { develop, DevelopOptions } from '@strapi/admin/_internal'; + +const args: DevelopOptions = { + // ... +}; + +await develop(args); +``` + +### Options + +```ts +interface DevelopOptions extends CLIContext { + /** + * The directory to build the command was ran from + */ + cwd: string; + /** + * The logger to use. + */ + logger: Logger; + /** + * Whether or not to open the browser after the build is complete. + */ + open?: boolean; + /** + * Watch for file changes in network directories + */ + polling?: boolean; + /** + * The tsconfig to use for the build. If undefined, this is not a TS project. + */ + tsconfig?: TsConfig; + /** + * Watch the admin for changes + */ + watchAdmin?: boolean; +} + +interface Logger { + warnings: number; + errors: number; + debug: (...args: unknown[]) => void; + info: (...args: unknown[]) => void; + warn: (...args: unknown[]) => void; + error: (...args: unknown[]) => void; + log: (...args: unknown[]) => void; + spinner: (text: string) => Pick; +} + +interface TsConfig { + config: ts.ParsedCommandLine; + path: string; +} +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/strapi/commands/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/strapi/commands/_category_.json new file mode 100644 index 0000000..54b5654 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/strapi/commands/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "CLI Commands", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/strapi/event-hub.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/strapi/event-hub.md new file mode 100644 index 0000000..65bc081 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/strapi/event-hub.md @@ -0,0 +1,152 @@ +--- +title: Event Hub +description: The event hub is a central system that processes a variety of events in a Strapi application +tags: + - core + - plugins +--- + +# Event Hub + +## Summary + +The event hub is a central system that processes a variety of events in a Strapi application. These events can be emitted from a variety of sources to trigger associated subscriber functions. + +A diagram showing how the event hub processes events with multiple sources with multiple subscribers + +_above: A diagram showing how the event hub processes events from different sources with multiple subscribers_ + +Events are mainly used in Strapi to power the webhooks and audit logs features. However, plugin developers can also access the event-hub using the plugin API. This means plugins can listen to events emitted by Strapi and emit new events to the event hub. + +## Detailed design + +The event hub is a store of subscriber functions. When an event is emitted to the hub, each subscriber function in the store will be called with the event's name and a variable number of arguments. + +This design was inspired by the way Strapi handles [lifecycle hooks](https://docs.strapi.io/developer-docs/latest/development/backend-customization/models.html#lifecycle-hooks). It was chosen over the [Node.js event emitter](https://nodejs.org/api/events.html#class-eventemitter) because it provides the ability to have a single subscriber function per feature, and does not cause [memory leak concerns](https://stackoverflow.com/questions/9768444/possible-eventemitter-memory-leak-detected). + +### Emitting events + +#### `emit` + +Dispatches a new event into the hub. It returns a promise that resolves when all the subscribers have run. + +```ts +// Types +type Emit = (name: string, ...args: any[]) => Promise; + +// Usage +strapi.eventHub.emit('some.event', { meta: 'data' }); +``` + +### Managing subscribers + +#### `subscribe` + +Adds a subscriber function that will be called for each event emitted to the hub. It returns a function that can be called to remove the subscriber. + +```ts +// Types +type Subscriber = (name: string, ...args: Object) => void | Promise; +type UnsubscribeCallback = () => void; +type Subscribe = (subscriber: Subscriber) => UnsubscribeCallback; + +// Add a subscriber +const unsubcribe = strapi.eventHub.subscribe((name: string, ...args: any[]) => { + // Write your subscriber logic here +}); + +// Remove the subscriber using the returned function +unsubscribe(); +``` + +#### `unsubscribe` + +Removes a subscriber function. You need to give it the reference of the subscriber as an argument. + +```ts +// Types +type Subscriber = (name: string, ...args: any[]) => void | Promise; +type Unsubscribe = (subscriber: Subscriber) => void; + +// After a subscriber has been added +const subscriber: Subscriber = (name, ...args) => {}; +strapi.eventHub.subscribe(subscriber); + +// Use its reference to remove it +strapi.eventHub.unsubcribe(subscriber); +``` + +### Listening to a single event + +If you only need to run a function for one specific event, then creating a subscriber function may be overkill. For this reason, the event hub provides the `on`,`off` and `once` methods, inspired by the [Node.js event emitter](https://nodejs.org/api/events.html#class-eventemitter). + +#### `on` + +Registers a listener function that is called every time a _specific_ event is emitted. It returns a function that can be called to remove the listener. + +```ts +// Types +type Listener = (args: any[]) => void | Promise; +type RemoveListenerCallback = () => void; +type On = (eventName: string, listener: Listener) => RemoveListenerCallback; + +// Add a listener +const removeListener = strapi.eventHub.on('some.event', () => { + // Write your listener logic here +}); + +// Remove the listener using the returned function +removeListener(); +``` + +#### `off` + +Removes a listener function. You need to give it the name of the event it's listening to, as well as the reference of the listener as an argument. + +```ts +// Types +type Listener = (args: any[]) => void | Promise; +type Off = (listener: Listener) => void; + +// After a listener has been added +const listener: Listener = (...args) => {}; +strapi.eventHub.on('some.event', listener); + +// Use its reference to remove it +strapi.eventHub.off('some.event', listener); +``` + +#### `once` + +Registers a listener function that will only be called the first time an event is emitted. Once the event has been emitted, the listener will be removed automatically. It also returns a function that can be used to remove the listener before it was called. + +```ts +// Types +type Listener = (args: any[]) => void | Promise; +type RemoveListenerCallback = () => void; +type Once = (eventName: string, listener: Listener) => RemoveListenerCallback; + +// Add a single-use listener +const removeListener = strapi.eventHub.once('some.event', () => { + // Write your listener logic here +}); + +// Remove the single-use listener using the returned function +removeListener(); +``` + +## Tradeoffs + +- Potential breaking changes: a change to an event's name or payload may affect other features or plugins listening to the same event. Backwards compatibility is a concern when managing these events. +- Performance: Strapi emits a lot of events, so you need to make sure your subscriber functions aren't too expensive to run. + +## Alternatives + +You may not need the event hub: + +- If you want to listen to database events on a specific content type, use [lifecycle hooks](https://docs.strapi.io/developer-docs/latest/development/backend-customization/models.html#lifecycle-hooks) +- If you want to listen to database events on all content types, use a [generic database lifecycle hook](https://docs.strapi.io/developer-docs/latest/development/backend-customization/models.html#declarative-and-programmatic-usage) +- If you want to emit an event, but don't want it to be exposed to other features or plugins, create a [service](https://docs.strapi.io/developer-docs/latest/development/backend-customization/services.html#services) and call it directly instead diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/upload/00-intro.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/upload/00-intro.md new file mode 100644 index 0000000..26d386f --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/upload/00-intro.md @@ -0,0 +1,17 @@ +--- +title: Introduction +slug: /upload +tags: + - upload +--- + +# Content Manager + +This section is an overview of all the features related to the Upload core plugin: + +```mdx-code-block +import DocCardList from '@theme/DocCardList'; +import { useCurrentSidebarCategory } from '@docusaurus/theme-common'; + + +``` diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/upload/01-backend/00-providers.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/upload/01-backend/00-providers.md new file mode 100644 index 0000000..6751dab --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/upload/01-backend/00-providers.md @@ -0,0 +1,28 @@ +--- +title: Providers +slug: /upload +tags: + - upload +--- + +# Provider + +Extends the upload plugin, to connect to different external services or applications, such as Amazon S3 buckets, Cloudinary, etc. + +**In the case of the Upload plugin, the provider should be able to upload files to a remote server and delete them.** + +# Using a provider + +To use a provider, you need to install it and configure it in the `./config/plugins.js` file. + +More info about installing providers on [strapi docs](https://docs.strapi.io/developer-docs/latest/development/providers.html#installing-providers). + +# Provider development + +To create a provider, you need to create a package that exports a function that returns an object with the following methods: + +- `isPrivate()` (optional) - Returns a boolean indicating if the provider is private or not. If it is, the `getSignedUrl` method will be used to get the URL of the file. (default: `false`) +- `getSignedUrl(file)`. (optional) - Returns a signed URL to access the file if it requires authentication +- `upload(file)` - Uploads a file to the provider +- `uploadStream(stream)` (optional) - Uploads a stream to the provider +- `delete(file)` - Deletes a file from the provider diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/upload/01-backend/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/upload/01-backend/_category_.json new file mode 100644 index 0000000..76c281f --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/upload/01-backend/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Backend", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/upload/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/upload/_category_.json new file mode 100644 index 0000000..99f59aa --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/upload/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Upload", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/utils/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/01-core/utils/_category_.json new file mode 100644 index 0000000..3bac2fd --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/utils/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Utils", + "collapsible": true, + "collapsed": true +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/utils/async.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/utils/async.md new file mode 100644 index 0000000..75a8c13 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/utils/async.md @@ -0,0 +1,98 @@ +--- +title: Async utils functions +tags: + - utils +--- + +# Async utils + +## Summary + +Async utils are grouping all function that interact with async stuff like Promises. + +## Detailed design + +### map + +The `map` function is an asynchronous version of the `Array.prototype.map` method. + +Example usage: + +```js +import { async } from '@strapi/utils'; + +const input = [1, 2, 3]; + +const output = await async.map(input, async (item) => { + return item * 2; +}); + +console.log(output); // [2, 4, 6] +``` + +### reduce + +The `reduce` function is an asynchronous version of the `Array.prototype.reduce` method. + +Example usage: + +```js +import { async } from '@strapi/utils'; +const input = [1, 2, 3]; + +const reducer = async.reduce(input); +const output = await reducer(async (accumulator, item) => { + return accumulator + item; +}, 0); + +console.log(output); // 6 +``` + +### pipe + +The `pipe` function is a utility function for composing asynchronous functions. It takes a list of functions as input, and returns a new function that applies each function in turn to the input. + +Example usage: + +```js +import { async } from '@strapi/utils'; + +async function addOne(input: number): Promise { + return input + 1; +} + +async function double(input: number): Promise { + return input * 2; +} + +const addOneAndDouble = async.pipe(addOne, double); + +const output = await addOneAndDouble(3); + +console.log(output); // 8 +``` + +### When to use + +Every time the code has to act with promises and iterate other them, an async utils function should be used. + +### Should I add my function here ? + +Any util function that manipulates promises can be included in this utils section. + +Please consider the next point if a lots of functions are available in the async section. + +## Potential improvements + +Some ideas of functions that could be added: + +- Other `Array.prototype` methods: `filterAsync`, `someAsync`, `everyAsync`, `findAsync`, `findIndexAsync`, `flatMapAsync`. +- `retryAsync`: A function that retries an asynchronous operation a specified number of times if it fails. It takes an asynchronous operation and a number of retries as input, and returns the result of the operation if it succeeds within the specified number of retries, or throws an error if it fails after all retries. +- `timeoutAsync`: A function that adds a timeout to an asynchronous operation. It takes an asynchronous operation and a timeout duration as input, and returns the result of the operation if it completes within the specified timeout, or throws an error if it takes longer than the timeout. + +If we begin to use lots of async utils function, we may consider to migrate to a specialized library like [asyncjs](http://caolan.github.io/async/v3/) + +## Resources + +- [Async file in Strapi](https://github.com/strapi/strapi/blob/9b36c3b10adaa00fd3596853abc63122632c36fe/packages/core/utils/lib/async.js) +- http://caolan.github.io/async/v3/ diff --git a/Dockers/strapi/strapi/docs/docs/docs/01-core/utils/traverse-entity.md b/Dockers/strapi/strapi/docs/docs/docs/01-core/utils/traverse-entity.md new file mode 100644 index 0000000..2b8223f --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/01-core/utils/traverse-entity.md @@ -0,0 +1,147 @@ +--- +title: traverseEntity +tags: + - utils +--- + +# Traverse Entity Utility + +The `traverseEntity` function is designed to recursively traverse a data entity based on its schema definition. It provides hooks to execute custom logic at each level of the traversal through the `Visitor` function. + +## Overview + +### Purpose + +The utility is used for structured data manipulation. It supports various types of attributes, such as relations, components, dynamic zones, and media, allowing seamless traversal and transformation of deeply nested entities. + +## Function: `traverseEntity` + +### Signature + +```typescript +async function traverseEntity( + visitor: [Visitor](#visitoroptions), + options: TraverseOptions, + entity: Data +): Promise; +``` + +### Parameters + +- **`visitor`**: + A function executed for each attribute of the entity. It provides context and utilities for modifying the entity. + +- **`options`**: + Configuration for traversal, including: + + - `schema` _(Model)_: The schema definition of the current entity. + - `path` _(Path, optional)_: Tracks the current traversal path. + - `parent` _(Parent, optional)_: Information about the parent attribute. + - `getModel` _(Function)_: A function to retrieve the schema of a model by its UID. + +- **`entity`**: + The data entity to be traversed. + +### Returns + +A `Promise` that resolves with the transformed entity. + +## Related Types + +### Visitor + +```typescript +type Visitor = (visitorOptions: VisitorOptions, visitorUtils: VisitorUtils) => void; +``` + +A function executed during traversal for each attribute. + +**Parameters**: + +- **`visitorOptions`** _(VisitorOptions)_: Provides details about the current state of traversal. +- **`visitorUtils`** _(VisitorUtils)_: Utilities for modifying the entity (e.g., `set`, `remove`). + +### VisitorOptions + +```typescript +interface VisitorOptions { + data: Record; + schema: Model; + key: string; + value: Data[keyof Data]; + attribute?: AnyAttribute; + path: Path; + getModel(uid: string): Model; + parent?: Parent; +} +``` + +- **`data`**: The current entity or its sub-section being processed. +- **`schema`**: The schema definition of the current entity. +- **`key`**: The current attribute key. +- **`value`**: The current attribute value. +- **`attribute`** _(optional)_: The schema attribute definition for the current key. +- **`path`**: Tracks the traversal path. +- **`getModel`**: Function to retrieve a schema definition by UID. +- **`parent`** _(optional)_: Information about the parent attribute. + +### VisitorUtils + +```typescript +interface VisitorUtils { + remove(key: string): void; + set(key: string, value: Data): void; +} +``` + +Utility functions to modify the entity: + +- **`remove(key)`**: Deletes an attribute from the entity. +- **`set(key, value)`**: Sets or updates an attribute on the entity. + +### Path + +```typescript +interface Path { + raw: string | null; + attribute: string | null; + rawWithIndices: string | null; +} +``` + +Tracks the traversal path: + +- **`raw`**: The traversal path on the entity +- **`attribute`**: The same traversal path on the schema if the attibute exists +- **`rawWithIndices`**: The traversal path on the entity including array indices using dot notation (e.g., `components.4.field.relations.2.name`) + +### Parent + +```typescript +interface Parent { + attribute?: Attribute; + key: string | null; + path: Path; + schema: Model; +} +``` + +Tracks parent information for the current attribute. + +### TraverseOptions + +```typescript +interface TraverseOptions { + schema: Model; + path?: Path; + parent?: Parent; + getModel(uid: string): Model; +} +``` + +Configuration for the traversal: + +- **`schema`**: The schema definition of the current entity. +- **`path`** _(optional)_: Tracks the current traversal path. +- **`parent`** _(optional)_: Information about the parent attribute. +- **`getModel`**: Function to retrieve a schema definition by UID. diff --git a/Dockers/strapi/strapi/docs/docs/docs/05-utils/_category_.json b/Dockers/strapi/strapi/docs/docs/docs/05-utils/_category_.json new file mode 100644 index 0000000..8cf0db1 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/05-utils/_category_.json @@ -0,0 +1,6 @@ +{ + "position": 5, + "label": "Utils", + "collapsible": true, + "collapsed": false +} diff --git a/Dockers/strapi/strapi/docs/docs/docs/06-future-flags.md b/Dockers/strapi/strapi/docs/docs/docs/06-future-flags.md new file mode 100644 index 0000000..0532be4 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/docs/06-future-flags.md @@ -0,0 +1,32 @@ +--- +title: Future Flags +--- + +In Strapi, we have incoming features that are not yet ready to be shipped to all users, but we aim to keep them updated with our codebase. Additionally, we want to offer community users the opportunity to provide early feedback on these new features or changes. + +To achieve this, we utilize future flags, which provide a way to enable unstable features **at your own risk**. Please considered that these flags may be subject to change, removal and it's possible that they contain breaking changes. + +Future flags can be used for unstable features that have not yet been shipped. So, if you decide to enable an unstable feature (prefixed with `unstable`), please be aware that this feature is likely to be modified or even removed. It's also highly probable that this unstable feature is not fully ready for use; some parts may still be under development or using mock data at the moment. + +Additionally, future flags can be utilized for enabling coming breaking changes in upcoming versions (when prefixed by `vX`, with 'X' being the target version). In this scenario, if you decide to enable a future flag for a breaking change, please consider that you will need to migrate your application to adapt to this breaking change. + +## How to enable a future flag. + +To enable a future flag, you should add it to your config/features.(js|ts) file in your Strapi application. If you don't have this file, create one. + +```ts +// config/features.ts + +export default { + future: { + unstableFeatureName: true, + v5breakingChange: env('STRAPI_FEATURES_FUTURE_V5BREAKINGCHANGE', false), + }, +}; +``` + +## How to add and start using a future flag. + +Developers are responsible for adding new future flags if they intend to introduce a new unstable feature into the Strapi codebase. Features config is part of the config object and can be easily accessed with `strapi.config.get('features')`. + +We also provide an API in the strapi object that allows you to check if a future flag is enabled. You can do this using the following method: `strapi.future.isEnabled('featureName')`. diff --git a/Dockers/strapi/strapi/docs/docs/guides/00-contributing.md b/Dockers/strapi/strapi/docs/docs/guides/00-contributing.md new file mode 100644 index 0000000..606d202 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/guides/00-contributing.md @@ -0,0 +1,12 @@ +--- +title: Contributing to Strapi +hide_title: true +--- + +```mdx-code-block +import Contributing, {toc as ContributingTOC} from "@site/../CONTRIBUTING.md" + + + +export const toc = ContributingTOC; +``` diff --git a/Dockers/strapi/strapi/docs/docs/guides/01-code-of-conduct.md b/Dockers/strapi/strapi/docs/docs/guides/01-code-of-conduct.md new file mode 100644 index 0000000..f69e46d --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/guides/01-code-of-conduct.md @@ -0,0 +1,12 @@ +--- +title: Code of conduct +hide_title: true +--- + +```mdx-code-block +import CodeOfConduct, {toc as CodeOfConductTOC} from "@site/../CODE_OF_CONDUCT.md" + + + +export const toc = CodeOfConductTOC; +``` diff --git a/Dockers/strapi/strapi/docs/docs/guides/02-working-with-the-design-system.md b/Dockers/strapi/strapi/docs/docs/guides/02-working-with-the-design-system.md new file mode 100644 index 0000000..7db0924 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/guides/02-working-with-the-design-system.md @@ -0,0 +1,23 @@ +--- +title: Working with the Design System +--- + +## Linking the Strapi Design System + +Follow these steps to use a local version of the Strapi design system with the Strapi monorepo + +In your copy of the design system run `yarn build` to generate the bundle. + +In the Strapi monorepo link your local copy of the design system with [`yarn link`](https://yarnpkg.com/cli/link#gatsby-focus-wrapper): + +``` +yarn link -r ../ +``` + +Running yarn build in `examples/getstarted` should now use your local version of the design system. + +To revert back to the released version of the design system use [`yarn unlink`](https://yarnpkg.com/cli/unlink#usage): + +``` +yarn unlink ../ +``` diff --git a/Dockers/strapi/strapi/docs/docs/guides/03-typescript.md b/Dockers/strapi/strapi/docs/docs/guides/03-typescript.md new file mode 100644 index 0000000..af29bb2 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/guides/03-typescript.md @@ -0,0 +1,5 @@ +--- +title: Typescript +--- + +🚧 coming soon 🚧 diff --git a/Dockers/strapi/strapi/docs/docs/guides/04-fe-coding-guidelines.mdx b/Dockers/strapi/strapi/docs/docs/guides/04-fe-coding-guidelines.mdx new file mode 100644 index 0000000..61ed53f --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/guides/04-fe-coding-guidelines.mdx @@ -0,0 +1,574 @@ +--- +title: FE Coding Guidelines +--- + +## Coding Style + +### Application Structure + +The FE of Strapi aims to be a domain driven application such as we heavily utilise the concept of +nested routes: + +```shell +pages/ +├─ index.tsx +├─ settings/ +│ ├─ pages/ +│ │ ├─ index.tsx +│ │ ├─ users/ +│ │ ├─ roles/ +│ │ │ ├─ create.tsx +│ │ │ ├─ :id.tsx +│ │ │ ├─ index.tsx +``` + +As part of this effort, assuming a component is not used anywhere else it should live as close as +possible to the section of the app it's used in: + +```shell +pages/ +├─ index.tsx +├─ settings/ +│ ├─ components/ +│ │ ├─ SettingsNavigation.tsx +│ ├─ hooks/ +│ │ ├─ useSettings.ts +│ ├─ pages/ +│ │ ├─ index.tsx +│ │ ├─ users/ +│ │ ├─ roles/ +│ │ │ ├─ create.tsx +│ │ │ ├─ :id.tsx +│ │ │ ├─ index.tsx +``` + +When components/hooks etc. are required higher in the tree, we can subsequently move them higher up +as necessary. But we strive for colocation. + +### Exports + +Prefer named exports over default exports. Why? Because Strapi is a _very_ large codebase. If you +export something as `default` someone can import it with a different name: + +```jsx +// button.tsx + +const MyButton = (props) => ; +``` + +Above is a simple component for illustration purposes, but you'd be likely to use the `MyButton` +component in _a lot_ of places, so what happens if you want to replace all instances with a new v2 +Button? If the naming is not as consistent, it's typically a lot more frustrating & can lead to +bugs. + +### Utilities / Helpers + +When you need a utility function ask yourself a question – do I need this _anywhere_ else? If you +don't (which is fairly typical) include it in the file you're using it. As a guide, we expect +anything exported to be unit-tested and if a utility or hook is unique and bespoke to the component +you're creating then it's advised to test that code in the context of said component, this is +covered in the Testing guides below. + +If you do need to use the utility elsewhere then follow the same practices shown in +[Application Structure](#application-structure) keep it as close to where it's used as possible. +Avoid re-exporting them from a generic `index` file. However, you might find it useful to group them +under a generic file name such as `strings.ts` which would include all the `string` utils you have. + +### Components & Hooks + +With components and hooks, to improve code discoverability, opt for this pattern instead: + +```shell +hooks/ +├─ tests/ +│ ├─ useContentManager.test.ts +├─ useContentManager.ts +``` + +### Memoization + +Premature optimisation is the root of all evil. Performance of the application _is_ important +however it should be measurable before we attempt to solve the issue as these +functions _are not free._ Take this example: + +```jsx +const FormButton = () => { + const handleSubmit = useCallback((entity) => { + post('/entity/create', { + entity, + }); + }, []); + + return ; +}; + +const Button = ({ onClick, children }) => ; +``` + +The component we're passing to is _very_ simple & `useCallback` is unnecessary here. Because we do +not need the function identity to be stable. If we were to use the callback in a `useEffect` hook +then yes, we would want the function to be stable otherwise every render would cause the `useEffect` +hook to run which could be problematic. + +So what about `useMemo`. Same thing, it's for heavy computational processes e.g. not this: + +```jsx +const Component = ({ entities = [] }) => { + const entityLength = useMemo(() => entities.length, [entities]); + //... +}; +``` + +The above function isn't expensive but more importantly we don't know what impact it has without +measuring it. Therefore, avoid using `useCallback` and `useMemo` unless you _know_ you need it. + +## Dependencies + +Generally speaking, always opt to use native-browser APIs where possible over library code, the +platform is powerful and leveraging it correctly will handle _a lot_ of edge cases you probably +won't have considered. + +One example of this would be +[`structuredClone`](https://developer.mozilla.org/en-US/docs/Web/API/structuredClone) which is a +completely drop-in solution for `lodash/cloneDeep`. If you're not sure whether you can use a browser +API feel free to use [caniuse.com](https://caniuse.com/), a powerful resource that gives you a +breakdown of the availability of an API across browsers: + +A screenshot of caniuse.com on the structureClone API + +By default, we use `browserslist` to define the browsers we support, they're defined as: + +```shell +last 3 major versions +Firefox ESR +last 2 Opera versions +not dead +``` + +It's important to note that this informs the JS transpilation step by esbuild, so if a browser does +not support it, it _may_ be polyfilled. + +### A special note on `lodash` + +We target modern browsers, typically speaking these browsers have all the functionality lodash +provides natively, albeit there may be some discrepancies between the functionality or API +signature. Because of this and our general view of shipping as little javascript to the client as +possible we should **never be adding a `lodash` function to our code**. In addition, when working on +the codebase everyone should strive to remove the instances we currently have. + +A common use case is the `get` function: + +```jsx +import get from 'lodash/get'; + +const extractDeepAttribute = (schema: object, path: string[]) => { + return get(schema, ['attributes', ...path], {}); +}; +``` + +But if we zoom out we can begin to question a few things: + +- why are we extracting something so deep here? +- are my data structures the issue? i.e. to complex +- can i just use + [`optionalChaining`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining)? + +Typically, I think you'll find that rethinking how the code works will reveal an easier to manage +data structure that from there you can probably use `optionalChaining`. + +If you're struggling to convert a `lodash` usage to native code, check out +[this helpful guide](https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore). + +### Adding new dependencies + +Sometimes you require a new dependency, it happens, it's common. Third party library code is +_fantastic_ because typically it's somewhat battle tested in production environments and in some +circumstances where the concept is complicated e.g. `fractional-indexing` it really is easier to use +a library than re-write and maintain in our application. It's a case by case basis therefore, when +adding a new dependency to the codebase you should do the following: + +- Discuss it with at least one other developer from a different squad – most appropriately through + the PR +- Add as a talking point to the next FE sync so other developers have visibility + +You'd be surprised how often a library can be replaced with a native API and through thinking and +acting in this way we hope to keep our dependency surface as small as possible. + +## Data fetching + +### V4 + +Whilst we are actively developing V4 of the CMS we should _always_ be using `react-query`'s hooks to +manage the fetching and mutation of data in conjunction with `useFetchClient`. This is because +`react-query` caches our data-fetching meaning multiple calls are not necessarily made unless a +mutation occurs as well as handling various intermittent states and events during the fetching +lifecycle. + +:::note +We're using `react-query` version 3, see the specific docs – https://tanstack.com/query/v3/docs/react/overview +::: + +There are a few guidelines to keep in mind when writing your query-keys + +- Use the URL fragments from the called URL e.g `/admin/content-manger/:id/stages -> ['content-manager', id, 'stages']` with the exception of `admin` +- All ee calls should be prefixed with ee, to be able to invalidate it all at once +- All dynamic variables need to be part of the dependency array + +You can read more on query-keys for `react-query` [here](https://tanstack.com/query/v3/docs/react/guides/query-keys). + +#### Example + +```jsx +const useLicenseLimits = () => { + const { get } = useFetchClient(); + + const { data: license } = useQuery(['ee', 'license-limit-info'], async () => { + const { + data: { data }, + } = await get('/admin/license-limit-information'); + + return data; + }); + + return { license }; +}; +``` + +### V5 + +In V5 we'll be looking at using `react-router-dom`'s loaders function to avoid data-waterfalls // +render as you fetch. For mutations we'll be using `@redux/toolkit` and subsequently it's caching +mechanisms making `react-query` redundant. + +:::note +🚧 This section will be filled in further upon delivery of v5. +::: + +## Managing state + +### Local / Global / URL state + +In the following paragraph we discuss three different types of state – Local which commonly is +defined by using `React.useState`, Global which in our case involves using `redux` and URL based +state e.g. a path parameter or search params. + +**Local State** + +This is the typical place to start when you need to make your app “react” to a change, for example, +through event inputs e.g “A user presses a button and a modal opens”: + +```jsx +import { useState } from 'react'; + +const MyButton = () => { + const [isOpen, setIsOpen] = useState(false); + + const handleClick = () => setIsOpen((currOpen) => !currOpen); + + return ( + + ); +}; +``` + +Above is a simple example of using local state, it's isolated to the component and we're not +typically passing this further down the tree. It's important to remember that you can very easily +derive state from either your current state or props that are passed e.g. you render a table of +entries and you want to know the count of entries that are “published” you could create a new state +value, but that's not necessary, we can do a calculation because the root of the data is based off +the props thus when the props update so will the count: + +```jsx +const MyTable = ({ entries = [] }) => { + const publishedCount = entries.filter((e) => e.isPublished).length; + + return ( +
+

You have {publishedCount} published entries

+ +
+ ); +}; +``` + +Always aim to derive state as opposed to setting state where possible! + +**Global state (redux)** + +When's the right time to use global state? Well first if we look at how you can pass state around +your app we first look at prop drilling. This can become verbose and inconvenient when you start to +pass it down past the first child. Often composability can be incredibly useful for these scenarios +where this: + +```jsx +import { useState } from 'react'; + +const App = () => { + const [someState, setSomeState] = useState('some state'); + return ( + <> +
+ + + + ); +}; +``` + +can easily become this: + +```jsx +import { useState } from 'react'; + +const App = () => { + const [someState, setSomeState] = useState('some state'); + return ( + <> +
+ + +
+ + + + + + + + + + + ); +}; +``` + +But in the above example, we're still passing it around. Other times composability will not help you +because it doesn't make sense or perhaps the data is fetched from one part of an application and +another requires it later / now. For data fetching you could consider using something like +`react-query` because it has it's own data caching system. Other times such as the Content Manager's +edit view, it's managing complex nested browser form state and in these circumstances you'd use a +global state management solution like redux. + +The other plus side to a global state manager like redux is that it's contained, it's easily +debuggable because all the state & changes can be monitored closely and reviewed piece by piece. It +also enforces uni-directional data flows & unlocks powerful features such as “redo/undo”. + +**URL state** + +If we have local, derived & global state then why would we want URL state? Consider this, you've +created a very complicated view of your a table, it has the exact columns you want to show and how +to show them and you need to show this someone page 3 – but they're not near you. This is where URL +state comes in. If we store the pagination state in the URL we can _easily_ share the exact page of +a table. If we store the sorting & filtering of the table then anyone can see the view you're +directly on. + +The bottom line is – global & local state do not transcend the machine you're working on. In all +reality, this is typically how web apps worked before the javascript ecosystem “got big” and most +importantly, we're just leaning on the platform as much as possible to do all our heavy lifting +whilst giving our users a 10x better experience. + +### Avoid effects + +Effects are tricky, when should you use them? React's documentation describes them as an escape +hatch to step outside of the react paradigm to sync with “external” systems such as the network of +DOM. If you're using them to make changes to your component code or respond to user-events then +you've probably made a mistake in your code and you should review this. If you're struggling to work +with effects and worry you're using too many of them, check out the react docs. + +Overall, we advise you avoid effects where you can, especially for data-fetching when you really get +into it, it's not a trivial problem to circumvent and there's a reason why we recommend using a +data-fetching library like `react-query` or `@redux/toolkit`. + +### Using context effectively + +`React.Context` is another powerful tool to avoid prop drilling and employ a version of global +state, after all, `redux` is based on `React.Context`. But knowing when to use it is important. We +advise avoiding it for complex nested data-structures like the `content-manger` edit view because +context has no selector pattern (at time of writing) which means one change to the context will +re-render every component connected – this could be expensive. What it's great for is complex +components using composable design, take this simplified example: + +```jsx +// Table.tsx +import { useContext, createContext } from 'react' + +const TableContext = createContext() + +const useTableContext = () => useContext(TableContext) + +const Root = ({ isLoading, children }) => { + const contextValue = useMemo(() => ({ isLoading }), [isLoading]) + + return ( + + {children} + + ) +} + +const Loading = () => { + const { isLoading } = useTableContext() + + if(!isLoading){ + return null + } + + return ( + + + + loading... + + + + ) +} + +export const Table = { + Root, + Loading, +} + +// something-else.tsx +import { useQuery } from 'react-query' +import { useFetchClient } from '@strapi/helper-plugin' + +import { Table } from './Table' + +const MyPage = () => { + const { get } = useFetchClient() + + const { isLoading, data } = useQuery(async () => { + const { data } = await get(ENDPOINT) + return data + }) + + return ( + + + {data.map(datum => } + + ) +} +``` + +In the above example we don't need to worry about when to render the loading state because the table +extracts all this and we can focus on composing our views in a readable manor. + +### Useful articles + +- https://kentcdodds.com/blog/application-state-management-with-react +- https://react.dev/learn/you-might-not-need-an-effect + +## Unit Testing + +:::note +We'll write a section on E2E tests when we're there. +::: + +### When & why should you write tests? + +As a rule of thumb you should add tests – whenever you add _new_ code. It's even better if you add +them when refactoring and you notice the tests are either “light” or non-existent. They're +incredibly valuable in stopping accidental regressions (which happen and that's okay). No test suite +is perfect and there's always room to improve. If you're fixing a bug consider writing a test that +addresses the issue you're trying to solve to assert it's failing & then you have an automated way +to confirm your fix works as expected. + +### What makes a good test? + +Good FE tests avoid testing implementation details, the tests often break when refactoring code in +an arbitrary manor whilst not actually showing issues when a user interacts with the component. This +is why we aim to test our components as if we're a user, it supports our ethos of test writing +should give us confidence that our application will work when a _user_ uses it. Because we're using +the Testing Library suite of tools, they have an incredibly +[handy document](https://testing-library.com/docs/queries/about/#priority) surrounding what order of +queries to try and use. The main takeaway would be to try and avoid using `getByTestId` where +possible, it should be considered a last resort because it doesn't test any of the user +implementations and more than likely you're testing code that is not visible to the user correctly +and in that scenario we should be asking “why is this necessary?”. + +Also, avoid snapshotting the DOM except for _small_ circumstances, snapshotting is great for +data-structures where it's easy to skim and understand, it's also great for analysing a very small +component e.g. an `svg` with a single `path`. However, often we're testing very large complicated +compositions of components and the snapshot of said component is typically very large and hard for a +developer to skim and understand the impact of their changes. If we're being honest with ourselves, +no one reviews should enormous snapshot changes either. + +### Mocking + +Avoid it if you can. + +Although realistically, it's not always possible. Lets first look at API mocking; try to avoid +mocking your “fetch” library whether that's `react-query` or `axios` or native fetch. It makes a +brittle test and doesn't behave 1:1 as the library would with the network request. Instead, prefer +using Mock Service Worker ([MSW](https://mswjs.io/)) to mock/intercept the API request calls. The +largest benefit is because all we're doing is locating our API responses in one space that can be +shared across tests to avoid reimplementation and therefore less work to edit them should the API +response change. + +When looking at `module` mocking: + +```jsx +jest.mock('@strapi/helper-plugin', () => ({ + ...jest.requireActual('@strapi/helper-plugin'), + useNotification: jest.fn(() => ({ + toggleNotification: jest.fn(), + })), +})); +``` + +We should continue to avoid it where possible, in the above example there's no real reason to mock +`useNotification`, it's more than likely the wrapper just needed the correct Provider to be added to +avoid any errors and more importantly we're now not able to test our notification is visible to the +user – testing it's fired is an implementation detail, how can we be sure it's visible? + +If you do mock a module try to create a manual mock instead under the `__mocks__` folder if +possible. + +### Useful Articles + +- https://kentcdodds.com/blog/testing-implementation-details +- https://testing-library.com/docs/queries/about/#priority + +## A11y + +Semantics are important for users, just because the application is “not on the web” does not mean +our users are “fully abled” (do not have any type of disability). Therefore when building UI aim to +use the correct semantic elements in the correct places, typically we use the `design-system` to +build UI in the CMS, so most of the accessibility work is done there. But, accessibility is not easy +– this is why we test from a user perspective as described in the “Testing” section. If you're not +sure about accessibility patterns check out these resources: + +- https://www.w3.org/WAI/ARIA/apg/ +- https://webaim.org/ +- https://www.a11yproject.com/ + +## Conventions + +### Submitting a PR + +When submitting an FE related PR ensure you've done the following: + +- Follow the template, especially including a clear description, it's a history for future + developers understanding the context around a decision. +- Update or add tests for your relevant code, for more help on this consult the + [Testing Section](#unit-testing) +- Always consider whether adding contributor documentation is helpful for the work you've done e.g. + you've created a new hook that can be used across the app +- Get the relevant reviewers – engineers in your squad is a good start, but if you're working in a + space of the codebase you're not as familiar with e.g. `entity-service` consider getting engineers + who have more experience in the space. diff --git a/Dockers/strapi/strapi/docs/docs/guides/05-type-system/01-philosophy.md b/Dockers/strapi/strapi/docs/docs/guides/05-type-system/01-philosophy.md new file mode 100644 index 0000000..a164c78 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/guides/05-type-system/01-philosophy.md @@ -0,0 +1,79 @@ +--- +title: Philosophy +tags: + - typescript + - type system + - type + - philosophy + - principles +--- + +### Context + +Since its release, Strapi's strength has lain in its **flexibility** and **extensibility**. + +It can handle a wide array of content and customizations, from content-types to plugins and extensions, most of them are defined dynamically in user applications. + +With TypeScript imposing itself as a standard in the JS ecosystem over the years, it has become critical to develop a uniform system that streamlines this heavily customized content management's developer experience. + +It is in this context that a type system becomes an essential tool, as it provides a single source of truth for standardized data structures, like schema, attributes, and entities, whether they've been statically or dynamically created. + +On top of this, it offers a wide range of utilities to manipulate those types, and creates a unified, typed developer experience across the whole codebase. + +### Application + +#### For Contributors + +One of its key advantages is the plethora of utilities it provides, which simplify the manipulation of complex data structures, including content types, documents, and UIDs. + +Another significant advantage is the consistency it enforces within the codebase. This is achieved by defining shared types once and reusing them throughout the codebase. + +Moreover, the type system can effectively handle high levels of customization, thus allowing developers to focus their efforts on feature development rather than TypeScript headaches. + +#### For Users + +Although Strapi users don't often engage directly with the type system, it nonetheless profoundly influences their Strapi experience. + +It ensures the provision of type-safe APIs (such as the document service), which greatly reduces runtime errors, offers a simple way of discovering APIs via autocompletion and code hinting, and makes the system more reliable overall. + +Moreover, it arms users with ready-made types, which they can use to type-proof their applications or customizations. + +Lastly, the type system also provides users with type-manipulation utilities. + +### Challenges + +The main challenge faced by the type system is being able to maintain a high-quality TypeScript developer experience for different contexts, each with their own nuances. + +#### For Contributors + +Contributors expect to create and/or use APIs that handle very generic data structures in the context of Strapi internals, which become context-aware and strongly typed when used by a user withing their application. + +#### For Users + +Users expects to have a TypeScript experience tailored around their own application, with their content-types, components, and plugins being strongly typed and recognized by the Strapi APIs. + +:::warning +Creating such experiences without slowing down developers (both contributors and users) is a huge undertaking and should be considered a top priority everytime the type system is modified. +::: + +### Key Principles + +#### 🧩 Flexibility and Extensibility + +Strapi's strength lies in its ability to handle a wide range of content and customizations, the types should reflect and adapt to that. + +#### 📏 Uniformity + +The goal of the type system is to provide a consistent and smooth TypeScript developer experience for both users' applications and Strapi internals. + +#### 🧰 Fully-Featured + +The type system exposes utilities that enable the manipulation of complex data structures, regardless of potential heavy customization involved. + +#### 🪡 Tailor-made Experience + +The type system should provide a TypeScript experience that is tailored to each application, while keeping a generic stance within Strapi internals. + +#### 🏖️ Easy to Use + +The type system should prioritize not slowing down developers, whether contributors or users. Any complexity should be handled by the type system internals. diff --git a/Dockers/strapi/strapi/docs/docs/guides/05-type-system/02-concepts/01-schema.mdx b/Dockers/strapi/strapi/docs/docs/guides/05-type-system/02-concepts/01-schema.mdx new file mode 100644 index 0000000..a5a76d7 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/guides/05-type-system/02-concepts/01-schema.mdx @@ -0,0 +1,144 @@ +--- +title: Schema +tags: + - typescript + - type system + - type + - concepts +--- + +The schema is the primary data structure leveraged within the Strapi Type System, defining how content is structured and managed in the application. + +It serves several key functions: + +- **Representation**: At its core, a schema outlines and defines the structure of Strapi content. This is useful when dealing with features that need access to low level schema properties (_e.g. attributes, plugin options, etc..._). + +- **Inference**: The schema allows inferring and configuring numerous other types. This includes entities like `ContentType` or `Component`, among others. + +### Scope + +Schema types represent **loaded** schemas in the context of a Strapi server application and should be used accordingly. + +:::caution +Database models and raw schema definitions (_aka schemas before being loaded by the Strapi server_) are **not** the same types and can't be used interchangeably. +::: + +### Sub-Types + +Each box is a type that extends the base Schema interface. + +In between each box is text that represents the discriminant used to differentiate the subtype from others. + +```mermaid +flowchart TB; + Schema -- "modelType: contentType" ---- ContentTypeSchema + Schema -- "modelType: component" ---- ComponentSchema + ContentTypeSchema -- "kind: collectionType" ---- CollectionTypeSchema + ContentTypeSchema -- "kind: singleType" ---- SingleTypeSchema +``` + +### Properties + +Schema types contain useful information that helps other types know how to interact with the Strapi content. + +This is facilitated through multiple properties. + +#### Options + +A set of properties used to configure the schema. It contains information on features activation among other things. + +This can be really useful to make the types adapt to a given schema. + +For instance, the document service uses the `options.draftAndPublish` property to determine whether it should add publication methods to the service type. + +#### Plugin Options + +These options provide the ability to alter or enhance the behaviour of the system based on specific values. + +If a plugin is enabled, it might bring functionality that can affect how types interact with each other. + +For example, it's possible to add or remove certain entity-service filters from the query type based on whether a plugin is enabled. + +#### Attributes + +Strongly typed schema attributes allows the Type System to infer actual entities types based on their properties. + +For instance, a string attribute will resolve to a primitive string in an entity, whereas a repeatable component attribute will resolve to an array of objects. + +### Usage + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + + + +When designing public APIs (and in most other scenarios), it's advised to use the high-level schema types found in the `Schema` namespace. + +Schema definitions exported from the `Schema` namespace are targeting the dynamic types found in the public schema registries, and will dynamically adapt to the current context while extending the base Schema types. + +:::info +If the public registries are empty (_e.g. types are not generated yet, not in the context of a Strapi application, ..._), schema types will fallback to their low-level definitions. +::: + +```typescript +import type { Schema } from '@strapi/strapi'; + +declare const schema: Schema.Schema; +declare const contentType: Schema.ContentType; +declare const component: Schema.Component; + +declare function processAnySchema(schema: Schema.Schema): void; + +processAnySchema(schema); // ✅ +processAnySchema(contentType); // ✅ +processAnySchema(component); // ✅ + +declare function processContentTypeSchema(schema: Schema.ContentType): void; + +processContentTypeSchema(schema); // ✅ +processContentTypeSchema(contentType); // ✅ +processContentTypeSchema(component); // ❌ Error, a component schema is not assignable to a content-type schema + +declare function processComponentSchema(schema: Schema.Component): void; + +processComponentSchema(schema); // ✅ +processComponentSchema(contentType); // ❌ Error, a content-type schema is not assignable to a component schema +processComponentSchema(component); // ✅ +``` + + + +Schema definitions exported from the `Struct` namespace defines the low level type representation of Strapi schemas. + +:::caution +Those types can be useful when you want to validate other types against the base ones, but realistically, the public Schema types should almost always be preferred. +::: + +```typescript +import type { Struct } from '@strapi/strapi'; + +declare const schema: Struct.Schema; +declare const contentType: Struct.ContentTypeSchema; +declare const component: Struct.ComponentSchema; + +declare function processAnySchema(schema: Struct.Schema): void; + +processAnySchema(schema); // ✅ +processAnySchema(contentType); // ✅ +processAnySchema(component); // ✅ + +declare function processContentTypeSchema(schema: Struct.ContentTypeSchema): void; + +processContentTypeSchema(schema); // ✅ +processContentTypeSchema(contentType); // ✅ +processContentTypeSchema(component); // ❌ Error, a component schema is not assignable to a content-type schema + +declare function processComponentSchema(schema: Struct.ComponentSchema): void; + +processComponentSchema(schema); // ✅ +processComponentSchema(contentType); // ❌ Error, a content-type schema is not assignable to a component schema +processComponentSchema(component); // ✅ +``` + + + diff --git a/Dockers/strapi/strapi/docs/docs/guides/05-type-system/02-concepts/02-uid.mdx b/Dockers/strapi/strapi/docs/docs/guides/05-type-system/02-concepts/02-uid.mdx new file mode 100644 index 0000000..2d9dc1b --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/guides/05-type-system/02-concepts/02-uid.mdx @@ -0,0 +1,190 @@ +--- +title: UID +tags: + - typescript + - type system + - type + - concepts +toc_max_heading_level: 4 +--- + +:::note +On this page, **a resource** is considered as **anything that can be identified by a UID**. + +This includes (but is not limited to) controllers, schema, services, policies, middlewares, etc... +::: + +In the Type System, UIDs play a crucial role in referencing various resources (such as schema and entities) by attaching a unique identifier. + +To put it simply, a UID is a unique (string) literal key used to identify, locate, or access a particular resource within the system. + +:::tip +This makes it the perfect tool to index type registries or to use as a type parameter for resource-centric types. +::: + +### Format + +A UID is composed of 3 different parts: + +1. A namespace ([link](#1-namespaces)) +2. A separator ([link](#2-separators)) +3. A name ([link](#3-names)) + +#### 1. Namespaces + +There are two main families of namespaces: + +- Scoped (_aka parametrized_) +- Non-scoped (_aka constants_) + +A third kind exists for component UIDs and is defined only by a dynamic category: ``. + +##### Scoped + +Scoped namespaces are defined by a base name, followed by a separator (`::`) and any string. + +In Strapi there are two of them: + +| Name | Definition | Description | +| ------ | :---------------: | ---------------------------------------------------- | +| API | `api::` | Represent a resource present in the `` API | +| Plugin | `plugin::` | Represent a resource present in the `` plugin | + +##### Non-Scoped + +These namespaces are used as a simple prefix and define the origin of a resource. + +Strapi uses three of them to create UIDs + +| Name | Definition | Description | +| ------ | :--------: | ----------------------------------------------------------------------------- | +| Strapi | `strapi` | Represent a resource present in the core of strapi | +| Admin | `admin` | Represent a resource present in Strapi admin | +| Global | `global` | Rarely used (_e.g. policies or middlewares_), it represents a global resource | + +#### 2. Separators + +There are only two kind of separators: + +- `.` for scoped namespaces (`api::`, `plugin::`) and components (``) +- `::` for others (`admin`, `strapi`, `global`) + +#### 3. Names + +UID names can be any alphanumeric string. + +:::caution +A UID is unique for the kind of resource it's attached to, but **different resource can share the same UID**. + +For instance, it's completely possible to have both a `service` and a `schema` identified by `api::article.article`. + +Since **TypeScript is a structural type system**, it means that **different UIDs resolving to the same literal type can match each other**, thus making it possible to send a service UID to a method expecting a schema UID (if they share the same format). +::: + +### Compatibility Table + +The following table shows, for each kind of UID, what resource they can be associated with. + +:::note +ContentType and Component are referring to both the related schema and entity. +::: + +| | ContentType | Component | Middleware | Policy | Controller | Service | +| ------------------------ | :----------------: | :----------------: | :----------------: | :----------------: | :----------------: | :----------------: | +| `api::.` | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| `plugin::.` | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| `.` | :x: | :white_check_mark: | :x: | :x: | :x: | :x: | +| `strapi::` | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| `admin::` | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| `global::` | :x: | :x: | :white_check_mark: | :white_check_mark: | :x: | :x: | + +### Usage + +When referencing resource by their UID you'll need to use the `UID` namespace exported from `@strapi/types`. + +```typescript +import type { UID } from '@strapi/types'; +``` + +This namespace contains shortcuts to dynamic UID types built from the public registries so that they always adapt to the current context. + +:::danger +The `UID` namespace is designed to be the main interface used by developers. + +Do not use the `Internal.UID` namespace unless you know what you're doing (low level extends clause, isolated internal code, etc...). +::: + +#### Basic Example + +A common usage is to declare a function that takes a UID as a parameter. + +For our example, let's imagine we want to fetch an entity based on the provided resource UID. + +```typescript +import type { UID, Data } from '@strapi/types'; + +declare function fetch(uid: UID.ContentType): Data.ContentType; +``` + +:::tip +To find an exhaustive list of available UID types, take a look at the [related API reference](http://foo) +::: + +#### Parameter Type Inference + +Now let's say we want to adapt the return type of our function, so that it matches the given UID. + +```typescript +fetch('api::article.article'); +// ^ this should return a Data.Entity<'api::article.article'> + +fetch('admin::user'); +// ^ this should return a Data.Entity<'admin::user'> +``` + +To do that, we'll need the function to be able to provide us with the current `uid` type based on usage. + +```typescript +import type { UID, Data } from '@strapi/types'; + +declare function fetch(uid: T): Data.ContentType; +``` + +So what's changed here? + +1. We've forced the `uid` type to be inferred upon usage and stored in a type variable called `T`. +2. We've then re-used `T` to parametrize the `Data.ContentType` type. + +`fetch` will now always return the correct entity depending on which `UID` is sent. + +:::caution +When writing actual code, avoid using `T` as a type variable, and always use meaningful names that will help other developers understand what the variable represents. + +For instance, in our example we could use `TContentTypeUID` instead of just `T`. +::: + +#### Going Further + +It's completely possible to reference `T` in other generic parameters. + +Let's add the possibility to select which fields we want to return for our entity. + +```typescript +import type { UID, Data, Schema } from '@strapi/types'; + +declare function fetch>( + uid: T, + fields: F[] +): Data.ContentType; +``` + +:::tip +You may have noticed that we're using the inferred UID type (`T`) to reference both: + +- An entity (`Data.Entity`) +- A schema (`Schema.AttributeNames`) + +This is because they share the same format and can be used interchangeably. + +For more information, take a look at the [format](#format) and [compatibility table](#compatibility-table) sections. +::: diff --git a/Dockers/strapi/strapi/docs/docs/guides/05-type-system/02-concepts/03-public-registry.mdx b/Dockers/strapi/strapi/docs/docs/guides/05-type-system/02-concepts/03-public-registry.mdx new file mode 100644 index 0000000..572eaaa --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/guides/05-type-system/02-concepts/03-public-registry.mdx @@ -0,0 +1,325 @@ +--- +title: Public Registries +tags: + - typescript + - type system + - type + - concepts + - public +toc_max_heading_level: 5 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +### Context + +#### Why? + +The Strapi Type System is designed to provide developers with a fully customizable experience. + +It's engineered to adapt and modify its type definitions automatically according to the context of each application and associated resources. + +This adaptability extends to various components such as schemas, services, controllers, and more. + +:::note +See the [type system principles](../philosophy#key-principles) page for more information about the mission. +::: + +#### How? + +To meet this requirement, the Type System employs "public registries". + +In simple terms, public registries are basic indexed interface definitions that are made publicly available by the types package. + +```typescript +export interface MyRegistry { + [key: string]: GenericResourceDefinition; +} +``` + +Every resource comes with its own registry that has a set of rules acting as the default state (the index). + +Because every registry can be augmented (publicly exported), developers have the freedom to inject their own definitions. + +Doing so allows Strapi APIs to respond in a way that aligns with the developers' custom definitions. + +:::info[Did you know?] +The `Schema` and `UID` namespaces rely solely on public registries to infer their type definitions. + +This is why it's heavily encouraged to use them over their low level counter-parts. +::: + +### How it works + +#### Architecture + +```mermaid +flowchart TB; + %% Main node + ContentTypeRegistry("Content-Types Registry") + + %% App + subgraph Application + %% Nodes + UserApp["User Application"] + UserSchema(["Application Types"]) + + %% Links + UserApp -- "generates" ---> UserSchema + end + + %% Type System + subgraph TypesPackage["@strapi/types"] + %% Nodes + TypeSystem["Type System"] + Types{{Types}} + Registries{{Registries}} + UID{{UID}} + Schema{{Schema}} + + %% Links + TypeSystem -- "exports" ---> Types & Registries + Types -- "exports" ---> UID & Schema -- "uses" ---> ContentTypeRegistry + Registries -- "exports" ----> ContentTypeRegistry + end + + %% Strapi + subgraph StrapiPackage["@strapi/strapi"] + %% Nodes + Strapi["Strapi"] + APIs[["APIs"]] + + %% Links + Strapi -- "exports" --> APIs + APIs -- "uses" --> Types + end + + %% This link needs to be placed last to preserve the layout + UserSchema -- "augments" -----> ContentTypeRegistry +``` + +#### Usage + +##### 1. Registry Definition + +Creating a new registry is as simple as exporting an indexed interface from the right namespace. + +Let's declare the content-type schema registry. + +It should accept: + +- Content-type UIDs as keys +- Content-type schemas as values + +```ts title="@strapi/types/public/registries.ts" +import type { Internal, Struct } from '@strapi/types'; + +export interface ContentTypeSchemas { + [key: Internal.UID.ContentType]: Struct.ContentTypeSchema; +} +``` + +:::note +We use low level types to define our index (`Internal`/`Struct`) to keep it as generic as possible. +::: + +##### 2. Dynamic Type Definitions + +###### UID.ContentType + +To define `UID.ContentType`, we extract every key (`Internal.Registry.Keys`) from the public content-type registry (`Public.ContentTypeSchemas`) that matches with the base definition of a content-type UID (`Internal.UID.ContentType`). + +```ts title="@strapi/types/uid.ts" +import type { Internal, Public } from '@strapi/types'; + +export type ContentType = Internal.Registry.Keys< + Public.ContentTypeSchemas, + Internal.UID.ContentType +>; +``` + +:::note +Only selecting keys that extend `Internal.UID.ContentType` ensures we don't end up with manually added malformed keys, and tells the type-checker we're confident about what's in our union type. +::: + +###### Schema.ContentType + +To declare `Schema.ContentType`, we simply query the content-type schema registry (`Public.ContentTypeSchemas`) with the provided content-type UID (`TUID`). + +:::note +Since `UID.ContentType` (`TUID`) is [dynamically built based on actual keys](#uidcontenttype), we know for sure that there will be a valid corresponding schema in the registry. +::: + +```ts title="@strapi/types/schema.ts" +import type { UID, Public } from '@strapi/types'; + +export type ContentType = Public.ContentTypeSchemas[TUID]; +``` + +##### 3. API Design + +To create types for a dynamic API (_aka one that reacts to its context_), simply use dynamic type definitions such as `UID`, `Data` or `Schema`. + +```ts title="@strapi/core/document-service.ts" +import type { Data, UID } from '@strapi/types'; + +export type findOne(uid: TUID): Data.ContentType; +``` + +:::caution +Remember to use dynamic type definitions (`UID`, `Data`, `Schema`) and not static ones (`Internal`, `Struct`). +::: + +:::info[Reminder] +Registries are **indexed**, which means that: + +- **When augmented** (_e.g. in users' applications_), they'll return **strongly typed values** that correspond to the defined types. +- **When empty** (_e.g. in Strapi codebase_), they'll return **generic low level types** based on their index definition. + + + + ```ts + import type { UID } from '@strapi/types'; + + const uid: UID.ContentType; + // ^ 'api::article.article' | 'admin::user' + ``` + + + + ```ts + import type { UID } from '@strapi/types'; + + const uid: UID.ContentType; + // ^ `admin::${string}` | `api::${string}.${string}` | `plugin::${string}.${string}` | `strapi::${string}` + ``` + + + +::: + +##### 4. Type Augmentation + +###### Manual Augmentation + +It's possible to manually augment the public registries to create tailor-made experiences. + +```ts title="my-app/index.d.ts" +import type { Struct } from '@strapi/strapi'; + +interface ApiArticleArticle extends Struct.ContentTypeSchema { + // ... +} + +declare module '@strapi/strapi' { + export module Public { + export interface ContentTypeSchemas { + 'api::article.article': ApiArticleArticle; + } + } +} +``` + +This will force every type that depends on the `Public.ContentTypeSchemas` registry to recognize `'api::article.article'` as the only valid UID and `ApiArticleArticle` the only valid schema. + +:::note +In the context of a Strapi application, developers are strongly encouraged to use types exported by `@strapi/strapi` and not `@strapi/types`. + +This is to allow having both an internal (`@strapi/types`) and a public (`@strapi/strapi`) types API. +::: + +###### Automated Augmentation + +To ease the registries augmentation, Strapi offers an automated way of generating types and extending the registries. + +The process will generate type definitions based on the user application state (`schemas`), then augment the registry using the created types. + + + + Generate the types once. + +```shell title="my-app/" +yarn strapi ts:generate-types +``` + + + + Start the application in dev mode, and generate types on every server restart. + + Useful when working with the content-type builder. + +```shell title="my-app/" +yarn develop +``` + + + + +The generated types will automatically augment the corresponding registries. + +```ts title="my-app/types/generated/contentTypes.d.ts" +import type { Struct } from '@strapi/strapi'; + +interface ApiArticleArticle extends Struct.ContentTypeSchema { + // ... +} + +interface AdminUser extends Struct.ContentTypeSchema { + // ... +} + +declare module '@strapi/strapi' { + export module Public { + export interface ContentTypeSchemas { + 'api::article.article': ApiArticleArticle; + 'admin::user': AdminUser; + } + } +} +``` + +--- + +When coupling everything together, the end result is a TypeScript developer experience automatically adjusted to the current context. + + + + + +```ts title="my-app/src/index.ts" +export default () => ({ + bootstrap() { + strapi.findOne('ap'); + // ^ TypeScript will autocomplete with "api::article.article" + + strapi.findOne('ad'); + // ^ TypeScript will autocomplete with "admin::user" + + strapi.findOne('api::blog.blog'); + // ^ Error, TypeScript will complain + } +}) +``` + + +```ts title="@strapi/strapi/document-service.ts" +import type { UID } from '@strapi/types'; + +export const findOne(uid: TUID) { + // ... +} + +findOne('admin::foo'); +// ^ Valid, matches 'admin::${string}' + +findOne('plugin::bar.bar'); +// ^ Valid, matches 'plugin::${string}.${string}' + +findOne('baz'); +// ^ Error, does not correspond to any content-type UID format +``` + + + + diff --git a/Dockers/strapi/strapi/docs/docs/guides/05-type-system/02-concepts/index.md b/Dockers/strapi/strapi/docs/docs/guides/05-type-system/02-concepts/index.md new file mode 100644 index 0000000..72dde87 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/guides/05-type-system/02-concepts/index.md @@ -0,0 +1,15 @@ +--- +title: Concepts +tags: + - typescript + - type system + - type + - concepts +--- + +```mdx-code-block +import DocCardList from '@theme/DocCardList'; +import { useCurrentSidebarCategory } from '@docusaurus/theme-common'; + + +``` diff --git a/Dockers/strapi/strapi/docs/docs/guides/05-type-system/03-cheatsheet.mdx b/Dockers/strapi/strapi/docs/docs/guides/05-type-system/03-cheatsheet.mdx new file mode 100644 index 0000000..a9bd8c9 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/guides/05-type-system/03-cheatsheet.mdx @@ -0,0 +1,255 @@ +--- +title: CheatSheet +tags: + - typescript + - type system + - type + - cheatsheet +toc_max_heading_level: 3 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Admonition from '@theme/Admonition'; + +### Common Use Cases + +--- + +#### Function that Returns Any Entity + +```typescript +import type { Data } from '@strapi/types'; + +function find(): Data.Entity {} +``` + +--- + +#### Using UIDs as Resource Selectors in Function Params + + + + + +:::info +Infer the UID type based on usage and allow passing it to other generic types. +::: + +```typescript +import type { Schema, UID } from '@strapi/types'; + +function getSchema(uid: TSchemaUID): Schema.Schema {} +``` + + + + + +:::info +Simpler definition than the dynamic one. +Useful when the uid type doesn't need to be re-used by other type. +::: + +```typescript +import type { Schema, UID } from '@strapi/types'; + +function getSchema(uid: UID.Schema): Schema.Schema {} +``` + + + + + +--- + +#### Loop Over Schema Attributes + +Given a schema such as: + +```typescript +import type { Schema } from '@strapi/types'; + +declare const schema: Schema.Schema; +``` + +Extract its attributes + +```typescript +const { attributes } = schema; +``` + +Then loop over them, using `attribute.type` as a discriminator to infer the correct type for each attribute type. + +```typescript +for (const attributeName in attributes) { + // attribute is Schema.Attribute.AnyAttribute + const attribute = attributes[attributeName]; + + switch (attribute.type) { + case 'string': + // attribute is Schema.Attribute.String + console.log(attribute.minLength, attribute.maxLength); + break; + case 'relation': + // attribute is Schema.Attribute.Relation + console.log(attribute.relation); + break; + } +} +``` + +--- + +#### Type Guard + +```typescript +import type { Schema } from '@strapi/types'; + +function isContentTypeSchema(schema: Schema.Schema): schema is Schema.ContentType { + return schema.modelType === 'contentType'; +} +``` + +--- + +#### Assertion Function + +```typescript +import type { Schema } from '@strapi/types'; + +function assertIsContentTypeSchema(schema: Schema.Schema): asserts schema is Schema.ContentType { + if (schema.modelType !== 'contentType') { + throw new Error('schema is not a content-type'); + } +} +``` + +--- + +### Data + +```typescript +import type { Data } from '@strapi/types'; +``` + + + + #### Represent any entity + + ```typescript + type Entity = Data.Entity; + ``` + + #### Represent a specific content-type entity + + ```typescript + type Article = Data.Entity<'api::article.article'>; + ``` + + #### Represent a specific component entity + + ```typescript + type Metadata = Data.Entity<'seo.metadata'>; + ``` + + #### Represent any content-type + + ```typescript + type Entity = Data.Entity; + ``` + + #### Only select a subset of an entity + + ```typescript + type PartialArticle = Data.Entity<'api::article.article', 'title' | 'description' | 'author'>; + ``` + + + + #### Represent any content-type entity + + ```typescript + type ContentTypeEntity = Data.ContentType; + ``` + + #### Represent a specific content-type entity + + ```typescript + type Article = Data.ContentType<'api::article.article'>; + ``` + + #### Only select a subset of a content-type entity + + ```typescript + type PartialArticle = Data.ContentType<'api::article.article', 'title' | 'description' | 'author'>; + ``` + + + + #### Represent any component entity + + ```typescript + type ComponentEntity = Data.Component; + ``` + + #### Represent a specific component entity + + ```typescript + type Metadata = Data.Component<'seo.metadata'>; + ``` + + #### Only select a subset of a component entity + + ```typescript + type PartialMetadata = Data.Component<'seo.metadata', 'description' | 'tags'>; + ``` + + + + +--- + +### UID + +```typescript +import type { UID } from '@strapi/types'; +``` + +#### Represent any schema UID + +```typescript +type SchemaUID = UID.Schema; +``` + +#### Represent a specific content-type UID + +```typescript +const articleUID = 'api::article.article' satisfies UID.ContentType; +``` + +#### Represent a specific component entity + +```typescript +const metadataUID = 'seo.metadata' satisfies UID.Component; +``` + +#### Represent any content-type + +```typescript +type ContentTypeUID = UID.ContentType; +``` + +```typescript +declare const contentTypeUID: UID.ContentType; +``` + +#### Check if a given UID is a ContentType UID + +```typescript +type IsContentType = UID.IsContentType<'api::article.article'>; +``` + +:::note +`IsContentType` will either be `true` or `false`. +::: diff --git a/Dockers/strapi/strapi/docs/docs/guides/05-type-system/index.md b/Dockers/strapi/strapi/docs/docs/guides/05-type-system/index.md new file mode 100644 index 0000000..93b6563 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/guides/05-type-system/index.md @@ -0,0 +1,14 @@ +--- +title: Type System +tags: + - typescript + - type system + - type +--- + +```mdx-code-block +import DocCardList from '@theme/DocCardList'; +import { useCurrentSidebarCategory } from '@docusaurus/theme-common'; + + +``` diff --git a/Dockers/strapi/strapi/docs/docs/guides/e2e/00-setup.md b/Dockers/strapi/strapi/docs/docs/guides/e2e/00-setup.md new file mode 100644 index 0000000..1350677 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/guides/e2e/00-setup.md @@ -0,0 +1,116 @@ +--- +title: Setup +tags: + - testing + - e2e + - playwright + - infrastructure +--- + +## Overview + +This document explains at a high level how we create our app instance, run the e2e tests and what technology we're using for e2e tests. As well as a small section on writing tests. + +## Get Started + +To run the e2e tests, you must first install the playwright browsers. + +```shell +npx playwright install +``` + +Because we require a "fresh" instance to assert our e2e tests against this is included in the testing script so all you need to run is: + +```shell +yarn test:e2e +``` + +This will spawn by default a Strapi instance per testing domain (e.g. content-manager) in `test-apps` where the an individual `playwright.config` will start the instance and run tests against. It will automatically link the dependencies from the instance to the monorepo because `test-apps` are not considered part of the monorepo but we want to be using the most recent version of strapi (published or development) therefore meaning our most recent code changes can be tested against. + +If you need to clean the test-apps folder because they are not working as expected, you can run `yarn test:e2e clean` which will clean said directory. + +### Running specific tests + +To run only one domain, meaning a top-level directory in e2e/tests such as "admin" or "content-manager", use the `--domains` option. + +```shell +yarn test:e2e --domains=admin +npm run test:e2e --domains=admin +``` + +To run a specific file, you can pass arguments and options to playwright using `--` between the test:e2e options and the playwright options, such as: + +```shell +# to run just the login.spec.ts file in the admin domain +yarn test:e2e --domains=admin -- login.spec.ts +npm run test:e2e --domains=admin -- login.spec.ts +``` + +Note that you must still include a domain, otherwise playwright will attempt to run every domain filtering by that filename, and any domains that do not contain that filename will fail with "no tests found" + +### Running specific browsers + +To run only a specific browser (to speed up test development, for example) you can pass `--project` to playwright with the value(s) `chromium`, `firefox`, or `webkit` + +```shell +yarn test:e2e --domains=admin -- login.spec.ts --project=chromium +npm run test:e2e --domains=admin -- login.spec.ts --project=chromium +``` + +To debug your tests with a browser instance and the playwright debugger, you can pass the +`--debug` option like this: + +```shell +yarn test:e2e --domains admin -- --debug +yarn test:e2e --domains admin -- login.spec.ts --debug +``` + +### Concurrency / parallellization + +By default, every domain is run with its own test app in parallel with the other domains. The tests within a domain are run in series, one at a time. + +If you need an easier way to view the output, or have problems running multiple apps at once on your system, you can use the `-c` option + +```shell +# only run one domain at a time +yarn test:e2e -c 1 +``` + +### Env Variables to Control Test Config + +Some helpers have been added to allow you to modify the playwright configuration on your own system without touching the playwright config file used by the test runner. + +| env var | Description | Default | +| ---------------------------- | -------------------------------------------- | ------------------ | +| PLAYWRIGHT_WEBSERVER_TIMEOUT | timeout for starting the Strapi server | 16000 (160s) | +| PLAYWRIGHT_ACTION_TIMEOUT | playwright action timeout (ie, click()) | 15000 (15s) | +| PLAYWRIGHT_EXPECT_TIMEOUT | playwright expect waitFor timeout | 10000 (10s) | +| PLAYWRIGHT_TIMEOUT | playwright timeout, for each individual test | 30000 (30s) | +| PLAYWRIGHT_OUTPUT_DIR | playwright output dir, such as trace files | '../test-results/' | +| PLAYWRIGHT_VIDEO | set 'true' to save videos on failed tests | false | + +## Strapi Templates + +The test-app you create uses a [template](https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/installation/templates.html) found at `e2e/app-template` in this folder we can store our premade content schemas & any customisations we may need such as other plugins / custom fields / endpoints etc. + +If you add anything to the template, be sure to add this information to [the docs](/testing/e2e/app-template). + +## Running tests with environment variables (needed to run EE tests) + +To set specific environment variables for your tests, a `.env` file can be created in the root of the e2e folder. This is useful if you need to run tests with a Strapi license or set future flags. + +## Running tests with future flags + +If you are writing tests for an unstable future feature you will need to add `app-template/config/features.js`. Currently the app template generation does not take the config folder into consideration. However, the run-e2e-tests script will apply the features config to the generated app. See the documentation for [features.js](https://docs.strapi.io/dev-docs/configurations/features#enabling-a-future-flag) + +## What is Playwright? + +Playwright enables reliable end-to-end testing for modern web apps. It's cross browser, cross platform and cross language. At Strapi we use it for Javascript automated testing. + +For more information check out their [docs](https://playwright.dev/docs/intro). If you're struggling with their APIs, then check out their specific [API documentation](https://playwright.dev/docs/api/class-playwright). + +## What makes a good end to end test? + +This is the million dollar question. E2E tests typically test complete user flows that touch numerous points of the application it's testing, we're not interested in what happens during a process, only the user perspective and end results. Consider writing them with your story hat on. E.g. "As a user I want to create a new entity, publish that entity, and then be able to retrieve its data from the content API". + +Our E2E test suite should _at minimum_ cover the core business flows of the product and this is lead by the QA defined set for this. Consult with your QA if you're not sure. diff --git a/Dockers/strapi/strapi/docs/docs/guides/e2e/01-app-template.md b/Dockers/strapi/strapi/docs/docs/guides/e2e/01-app-template.md new file mode 100644 index 0000000..1d6b2c7 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/guides/e2e/01-app-template.md @@ -0,0 +1,356 @@ +--- +title: App Template +tags: + - testing + - e2e + - template + - infrastructure +--- + +## Overview + +An app template has been created in `e2e/app-template` which provide some customizations and utilities to allow the tests to run. Note that if any changes are made to the app template, you will need to run `yarn test:e2e:clean` to update the test apps with the new template. + +Here you can read about what content schemas the test instance has & the API customisations we've built (incl. why we built them). + +## Update the app template + +:::info +The app template should be realistic and structured in a way an actual user might create an app using Strapi +::: + +To update the app template: + +- Run `yarn test:e2e clean` to remove existing test apps +- Run `yarn test:e2e -c=1 -- --ui` to generate a test app (don't run any tests) +- Follow the instructions to [import the existing data set](./02-data-transfer.md#importing-an-existing-data-packet) +- With the test app server running on 1337 you can now login to the app +- Make changes in the content-type builder +- Copy the generated files in the test app to the app template + +Once the app template is updated: + +- Run `yarn test:e2e clean` to remove existing test apps +- Run `yarn test:e2e -c=1 -- --ui` to generate a new test app using the updated template (don't run any tests) +- Follow the instructions to [import the existing data set](./02-data-transfer.md#importing-an-existing-data-packet) +- Follow the instructions to [export the updated data set](./02-data-transfer.md#exporting-an-updated-data-packet) + +## Content Schemas + +### Article + +```json +{ + // ... + "attributes": { + "title": { + "type": "string" + }, + "content": { + "type": "blocks" + }, + "authors": { + "type": "relation", + "relation": "manyToMany", + "target": "api::author.author", + "inversedBy": "articles" + } + } + // ... +} +``` + +### Author + +```json +{ + // ... + "attributes": { + "name": { + "type": "string" + }, + "profile": { + "allowedTypes": ["images", "files", "videos", "audios"], + "type": "media", + "multiple": false + }, + "articles": { + "type": "relation", + "relation": "manyToMany", + "target": "api::article.article", + "mappedBy": "authors" + } + } + // ... +} +``` + +### Homepage (Single Type) + +```json +{ + // ... + "attributes": { + "title": { + "type": "string" + }, + "content": { + "type": "blocks" + }, + "admin_user": { + "type": "relation", + "relation": "oneToOne", + "target": "admin::user" + }, + "seo": { + "type": "component", + "repeatable": false, + "component": "meta.seo" + } + } + // ... +} +``` + +### Product + +This collection type is internationalized. + +```json +{ + // ... + "attributes": { + "name": { + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "type": "string", + "required": true + }, + "slug": { + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "type": "uid", + "targetField": "name", + "required": true + }, + "isAvailable": { + "pluginOptions": { + "i18n": { + "localized": false + } + }, + "type": "boolean", + "default": true, + "required": true + }, + "description": { + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "type": "blocks" + }, + "images": { + "type": "media", + "multiple": true, + "required": false, + "allowedTypes": ["images", "files", "videos", "audios"], + "pluginOptions": { + "i18n": { + "localized": false + } + } + }, + "seo": { + "type": "component", + "repeatable": false, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "component": "meta.seo" + }, + "sku": { + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "type": "integer", + "unique": true + }, + "variations": { + "type": "component", + "repeatable": true, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "component": "product.variations" + } + } + // ... +} +``` + +### Match + +```json +{ + // ... + "attributes": { + "date": { + "type": "date" + }, + "kit_man": { + "type": "string" + }, + "opponent": { + "type": "string", + "required": true, + "regex": "^(?!.*richmond).*" + }, + "lineup": { + "type": "component", + "repeatable": true, + "component": "match.player" + }, + "most_valuable_player": { + "type": "component", + "repeatable": false, + "component": "match.player" + }, + "sections": { + "type": "dynamiczone", + "components": ["match.player", "product.variations"] + } + } + // ... +} +``` + +### Shop (Single Type) + +This single type is internationalized. + +```json +{ + // ... + "attributes": { + "title": { + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "type": "string", + "required": true + }, + "content": { + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "type": "dynamiczone", + "components": [ + "page-blocks.product-carousel", + "page-blocks.hero-image", + "page-blocks.content-and-image" + ], + "required": true, + "min": 2 + }, + "seo": { + "type": "component", + "repeatable": false, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "component": "meta.seo" + } + } + // ... +} +``` + +### Upcoming Match (Single Type) + +```json +{ + // ... + "attributes": { + "title": { + "type": "string" + }, + "number_of_upcoming_matches": { + "type": "integer" + }, + "next_match": { + "type": "date" + } + } + // ... +} +``` + +## API Customisations + +### Config + +found at `template/src/api/config` + +#### Rate Limit + +##### Usage + +```ts +async function toggleRateLimiting(page, enabled = true) { + await page.request.fetch('/api/config/ratelimit/enable', { + method: 'POST', + data: { value: enabled }, + }); +} +``` + +##### What does it do? + +This endpoint can be used to enable or disable the rate limitting middleware in +strapi. When enabled login requests for each user are limitted to 5 in 5 minutes. + +##### Why do we have it? + +There are cases where we disable the rate limit to test multiple incorrect login +attempts. + +#### Admin Auto Open + +##### Usage + +```ts + bootstrap({ strapi }) { + strapi.service('api::config.config').adminAutoOpenEnable(false); + }, +``` + +##### What does it do? + +This endpoint can be used to enable or disable admin auto open. + +##### Why do we have it? + +It can be frustrating to work with the e2e tests locally. If auto open is set to +true a browser window will open each time you run the e2e tests as the strapi +app starts for the first time. Because of this we disable it during the +bootstrap phase of the test app instance. diff --git a/Dockers/strapi/strapi/docs/docs/guides/e2e/02-data-transfer.md b/Dockers/strapi/strapi/docs/docs/guides/e2e/02-data-transfer.md new file mode 100644 index 0000000..81d20f4 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/guides/e2e/02-data-transfer.md @@ -0,0 +1,96 @@ +--- +title: Data Transfer +tags: + - testing + - e2e + - data-transfer + - infrastructure +--- + +## Overview + +This document explains how and why we use `@strapi/data-transfer` as means to reset and seed the database for end-to-end tests. It is not a comprehensive explanation of how to use `@strapi/data-transfer`. See the [Strapi documentation](https://docs.strapi.io/developer-docs/latest/developer-resources/data-management.html) to learn more about the feature. + +### Why use Data Transfer? + +We could use custom API endpoints of the application, and whilst this isn't a poor solution, it would _most likely_ require some code writing to set up the data for the schema entries. However, in `4.6.0` Strapi released the `DTS` feature (DTS – Data Transfer System). This means any member of Strapi can export the data of their instance producing a `.tar` that we can then import programatically restoring the database to this point in time and ensuring a "pure" test environment. + +### Limitations of Data Transfer + +The main limitation with data transfer is we cannot version or review changes to the data. Making changes to the data set should be done with care since it is quite easy to export data with unknown changes to the database that could impact other tests. + +## Updating data for tests + +Each test should be isolated and not depend on another test. Data changes from one test should not leak into another test. For example, if you create a new entry for a content-type in one test case, it should not be present in the next test case. This makes tests more stable and easier to debug. + +### The data transfer engine + +Since the Strapi CLI will use `@strapi/data-transfer` directly it will by default not import or export admin users, API tokens, or any other features that have been included in its exclusion list. + +For this reason, do NOT use the import or export command on the strapi test instance. A DTS engine has been created specifically for our tests cases. This allows us to redefine what should be included in the import or export for our tests. The scripts can be found in `tests/e2e/scripts/dts-import.ts` and `tests/e2e/scripts/dts-export.ts`. + +### Importing an existing data packet + +When you need to update the data packet for a new test, you will first need a Strapi app with the data currently used in end-to-end tests. + +When running the `yarn test:e2e` command, test app instances are created in `test-apps/e2e/test-app-{n}`. You can use one of the these apps to update the data. + +Navigate to one of the test-apps and run `yarn install && yarn develop` + +Leave the development server running, and then run the following command to reset and seed the database with the current e2e data packet. The script expects the name of the data packet you want to import found in `tests/e2e/data`. + +```shell +STRAPI_LICENSE= npx ts-node /dts-import.ts with-admin.tar +``` + +This script will include admin users and all the content-types specificed in `tests/e2e/constants.ts` + +You should be able to login with the test app instance credentials. + +| Email | Password | +| ---------------- | ----------- | +| test@testing.com | Testing123! | + +Now that you have a Strapi instance with the same data that each e2e starts with, you can modify the data in the CMS to prepare for a new data export. + +> **Note:** If you change any of the content schemas (including adding new ones) be sure to [update the `app-template`](./01-app-template.md) otherwise DTS will fail to import the data for schemas that do not exist. + +### Exporting an updated data packet + +Once you've created your new data from the test instance, you'll need to export it so it can be used in the end-to-end tests. + +Be sure to include the content types you would like exported in the `ALLOWED_CONTENT_TYPES` array found in `tests/e2e/constants.js`. + +The script accepts the backup destination filename as an argument. Run it from the directory of the strapi instance you created earlier based on the test-app template. + +```shell +npx ts-node /dts-export.ts updated-data-packet +``` + +If you are exporting data for an EE feature you will need to run the script with the `STRAPI_LICENSE` env + +```shell +STRAPI_LICENSE= npx ts-node /dts-export.ts updated-data-packet +``` + +The script will create a file `updated-data-packet.tar`. You can copy this file over to `tests/e2e/data` so it can be used in the appropriate tests. + +### Importing the data packet in test scenarios + +There's an abstraction for importing the data programmatically during tests named `resetDatabaseAndImportDataFromPath` found in `tests/e2e/utils/dts-import.ts`. Typically, you'll want to run this **before** each test: + +```ts +import { test } from '@playwright/test'; +import { resetDatabaseAndImportDataFromPath } from './utils/dts-import'; + +test.describe('Strapi Application', () => { + test.beforeEach(async ({ page }) => { + await resetDatabaseAndImportDataFromPath('backup.tar'); + await page.goto('/admin'); + }); + + test('a user should be able to...', async ({ page }) => { + // my test + }); +}); +``` diff --git a/Dockers/strapi/strapi/docs/docs/guides/e2e/_category_.json b/Dockers/strapi/strapi/docs/docs/guides/e2e/_category_.json new file mode 100644 index 0000000..3ae2cb0 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/guides/e2e/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "E2E Testing", + "collapsible": true, + "collapsed": false +} diff --git a/Dockers/strapi/strapi/docs/docs/index.md b/Dockers/strapi/strapi/docs/docs/index.md new file mode 100644 index 0000000..ec454d4 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/index.md @@ -0,0 +1,45 @@ +--- +sidebar_position: 1 +sidebar_label: Introduction +--- + +# Strapi contributor documentation + +Welcome to the Strapi Contributor documentation. + +:::caution +No single Strapi squad “owns” the contributor documentation, it's a collective effort. +::: + +This documentation site is a constant WIP so please, continue to add and improve these docs. These are not “user-facing” docs, +they're related directly to the codebase for both internal and external engineers written with that in mind they explain +technical concepts but also hold documentation for hooks, utils etc. + +If you don’t plan to make any contributions to [strapi/strapi](https://github.com/strapi/strapi), you probably shouldn’t read and use the present documentation, and [docs.strapi.io](https://docs.strapi.io) might be a better fit for your use case. + +## Structure + +The general layout focusses on 4 key areas: + +### Guides + +This is where you'll probably want to start off. We have our contributing guides & code of conduct which are very important to read. There are also useful guides on common situations whilst developing such as ["Working with the Design System"](/guides/working-with-the-design-system) and higher-level guides such as best practices for frontend development (coming soon). + +### Docs + +Within the docs section we have a multitude of both technical and conceptual documentation diving deep into particular parts of the Strapi monorepo that may not make as much sense as just reading the code, like ["Relations reordering in the database"](/docs/core/database/relations/reordering). There's also usage documentation for various pieces of code such as the [useDragAndDrop](/docs/core/content-manager/hooks/use-drag-and-drop) hook. + +### API Reference + +An advanced deep dive into some of the core driving classes of Strapi with explanations on the methods & parameters available on commonly exposed classes as well as examples to compliment them for easier understanding. + +### RFCs + +A growing section we intend to populate over time with public-facing RFCs once approved to maintain as a record. These assist in understanding the design direction of features and code to understand the contextual "whys" that may not be apparent. + +## When should you add content? + +Content should be added typically when you add any new feature – especially enterprise e.g. +`Review Workflows` and also when you add new code other engineers may find another use for e.g. a +new hook. There's no guidelines on what to add vs what not to add, as defined above we add a variety +of material to help onboard contributers. diff --git a/Dockers/strapi/strapi/docs/docs/rfcs/00-intro.md b/Dockers/strapi/strapi/docs/docs/rfcs/00-intro.md new file mode 100644 index 0000000..242306c --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/rfcs/00-intro.md @@ -0,0 +1,5 @@ +--- +title: Introduction +--- + +This section of the contributor docs is a collection of public facing RFCs. diff --git a/Dockers/strapi/strapi/docs/docs/rfcs/01-custom-fields.md b/Dockers/strapi/strapi/docs/docs/rfcs/01-custom-fields.md new file mode 100644 index 0000000..54528b3 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/rfcs/01-custom-fields.md @@ -0,0 +1,60 @@ +--- +title: Custom fields +tags: + - content-type-builder + - plugins +--- + +# Custom fields + +## Summary + +Custom fields provide a way to replace the inputs of existing Strapi types to improve the content editing experience. + +## Detailed design + +A custom field needs to be registered in both the admin and server. + +### Server + +To register a custom field on the server, see [documentation](https://docs.strapi.io/developer-docs/latest/development/custom-fields.html#registering-a-custom-field-on-the-server). + +The custom field will be added to Strapi during the server [register lifecycle](https://docs.strapi.io/developer-docs/latest/developer-resources/plugin-api-reference/server.html#register). + +The `type: customField` saved on the schema.json for a content-type or component is converted to the underlying Strapi data type by calling the [convertCustomFieldType function](https://github.com/strapi/strapi/blob/a8f807d27ebc9c8b9b335e885154a06c60a896ae/packages/core/strapi/lib/Strapi.js#L395) as soon as the app starts during the `register` lifecycle, right after all custom fields have been loaded. + +### Admin + +To register a custom field to the admin panel, see [documentation](https://docs.strapi.io/developer-docs/latest/development/custom-fields.html#registering-a-custom-field-in-the-admin-panel). + +A custom field being saved on a content-type or component will have it’s underlying data type converted from the underlying data type to `type: customField` just before save in the [formatAttributes function](https://github.com/strapi/strapi/blob/33debd57010667a3fc5dfa343a673206cfb956e1/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/cleanData.js#L97-L100) of the `cleanData` util + +### Packaging + +A custom field can be registered in either a Strapi application or Strapi plugin. However, they can only be shared through plugins by publishing the package on npm. + +### Example + +- [Color Picker](https://github.com/strapi/strapi/blob/main/packages/plugins/color-picker/) +- [Shopify plugin](https://github.com/WalkingPizza/strapi-plugin-shopify-fields/) + +## Tradeoffs + +- We do not yet offer the ability to create a custom database type in Strapi. +- When extending a custom field’s base and advanced forms in the Content-type Builder, it is not yet possible to import custom input components. +- We do not allow custom fields to use the relation, component, dynamic zone and media types. + +## Alternatives + +We consider making special packages for Custom fields but : + +- Custom fields would not have been able to access other features from the plugin API. While that is not always required, it also enables custom fields that do need it to implement more advanced behaviors. For example, a custom field can also use injection zones if needed. +- Introducing a new custom field type of package would have required a new loader in Strapi, and a new section and review processes on the marketplace, which would have made the feature more complex to ship. +- The overkill aspect of the plugin API for a simple custom field could be mitigated by adding a new plugin generator that only created the files required for a custom field. + +## Resources + +- [Custom Fields page](https://strapi.io/custom-fields) +- [Docs](https://docs.strapi.io/developer-docs/latest/development/custom-fields.html) +- [non-technical RFC](https://github.com/strapi/rfcs/pull/40) +- [technical RFC](https://github.com/strapi/rfcs/pull/42) diff --git a/Dockers/strapi/strapi/docs/docs/rfcs/example.md b/Dockers/strapi/strapi/docs/docs/rfcs/example.md new file mode 100644 index 0000000..7b92655 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docs/rfcs/example.md @@ -0,0 +1,42 @@ +--- +title: RFC Example Doc +description: Short description +tags: + - content-manager +--- + +# RFC Example Doc + +Interested in submitting your own public RFC? Use this template as your basis but feel free to expand on it should your needs require it. + +--- + +## Summary + +_Description of the software system / component._ + +## Detailed design + +- _Explaining the software design and reasoning._ +- _Api specifications._ +- _Benchmarks_ +- _Add necessary diagrams and code examples._ +- _Think about edge-cases and include examples._ + +## Tradeoffs + +_What potential tradeoffs are involved with this system/implementation._ + +- _Complexity._ +- _Limitations of the feature itself._ +- _How does this proposal integrate with the current features implemented._ + +## Alternatives + +_What other approaches did we consider?_ + +## Resources + +- _Link to product documents._ +- _Link to user documentation._ +- _Any useful research used for it_ diff --git a/Dockers/strapi/strapi/docs/docusaurus.config.js b/Dockers/strapi/strapi/docs/docusaurus.config.js new file mode 100644 index 0000000..4316480 --- /dev/null +++ b/Dockers/strapi/strapi/docs/docusaurus.config.js @@ -0,0 +1,130 @@ +// @ts-check +// Note: type annotations allow type checking and IDEs autocompletion +const path = require('path'); +const { + themes: { github: lightCodeTheme, dracula: darkCodeTheme }, +} = require('prism-react-renderer'); + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: 'Doc', + tagline: 'Dinosaurs are cool', + url: 'https://contributor.strapi.io', + baseUrl: '/', + onBrokenLinks: 'warn', + onBrokenMarkdownLinks: 'warn', + favicon: 'img/favicon.png', + organizationName: 'strapi', + projectName: 'strapi', + trailingSlash: false, + themes: ['@docusaurus/theme-mermaid'], + + // Even if you don't use internalization, 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'], + }, + markdown: { + mermaid: true, + }, + plugins: [ + () => ({ + name: 'resolve-react', + configureWebpack() { + return { + resolve: { + alias: { + react: path.resolve(__dirname, './node_modules/react'), + }, + }, + }; + }, + }), + [ + 'docusaurus-plugin-typedoc', + // Plugin / TypeDoc options + { + entryPoints: ['../packages/core/strapi/src/admin.ts'], + tsconfig: '../packages/core/strapi/tsconfig.build.json', + entryDocument: null, + out: 'exports', + watch: process.env.TYPEDOC_WATCH, + }, + ], + [ + '@cmfcmf/docusaurus-search-local', + { + indexBlog: false, + }, + ], + ], + presets: [ + [ + 'classic', + /** @type {import('@docusaurus/preset-classic').Options} */ + { + docs: { + routeBasePath: '/', + sidebarPath: require.resolve('./sidebars.js'), + editUrl: 'https://github.com/strapi/strapi/tree/main/docs/', + }, + blog: false, + }, + ], + ], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + { + navbar: { + title: 'Contributor documentation', + hideOnScroll: true, + logo: { + alt: 'Doc', + src: 'img/logo.svg', + srcDark: 'img/logo_dark.svg', + width: 100, + }, + items: [ + { + type: 'docSidebar', + position: 'left', + sidebarId: 'guides', + label: 'Guides', + }, + { + type: 'docSidebar', + position: 'left', + sidebarId: 'docs', + label: 'Docs', + }, + { + type: 'docSidebar', + position: 'left', + sidebarId: 'api', + label: 'API Reference', + }, + { + type: 'docSidebar', + position: 'left', + sidebarId: 'exports', + label: 'Exports', + }, + { + type: 'docSidebar', + position: 'left', + sidebarId: 'rfcs', + label: 'RFCs', + }, + ], + }, + prism: { + theme: lightCodeTheme, + darkTheme: darkCodeTheme, + }, + }, +}; + +module.exports = config; diff --git a/Dockers/strapi/strapi/docs/package.json b/Dockers/strapi/strapi/docs/package.json new file mode 100644 index 0000000..f53bea0 --- /dev/null +++ b/Dockers/strapi/strapi/docs/package.json @@ -0,0 +1,51 @@ +{ + "name": "docs", + "version": "0.0.0", + "private": true, + "scripts": { + "build": "docusaurus build", + "clear": "docusaurus clear", + "deploy": "docusaurus deploy", + "docusaurus": "docusaurus", + "serve": "docusaurus serve", + "start": "TYPEDOC_WATCH=true docusaurus start", + "swizzle": "docusaurus swizzle", + "write-heading-ids": "docusaurus write-heading-ids", + "write-translations": "docusaurus write-translations" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "resolutions": { + "@babel/helpers": "7.27.0", + "@babel/runtime": "7.26.10", + "@babel/runtime-corejs3": "7.26.10" + }, + "dependencies": { + "@cmfcmf/docusaurus-search-local": "1.1.0", + "@docusaurus/core": "3.8.1", + "@docusaurus/preset-classic": "3.8.1", + "@docusaurus/theme-mermaid": "3.8.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^1.1.1", + "prism-react-renderer": "^2.4.1", + "react": "18.3.0", + "react-dom": "18.3.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.8.1", + "docusaurus-plugin-typedoc": "0.22.0", + "typedoc": "0.25.9", + "typedoc-plugin-markdown": "3.17.1", + "typescript": "5.3.3" + } +} diff --git a/Dockers/strapi/strapi/docs/sidebars.js b/Dockers/strapi/strapi/docs/sidebars.js new file mode 100644 index 0000000..0b92881 --- /dev/null +++ b/Dockers/strapi/strapi/docs/sidebars.js @@ -0,0 +1,24 @@ +/** + * 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 + docs: [{ type: 'autogenerated', dirName: 'docs' }], + api: [{ type: 'autogenerated', dirName: 'api' }], + exports: [{ type: 'autogenerated', dirName: 'exports' }], + guides: [{ type: 'autogenerated', dirName: 'guides' }], + rfcs: [{ type: 'autogenerated', dirName: 'rfcs' }], +}; + +module.exports = sidebars; diff --git a/Dockers/strapi/strapi/database/migrations/.gitkeep b/Dockers/strapi/strapi/docs/static/.nojekyll similarity index 100% rename from Dockers/strapi/strapi/database/migrations/.gitkeep rename to Dockers/strapi/strapi/docs/static/.nojekyll diff --git a/Dockers/strapi/strapi/docs/static/img/content-manager/content-releases/scheduling-publish.png b/Dockers/strapi/strapi/docs/static/img/content-manager/content-releases/scheduling-publish.png new file mode 100644 index 0000000..365eb12 Binary files /dev/null and b/Dockers/strapi/strapi/docs/static/img/content-manager/content-releases/scheduling-publish.png differ diff --git a/Dockers/strapi/strapi/docs/static/img/content-manager/relations/component-example.png b/Dockers/strapi/strapi/docs/static/img/content-manager/relations/component-example.png new file mode 100644 index 0000000..71630c2 Binary files /dev/null and b/Dockers/strapi/strapi/docs/static/img/content-manager/relations/component-example.png differ diff --git a/Dockers/strapi/strapi/docs/static/img/content-manager/relations/relations-statemanagemen-diagram.png b/Dockers/strapi/strapi/docs/static/img/content-manager/relations/relations-statemanagemen-diagram.png new file mode 100644 index 0000000..7092b51 Binary files /dev/null and b/Dockers/strapi/strapi/docs/static/img/content-manager/relations/relations-statemanagemen-diagram.png differ diff --git a/Dockers/strapi/strapi/docs/static/img/database/m2m-example.png b/Dockers/strapi/strapi/docs/static/img/database/m2m-example.png new file mode 100644 index 0000000..506114e Binary files /dev/null and b/Dockers/strapi/strapi/docs/static/img/database/m2m-example.png differ diff --git a/Dockers/strapi/strapi/docs/static/img/database/migration-flow.png b/Dockers/strapi/strapi/docs/static/img/database/migration-flow.png new file mode 100644 index 0000000..0bb2651 Binary files /dev/null and b/Dockers/strapi/strapi/docs/static/img/database/migration-flow.png differ diff --git a/Dockers/strapi/strapi/docs/static/img/database/mw-example.png b/Dockers/strapi/strapi/docs/static/img/database/mw-example.png new file mode 100644 index 0000000..62b410e Binary files /dev/null and b/Dockers/strapi/strapi/docs/static/img/database/mw-example.png differ diff --git a/Dockers/strapi/strapi/docs/static/img/database/o2o-example.png b/Dockers/strapi/strapi/docs/static/img/database/o2o-example.png new file mode 100644 index 0000000..18aa545 Binary files /dev/null and b/Dockers/strapi/strapi/docs/static/img/database/o2o-example.png differ diff --git a/Dockers/strapi/strapi/docs/static/img/database/reordering-algo-1.png b/Dockers/strapi/strapi/docs/static/img/database/reordering-algo-1.png new file mode 100644 index 0000000..298122e Binary files /dev/null and b/Dockers/strapi/strapi/docs/static/img/database/reordering-algo-1.png differ diff --git a/Dockers/strapi/strapi/docs/static/img/database/reordering-algo-2.png b/Dockers/strapi/strapi/docs/static/img/database/reordering-algo-2.png new file mode 100644 index 0000000..6354e1e Binary files /dev/null and b/Dockers/strapi/strapi/docs/static/img/database/reordering-algo-2.png differ diff --git a/Dockers/strapi/strapi/docs/static/img/database/reordering.png b/Dockers/strapi/strapi/docs/static/img/database/reordering.png new file mode 100644 index 0000000..adfcbf3 Binary files /dev/null and b/Dockers/strapi/strapi/docs/static/img/database/reordering.png differ diff --git a/Dockers/strapi/strapi/docs/static/img/guides/fe-guidelines/caniuse-example.png b/Dockers/strapi/strapi/docs/static/img/guides/fe-guidelines/caniuse-example.png new file mode 100644 index 0000000..36c7db2 Binary files /dev/null and b/Dockers/strapi/strapi/docs/static/img/guides/fe-guidelines/caniuse-example.png differ diff --git a/Dockers/strapi/strapi/docs/static/img/logo.svg b/Dockers/strapi/strapi/docs/static/img/logo.svg new file mode 100644 index 0000000..83aaf96 --- /dev/null +++ b/Dockers/strapi/strapi/docs/static/img/logo.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Dockers/strapi/strapi/docs/static/img/logo_dark.svg b/Dockers/strapi/strapi/docs/static/img/logo_dark.svg new file mode 100644 index 0000000..e6d63e2 --- /dev/null +++ b/Dockers/strapi/strapi/docs/static/img/logo_dark.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Dockers/strapi/strapi/docs/static/img/permissions/permissions-into-app.png b/Dockers/strapi/strapi/docs/static/img/permissions/permissions-into-app.png new file mode 100644 index 0000000..ba83b48 Binary files /dev/null and b/Dockers/strapi/strapi/docs/static/img/permissions/permissions-into-app.png differ diff --git a/Dockers/strapi/strapi/docs/static/img/permissions/rbac-edit-page.png b/Dockers/strapi/strapi/docs/static/img/permissions/rbac-edit-page.png new file mode 100644 index 0000000..432a479 Binary files /dev/null and b/Dockers/strapi/strapi/docs/static/img/permissions/rbac-edit-page.png differ diff --git a/Dockers/strapi/strapi/docs/static/img/utils/event-hub-diagram.png b/Dockers/strapi/strapi/docs/static/img/utils/event-hub-diagram.png new file mode 100644 index 0000000..83b2c71 Binary files /dev/null and b/Dockers/strapi/strapi/docs/static/img/utils/event-hub-diagram.png differ diff --git a/Dockers/strapi/strapi/docs/yarn.lock b/Dockers/strapi/strapi/docs/yarn.lock new file mode 100644 index 0000000..bb52feb --- /dev/null +++ b/Dockers/strapi/strapi/docs/yarn.lock @@ -0,0 +1,15781 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"@algolia/autocomplete-core@npm:1.17.0": + version: 1.17.0 + resolution: "@algolia/autocomplete-core@npm:1.17.0" + dependencies: + "@algolia/autocomplete-plugin-algolia-insights": "npm:1.17.0" + "@algolia/autocomplete-shared": "npm:1.17.0" + checksum: 10c0/0759f26839609ca3f319c1601c3743f5c9e26efccacf246e8cda6dfe2d8b9190a6d764c74a6f2b3768ff44dcd121627f5f0b8df2d77abfb350a003724084b3c3 + languageName: node + linkType: hard + +"@algolia/autocomplete-core@npm:1.17.9": + version: 1.17.9 + resolution: "@algolia/autocomplete-core@npm:1.17.9" + dependencies: + "@algolia/autocomplete-plugin-algolia-insights": "npm:1.17.9" + "@algolia/autocomplete-shared": "npm:1.17.9" + checksum: 10c0/e1111769a8723b9dd45fc38cd7edc535c86c1f908b84b5fdc5de06ba6b8c7aca14e5f52ebce84fa5f7adf857332e396b93b7e7933b157b2c9aefc0a19d9574ab + languageName: node + linkType: hard + +"@algolia/autocomplete-js@npm:^1.8.2": + version: 1.17.0 + resolution: "@algolia/autocomplete-js@npm:1.17.0" + dependencies: + "@algolia/autocomplete-core": "npm:1.17.0" + "@algolia/autocomplete-preset-algolia": "npm:1.17.0" + "@algolia/autocomplete-shared": "npm:1.17.0" + htm: "npm:^3.1.1" + preact: "npm:^10.13.2" + peerDependencies: + "@algolia/client-search": ">= 4.5.1 < 6" + algoliasearch: ">= 4.9.1 < 6" + checksum: 10c0/993a8c6cc75417899b7b6521ca226dd941fdb021ef2f68239c115ca545d8cbbf4c1638027a8cb17ea3929091d8a82fa8a40c9568a2ccac526f30def8ae6b81ba + languageName: node + linkType: hard + +"@algolia/autocomplete-plugin-algolia-insights@npm:1.17.0": + version: 1.17.0 + resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.17.0" + dependencies: + "@algolia/autocomplete-shared": "npm:1.17.0" + peerDependencies: + search-insights: ">= 1 < 3" + checksum: 10c0/0e568e999a7973dab34d4784cd780ce6b96cf016bc1a20ef849bed7e0519ae9d8b4b4e0a4e5cd4da6c4af2acc122a1f65e0e329bff29fbe7446d6164d6e14732 + languageName: node + linkType: hard + +"@algolia/autocomplete-plugin-algolia-insights@npm:1.17.9": + version: 1.17.9 + resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.17.9" + dependencies: + "@algolia/autocomplete-shared": "npm:1.17.9" + peerDependencies: + search-insights: ">= 1 < 3" + checksum: 10c0/05c21502631643abdcd6e9f70b5814a60d34bad59bca501e26e030fd72e689be5cecfb6e8939a0a1bdcb2394591e55e26a42a82c7247528eafeff714db0819a4 + languageName: node + linkType: hard + +"@algolia/autocomplete-preset-algolia@npm:1.17.0": + version: 1.17.0 + resolution: "@algolia/autocomplete-preset-algolia@npm:1.17.0" + dependencies: + "@algolia/autocomplete-shared": "npm:1.17.0" + peerDependencies: + "@algolia/client-search": ">= 4.9.1 < 6" + algoliasearch: ">= 4.9.1 < 6" + checksum: 10c0/cd4970d7b7a60da41349b6713a5b7b07e5744e9fe910f866cc973546db5c1a8156a6f188f6a37ac1b37132f73b6e1c0b32adfc750b6520ac387e6ca34d4efb52 + languageName: node + linkType: hard + +"@algolia/autocomplete-preset-algolia@npm:1.17.9": + version: 1.17.9 + resolution: "@algolia/autocomplete-preset-algolia@npm:1.17.9" + dependencies: + "@algolia/autocomplete-shared": "npm:1.17.9" + peerDependencies: + "@algolia/client-search": ">= 4.9.1 < 6" + algoliasearch: ">= 4.9.1 < 6" + checksum: 10c0/99159c7e02a927d0d96717cb4cfd2f8dbc4da73267a8eae4f83af5bf74087089f6e7dbffd316512e713a4cc534e936b6a7ccb5c4a5ff84b4bf73f2d3cc050e79 + languageName: node + linkType: hard + +"@algolia/autocomplete-shared@npm:1.17.0": + version: 1.17.0 + resolution: "@algolia/autocomplete-shared@npm:1.17.0" + peerDependencies: + "@algolia/client-search": ">= 4.9.1 < 6" + algoliasearch: ">= 4.9.1 < 6" + checksum: 10c0/9a4b97d7232cd6a931e70f60f00c1d1bd36cace37c3f42ac6d58dd3fc4038185d4ef38a3e34aa409d8e9c81df34535d14a0d7353fbfd036f090905ff7083996f + languageName: node + linkType: hard + +"@algolia/autocomplete-shared@npm:1.17.9": + version: 1.17.9 + resolution: "@algolia/autocomplete-shared@npm:1.17.9" + peerDependencies: + "@algolia/client-search": ">= 4.9.1 < 6" + algoliasearch: ">= 4.9.1 < 6" + checksum: 10c0/b318281aecdaae09171b47ee4f7bc66b613852cad4506e9d6278fff35ba68a12dd9cce2d90b5f4c3ba0e3d7d780583cbe46b22275260e41bbf09fb01e4a18f49 + languageName: node + linkType: hard + +"@algolia/autocomplete-theme-classic@npm:^1.8.2": + version: 1.17.0 + resolution: "@algolia/autocomplete-theme-classic@npm:1.17.0" + checksum: 10c0/ed156d8c85748c75b06d165785704b7c5aa5bb01da64418682793072212a9356422e501a9d91af9cd8fd06252940833cade3fdc9d1ba4af8f886486095101349 + languageName: node + linkType: hard + +"@algolia/cache-browser-local-storage@npm:4.23.2": + version: 4.23.2 + resolution: "@algolia/cache-browser-local-storage@npm:4.23.2" + dependencies: + "@algolia/cache-common": "npm:4.23.2" + checksum: 10c0/e9d4a5da6851428724c9e8598273d5dd9ca386d8f1f5029463e7208e215eb73ef41bb6ea405bef7e9b1b518df50ed3c266640d5ddfd0da0e76e9b52c0e515fdf + languageName: node + linkType: hard + +"@algolia/cache-common@npm:4.23.2": + version: 4.23.2 + resolution: "@algolia/cache-common@npm:4.23.2" + checksum: 10c0/5a0c2f05b4bde1e4c0362f9b5794542b47f38a8fd8982c30e8e7ab1c0c7687dba4bd36d78bc7e95ad3557b1a1d0bb5f22470920823aae61ff18afa3f693fe9e9 + languageName: node + linkType: hard + +"@algolia/cache-in-memory@npm:4.23.2": + version: 4.23.2 + resolution: "@algolia/cache-in-memory@npm:4.23.2" + dependencies: + "@algolia/cache-common": "npm:4.23.2" + checksum: 10c0/07ea7f96b3e5280133db2d1a06d357d71439f5e71f5cdef9159ff872c0adecae7fe2a1a5b9ea207e2659fe1ec50a65620f07b0ef5f093cefa2025c3905b69b1c + languageName: node + linkType: hard + +"@algolia/client-abtesting@npm:5.20.4": + version: 5.20.4 + resolution: "@algolia/client-abtesting@npm:5.20.4" + dependencies: + "@algolia/client-common": "npm:5.20.4" + "@algolia/requester-browser-xhr": "npm:5.20.4" + "@algolia/requester-fetch": "npm:5.20.4" + "@algolia/requester-node-http": "npm:5.20.4" + checksum: 10c0/863dd249448d7e4efe5d2825d80c2f52127717c6aa0e1566fdb402b734d7fc5ba6e551b530f55cf9cd333ab6470b8c9f8e59f7041a7bf4b4cbc4667caebce6ea + languageName: node + linkType: hard + +"@algolia/client-account@npm:4.23.2": + version: 4.23.2 + resolution: "@algolia/client-account@npm:4.23.2" + dependencies: + "@algolia/client-common": "npm:4.23.2" + "@algolia/client-search": "npm:4.23.2" + "@algolia/transporter": "npm:4.23.2" + checksum: 10c0/47498edb81019888abf044c4bc40cdee951bd15e33bafbfe1764481d6825a106d589887725ea0c89b6a3deb70272cfc2fbafbf1c53f064b1f7eb2cd1059018df + languageName: node + linkType: hard + +"@algolia/client-analytics@npm:4.23.2": + version: 4.23.2 + resolution: "@algolia/client-analytics@npm:4.23.2" + dependencies: + "@algolia/client-common": "npm:4.23.2" + "@algolia/client-search": "npm:4.23.2" + "@algolia/requester-common": "npm:4.23.2" + "@algolia/transporter": "npm:4.23.2" + checksum: 10c0/205027e2aef61820ce4c2a01113d4dc3674d81f90923344cd1fbe51fe8148776dde920a396661e2e5fc3cd883e609d3695259bc985016297c3ddf89ca99040f1 + languageName: node + linkType: hard + +"@algolia/client-analytics@npm:5.20.4": + version: 5.20.4 + resolution: "@algolia/client-analytics@npm:5.20.4" + dependencies: + "@algolia/client-common": "npm:5.20.4" + "@algolia/requester-browser-xhr": "npm:5.20.4" + "@algolia/requester-fetch": "npm:5.20.4" + "@algolia/requester-node-http": "npm:5.20.4" + checksum: 10c0/aa1058713e623e2818510685fe0a8a76cf5fe0459f5c2e2a7a10a73bba5a6d3ab1175751adda96abec1b6e67cbeec82b7e1ef1a1d3ddadd61dac58c91e7adc3e + languageName: node + linkType: hard + +"@algolia/client-common@npm:4.23.2": + version: 4.23.2 + resolution: "@algolia/client-common@npm:4.23.2" + dependencies: + "@algolia/requester-common": "npm:4.23.2" + "@algolia/transporter": "npm:4.23.2" + checksum: 10c0/d497c3d0bb83f991837c75128db147f31ffbb0034040bb2a97c3e22e0d30994a585dfc045bd6355a28e689caa110dd91bcdb52d4d74e133f7c0179014eb051ad + languageName: node + linkType: hard + +"@algolia/client-common@npm:5.20.4": + version: 5.20.4 + resolution: "@algolia/client-common@npm:5.20.4" + checksum: 10c0/2bfb1f6de7abefc511e11d20748ec05e8e3c3d1ca50aa5fb2dab8b44ff70e03ec83351836edb07be1ce932898d2b28072c0eee5538a90fbddd66652be4a78dea + languageName: node + linkType: hard + +"@algolia/client-insights@npm:5.20.4": + version: 5.20.4 + resolution: "@algolia/client-insights@npm:5.20.4" + dependencies: + "@algolia/client-common": "npm:5.20.4" + "@algolia/requester-browser-xhr": "npm:5.20.4" + "@algolia/requester-fetch": "npm:5.20.4" + "@algolia/requester-node-http": "npm:5.20.4" + checksum: 10c0/5c4161f0efd5eea29f23c92e58438350ce3e189403a50a30150fbfb807f7ee72a1d1d230aef8f595da4d986a4ff2822d53e7af6a27611b787a8d7fdec66f79d7 + languageName: node + linkType: hard + +"@algolia/client-personalization@npm:4.23.2": + version: 4.23.2 + resolution: "@algolia/client-personalization@npm:4.23.2" + dependencies: + "@algolia/client-common": "npm:4.23.2" + "@algolia/requester-common": "npm:4.23.2" + "@algolia/transporter": "npm:4.23.2" + checksum: 10c0/92afaf022a004b7c5d9d6e4e218862646b80a3b0d5a79e655a20650d272a24f058a5f2975db52ccd6d2dc87ed80fd2194e983249e602fdd8a6ad12023e6c925a + languageName: node + linkType: hard + +"@algolia/client-personalization@npm:5.20.4": + version: 5.20.4 + resolution: "@algolia/client-personalization@npm:5.20.4" + dependencies: + "@algolia/client-common": "npm:5.20.4" + "@algolia/requester-browser-xhr": "npm:5.20.4" + "@algolia/requester-fetch": "npm:5.20.4" + "@algolia/requester-node-http": "npm:5.20.4" + checksum: 10c0/68eef627e51a4c348229443c47177c89adc14b4fe31e4660dddcdb5bc5c7a824507aa6bfe52659ce523b94c4aae06ff7f49b2e0678536db26b4f793c260d1cd9 + languageName: node + linkType: hard + +"@algolia/client-query-suggestions@npm:5.20.4": + version: 5.20.4 + resolution: "@algolia/client-query-suggestions@npm:5.20.4" + dependencies: + "@algolia/client-common": "npm:5.20.4" + "@algolia/requester-browser-xhr": "npm:5.20.4" + "@algolia/requester-fetch": "npm:5.20.4" + "@algolia/requester-node-http": "npm:5.20.4" + checksum: 10c0/3c16cd3451fc1b24023438e9a9e43d5313f877c47404a92cac0012f96ffc88545ba55ed44dcc559dcde9a0e91b649a7936fec805483fc04065e0e38ccd48ad80 + languageName: node + linkType: hard + +"@algolia/client-search@npm:4.23.2, @algolia/client-search@npm:^4.12.0": + version: 4.23.2 + resolution: "@algolia/client-search@npm:4.23.2" + dependencies: + "@algolia/client-common": "npm:4.23.2" + "@algolia/requester-common": "npm:4.23.2" + "@algolia/transporter": "npm:4.23.2" + checksum: 10c0/d5841ed65c180e1b27c5ef73b2502a361b1ce730f229c6793ee6ebe7c2412ef7ce3bdbacb7db3beb5601b3d7dcf37b6e8a8fb47aebe66740d4eccb1056372388 + languageName: node + linkType: hard + +"@algolia/client-search@npm:5.20.4": + version: 5.20.4 + resolution: "@algolia/client-search@npm:5.20.4" + dependencies: + "@algolia/client-common": "npm:5.20.4" + "@algolia/requester-browser-xhr": "npm:5.20.4" + "@algolia/requester-fetch": "npm:5.20.4" + "@algolia/requester-node-http": "npm:5.20.4" + checksum: 10c0/1f5ca99c7375db75fa5ae520dad5eec4c0ef991f767788d4b75866ee745c27a21ecb720a43a8754736b26ff5e2e3b8fdf001a357e6b25b2784bf86510584c56a + languageName: node + linkType: hard + +"@algolia/events@npm:^4.0.1": + version: 4.0.1 + resolution: "@algolia/events@npm:4.0.1" + checksum: 10c0/f398d815c6ed21ac08f6caadf1e9155add74ac05d99430191c3b1f1335fd91deaf468c6b304e6225c9885d3d44c06037c53def101e33d9c22daff175b2a65ca9 + languageName: node + linkType: hard + +"@algolia/ingestion@npm:1.20.4": + version: 1.20.4 + resolution: "@algolia/ingestion@npm:1.20.4" + dependencies: + "@algolia/client-common": "npm:5.20.4" + "@algolia/requester-browser-xhr": "npm:5.20.4" + "@algolia/requester-fetch": "npm:5.20.4" + "@algolia/requester-node-http": "npm:5.20.4" + checksum: 10c0/f78c778698ca47a8c641d8b99953d733a4f29bebfca18a9e813132f81335b491b3cc3eaf5e5c6f31adda604f290e227682f4fadb91d3ac6431ad6b365e611a46 + languageName: node + linkType: hard + +"@algolia/logger-common@npm:4.23.2": + version: 4.23.2 + resolution: "@algolia/logger-common@npm:4.23.2" + checksum: 10c0/87de58fd048ac2ba9ead5992fdf84b687120f6c751c9db56758fe42e6c5a66381725eb167ce6c4f190164e99504f4bf3b32ae7c40ed485446bf8a08b5c9658d4 + languageName: node + linkType: hard + +"@algolia/logger-console@npm:4.23.2": + version: 4.23.2 + resolution: "@algolia/logger-console@npm:4.23.2" + dependencies: + "@algolia/logger-common": "npm:4.23.2" + checksum: 10c0/0b744837ac320b29baea13fd3121eb6dadbc875ade034d81db32d81f8a4ece9ab8c4758415e92798bdce642e9b543e433c6784d70128ed95e26b401275fa2738 + languageName: node + linkType: hard + +"@algolia/monitoring@npm:1.20.4": + version: 1.20.4 + resolution: "@algolia/monitoring@npm:1.20.4" + dependencies: + "@algolia/client-common": "npm:5.20.4" + "@algolia/requester-browser-xhr": "npm:5.20.4" + "@algolia/requester-fetch": "npm:5.20.4" + "@algolia/requester-node-http": "npm:5.20.4" + checksum: 10c0/76bb7c2f4347a9497e5a6c708342c5140d00136d09e4db25c1c40f450f423f4f0dd1d4f8865690a422ec267a601649e6f1c3c8c190d4f1ccab12090f1b9534bc + languageName: node + linkType: hard + +"@algolia/recommend@npm:4.23.2": + version: 4.23.2 + resolution: "@algolia/recommend@npm:4.23.2" + dependencies: + "@algolia/cache-browser-local-storage": "npm:4.23.2" + "@algolia/cache-common": "npm:4.23.2" + "@algolia/cache-in-memory": "npm:4.23.2" + "@algolia/client-common": "npm:4.23.2" + "@algolia/client-search": "npm:4.23.2" + "@algolia/logger-common": "npm:4.23.2" + "@algolia/logger-console": "npm:4.23.2" + "@algolia/requester-browser-xhr": "npm:4.23.2" + "@algolia/requester-common": "npm:4.23.2" + "@algolia/requester-node-http": "npm:4.23.2" + "@algolia/transporter": "npm:4.23.2" + checksum: 10c0/45cc013c5fa952520e6c455b228cb5b67863e324ddf1f75067209ef23658423959accbd7d50619fa9e96652ad45782418ab0311f63df2a71d9929840cf45afad + languageName: node + linkType: hard + +"@algolia/recommend@npm:5.20.4": + version: 5.20.4 + resolution: "@algolia/recommend@npm:5.20.4" + dependencies: + "@algolia/client-common": "npm:5.20.4" + "@algolia/requester-browser-xhr": "npm:5.20.4" + "@algolia/requester-fetch": "npm:5.20.4" + "@algolia/requester-node-http": "npm:5.20.4" + checksum: 10c0/322717da2645a8cc7fb24a5dcd799f973d0805b3a31a8176626c99c8235934a2e21e1984b2616bbb78a42cdcb6da66c977a6096a67c72b1c651e59d03541f089 + languageName: node + linkType: hard + +"@algolia/requester-browser-xhr@npm:4.23.2": + version: 4.23.2 + resolution: "@algolia/requester-browser-xhr@npm:4.23.2" + dependencies: + "@algolia/requester-common": "npm:4.23.2" + checksum: 10c0/d8c37953acdef6c3989a93e162e4b37be619498f02132b076fe47e1dd1682130a8d4ba7613b0fe3164f64881e7e509aa8c0ba5c9bdb93739a0e6ee80add35520 + languageName: node + linkType: hard + +"@algolia/requester-browser-xhr@npm:5.20.4": + version: 5.20.4 + resolution: "@algolia/requester-browser-xhr@npm:5.20.4" + dependencies: + "@algolia/client-common": "npm:5.20.4" + checksum: 10c0/cd3162fba4de03ccd2c8db15d172c5c1896eeee04972ea7ac229fe4f593f475998cf1d82d5758fe73aa69890937742ff4c12ca477a6b1a651af35245ac847aa4 + languageName: node + linkType: hard + +"@algolia/requester-common@npm:4.23.2": + version: 4.23.2 + resolution: "@algolia/requester-common@npm:4.23.2" + checksum: 10c0/1bed13d55aab60f333fc790b51acedd038db54de517a14d1aaaf929b243a79c417fe8397d66e004bc3139f043c98002b4df96c03fce8d3a2dbf6011cce1c2303 + languageName: node + linkType: hard + +"@algolia/requester-fetch@npm:5.20.4": + version: 5.20.4 + resolution: "@algolia/requester-fetch@npm:5.20.4" + dependencies: + "@algolia/client-common": "npm:5.20.4" + checksum: 10c0/07f120c0c8eb5fc23cdfe0cf6dc874b7e903d8c3b75d667776ac1907222f4b5665411c58f51096863a6fffde150dc8b8eb8729eb8e0ac5f0217e7969d2a197fc + languageName: node + linkType: hard + +"@algolia/requester-node-http@npm:4.23.2": + version: 4.23.2 + resolution: "@algolia/requester-node-http@npm:4.23.2" + dependencies: + "@algolia/requester-common": "npm:4.23.2" + checksum: 10c0/fee5d0414d37dc75f63234b21287ce2982cf5c41a5ce882527548e253453b30429854171031ea6be9c0ea3cdf377d826527ebddc7a2fb337f80d7c1937016efa + languageName: node + linkType: hard + +"@algolia/requester-node-http@npm:5.20.4": + version: 5.20.4 + resolution: "@algolia/requester-node-http@npm:5.20.4" + dependencies: + "@algolia/client-common": "npm:5.20.4" + checksum: 10c0/9c33a64537e987d7ae432b3a7b475b770c3e859c9f298de73d4272cec4f24942634b5b38097860b5121aef43660a6c2bdb0c8b9250ba96a5bd5fee63dadcb9c6 + languageName: node + linkType: hard + +"@algolia/transporter@npm:4.23.2": + version: 4.23.2 + resolution: "@algolia/transporter@npm:4.23.2" + dependencies: + "@algolia/cache-common": "npm:4.23.2" + "@algolia/logger-common": "npm:4.23.2" + "@algolia/requester-common": "npm:4.23.2" + checksum: 10c0/f0d4765d74cf84d262ae0da48699f38fe5c16fb6e7aef9e6b3f944e300077a97cdca1fd831d2fada960f1c6f0f5eb1c7fe1080281da20a01114bf5379709ec0f + languageName: node + linkType: hard + +"@ampproject/remapping@npm:^2.2.0": + version: 2.3.0 + resolution: "@ampproject/remapping@npm:2.3.0" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/81d63cca5443e0f0c72ae18b544cc28c7c0ec2cea46e7cb888bb0e0f411a1191d0d6b7af798d54e30777d8d1488b2ec0732aac2be342d3d7d3ffd271c6f489ed + languageName: node + linkType: hard + +"@antfu/install-pkg@npm:^1.0.0": + version: 1.0.0 + resolution: "@antfu/install-pkg@npm:1.0.0" + dependencies: + package-manager-detector: "npm:^0.2.8" + tinyexec: "npm:^0.3.2" + checksum: 10c0/2361383f9aef51f39e96d0276eb266f01d1cabd4881bba6db2e3dff392ac33b537fcb18a07c66ecd315b808b9a70dc48a95e53531d407b2e1956f49f3b6c5b5b + languageName: node + linkType: hard + +"@antfu/utils@npm:^8.1.0": + version: 8.1.1 + resolution: "@antfu/utils@npm:8.1.1" + checksum: 10c0/cd55d322496f0324323a7bd312bbdc305db02f5c74c53d59213a00a7ecfd66926b6755a41f27c6e664a687cd7a967d3a8b12d3ea57f264ae45dd1c5c181f5160 + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/code-frame@npm:7.24.7" + dependencies: + "@babel/highlight": "npm:^7.24.7" + picocolors: "npm:^1.0.0" + checksum: 10c0/ab0af539473a9f5aeaac7047e377cb4f4edd255a81d84a76058595f8540784cc3fbe8acf73f1e073981104562490aabfb23008cd66dc677a456a4ed5390fdde6 + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10c0/7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.2, @babel/compat-data@npm:^7.25.4": + version: 7.25.4 + resolution: "@babel/compat-data@npm:7.25.4" + checksum: 10c0/50d79734d584a28c69d6f5b99adfaa064d0f41609a378aef04eb06accc5b44f8520e68549eba3a082478180957b7d5783f1bfb1672e4ae8574e797ce8bae79fa + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.26.5, @babel/compat-data@npm:^7.26.8": + version: 7.26.8 + resolution: "@babel/compat-data@npm:7.26.8" + checksum: 10c0/66408a0388c3457fff1c2f6c3a061278dd7b3d2f0455ea29bb7b187fa52c60ae8b4054b3c0a184e21e45f0eaac63cf390737bc7504d1f4a088a6e7f652c068ca + languageName: node + linkType: hard + +"@babel/core@npm:^7.21.3, @babel/core@npm:^7.25.9": + version: 7.26.10 + resolution: "@babel/core@npm:7.26.10" + dependencies: + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.26.10" + "@babel/helper-compilation-targets": "npm:^7.26.5" + "@babel/helper-module-transforms": "npm:^7.26.0" + "@babel/helpers": "npm:^7.26.10" + "@babel/parser": "npm:^7.26.10" + "@babel/template": "npm:^7.26.9" + "@babel/traverse": "npm:^7.26.10" + "@babel/types": "npm:^7.26.10" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10c0/e046e0e988ab53841b512ee9d263ca409f6c46e2a999fe53024688b92db394346fa3aeae5ea0866331f62133982eee05a675d22922a4603c3f603aa09a581d62 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.25.6": + version: 7.25.6 + resolution: "@babel/generator@npm:7.25.6" + dependencies: + "@babel/types": "npm:^7.25.6" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^2.5.1" + checksum: 10c0/f89282cce4ddc63654470b98086994d219407d025497f483eb03ba102086e11e2b685b27122f6ff2e1d93b5b5fa0c3a6b7e974fbf2e4a75b685041a746a4291e + languageName: node + linkType: hard + +"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/generator@npm:7.26.9" + dependencies: + "@babel/parser": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 10c0/6b78872128205224a9a9761b9ea7543a9a7902a04b82fc2f6801ead4de8f59056bab3fd17b1f834ca7b049555fc4c79234b9a6230dd9531a06525306050becad + languageName: node + linkType: hard + +"@babel/generator@npm:^7.26.10, @babel/generator@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/generator@npm:7.27.0" + dependencies: + "@babel/parser": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 10c0/7cb10693d2b365c278f109a745dc08856cae139d262748b77b70ce1d97da84627f79648cab6940d847392c0e5d180441669ed958b3aee98d9c7d274b37c553bd + languageName: node + linkType: hard + +"@babel/helper-annotate-as-pure@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-annotate-as-pure@npm:7.24.7" + dependencies: + "@babel/types": "npm:^7.24.7" + checksum: 10c0/4679f7df4dffd5b3e26083ae65228116c3da34c3fff2c11ae11b259a61baec440f51e30fd236f7a0435b9d471acd93d0bc5a95df8213cbf02b1e083503d81b9a + languageName: node + linkType: hard + +"@babel/helper-annotate-as-pure@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-annotate-as-pure@npm:7.25.9" + dependencies: + "@babel/types": "npm:^7.25.9" + checksum: 10c0/095b6ba50489d797733abebc4596a81918316a99e3632755c9f02508882912b00c2ae5e468532a25a5c2108d109ddbe9b7da78333ee7cc13817fc50c00cf06fe + languageName: node + linkType: hard + +"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.24.7" + dependencies: + "@babel/traverse": "npm:^7.24.7" + "@babel/types": "npm:^7.24.7" + checksum: 10c0/0ed84abf848c79fb1cd4c1ddac12c771d32c1904d87fc3087f33cfdeb0c2e0db4e7892b74b407d9d8d0c000044f3645a7391a781f788da8410c290bb123a1f13 + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.24.7, @babel/helper-compilation-targets@npm:^7.24.8, @babel/helper-compilation-targets@npm:^7.25.2": + version: 7.25.2 + resolution: "@babel/helper-compilation-targets@npm:7.25.2" + dependencies: + "@babel/compat-data": "npm:^7.25.2" + "@babel/helper-validator-option": "npm:^7.24.8" + browserslist: "npm:^4.23.1" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10c0/de10e986b5322c9f807350467dc845ec59df9e596a5926a3b5edbb4710d8e3b8009d4396690e70b88c3844fe8ec4042d61436dd4b92d1f5f75655cf43ab07e99 + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.25.9, @babel/helper-compilation-targets@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/helper-compilation-targets@npm:7.26.5" + dependencies: + "@babel/compat-data": "npm:^7.26.5" + "@babel/helper-validator-option": "npm:^7.25.9" + browserslist: "npm:^4.24.0" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10c0/9da5c77e5722f1a2fcb3e893049a01d414124522bbf51323bb1a0c9dcd326f15279836450fc36f83c9e8a846f3c40e88be032ed939c5a9840922bed6073edfb4 + languageName: node + linkType: hard + +"@babel/helper-create-class-features-plugin@npm:^7.24.7, @babel/helper-create-class-features-plugin@npm:^7.25.0, @babel/helper-create-class-features-plugin@npm:^7.25.4": + version: 7.25.4 + resolution: "@babel/helper-create-class-features-plugin@npm:7.25.4" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.7" + "@babel/helper-member-expression-to-functions": "npm:^7.24.8" + "@babel/helper-optimise-call-expression": "npm:^7.24.7" + "@babel/helper-replace-supers": "npm:^7.25.0" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" + "@babel/traverse": "npm:^7.25.4" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/a765d9e0482e13cf96642fa8aa28e6f7d4d7d39f37840d6246e5e10a7c47f47c52d52522edd3073f229449d17ec0db6f9b7b5e398bff6bb0b4994d65957a164c + languageName: node + linkType: hard + +"@babel/helper-create-class-features-plugin@npm:^7.25.9": + version: 7.26.9 + resolution: "@babel/helper-create-class-features-plugin@npm:7.26.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-member-expression-to-functions": "npm:^7.25.9" + "@babel/helper-optimise-call-expression": "npm:^7.25.9" + "@babel/helper-replace-supers": "npm:^7.26.5" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/traverse": "npm:^7.26.9" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/808620b350ac012f22163fd44c38ed8e05b24ce5d37bc4aa99a44e9724205f11efcef6b25ccfa5bb5de82ac32b899f1e939123c688f335d2851f4b8d70742233 + languageName: node + linkType: hard + +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.24.7, @babel/helper-create-regexp-features-plugin@npm:^7.25.0, @babel/helper-create-regexp-features-plugin@npm:^7.25.2": + version: 7.25.2 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.25.2" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.7" + regexpu-core: "npm:^5.3.1" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/85a7e3639c118856fb1113f54fb7e3bf7698171ddfd0cd6fccccd5426b3727bc1434fe7f69090441dcde327feef9de917e00d35e47ab820047057518dd675317 + languageName: node + linkType: hard + +"@babel/helper-create-regexp-features-plugin@npm:^7.25.9": + version: 7.26.3 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.26.3" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + regexpu-core: "npm:^6.2.0" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/266f30b99af621559467ed67634cb653408a9262930c0627c3d17691a9d477329fb4dabe4b1785cbf0490e892513d247836674271842d6a8da49fd0afae7d435 + languageName: node + linkType: hard + +"@babel/helper-define-polyfill-provider@npm:^0.6.1, @babel/helper-define-polyfill-provider@npm:^0.6.2": + version: 0.6.2 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.22.6" + "@babel/helper-plugin-utils": "npm:^7.22.5" + debug: "npm:^4.1.1" + lodash.debounce: "npm:^4.0.8" + resolve: "npm:^1.14.2" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/f777fe0ee1e467fdaaac059c39ed203bdc94ef2465fb873316e9e1acfc511a276263724b061e3b0af2f6d7ad3ff174f2bb368fde236a860e0f650fda43d7e022 + languageName: node + linkType: hard + +"@babel/helper-define-polyfill-provider@npm:^0.6.3": + version: 0.6.3 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.3" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.22.6" + "@babel/helper-plugin-utils": "npm:^7.22.5" + debug: "npm:^4.1.1" + lodash.debounce: "npm:^4.0.8" + resolve: "npm:^1.14.2" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/4320e3527645e98b6a0d5626fef815680e3b2b03ec36045de5e909b0f01546ab3674e96f50bf3bc8413f8c9037e5ee1a5f560ebdf8210426dad1c2c03c96184a + languageName: node + linkType: hard + +"@babel/helper-member-expression-to-functions@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-member-expression-to-functions@npm:7.24.8" + dependencies: + "@babel/traverse": "npm:^7.24.8" + "@babel/types": "npm:^7.24.8" + checksum: 10c0/7e14a5acc91f6cd26305a4441b82eb6f616bd70b096a4d2099a968f16b26d50207eec0b9ebfc466fefd62bd91587ac3be878117cdfec819b7151911183cb0e5a + languageName: node + linkType: hard + +"@babel/helper-member-expression-to-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-member-expression-to-functions@npm:7.25.9" + dependencies: + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/e08c7616f111e1fb56f398365e78858e26e466d4ac46dff25921adc5ccae9b232f66e952a2f4162bbe336627ba336c7fd9eca4835b6548935973d3380d77eaff + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-module-imports@npm:7.24.7" + dependencies: + "@babel/traverse": "npm:^7.24.7" + "@babel/types": "npm:^7.24.7" + checksum: 10c0/97c57db6c3eeaea31564286e328a9fb52b0313c5cfcc7eee4bc226aebcf0418ea5b6fe78673c0e4a774512ec6c86e309d0f326e99d2b37bfc16a25a032498af0 + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" + dependencies: + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/078d3c2b45d1f97ffe6bb47f61961be4785d2342a4156d8b42c92ee4e1b7b9e365655dd6cb25329e8fe1a675c91eeac7e3d04f0c518b67e417e29d6e27b6aa70 + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.24.7, @babel/helper-module-transforms@npm:^7.24.8, @babel/helper-module-transforms@npm:^7.25.0": + version: 7.25.2 + resolution: "@babel/helper-module-transforms@npm:7.25.2" + dependencies: + "@babel/helper-module-imports": "npm:^7.24.7" + "@babel/helper-simple-access": "npm:^7.24.7" + "@babel/helper-validator-identifier": "npm:^7.24.7" + "@babel/traverse": "npm:^7.25.2" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/adaa15970ace0aee5934b5a633789b5795b6229c6a9cf3e09a7e80aa33e478675eee807006a862aa9aa517935d81f88a6db8a9f5936e3a2a40ec75f8062bc329 + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.25.9, @babel/helper-module-transforms@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helper-module-transforms@npm:7.26.0" + dependencies: + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/ee111b68a5933481d76633dad9cdab30c41df4479f0e5e1cc4756dc9447c1afd2c9473b5ba006362e35b17f4ebddd5fca090233bef8dfc84dca9d9127e56ec3a + languageName: node + linkType: hard + +"@babel/helper-optimise-call-expression@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-optimise-call-expression@npm:7.24.7" + dependencies: + "@babel/types": "npm:^7.24.7" + checksum: 10c0/ca6a9884705dea5c95a8b3ce132d1e3f2ae951ff74987d400d1d9c215dae9c0f9e29924d8f8e131e116533d182675bc261927be72f6a9a2968eaeeaa51eb1d0f + languageName: node + linkType: hard + +"@babel/helper-optimise-call-expression@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-optimise-call-expression@npm:7.25.9" + dependencies: + "@babel/types": "npm:^7.25.9" + checksum: 10c0/90203e6607edeadd2a154940803fd616c0ed92c1013d6774c4b8eb491f1a5a3448b68faae6268141caa5c456e55e3ee49a4ed2bd7ddaf2365daea321c435914c + languageName: node + linkType: hard + +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.24.8, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": + version: 7.24.8 + resolution: "@babel/helper-plugin-utils@npm:7.24.8" + checksum: 10c0/0376037f94a3bfe6b820a39f81220ac04f243eaee7193774b983e956c1750883ff236b30785795abbcda43fac3ece74750566830c2daa4d6e3870bb0dff34c2d + languageName: node + linkType: hard + +"@babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/helper-plugin-utils@npm:7.26.5" + checksum: 10c0/cdaba71d4b891aa6a8dfbe5bac2f94effb13e5fa4c2c487667fdbaa04eae059b78b28d85a885071f45f7205aeb56d16759e1bed9c118b94b16e4720ef1ab0f65 + languageName: node + linkType: hard + +"@babel/helper-remap-async-to-generator@npm:^7.24.7, @babel/helper-remap-async-to-generator@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/helper-remap-async-to-generator@npm:7.25.0" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.7" + "@babel/helper-wrap-function": "npm:^7.25.0" + "@babel/traverse": "npm:^7.25.0" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/0d17b5f7bb6a607edc9cc62fff8056dd9f341bf2f919884f97b99170d143022a5e7ae57922c4891e4fc360ad291e708d2f8cd8989f1d3cd7a17600159984f5a6 + languageName: node + linkType: hard + +"@babel/helper-remap-async-to-generator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-remap-async-to-generator@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-wrap-function": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/6798b562f2788210980f29c5ee96056d90dc73458c88af5bd32f9c82e28e01975588aa2a57bb866c35556bd9b76bac937e824ee63ba472b6430224b91b4879e9 + languageName: node + linkType: hard + +"@babel/helper-replace-supers@npm:^7.24.7, @babel/helper-replace-supers@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/helper-replace-supers@npm:7.25.0" + dependencies: + "@babel/helper-member-expression-to-functions": "npm:^7.24.8" + "@babel/helper-optimise-call-expression": "npm:^7.24.7" + "@babel/traverse": "npm:^7.25.0" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/b4b6650ab3d56c39a259367cd97f8df2f21c9cebb3716fea7bca40a150f8847bfb82f481e98927c7c6579b48a977b5a8f77318a1c6aeb497f41ecd6dbc3fdfef + languageName: node + linkType: hard + +"@babel/helper-replace-supers@npm:^7.25.9, @babel/helper-replace-supers@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/helper-replace-supers@npm:7.26.5" + dependencies: + "@babel/helper-member-expression-to-functions": "npm:^7.25.9" + "@babel/helper-optimise-call-expression": "npm:^7.25.9" + "@babel/traverse": "npm:^7.26.5" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/b19b1245caf835207aaaaac3a494f03a16069ae55e76a2e1350b5acd560e6a820026997a8160e8ebab82ae873e8208759aa008eb8422a67a775df41f0a4633d4 + languageName: node + linkType: hard + +"@babel/helper-simple-access@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-simple-access@npm:7.24.7" + dependencies: + "@babel/traverse": "npm:^7.24.7" + "@babel/types": "npm:^7.24.7" + checksum: 10c0/7230e419d59a85f93153415100a5faff23c133d7442c19e0cd070da1784d13cd29096ee6c5a5761065c44e8164f9f80e3a518c41a0256df39e38f7ad6744fed7 + languageName: node + linkType: hard + +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.24.7" + dependencies: + "@babel/traverse": "npm:^7.24.7" + "@babel/types": "npm:^7.24.7" + checksum: 10c0/e3a9b8ac9c262ac976a1bcb5fe59694db5e6f0b4f9e7bdba5c7693b8b5e28113c23bdaa60fe8d3ec32a337091b67720b2053bcb3d5655f5406536c3d0584242b + languageName: node + linkType: hard + +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.25.9" + dependencies: + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/09ace0c6156961624ac9524329ce7f45350bab94bbe24335cbe0da7dfaa1448e658771831983cb83fe91cf6635b15d0a3cab57c03b92657480bfb49fb56dd184 + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-string-parser@npm:7.24.8" + checksum: 10c0/6361f72076c17fabf305e252bf6d580106429014b3ab3c1f5c4eb3e6d465536ea6b670cc0e9a637a77a9ad40454d3e41361a2909e70e305116a23d68ce094c08 + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 10c0/7244b45d8e65f6b4338a6a68a8556f2cb161b782343e97281a5f2b9b93e420cad0d9f5773a59d79f61d0c448913d06f6a2358a87f2e203cf112e3c5b53522ee6 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-validator-identifier@npm:7.24.7" + checksum: 10c0/87ad608694c9477814093ed5b5c080c2e06d44cb1924ae8320474a74415241223cc2a725eea2640dd783ff1e3390e5f95eede978bc540e870053152e58f1d651 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 10c0/4fc6f830177b7b7e887ad3277ddb3b91d81e6c4a24151540d9d1023e8dc6b1c0505f0f0628ae653601eb4388a8db45c1c14b2c07a9173837aef7e4116456259d + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.24.7, @babel/helper-validator-option@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-validator-option@npm:7.24.8" + checksum: 10c0/73db93a34ae89201351288bee7623eed81a54000779462a986105b54ffe82069e764afd15171a428b82e7c7a9b5fec10b5d5603b216317a414062edf5c67a21f + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-option@npm:7.25.9" + checksum: 10c0/27fb195d14c7dcb07f14e58fe77c44eea19a6a40a74472ec05c441478fa0bb49fa1c32b2d64be7a38870ee48ef6601bdebe98d512f0253aea0b39756c4014f3e + languageName: node + linkType: hard + +"@babel/helper-wrap-function@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/helper-wrap-function@npm:7.25.0" + dependencies: + "@babel/template": "npm:^7.25.0" + "@babel/traverse": "npm:^7.25.0" + "@babel/types": "npm:^7.25.0" + checksum: 10c0/d54601a98384c191cbc1ff07b03a19e288ef8d5c6bfafe270b2a303d96e7304eb296002921ed464cc1b105a547d1db146eb86b0be617924dee1ba1b379cdc216 + languageName: node + linkType: hard + +"@babel/helper-wrap-function@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-wrap-function@npm:7.25.9" + dependencies: + "@babel/template": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/b6627d83291e7b80df020f8ee2890c52b8d49272962cac0114ef90f189889c90f1027985873d1b5261a4e986e109b2754292dc112392f0b1fcbfc91cc08bd003 + languageName: node + linkType: hard + +"@babel/helpers@npm:7.27.0": + version: 7.27.0 + resolution: "@babel/helpers@npm:7.27.0" + dependencies: + "@babel/template": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" + checksum: 10c0/a3c64fd2d8b164c041808826cc00769d814074ea447daaacaf2e3714b66d3f4237ef6e420f61d08f463d6608f3468c2ac5124ab7c68f704e20384def5ade95f4 + languageName: node + linkType: hard + +"@babel/highlight@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/highlight@npm:7.24.7" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.24.7" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10c0/674334c571d2bb9d1c89bdd87566383f59231e16bcdcf5bb7835babdf03c9ae585ca0887a7b25bdf78f303984af028df52831c7989fecebb5101cc132da9393a + languageName: node + linkType: hard + +"@babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.6": + version: 7.25.6 + resolution: "@babel/parser@npm:7.25.6" + dependencies: + "@babel/types": "npm:^7.25.6" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/f88a0e895dbb096fd37c4527ea97d12b5fc013720602580a941ac3a339698872f0c911e318c292b184c36b5fbe23b612f05aff9d24071bc847c7b1c21552c41d + languageName: node + linkType: hard + +"@babel/parser@npm:^7.26.10, @babel/parser@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/parser@npm:7.27.0" + dependencies: + "@babel/types": "npm:^7.27.0" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/ba2ed3f41735826546a3ef2a7634a8d10351df221891906e59b29b0a0cd748f9b0e7a6f07576858a9de8e77785aad925c8389ddef146de04ea2842047c9d2859 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/parser@npm:7.26.9" + dependencies: + "@babel/types": "npm:^7.26.9" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/4b9ef3c9a0d4c328e5e5544f50fe8932c36f8a2c851e7f14a85401487cd3da75cad72c2e1bcec1eac55599a6bbb2fdc091f274c4fcafa6bdd112d4915ff087fc + languageName: node + linkType: hard + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.3": + version: 7.25.3 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/traverse": "npm:^7.25.3" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/814b4d3f102e7556a5053d1acf57ef601cfcff39a2c81b8cdc6a5c842e3cb9838f5925d1466a5f1e6416e74c9c83586a3c07fbd7fb8610a396c2becdf9ae5790 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/7aab47fcbb8c1ddc195a3cd66609edcad54c5022f018db7de40185f0182950389690e953e952f117a1737b72f665ff02ad30de6c02b49b97f1d8f4ccdffedc34 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.8" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/9645a1f47b3750acadb1353c02e71cc712d072aafe5ce115ed3a886bc14c5d9200cfb0b5b5e60e813baa549b800cf798f8714019fd246c699053cf68c428e426 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/3a652b3574ca62775c5f101f8457950edc540c3581226579125da535d67765f41ad7f0e6327f8efeb2540a5dad5bb0c60a89fb934af3f67472e73fb63612d004 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.8" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/ed1ce1c90cac46c01825339fd0f2a96fa071b016fb819d8dfaf8e96300eae30e74870cb47e4dc80d4ce2fb287869f102878b4f3b35bc927fec8b1d0d76bcf612 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/18fc9004104a150f9f5da9f3307f361bc3104d16778bb593b7523d5110f04a8df19a2587e6bdd5e726fb1d397191add45223f4f731bb556c33f14f2779d596e8 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.13.0 + checksum: 10c0/aeb6e7aa363a47f815cf956ea1053c5dd8b786a17799f065c9688ba4b0051fe7565d258bbe9400bfcbfb3114cb9fda66983e10afe4d750bc70ff75403e15dd36 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/plugin-transform-optional-chaining": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.13.0 + checksum: 10c0/3f6c8781a2f7aa1791a31d2242399ca884df2ab944f90c020b6f112fb19f05fa6dad5be143d274dad1377e40415b63d24d5489faf5060b9c4a99e55d8f0c317c + languageName: node + linkType: hard + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/traverse": "npm:^7.25.0" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/45988025537a9d4a27b610fd696a18fd9ba9336621a69b4fb40560eeb10c79657f85c92a37f30c7c8fb29c22970eea0b373315795a891f1a05549a6cfe5a6bfe + languageName: node + linkType: hard + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/02b365f0cc4df8b8b811c68697c93476da387841e5f153fe42766f34241b685503ea51110d5ed6df7132759820b93e48d9fa3743cffc091eed97c19f7e5fe272 + languageName: node + linkType: hard + +"@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": + version: 7.21.0-placeholder-for-preset-env.2 + resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e605e0070da087f6c35579499e65801179a521b6842c15181a1e305c04fded2393f11c1efd09b087be7f8b083d1b75e8f3efcbc1292b4f60d3369e14812cff63 + languageName: node + linkType: hard + +"@babel/plugin-syntax-async-generators@npm:^7.8.4": + version: 7.8.4 + resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d13efb282838481348c71073b6be6245b35d4f2f964a8f71e4174f235009f929ef7613df25f8d2338e2d3e44bc4265a9f8638c6aaa136d7a61fe95985f9725c8 + languageName: node + linkType: hard + +"@babel/plugin-syntax-class-properties@npm:^7.12.13": + version: 7.12.13 + resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.12.13" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/95168fa186416195280b1264fb18afcdcdcea780b3515537b766cb90de6ce042d42dd6a204a39002f794ae5845b02afb0fd4861a3308a861204a55e68310a120 + languageName: node + linkType: hard + +"@babel/plugin-syntax-class-static-block@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/4464bf9115f4a2d02ce1454411baf9cfb665af1da53709c5c56953e5e2913745b0fcce82982a00463d6facbdd93445c691024e310b91431a1e2f024b158f6371 + languageName: node + linkType: hard + +"@babel/plugin-syntax-dynamic-import@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-dynamic-import@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/9c50927bf71adf63f60c75370e2335879402648f468d0172bc912e303c6a3876927d8eb35807331b57f415392732ed05ab9b42c68ac30a936813ab549e0246c5 + languageName: node + linkType: hard + +"@babel/plugin-syntax-export-namespace-from@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-export-namespace-from@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5100d658ba563829700cd8d001ddc09f4c0187b1a13de300d729c5b3e87503f75a6d6c99c1794182f7f1a9f546ee009df4f15a0ce36376e206ed0012fa7cdc24 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-assertions@npm:^7.24.7": + version: 7.25.6 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.25.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.8" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/55afa63b1b1355bcc1d85a9ad9d2c78983e27beee38e232d5c1ab59eac39127ce3c3817d6686e3ab1d0aff5edd8e38a6852885c65d3e518accdd183a445ef411 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-assertions@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.26.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/525b174e60b210d96c1744c1575fc2ddedcc43a479cba64a5344cf77bd0541754fc58120b5a11ff832ba098437bb05aa80900d1f49bb3d888c5e349a4a3a356e + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-attributes@npm:^7.24.7": + version: 7.25.6 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.25.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.8" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/0e9359cf2d117476310961dfcfd7204ed692e933707da10d6194153d3996cd2ea5b7635fc90d720dce3612083af89966bb862561064a509c350320dc98644751 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-attributes@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.26.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e594c185b12bfe0bbe7ca78dfeebe870e6d569a12128cac86f3164a075fe0ff70e25ddbd97fd0782906b91f65560c9dc6957716b7b4a68aba2516c9b7455e352 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-meta@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/0b08b5e4c3128523d8e346f8cfc86824f0da2697b1be12d71af50a31aff7a56ceb873ed28779121051475010c28d6146a6bfea8518b150b71eeb4e46190172ee + languageName: node + linkType: hard + +"@babel/plugin-syntax-json-strings@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e98f31b2ec406c57757d115aac81d0336e8434101c224edd9a5c93cefa53faf63eacc69f3138960c8b25401315af03df37f68d316c151c4b933136716ed6906e + languageName: node + linkType: hard + +"@babel/plugin-syntax-jsx@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-syntax-jsx@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/f44d927a9ae8d5ef016ff5b450e1671e56629ddc12e56b938e41fd46e141170d9dfc9a53d6cb2b9a20a7dd266a938885e6a3981c60c052a2e1daed602ac80e51 + languageName: node + linkType: hard + +"@babel/plugin-syntax-jsx@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d56597aff4df39d3decda50193b6dfbe596ca53f437ff2934622ce19a743bf7f43492d3fb3308b0289f5cee2b825d99ceb56526a2b9e7b68bf04901546c5618c + languageName: node + linkType: hard + +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2594cfbe29411ad5bc2ad4058de7b2f6a8c5b86eda525a993959438615479e59c012c14aec979e538d60a584a1a799b60d1b8942c3b18468cb9d99b8fd34cd0b + languageName: node + linkType: hard + +"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2024fbb1162899094cfc81152449b12bd0cc7053c6d4bda8ac2852545c87d0a851b1b72ed9560673cbf3ef6248257262c3c04aabf73117215c1b9cc7dd2542ce + languageName: node + linkType: hard + +"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c55a82b3113480942c6aa2fcbe976ff9caa74b7b1109ff4369641dfbc88d1da348aceb3c31b6ed311c84d1e7c479440b961906c735d0ab494f688bf2fd5b9bb9 + languageName: node + linkType: hard + +"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/ee1eab52ea6437e3101a0a7018b0da698545230015fc8ab129d292980ec6dff94d265e9e90070e8ae5fed42f08f1622c14c94552c77bcac784b37f503a82ff26 + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/27e2493ab67a8ea6d693af1287f7e9acec206d1213ff107a928e85e173741e1d594196f99fec50e9dde404b09164f39dec5864c767212154ffe1caa6af0bc5af + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/46edddf2faa6ebf94147b8e8540dfc60a5ab718e2de4d01b2c0bdf250a4d642c2bd47cbcbb739febcb2bf75514dbcefad3c52208787994b8d0f8822490f55e81 + languageName: node + linkType: hard + +"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/69822772561706c87f0a65bc92d0772cea74d6bc0911537904a676d5ff496a6d3ac4e05a166d8125fce4a16605bace141afc3611074e170a994e66e5397787f3 + languageName: node + linkType: hard + +"@babel/plugin-syntax-top-level-await@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/14bf6e65d5bc1231ffa9def5f0ef30b19b51c218fcecaa78cd1bdf7939dfdf23f90336080b7f5196916368e399934ce5d581492d8292b46a2fb569d8b2da106f + languageName: node + linkType: hard + +"@babel/plugin-syntax-typescript@npm:^7.24.7": + version: 7.25.4 + resolution: "@babel/plugin-syntax-typescript@npm:7.25.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.8" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/199919d44c73e5edee9ffd311cf638f88d26a810189e32d338c46c7600441fd5c4a2e431f9be377707cbf318410895304e90b83bf8d9011d205150fa7f260e63 + languageName: node + linkType: hard + +"@babel/plugin-syntax-typescript@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-syntax-typescript@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5192ebe11bd46aea68b7a60fd9555465c59af7e279e71126788e59121b86e00b505816685ab4782abe159232b0f73854e804b54449820b0d950b397ee158caa2 + languageName: node + linkType: hard + +"@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.18.6" + "@babel/helper-plugin-utils": "npm:^7.18.6" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/9144e5b02a211a4fb9a0ce91063f94fbe1004e80bde3485a0910c9f14897cf83fabd8c21267907cff25db8e224858178df0517f14333cfcf3380ad9a4139cb50 + languageName: node + linkType: hard + +"@babel/plugin-transform-arrow-functions@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/6ac05a54e5582f34ac6d5dc26499e227227ec1c7fa6fc8de1f3d40c275f140d3907f79bbbd49304da2d7008a5ecafb219d0b71d78ee3290ca22020d878041245 + languageName: node + linkType: hard + +"@babel/plugin-transform-arrow-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/851fef9f58be60a80f46cc0ce1e46a6f7346a6f9d50fa9e0fa79d46ec205320069d0cc157db213e2bea88ef5b7d9bd7618bb83f0b1996a836e2426c3a3a1f622 + languageName: node + linkType: hard + +"@babel/plugin-transform-async-generator-functions@npm:^7.25.4": + version: 7.25.4 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-remap-async-to-generator": "npm:^7.25.0" + "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + "@babel/traverse": "npm:^7.25.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/efed6f6be90b25ad77c15a622a0dc0b22dbf5d45599c207ab8fbc4e959aef21f574fa467d9cf872e45de664a46c32334e78dee2332d82f5f27e26249a34a0920 + languageName: node + linkType: hard + +"@babel/plugin-transform-async-generator-functions@npm:^7.26.8": + version: 7.26.8 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.26.8" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-remap-async-to-generator": "npm:^7.25.9" + "@babel/traverse": "npm:^7.26.8" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/f6fefce963fe2e6268dde1958975d7adbce65fba94ca6f4bc554c90da03104ad1dd2e66d03bc0462da46868498428646e30b03a218ef0e5a84bfc87a7e375cec + languageName: node + linkType: hard + +"@babel/plugin-transform-async-to-generator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.7" + dependencies: + "@babel/helper-module-imports": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-remap-async-to-generator": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/83c82e243898875af8457972a26ab29baf8a2078768ee9f35141eb3edff0f84b165582a2ff73e90a9e08f5922bf813dbf15a85c1213654385198f4591c0dc45d + languageName: node + linkType: hard + +"@babel/plugin-transform-async-to-generator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.25.9" + dependencies: + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-remap-async-to-generator": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c443d9e462ddef733ae56360064f32fc800105803d892e4ff32d7d6a6922b3765fa97b9ddc9f7f1d3f9d8c2d95721d85bef9dbf507804214c6cf6466b105c168 + languageName: node + linkType: hard + +"@babel/plugin-transform-block-scoped-functions@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/113e86de4612ae91773ff5cb6b980f01e1da7e26ae6f6012127415d7ae144e74987bc23feb97f63ba4bc699331490ddea36eac004d76a20d5369e4cc6a7f61cd + languageName: node + linkType: hard + +"@babel/plugin-transform-block-scoped-functions@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.26.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.26.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2f3060800ead46b09971dd7bf830d66383b7bc61ced9945633b4ef9bf87787956ea83fcf49b387cecb377812588c6b81681714c760f9cf89ecba45edcbab1192 + languageName: node + linkType: hard + +"@babel/plugin-transform-block-scoping@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-transform-block-scoping@npm:7.25.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.8" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/382931c75a5d0ea560387e76cb57b03461300527e4784efcb2fb62f36c1eb0ab331327b6034def256baa0cad9050925a61f9c0d56261b6afd6a29c3065fb0bd4 + languageName: node + linkType: hard + +"@babel/plugin-transform-block-scoping@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-block-scoping@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/a76e30becb6c75b4d87a2cd53556fddb7c88ddd56bfadb965287fd944810ac159aa8eb5705366fc37336041f63154ed9fab3862fb10482a45bf5ede63fd55fda + languageName: node + linkType: hard + +"@babel/plugin-transform-class-properties@npm:^7.25.4": + version: 7.25.4 + resolution: "@babel/plugin-transform-class-properties@npm:7.25.4" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.25.4" + "@babel/helper-plugin-utils": "npm:^7.24.8" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/0b41bc8a5920d3d17c7c06220b601cf43e0a32ac34f05f05cd0cdf08915e4521b1b707cb1e60942b4fc68a5dfac09f0444a8720e0c72ce76fb039e8ec5263115 + languageName: node + linkType: hard + +"@babel/plugin-transform-class-properties@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-class-properties@npm:7.25.9" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/f0603b6bd34d8ba62c03fc0572cb8bbc75874d097ac20cc7c5379e001081210a84dba1749e7123fca43b978382f605bb9973c99caf2c5b4c492d5c0a4a441150 + languageName: node + linkType: hard + +"@babel/plugin-transform-class-static-block@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-class-static-block@npm:7.24.7" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.12.0 + checksum: 10c0/b0ade39a3d09dce886f79dbd5907c3d99b48167eddb6b9bbde24a0598129654d7017e611c20494cdbea48b07ac14397cd97ea34e3754bbb2abae4e698128eccb + languageName: node + linkType: hard + +"@babel/plugin-transform-class-static-block@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-transform-class-static-block@npm:7.26.0" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.12.0 + checksum: 10c0/cdcf5545ae6514ed75fbd73cccfa209c6a5dfdf0c2bb7bb62c0fb4ec334a32281bcf1bc16ace494d9dbe93feb8bdc0bd3cf9d9ccb6316e634a67056fa13b741b + languageName: node + linkType: hard + +"@babel/plugin-transform-classes@npm:^7.25.4": + version: 7.25.4 + resolution: "@babel/plugin-transform-classes@npm:7.25.4" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.7" + "@babel/helper-compilation-targets": "npm:^7.25.2" + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-replace-supers": "npm:^7.25.0" + "@babel/traverse": "npm:^7.25.4" + globals: "npm:^11.1.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c68424d9dd64860825111aa4a4ed5caf29494b7a02ddb9c36351d768c41e8e05127d89274795cdfcade032d9d299e6c677418259df58c71e68f1741583dcf467 + languageName: node + linkType: hard + +"@babel/plugin-transform-classes@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-classes@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-replace-supers": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + globals: "npm:^11.1.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/02742ea7cd25be286c982e672619effca528d7a931626a6f3d6cea11852951b7ee973276127eaf6418ac0e18c4d749a16b520709c707e86a67012bd23ff2927d + languageName: node + linkType: hard + +"@babel/plugin-transform-computed-properties@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-computed-properties@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/template": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/25636dbc1f605c0b8bc60aa58628a916b689473d11551c9864a855142e36742fe62d4a70400ba3b74902338e77fb3d940376c0a0ba154b6b7ec5367175233b49 + languageName: node + linkType: hard + +"@babel/plugin-transform-computed-properties@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-computed-properties@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/template": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/948c0ae3ce0ba2375241d122a9bc7cda4a7ac8110bd8a62cd804bc46a5fdb7a7a42c7799c4cd972e14e0a579d2bd0999b92e53177b73f240bb0d4b09972c758b + languageName: node + linkType: hard + +"@babel/plugin-transform-destructuring@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/plugin-transform-destructuring@npm:7.24.8" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.8" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/804968c1d5f5072c717505296c1e5d5ec33e90550423de66de82bbcb78157156e8470bbe77a04ab8c710a88a06360a30103cf223ac7eff4829adedd6150de5ce + languageName: node + linkType: hard + +"@babel/plugin-transform-destructuring@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-destructuring@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7beec5fda665d108f69d5023aa7c298a1e566b973dd41290faa18aeea70f6f571295c1ece0a058f3ceb6c6c96de76de7cd34f5a227fbf09a1b8d8a735d28ca49 + languageName: node + linkType: hard + +"@babel/plugin-transform-dotall-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/793f14c9494972d294b7e7b97b747f47874b6d57d7804d3443c701becf5db192c9311be6a1835c07664486df1f5c60d33196c36fb7e11a53015e476b4c145b33 + languageName: node + linkType: hard + +"@babel/plugin-transform-dotall-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7c3471ae5cf7521fd8da5b03e137e8d3733fc5ee4524ce01fb0c812f0bb77cb2c9657bc8a6253186be3a15bb4caa8974993c7ddc067f554ecc6a026f0a3b5e12 + languageName: node + linkType: hard + +"@babel/plugin-transform-duplicate-keys@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/75ff7ec1117ac500e77bf20a144411d39c0fdd038f108eec061724123ce6d1bb8d5bd27968e466573ee70014f8be0043361cdb0ef388f8a182d1d97ad67e51b9 + languageName: node + linkType: hard + +"@babel/plugin-transform-duplicate-keys@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d0c74894b9bf6ff2a04189afffb9cd43d87ebd7b7943e51a827c92d2aaa40fa89ac81565a2fd6fbeabf9e38413a9264c45862eee2b017f1d49046cc3c8ff06b4 + languageName: node + linkType: hard + +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.0" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.0" + "@babel/helper-plugin-utils": "npm:^7.24.8" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/1c9b57ddd9b33696e88911d0e7975e1573ebc46219c4b30eb1dc746cbb71aedfac6f6dab7fdfdec54dd58f31468bf6ab56b157661ea4ffe58f906d71f89544c8 + languageName: node + linkType: hard + +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/a8039a6d2b90e011c7b30975edee47b5b1097cf3c2f95ec1f5ddd029898d783a995f55f7d6eb8d6bb8873c060fb64f9f1ccba938dfe22d118d09cf68e0cd3bf6 + languageName: node + linkType: hard + +"@babel/plugin-transform-dynamic-import@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/eeda48372efd0a5103cb22dadb13563c975bce18ae85daafbb47d57bb9665d187da9d4fe8d07ac0a6e1288afcfcb73e4e5618bf75ff63fddf9736bfbf225203b + languageName: node + linkType: hard + +"@babel/plugin-transform-dynamic-import@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5e643a8209072b668350f5788f23c64e9124f81f958b595c80fecca6561086d8ef346c04391b9e5e4cad8b8cbe22c258f0cd5f4ea89b97e74438e7d1abfd98cf + languageName: node + linkType: hard + +"@babel/plugin-transform-exponentiation-operator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.7" + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/ace3e11c94041b88848552ba8feb39ae4d6cad3696d439ff51445bd2882d8b8775d85a26c2c0edb9b5e38c9e6013cc11b0dea89ec8f93c7d9d7ee95e3645078c + languageName: node + linkType: hard + +"@babel/plugin-transform-exponentiation-operator@npm:^7.26.3": + version: 7.26.3 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.26.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/cac922e851c6a0831fdd2e3663564966916015aeff7f4485825fc33879cbc3a313ceb859814c9200248e2875d65bb13802a723e5d7d7b40a2e90da82a5a1e15c + languageName: node + linkType: hard + +"@babel/plugin-transform-export-namespace-from@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/4e144d7f1c57bc63b4899dbbbdfed0880f2daa75ea9c7251c7997f106e4b390dc362175ab7830f11358cb21f6b972ca10a43a2e56cd789065f7606b082674c0c + languageName: node + linkType: hard + +"@babel/plugin-transform-export-namespace-from@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/f291ea2ec5f36de9028a00cbd5b32f08af281b8183bf047200ff001f4cb260be56f156b2449f42149448a4a033bd6e86a3a7f06d0c2825532eb0ae6b03058dfb + languageName: node + linkType: hard + +"@babel/plugin-transform-for-of@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-for-of@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/77629b1173e55d07416f05ba7353caa09d2c2149da2ca26721ab812209b63689d1be45116b68eadc011c49ced59daf5320835b15245eb7ae93ae0c5e8277cfc0 + languageName: node + linkType: hard + +"@babel/plugin-transform-for-of@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/plugin-transform-for-of@npm:7.26.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e28a521521cf9f84ddd69ca8da7c89fb9f7aa38e4dea35742fe973e4e1d7c23f9cee1a4861a2fdd9e9f18ff945886a44d7335cea1c603b96bfcb1c7c8791ef09 + languageName: node + linkType: hard + +"@babel/plugin-transform-function-name@npm:^7.25.1": + version: 7.25.1 + resolution: "@babel/plugin-transform-function-name@npm:7.25.1" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/traverse": "npm:^7.25.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e74912174d5e33d1418b840443c2e226a7b76cc017c1ed20ee30a566e4f1794d4a123be03180da046241576e8b692731807ba1f52608922acf1cb2cb6957593f + languageName: node + linkType: hard + +"@babel/plugin-transform-function-name@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-function-name@npm:7.25.9" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8e67fbd1dd367927b8b6afdf0a6e7cb3a3fd70766c52f700ca77428b6d536f6c9d7ec643e7762d64b23093233765c66bffa40e31aabe6492682879bcb45423e1 + languageName: node + linkType: hard + +"@babel/plugin-transform-json-strings@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-json-strings@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/17c72cd5bf3e90e722aabd333559275f3309e3fa0b9cea8c2944ab83ae01502c71a2be05da5101edc02b3fc8df15a8dbb9b861cbfcc8a52bf5e797cf01d3a40a + languageName: node + linkType: hard + +"@babel/plugin-transform-json-strings@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-json-strings@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/00bc2d4751dfc9d44ab725be16ee534de13cfd7e77dfb386e5dac9e48101ce8fcbc5971df919dc25b3f8a0fa85d6dc5f2a0c3cf7ec9d61c163d9823c091844f0 + languageName: node + linkType: hard + +"@babel/plugin-transform-literals@npm:^7.25.2": + version: 7.25.2 + resolution: "@babel/plugin-transform-literals@npm:7.25.2" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.8" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/0796883217b0885d37e7f6d350773be349e469a812b6bf11ccf862a6edf65103d3e7c849529d65381b441685c12e756751d8c2489a0fd3f8139bb5ef93185f58 + languageName: node + linkType: hard + +"@babel/plugin-transform-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-literals@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/00b14e9c14cf1e871c1f3781bf6334cac339c360404afd6aba63d2f6aca9270854d59a2b40abff1c4c90d4ffdca614440842d3043316c2f0ceb155fdf7726b3b + languageName: node + linkType: hard + +"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/dbe882eb9053931f2ab332c50fc7c2a10ef507d6421bd9831adbb4cb7c9f8e1e5fbac4fbd2e007f6a1bf1df1843547559434012f118084dc0bf42cda3b106272 + languageName: node + linkType: hard + +"@babel/plugin-transform-logical-assignment-operators@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/6e2051e10b2d6452980fc4bdef9da17c0d6ca48f81b8529e8804b031950e4fff7c74a7eb3de4a2b6ad22ffb631d0b67005425d232cce6e2b29ce861c78ed04f5 + languageName: node + linkType: hard + +"@babel/plugin-transform-member-expression-literals@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e789ae359bdf2d20e90bedef18dfdbd965c9ebae1cee398474a0c349590fda7c8b874e1a2ceee62e47e5e6ec1730e76b0f24e502164357571854271fc12cc684 + languageName: node + linkType: hard + +"@babel/plugin-transform-member-expression-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/91d17b451bcc5ea9f1c6f8264144057ade3338d4b92c0b248366e4db3a7790a28fd59cc56ac433a9627a9087a17a5684e53f4995dd6ae92831cb72f1bd540b54 + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-amd@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-modules-amd@npm:7.24.7" + dependencies: + "@babel/helper-module-transforms": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/6df7de7fce34117ca4b2fa07949b12274c03668cbfe21481c4037b6300796d50ae40f4f170527b61b70a67f26db906747797e30dbd0d9809a441b6e220b5728f + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-amd@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-amd@npm:7.25.9" + dependencies: + "@babel/helper-module-transforms": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/849957d9484d0a2d93331226ed6cf840cee7d57454549534c447c93f8b839ef8553eae9877f8f550e3c39f14d60992f91244b2e8e7502a46064b56c5d68ba855 + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-commonjs@npm:^7.24.7, @babel/plugin-transform-modules-commonjs@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.8" + dependencies: + "@babel/helper-module-transforms": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-simple-access": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/f1cf552307ebfced20d3907c1dd8be941b277f0364aa655e2b5fee828c84c54065745183104dae86f1f93ea0406db970a463ef7ceaaed897623748e99640e5a7 + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-commonjs@npm:^7.25.9, @babel/plugin-transform-modules-commonjs@npm:^7.26.3": + version: 7.26.3 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.26.3" + dependencies: + "@babel/helper-module-transforms": "npm:^7.26.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/82e59708f19f36da29531a64a7a94eabbf6ff46a615e0f5d9b49f3f59e8ef10e2bac607d749091508d3fa655146c9e5647c3ffeca781060cdabedb4c7a33c6f2 + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-systemjs@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.0" + dependencies: + "@babel/helper-module-transforms": "npm:^7.25.0" + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-validator-identifier": "npm:^7.24.7" + "@babel/traverse": "npm:^7.25.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/fca6198da71237e4bb1274b3b67a0c81d56013c9535361242b6bfa87d70a9597854aadb45d4d8203369be4a655e158be2a5d20af0040b1f8d1bfc47db3ad7b68 + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-systemjs@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.9" + dependencies: + "@babel/helper-module-transforms": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8299e3437542129c2684b86f98408c690df27db4122a79edded4782cf04e755d6ecb05b1e812c81a34224a81e664303392d5f3c36f3d2d51fdc99bb91c881e9a + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-umd@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-modules-umd@npm:7.24.7" + dependencies: + "@babel/helper-module-transforms": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7791d290121db210e4338b94b4a069a1a79e4c7a8d7638d8159a97b281851bbed3048dac87a4ae718ad963005e6c14a5d28e6db2eeb2b04e031cee92fb312f85 + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-umd@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-umd@npm:7.25.9" + dependencies: + "@babel/helper-module-transforms": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/fa11a621f023e2ac437b71d5582f819e667c94306f022583d77da9a8f772c4128861a32bbb63bef5cba581a70cd7dbe87a37238edaafcfacf889470c395e7076 + languageName: node + linkType: hard + +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.24.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/41a0b0f2d0886318237440aa3b489f6d0305361d8671121777d9ff89f9f6de9d0c02ce93625049061426c8994064ef64deae8b819d1b14c00374a6a2336fb5d9 + languageName: node + linkType: hard + +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/32b14fda5c885d1706863f8af2ee6c703d39264355b57482d3a24fce7f6afbd4c7a0896e501c0806ed2b0759beb621bf7f3f7de1fbbc82026039a98d961e78ef + languageName: node + linkType: hard + +"@babel/plugin-transform-new-target@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-new-target@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2540808a35e1a978e537334c43dab439cf24c93e7beb213a2e71902f6710e60e0184316643790c0a6644e7a8021e52f7ab8165e6b3e2d6651be07bdf517b67df + languageName: node + linkType: hard + +"@babel/plugin-transform-new-target@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-new-target@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7b5f1b7998f1cf183a7fa646346e2f3742e5805b609f28ad5fee22d666a15010f3e398b7e1ab78cddb7901841a3d3f47135929af23d54e8bf4ce69b72051f71e + languageName: node + linkType: hard + +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7243c8ff734ed5ef759dd8768773c4b443c12e792727e759a1aec2c7fa2bfdd24f1ecb42e292a7b3d8bd3d7f7b861cf256a8eb4ba144fc9cc463892c303083d9 + languageName: node + linkType: hard + +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.26.6": + version: 7.26.6 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.26.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.26.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/574d6db7cbc5c092db5d1dece8ce26195e642b9c40dbfeaf3082058a78ad7959c1c333471cdd45f38b784ec488850548075d527b178c5010ee9bff7aa527cc7a + languageName: node + linkType: hard + +"@babel/plugin-transform-numeric-separator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e18e09ca5a6342645d00ede477731aa6e8714ff357efc9d7cda5934f1703b3b6fb7d3298dce3ce3ba53e9ff1158eab8f1aadc68874cc21a6099d33a1ca457789 + languageName: node + linkType: hard + +"@babel/plugin-transform-numeric-separator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/ad63ad341977844b6f9535fcca15ca0d6d6ad112ed9cc509d4f6b75e9bf4b1b1a96a0bcb1986421a601505d34025373608b5f76d420d924b4e21f86b1a1f2749 + languageName: node + linkType: hard + +"@babel/plugin-transform-object-rest-spread@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.7" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" + "@babel/plugin-transform-parameters": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/9ad64bc003f583030f9da50614b485852f8edac93f8faf5d1cd855201a4852f37c5255ae4daf70dd4375bdd4874e16e39b91f680d4668ec219ba05441ce286eb + languageName: node + linkType: hard + +"@babel/plugin-transform-object-rest-spread@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.25.9" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/plugin-transform-parameters": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/02077d8abd83bf6a48ff0b59e98d7561407cf75b591cffd3fdc5dc5e9a13dec1c847a7a690983762a3afecddb244831e897e0515c293e7c653b262c30cd614af + languageName: node + linkType: hard + +"@babel/plugin-transform-object-super@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-object-super@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-replace-supers": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/770cebb4b4e1872c216b17069db9a13b87dfee747d359dc56d9fcdd66e7544f92dc6ab1861a4e7e0528196aaff2444e4f17dc84efd8eaf162d542b4ba0943869 + languageName: node + linkType: hard + +"@babel/plugin-transform-object-super@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-object-super@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-replace-supers": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/0348d00e76f1f15ada44481a76e8c923d24cba91f6e49ee9b30d6861eb75344e7f84d62a18df8a6f9e9a7eacf992f388174b7f9cc4ce48287bcefca268c07600 + languageName: node + linkType: hard + +"@babel/plugin-transform-optional-catch-binding@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/1e2f10a018f7d03b3bde6c0b70d063df8d5dd5209861d4467726cf834f5e3d354e2276079dc226aa8e6ece35f5c9b264d64b8229a8bb232829c01e561bcfb07a + languageName: node + linkType: hard + +"@babel/plugin-transform-optional-catch-binding@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/722fd5ee12ab905309d4e84421584fce4b6d9e6b639b06afb20b23fa809e6ab251e908a8d5e8b14d066a28186b8ef8f58d69fd6eca9ce1b9ef7af08333378f6c + languageName: node + linkType: hard + +"@babel/plugin-transform-optional-chaining@npm:^7.24.7, @babel/plugin-transform-optional-chaining@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.8" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/4ffbe1aad7dec7c9aa2bf6ceb4b2f91f96815b2784f2879bde80e46934f59d64a12cb2c6262e40897c4754d77d2c35d8a5cfed63044fdebf94978b1ed3d14b17 + languageName: node + linkType: hard + +"@babel/plugin-transform-optional-chaining@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/041ad2beae5affb8e68a0bcb6882a2dadb758db3c629a0e012f57488ab43a822ac1ea17a29db8ef36560a28262a5dfa4dbbbf06ed6e431db55abe024b7cd3961 + languageName: node + linkType: hard + +"@babel/plugin-transform-parameters@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-parameters@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/53bf190d6926771545d5184f1f5f3f5144d0f04f170799ad46a43f683a01fab8d5fe4d2196cf246774530990c31fe1f2b9f0def39f0a5ddbb2340b924f5edf01 + languageName: node + linkType: hard + +"@babel/plugin-transform-parameters@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-parameters@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/aecb446754b9e09d6b6fa95fd09e7cf682f8aaeed1d972874ba24c0a30a7e803ad5f014bb1fffc7bfeed22f93c0d200947407894ea59bf7687816f2f464f8df3 + languageName: node + linkType: hard + +"@babel/plugin-transform-private-methods@npm:^7.25.4": + version: 7.25.4 + resolution: "@babel/plugin-transform-private-methods@npm:7.25.4" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.25.4" + "@babel/helper-plugin-utils": "npm:^7.24.8" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7abdb427c3984a2c8a2e9d806297d8509b02f78a3501b7760e544be532446e9df328b876daa8fc38718f3dce7ccc45083016ee7aeaab169b81c142bc18700794 + languageName: node + linkType: hard + +"@babel/plugin-transform-private-methods@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-private-methods@npm:7.25.9" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/64bd71de93d39daefa3e6c878d6f2fd238ed7d4ecfb13b0e771ddbbc131487def3ceb405b62b534a5cbb5043046b504e1b189b0a45229cc75af979a9fbcaa7bd + languageName: node + linkType: hard + +"@babel/plugin-transform-private-property-in-object@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.7" + "@babel/helper-create-class-features-plugin": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c6fa7defb90b1b0ed46f24ff94ff2e77f44c1f478d1090e81712f33cf992dda5ba347016f030082a2f770138bac6f4a9c2c1565e9f767a125901c77dd9c239ba + languageName: node + linkType: hard + +"@babel/plugin-transform-private-property-in-object@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d4965de19d9f204e692cc74dbc39f0bb469e5f29df96dd4457ea23c5e5596fba9d5af76eaa96f9d48a9fc20ec5f12a94c679285e36b8373406868ea228109e27 + languageName: node + linkType: hard + +"@babel/plugin-transform-property-literals@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-property-literals@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/52564b58f3d111dc02d241d5892a4b01512e98dfdf6ef11b0ed62f8b11b0acacccef0fc229b44114fe8d1a57a8b70780b11bdd18b807d3754a781a07d8f57433 + languageName: node + linkType: hard + +"@babel/plugin-transform-property-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-property-literals@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/1639e35b2438ccf3107af760d34e6a8e4f9acdd3ae6186ae771a6e3029bd59dfe778e502d67090f1185ecda5c16addfed77561e39c518a3f51ff10d41790e106 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-constant-elements@npm:^7.21.3": + version: 7.25.1 + resolution: "@babel/plugin-transform-react-constant-elements@npm:7.25.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.8" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8e9a61e8d74804ad3e4c8051463b2d8c42be5aa1f381f7b0db3ac8696a5cb5faead54036b1e4bcd53f6ab74c0bb3e45e4d9a1a2f50b9a575a8d7965b77d89c28 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-display-name@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-react-display-name@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c14a07a9e75723c96f1a0a306b8a8e899ff1c6a0cc3d62bcda79bb1b54e4319127b258651c513a1a47da152cdc22e16525525a30ae5933a2980c7036fd0b4d24 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-display-name@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-display-name@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/63a0f962d64e71baf87c212755419e25c637d2d95ea6fdc067df26b91e606ae186442ae815b99a577eca9bf5404d9577ecad218a3cf42d0e9e286ca7b003a992 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-jsx-development@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-react-jsx-development@npm:7.24.7" + dependencies: + "@babel/plugin-transform-react-jsx": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/fce647db50f90a5291681f0f97865d9dc76981262dff71d6d0332e724b85343de5860c26f9e9a79e448d61e1d70916b07ce91e8c7f2b80dceb4b16aee41794d8 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-jsx-development@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-jsx-development@npm:7.25.9" + dependencies: + "@babel/plugin-transform-react-jsx": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c0b92ff9eb029620abf320ff74aae182cea87524723d740fb48a4373d0d16bddf5edbe1116e7ba341332a5337e55c2ceaee8b8cad5549e78af7f4b3cfe77debb + languageName: node + linkType: hard + +"@babel/plugin-transform-react-jsx@npm:^7.24.7": + version: 7.25.2 + resolution: "@babel/plugin-transform-react-jsx@npm:7.25.2" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.7" + "@babel/helper-module-imports": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/plugin-syntax-jsx": "npm:^7.24.7" + "@babel/types": "npm:^7.25.2" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8c5b515f38118471197605e02bea54a8a4283010e3c55bad8cfb78de59ad63612b14d40baca63689afdc9d57b147aac4c7794fe5f7736c9e1ed6dd38784be624 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-jsx@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-jsx@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/plugin-syntax-jsx": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5c9947e8ed141f7606f54da3e05eea1074950c5b8354c39df69cb7f43cb5a83c6c9d7973b24bc3d89341c8611f8ad50830a98ab10d117d850e6bdd8febdce221 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-pure-annotations@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.24.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/fae517d293d9c93b7b920458c3e4b91cb0400513889af41ba184a5f3acc8bfef27242cc262741bb8f87870df376f1733a0d0f52b966d342e2aaaf5607af8f73d + languageName: node + linkType: hard + +"@babel/plugin-transform-react-pure-annotations@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7c8eac04644ad19dcd71bb8e949b0ae22b9e548fa4a58e545d3d0342f647fb89db7f8789a7c5b8074d478ce6d3d581eaf47dd4b36027e16fd68211c383839abc + languageName: node + linkType: hard + +"@babel/plugin-transform-regenerator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-regenerator@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + regenerator-transform: "npm:^0.15.2" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d2dc2c788fdae9d97217e70d46ba8ca9db0035c398dc3e161552b0c437113719a75c04f201f9c91ddc8d28a1da60d0b0853f616dead98a396abb9c845c44892b + languageName: node + linkType: hard + +"@babel/plugin-transform-regenerator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-regenerator@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + regenerator-transform: "npm:^0.15.2" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/eef3ffc19f7d291b863635f32b896ad7f87806d9219a0d3404a470219abcfc5b43aabecd691026c48e875b965760d9c16abee25e6447272233f30cd07f453ec7 + languageName: node + linkType: hard + +"@babel/plugin-transform-regexp-modifiers@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.26.0" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/4abc1db6c964efafc7a927cda814c7275275afa4b530483e0936fd614de23cb5802f7ca43edaa402008a723d4e7eac282b6f5283aa2eeb3b27da6d6c1dd7f8ed + languageName: node + linkType: hard + +"@babel/plugin-transform-reserved-words@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-reserved-words@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2229de2768615e7f5dc0bbc55bc121b5678fd6d2febd46c74a58e42bb894d74cd5955c805880f4e02d0e1cf94f6886270eda7fafc1be9305a1ec3b9fd1d063f5 + languageName: node + linkType: hard + +"@babel/plugin-transform-reserved-words@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-reserved-words@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8b028b80d1983e3e02f74e21924323cc66ba930e5c5758909a122aa7d80e341b8b0f42e1698e42b50d47a6ba911332f584200b28e1a4e2104b7514d9dc011e96 + languageName: node + linkType: hard + +"@babel/plugin-transform-runtime@npm:^7.25.9": + version: 7.26.9 + resolution: "@babel/plugin-transform-runtime@npm:7.26.9" + dependencies: + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.26.5" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.6" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2c4d77d0671badc7fd53dcd7015df5db892712436c7e9740ffb2f5b85e8591e5bfe208f78dff402b4ee2d55d0f7a3c0a1102c683f333f4ee0cfa62f68ea68842 + languageName: node + linkType: hard + +"@babel/plugin-transform-shorthand-properties@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/41b155bdbb3be66618358488bf7731b3b2e8fff2de3dbfd541847720a9debfcec14db06a117abedd03c9cd786db20a79e2a86509a4f19513f6e1b610520905cf + languageName: node + linkType: hard + +"@babel/plugin-transform-shorthand-properties@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/05a20d45f0fb62567644c507ccd4e379c1a74dacf887d2b2cac70247415e3f6d7d3bf4850c8b336053144715fedb6200fc38f7130c4b76c94eec9b9c0c2a8e9b + languageName: node + linkType: hard + +"@babel/plugin-transform-spread@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-spread@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/facba1553035f76b0d2930d4ada89a8cd0f45b79579afd35baefbfaf12e3b86096995f4b0c402cf9ee23b3f2ea0a4460c3b1ec0c192d340962c948bb223d4e66 + languageName: node + linkType: hard + +"@babel/plugin-transform-spread@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-spread@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/996c8fed238efc30e0664f9f58bd7ec8c148f4659f84425f68923a094fe891245711d26eb10d1f815f50c124434e076e860dbe9662240844d1b77cd09907dcdf + languageName: node + linkType: hard + +"@babel/plugin-transform-sticky-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5a74ed2ed0a3ab51c3d15fcaf09d9e2fe915823535c7a4d7b019813177d559b69677090e189ec3d5d08b619483eb5ad371fbcfbbff5ace2a76ba33ee566a1109 + languageName: node + linkType: hard + +"@babel/plugin-transform-sticky-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e9612b0615dab4c4fba1c560769616a9bd7b9226c73191ef84b6c3ee185c8b719b4f887cdd8336a0a13400ce606ab4a0d33bc8fa6b4fcdb53e2896d07f2568f6 + languageName: node + linkType: hard + +"@babel/plugin-transform-template-literals@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-template-literals@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/3630f966257bcace122f04d3157416a09d40768c44c3a800855da81146b009187daa21859d1c3b7d13f4e19e8888e60613964b175b2275d451200fb6d8d6cfe6 + languageName: node + linkType: hard + +"@babel/plugin-transform-template-literals@npm:^7.26.8": + version: 7.26.8 + resolution: "@babel/plugin-transform-template-literals@npm:7.26.8" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.26.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/205a938ded9554857a604416d369023a961334b6c20943bd861b45f0e5dbbeca1cf6fda1c2049126e38a0d18865993433fdc78eae3028e94836b3b643c08ba0d + languageName: node + linkType: hard + +"@babel/plugin-transform-typeof-symbol@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.8" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.8" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2f570a4fbbdc5fd85f48165a97452826560051e3b8efb48c3bb0a0a33ee8485633439e7b71bfe3ef705583a1df43f854f49125bd759abdedc195b2cf7e60012a + languageName: node + linkType: hard + +"@babel/plugin-transform-typeof-symbol@npm:^7.26.7": + version: 7.26.7 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.26.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.26.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d5640e3457637e6eee1d7205d255602ccca124ed30e4de10ec75ba179d167e0a826ceeab424e119921f5c995dfddf39ef1f2c91efd2dcbf3f0dc1e7931dfd1d1 + languageName: node + linkType: hard + +"@babel/plugin-transform-typescript@npm:^7.24.7": + version: 7.25.2 + resolution: "@babel/plugin-transform-typescript@npm:7.25.2" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.7" + "@babel/helper-create-class-features-plugin": "npm:^7.25.0" + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" + "@babel/plugin-syntax-typescript": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/b3c941da39ee7ecf72df1b78a01d4108160438245f2ab61befe182f51d17fd0034733c6d079b7efad81e03a66438aa3881a671cd68c5eb0fc775df86b88df996 + languageName: node + linkType: hard + +"@babel/plugin-transform-typescript@npm:^7.25.9": + version: 7.26.8 + resolution: "@babel/plugin-transform-typescript@npm:7.26.8" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/plugin-syntax-typescript": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c1dc02c357b8de0650d4e757fe71db9ac769b68e282a262ca5af2a7f1ff112c4533d54db6f1f58f13072ad547561b0461c46c08233566b37f778ac5f5550fb41 + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-escapes@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8b18e2e66af33471a6971289492beff5c240e56727331db1d34c4338a6a368a82a7ed6d57ec911001b6d65643aed76531e1e7cac93265fb3fb2717f54d845e69 + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-escapes@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/615c84d7c53e1575d54ba9257e753e0b98c5de1e3225237d92f55226eaab8eb5bceb74df43f50f4aa162b0bbcc934ed11feafe2b60b8ec4934ce340fad4b8828 + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-property-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/bc57656eb94584d1b74a385d378818ac2b3fca642e3f649fead8da5fb3f9de22f8461185936915dfb33d5a9104e62e7a47828331248b09d28bb2d59e9276de3e + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-property-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/1685836fc38af4344c3d2a9edbd46f7c7b28d369b63967d5b83f2f6849ec45b97223461cea3d14cc3f0be6ebb284938e637a5ca3955c0e79c873d62f593d615c + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/83f72a345b751566b601dc4d07e9f2c8f1bc0e0c6f7abb56ceb3095b3c9d304de73f85f2f477a09f8cc7edd5e65afd0ff9e376cdbcbea33bc0c28f3705b38fd9 + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/448004f978279e726af26acd54f63f9002c9e2582ecd70d1c5c4436f6de490fcd817afb60016d11c52f5ef17dbaac2590e8cc7bfaf4e91b58c452cf188c7920f + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-sets-regex@npm:^7.25.4": + version: 7.25.4 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.4" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.2" + "@babel/helper-plugin-utils": "npm:^7.24.8" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/f65749835a98d8d6242e961f9276bdcdb09020e791d151ccc145acaca9a66f025b2c7cb761104f139180d35eb066a429596ee6edece81f5fd9244e0edb97d7ec + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-sets-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/56ee04fbe236b77cbcd6035cbf0be7566d1386b8349154ac33244c25f61170c47153a9423cd1d92855f7d6447b53a4a653d9e8fd1eaeeee14feb4b2baf59bd9f + languageName: node + linkType: hard + +"@babel/preset-env@npm:^7.20.2": + version: 7.25.4 + resolution: "@babel/preset-env@npm:7.25.4" + dependencies: + "@babel/compat-data": "npm:^7.25.4" + "@babel/helper-compilation-targets": "npm:^7.25.2" + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-validator-option": "npm:^7.24.8" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.25.3" + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.25.0" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.25.0" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.25.0" + "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + "@babel/plugin-syntax-class-properties": "npm:^7.12.13" + "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" + "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" + "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" + "@babel/plugin-syntax-import-assertions": "npm:^7.24.7" + "@babel/plugin-syntax-import-attributes": "npm:^7.24.7" + "@babel/plugin-syntax-import-meta": "npm:^7.10.4" + "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" + "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" + "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" + "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" + "@babel/plugin-transform-arrow-functions": "npm:^7.24.7" + "@babel/plugin-transform-async-generator-functions": "npm:^7.25.4" + "@babel/plugin-transform-async-to-generator": "npm:^7.24.7" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.7" + "@babel/plugin-transform-block-scoping": "npm:^7.25.0" + "@babel/plugin-transform-class-properties": "npm:^7.25.4" + "@babel/plugin-transform-class-static-block": "npm:^7.24.7" + "@babel/plugin-transform-classes": "npm:^7.25.4" + "@babel/plugin-transform-computed-properties": "npm:^7.24.7" + "@babel/plugin-transform-destructuring": "npm:^7.24.8" + "@babel/plugin-transform-dotall-regex": "npm:^7.24.7" + "@babel/plugin-transform-duplicate-keys": "npm:^7.24.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.25.0" + "@babel/plugin-transform-dynamic-import": "npm:^7.24.7" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.7" + "@babel/plugin-transform-export-namespace-from": "npm:^7.24.7" + "@babel/plugin-transform-for-of": "npm:^7.24.7" + "@babel/plugin-transform-function-name": "npm:^7.25.1" + "@babel/plugin-transform-json-strings": "npm:^7.24.7" + "@babel/plugin-transform-literals": "npm:^7.25.2" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.7" + "@babel/plugin-transform-member-expression-literals": "npm:^7.24.7" + "@babel/plugin-transform-modules-amd": "npm:^7.24.7" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" + "@babel/plugin-transform-modules-systemjs": "npm:^7.25.0" + "@babel/plugin-transform-modules-umd": "npm:^7.24.7" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.7" + "@babel/plugin-transform-new-target": "npm:^7.24.7" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.7" + "@babel/plugin-transform-numeric-separator": "npm:^7.24.7" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7" + "@babel/plugin-transform-object-super": "npm:^7.24.7" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.7" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.8" + "@babel/plugin-transform-parameters": "npm:^7.24.7" + "@babel/plugin-transform-private-methods": "npm:^7.25.4" + "@babel/plugin-transform-private-property-in-object": "npm:^7.24.7" + "@babel/plugin-transform-property-literals": "npm:^7.24.7" + "@babel/plugin-transform-regenerator": "npm:^7.24.7" + "@babel/plugin-transform-reserved-words": "npm:^7.24.7" + "@babel/plugin-transform-shorthand-properties": "npm:^7.24.7" + "@babel/plugin-transform-spread": "npm:^7.24.7" + "@babel/plugin-transform-sticky-regex": "npm:^7.24.7" + "@babel/plugin-transform-template-literals": "npm:^7.24.7" + "@babel/plugin-transform-typeof-symbol": "npm:^7.24.8" + "@babel/plugin-transform-unicode-escapes": "npm:^7.24.7" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.7" + "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.25.4" + "@babel/preset-modules": "npm:0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.6" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" + core-js-compat: "npm:^3.37.1" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/ed210a1974b5a1e7f80a933c87253907ec869457cea900bc97892642fa9a690c47627a9bac08a7c9495deb992a2b15f308ffca2741e1876ba47172c96fa27e14 + languageName: node + linkType: hard + +"@babel/preset-env@npm:^7.25.9": + version: 7.26.9 + resolution: "@babel/preset-env@npm:7.26.9" + dependencies: + "@babel/compat-data": "npm:^7.26.8" + "@babel/helper-compilation-targets": "npm:^7.26.5" + "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-validator-option": "npm:^7.25.9" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.25.9" + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.25.9" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.25.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.25.9" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.25.9" + "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions": "npm:^7.26.0" + "@babel/plugin-syntax-import-attributes": "npm:^7.26.0" + "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" + "@babel/plugin-transform-arrow-functions": "npm:^7.25.9" + "@babel/plugin-transform-async-generator-functions": "npm:^7.26.8" + "@babel/plugin-transform-async-to-generator": "npm:^7.25.9" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.26.5" + "@babel/plugin-transform-block-scoping": "npm:^7.25.9" + "@babel/plugin-transform-class-properties": "npm:^7.25.9" + "@babel/plugin-transform-class-static-block": "npm:^7.26.0" + "@babel/plugin-transform-classes": "npm:^7.25.9" + "@babel/plugin-transform-computed-properties": "npm:^7.25.9" + "@babel/plugin-transform-destructuring": "npm:^7.25.9" + "@babel/plugin-transform-dotall-regex": "npm:^7.25.9" + "@babel/plugin-transform-duplicate-keys": "npm:^7.25.9" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.25.9" + "@babel/plugin-transform-dynamic-import": "npm:^7.25.9" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.26.3" + "@babel/plugin-transform-export-namespace-from": "npm:^7.25.9" + "@babel/plugin-transform-for-of": "npm:^7.26.9" + "@babel/plugin-transform-function-name": "npm:^7.25.9" + "@babel/plugin-transform-json-strings": "npm:^7.25.9" + "@babel/plugin-transform-literals": "npm:^7.25.9" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.25.9" + "@babel/plugin-transform-member-expression-literals": "npm:^7.25.9" + "@babel/plugin-transform-modules-amd": "npm:^7.25.9" + "@babel/plugin-transform-modules-commonjs": "npm:^7.26.3" + "@babel/plugin-transform-modules-systemjs": "npm:^7.25.9" + "@babel/plugin-transform-modules-umd": "npm:^7.25.9" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.25.9" + "@babel/plugin-transform-new-target": "npm:^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.26.6" + "@babel/plugin-transform-numeric-separator": "npm:^7.25.9" + "@babel/plugin-transform-object-rest-spread": "npm:^7.25.9" + "@babel/plugin-transform-object-super": "npm:^7.25.9" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.25.9" + "@babel/plugin-transform-optional-chaining": "npm:^7.25.9" + "@babel/plugin-transform-parameters": "npm:^7.25.9" + "@babel/plugin-transform-private-methods": "npm:^7.25.9" + "@babel/plugin-transform-private-property-in-object": "npm:^7.25.9" + "@babel/plugin-transform-property-literals": "npm:^7.25.9" + "@babel/plugin-transform-regenerator": "npm:^7.25.9" + "@babel/plugin-transform-regexp-modifiers": "npm:^7.26.0" + "@babel/plugin-transform-reserved-words": "npm:^7.25.9" + "@babel/plugin-transform-shorthand-properties": "npm:^7.25.9" + "@babel/plugin-transform-spread": "npm:^7.25.9" + "@babel/plugin-transform-sticky-regex": "npm:^7.25.9" + "@babel/plugin-transform-template-literals": "npm:^7.26.8" + "@babel/plugin-transform-typeof-symbol": "npm:^7.26.7" + "@babel/plugin-transform-unicode-escapes": "npm:^7.25.9" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.25.9" + "@babel/plugin-transform-unicode-regex": "npm:^7.25.9" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.25.9" + "@babel/preset-modules": "npm:0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.11.0" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" + core-js-compat: "npm:^3.40.0" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/6812ca76bd38165a58fe8354bab5e7204e1aa17d8b9270bd8f8babb08cc7fa94cd29525fe41b553f2ba0e84033d566f10da26012b8ee0f81897005c5225d0051 + languageName: node + linkType: hard + +"@babel/preset-modules@npm:0.1.6-no-external-plugins": + version: 0.1.6-no-external-plugins + resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.0.0" + "@babel/types": "npm:^7.4.4" + esutils: "npm:^2.0.2" + peerDependencies: + "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/9d02f70d7052446c5f3a4fb39e6b632695fb6801e46d31d7f7c5001f7c18d31d1ea8369212331ca7ad4e7877b73231f470b0d559162624128f1b80fe591409e6 + languageName: node + linkType: hard + +"@babel/preset-react@npm:^7.18.6": + version: 7.24.7 + resolution: "@babel/preset-react@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-validator-option": "npm:^7.24.7" + "@babel/plugin-transform-react-display-name": "npm:^7.24.7" + "@babel/plugin-transform-react-jsx": "npm:^7.24.7" + "@babel/plugin-transform-react-jsx-development": "npm:^7.24.7" + "@babel/plugin-transform-react-pure-annotations": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/9658b685b25cedaadd0b65c4e663fbc7f57394b5036ddb4c99b1a75b0711fb83292c1c625d605c05b73413fc7a6dc20e532627f6a39b6dc8d4e00415479b054c + languageName: node + linkType: hard + +"@babel/preset-react@npm:^7.25.9": + version: 7.26.3 + resolution: "@babel/preset-react@npm:7.26.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-validator-option": "npm:^7.25.9" + "@babel/plugin-transform-react-display-name": "npm:^7.25.9" + "@babel/plugin-transform-react-jsx": "npm:^7.25.9" + "@babel/plugin-transform-react-jsx-development": "npm:^7.25.9" + "@babel/plugin-transform-react-pure-annotations": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/b470dcba11032ef6c832066f4af5c75052eaed49feb0f445227231ef1b5c42aacd6e216988c0bd469fd5728cd27b6b059ca307c9ecaa80c6bb5da4bf1c833e12 + languageName: node + linkType: hard + +"@babel/preset-typescript@npm:^7.21.0": + version: 7.24.7 + resolution: "@babel/preset-typescript@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-validator-option": "npm:^7.24.7" + "@babel/plugin-syntax-jsx": "npm:^7.24.7" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.7" + "@babel/plugin-transform-typescript": "npm:^7.24.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/986bc0978eedb4da33aba8e1e13a3426dd1829515313b7e8f4ba5d8c18aff1663b468939d471814e7acf4045d326ae6cff37239878d169ac3fe53a8fde71f8ee + languageName: node + linkType: hard + +"@babel/preset-typescript@npm:^7.25.9": + version: 7.26.0 + resolution: "@babel/preset-typescript@npm:7.26.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-validator-option": "npm:^7.25.9" + "@babel/plugin-syntax-jsx": "npm:^7.25.9" + "@babel/plugin-transform-modules-commonjs": "npm:^7.25.9" + "@babel/plugin-transform-typescript": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/20d86bc45d2bbfde2f84fc7d7b38746fa6481d4bde6643039ad4b1ff0b804c6d210ee43e6830effd8571f2ff43fa7ffd27369f42f2b3a2518bb92dc86c780c61 + languageName: node + linkType: hard + +"@babel/regjsgen@npm:^0.8.0": + version: 0.8.0 + resolution: "@babel/regjsgen@npm:0.8.0" + checksum: 10c0/4f3ddd8c7c96d447e05c8304c1d5ba3a83fcabd8a716bc1091c2f31595cdd43a3a055fff7cb5d3042b8cb7d402d78820fcb4e05d896c605a7d8bcf30f2424c4a + languageName: node + linkType: hard + +"@babel/runtime-corejs3@npm:7.26.10": + version: 7.26.10 + resolution: "@babel/runtime-corejs3@npm:7.26.10" + dependencies: + core-js-pure: "npm:^3.30.2" + regenerator-runtime: "npm:^0.14.0" + checksum: 10c0/897b61d84809d6e63e08566d436cd08a3a78f218283641bb53533948d4bcd5524c6a1f83613e20485cf7fa8d054da20dd9039d17e06c92cf282f25d4d4f57250 + languageName: node + linkType: hard + +"@babel/runtime@npm:7.26.10": + version: 7.26.10 + resolution: "@babel/runtime@npm:7.26.10" + dependencies: + regenerator-runtime: "npm:^0.14.0" + checksum: 10c0/6dc6d88c7908f505c4f7770fb4677dfa61f68f659b943c2be1f2a99cb6680343462867abf2d49822adc435932919b36c77ac60125793e719ea8745f2073d3745 + languageName: node + linkType: hard + +"@babel/template@npm:^7.24.7, @babel/template@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/template@npm:7.25.0" + dependencies: + "@babel/code-frame": "npm:^7.24.7" + "@babel/parser": "npm:^7.25.0" + "@babel/types": "npm:^7.25.0" + checksum: 10c0/4e31afd873215744c016e02b04f43b9fa23205d6d0766fb2e93eb4091c60c1b88897936adb895fb04e3c23de98dfdcbe31bc98daaa1a4e0133f78bb948e1209b + languageName: node + linkType: hard + +"@babel/template@npm:^7.25.9, @babel/template@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/template@npm:7.26.9" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + "@babel/parser": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + checksum: 10c0/019b1c4129cc01ad63e17529089c2c559c74709d225f595eee017af227fee11ae8a97a6ab19ae6768b8aa22d8d75dcb60a00b28f52e9fa78140672d928bc1ae9 + languageName: node + linkType: hard + +"@babel/template@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/template@npm:7.27.0" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + "@babel/parser": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" + checksum: 10c0/13af543756127edb5f62bf121f9b093c09a2b6fe108373887ccffc701465cfbcb17e07cf48aa7f440415b263f6ec006e9415c79dfc2e8e6010b069435f81f340 + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.1, @babel/traverse@npm:^7.25.2, @babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.25.4": + version: 7.25.6 + resolution: "@babel/traverse@npm:7.25.6" + dependencies: + "@babel/code-frame": "npm:^7.24.7" + "@babel/generator": "npm:^7.25.6" + "@babel/parser": "npm:^7.25.6" + "@babel/template": "npm:^7.25.0" + "@babel/types": "npm:^7.25.6" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10c0/964304c6fa46bd705428ba380bf73177eeb481c3f26d82ea3d0661242b59e0dd4329d23886035e9ca9a4ceb565c03a76fd615109830687a27bcd350059d6377e + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.5, @babel/traverse@npm:^7.26.8, @babel/traverse@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/traverse@npm:7.26.9" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.26.9" + "@babel/parser": "npm:^7.26.9" + "@babel/template": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10c0/51dd57fa39ea34d04816806bfead04c74f37301269d24c192d1406dc6e244fea99713b3b9c5f3e926d9ef6aa9cd5c062ad4f2fc1caa9cf843d5e864484ac955e + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.26.10": + version: 7.27.0 + resolution: "@babel/traverse@npm:7.27.0" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.27.0" + "@babel/parser": "npm:^7.27.0" + "@babel/template": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10c0/c7af29781960dacaae51762e8bc6c4b13d6ab4b17312990fbca9fc38e19c4ad7fecaae24b1cf52fb844e8e6cdc76c70ad597f90e496bcb3cc0a1d66b41a0aa5b + languageName: node + linkType: hard + +"@babel/types@npm:^7.21.3, @babel/types@npm:^7.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.6, @babel/types@npm:^7.4.4": + version: 7.25.6 + resolution: "@babel/types@npm:7.25.6" + dependencies: + "@babel/helper-string-parser": "npm:^7.24.8" + "@babel/helper-validator-identifier": "npm:^7.24.7" + to-fast-properties: "npm:^2.0.0" + checksum: 10c0/89d45fbee24e27a05dca2d08300a26b905bd384a480448823f6723c72d3a30327c517476389b7280ce8cb9a2c48ef8f47da7f9f6d326faf6f53fd6b68237bdc4 + languageName: node + linkType: hard + +"@babel/types@npm:^7.25.9, @babel/types@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/types@npm:7.26.9" + dependencies: + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10c0/999c56269ba00e5c57aa711fbe7ff071cd6990bafd1b978341ea7572cc78919986e2aa6ee51dacf4b6a7a6fa63ba4eb3f1a03cf55eee31b896a56d068b895964 + languageName: node + linkType: hard + +"@babel/types@npm:^7.26.10, @babel/types@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/types@npm:7.27.0" + dependencies: + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10c0/6f1592eabe243c89a608717b07b72969be9d9d2fce1dee21426238757ea1fa60fdfc09b29de9e48d8104311afc6e6fb1702565a9cc1e09bc1e76f2b2ddb0f6e1 + languageName: node + linkType: hard + +"@braintree/sanitize-url@npm:^7.0.4": + version: 7.1.1 + resolution: "@braintree/sanitize-url@npm:7.1.1" + checksum: 10c0/fdfc1759c4244e287693ce1e9d42d649423e7c203fdccf27a571f8951ddfe34baa5273b7e6a8dd3007d7676859c7a0a9819be0ab42a3505f8505ad0eefecf7c1 + languageName: node + linkType: hard + +"@chevrotain/cst-dts-gen@npm:11.0.3": + version: 11.0.3 + resolution: "@chevrotain/cst-dts-gen@npm:11.0.3" + dependencies: + "@chevrotain/gast": "npm:11.0.3" + "@chevrotain/types": "npm:11.0.3" + lodash-es: "npm:4.17.21" + checksum: 10c0/9e945a0611386e4e08af34c2d0b3af36c1af08f726b58145f11310f2aeafcb2d65264c06ec65a32df6b6a65771e6a55be70580c853afe3ceb51487e506967104 + languageName: node + linkType: hard + +"@chevrotain/gast@npm:11.0.3": + version: 11.0.3 + resolution: "@chevrotain/gast@npm:11.0.3" + dependencies: + "@chevrotain/types": "npm:11.0.3" + lodash-es: "npm:4.17.21" + checksum: 10c0/54fc44d7b4a7b0323f49d957dd88ad44504922d30cb226d93b430b0e09925efe44e0726068581d777f423fabfb878a2238ed2c87b690c0c0014ebd12b6968354 + languageName: node + linkType: hard + +"@chevrotain/regexp-to-ast@npm:11.0.3": + version: 11.0.3 + resolution: "@chevrotain/regexp-to-ast@npm:11.0.3" + checksum: 10c0/6939c5c94fbfb8c559a4a37a283af5ded8e6147b184a7d7bcf5ad1404d9d663c78d81602bd8ea8458ec497358a9e1671541099c511835d0be2cad46f00c62b3f + languageName: node + linkType: hard + +"@chevrotain/types@npm:11.0.3": + version: 11.0.3 + resolution: "@chevrotain/types@npm:11.0.3" + checksum: 10c0/72fe8f0010ebef848e47faea14a88c6fdc3cdbafaef6b13df4a18c7d33249b1b675e37b05cb90a421700c7016dae7cd4187ab6b549e176a81cea434f69cd2503 + languageName: node + linkType: hard + +"@chevrotain/utils@npm:11.0.3": + version: 11.0.3 + resolution: "@chevrotain/utils@npm:11.0.3" + checksum: 10c0/b31972d1b2d444eef1499cf9b7576fc1793e8544910de33a3c18e07c270cfad88067f175d0ee63e7bc604713ebed647f8190db45cc8311852cd2d4fe2ef14068 + languageName: node + linkType: hard + +"@cmfcmf/docusaurus-search-local@npm:1.1.0": + version: 1.1.0 + resolution: "@cmfcmf/docusaurus-search-local@npm:1.1.0" + dependencies: + "@algolia/autocomplete-js": "npm:^1.8.2" + "@algolia/autocomplete-theme-classic": "npm:^1.8.2" + "@algolia/client-search": "npm:^4.12.0" + algoliasearch: "npm:^4.12.0" + cheerio: "npm:^1.0.0-rc.9" + clsx: "npm:^1.1.1" + lunr-languages: "npm:^1.4.0" + mark.js: "npm:^8.11.1" + peerDependencies: + "@docusaurus/core": ^2.0.0 + nodejieba: ^2.5.0 + peerDependenciesMeta: + nodejieba: + optional: true + checksum: 10c0/67a8e3c71f1fddeae72ebcc0318ece1badf9f67a3ef9e5d6cd9c259d967ffeba8bc710fae4e865481be9a7cd5e8558f7a08272c6b7d4f935236ba9a80f12a483 + languageName: node + linkType: hard + +"@colors/colors@npm:1.5.0": + version: 1.5.0 + resolution: "@colors/colors@npm:1.5.0" + checksum: 10c0/eb42729851adca56d19a08e48d5a1e95efd2a32c55ae0323de8119052be0510d4b7a1611f2abcbf28c044a6c11e6b7d38f99fccdad7429300c37a8ea5fb95b44 + languageName: node + linkType: hard + +"@csstools/cascade-layer-name-parser@npm:^2.0.5": + version: 2.0.5 + resolution: "@csstools/cascade-layer-name-parser@npm:2.0.5" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10c0/b6c73d5c8132f922edc88b9df5272c93c9753945f1e1077b80d03b314076ffe03c2cc9bf6cbc85501ee7c7f27e477263df96997c9125fd2fd0cfe82fe2d7c141 + languageName: node + linkType: hard + +"@csstools/color-helpers@npm:^5.0.2": + version: 5.0.2 + resolution: "@csstools/color-helpers@npm:5.0.2" + checksum: 10c0/bebaddb28b9eb58b0449edd5d0c0318fa88f3cb079602ee27e88c9118070d666dcc4e09a5aa936aba2fde6ba419922ade07b7b506af97dd7051abd08dfb2959b + languageName: node + linkType: hard + +"@csstools/css-calc@npm:^2.1.4": + version: 2.1.4 + resolution: "@csstools/css-calc@npm:2.1.4" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10c0/42ce5793e55ec4d772083808a11e9fb2dfe36db3ec168713069a276b4c3882205b3507c4680224c28a5d35fe0bc2d308c77f8f2c39c7c09aad8747708eb8ddd8 + languageName: node + linkType: hard + +"@csstools/css-color-parser@npm:^3.0.10": + version: 3.0.10 + resolution: "@csstools/css-color-parser@npm:3.0.10" + dependencies: + "@csstools/color-helpers": "npm:^5.0.2" + "@csstools/css-calc": "npm:^2.1.4" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10c0/8f8a2395b117c2f09366b5c9bf49bc740c92a65b6330fe3cc1e76abafd0d1000e42a657d7b0a3814846a66f1d69896142f7e36d7a4aca77de977e5cc5f944747 + languageName: node + linkType: hard + +"@csstools/css-parser-algorithms@npm:^3.0.5": + version: 3.0.5 + resolution: "@csstools/css-parser-algorithms@npm:3.0.5" + peerDependencies: + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10c0/d9a1c888bd43849ae3437ca39251d5c95d2c8fd6b5ccdb7c45491dfd2c1cbdc3075645e80901d120e4d2c1993db9a5b2d83793b779dbbabcfb132adb142eb7f7 + languageName: node + linkType: hard + +"@csstools/css-tokenizer@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/css-tokenizer@npm:3.0.4" + checksum: 10c0/3b589f8e9942075a642213b389bab75a2d50d05d203727fcdac6827648a5572674caff07907eff3f9a2389d86a4ee47308fafe4f8588f4a77b7167c588d2559f + languageName: node + linkType: hard + +"@csstools/media-query-list-parser@npm:^4.0.3": + version: 4.0.3 + resolution: "@csstools/media-query-list-parser@npm:4.0.3" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10c0/e29d856d57e9a036694662163179fc061a99579f05e7c3c35438b3e063790ae8a9ee9f1fb4b4693d8fc7672ae0801764fe83762ab7b9df2921fcc6172cfd5584 + languageName: node + linkType: hard + +"@csstools/postcss-cascade-layers@npm:^5.0.1": + version: 5.0.1 + resolution: "@csstools/postcss-cascade-layers@npm:5.0.1" + dependencies: + "@csstools/selector-specificity": "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/5cc3c6f220d9216f7ab16e716a20d6db845f127c917521e6236342bfa871accd63eb662a04c1e24a28e396412dcb47b1c4abccc490b88e4010cd704d14a702f1 + languageName: node + linkType: hard + +"@csstools/postcss-color-function@npm:^4.0.10": + version: 4.0.10 + resolution: "@csstools/postcss-color-function@npm:4.0.10" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/a6e65d37a114f95634a07660daa1aa52f4abfb6ddd740cc9267967a5948f5c72469a6ba2432ab1f31616d6f1a4ab963b69f778497496986535831b0b2b399f75 + languageName: node + linkType: hard + +"@csstools/postcss-color-mix-function@npm:^3.0.10": + version: 3.0.10 + resolution: "@csstools/postcss-color-mix-function@npm:3.0.10" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/9505a09a805f52555bd06c8f54d537a99578efe5c7e643c9fdaca8cbb7d74d4d3e07b829c6aed315c75ec5ce113261fb402e01b67e4a423ed39ea8991a6dded0 + languageName: node + linkType: hard + +"@csstools/postcss-color-mix-variadic-function-arguments@npm:^1.0.0": + version: 1.0.0 + resolution: "@csstools/postcss-color-mix-variadic-function-arguments@npm:1.0.0" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/dd45bd19931cc4780247173b793e5f1e6409b76f92b04fe26e07b0fa048aedc7bcbd92356a558581f695654c2f2d189e1b40b14a9c3f246e86e83b0edf646066 + languageName: node + linkType: hard + +"@csstools/postcss-content-alt-text@npm:^2.0.6": + version: 2.0.6 + resolution: "@csstools/postcss-content-alt-text@npm:2.0.6" + dependencies: + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/e7d21002a84d0fba4fe815fb7d3d19b81fb1719a7b6fdd240eb6639d58937b64d6f5c9aa11ffe8a64891a2ed181818cd56d346f58949c2eaa9df7c82ee95ef8e + languageName: node + linkType: hard + +"@csstools/postcss-exponential-functions@npm:^2.0.9": + version: 2.0.9 + resolution: "@csstools/postcss-exponential-functions@npm:2.0.9" + dependencies: + "@csstools/css-calc": "npm:^2.1.4" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/78ea627a87fb23e12616c4e54150363b0e8793064634983dbe0368a0aca1ff73206c2d1f29845773daaf42787e7d1f180ce1b57c43e2b0d10da450101f9f34b6 + languageName: node + linkType: hard + +"@csstools/postcss-font-format-keywords@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-font-format-keywords@npm:4.0.0" + dependencies: + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/eb794fb95fefcac75e606d185255e601636af177866a317b0c6b6c375055e7240be53918229fd8d4bba00df01bedd2256bdac2b0ad4a4c2ec64f9d27cd6ff639 + languageName: node + linkType: hard + +"@csstools/postcss-gamut-mapping@npm:^2.0.10": + version: 2.0.10 + resolution: "@csstools/postcss-gamut-mapping@npm:2.0.10" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/87cd8289478bf88195469fcf4f80c8fed9e0e5ef76a335a10c4c21582542acb16cced1e00e7da90deaf2e62e383a5c6fe402f429f227c87a2c20e2545a69c537 + languageName: node + linkType: hard + +"@csstools/postcss-gradients-interpolation-method@npm:^5.0.10": + version: 5.0.10 + resolution: "@csstools/postcss-gradients-interpolation-method@npm:5.0.10" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/206d079d7679a9609a4fb227ddaf3443d04cff88b55bcfec1cf63c9de372b8720edde8614fc51d2237e4edbff8ce34697f912bc25c2ae41390353fce88455515 + languageName: node + linkType: hard + +"@csstools/postcss-hwb-function@npm:^4.0.10": + version: 4.0.10 + resolution: "@csstools/postcss-hwb-function@npm:4.0.10" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/defb9b319b14228307196b9a88e3cbf0acd1d3768b936716dca846875068ad4453e7a2a3d75d1fab5534c8655e9c555e1fa70d30e2c85d68ed2117a7cfe7837c + languageName: node + linkType: hard + +"@csstools/postcss-ic-unit@npm:^4.0.2": + version: 4.0.2 + resolution: "@csstools/postcss-ic-unit@npm:4.0.2" + dependencies: + "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/26adb8351143e591080f542d87b223ee5ebc5f33f6d03b217505b249ceb19c46a06732a88000e3a1857ae712a6ea0ffa089a24ad8b8042421490539de5c3d0e8 + languageName: node + linkType: hard + +"@csstools/postcss-initial@npm:^2.0.1": + version: 2.0.1 + resolution: "@csstools/postcss-initial@npm:2.0.1" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/dbff7084ef4f1c4647efe2b147001daf172003c15b5e22689f0540d03c8d362f2a332cd9cf136e6c8dcda7564ee30492a4267ea188f72cb9c1000fb9bcfbfef8 + languageName: node + linkType: hard + +"@csstools/postcss-is-pseudo-class@npm:^5.0.3": + version: 5.0.3 + resolution: "@csstools/postcss-is-pseudo-class@npm:5.0.3" + dependencies: + "@csstools/selector-specificity": "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/7980f1cabf32850bac72552e4e9de47412359e36e259a92b9b9af25dae4cce42bbcc5fdca8f384a589565bf383ecb23dec3af9f084d8df18b82552318b2841b6 + languageName: node + linkType: hard + +"@csstools/postcss-light-dark-function@npm:^2.0.9": + version: 2.0.9 + resolution: "@csstools/postcss-light-dark-function@npm:2.0.9" + dependencies: + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/ee2937f0e5dcaafd10349f0914596e8e1ef6f9d46939c6a6b0e2e63cab0552594e5140bf56e485048c3bca6634dd9673a176c57b9e77001332787f4263835c0f + languageName: node + linkType: hard + +"@csstools/postcss-logical-float-and-clear@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-logical-float-and-clear@npm:3.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/71a20e8c37877bf68ae615d7bb93fc11b4f8da8be8b1dc1a6e0fc69e27f189712ed71436b8ed51fa69fdb98b8e6718df2b5f42f246c4d39badaf0e43020fcfd4 + languageName: node + linkType: hard + +"@csstools/postcss-logical-overflow@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-logical-overflow@npm:2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/0e103343d3ff8b34eef01b02355c5e010d272fd12d149a242026bb13ab1577b7f3a11fd4514be9342d96f73d61dac1f093a9bd36ece591753ed09a84eb7fca0a + languageName: node + linkType: hard + +"@csstools/postcss-logical-overscroll-behavior@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-logical-overscroll-behavior@npm:2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/1649601bb26f04d760fb5ebc42cdf414fa2a380b8ec22fe1c117f664c286665a786bd7bbda01b7e7567eaf3cc018a4f36a5c9805f6751cc497da223e0ffe9524 + languageName: node + linkType: hard + +"@csstools/postcss-logical-resize@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-logical-resize@npm:3.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/4f12efcaf5468ff359bb3f32f0f66034b9acc9b3ac21fcd2f30a1c8998fc653ebac0091f35c8b7e8dbfe6ccf595aee67f9b06a67adf45a8844e49a82d98b4386 + languageName: node + linkType: hard + +"@csstools/postcss-logical-viewport-units@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/postcss-logical-viewport-units@npm:3.0.4" + dependencies: + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/f0b5ba38acde3bf0ca880c6e0a883950c99fa9919b0e6290c894d5716569663590f26aa1170fd9483ce14544e46afac006ab3b02781410d5e7c8dd1467c674ce + languageName: node + linkType: hard + +"@csstools/postcss-media-minmax@npm:^2.0.9": + version: 2.0.9 + resolution: "@csstools/postcss-media-minmax@npm:2.0.9" + dependencies: + "@csstools/css-calc": "npm:^2.1.4" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/media-query-list-parser": "npm:^4.0.3" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/d82622ee9de6eacba1abbf31718cd58759d158ed8a575f36f08e982d07a7d83e51fb184178b96c6f7b76cb333bb33cac04d06a750b6b9c5c43ae1c56232880f9 + languageName: node + linkType: hard + +"@csstools/postcss-media-queries-aspect-ratio-number-values@npm:^3.0.5": + version: 3.0.5 + resolution: "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:3.0.5" + dependencies: + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/media-query-list-parser": "npm:^4.0.3" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/a47abdaa7f4b26596bd9d6bb77aed872a232fc12bd144d2c062d9da626e8dfd8336e2fff67617dba61a1666c2b8027145b390d70d5cd4d4f608604e077cfb04e + languageName: node + linkType: hard + +"@csstools/postcss-nested-calc@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-nested-calc@npm:4.0.0" + dependencies: + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/fb61512fa4909bdf0ee32a23e771145086c445f2208a737b52093c8adfab7362c56d3aeaf2a6e33ffcec067e99a07219775465d2fbb1a3ac30cdcfb278b218b7 + languageName: node + linkType: hard + +"@csstools/postcss-normalize-display-values@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-normalize-display-values@npm:4.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/d3a3a362b532163bd791f97348ef28b7a43baf01987c7702b06285e751cdc5ea3e3a2553f088260515b4d28263d5c475923d4d4780ecb4078ec66dff50c9e638 + languageName: node + linkType: hard + +"@csstools/postcss-oklab-function@npm:^4.0.10": + version: 4.0.10 + resolution: "@csstools/postcss-oklab-function@npm:4.0.10" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/421d1f2574941c3caecd608588533581fc0766998cc85474008a49b5f1011249cb2be7ef9f21a346fd3895598da18e58860fde06d34b1b833918fa880c41c18f + languageName: node + linkType: hard + +"@csstools/postcss-progressive-custom-properties@npm:^4.1.0": + version: 4.1.0 + resolution: "@csstools/postcss-progressive-custom-properties@npm:4.1.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/175081a5c53e37a282f596e01359d4411800e4017c2d389caaa2b7c9b7507a50c5f1ac3d937f27f000be3ac2ac788cad9c1490ec6bc1d4de51331f3cc8ccda8e + languageName: node + linkType: hard + +"@csstools/postcss-random-function@npm:^2.0.1": + version: 2.0.1 + resolution: "@csstools/postcss-random-function@npm:2.0.1" + dependencies: + "@csstools/css-calc": "npm:^2.1.4" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/475bacf685b8bb82942d388e9e3b95f4156800f370299f19f5acc490475dc2813100de81a5a6bf48b696b4d83247622005b616af3166a668556b4b1aceded70d + languageName: node + linkType: hard + +"@csstools/postcss-relative-color-syntax@npm:^3.0.10": + version: 3.0.10 + resolution: "@csstools/postcss-relative-color-syntax@npm:3.0.10" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/de9c41a936a77dab68cdb2dd23a26ba1b92d90bf2a7cf463fada2f2daf6ad0d7394fa2b1ed444f509006992961d993383a34a9afd3a48a9dc67a3793afcd9bb8 + languageName: node + linkType: hard + +"@csstools/postcss-scope-pseudo-class@npm:^4.0.1": + version: 4.0.1 + resolution: "@csstools/postcss-scope-pseudo-class@npm:4.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/6a0ca50fae655f4498200d1ce298ca794c85fbe2e3fd5d6419843254f055df5007a973e09b5f1e78e376c02b54278e411516c8d824300c68b265d3e5b311d7ee + languageName: node + linkType: hard + +"@csstools/postcss-sign-functions@npm:^1.1.4": + version: 1.1.4 + resolution: "@csstools/postcss-sign-functions@npm:1.1.4" + dependencies: + "@csstools/css-calc": "npm:^2.1.4" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/ff58108b2527832a84c571a1f40224b5c8d2afa8db2fe3b1e3599ff6f3469d9f4c528a70eb3c25c5d7801e30474fabfec04e7c23bfdad8572ad492053cd4f899 + languageName: node + linkType: hard + +"@csstools/postcss-stepped-value-functions@npm:^4.0.9": + version: 4.0.9 + resolution: "@csstools/postcss-stepped-value-functions@npm:4.0.9" + dependencies: + "@csstools/css-calc": "npm:^2.1.4" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/f143ca06338c30abb2aa37adc3d7e43a78f3b4493093160cb5babe3ec8cf6b86d83876746ee8e162db87b5e9af6e0066958d89fe8b4a503a29568e5c57c1bf8a + languageName: node + linkType: hard + +"@csstools/postcss-text-decoration-shorthand@npm:^4.0.2": + version: 4.0.2 + resolution: "@csstools/postcss-text-decoration-shorthand@npm:4.0.2" + dependencies: + "@csstools/color-helpers": "npm:^5.0.2" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/01e2f3717e7a42224dc1a746491c55a381cf208cb7588f0308eeefe730675be4c7bb56c0cc557e75999c981e67da7d0b0bb68610635752c89ef251ee435b9cac + languageName: node + linkType: hard + +"@csstools/postcss-trigonometric-functions@npm:^4.0.9": + version: 4.0.9 + resolution: "@csstools/postcss-trigonometric-functions@npm:4.0.9" + dependencies: + "@csstools/css-calc": "npm:^2.1.4" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/6ba3d381c977c224f01d47a36f78c9b99d3b89d060a357a9f8840537fdf497d9587a28165dc74e96abdf02f8db0a277d3558646355085a74c8915ee73c6780d1 + languageName: node + linkType: hard + +"@csstools/postcss-unset-value@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-unset-value@npm:4.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/8424ac700ded5bf59d49310335896f10c069e2c3fc6a676b5d13ca5a6fb78689b948f50494df875da284c4c76651deb005eafba70d87e693274628c5a685abfa + languageName: node + linkType: hard + +"@csstools/selector-resolve-nested@npm:^3.1.0": + version: 3.1.0 + resolution: "@csstools/selector-resolve-nested@npm:3.1.0" + peerDependencies: + postcss-selector-parser: ^7.0.0 + checksum: 10c0/c2b1a930ad03c1427ab90b28c4940424fb39e8175130148f16209be3a3937f7a146d5483ca1da1dfc100aa7ae86df713f0ee82d4bbaa9b986e7f47f35cb67cca + languageName: node + linkType: hard + +"@csstools/selector-specificity@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/selector-specificity@npm:5.0.0" + peerDependencies: + postcss-selector-parser: ^7.0.0 + checksum: 10c0/186b444cabcdcdeb553bfe021f80c58bfe9ef38dcc444f2b1f34a5aab9be063ab4e753022b2d5792049c041c28cfbb78e4b707ec398459300e402030d35c07eb + languageName: node + linkType: hard + +"@csstools/utilities@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/utilities@npm:2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/be5c31437b726928f64cd4bb3e47f5b90bfd2e2a69a8eaabd8e89cc6c0977e4f0f7ee48de50c8ed8b07e04e3956a02293247e0da3236d521fb2e836f88f65822 + languageName: node + linkType: hard + +"@discoveryjs/json-ext@npm:0.5.7": + version: 0.5.7 + resolution: "@discoveryjs/json-ext@npm:0.5.7" + checksum: 10c0/e10f1b02b78e4812646ddf289b7d9f2cb567d336c363b266bd50cd223cf3de7c2c74018d91cd2613041568397ef3a4a2b500aba588c6e5bd78c38374ba68f38c + languageName: node + linkType: hard + +"@docsearch/css@npm:3.9.0": + version: 3.9.0 + resolution: "@docsearch/css@npm:3.9.0" + checksum: 10c0/6300551e1cab7a5487063ec3581ae78ddaee3d93ec799556b451054448559b3ba849751b825fbd8b678367ef944bd82b3f11bc1d9e74e08e3cc48db40487b396 + languageName: node + linkType: hard + +"@docsearch/react@npm:^3.9.0": + version: 3.9.0 + resolution: "@docsearch/react@npm:3.9.0" + dependencies: + "@algolia/autocomplete-core": "npm:1.17.9" + "@algolia/autocomplete-preset-algolia": "npm:1.17.9" + "@docsearch/css": "npm:3.9.0" + algoliasearch: "npm:^5.14.2" + peerDependencies: + "@types/react": ">= 16.8.0 < 20.0.0" + react: ">= 16.8.0 < 20.0.0" + react-dom: ">= 16.8.0 < 20.0.0" + search-insights: ">= 1 < 3" + peerDependenciesMeta: + "@types/react": + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + checksum: 10c0/5e737a5d9ef1daae1cd93e89870214c1ab0c36a3a2193e898db044bcc5d9de59f85228b2360ec0e8f10cdac7fd2fe3c6ec8a05d943ee7e17d6c1cef2e6e9ff2d + languageName: node + linkType: hard + +"@docusaurus/babel@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/babel@npm:3.8.1" + dependencies: + "@babel/core": "npm:^7.25.9" + "@babel/generator": "npm:^7.25.9" + "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" + "@babel/plugin-transform-runtime": "npm:^7.25.9" + "@babel/preset-env": "npm:^7.25.9" + "@babel/preset-react": "npm:^7.25.9" + "@babel/preset-typescript": "npm:^7.25.9" + "@babel/runtime": "npm:^7.25.9" + "@babel/runtime-corejs3": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + "@docusaurus/logger": "npm:3.8.1" + "@docusaurus/utils": "npm:3.8.1" + babel-plugin-dynamic-import-node: "npm:^2.3.3" + fs-extra: "npm:^11.1.1" + tslib: "npm:^2.6.0" + checksum: 10c0/dc57cf46e70a66547a576c32d30c7a8f61171b860604fdcd04812dcff45e07470796beaee11cb407a0a32a4fda474d373218907e9e85d5ef220145eca5baf898 + languageName: node + linkType: hard + +"@docusaurus/bundler@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/bundler@npm:3.8.1" + dependencies: + "@babel/core": "npm:^7.25.9" + "@docusaurus/babel": "npm:3.8.1" + "@docusaurus/cssnano-preset": "npm:3.8.1" + "@docusaurus/logger": "npm:3.8.1" + "@docusaurus/types": "npm:3.8.1" + "@docusaurus/utils": "npm:3.8.1" + babel-loader: "npm:^9.2.1" + clean-css: "npm:^5.3.3" + copy-webpack-plugin: "npm:^11.0.0" + css-loader: "npm:^6.11.0" + css-minimizer-webpack-plugin: "npm:^5.0.1" + cssnano: "npm:^6.1.2" + file-loader: "npm:^6.2.0" + html-minifier-terser: "npm:^7.2.0" + mini-css-extract-plugin: "npm:^2.9.2" + null-loader: "npm:^4.0.1" + postcss: "npm:^8.5.4" + postcss-loader: "npm:^7.3.4" + postcss-preset-env: "npm:^10.2.1" + terser-webpack-plugin: "npm:^5.3.9" + tslib: "npm:^2.6.0" + url-loader: "npm:^4.1.1" + webpack: "npm:^5.95.0" + webpackbar: "npm:^6.0.1" + peerDependencies: + "@docusaurus/faster": "*" + peerDependenciesMeta: + "@docusaurus/faster": + optional: true + checksum: 10c0/9ef18bf742f3ff582baaf1ce18e676b2886136c1bd56f479cb9eb30e04ed96a2fd97457d3dd418c8360856a19ed59a86e5253bd3e4382688c1abd841f7729257 + languageName: node + linkType: hard + +"@docusaurus/core@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/core@npm:3.8.1" + dependencies: + "@docusaurus/babel": "npm:3.8.1" + "@docusaurus/bundler": "npm:3.8.1" + "@docusaurus/logger": "npm:3.8.1" + "@docusaurus/mdx-loader": "npm:3.8.1" + "@docusaurus/utils": "npm:3.8.1" + "@docusaurus/utils-common": "npm:3.8.1" + "@docusaurus/utils-validation": "npm:3.8.1" + boxen: "npm:^6.2.1" + chalk: "npm:^4.1.2" + chokidar: "npm:^3.5.3" + cli-table3: "npm:^0.6.3" + combine-promises: "npm:^1.1.0" + commander: "npm:^5.1.0" + core-js: "npm:^3.31.1" + detect-port: "npm:^1.5.1" + escape-html: "npm:^1.0.3" + eta: "npm:^2.2.0" + eval: "npm:^0.1.8" + execa: "npm:5.1.1" + fs-extra: "npm:^11.1.1" + html-tags: "npm:^3.3.1" + html-webpack-plugin: "npm:^5.6.0" + leven: "npm:^3.1.0" + lodash: "npm:^4.17.21" + open: "npm:^8.4.0" + p-map: "npm:^4.0.0" + prompts: "npm:^2.4.2" + react-helmet-async: "npm:@slorber/react-helmet-async@1.3.0" + react-loadable: "npm:@docusaurus/react-loadable@6.0.0" + react-loadable-ssr-addon-v5-slorber: "npm:^1.0.1" + react-router: "npm:^5.3.4" + react-router-config: "npm:^5.1.1" + react-router-dom: "npm:^5.3.4" + semver: "npm:^7.5.4" + serve-handler: "npm:^6.1.6" + tinypool: "npm:^1.0.2" + tslib: "npm:^2.6.0" + update-notifier: "npm:^6.0.2" + webpack: "npm:^5.95.0" + webpack-bundle-analyzer: "npm:^4.10.2" + webpack-dev-server: "npm:^4.15.2" + webpack-merge: "npm:^6.0.1" + peerDependencies: + "@mdx-js/react": ^3.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + bin: + docusaurus: bin/docusaurus.mjs + checksum: 10c0/bd9fab011b034bef800d752ff58a6a6e33061fb6d891b32f1b296f41435ff31ddd1e97cf3c49c2cb9d4ecddcef4b1b7e23b900b444d8362eb14e8090fdfda7d8 + languageName: node + linkType: hard + +"@docusaurus/cssnano-preset@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/cssnano-preset@npm:3.8.1" + dependencies: + cssnano-preset-advanced: "npm:^6.1.2" + postcss: "npm:^8.5.4" + postcss-sort-media-queries: "npm:^5.2.0" + tslib: "npm:^2.6.0" + checksum: 10c0/95261dd22d2c0eafd232e27430035783c421a469026b9dd2bcb878e1682c1e947112cef009e77db0b23f571a04c2037ac1959a251da23c5e3f39104376e5cf07 + languageName: node + linkType: hard + +"@docusaurus/logger@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/logger@npm:3.8.1" + dependencies: + chalk: "npm:^4.1.2" + tslib: "npm:^2.6.0" + checksum: 10c0/2943773f1917eb3688437123e137229a1042e4defa8432b255b9d44860c643bfdd8a10fbd544ceb2df33e5100748b113c6ebcb8df0dbcdac9316a7748dafd88e + languageName: node + linkType: hard + +"@docusaurus/mdx-loader@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/mdx-loader@npm:3.8.1" + dependencies: + "@docusaurus/logger": "npm:3.8.1" + "@docusaurus/utils": "npm:3.8.1" + "@docusaurus/utils-validation": "npm:3.8.1" + "@mdx-js/mdx": "npm:^3.0.0" + "@slorber/remark-comment": "npm:^1.0.0" + escape-html: "npm:^1.0.3" + estree-util-value-to-estree: "npm:^3.0.1" + file-loader: "npm:^6.2.0" + fs-extra: "npm:^11.1.1" + image-size: "npm:^2.0.2" + mdast-util-mdx: "npm:^3.0.0" + mdast-util-to-string: "npm:^4.0.0" + rehype-raw: "npm:^7.0.0" + remark-directive: "npm:^3.0.0" + remark-emoji: "npm:^4.0.0" + remark-frontmatter: "npm:^5.0.0" + remark-gfm: "npm:^4.0.0" + stringify-object: "npm:^3.3.0" + tslib: "npm:^2.6.0" + unified: "npm:^11.0.3" + unist-util-visit: "npm:^5.0.0" + url-loader: "npm:^4.1.1" + vfile: "npm:^6.0.1" + webpack: "npm:^5.88.1" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10c0/dc5a2c01eb0bff5648799bd797ac8f8b81e1a12a5a99cfc11549390d49ff28ac2e9b20e10cc5d8dd117c59de33753faaae5c1a5a762f54ad01ffa01aea112a56 + languageName: node + linkType: hard + +"@docusaurus/module-type-aliases@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/module-type-aliases@npm:3.8.1" + dependencies: + "@docusaurus/types": "npm:3.8.1" + "@types/history": "npm:^4.7.11" + "@types/react": "npm:*" + "@types/react-router-config": "npm:*" + "@types/react-router-dom": "npm:*" + react-helmet-async: "npm:@slorber/react-helmet-async@1.3.0" + react-loadable: "npm:@docusaurus/react-loadable@6.0.0" + peerDependencies: + react: "*" + react-dom: "*" + checksum: 10c0/85e2ba80e628dd637607fd18eaa4619b09f7d201afcc3f087ce73cddd141e6e1d894c3936aeae135113faa5845d37144358ae1434557719e7da1f746b288024e + languageName: node + linkType: hard + +"@docusaurus/plugin-content-blog@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/plugin-content-blog@npm:3.8.1" + dependencies: + "@docusaurus/core": "npm:3.8.1" + "@docusaurus/logger": "npm:3.8.1" + "@docusaurus/mdx-loader": "npm:3.8.1" + "@docusaurus/theme-common": "npm:3.8.1" + "@docusaurus/types": "npm:3.8.1" + "@docusaurus/utils": "npm:3.8.1" + "@docusaurus/utils-common": "npm:3.8.1" + "@docusaurus/utils-validation": "npm:3.8.1" + cheerio: "npm:1.0.0-rc.12" + feed: "npm:^4.2.2" + fs-extra: "npm:^11.1.1" + lodash: "npm:^4.17.21" + schema-dts: "npm:^1.1.2" + srcset: "npm:^4.0.0" + tslib: "npm:^2.6.0" + unist-util-visit: "npm:^5.0.0" + utility-types: "npm:^3.10.0" + webpack: "npm:^5.88.1" + peerDependencies: + "@docusaurus/plugin-content-docs": "*" + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10c0/03eaee437a77f73f0de47cfc8aea1de117f9e342e0349ab2767584666098b4a3013041f56d502cbf0531e5ced9f6d8951fc6f1b63600f48b9e039c6a9618d3fe + languageName: node + linkType: hard + +"@docusaurus/plugin-content-docs@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/plugin-content-docs@npm:3.8.1" + dependencies: + "@docusaurus/core": "npm:3.8.1" + "@docusaurus/logger": "npm:3.8.1" + "@docusaurus/mdx-loader": "npm:3.8.1" + "@docusaurus/module-type-aliases": "npm:3.8.1" + "@docusaurus/theme-common": "npm:3.8.1" + "@docusaurus/types": "npm:3.8.1" + "@docusaurus/utils": "npm:3.8.1" + "@docusaurus/utils-common": "npm:3.8.1" + "@docusaurus/utils-validation": "npm:3.8.1" + "@types/react-router-config": "npm:^5.0.7" + combine-promises: "npm:^1.1.0" + fs-extra: "npm:^11.1.1" + js-yaml: "npm:^4.1.0" + lodash: "npm:^4.17.21" + schema-dts: "npm:^1.1.2" + tslib: "npm:^2.6.0" + utility-types: "npm:^3.10.0" + webpack: "npm:^5.88.1" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10c0/243d4caa64632400d8f7f5815bb4de95413f06cfdacb6ddf81e20ee58aaf6f1df52b0b82b95ec166997ab3dbe8ff6240e1eb55ee6c0979f521a69a88c2168b64 + languageName: node + linkType: hard + +"@docusaurus/plugin-content-pages@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/plugin-content-pages@npm:3.8.1" + dependencies: + "@docusaurus/core": "npm:3.8.1" + "@docusaurus/mdx-loader": "npm:3.8.1" + "@docusaurus/types": "npm:3.8.1" + "@docusaurus/utils": "npm:3.8.1" + "@docusaurus/utils-validation": "npm:3.8.1" + fs-extra: "npm:^11.1.1" + tslib: "npm:^2.6.0" + webpack: "npm:^5.88.1" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10c0/d940a966154674f00ffabccd84fc92f14a7a61c1f300da34944e4b79b5eb34951a5d6b0f33c62ea07b787c7131adb6e926b415ca30467439d5afac3cd2b64d34 + languageName: node + linkType: hard + +"@docusaurus/plugin-css-cascade-layers@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/plugin-css-cascade-layers@npm:3.8.1" + dependencies: + "@docusaurus/core": "npm:3.8.1" + "@docusaurus/types": "npm:3.8.1" + "@docusaurus/utils": "npm:3.8.1" + "@docusaurus/utils-validation": "npm:3.8.1" + tslib: "npm:^2.6.0" + checksum: 10c0/a2967dd203c572aa627ecd5cadb90cca1c1515b1f1b8c6db6b7e9ce4490fecc62bedf73a8a7284934aa87ce0a369fefe7521328eefa482edfbf351ff23db91fa + languageName: node + linkType: hard + +"@docusaurus/plugin-debug@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/plugin-debug@npm:3.8.1" + dependencies: + "@docusaurus/core": "npm:3.8.1" + "@docusaurus/types": "npm:3.8.1" + "@docusaurus/utils": "npm:3.8.1" + fs-extra: "npm:^11.1.1" + react-json-view-lite: "npm:^2.3.0" + tslib: "npm:^2.6.0" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10c0/50ab5e510a7e4295daa9290b56a6b0dd18bb0fde42e002e5ba33bc4551e55077dc360b625b0e9d63a2f3c09ba53414984210550b362161bd2fb76460cb96768c + languageName: node + linkType: hard + +"@docusaurus/plugin-google-analytics@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/plugin-google-analytics@npm:3.8.1" + dependencies: + "@docusaurus/core": "npm:3.8.1" + "@docusaurus/types": "npm:3.8.1" + "@docusaurus/utils-validation": "npm:3.8.1" + tslib: "npm:^2.6.0" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10c0/9c2eb5c2678d04d35d855252077f33b761757575fad4e6e1526e538fc1c62174d88117cc2a4ec62ee98d83ad2ece2edfff089107469dfc5dda30d8dc65251776 + languageName: node + linkType: hard + +"@docusaurus/plugin-google-gtag@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/plugin-google-gtag@npm:3.8.1" + dependencies: + "@docusaurus/core": "npm:3.8.1" + "@docusaurus/types": "npm:3.8.1" + "@docusaurus/utils-validation": "npm:3.8.1" + "@types/gtag.js": "npm:^0.0.12" + tslib: "npm:^2.6.0" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10c0/77d6532fef8e442fe73fc12560358606e3c3d395f059ff69a677be7dc1de1e220283eabf8f856eb753c075f61f09774147d504c10ec4b0cf5b6aeb5284ace6dd + languageName: node + linkType: hard + +"@docusaurus/plugin-google-tag-manager@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/plugin-google-tag-manager@npm:3.8.1" + dependencies: + "@docusaurus/core": "npm:3.8.1" + "@docusaurus/types": "npm:3.8.1" + "@docusaurus/utils-validation": "npm:3.8.1" + tslib: "npm:^2.6.0" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10c0/e3d3ae5839479646d418040f6864abc70b15e62b5021dd9fcd18529de7199970d33c59f4174ee99561dc8dff74fa1828698d8b53adf30baaaf656c1df3d8abd1 + languageName: node + linkType: hard + +"@docusaurus/plugin-sitemap@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/plugin-sitemap@npm:3.8.1" + dependencies: + "@docusaurus/core": "npm:3.8.1" + "@docusaurus/logger": "npm:3.8.1" + "@docusaurus/types": "npm:3.8.1" + "@docusaurus/utils": "npm:3.8.1" + "@docusaurus/utils-common": "npm:3.8.1" + "@docusaurus/utils-validation": "npm:3.8.1" + fs-extra: "npm:^11.1.1" + sitemap: "npm:^7.1.1" + tslib: "npm:^2.6.0" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10c0/6d32d0177e38364f281f85f4a777918de33d7202a73146f210e12ca818d1b9af31d42e63bce03a668435b39e2108fe75866d55ecd1268e557e89d55d264d61a6 + languageName: node + linkType: hard + +"@docusaurus/plugin-svgr@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/plugin-svgr@npm:3.8.1" + dependencies: + "@docusaurus/core": "npm:3.8.1" + "@docusaurus/types": "npm:3.8.1" + "@docusaurus/utils": "npm:3.8.1" + "@docusaurus/utils-validation": "npm:3.8.1" + "@svgr/core": "npm:8.1.0" + "@svgr/webpack": "npm:^8.1.0" + tslib: "npm:^2.6.0" + webpack: "npm:^5.88.1" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10c0/65177cbe0a85f551332a84b2aaa880e5a198582df712ebbbe031dc2ce3f22c8c4ed362ff23424625ea2c3012a7d422b11b25e712868e296626842e6ab00077a7 + languageName: node + linkType: hard + +"@docusaurus/preset-classic@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/preset-classic@npm:3.8.1" + dependencies: + "@docusaurus/core": "npm:3.8.1" + "@docusaurus/plugin-content-blog": "npm:3.8.1" + "@docusaurus/plugin-content-docs": "npm:3.8.1" + "@docusaurus/plugin-content-pages": "npm:3.8.1" + "@docusaurus/plugin-css-cascade-layers": "npm:3.8.1" + "@docusaurus/plugin-debug": "npm:3.8.1" + "@docusaurus/plugin-google-analytics": "npm:3.8.1" + "@docusaurus/plugin-google-gtag": "npm:3.8.1" + "@docusaurus/plugin-google-tag-manager": "npm:3.8.1" + "@docusaurus/plugin-sitemap": "npm:3.8.1" + "@docusaurus/plugin-svgr": "npm:3.8.1" + "@docusaurus/theme-classic": "npm:3.8.1" + "@docusaurus/theme-common": "npm:3.8.1" + "@docusaurus/theme-search-algolia": "npm:3.8.1" + "@docusaurus/types": "npm:3.8.1" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10c0/2d32afe5867baf0b3baafdb965b490520cbf9c7939ca3ded489170b24eb779141ffbf46bdd9d8412fc05adf39440937a83b3218fe4571f52776f20f797786697 + languageName: node + linkType: hard + +"@docusaurus/theme-classic@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/theme-classic@npm:3.8.1" + dependencies: + "@docusaurus/core": "npm:3.8.1" + "@docusaurus/logger": "npm:3.8.1" + "@docusaurus/mdx-loader": "npm:3.8.1" + "@docusaurus/module-type-aliases": "npm:3.8.1" + "@docusaurus/plugin-content-blog": "npm:3.8.1" + "@docusaurus/plugin-content-docs": "npm:3.8.1" + "@docusaurus/plugin-content-pages": "npm:3.8.1" + "@docusaurus/theme-common": "npm:3.8.1" + "@docusaurus/theme-translations": "npm:3.8.1" + "@docusaurus/types": "npm:3.8.1" + "@docusaurus/utils": "npm:3.8.1" + "@docusaurus/utils-common": "npm:3.8.1" + "@docusaurus/utils-validation": "npm:3.8.1" + "@mdx-js/react": "npm:^3.0.0" + clsx: "npm:^2.0.0" + copy-text-to-clipboard: "npm:^3.2.0" + infima: "npm:0.2.0-alpha.45" + lodash: "npm:^4.17.21" + nprogress: "npm:^0.2.0" + postcss: "npm:^8.5.4" + prism-react-renderer: "npm:^2.3.0" + prismjs: "npm:^1.29.0" + react-router-dom: "npm:^5.3.4" + rtlcss: "npm:^4.1.0" + tslib: "npm:^2.6.0" + utility-types: "npm:^3.10.0" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10c0/3a37763875f41e8ac9c6baf6d796eb7804fd831eae3965db28b48e642b712b5fa4ba0c67bcb7056fe59220d0ccfa8e0320a7fb3bfe496f82b49b976ccfa50729 + languageName: node + linkType: hard + +"@docusaurus/theme-common@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/theme-common@npm:3.8.1" + dependencies: + "@docusaurus/mdx-loader": "npm:3.8.1" + "@docusaurus/module-type-aliases": "npm:3.8.1" + "@docusaurus/utils": "npm:3.8.1" + "@docusaurus/utils-common": "npm:3.8.1" + "@types/history": "npm:^4.7.11" + "@types/react": "npm:*" + "@types/react-router-config": "npm:*" + clsx: "npm:^2.0.0" + parse-numeric-range: "npm:^1.3.0" + prism-react-renderer: "npm:^2.3.0" + tslib: "npm:^2.6.0" + utility-types: "npm:^3.10.0" + peerDependencies: + "@docusaurus/plugin-content-docs": "*" + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10c0/23a4b766778acb10321c617408ac7c65db08fe2d5493be3d6faeeec0ec1be90f00031f691e2ae6716054136b543455eeb4c2a8ef6987a8bc4d474bf4cba53acb + languageName: node + linkType: hard + +"@docusaurus/theme-mermaid@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/theme-mermaid@npm:3.8.1" + dependencies: + "@docusaurus/core": "npm:3.8.1" + "@docusaurus/module-type-aliases": "npm:3.8.1" + "@docusaurus/theme-common": "npm:3.8.1" + "@docusaurus/types": "npm:3.8.1" + "@docusaurus/utils-validation": "npm:3.8.1" + mermaid: "npm:>=11.6.0" + tslib: "npm:^2.6.0" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10c0/7beb615f34d8827ab9f510a17bc84a76d004f7f16866d9e680339b7db55ef82543be328c6e17e3f1ed646d50499ab6469dcd07abe8e12e6fd7acf1610311f94f + languageName: node + linkType: hard + +"@docusaurus/theme-search-algolia@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/theme-search-algolia@npm:3.8.1" + dependencies: + "@docsearch/react": "npm:^3.9.0" + "@docusaurus/core": "npm:3.8.1" + "@docusaurus/logger": "npm:3.8.1" + "@docusaurus/plugin-content-docs": "npm:3.8.1" + "@docusaurus/theme-common": "npm:3.8.1" + "@docusaurus/theme-translations": "npm:3.8.1" + "@docusaurus/utils": "npm:3.8.1" + "@docusaurus/utils-validation": "npm:3.8.1" + algoliasearch: "npm:^5.17.1" + algoliasearch-helper: "npm:^3.22.6" + clsx: "npm:^2.0.0" + eta: "npm:^2.2.0" + fs-extra: "npm:^11.1.1" + lodash: "npm:^4.17.21" + tslib: "npm:^2.6.0" + utility-types: "npm:^3.10.0" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10c0/ed29e2f88a0d9075c433303706fe7fbc0aa75f6bedf01e3549534c906669a290b3b2d062642961975f917cd952ab48a0ba838e4288e7caf23a73a856c23327f0 + languageName: node + linkType: hard + +"@docusaurus/theme-translations@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/theme-translations@npm:3.8.1" + dependencies: + fs-extra: "npm:^11.1.1" + tslib: "npm:^2.6.0" + checksum: 10c0/6c4b3db8beaf90d03f5c048e960df34aa57cae933f3db5be5973efe72556850059461fcf420458857efe951666cb9935853a17f4dd15dc0c8cabe7042f1d8c5e + languageName: node + linkType: hard + +"@docusaurus/types@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/types@npm:3.8.1" + dependencies: + "@mdx-js/mdx": "npm:^3.0.0" + "@types/history": "npm:^4.7.11" + "@types/react": "npm:*" + commander: "npm:^5.1.0" + joi: "npm:^17.9.2" + react-helmet-async: "npm:@slorber/react-helmet-async@1.3.0" + utility-types: "npm:^3.10.0" + webpack: "npm:^5.95.0" + webpack-merge: "npm:^5.9.0" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10c0/1a70a104c73b8cd6329e5feda72732be606d65d5fbd7b99453756dac50dd91f7d35ddacd782468d7b92f786ab0094a68bed45e52fa104e5fa3bb4836282a6f41 + languageName: node + linkType: hard + +"@docusaurus/utils-common@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/utils-common@npm:3.8.1" + dependencies: + "@docusaurus/types": "npm:3.8.1" + tslib: "npm:^2.6.0" + checksum: 10c0/59c672880c860560b0896b43bdc6f6ce868c2efb9b804b578b3449c9cd45669fe350a16ea35469f9da85d5f3166a404c46284476d1c91c35826cd51f7c8edba7 + languageName: node + linkType: hard + +"@docusaurus/utils-validation@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/utils-validation@npm:3.8.1" + dependencies: + "@docusaurus/logger": "npm:3.8.1" + "@docusaurus/utils": "npm:3.8.1" + "@docusaurus/utils-common": "npm:3.8.1" + fs-extra: "npm:^11.2.0" + joi: "npm:^17.9.2" + js-yaml: "npm:^4.1.0" + lodash: "npm:^4.17.21" + tslib: "npm:^2.6.0" + checksum: 10c0/e64008cd8575b9699a1772665b8bc2508f2410a6c9bc4858a9bc3c8a988a1cad10f63fd336fc7333df6d2dfb111a701f829b64faf053f0a73e7196ec3e122221 + languageName: node + linkType: hard + +"@docusaurus/utils@npm:3.8.1": + version: 3.8.1 + resolution: "@docusaurus/utils@npm:3.8.1" + dependencies: + "@docusaurus/logger": "npm:3.8.1" + "@docusaurus/types": "npm:3.8.1" + "@docusaurus/utils-common": "npm:3.8.1" + escape-string-regexp: "npm:^4.0.0" + execa: "npm:5.1.1" + file-loader: "npm:^6.2.0" + fs-extra: "npm:^11.1.1" + github-slugger: "npm:^1.5.0" + globby: "npm:^11.1.0" + gray-matter: "npm:^4.0.3" + jiti: "npm:^1.20.0" + js-yaml: "npm:^4.1.0" + lodash: "npm:^4.17.21" + micromatch: "npm:^4.0.5" + p-queue: "npm:^6.6.2" + prompts: "npm:^2.4.2" + resolve-pathname: "npm:^3.0.0" + tslib: "npm:^2.6.0" + url-loader: "npm:^4.1.1" + utility-types: "npm:^3.10.0" + webpack: "npm:^5.88.1" + checksum: 10c0/a44c9d7b7e268ad5783cbaa9b554bf78e03d6601dfc31be83c4d90977e862b5d342f758e46d63daeb91721c93d5da3c4e6dc94765d56dfb6a419583f2677619b + languageName: node + linkType: hard + +"@hapi/hoek@npm:^9.0.0, @hapi/hoek@npm:^9.3.0": + version: 9.3.0 + resolution: "@hapi/hoek@npm:9.3.0" + checksum: 10c0/a096063805051fb8bba4c947e293c664b05a32b47e13bc654c0dd43813a1cec993bdd8f29ceb838020299e1d0f89f68dc0d62a603c13c9cc8541963f0beca055 + languageName: node + linkType: hard + +"@hapi/topo@npm:^5.1.0": + version: 5.1.0 + resolution: "@hapi/topo@npm:5.1.0" + dependencies: + "@hapi/hoek": "npm:^9.0.0" + checksum: 10c0/b16b06d9357947149e032bdf10151eb71aea8057c79c4046bf32393cb89d0d0f7ca501c40c0f7534a5ceca078de0700d2257ac855c15e59fe4e00bba2f25c86f + languageName: node + linkType: hard + +"@iconify/types@npm:^2.0.0": + version: 2.0.0 + resolution: "@iconify/types@npm:2.0.0" + checksum: 10c0/65a3be43500c7ccacf360e136d00e1717f050b7b91da644e94370256ac66f582d59212bdb30d00788aab4fc078262e91c95b805d1808d654b72f6d2072a7e4b2 + languageName: node + linkType: hard + +"@iconify/utils@npm:^2.1.33": + version: 2.3.0 + resolution: "@iconify/utils@npm:2.3.0" + dependencies: + "@antfu/install-pkg": "npm:^1.0.0" + "@antfu/utils": "npm:^8.1.0" + "@iconify/types": "npm:^2.0.0" + debug: "npm:^4.4.0" + globals: "npm:^15.14.0" + kolorist: "npm:^1.8.0" + local-pkg: "npm:^1.0.0" + mlly: "npm:^1.7.4" + checksum: 10c0/926013852cd9d09b8501ee0f3f7d40386dc5ed1cb904869d6502f5ee1a64aee5664e9c00da49d700528d26c4a51ea0cac4f046c4eb281d0f8d54fc5df2f3fd0d + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + languageName: node + linkType: hard + +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 + languageName: node + linkType: hard + +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" + dependencies: + "@sinclair/typebox": "npm:^0.27.8" + checksum: 10c0/b329e89cd5f20b9278ae1233df74016ebf7b385e0d14b9f4c1ad18d096c4c19d1e687aa113a9c976b16ec07f021ae53dea811fb8c1248a50ac34fbe009fdf6be + languageName: node + linkType: hard + +"@jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" + dependencies: + "@jest/schemas": "npm:^29.6.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + "@types/istanbul-reports": "npm:^3.0.0" + "@types/node": "npm:*" + "@types/yargs": "npm:^17.0.8" + chalk: "npm:^4.0.0" + checksum: 10c0/ea4e493dd3fb47933b8ccab201ae573dcc451f951dc44ed2a86123cd8541b82aa9d2b1031caf9b1080d6673c517e2dcc25a44b2dc4f3fbc37bfc965d444888c0 + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" + dependencies: + "@jridgewell/set-array": "npm:^1.2.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/1be4fd4a6b0f41337c4f5fdf4afc3bd19e39c3691924817108b82ffcb9c9e609c273f936932b9fba4b3a298ce2eb06d9bff4eb1cc3bd81c4f4ee1b4917e25feb + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 + languageName: node + linkType: hard + +"@jridgewell/source-map@npm:^0.3.3": + version: 0.3.6 + resolution: "@jridgewell/source-map@npm:0.3.6" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + checksum: 10c0/6a4ecc713ed246ff8e5bdcc1ef7c49aaa93f7463d948ba5054dda18b02dcc6a055e2828c577bcceee058f302ce1fc95595713d44f5c45e43d459f88d267f2f04 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: 10c0/0c6b5ae663087558039052a626d2d7ed5208da36cfd707dcc5cea4a07cfc918248403dcb5989a8f7afaf245ce0573b7cc6fd94c4a30453bd10e44d9363940ba5 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 + languageName: node + linkType: hard + +"@leichtgewicht/ip-codec@npm:^2.0.1": + version: 2.0.4 + resolution: "@leichtgewicht/ip-codec@npm:2.0.4" + checksum: 10c0/3b0d8844d1d47c0a5ed7267c2964886adad3a642b85d06f95c148eeefd80cdabbd6aa0d63ccde8239967a2e9b6bb734a16bd57e1fda3d16bf56d50a7e7ec131b + languageName: node + linkType: hard + +"@mdx-js/mdx@npm:^3.0.0": + version: 3.0.1 + resolution: "@mdx-js/mdx@npm:3.0.1" + dependencies: + "@types/estree": "npm:^1.0.0" + "@types/estree-jsx": "npm:^1.0.0" + "@types/hast": "npm:^3.0.0" + "@types/mdx": "npm:^2.0.0" + collapse-white-space: "npm:^2.0.0" + devlop: "npm:^1.0.0" + estree-util-build-jsx: "npm:^3.0.0" + estree-util-is-identifier-name: "npm:^3.0.0" + estree-util-to-js: "npm:^2.0.0" + estree-walker: "npm:^3.0.0" + hast-util-to-estree: "npm:^3.0.0" + hast-util-to-jsx-runtime: "npm:^2.0.0" + markdown-extensions: "npm:^2.0.0" + periscopic: "npm:^3.0.0" + remark-mdx: "npm:^3.0.0" + remark-parse: "npm:^11.0.0" + remark-rehype: "npm:^11.0.0" + source-map: "npm:^0.7.0" + unified: "npm:^11.0.0" + unist-util-position-from-estree: "npm:^2.0.0" + unist-util-stringify-position: "npm:^4.0.0" + unist-util-visit: "npm:^5.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/8cd7084f1242209bbeef81f69ea670ffffa0656dda2893bbd46b1b2b26078a57f9d993f8f82ad8ba16bc969189235140007185276d7673471827331521eae2e0 + languageName: node + linkType: hard + +"@mdx-js/react@npm:^3.0.0": + version: 3.0.1 + resolution: "@mdx-js/react@npm:3.0.1" + dependencies: + "@types/mdx": "npm:^2.0.0" + peerDependencies: + "@types/react": ">=16" + react: ">=16" + checksum: 10c0/d210d926ef488d39ad65f04d821936b668eadcdde3b6421e94ec4200ca7ad17f17d24c5cbc543882586af9f08b10e2eea715c728ce6277487945e05c5199f532 + languageName: node + linkType: hard + +"@mermaid-js/parser@npm:^0.4.0": + version: 0.4.0 + resolution: "@mermaid-js/parser@npm:0.4.0" + dependencies: + langium: "npm:3.3.1" + checksum: 10c0/f0bea89b993c89d9e655e487e6ffd6866897e607264e70a7addc4794683f5c9632376c1e9893246e7e2d5c05569d1b35005a213c283107453b8dff273fb8d8b2 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/agent@npm:3.0.0" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + +"@pnpm/config.env-replace@npm:^1.1.0": + version: 1.1.0 + resolution: "@pnpm/config.env-replace@npm:1.1.0" + checksum: 10c0/4cfc4a5c49ab3d0c6a1f196cfd4146374768b0243d441c7de8fa7bd28eaab6290f514b98490472cc65dbd080d34369447b3e9302585e1d5c099befd7c8b5e55f + languageName: node + linkType: hard + +"@pnpm/network.ca-file@npm:^1.0.1": + version: 1.0.2 + resolution: "@pnpm/network.ca-file@npm:1.0.2" + dependencies: + graceful-fs: "npm:4.2.10" + checksum: 10c0/95f6e0e38d047aca3283550719155ce7304ac00d98911e4ab026daedaf640a63bd83e3d13e17c623fa41ac72f3801382ba21260bcce431c14fbbc06430ecb776 + languageName: node + linkType: hard + +"@pnpm/npm-conf@npm:^2.1.0": + version: 2.2.2 + resolution: "@pnpm/npm-conf@npm:2.2.2" + dependencies: + "@pnpm/config.env-replace": "npm:^1.1.0" + "@pnpm/network.ca-file": "npm:^1.0.1" + config-chain: "npm:^1.1.11" + checksum: 10c0/71393dcfce85603fddd8484b486767163000afab03918303253ae97992615b91d25942f83751366cb40ad2ee32b0ae0a033561de9d878199a024286ff98b0296 + languageName: node + linkType: hard + +"@polka/url@npm:^1.0.0-next.24": + version: 1.0.0-next.25 + resolution: "@polka/url@npm:1.0.0-next.25" + checksum: 10c0/ef61f0a0fe94bb6e1143fc5b9d5a12e6ca9dbd2c57843ebf81db432c21b9f1005c09e8a1ef8b6d5ddfa42146ca65b640feb2d353bd0d3546da46ba59e48a5349 + languageName: node + linkType: hard + +"@sideway/address@npm:^4.1.5": + version: 4.1.5 + resolution: "@sideway/address@npm:4.1.5" + dependencies: + "@hapi/hoek": "npm:^9.0.0" + checksum: 10c0/638eb6f7e7dba209053dd6c8da74d7cc995e2b791b97644d0303a7dd3119263bcb7225a4f6804d4db2bc4f96e5a9d262975a014f58eae4d1753c27cbc96ef959 + languageName: node + linkType: hard + +"@sideway/formula@npm:^3.0.1": + version: 3.0.1 + resolution: "@sideway/formula@npm:3.0.1" + checksum: 10c0/3fe81fa9662efc076bf41612b060eb9b02e846ea4bea5bd114f1662b7f1541e9dedcf98aff0d24400bcb92f113964a50e0290b86e284edbdf6346fa9b7e2bf2c + languageName: node + linkType: hard + +"@sideway/pinpoint@npm:^2.0.0": + version: 2.0.0 + resolution: "@sideway/pinpoint@npm:2.0.0" + checksum: 10c0/d2ca75dacaf69b8fc0bb8916a204e01def3105ee44d8be16c355e5f58189eb94039e15ce831f3d544f229889ccfa35562a0ce2516179f3a7ee1bbe0b71e55b36 + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.8 + resolution: "@sinclair/typebox@npm:0.27.8" + checksum: 10c0/ef6351ae073c45c2ac89494dbb3e1f87cc60a93ce4cde797b782812b6f97da0d620ae81973f104b43c9b7eaa789ad20ba4f6a1359f1cc62f63729a55a7d22d4e + languageName: node + linkType: hard + +"@sindresorhus/is@npm:^4.6.0": + version: 4.6.0 + resolution: "@sindresorhus/is@npm:4.6.0" + checksum: 10c0/33b6fb1d0834ec8dd7689ddc0e2781c2bfd8b9c4e4bacbcb14111e0ae00621f2c264b8a7d36541799d74888b5dccdf422a891a5cb5a709ace26325eedc81e22e + languageName: node + linkType: hard + +"@sindresorhus/is@npm:^5.2.0": + version: 5.6.0 + resolution: "@sindresorhus/is@npm:5.6.0" + checksum: 10c0/66727344d0c92edde5760b5fd1f8092b717f2298a162a5f7f29e4953e001479927402d9d387e245fb9dc7d3b37c72e335e93ed5875edfc5203c53be8ecba1b52 + languageName: node + linkType: hard + +"@slorber/remark-comment@npm:^1.0.0": + version: 1.0.0 + resolution: "@slorber/remark-comment@npm:1.0.0" + dependencies: + micromark-factory-space: "npm:^1.0.0" + micromark-util-character: "npm:^1.1.0" + micromark-util-symbol: "npm:^1.0.1" + checksum: 10c0/b8da9d8f560740959c421d3ce5be43952eace1c95cb65402d9473a15e66463346a37fb5f121a6b22a83af51e8845b0b4ff3c321f14ce31bd58fb126acf6c8ed9 + languageName: node + linkType: hard + +"@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/a50bd0baa34faf16bcba712091f94c7f0e230431fe99a9dfc3401fa92823ad3f68495b86ab9bf9044b53839e8c416cfbb37eb3f246ff33f261e0fa9ee1779c5b + languageName: node + linkType: hard + +"@svgr/babel-plugin-remove-jsx-attribute@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-remove-jsx-attribute@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8a98e59bd9971e066815b4129409932f7a4db4866834fe75677ea6d517972fb40b380a69a4413189f20e7947411f9ab1b0f029dd5e8068686a5a0188d3ccd4c7 + languageName: node + linkType: hard + +"@svgr/babel-plugin-remove-jsx-empty-expression@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-remove-jsx-empty-expression@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/517dcca75223bd05d3f056a8514dbba3031278bea4eadf0842c576d84f4651e7a4e0e7082d3ee4ef42456de0f9c4531d8a1917c04876ca64b014b859ca8f1bde + languageName: node + linkType: hard + +"@svgr/babel-plugin-replace-jsx-attribute-value@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-replace-jsx-attribute-value@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/004bd1892053b7e9c1b0bb14acc44e77634ec393722b87b1e4fae53e2c35122a2dd0d5c15e9070dbeec274e22e7693a2b8b48506733a8009ee92b12946fcb10a + languageName: node + linkType: hard + +"@svgr/babel-plugin-svg-dynamic-title@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-svg-dynamic-title@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/80e0a7fcf902f984c705051ca5c82ea6050ccbb70b651a8fea6d0eb5809e4dac274b49ea6be2d87f1eb9dfc0e2d6cdfffe1669ec2117f44b67a60a07d4c0b8b8 + languageName: node + linkType: hard + +"@svgr/babel-plugin-svg-em-dimensions@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-svg-em-dimensions@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/73e92c8277a89279745c0c500f59f083279a8dc30cd552b22981fade2a77628fb2bd2819ee505725fcd2e93f923e3790b52efcff409a159e657b46604a0b9a21 + languageName: node + linkType: hard + +"@svgr/babel-plugin-transform-react-native-svg@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/babel-plugin-transform-react-native-svg@npm:8.1.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/655ed6bc7a208ceaa4ecff0a54ccc36008c3cb31efa90d11e171cab325ebbb21aa78f09c7b65f9b3ddeda3a85f348c0c862902c48be13c14b4de165c847974e3 + languageName: node + linkType: hard + +"@svgr/babel-plugin-transform-svg-component@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/babel-plugin-transform-svg-component@npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/4ac00bb99a3db4ef05e4362f116a3c608ee365a2d26cf7318d8d41a4a5b30a02c80455cce0e62c65b60ed815b5d632bedabac2ccd4b56f998fadef5286e3ded4 + languageName: node + linkType: hard + +"@svgr/babel-preset@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/babel-preset@npm:8.1.0" + dependencies: + "@svgr/babel-plugin-add-jsx-attribute": "npm:8.0.0" + "@svgr/babel-plugin-remove-jsx-attribute": "npm:8.0.0" + "@svgr/babel-plugin-remove-jsx-empty-expression": "npm:8.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value": "npm:8.0.0" + "@svgr/babel-plugin-svg-dynamic-title": "npm:8.0.0" + "@svgr/babel-plugin-svg-em-dimensions": "npm:8.0.0" + "@svgr/babel-plugin-transform-react-native-svg": "npm:8.1.0" + "@svgr/babel-plugin-transform-svg-component": "npm:8.0.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/49367d3ad0831f79b1056871b91766246f449d4d1168623af5e283fbaefce4a01d77ab00de6b045b55e956f9aae27895823198493cd232d88d3435ea4517ffc5 + languageName: node + linkType: hard + +"@svgr/core@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/core@npm:8.1.0" + dependencies: + "@babel/core": "npm:^7.21.3" + "@svgr/babel-preset": "npm:8.1.0" + camelcase: "npm:^6.2.0" + cosmiconfig: "npm:^8.1.3" + snake-case: "npm:^3.0.4" + checksum: 10c0/6a2f6b1bc79bce39f66f088d468985d518005fc5147ebf4f108570a933818b5951c2cb7da230ddff4b7c8028b5a672b2d33aa2acce012b8b9770073aa5a2d041 + languageName: node + linkType: hard + +"@svgr/hast-util-to-babel-ast@npm:8.0.0": + version: 8.0.0 + resolution: "@svgr/hast-util-to-babel-ast@npm:8.0.0" + dependencies: + "@babel/types": "npm:^7.21.3" + entities: "npm:^4.4.0" + checksum: 10c0/f4165b583ba9eaf6719e598977a7b3ed182f177983e55f9eb55a6a73982d81277510e9eb7ab41f255151fb9ed4edd11ac4bef95dd872f04ed64966d8c85e0f79 + languageName: node + linkType: hard + +"@svgr/plugin-jsx@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/plugin-jsx@npm:8.1.0" + dependencies: + "@babel/core": "npm:^7.21.3" + "@svgr/babel-preset": "npm:8.1.0" + "@svgr/hast-util-to-babel-ast": "npm:8.0.0" + svg-parser: "npm:^2.0.4" + peerDependencies: + "@svgr/core": "*" + checksum: 10c0/07b4d9e00de795540bf70556fa2cc258774d01e97a12a26234c6fdf42b309beb7c10f31ee24d1a71137239347b1547b8bb5587d3a6de10669f95dcfe99cddc56 + languageName: node + linkType: hard + +"@svgr/plugin-svgo@npm:8.1.0": + version: 8.1.0 + resolution: "@svgr/plugin-svgo@npm:8.1.0" + dependencies: + cosmiconfig: "npm:^8.1.3" + deepmerge: "npm:^4.3.1" + svgo: "npm:^3.0.2" + peerDependencies: + "@svgr/core": "*" + checksum: 10c0/bfd25460f23f1548bfb8f6f3bedd6d6972c1a4f8881bd35a4f8c115218da6e999e8f9ac0ef0ed88c4e0b93fcec37f382b94c0322f4ec2b26752a89e5cc8b9d7a + languageName: node + linkType: hard + +"@svgr/webpack@npm:^8.1.0": + version: 8.1.0 + resolution: "@svgr/webpack@npm:8.1.0" + dependencies: + "@babel/core": "npm:^7.21.3" + "@babel/plugin-transform-react-constant-elements": "npm:^7.21.3" + "@babel/preset-env": "npm:^7.20.2" + "@babel/preset-react": "npm:^7.18.6" + "@babel/preset-typescript": "npm:^7.21.0" + "@svgr/core": "npm:8.1.0" + "@svgr/plugin-jsx": "npm:8.1.0" + "@svgr/plugin-svgo": "npm:8.1.0" + checksum: 10c0/4c1cac45bd5890de8643e5a7bfb71f3bcd8b85ae5bbacf10b8ad9f939b7a98e8d601c3ada204ffb95223abf4a24beeac5a2a0d6928a52a1ab72a29da3c015c22 + languageName: node + linkType: hard + +"@szmarczak/http-timer@npm:^5.0.1": + version: 5.0.1 + resolution: "@szmarczak/http-timer@npm:5.0.1" + dependencies: + defer-to-connect: "npm:^2.0.1" + checksum: 10c0/4629d2fbb2ea67c2e9dc03af235c0991c79ebdddcbc19aed5d5732fb29ce01c13331e9b1a491584b9069bd6ecde6581dcbf871f11b7eefdebbab34de6cf2197e + languageName: node + linkType: hard + +"@trysound/sax@npm:0.2.0": + version: 0.2.0 + resolution: "@trysound/sax@npm:0.2.0" + checksum: 10c0/44907308549ce775a41c38a815f747009ac45929a45d642b836aa6b0a536e4978d30b8d7d680bbd116e9dd73b7dbe2ef0d1369dcfc2d09e83ba381e485ecbe12 + languageName: node + linkType: hard + +"@types/acorn@npm:^4.0.0": + version: 4.0.6 + resolution: "@types/acorn@npm:4.0.6" + dependencies: + "@types/estree": "npm:*" + checksum: 10c0/5a65a1d7e91fc95703f0a717897be60fa7ccd34b17f5462056274a246e6690259fe0a1baabc86fd3260354f87245cb3dc483346d7faad2b78fc199763978ede9 + languageName: node + linkType: hard + +"@types/body-parser@npm:*": + version: 1.19.2 + resolution: "@types/body-parser@npm:1.19.2" + dependencies: + "@types/connect": "npm:*" + "@types/node": "npm:*" + checksum: 10c0/c2dd533e1d4af958d656bdba7f376df68437d8dfb7e4522c88b6f3e6f827549e4be5bf0be68a5f1878accf5752ea37fba7e8a4b6dda53d0d122d77e27b69c750 + languageName: node + linkType: hard + +"@types/bonjour@npm:^3.5.9": + version: 3.5.10 + resolution: "@types/bonjour@npm:3.5.10" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/5a3d70695a8dfe79c020579fcbf18d7dbb89b8f061dd388c76b68c4797c0fccd71f3e8a9e2bea00afffdb9b37a49dd0ac0a192829d5b655a5b49c66f313a7be8 + languageName: node + linkType: hard + +"@types/connect-history-api-fallback@npm:^1.3.5": + version: 1.3.5 + resolution: "@types/connect-history-api-fallback@npm:1.3.5" + dependencies: + "@types/express-serve-static-core": "npm:*" + "@types/node": "npm:*" + checksum: 10c0/06217360db2665fe31351f98d95c1efdbf3919403e748d3a6b4377a79704ef524765ba2ccf499daa9b30fcbe5ef9d08988aee773e89a4998cf47e3800c95b635 + languageName: node + linkType: hard + +"@types/connect@npm:*": + version: 3.4.35 + resolution: "@types/connect@npm:3.4.35" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/f11a1ccfed540723dddd7cb496543ad40a2f663f22ff825e9b220f0bae86db8b1ced2184ee41d3fb358b019ad6519e39481b06386db91ebb859003ad1d54fe6a + languageName: node + linkType: hard + +"@types/d3-array@npm:*": + version: 3.2.1 + resolution: "@types/d3-array@npm:3.2.1" + checksum: 10c0/38bf2c778451f4b79ec81a2288cb4312fe3d6449ecdf562970cc339b60f280f31c93a024c7ff512607795e79d3beb0cbda123bb07010167bce32927f71364bca + languageName: node + linkType: hard + +"@types/d3-axis@npm:*": + version: 3.0.6 + resolution: "@types/d3-axis@npm:3.0.6" + dependencies: + "@types/d3-selection": "npm:*" + checksum: 10c0/d756d42360261f44d8eefd0950c5bb0a4f67a46dd92069da3f723ac36a1e8cb2b9ce6347d836ef19d5b8aef725dbcf8fdbbd6cfbff676ca4b0642df2f78b599a + languageName: node + linkType: hard + +"@types/d3-brush@npm:*": + version: 3.0.6 + resolution: "@types/d3-brush@npm:3.0.6" + dependencies: + "@types/d3-selection": "npm:*" + checksum: 10c0/fd6e2ac7657a354f269f6b9c58451ffae9d01b89ccb1eb6367fd36d635d2f1990967215ab498e0c0679ff269429c57fad6a2958b68f4d45bc9f81d81672edc01 + languageName: node + linkType: hard + +"@types/d3-chord@npm:*": + version: 3.0.6 + resolution: "@types/d3-chord@npm:3.0.6" + checksum: 10c0/c5a25eb5389db01e63faec0c5c2ec7cc41c494e9b3201630b494c4e862a60f1aa83fabbc33a829e7e1403941e3c30d206c741559b14406ac2a4239cfdf4b4c17 + languageName: node + linkType: hard + +"@types/d3-color@npm:*": + version: 3.1.3 + resolution: "@types/d3-color@npm:3.1.3" + checksum: 10c0/65eb0487de606eb5ad81735a9a5b3142d30bc5ea801ed9b14b77cb14c9b909f718c059f13af341264ee189acf171508053342142bdf99338667cea26a2d8d6ae + languageName: node + linkType: hard + +"@types/d3-contour@npm:*": + version: 3.0.6 + resolution: "@types/d3-contour@npm:3.0.6" + dependencies: + "@types/d3-array": "npm:*" + "@types/geojson": "npm:*" + checksum: 10c0/e7d83e94719af4576ceb5ac7f277c5806f83ba6c3631744ae391cffc3641f09dfa279470b83053cd0b2acd6784e8749c71141d05bdffa63ca58ffb5b31a0f27c + languageName: node + linkType: hard + +"@types/d3-delaunay@npm:*": + version: 6.0.4 + resolution: "@types/d3-delaunay@npm:6.0.4" + checksum: 10c0/d154a8864f08c4ea23ecb9bdabcef1c406a25baa8895f0cb08a0ed2799de0d360e597552532ce7086ff0cdffa8f3563f9109d18f0191459d32bb620a36939123 + languageName: node + linkType: hard + +"@types/d3-dispatch@npm:*": + version: 3.0.6 + resolution: "@types/d3-dispatch@npm:3.0.6" + checksum: 10c0/405eb7d0ec139fbf72fa6a43b0f3ca8a1f913bb2cb38f607827e63fca8d4393f021f32f3b96b33c93ddbd37789453a0b3624f14f504add5308fd9aec8a46dda0 + languageName: node + linkType: hard + +"@types/d3-drag@npm:*": + version: 3.0.7 + resolution: "@types/d3-drag@npm:3.0.7" + dependencies: + "@types/d3-selection": "npm:*" + checksum: 10c0/65e29fa32a87c72d26c44b5e2df3bf15af21cd128386bcc05bcacca255927c0397d0cd7e6062aed5f0abd623490544a9d061c195f5ed9f018fe0b698d99c079d + languageName: node + linkType: hard + +"@types/d3-dsv@npm:*": + version: 3.0.7 + resolution: "@types/d3-dsv@npm:3.0.7" + checksum: 10c0/c0f01da862465594c8a28278b51c850af3b4239cc22b14fd1a19d7a98f93d94efa477bf59d8071beb285dca45bf614630811451e18e7c52add3a0abfee0a1871 + languageName: node + linkType: hard + +"@types/d3-ease@npm:*": + version: 3.0.2 + resolution: "@types/d3-ease@npm:3.0.2" + checksum: 10c0/aff5a1e572a937ee9bff6465225d7ba27d5e0c976bd9eacdac2e6f10700a7cb0c9ea2597aff6b43a6ed850a3210030870238894a77ec73e309b4a9d0333f099c + languageName: node + linkType: hard + +"@types/d3-fetch@npm:*": + version: 3.0.7 + resolution: "@types/d3-fetch@npm:3.0.7" + dependencies: + "@types/d3-dsv": "npm:*" + checksum: 10c0/3d147efa52a26da1a5d40d4d73e6cebaaa964463c378068062999b93ea3731b27cc429104c21ecbba98c6090e58ef13429db6399238c5e3500162fb3015697a0 + languageName: node + linkType: hard + +"@types/d3-force@npm:*": + version: 3.0.10 + resolution: "@types/d3-force@npm:3.0.10" + checksum: 10c0/c82b459079a106b50e346c9b79b141f599f2fc4f598985a5211e72c7a2e20d35bd5dc6e91f306b323c8bfa325c02c629b1645f5243f1c6a55bd51bc85cccfa92 + languageName: node + linkType: hard + +"@types/d3-format@npm:*": + version: 3.0.4 + resolution: "@types/d3-format@npm:3.0.4" + checksum: 10c0/3ac1600bf9061a59a228998f7cd3f29e85cbf522997671ba18d4d84d10a2a1aff4f95aceb143fa9960501c3ec351e113fc75884e6a504ace44dc1744083035ee + languageName: node + linkType: hard + +"@types/d3-geo@npm:*": + version: 3.1.0 + resolution: "@types/d3-geo@npm:3.1.0" + dependencies: + "@types/geojson": "npm:*" + checksum: 10c0/3745a93439038bb5b0b38facf435f7079812921d46406f5d38deaee59e90084ff742443c7ea0a8446df81a0d81eaf622fe7068cf4117a544bd4aa3b2dc182f88 + languageName: node + linkType: hard + +"@types/d3-hierarchy@npm:*": + version: 3.1.7 + resolution: "@types/d3-hierarchy@npm:3.1.7" + checksum: 10c0/873711737d6b8e7b6f1dda0bcd21294a48f75024909ae510c5d2c21fad2e72032e0958def4d9f68319d3aaac298ad09c49807f8bfc87a145a82693b5208613c7 + languageName: node + linkType: hard + +"@types/d3-interpolate@npm:*": + version: 3.0.4 + resolution: "@types/d3-interpolate@npm:3.0.4" + dependencies: + "@types/d3-color": "npm:*" + checksum: 10c0/066ebb8da570b518dd332df6b12ae3b1eaa0a7f4f0c702e3c57f812cf529cc3500ec2aac8dc094f31897790346c6b1ebd8cd7a077176727f4860c2b181a65ca4 + languageName: node + linkType: hard + +"@types/d3-path@npm:*": + version: 3.1.1 + resolution: "@types/d3-path@npm:3.1.1" + checksum: 10c0/2c36eb31ebaf2ce4712e793fd88087117976f7c4ed69cc2431825f999c8c77cca5cea286f3326432b770739ac6ccd5d04d851eb65e7a4dbcc10c982b49ad2c02 + languageName: node + linkType: hard + +"@types/d3-polygon@npm:*": + version: 3.0.2 + resolution: "@types/d3-polygon@npm:3.0.2" + checksum: 10c0/f46307bb32b6c2aef8c7624500e0f9b518de8f227ccc10170b869dc43e4c542560f6c8d62e9f087fac45e198d6e4b623e579c0422e34c85baf56717456d3f439 + languageName: node + linkType: hard + +"@types/d3-quadtree@npm:*": + version: 3.0.6 + resolution: "@types/d3-quadtree@npm:3.0.6" + checksum: 10c0/7eaa0a4d404adc856971c9285e1c4ab17e9135ea669d847d6db7e0066126a28ac751864e7ce99c65d526e130f56754a2e437a1617877098b3bdcc3ef23a23616 + languageName: node + linkType: hard + +"@types/d3-random@npm:*": + version: 3.0.3 + resolution: "@types/d3-random@npm:3.0.3" + checksum: 10c0/5f4fea40080cd6d4adfee05183d00374e73a10c530276a6455348983dda341003a251def28565a27c25d9cf5296a33e870e397c9d91ff83fb7495a21c96b6882 + languageName: node + linkType: hard + +"@types/d3-scale-chromatic@npm:*": + version: 3.1.0 + resolution: "@types/d3-scale-chromatic@npm:3.1.0" + checksum: 10c0/93c564e02d2e97a048e18fe8054e4a935335da6ab75a56c3df197beaa87e69122eef0dfbeb7794d4a444a00e52e3123514ee27cec084bd21f6425b7037828cc2 + languageName: node + linkType: hard + +"@types/d3-scale@npm:*": + version: 4.0.9 + resolution: "@types/d3-scale@npm:4.0.9" + dependencies: + "@types/d3-time": "npm:*" + checksum: 10c0/4ac44233c05cd50b65b33ecb35d99fdf07566bcdbc55bc1306b2f27d1c5134d8c560d356f2c8e76b096e9125ffb8d26d95f78d56e210d1c542cb255bdf31d6c8 + languageName: node + linkType: hard + +"@types/d3-selection@npm:*": + version: 3.0.11 + resolution: "@types/d3-selection@npm:3.0.11" + checksum: 10c0/0c512956c7503ff5def4bb32e0c568cc757b9a2cc400a104fc0f4cfe5e56d83ebde2a97821b6f2cb26a7148079d3b86a2f28e11d68324ed311cf35c2ed980d1d + languageName: node + linkType: hard + +"@types/d3-shape@npm:*": + version: 3.1.7 + resolution: "@types/d3-shape@npm:3.1.7" + dependencies: + "@types/d3-path": "npm:*" + checksum: 10c0/38e59771c1c4c83b67aa1f941ce350410522a149d2175832fdc06396b2bb3b2c1a2dd549e0f8230f9f24296ee5641a515eaf10f55ee1ef6c4f83749e2dd7dcfd + languageName: node + linkType: hard + +"@types/d3-time-format@npm:*": + version: 4.0.3 + resolution: "@types/d3-time-format@npm:4.0.3" + checksum: 10c0/9ef5e8e2b96b94799b821eed5d61a3d432c7903247966d8ad951b8ce5797fe46554b425cb7888fa5bf604b4663c369d7628c0328ffe80892156671c58d1a7f90 + languageName: node + linkType: hard + +"@types/d3-time@npm:*": + version: 3.0.3 + resolution: "@types/d3-time@npm:3.0.3" + checksum: 10c0/245a8aadca504df27edf730de502e47a68f16ae795c86b5ca35e7afa91c133aa9ef4d08778f8cf1ed2be732f89a4105ba4b437ce2afbdfd17d3d937b6ba5f568 + languageName: node + linkType: hard + +"@types/d3-timer@npm:*": + version: 3.0.2 + resolution: "@types/d3-timer@npm:3.0.2" + checksum: 10c0/c644dd9571fcc62b1aa12c03bcad40571553020feeb5811f1d8a937ac1e65b8a04b759b4873aef610e28b8714ac71c9885a4d6c127a048d95118f7e5b506d9e1 + languageName: node + linkType: hard + +"@types/d3-transition@npm:*": + version: 3.0.9 + resolution: "@types/d3-transition@npm:3.0.9" + dependencies: + "@types/d3-selection": "npm:*" + checksum: 10c0/4f68b9df7ac745b3491216c54203cbbfa0f117ae4c60e2609cdef2db963582152035407fdff995b10ee383bae2f05b7743493f48e1b8e46df54faa836a8fb7b5 + languageName: node + linkType: hard + +"@types/d3-zoom@npm:*": + version: 3.0.8 + resolution: "@types/d3-zoom@npm:3.0.8" + dependencies: + "@types/d3-interpolate": "npm:*" + "@types/d3-selection": "npm:*" + checksum: 10c0/1dbdbcafddcae12efb5beb6948546963f29599e18bc7f2a91fb69cc617c2299a65354f2d47e282dfb86fec0968406cd4fb7f76ba2d2fb67baa8e8d146eb4a547 + languageName: node + linkType: hard + +"@types/d3@npm:^7.4.3": + version: 7.4.3 + resolution: "@types/d3@npm:7.4.3" + dependencies: + "@types/d3-array": "npm:*" + "@types/d3-axis": "npm:*" + "@types/d3-brush": "npm:*" + "@types/d3-chord": "npm:*" + "@types/d3-color": "npm:*" + "@types/d3-contour": "npm:*" + "@types/d3-delaunay": "npm:*" + "@types/d3-dispatch": "npm:*" + "@types/d3-drag": "npm:*" + "@types/d3-dsv": "npm:*" + "@types/d3-ease": "npm:*" + "@types/d3-fetch": "npm:*" + "@types/d3-force": "npm:*" + "@types/d3-format": "npm:*" + "@types/d3-geo": "npm:*" + "@types/d3-hierarchy": "npm:*" + "@types/d3-interpolate": "npm:*" + "@types/d3-path": "npm:*" + "@types/d3-polygon": "npm:*" + "@types/d3-quadtree": "npm:*" + "@types/d3-random": "npm:*" + "@types/d3-scale": "npm:*" + "@types/d3-scale-chromatic": "npm:*" + "@types/d3-selection": "npm:*" + "@types/d3-shape": "npm:*" + "@types/d3-time": "npm:*" + "@types/d3-time-format": "npm:*" + "@types/d3-timer": "npm:*" + "@types/d3-transition": "npm:*" + "@types/d3-zoom": "npm:*" + checksum: 10c0/a9c6d65b13ef3b42c87f2a89ea63a6d5640221869f97d0657b0cb2f1dac96a0f164bf5605643c0794e0de3aa2bf05df198519aaf15d24ca135eb0e8bd8a9d879 + languageName: node + linkType: hard + +"@types/debug@npm:^4.0.0": + version: 4.1.12 + resolution: "@types/debug@npm:4.1.12" + dependencies: + "@types/ms": "npm:*" + checksum: 10c0/5dcd465edbb5a7f226e9a5efd1f399c6172407ef5840686b73e3608ce135eeca54ae8037dcd9f16bdb2768ac74925b820a8b9ecc588a58ca09eca6acabe33e2f + languageName: node + linkType: hard + +"@types/eslint-scope@npm:^3.7.3": + version: 3.7.4 + resolution: "@types/eslint-scope@npm:3.7.4" + dependencies: + "@types/eslint": "npm:*" + "@types/estree": "npm:*" + checksum: 10c0/f8a19cddf9d402f079bcc261958fff5ff2616465e4fb4cd423aa966a6a32bf5d3c65ca3ca0fbe824776b48c5cd525efbaf927b98b8eeef093aa68a1a2ba19359 + languageName: node + linkType: hard + +"@types/eslint-scope@npm:^3.7.7": + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" + dependencies: + "@types/eslint": "npm:*" + "@types/estree": "npm:*" + checksum: 10c0/a0ecbdf2f03912679440550817ff77ef39a30fa8bfdacaf6372b88b1f931828aec392f52283240f0d648cf3055c5ddc564544a626bcf245f3d09fcb099ebe3cc + languageName: node + linkType: hard + +"@types/eslint@npm:*": + version: 8.4.5 + resolution: "@types/eslint@npm:8.4.5" + dependencies: + "@types/estree": "npm:*" + "@types/json-schema": "npm:*" + checksum: 10c0/81d4f9920d0ef0f694555fefe8c8b5f81cd0dfe52f4455afdc63eb724bbb0e033fc19a8bc580fb5674b6fbc8be2a2a516c370f020bbd3dd0d309cb716b1c70d6 + languageName: node + linkType: hard + +"@types/estree-jsx@npm:^1.0.0": + version: 1.0.5 + resolution: "@types/estree-jsx@npm:1.0.5" + dependencies: + "@types/estree": "npm:*" + checksum: 10c0/07b354331516428b27a3ab99ee397547d47eb223c34053b48f84872fafb841770834b90cc1a0068398e7c7ccb15ec51ab00ec64b31dc5e3dbefd624638a35c6d + languageName: node + linkType: hard + +"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": + version: 1.0.5 + resolution: "@types/estree@npm:1.0.5" + checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d + languageName: node + linkType: hard + +"@types/estree@npm:^1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a + languageName: node + linkType: hard + +"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.18": + version: 4.17.29 + resolution: "@types/express-serve-static-core@npm:4.17.29" + dependencies: + "@types/node": "npm:*" + "@types/qs": "npm:*" + "@types/range-parser": "npm:*" + checksum: 10c0/6b63bb05adcc496adf0b7c54d3f05a0b42127ebe9b9b895befb34e2d813a9008f07ea1e80688326e7d34dea4eb659b1853bc5611384f7a71c8547343ed1661cc + languageName: node + linkType: hard + +"@types/express@npm:*, @types/express@npm:^4.17.13": + version: 4.17.13 + resolution: "@types/express@npm:4.17.13" + dependencies: + "@types/body-parser": "npm:*" + "@types/express-serve-static-core": "npm:^4.17.18" + "@types/qs": "npm:*" + "@types/serve-static": "npm:*" + checksum: 10c0/2387977093ac8b8e5f837b3ff27e8e28bb389058e6a2d8f66ce6818a0c486a07491aae5def3926d730c30b623d10d758b5bb3909816442e9a5bd1b058cfc3bd5 + languageName: node + linkType: hard + +"@types/geojson@npm:*": + version: 7946.0.16 + resolution: "@types/geojson@npm:7946.0.16" + checksum: 10c0/1ff24a288bd5860b766b073ead337d31d73bdc715e5b50a2cee5cb0af57a1ed02cc04ef295f5fa68dc40fe3e4f104dd31282b2b818a5ba3231bc1001ba084e3c + languageName: node + linkType: hard + +"@types/gtag.js@npm:^0.0.12": + version: 0.0.12 + resolution: "@types/gtag.js@npm:0.0.12" + checksum: 10c0/fee8f4c6e627301b89ab616c9e219bd53fa6ea1ffd1d0a8021e21363f0bdb2cf7eb1a5bcda0c6f1502186379bc7784ec29c932e21634f4e07f9e7a8c56887400 + languageName: node + linkType: hard + +"@types/hast@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/hast@npm:3.0.4" + dependencies: + "@types/unist": "npm:*" + checksum: 10c0/3249781a511b38f1d330fd1e3344eed3c4e7ea8eff82e835d35da78e637480d36fad37a78be5a7aed8465d237ad0446abc1150859d0fde395354ea634decf9f7 + languageName: node + linkType: hard + +"@types/history@npm:^4.7.11": + version: 4.7.11 + resolution: "@types/history@npm:4.7.11" + checksum: 10c0/3facf37c2493d1f92b2e93a22cac7ea70b06351c2ab9aaceaa3c56aa6099fb63516f6c4ec1616deb5c56b4093c026a043ea2d3373e6c0644d55710364d02c934 + languageName: node + linkType: hard + +"@types/html-minifier-terser@npm:^6.0.0": + version: 6.1.0 + resolution: "@types/html-minifier-terser@npm:6.1.0" + checksum: 10c0/a62fb8588e2f3818d82a2d7b953ad60a4a52fd767ae04671de1c16f5788bd72f1ed3a6109ed63fd190c06a37d919e3c39d8adbc1793a005def76c15a3f5f5dab + languageName: node + linkType: hard + +"@types/http-cache-semantics@npm:^4.0.2": + version: 4.0.4 + resolution: "@types/http-cache-semantics@npm:4.0.4" + checksum: 10c0/51b72568b4b2863e0fe8d6ce8aad72a784b7510d72dc866215642da51d84945a9459fa89f49ec48f1e9a1752e6a78e85a4cda0ded06b1c73e727610c925f9ce6 + languageName: node + linkType: hard + +"@types/http-proxy@npm:^1.17.8": + version: 1.17.9 + resolution: "@types/http-proxy@npm:1.17.9" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/f9bf3702f34c6de68f981c65b43d58d37f259cd6555403331ca10ec918b3778c28bbecc3f3aab15dd4d6751522b01ddf51a86834db7691fbe8ce94f3d2b1ec58 + languageName: node + linkType: hard + +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0": + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 10c0/3948088654f3eeb45363f1db158354fb013b362dba2a5c2c18c559484d5eb9f6fd85b23d66c0a7c2fcfab7308d0a585b14dadaca6cc8bf89ebfdc7f8f5102fb7 + languageName: node + linkType: hard + +"@types/istanbul-lib-report@npm:*": + version: 3.0.3 + resolution: "@types/istanbul-lib-report@npm:3.0.3" + dependencies: + "@types/istanbul-lib-coverage": "npm:*" + checksum: 10c0/247e477bbc1a77248f3c6de5dadaae85ff86ac2d76c5fc6ab1776f54512a745ff2a5f791d22b942e3990ddbd40f3ef5289317c4fca5741bedfaa4f01df89051c + languageName: node + linkType: hard + +"@types/istanbul-reports@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/istanbul-reports@npm:3.0.4" + dependencies: + "@types/istanbul-lib-report": "npm:*" + checksum: 10c0/1647fd402aced5b6edac87274af14ebd6b3a85447ef9ad11853a70fd92a98d35f81a5d3ea9fcb5dbb5834e800c6e35b64475e33fcae6bfa9acc70d61497c54ee + languageName: node + linkType: hard + +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": + version: 7.0.11 + resolution: "@types/json-schema@npm:7.0.11" + checksum: 10c0/bd1f9a7b898ff15c4bb494eb19124f2d688b804c39f07cbf135ac73f35324970e9e8329b72aae1fb543d925ea295a1568b23056c26658cecec4741fa28c3b81a + languageName: node + linkType: hard + +"@types/mdast@npm:^4.0.0, @types/mdast@npm:^4.0.2": + version: 4.0.3 + resolution: "@types/mdast@npm:4.0.3" + dependencies: + "@types/unist": "npm:*" + checksum: 10c0/e6994404f5ce58073aa6c1a37ceac3060326470a464e2d751580a9f89e2dbca3a2a6222b849bdaaa5bffbe89033c50a886d17e49fca3b040a4ffcf970e387a0c + languageName: node + linkType: hard + +"@types/mdx@npm:^2.0.0": + version: 2.0.12 + resolution: "@types/mdx@npm:2.0.12" + checksum: 10c0/a47ef3a7815c2e903244168e29177c64ed86cedbb005bba5e545dfe2dcabc0375a0a8f935d0909a701f575187e0a869c02ad279811e4be5d50058cf4e8240ca4 + languageName: node + linkType: hard + +"@types/mime@npm:^1": + version: 1.3.2 + resolution: "@types/mime@npm:1.3.2" + checksum: 10c0/61d144e5170c6cdf6de334ec0ee4bb499b1a0fb0233834a9e8cec6d289b0e3042bedf35cbc1c995d71a247635770dae3f13a9ddae69098bb54b933429bc08d35 + languageName: node + linkType: hard + +"@types/ms@npm:*": + version: 0.7.34 + resolution: "@types/ms@npm:0.7.34" + checksum: 10c0/ac80bd90012116ceb2d188fde62d96830ca847823e8ca71255616bc73991aa7d9f057b8bfab79e8ee44ffefb031ddd1bcce63ea82f9e66f7c31ec02d2d823ccc + languageName: node + linkType: hard + +"@types/node-forge@npm:^1.3.0": + version: 1.3.11 + resolution: "@types/node-forge@npm:1.3.11" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/3d7d23ca0ba38ac0cf74028393bd70f31169ab9aba43f21deb787840170d307d662644bac07287495effe2812ddd7ac8a14dbd43f16c2936bbb06312e96fc3b9 + languageName: node + linkType: hard + +"@types/node@npm:*": + version: 18.0.3 + resolution: "@types/node@npm:18.0.3" + checksum: 10c0/03543d489b0747c1414aa5e3e8ca928d6ca3dfdb17d96811cc9f355da632805ca27520ed8ebfc14fb6a1b317490045fcd2d0dd3362f9b98b7f3d0ca7297ec086 + languageName: node + linkType: hard + +"@types/node@npm:^17.0.5": + version: 17.0.45 + resolution: "@types/node@npm:17.0.45" + checksum: 10c0/0db377133d709b33a47892581a21a41cd7958f22723a3cc6c71d55ac018121382de42fbfc7970d5ae3e7819dbe5f40e1c6a5174aedf7e7964e9cb8fa72b580b0 + languageName: node + linkType: hard + +"@types/prismjs@npm:^1.26.0": + version: 1.26.5 + resolution: "@types/prismjs@npm:1.26.5" + checksum: 10c0/5619cb449e0d8df098c8759d6f47bf8fdd510abf5dbdfa999e55c6a2545efbd1e209cc85a33d8d9f4ff2898089a1a6d9a70737c9baffaae635c46852c40d384a + languageName: node + linkType: hard + +"@types/prop-types@npm:*": + version: 15.7.5 + resolution: "@types/prop-types@npm:15.7.5" + checksum: 10c0/648aae41423821c61c83823ae36116c8d0f68258f8b609bdbc257752dcd616438d6343d554262aa9a7edaee5a19aca2e028a74fa2d0f40fffaf2816bc7056857 + languageName: node + linkType: hard + +"@types/qs@npm:*": + version: 6.9.7 + resolution: "@types/qs@npm:6.9.7" + checksum: 10c0/157eb05f4c75790b0ebdcf7b0547ff117feabc8cda03c3cac3d3ea82bb19a1912e76a411df3eb0bdd01026a9770f07bc0e7e3fbe39ebb31c1be4564c16be35f1 + languageName: node + linkType: hard + +"@types/range-parser@npm:*": + version: 1.2.4 + resolution: "@types/range-parser@npm:1.2.4" + checksum: 10c0/8e3c3cda88675efd9145241bcb454449715b7d015a7fb80d018dcb3d441fa1938b302242cc0dfa6b02c5d014dd8bc082ae90091e62b1e816cae3ec36c2a7dbcb + languageName: node + linkType: hard + +"@types/react-router-config@npm:*, @types/react-router-config@npm:^5.0.7": + version: 5.0.11 + resolution: "@types/react-router-config@npm:5.0.11" + dependencies: + "@types/history": "npm:^4.7.11" + "@types/react": "npm:*" + "@types/react-router": "npm:^5.1.0" + checksum: 10c0/3fa4daf8c14689a05f34e289fc53c4a892e97f35715455c507a8048d9875b19cd3d3142934ca973effed6a6c38f33539b6e173cd254f67e2021ecd5458d551c8 + languageName: node + linkType: hard + +"@types/react-router-dom@npm:*": + version: 5.3.3 + resolution: "@types/react-router-dom@npm:5.3.3" + dependencies: + "@types/history": "npm:^4.7.11" + "@types/react": "npm:*" + "@types/react-router": "npm:*" + checksum: 10c0/a9231a16afb9ed5142678147eafec9d48582809295754fb60946e29fcd3757a4c7a3180fa94b45763e4c7f6e3f02379e2fcb8dd986db479dcab40eff5fc62a91 + languageName: node + linkType: hard + +"@types/react-router@npm:*, @types/react-router@npm:^5.1.0": + version: 5.1.20 + resolution: "@types/react-router@npm:5.1.20" + dependencies: + "@types/history": "npm:^4.7.11" + "@types/react": "npm:*" + checksum: 10c0/1f7eee61981d2f807fa01a34a0ef98ebc0774023832b6611a69c7f28fdff01de5a38cabf399f32e376bf8099dcb7afaf724775bea9d38870224492bea4cb5737 + languageName: node + linkType: hard + +"@types/react@npm:*": + version: 18.0.15 + resolution: "@types/react@npm:18.0.15" + dependencies: + "@types/prop-types": "npm:*" + "@types/scheduler": "npm:*" + csstype: "npm:^3.0.2" + checksum: 10c0/359b63de6e418dba51f54258ef09cbc434141a92d5f24e3e606cafdc0b0f23a6fb5e410c3ec6ada87eb54b9a055b94d2305c5ab90e691dbce1ed82818a99aa60 + languageName: node + linkType: hard + +"@types/retry@npm:0.12.0": + version: 0.12.0 + resolution: "@types/retry@npm:0.12.0" + checksum: 10c0/7c5c9086369826f569b83a4683661557cab1361bac0897a1cefa1a915ff739acd10ca0d62b01071046fe3f5a3f7f2aec80785fe283b75602dc6726781ea3e328 + languageName: node + linkType: hard + +"@types/sax@npm:^1.2.1": + version: 1.2.4 + resolution: "@types/sax@npm:1.2.4" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/68beed153fce3bbae0f36b2c083d5a9dc82ae3460592c7f7d087ac07003be181fe03856821169ce6d3f83790448625b74c7ac4422303d003c76b95a50170de2f + languageName: node + linkType: hard + +"@types/scheduler@npm:*": + version: 0.16.2 + resolution: "@types/scheduler@npm:0.16.2" + checksum: 10c0/89a3a922f03609b61c270d534226791edeedcb1b06f0225d5543ac17830254624ef9d8a97ad05418e4ce549dd545bddf1ff28cb90658ff10721ad14556ca68a5 + languageName: node + linkType: hard + +"@types/serve-index@npm:^1.9.1": + version: 1.9.1 + resolution: "@types/serve-index@npm:1.9.1" + dependencies: + "@types/express": "npm:*" + checksum: 10c0/ed1ac8407101a787ebf09164a81bc24248ccf9d9789cd4eaa360a9a06163e5d2168c46ab0ddf2007e47b455182ecaa7632a886639919d9d409a27f7aef4e847a + languageName: node + linkType: hard + +"@types/serve-static@npm:*, @types/serve-static@npm:^1.13.10": + version: 1.13.10 + resolution: "@types/serve-static@npm:1.13.10" + dependencies: + "@types/mime": "npm:^1" + "@types/node": "npm:*" + checksum: 10c0/7f3de245cbb11f3a9d7977b6e763585c6022ebfc079fa746f8d824411bb6b343521c1cff5407edc0d5196f4b7d6fea431fb36455843f4a6717d295c235065cf2 + languageName: node + linkType: hard + +"@types/sockjs@npm:^0.3.33": + version: 0.3.33 + resolution: "@types/sockjs@npm:0.3.33" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/75b9b2839970ebab3e557955b9e2b1091d87cefabee1023e566bccc093411acc4a1402f3da4fde18aca44f5b9c42fe0626afd073a2140002b9b53eb71a084e4d + languageName: node + linkType: hard + +"@types/trusted-types@npm:^2.0.7": + version: 2.0.7 + resolution: "@types/trusted-types@npm:2.0.7" + checksum: 10c0/4c4855f10de7c6c135e0d32ce462419d8abbbc33713b31d294596c0cc34ae1fa6112a2f9da729c8f7a20707782b0d69da3b1f8df6645b0366d08825ca1522e0c + languageName: node + linkType: hard + +"@types/unist@npm:*, @types/unist@npm:^3.0.0": + version: 3.0.2 + resolution: "@types/unist@npm:3.0.2" + checksum: 10c0/39f220ce184a773c55c18a127062bfc4d0d30c987250cd59bab544d97be6cfec93717a49ef96e81f024b575718f798d4d329eb81c452fc57d6d051af8b043ebf + languageName: node + linkType: hard + +"@types/unist@npm:^2.0.0": + version: 2.0.10 + resolution: "@types/unist@npm:2.0.10" + checksum: 10c0/5f247dc2229944355209ad5c8e83cfe29419fa7f0a6d557421b1985a1500444719cc9efcc42c652b55aab63c931813c88033e0202c1ac684bcd4829d66e44731 + languageName: node + linkType: hard + +"@types/ws@npm:^8.5.5": + version: 8.5.10 + resolution: "@types/ws@npm:8.5.10" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/e9af279b984c4a04ab53295a40aa95c3e9685f04888df5c6920860d1dd073fcc57c7bd33578a04b285b2c655a0b52258d34bee0a20569dca8defb8393e1e5d29 + languageName: node + linkType: hard + +"@types/yargs-parser@npm:*": + version: 21.0.3 + resolution: "@types/yargs-parser@npm:21.0.3" + checksum: 10c0/e71c3bd9d0b73ca82e10bee2064c384ab70f61034bbfb78e74f5206283fc16a6d85267b606b5c22cb2a3338373586786fed595b2009825d6a9115afba36560a0 + languageName: node + linkType: hard + +"@types/yargs@npm:^17.0.8": + version: 17.0.32 + resolution: "@types/yargs@npm:17.0.32" + dependencies: + "@types/yargs-parser": "npm:*" + checksum: 10c0/2095e8aad8a4e66b86147415364266b8d607a3b95b4239623423efd7e29df93ba81bb862784a6e08664f645cc1981b25fd598f532019174cd3e5e1e689e1cccf + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.0.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: 10c0/8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d + languageName: node + linkType: hard + +"@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/ast@npm:1.12.1" + dependencies: + "@webassemblyjs/helper-numbers": "npm:1.11.6" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + checksum: 10c0/ba7f2b96c6e67e249df6156d02c69eb5f1bd18d5005303cdc42accb053bebbbde673826e54db0437c9748e97abd218366a1d13fa46859b23cde611b6b409998c + languageName: node + linkType: hard + +"@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/ast@npm:1.14.1" + dependencies: + "@webassemblyjs/helper-numbers": "npm:1.13.2" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + checksum: 10c0/67a59be8ed50ddd33fbb2e09daa5193ac215bf7f40a9371be9a0d9797a114d0d1196316d2f3943efdb923a3d809175e1563a3cb80c814fb8edccd1e77494972b + languageName: node + linkType: hard + +"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" + checksum: 10c0/37fe26f89e18e4ca0e7d89cfe3b9f17cfa327d7daf906ae01400416dbb2e33c8a125b4dc55ad7ff405e5fcfb6cf0d764074c9bc532b9a31a71e762be57d2ea0a + languageName: node + linkType: hard + +"@webassemblyjs/floating-point-hex-parser@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.13.2" + checksum: 10c0/0e88bdb8b50507d9938be64df0867f00396b55eba9df7d3546eb5dc0ca64d62e06f8d881ec4a6153f2127d0f4c11d102b6e7d17aec2f26bb5ff95a5e60652412 + languageName: node + linkType: hard + +"@webassemblyjs/helper-api-error@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" + checksum: 10c0/a681ed51863e4ff18cf38d223429f414894e5f7496856854d9a886eeddcee32d7c9f66290f2919c9bb6d2fc2b2fae3f989b6a1e02a81e829359738ea0c4d371a + languageName: node + linkType: hard + +"@webassemblyjs/helper-api-error@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-api-error@npm:1.13.2" + checksum: 10c0/31be497f996ed30aae4c08cac3cce50c8dcd5b29660383c0155fce1753804fc55d47fcba74e10141c7dd2899033164e117b3bcfcda23a6b043e4ded4f1003dfb + languageName: node + linkType: hard + +"@webassemblyjs/helper-buffer@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" + checksum: 10c0/0270724afb4601237410f7fd845ab58ccda1d5456a8783aadfb16eaaf3f2c9610c28e4a5bcb6ad880cde5183c82f7f116d5ccfc2310502439d33f14b6888b48a + languageName: node + linkType: hard + +"@webassemblyjs/helper-buffer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.14.1" + checksum: 10c0/0d54105dc373c0fe6287f1091e41e3a02e36cdc05e8cf8533cdc16c59ff05a646355415893449d3768cda588af451c274f13263300a251dc11a575bc4c9bd210 + languageName: node + linkType: hard + +"@webassemblyjs/helper-numbers@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" + dependencies: + "@webassemblyjs/floating-point-hex-parser": "npm:1.11.6" + "@webassemblyjs/helper-api-error": "npm:1.11.6" + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/c7d5afc0ff3bd748339b466d8d2f27b908208bf3ff26b2e8e72c39814479d486e0dca6f3d4d776fd9027c1efe05b5c0716c57a23041eb34473892b2731c33af3 + languageName: node + linkType: hard + +"@webassemblyjs/helper-numbers@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-numbers@npm:1.13.2" + dependencies: + "@webassemblyjs/floating-point-hex-parser": "npm:1.13.2" + "@webassemblyjs/helper-api-error": "npm:1.13.2" + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/9c46852f31b234a8fb5a5a9d3f027bc542392a0d4de32f1a9c0075d5e8684aa073cb5929b56df565500b3f9cc0a2ab983b650314295b9bf208d1a1651bfc825a + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" + checksum: 10c0/79d2bebdd11383d142745efa32781249745213af8e022651847382685ca76709f83e1d97adc5f0d3c2b8546bf02864f8b43a531fdf5ca0748cb9e4e0ef2acaa5 + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-bytecode@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.13.2" + checksum: 10c0/c4355d14f369b30cf3cbdd3acfafc7d0488e086be6d578e3c9780bd1b512932352246be96e034e2a7fcfba4f540ec813352f312bfcbbfe5bcfbf694f82ccc682 + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-section@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + checksum: 10c0/0546350724d285ae3c26e6fc444be4c3b5fb824f3be0ec8ceb474179dc3f4430336dd2e36a44b3e3a1a6815960e5eec98cd9b3a8ec66dc53d86daedd3296a6a2 + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-section@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + checksum: 10c0/1f9b33731c3c6dbac3a9c483269562fa00d1b6a4e7133217f40e83e975e636fd0f8736e53abd9a47b06b66082ecc976c7384391ab0a68e12d509ea4e4b948d64 + languageName: node + linkType: hard + +"@webassemblyjs/ieee754@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/ieee754@npm:1.11.6" + dependencies: + "@xtuc/ieee754": "npm:^1.2.0" + checksum: 10c0/59de0365da450322c958deadade5ec2d300c70f75e17ae55de3c9ce564deff5b429e757d107c7ec69bd0ba169c6b6cc2ff66293ab7264a7053c829b50ffa732f + languageName: node + linkType: hard + +"@webassemblyjs/ieee754@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/ieee754@npm:1.13.2" + dependencies: + "@xtuc/ieee754": "npm:^1.2.0" + checksum: 10c0/2e732ca78c6fbae3c9b112f4915d85caecdab285c0b337954b180460290ccd0fb00d2b1dc4bb69df3504abead5191e0d28d0d17dfd6c9d2f30acac8c4961c8a7 + languageName: node + linkType: hard + +"@webassemblyjs/leb128@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/leb128@npm:1.11.6" + dependencies: + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/cb344fc04f1968209804de4da018679c5d4708a03b472a33e0fa75657bb024978f570d3ccf9263b7f341f77ecaa75d0e051b9cd4b7bb17a339032cfd1c37f96e + languageName: node + linkType: hard + +"@webassemblyjs/leb128@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/leb128@npm:1.13.2" + dependencies: + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/dad5ef9e383c8ab523ce432dfd80098384bf01c45f70eb179d594f85ce5db2f80fa8c9cba03adafd85684e6d6310f0d3969a882538975989919329ac4c984659 + languageName: node + linkType: hard + +"@webassemblyjs/utf8@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/utf8@npm:1.11.6" + checksum: 10c0/14d6c24751a89ad9d801180b0d770f30a853c39f035a15fbc96266d6ac46355227abd27a3fd2eeaa97b4294ced2440a6b012750ae17bafe1a7633029a87b6bee + languageName: node + linkType: hard + +"@webassemblyjs/utf8@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/utf8@npm:1.13.2" + checksum: 10c0/d3fac9130b0e3e5a1a7f2886124a278e9323827c87a2b971e6d0da22a2ba1278ac9f66a4f2e363ecd9fac8da42e6941b22df061a119e5c0335f81006de9ee799 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-edit@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/helper-wasm-section": "npm:1.12.1" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + "@webassemblyjs/wasm-opt": "npm:1.12.1" + "@webassemblyjs/wasm-parser": "npm:1.12.1" + "@webassemblyjs/wast-printer": "npm:1.12.1" + checksum: 10c0/972f5e6c522890743999e0ed45260aae728098801c6128856b310dd21f1ee63435fc7b518e30e0ba1cdafd0d1e38275829c1e4451c3536a1d9e726e07a5bba0b + languageName: node + linkType: hard + +"@webassemblyjs/wasm-edit@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/helper-wasm-section": "npm:1.14.1" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + "@webassemblyjs/wasm-opt": "npm:1.14.1" + "@webassemblyjs/wasm-parser": "npm:1.14.1" + "@webassemblyjs/wast-printer": "npm:1.14.1" + checksum: 10c0/5ac4781086a2ca4b320bdbfd965a209655fe8a208ca38d89197148f8597e587c9a2c94fb6bd6f1a7dbd4527c49c6844fcdc2af981f8d793a97bf63a016aa86d2 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-gen@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/ieee754": "npm:1.11.6" + "@webassemblyjs/leb128": "npm:1.11.6" + "@webassemblyjs/utf8": "npm:1.11.6" + checksum: 10c0/1e257288177af9fa34c69cab94f4d9036ebed611f77f3897c988874e75182eeeec759c79b89a7a49dd24624fc2d3d48d5580b62b67c4a1c9bfbdcd266b281c16 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-gen@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/ieee754": "npm:1.13.2" + "@webassemblyjs/leb128": "npm:1.13.2" + "@webassemblyjs/utf8": "npm:1.13.2" + checksum: 10c0/d678810d7f3f8fecb2e2bdadfb9afad2ec1d2bc79f59e4711ab49c81cec578371e22732d4966f59067abe5fba8e9c54923b57060a729d28d408e608beef67b10 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-opt@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + "@webassemblyjs/wasm-parser": "npm:1.12.1" + checksum: 10c0/992a45e1f1871033c36987459436ab4e6430642ca49328e6e32a13de9106fe69ae6c0ac27d7050efd76851e502d11cd1ac0e06b55655dfa889ad82f11a2712fb + languageName: node + linkType: hard + +"@webassemblyjs/wasm-opt@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + "@webassemblyjs/wasm-parser": "npm:1.14.1" + checksum: 10c0/515bfb15277ee99ba6b11d2232ddbf22aed32aad6d0956fe8a0a0a004a1b5a3a277a71d9a3a38365d0538ac40d1b7b7243b1a244ad6cd6dece1c1bb2eb5de7ee + languageName: node + linkType: hard + +"@webassemblyjs/wasm-parser@npm:1.12.1, @webassemblyjs/wasm-parser@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-api-error": "npm:1.11.6" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/ieee754": "npm:1.11.6" + "@webassemblyjs/leb128": "npm:1.11.6" + "@webassemblyjs/utf8": "npm:1.11.6" + checksum: 10c0/e85cec1acad07e5eb65b92d37c8e6ca09c6ca50d7ca58803a1532b452c7321050a0328c49810c337cc2dfd100c5326a54d5ebd1aa5c339ebe6ef10c250323a0e + languageName: node + linkType: hard + +"@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-api-error": "npm:1.13.2" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/ieee754": "npm:1.13.2" + "@webassemblyjs/leb128": "npm:1.13.2" + "@webassemblyjs/utf8": "npm:1.13.2" + checksum: 10c0/95427b9e5addbd0f647939bd28e3e06b8deefdbdadcf892385b5edc70091bf9b92fa5faac3fce8333554437c5d85835afef8c8a7d9d27ab6ba01ffab954db8c6 + languageName: node + linkType: hard + +"@webassemblyjs/wast-printer@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wast-printer@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/39bf746eb7a79aa69953f194943bbc43bebae98bd7cadd4d8bc8c0df470ca6bf9d2b789effaa180e900fab4e2691983c1f7d41571458bd2a26267f2f0c73705a + languageName: node + linkType: hard + +"@webassemblyjs/wast-printer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wast-printer@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/8d7768608996a052545251e896eac079c98e0401842af8dd4de78fba8d90bd505efb6c537e909cd6dae96e09db3fa2e765a6f26492553a675da56e2db51f9d24 + languageName: node + linkType: hard + +"@xtuc/ieee754@npm:^1.2.0": + version: 1.2.0 + resolution: "@xtuc/ieee754@npm:1.2.0" + checksum: 10c0/a8565d29d135039bd99ae4b2220d3e167d22cf53f867e491ed479b3f84f895742d0097f935b19aab90265a23d5d46711e4204f14c479ae3637fbf06c4666882f + languageName: node + linkType: hard + +"@xtuc/long@npm:4.2.2": + version: 4.2.2 + resolution: "@xtuc/long@npm:4.2.2" + checksum: 10c0/8582cbc69c79ad2d31568c412129bf23d2b1210a1dfb60c82d5a1df93334da4ee51f3057051658569e2c196d8dc33bc05ae6b974a711d0d16e801e1d0647ccd1 + languageName: node + linkType: hard + +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: 10c0/f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 + languageName: node + linkType: hard + +"accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": + version: 1.3.8 + resolution: "accepts@npm:1.3.8" + dependencies: + mime-types: "npm:~2.1.34" + negotiator: "npm:0.6.3" + checksum: 10c0/3a35c5f5586cfb9a21163ca47a5f77ac34fa8ceb5d17d2fa2c0d81f41cbd7f8c6fa52c77e2c039acc0f4d09e71abdc51144246900f6bef5e3c4b333f77d89362 + languageName: node + linkType: hard + +"acorn-import-assertions@npm:^1.9.0": + version: 1.9.0 + resolution: "acorn-import-assertions@npm:1.9.0" + peerDependencies: + acorn: ^8 + checksum: 10c0/3b4a194e128efdc9b86c2b1544f623aba4c1aa70d638f8ab7dc3971a5b4aa4c57bd62f99af6e5325bb5973c55863b4112e708a6f408bad7a138647ca72283afe + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.0.0": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.0.0": + version: 8.2.0 + resolution: "acorn-walk@npm:8.2.0" + checksum: 10c0/dbe92f5b2452c93e960c5594e666dd1fae141b965ff2cb4a1e1d0381e3e4db4274c5ce4ffa3d681a86ca2a8d4e29d5efc0670a08e23fd2800051ea387df56ca2 + languageName: node + linkType: hard + +"acorn@npm:^8.0.0, acorn@npm:^8.0.4, acorn@npm:^8.7.1, acorn@npm:^8.8.2": + version: 8.11.3 + resolution: "acorn@npm:8.11.3" + bin: + acorn: bin/acorn + checksum: 10c0/3ff155f8812e4a746fee8ecff1f227d527c4c45655bb1fad6347c3cb58e46190598217551b1500f18542d2bbe5c87120cb6927f5a074a59166fbdd9468f0a299 + languageName: node + linkType: hard + +"acorn@npm:^8.14.0": + version: 8.14.1 + resolution: "acorn@npm:8.14.1" + bin: + acorn: bin/acorn + checksum: 10c0/dbd36c1ed1d2fa3550140000371fcf721578095b18777b85a79df231ca093b08edc6858d75d6e48c73e431c174dcf9214edbd7e6fa5911b93bd8abfa54e47123 + languageName: node + linkType: hard + +"address@npm:^1.0.1": + version: 1.2.0 + resolution: "address@npm:1.2.0" + checksum: 10c0/efb0c96fd6e86cd15a5546669bb19cde7f7b0faa44f124bc9d047c779526fefbcd823a51817fc7d446ef303c215d8bfe1972f0357d670829993da87d4f38e26c + languageName: node + linkType: hard + +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.3 + resolution: "agent-base@npm:7.1.3" + checksum: 10c0/6192b580c5b1d8fb399b9c62bf8343d76654c2dd62afcb9a52b2cf44a8b6ace1e3b704d3fe3547d91555c857d3df02603341ff2cb961b9cfe2b12f9f3c38ee11 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 + languageName: node + linkType: hard + +"ajv-formats@npm:^2.1.1": + version: 2.1.1 + resolution: "ajv-formats@npm:2.1.1" + dependencies: + ajv: "npm:^8.0.0" + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10c0/e43ba22e91b6a48d96224b83d260d3a3a561b42d391f8d3c6d2c1559f9aa5b253bfb306bc94bbeca1d967c014e15a6efe9a207309e95b3eaae07fcbcdc2af662 + languageName: node + linkType: hard + +"ajv-keywords@npm:^3.5.2": + version: 3.5.2 + resolution: "ajv-keywords@npm:3.5.2" + peerDependencies: + ajv: ^6.9.1 + checksum: 10c0/0c57a47cbd656e8cdfd99d7c2264de5868918ffa207c8d7a72a7f63379d4333254b2ba03d69e3c035e996a3fd3eb6d5725d7a1597cca10694296e32510546360 + languageName: node + linkType: hard + +"ajv-keywords@npm:^5.1.0": + version: 5.1.0 + resolution: "ajv-keywords@npm:5.1.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + peerDependencies: + ajv: ^8.8.2 + checksum: 10c0/18bec51f0171b83123ba1d8883c126e60c6f420cef885250898bf77a8d3e65e3bfb9e8564f497e30bdbe762a83e0d144a36931328616a973ee669dc74d4a9590 + languageName: node + linkType: hard + +"ajv@npm:^6.12.5": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + languageName: node + linkType: hard + +"ajv@npm:^8.0.0, ajv@npm:^8.9.0": + version: 8.17.1 + resolution: "ajv@npm:8.17.1" + dependencies: + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + checksum: 10c0/ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 + languageName: node + linkType: hard + +"algoliasearch-helper@npm:^3.22.6": + version: 3.24.2 + resolution: "algoliasearch-helper@npm:3.24.2" + dependencies: + "@algolia/events": "npm:^4.0.1" + peerDependencies: + algoliasearch: ">= 3.1 < 6" + checksum: 10c0/9790775c7f404f8e82a03d642807956e595add4e54a928f1db2b6230f03ae47750c4325307b1b8d062f8e9cd07acfb5bd99a128f479b1ec90db8ea9312f2fb62 + languageName: node + linkType: hard + +"algoliasearch@npm:^4.12.0": + version: 4.23.2 + resolution: "algoliasearch@npm:4.23.2" + dependencies: + "@algolia/cache-browser-local-storage": "npm:4.23.2" + "@algolia/cache-common": "npm:4.23.2" + "@algolia/cache-in-memory": "npm:4.23.2" + "@algolia/client-account": "npm:4.23.2" + "@algolia/client-analytics": "npm:4.23.2" + "@algolia/client-common": "npm:4.23.2" + "@algolia/client-personalization": "npm:4.23.2" + "@algolia/client-search": "npm:4.23.2" + "@algolia/logger-common": "npm:4.23.2" + "@algolia/logger-console": "npm:4.23.2" + "@algolia/recommend": "npm:4.23.2" + "@algolia/requester-browser-xhr": "npm:4.23.2" + "@algolia/requester-common": "npm:4.23.2" + "@algolia/requester-node-http": "npm:4.23.2" + "@algolia/transporter": "npm:4.23.2" + checksum: 10c0/0165da541a5e9190a1342d51adbab9f0d145e6d519189c022deaf95fed0290c07dffa2de28169e602e45a5c36cd8bdafbe40881c991f595caef561069d610f28 + languageName: node + linkType: hard + +"algoliasearch@npm:^5.14.2, algoliasearch@npm:^5.17.1": + version: 5.20.4 + resolution: "algoliasearch@npm:5.20.4" + dependencies: + "@algolia/client-abtesting": "npm:5.20.4" + "@algolia/client-analytics": "npm:5.20.4" + "@algolia/client-common": "npm:5.20.4" + "@algolia/client-insights": "npm:5.20.4" + "@algolia/client-personalization": "npm:5.20.4" + "@algolia/client-query-suggestions": "npm:5.20.4" + "@algolia/client-search": "npm:5.20.4" + "@algolia/ingestion": "npm:1.20.4" + "@algolia/monitoring": "npm:1.20.4" + "@algolia/recommend": "npm:5.20.4" + "@algolia/requester-browser-xhr": "npm:5.20.4" + "@algolia/requester-fetch": "npm:5.20.4" + "@algolia/requester-node-http": "npm:5.20.4" + checksum: 10c0/2db5e445e472f5cdd431dd22c7e0f91ca0cc6f4c755b7d642fe93985b14eae57308fd0f58b99dab51d2b23d97d3cc7abbe254fa296f78e4e5627f7ccd1459d2e + languageName: node + linkType: hard + +"ansi-align@npm:^3.0.1": + version: 3.0.1 + resolution: "ansi-align@npm:3.0.1" + dependencies: + string-width: "npm:^4.1.0" + checksum: 10c0/ad8b755a253a1bc8234eb341e0cec68a857ab18bf97ba2bda529e86f6e30460416523e0ec58c32e5c21f0ca470d779503244892873a5895dbd0c39c788e82467 + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.3.2": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: "npm:^0.21.3" + checksum: 10c0/da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 + languageName: node + linkType: hard + +"ansi-html-community@npm:^0.0.8": + version: 0.0.8 + resolution: "ansi-html-community@npm:0.0.8" + bin: + ansi-html: bin/ansi-html + checksum: 10c0/45d3a6f0b4f10b04fdd44bef62972e2470bfd917bf00439471fa7473d92d7cbe31369c73db863cc45dda115cb42527f39e232e9256115534b8ee5806b0caeed4 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 + languageName: node + linkType: hard + +"ansi-sequence-parser@npm:^1.1.0": + version: 1.1.1 + resolution: "ansi-sequence-parser@npm:1.1.1" + checksum: 10c0/ab2259ccf69f145ecf1418d4e71524158828f44afdf37c7536677871f4cebaa8b176fcb95de8f94a68129357dddc59586597da25f9d4ebf9968f6ef022bf0b31 + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: "npm:^1.9.0" + checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.1.0 + resolution: "ansi-styles@npm:6.1.0" + checksum: 10c0/39d4ffae6559b24716db7c84b5e750aef6b0b433651f7b4a789f40b41be24ee7ea532afe540cea9cedb518baf334f9d9029af47d851ae5dcbdb2ca5a4862b8b8 + languageName: node + linkType: hard + +"anymatch@npm:~3.1.2": + version: 3.1.2 + resolution: "anymatch@npm:3.1.2" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 10c0/900645535aee46ed7958f4f5b5e38abcbf474b5230406e913de15fc9a1310f0d5322775deb609688efe31010fa57831e55d36040b19826c22ce61d537e9b9759 + languageName: node + linkType: hard + +"arg@npm:^5.0.0": + version: 5.0.2 + resolution: "arg@npm:5.0.2" + checksum: 10c0/ccaf86f4e05d342af6666c569f844bec426595c567d32a8289715087825c2ca7edd8a3d204e4d2fb2aa4602e09a57d0c13ea8c9eea75aac3dbb4af5514e6800e + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + languageName: node + linkType: hard + +"array-flatten@npm:1.1.1": + version: 1.1.1 + resolution: "array-flatten@npm:1.1.1" + checksum: 10c0/806966c8abb2f858b08f5324d9d18d7737480610f3bd5d3498aaae6eb5efdc501a884ba019c9b4a8f02ff67002058749d05548fd42fa8643f02c9c7f22198b91 + languageName: node + linkType: hard + +"array-flatten@npm:^2.1.2": + version: 2.1.2 + resolution: "array-flatten@npm:2.1.2" + checksum: 10c0/bdc1cee68e41bec9cfc1161408734e2269428ef371445606bce4e6241001e138a94b9a617cc9a5b4b7fe6a3a51e3d5a942646975ce82a2e202ccf3e9b478c82f + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 10c0/429897e68110374f39b771ec47a7161fc6a8fc33e196857c0a396dc75df0b5f65e4d046674db764330b6bb66b39ef48dd7c53b6a2ee75cfb0681e0c1a7033962 + languageName: node + linkType: hard + +"astring@npm:^1.8.0": + version: 1.8.6 + resolution: "astring@npm:1.8.6" + bin: + astring: bin/astring + checksum: 10c0/31f09144597048c11072417959a412f208f8f95ba8dce408dfbc3367acb929f31fbcc00ed5eb61ccbf7c2f1173b9ac8bfcaaa37134a9455050c669b2b036ed88 + languageName: node + linkType: hard + +"autoprefixer@npm:^10.4.19": + version: 10.4.20 + resolution: "autoprefixer@npm:10.4.20" + dependencies: + browserslist: "npm:^4.23.3" + caniuse-lite: "npm:^1.0.30001646" + fraction.js: "npm:^4.3.7" + normalize-range: "npm:^0.1.2" + picocolors: "npm:^1.0.1" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.1.0 + bin: + autoprefixer: bin/autoprefixer + checksum: 10c0/e1f00978a26e7c5b54ab12036d8c13833fad7222828fc90914771b1263f51b28c7ddb5803049de4e77696cbd02bb25cfc3634e80533025bb26c26aacdf938940 + languageName: node + linkType: hard + +"autoprefixer@npm:^10.4.21": + version: 10.4.21 + resolution: "autoprefixer@npm:10.4.21" + dependencies: + browserslist: "npm:^4.24.4" + caniuse-lite: "npm:^1.0.30001702" + fraction.js: "npm:^4.3.7" + normalize-range: "npm:^0.1.2" + picocolors: "npm:^1.1.1" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.1.0 + bin: + autoprefixer: bin/autoprefixer + checksum: 10c0/de5b71d26d0baff4bbfb3d59f7cf7114a6030c9eeb66167acf49a32c5b61c68e308f1e0f869d92334436a221035d08b51cd1b2f2c4689b8d955149423c16d4d4 + languageName: node + linkType: hard + +"babel-loader@npm:^9.2.1": + version: 9.2.1 + resolution: "babel-loader@npm:9.2.1" + dependencies: + find-cache-dir: "npm:^4.0.0" + schema-utils: "npm:^4.0.0" + peerDependencies: + "@babel/core": ^7.12.0 + webpack: ">=5" + checksum: 10c0/efb82faff4c7c27e9c15bb28bf11c73200e61cf365118a9514e8d74dd489d0afc2a0d5aaa62cb4254eefc2ab631579224d95a03fd245410f28ea75e24de54ba4 + languageName: node + linkType: hard + +"babel-plugin-dynamic-import-node@npm:^2.3.3": + version: 2.3.3 + resolution: "babel-plugin-dynamic-import-node@npm:2.3.3" + dependencies: + object.assign: "npm:^4.1.0" + checksum: 10c0/1bd80df981e1fc1aff0cd4e390cf27aaa34f95f7620cd14dff07ba3bad56d168c098233a7d2deb2c9b1dc13643e596a6b94fc608a3412ee3c56e74a25cd2167e + languageName: node + linkType: hard + +"babel-plugin-polyfill-corejs2@npm:^0.4.10": + version: 0.4.10 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.10" + dependencies: + "@babel/compat-data": "npm:^7.22.6" + "@babel/helper-define-polyfill-provider": "npm:^0.6.1" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/910bfb1d809cae49cf43348f9b1e4a5e4c895aa25686fdd2ff8af7b7a996b88ad39597707905d097e08d4e70e14340ac935082ef4e035e77f68741f813f2a80d + languageName: node + linkType: hard + +"babel-plugin-polyfill-corejs3@npm:^0.10.6": + version: 0.10.6 + resolution: "babel-plugin-polyfill-corejs3@npm:0.10.6" + dependencies: + "@babel/helper-define-polyfill-provider": "npm:^0.6.2" + core-js-compat: "npm:^3.38.0" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/3a69220471b07722c2ae6537310bf26b772514e12b601398082965459c838be70a0ca70b0662f0737070654ff6207673391221d48599abb4a2b27765206d9f79 + languageName: node + linkType: hard + +"babel-plugin-polyfill-corejs3@npm:^0.11.0": + version: 0.11.1 + resolution: "babel-plugin-polyfill-corejs3@npm:0.11.1" + dependencies: + "@babel/helper-define-polyfill-provider": "npm:^0.6.3" + core-js-compat: "npm:^3.40.0" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/025f754b6296d84b20200aff63a3c1acdd85e8c621781f2bd27fe2512d0060526192d02329326947c6b29c27cf475fbcfaaff8c51eab1d2bfc7b79086bb64229 + languageName: node + linkType: hard + +"babel-plugin-polyfill-regenerator@npm:^0.6.1": + version: 0.6.1 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.1" + dependencies: + "@babel/helper-define-polyfill-provider": "npm:^0.6.1" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/0b55a35a75a261f62477d8d0f0c4a8e3b66f109323ce301d7de6898e168c41224de3bc26a92f48f2c7fcc19dfd1fc60fe71098bfd4f804a0463ff78586892403 + languageName: node + linkType: hard + +"bail@npm:^2.0.0": + version: 2.0.2 + resolution: "bail@npm:2.0.2" + checksum: 10c0/25cbea309ef6a1f56214187004e8f34014eb015713ea01fa5b9b7e9e776ca88d0fdffd64143ac42dc91966c915a4b7b683411b56e14929fad16153fc026ffb8b + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"batch@npm:0.6.1": + version: 0.6.1 + resolution: "batch@npm:0.6.1" + checksum: 10c0/925a13897b4db80d4211082fe287bcf96d297af38e26448c857cee3e095c9792e3b8f26b37d268812e7f38a589f694609de8534a018b1937d7dc9f84e6b387c5 + languageName: node + linkType: hard + +"big.js@npm:^5.2.2": + version: 5.2.2 + resolution: "big.js@npm:5.2.2" + checksum: 10c0/230520f1ff920b2d2ce3e372d77a33faa4fa60d802fe01ca4ffbc321ee06023fe9a741ac02793ee778040a16b7e497f7d60c504d1c402b8fdab6f03bb785a25f + languageName: node + linkType: hard + +"binary-extensions@npm:^2.0.0": + version: 2.2.0 + resolution: "binary-extensions@npm:2.2.0" + checksum: 10c0/d73d8b897238a2d3ffa5f59c0241870043aa7471335e89ea5e1ff48edb7c2d0bb471517a3e4c5c3f4c043615caa2717b5f80a5e61e07503d51dc85cb848e665d + languageName: node + linkType: hard + +"body-parser@npm:1.20.3": + version: 1.20.3 + resolution: "body-parser@npm:1.20.3" + dependencies: + bytes: "npm:3.1.2" + content-type: "npm:~1.0.5" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + on-finished: "npm:2.4.1" + qs: "npm:6.13.0" + raw-body: "npm:2.5.2" + type-is: "npm:~1.6.18" + unpipe: "npm:1.0.0" + checksum: 10c0/0a9a93b7518f222885498dcecaad528cf010dd109b071bf471c93def4bfe30958b83e03496eb9c1ad4896db543d999bb62be1a3087294162a88cfa1b42c16310 + languageName: node + linkType: hard + +"bonjour-service@npm:^1.0.11": + version: 1.0.13 + resolution: "bonjour-service@npm:1.0.13" + dependencies: + array-flatten: "npm:^2.1.2" + dns-equal: "npm:^1.0.0" + fast-deep-equal: "npm:^3.1.3" + multicast-dns: "npm:^7.2.5" + checksum: 10c0/7cf20e24fa233dda79fd637785827cec3f7ea1c4ba4dbecb878e1d50c11c021f411217f0efe0ede74daa9765390222156be07c0e5b9b5945d3c942a3377dba37 + languageName: node + linkType: hard + +"boolbase@npm:^1.0.0": + version: 1.0.0 + resolution: "boolbase@npm:1.0.0" + checksum: 10c0/e4b53deb4f2b85c52be0e21a273f2045c7b6a6ea002b0e139c744cb6f95e9ec044439a52883b0d74dedd1ff3da55ed140cfdddfed7fb0cccbed373de5dce1bcf + languageName: node + linkType: hard + +"boxen@npm:^6.2.1": + version: 6.2.1 + resolution: "boxen@npm:6.2.1" + dependencies: + ansi-align: "npm:^3.0.1" + camelcase: "npm:^6.2.0" + chalk: "npm:^4.1.2" + cli-boxes: "npm:^3.0.0" + string-width: "npm:^5.0.1" + type-fest: "npm:^2.5.0" + widest-line: "npm:^4.0.1" + wrap-ansi: "npm:^8.0.1" + checksum: 10c0/2a50d059c950a50d9f3c873093702747740814ce8819225c4f8cbe92024c9f5a9219d2b7128f5cfa17c022644d929bbbc88b9591de67249c6ebe07f7486bdcfd + languageName: node + linkType: hard + +"boxen@npm:^7.0.0": + version: 7.1.1 + resolution: "boxen@npm:7.1.1" + dependencies: + ansi-align: "npm:^3.0.1" + camelcase: "npm:^7.0.1" + chalk: "npm:^5.2.0" + cli-boxes: "npm:^3.0.0" + string-width: "npm:^5.1.2" + type-fest: "npm:^2.13.0" + widest-line: "npm:^4.0.1" + wrap-ansi: "npm:^8.1.0" + checksum: 10c0/3a9891dc98ac40d582c9879e8165628258e2c70420c919e70fff0a53ccc7b42825e73cda6298199b2fbc1f41f5d5b93b492490ad2ae27623bed3897ddb4267f8 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + languageName: node + linkType: hard + +"braces@npm:^3.0.3, braces@npm:~3.0.2": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: "npm:^7.1.1" + checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 + languageName: node + linkType: hard + +"browserslist@npm:^4.0.0, browserslist@npm:^4.21.10, browserslist@npm:^4.23.0, browserslist@npm:^4.23.1, browserslist@npm:^4.23.3": + version: 4.23.3 + resolution: "browserslist@npm:4.23.3" + dependencies: + caniuse-lite: "npm:^1.0.30001646" + electron-to-chromium: "npm:^1.5.4" + node-releases: "npm:^2.0.18" + update-browserslist-db: "npm:^1.1.0" + bin: + browserslist: cli.js + checksum: 10c0/3063bfdf812815346447f4796c8f04601bf5d62003374305fd323c2a463e42776475bcc5309264e39bcf9a8605851e53560695991a623be988138b3ff8c66642 + languageName: node + linkType: hard + +"browserslist@npm:^4.24.0, browserslist@npm:^4.24.4": + version: 4.24.4 + resolution: "browserslist@npm:4.24.4" + dependencies: + caniuse-lite: "npm:^1.0.30001688" + electron-to-chromium: "npm:^1.5.73" + node-releases: "npm:^2.0.19" + update-browserslist-db: "npm:^1.1.1" + bin: + browserslist: cli.js + checksum: 10c0/db7ebc1733cf471e0b490b4f47e3e2ea2947ce417192c9246644e92c667dd56a71406cc58f62ca7587caf828364892e9952904a02b7aead752bc65b62a37cfe9 + languageName: node + linkType: hard + +"browserslist@npm:^4.25.0": + version: 4.25.0 + resolution: "browserslist@npm:4.25.0" + dependencies: + caniuse-lite: "npm:^1.0.30001718" + electron-to-chromium: "npm:^1.5.160" + node-releases: "npm:^2.0.19" + update-browserslist-db: "npm:^1.1.3" + bin: + browserslist: cli.js + checksum: 10c0/cc16c55b4468b18684a0e1ca303592b38635b1155d6724f172407192737a2f405b8030d87a05813729592793445b3d15e737b0055f901cdecccb29b1e580a1c5 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 + languageName: node + linkType: hard + +"bytes@npm:3.0.0": + version: 3.0.0 + resolution: "bytes@npm:3.0.0" + checksum: 10c0/91d42c38601c76460519ffef88371caacaea483a354c8e4b8808e7b027574436a5713337c003ea3de63ee4991c2a9a637884fdfe7f761760d746929d9e8fec60 + languageName: node + linkType: hard + +"bytes@npm:3.1.2": + version: 3.1.2 + resolution: "bytes@npm:3.1.2" + checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e + languageName: node + linkType: hard + +"cacache@npm:^19.0.1": + version: 19.0.1 + resolution: "cacache@npm:19.0.1" + dependencies: + "@npmcli/fs": "npm:^4.0.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^7.0.2" + ssri: "npm:^12.0.0" + tar: "npm:^7.4.3" + unique-filename: "npm:^4.0.0" + checksum: 10c0/01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c + languageName: node + linkType: hard + +"cacheable-lookup@npm:^7.0.0": + version: 7.0.0 + resolution: "cacheable-lookup@npm:7.0.0" + checksum: 10c0/63a9c144c5b45cb5549251e3ea774c04d63063b29e469f7584171d059d3a88f650f47869a974e2d07de62116463d742c287a81a625e791539d987115cb081635 + languageName: node + linkType: hard + +"cacheable-request@npm:^10.2.8": + version: 10.2.14 + resolution: "cacheable-request@npm:10.2.14" + dependencies: + "@types/http-cache-semantics": "npm:^4.0.2" + get-stream: "npm:^6.0.1" + http-cache-semantics: "npm:^4.1.1" + keyv: "npm:^4.5.3" + mimic-response: "npm:^4.0.0" + normalize-url: "npm:^8.0.0" + responselike: "npm:^3.0.0" + checksum: 10c0/41b6658db369f20c03128227ecd219ca7ac52a9d24fc0f499cc9aa5d40c097b48b73553504cebd137024d957c0ddb5b67cf3ac1439b136667f3586257763f88d + languageName: node + linkType: hard + +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.7": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + set-function-length: "npm:^1.2.1" + checksum: 10c0/a3ded2e423b8e2a265983dba81c27e125b48eefb2655e7dfab6be597088da3d47c47976c24bc51b8fd9af1061f8f87b4ab78a314f3c77784b2ae2ba535ad8b8d + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 + languageName: node + linkType: hard + +"camel-case@npm:^4.1.2": + version: 4.1.2 + resolution: "camel-case@npm:4.1.2" + dependencies: + pascal-case: "npm:^3.1.2" + tslib: "npm:^2.0.3" + checksum: 10c0/bf9eefaee1f20edbed2e9a442a226793bc72336e2b99e5e48c6b7252b6f70b080fc46d8246ab91939e2af91c36cdd422e0af35161e58dd089590f302f8f64c8a + languageName: node + linkType: hard + +"camelcase@npm:^6.2.0": + version: 6.3.0 + resolution: "camelcase@npm:6.3.0" + checksum: 10c0/0d701658219bd3116d12da3eab31acddb3f9440790c0792e0d398f0a520a6a4058018e546862b6fba89d7ae990efaeb97da71e1913e9ebf5a8b5621a3d55c710 + languageName: node + linkType: hard + +"camelcase@npm:^7.0.1": + version: 7.0.1 + resolution: "camelcase@npm:7.0.1" + checksum: 10c0/3adfc9a0e96d51b3a2f4efe90a84dad3e206aaa81dfc664f1bd568270e1bf3b010aad31f01db16345b4ffe1910e16ab411c7273a19a859addd1b98ef7cf4cfbd + languageName: node + linkType: hard + +"caniuse-api@npm:^3.0.0": + version: 3.0.0 + resolution: "caniuse-api@npm:3.0.0" + dependencies: + browserslist: "npm:^4.0.0" + caniuse-lite: "npm:^1.0.0" + lodash.memoize: "npm:^4.1.2" + lodash.uniq: "npm:^4.5.0" + checksum: 10c0/60f9e85a3331e6d761b1b03eec71ca38ef7d74146bece34694853033292156b815696573ed734b65583acf493e88163618eda915c6c826d46a024c71a9572b4c + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001646": + version: 1.0.30001663 + resolution: "caniuse-lite@npm:1.0.30001663" + checksum: 10c0/6508e27bf7fdec657f26f318b1ab64ace6e1208ef9fedaf0975bc89046e0c683bfba837f108840ada1686ff09b8ffd01e05ac791dcf598b8f16eefb636875cf2 + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001688": + version: 1.0.30001702 + resolution: "caniuse-lite@npm:1.0.30001702" + checksum: 10c0/52d46f41a96d179fd4e387bb6b26898148c31b626ff9aba105d207d2b0f869c7cb32ac67a6e8e0aeba3f03f33145ccfbee237250dfb58dba8b6526b4dd395ac6 + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001702, caniuse-lite@npm:^1.0.30001718": + version: 1.0.30001722 + resolution: "caniuse-lite@npm:1.0.30001722" + checksum: 10c0/a1e344c392e0b138f0b215525108877d725665217a5e8e7504897e30379a5a9b858bc44799ccc0e19f4a64bf1e05c15b4a58eb1c9032293f894aa24e8d9f470f + languageName: node + linkType: hard + +"ccount@npm:^2.0.0": + version: 2.0.1 + resolution: "ccount@npm:2.0.1" + checksum: 10c0/3939b1664390174484322bc3f45b798462e6c07ee6384cb3d645e0aa2f318502d174845198c1561930e1d431087f74cf1fe291ae9a4722821a9f4ba67e574350 + languageName: node + linkType: hard + +"chalk@npm:^2.4.2": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: "npm:^3.2.1" + escape-string-regexp: "npm:^1.0.5" + supports-color: "npm:^5.3.0" + checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0, chalk@npm:^4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + +"chalk@npm:^5.0.1, chalk@npm:^5.2.0": + version: 5.3.0 + resolution: "chalk@npm:5.3.0" + checksum: 10c0/8297d436b2c0f95801103ff2ef67268d362021b8210daf8ddbe349695333eb3610a71122172ff3b0272f1ef2cf7cc2c41fdaa4715f52e49ffe04c56340feed09 + languageName: node + linkType: hard + +"char-regex@npm:^1.0.2": + version: 1.0.2 + resolution: "char-regex@npm:1.0.2" + checksum: 10c0/57a09a86371331e0be35d9083ba429e86c4f4648ecbe27455dbfb343037c16ee6fdc7f6b61f433a57cc5ded5561d71c56a150e018f40c2ffb7bc93a26dae341e + languageName: node + linkType: hard + +"character-entities-html4@npm:^2.0.0": + version: 2.1.0 + resolution: "character-entities-html4@npm:2.1.0" + checksum: 10c0/fe61b553f083400c20c0b0fd65095df30a0b445d960f3bbf271536ae6c3ba676f39cb7af0b4bf2755812f08ab9b88f2feed68f9aebb73bb153f7a115fe5c6e40 + languageName: node + linkType: hard + +"character-entities-legacy@npm:^3.0.0": + version: 3.0.0 + resolution: "character-entities-legacy@npm:3.0.0" + checksum: 10c0/ec4b430af873661aa754a896a2b55af089b4e938d3d010fad5219299a6b6d32ab175142699ee250640678cd64bdecd6db3c9af0b8759ab7b155d970d84c4c7d1 + languageName: node + linkType: hard + +"character-entities@npm:^2.0.0": + version: 2.0.2 + resolution: "character-entities@npm:2.0.2" + checksum: 10c0/b0c645a45bcc90ff24f0e0140f4875a8436b8ef13b6bcd31ec02cfb2ca502b680362aa95386f7815bdc04b6464d48cf191210b3840d7c04241a149ede591a308 + languageName: node + linkType: hard + +"character-reference-invalid@npm:^2.0.0": + version: 2.0.1 + resolution: "character-reference-invalid@npm:2.0.1" + checksum: 10c0/2ae0dec770cd8659d7e8b0ce24392d83b4c2f0eb4a3395c955dce5528edd4cc030a794cfa06600fcdd700b3f2de2f9b8e40e309c0011c4180e3be64a0b42e6a1 + languageName: node + linkType: hard + +"cheerio-select@npm:^2.1.0": + version: 2.1.0 + resolution: "cheerio-select@npm:2.1.0" + dependencies: + boolbase: "npm:^1.0.0" + css-select: "npm:^5.1.0" + css-what: "npm:^6.1.0" + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.3" + domutils: "npm:^3.0.1" + checksum: 10c0/2242097e593919dba4aacb97d7b8275def8b9ec70b00aa1f43335456870cfc9e284eae2080bdc832ed232dabb9eefcf56c722d152da4a154813fb8814a55d282 + languageName: node + linkType: hard + +"cheerio@npm:1.0.0-rc.12, cheerio@npm:^1.0.0-rc.9": + version: 1.0.0-rc.12 + resolution: "cheerio@npm:1.0.0-rc.12" + dependencies: + cheerio-select: "npm:^2.1.0" + dom-serializer: "npm:^2.0.0" + domhandler: "npm:^5.0.3" + domutils: "npm:^3.0.1" + htmlparser2: "npm:^8.0.1" + parse5: "npm:^7.0.0" + parse5-htmlparser2-tree-adapter: "npm:^7.0.0" + checksum: 10c0/c85d2f2461e3f024345b78e0bb16ad8e41492356210470dd1e7d5a91391da9fcf6c0a7cb48a9ba8820330153f0cedb4d0a60c7af15d96ecdb3092299b9d9c0cc + languageName: node + linkType: hard + +"chevrotain-allstar@npm:~0.3.0": + version: 0.3.1 + resolution: "chevrotain-allstar@npm:0.3.1" + dependencies: + lodash-es: "npm:^4.17.21" + peerDependencies: + chevrotain: ^11.0.0 + checksum: 10c0/5cadedffd3114eb06b15fd3939bb1aa6c75412dbd737fe302b52c5c24334f9cb01cee8edc1d1067d98ba80dddf971f1d0e94b387de51423fc6cf3c5d8b7ef27a + languageName: node + linkType: hard + +"chevrotain@npm:~11.0.3": + version: 11.0.3 + resolution: "chevrotain@npm:11.0.3" + dependencies: + "@chevrotain/cst-dts-gen": "npm:11.0.3" + "@chevrotain/gast": "npm:11.0.3" + "@chevrotain/regexp-to-ast": "npm:11.0.3" + "@chevrotain/types": "npm:11.0.3" + "@chevrotain/utils": "npm:11.0.3" + lodash-es: "npm:4.17.21" + checksum: 10c0/ffd425fa321e3f17e9833d7f44cd39f2743f066e92ca74b226176080ca5d455f853fe9091cdfd86354bd899d85c08b3bdc3f55b267e7d07124b048a88349765f + languageName: node + linkType: hard + +"chokidar@npm:^3.5.3": + version: 3.5.3 + resolution: "chokidar@npm:3.5.3" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 10c0/1076953093e0707c882a92c66c0f56ba6187831aa51bb4de878c1fec59ae611a3bf02898f190efec8e77a086b8df61c2b2a3ea324642a0558bdf8ee6c5dc9ca1 + languageName: node + linkType: hard + +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 + languageName: node + linkType: hard + +"chrome-trace-event@npm:^1.0.2": + version: 1.0.3 + resolution: "chrome-trace-event@npm:1.0.3" + checksum: 10c0/080ce2d20c2b9e0f8461a380e9585686caa768b1c834a464470c9dc74cda07f27611c7b727a2cd768a9cecd033297fdec4ce01f1e58b62227882c1059dec321c + languageName: node + linkType: hard + +"ci-info@npm:^3.2.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 10c0/6f0109e36e111684291d46123d491bc4e7b7a1934c3a20dea28cba89f1d4a03acd892f5f6a81ed3855c38647e285a150e3c9ba062e38943bef57fee6c1554c3a + languageName: node + linkType: hard + +"clean-css@npm:^5.2.2, clean-css@npm:^5.3.3, clean-css@npm:~5.3.2": + version: 5.3.3 + resolution: "clean-css@npm:5.3.3" + dependencies: + source-map: "npm:~0.6.0" + checksum: 10c0/381de7523e23f3762eb180e327dcc0cedafaf8cb1cd8c26b7cc1fc56e0829a92e734729c4f955394d65ed72fb62f82d8baf78af34b33b8a7d41ebad2accdd6fb + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 10c0/1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 + languageName: node + linkType: hard + +"cli-boxes@npm:^3.0.0": + version: 3.0.0 + resolution: "cli-boxes@npm:3.0.0" + checksum: 10c0/4db3e8fbfaf1aac4fb3a6cbe5a2d3fa048bee741a45371b906439b9ffc821c6e626b0f108bdcd3ddf126a4a319409aedcf39a0730573ff050fdd7b6731e99fb9 + languageName: node + linkType: hard + +"cli-table3@npm:^0.6.3": + version: 0.6.4 + resolution: "cli-table3@npm:0.6.4" + dependencies: + "@colors/colors": "npm:1.5.0" + string-width: "npm:^4.2.0" + dependenciesMeta: + "@colors/colors": + optional: true + checksum: 10c0/8233c3d588db19122ed62a64256c7f0208232d2cece89a6cd7732481887fd9dcef69d976c4719149e77ccbf0a68f637bd5923536adccf6cdea051eeffa0ef1c2 + languageName: node + linkType: hard + +"clone-deep@npm:^4.0.1": + version: 4.0.1 + resolution: "clone-deep@npm:4.0.1" + dependencies: + is-plain-object: "npm:^2.0.4" + kind-of: "npm:^6.0.2" + shallow-clone: "npm:^3.0.0" + checksum: 10c0/637753615aa24adf0f2d505947a1bb75e63964309034a1cf56ba4b1f30af155201edd38d26ffe26911adaae267a3c138b344a4947d39f5fc1b6d6108125aa758 + languageName: node + linkType: hard + +"clsx@npm:^1.1.1": + version: 1.2.1 + resolution: "clsx@npm:1.2.1" + checksum: 10c0/34dead8bee24f5e96f6e7937d711978380647e936a22e76380290e35486afd8634966ce300fc4b74a32f3762c7d4c0303f442c3e259f4ce02374eb0c82834f27 + languageName: node + linkType: hard + +"clsx@npm:^2.0.0": + version: 2.1.0 + resolution: "clsx@npm:2.1.0" + checksum: 10c0/c09c00ad14f638366ca814097e6cab533dfa1972a358da5b557be487168acbb25b4c1395e89ffa842a8a61ba87a462d2b4885bc9d4f8410b598f3cb339599cdb + languageName: node + linkType: hard + +"collapse-white-space@npm:^2.0.0": + version: 2.1.0 + resolution: "collapse-white-space@npm:2.1.0" + checksum: 10c0/b2e2800f4ab261e62eb27a1fbe853378296e3a726d6695117ed033e82d61fb6abeae4ffc1465d5454499e237005de9cfc52c9562dc7ca4ac759b9a222ef14453 + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: "npm:1.1.3" + checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"colord@npm:^2.9.3": + version: 2.9.3 + resolution: "colord@npm:2.9.3" + checksum: 10c0/9699e956894d8996b28c686afe8988720785f476f59335c80ce852ded76ab3ebe252703aec53d9bef54f6219aea6b960fb3d9a8300058a1d0c0d4026460cd110 + languageName: node + linkType: hard + +"colorette@npm:^2.0.10": + version: 2.0.19 + resolution: "colorette@npm:2.0.19" + checksum: 10c0/2bcc9134095750fece6e88167011499b964b78bf0ea953469130ddb1dba3c8fe6c03debb0ae181e710e2be10900d117460f980483a7df4ba4a1bac3b182ecb64 + languageName: node + linkType: hard + +"combine-promises@npm:^1.1.0": + version: 1.1.0 + resolution: "combine-promises@npm:1.1.0" + checksum: 10c0/67f2a0383d5836d59ad12bab1a08462e4b8de1127e3a16c58612978eb0265d39ffd4ec6dce520566b4535f523a8af458117bee3556ab6f645d130cfd1a7e30e2 + languageName: node + linkType: hard + +"comma-separated-tokens@npm:^2.0.0": + version: 2.0.3 + resolution: "comma-separated-tokens@npm:2.0.3" + checksum: 10c0/91f90f1aae320f1755d6957ef0b864fe4f54737f3313bd95e0802686ee2ca38bff1dd381964d00ae5db42912dd1f4ae5c2709644e82706ffc6f6842a813cdd67 + languageName: node + linkType: hard + +"commander@npm:7, commander@npm:^7.2.0": + version: 7.2.0 + resolution: "commander@npm:7.2.0" + checksum: 10c0/8d690ff13b0356df7e0ebbe6c59b4712f754f4b724d4f473d3cc5b3fdcf978e3a5dc3078717858a2ceb50b0f84d0660a7f22a96cdc50fb877d0c9bb31593d23a + languageName: node + linkType: hard + +"commander@npm:^10.0.0": + version: 10.0.1 + resolution: "commander@npm:10.0.1" + checksum: 10c0/53f33d8927758a911094adadda4b2cbac111a5b377d8706700587650fd8f45b0bbe336de4b5c3fe47fd61f420a3d9bd452b6e0e6e5600a7e74d7bf0174f6efe3 + languageName: node + linkType: hard + +"commander@npm:^2.20.0": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 + languageName: node + linkType: hard + +"commander@npm:^5.1.0": + version: 5.1.0 + resolution: "commander@npm:5.1.0" + checksum: 10c0/da9d71dbe4ce039faf1fe9eac3771dca8c11d66963341f62602f7b66e36d2a3f8883407af4f9a37b1db1a55c59c0c1325f186425764c2e963dc1d67aec2a4b6d + languageName: node + linkType: hard + +"commander@npm:^8.3.0": + version: 8.3.0 + resolution: "commander@npm:8.3.0" + checksum: 10c0/8b043bb8322ea1c39664a1598a95e0495bfe4ca2fad0d84a92d7d1d8d213e2a155b441d2470c8e08de7c4a28cf2bc6e169211c49e1b21d9f7edc6ae4d9356060 + languageName: node + linkType: hard + +"common-path-prefix@npm:^3.0.0": + version: 3.0.0 + resolution: "common-path-prefix@npm:3.0.0" + checksum: 10c0/c4a74294e1b1570f4a8ab435285d185a03976c323caa16359053e749db4fde44e3e6586c29cd051100335e11895767cbbd27ea389108e327d62f38daf4548fdb + languageName: node + linkType: hard + +"compressible@npm:~2.0.16": + version: 2.0.18 + resolution: "compressible@npm:2.0.18" + dependencies: + mime-db: "npm:>= 1.43.0 < 2" + checksum: 10c0/8a03712bc9f5b9fe530cc5a79e164e665550d5171a64575d7dcf3e0395d7b4afa2d79ab176c61b5b596e28228b350dd07c1a2a6ead12fd81d1b6cd632af2fef7 + languageName: node + linkType: hard + +"compression@npm:^1.7.4": + version: 1.7.4 + resolution: "compression@npm:1.7.4" + dependencies: + accepts: "npm:~1.3.5" + bytes: "npm:3.0.0" + compressible: "npm:~2.0.16" + debug: "npm:2.6.9" + on-headers: "npm:~1.0.2" + safe-buffer: "npm:5.1.2" + vary: "npm:~1.1.2" + checksum: 10c0/138db836202a406d8a14156a5564fb1700632a76b6e7d1546939472895a5304f2b23c80d7a22bf44c767e87a26e070dbc342ea63bb45ee9c863354fa5556bbbc + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"confbox@npm:^0.1.8": + version: 0.1.8 + resolution: "confbox@npm:0.1.8" + checksum: 10c0/fc2c68d97cb54d885b10b63e45bd8da83a8a71459d3ecf1825143dd4c7f9f1b696b3283e07d9d12a144c1301c2ebc7842380bdf0014e55acc4ae1c9550102418 + languageName: node + linkType: hard + +"confbox@npm:^0.2.1": + version: 0.2.1 + resolution: "confbox@npm:0.2.1" + checksum: 10c0/bd47ab24bf2c3c6ec3386ca59e934b34421c39b0a50aa8c47ab5da7fdf663965ed4793240e5377e74d91b73d3dcd05568c0e91608a72b327877f60cc51ec39e2 + languageName: node + linkType: hard + +"config-chain@npm:^1.1.11": + version: 1.1.13 + resolution: "config-chain@npm:1.1.13" + dependencies: + ini: "npm:^1.3.4" + proto-list: "npm:~1.2.1" + checksum: 10c0/39d1df18739d7088736cc75695e98d7087aea43646351b028dfabd5508d79cf6ef4c5bcd90471f52cd87ae470d1c5490c0a8c1a292fbe6ee9ff688061ea0963e + languageName: node + linkType: hard + +"configstore@npm:^6.0.0": + version: 6.0.0 + resolution: "configstore@npm:6.0.0" + dependencies: + dot-prop: "npm:^6.0.1" + graceful-fs: "npm:^4.2.6" + unique-string: "npm:^3.0.0" + write-file-atomic: "npm:^3.0.3" + xdg-basedir: "npm:^5.0.1" + checksum: 10c0/6681a96038ab3e0397cbdf55e6e1624ac3dfa3afe955e219f683df060188a418bda043c9114a59a337e7aec9562b0a0c838ed7db24289e6d0c266bc8313b9580 + languageName: node + linkType: hard + +"connect-history-api-fallback@npm:^2.0.0": + version: 2.0.0 + resolution: "connect-history-api-fallback@npm:2.0.0" + checksum: 10c0/90fa8b16ab76e9531646cc70b010b1dbd078153730c510d3142f6cf07479ae8a812c5a3c0e40a28528dd1681a62395d0cfdef67da9e914c4772ac85d69a3ed87 + languageName: node + linkType: hard + +"consola@npm:^3.2.3": + version: 3.4.0 + resolution: "consola@npm:3.4.0" + checksum: 10c0/bc7f7ad46514375109a80f3ae8330097eb1e5d89232a24eb830f3ac383e22036a62c53d33561cd73d7cda4b3691fba85e3dcf35229ef7721b324aae291ceb40c + languageName: node + linkType: hard + +"content-disposition@npm:0.5.2": + version: 0.5.2 + resolution: "content-disposition@npm:0.5.2" + checksum: 10c0/49eebaa0da1f9609b192e99d7fec31d1178cb57baa9d01f5b63b29787ac31e9d18b5a1033e854c68c9b6cce790e700a6f7fa60e43f95e2e416404e114a8f2f49 + languageName: node + linkType: hard + +"content-disposition@npm:0.5.4": + version: 0.5.4 + resolution: "content-disposition@npm:0.5.4" + dependencies: + safe-buffer: "npm:5.2.1" + checksum: 10c0/bac0316ebfeacb8f381b38285dc691c9939bf0a78b0b7c2d5758acadad242d04783cee5337ba7d12a565a19075af1b3c11c728e1e4946de73c6ff7ce45f3f1bb + languageName: node + linkType: hard + +"content-type@npm:~1.0.4, content-type@npm:~1.0.5": + version: 1.0.5 + resolution: "content-type@npm:1.0.5" + checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af + languageName: node + linkType: hard + +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b + languageName: node + linkType: hard + +"cookie-signature@npm:1.0.6": + version: 1.0.6 + resolution: "cookie-signature@npm:1.0.6" + checksum: 10c0/b36fd0d4e3fef8456915fcf7742e58fbfcc12a17a018e0eb9501c9d5ef6893b596466f03b0564b81af29ff2538fd0aa4b9d54fe5ccbfb4c90ea50ad29fe2d221 + languageName: node + linkType: hard + +"cookie@npm:0.7.1": + version: 0.7.1 + resolution: "cookie@npm:0.7.1" + checksum: 10c0/5de60c67a410e7c8dc8a46a4b72eb0fe925871d057c9a5d2c0e8145c4270a4f81076de83410c4d397179744b478e33cd80ccbcc457abf40a9409ad27dcd21dde + languageName: node + linkType: hard + +"copy-text-to-clipboard@npm:^3.2.0": + version: 3.2.0 + resolution: "copy-text-to-clipboard@npm:3.2.0" + checksum: 10c0/d60fdadc59d526e19d56ad23cec2b292d33c771a5091621bd322d138804edd3c10eb2367d46ec71b39f5f7f7116a2910b332281aeb36a5b679199d746a8a5381 + languageName: node + linkType: hard + +"copy-webpack-plugin@npm:^11.0.0": + version: 11.0.0 + resolution: "copy-webpack-plugin@npm:11.0.0" + dependencies: + fast-glob: "npm:^3.2.11" + glob-parent: "npm:^6.0.1" + globby: "npm:^13.1.1" + normalize-path: "npm:^3.0.0" + schema-utils: "npm:^4.0.0" + serialize-javascript: "npm:^6.0.0" + peerDependencies: + webpack: ^5.1.0 + checksum: 10c0/a667dd226b26f148584a35fb705f5af926d872584912cf9fd203c14f2b3a68f473a1f5cf768ec1dd5da23820823b850e5d50458b685c468e4a224b25c12a15b4 + languageName: node + linkType: hard + +"core-js-compat@npm:^3.37.1, core-js-compat@npm:^3.38.0": + version: 3.38.1 + resolution: "core-js-compat@npm:3.38.1" + dependencies: + browserslist: "npm:^4.23.3" + checksum: 10c0/d8bc8a35591fc5fbf3e376d793f298ec41eb452619c7ef9de4ea59b74be06e9fda799e0dcbf9ba59880dae87e3b41fb191d744ffc988315642a1272bb9442b31 + languageName: node + linkType: hard + +"core-js-compat@npm:^3.40.0": + version: 3.41.0 + resolution: "core-js-compat@npm:3.41.0" + dependencies: + browserslist: "npm:^4.24.4" + checksum: 10c0/92d2c748d3dd1c4e3b6cee6b6683b9212db9bc0a6574d933781210daf3baaeb76334ed4636eb8935b45802aa8d9235ab604c9a262694e02a2fa17ad0f6976829 + languageName: node + linkType: hard + +"core-js-pure@npm:^3.30.2": + version: 3.36.1 + resolution: "core-js-pure@npm:3.36.1" + checksum: 10c0/b964c7aa35665a4ecd513f62d695d99e96bb9e42621f7fcc823a613fab4155525d5c2875e46fcc4e6a3396c1fb7d543aee8f7afd83aa34531261b30af759c3d6 + languageName: node + linkType: hard + +"core-js@npm:^3.31.1": + version: 3.36.1 + resolution: "core-js@npm:3.36.1" + checksum: 10c0/4f0ad2464535d809ba659226feca15bff14b9b5452518bddff8d81b9c94b0227b3027d9838f22f1dce664958acb4107b935cc0037695ae545edc2a303bca98bf + languageName: node + linkType: hard + +"core-util-is@npm:~1.0.0": + version: 1.0.3 + resolution: "core-util-is@npm:1.0.3" + checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 + languageName: node + linkType: hard + +"cose-base@npm:^1.0.0": + version: 1.0.3 + resolution: "cose-base@npm:1.0.3" + dependencies: + layout-base: "npm:^1.0.0" + checksum: 10c0/a6e400b1d101393d6af0967c1353355777c1106c40417c5acaef6ca8bdda41e2fc9398f466d6c85be30290943ad631f2590569f67b3fd5368a0d8318946bd24f + languageName: node + linkType: hard + +"cose-base@npm:^2.2.0": + version: 2.2.0 + resolution: "cose-base@npm:2.2.0" + dependencies: + layout-base: "npm:^2.0.0" + checksum: 10c0/14b9f8100ac322a00777ffb1daeb3321af368bbc9cabe3103943361273baee2003202ffe38e4ab770960b600214224e9c196195a78d589521540aa694df7cdec + languageName: node + linkType: hard + +"cosmiconfig@npm:^8.1.3, cosmiconfig@npm:^8.3.5": + version: 8.3.6 + resolution: "cosmiconfig@npm:8.3.6" + dependencies: + import-fresh: "npm:^3.3.0" + js-yaml: "npm:^4.1.0" + parse-json: "npm:^5.2.0" + path-type: "npm:^4.0.0" + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/0382a9ed13208f8bfc22ca2f62b364855207dffdb73dc26e150ade78c3093f1cf56172df2dd460c8caf2afa91c0ed4ec8a88c62f8f9cd1cf423d26506aa8797a + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 + languageName: node + linkType: hard + +"crypto-random-string@npm:^4.0.0": + version: 4.0.0 + resolution: "crypto-random-string@npm:4.0.0" + dependencies: + type-fest: "npm:^1.0.1" + checksum: 10c0/16e11a3c8140398f5408b7fded35a961b9423c5dac39a60cbbd08bd3f0e07d7de130e87262adea7db03ec1a7a4b7551054e0db07ee5408b012bac5400cfc07a5 + languageName: node + linkType: hard + +"css-blank-pseudo@npm:^7.0.1": + version: 7.0.1 + resolution: "css-blank-pseudo@npm:7.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/46c3d3a611972fdb0c264db7c0b34fe437bc4300961d11945145cf04962f52a545a6ef55bc8ff4afd82b605bd692b4970f2b54582616dea00441105e725d4618 + languageName: node + linkType: hard + +"css-declaration-sorter@npm:^7.2.0": + version: 7.2.0 + resolution: "css-declaration-sorter@npm:7.2.0" + peerDependencies: + postcss: ^8.0.9 + checksum: 10c0/d8516be94f8f2daa233ef021688b965c08161624cbf830a4d7ee1099429437c0ee124d35c91b1c659cfd891a68e8888aa941726dab12279bc114aaed60a94606 + languageName: node + linkType: hard + +"css-has-pseudo@npm:^7.0.2": + version: 7.0.2 + resolution: "css-has-pseudo@npm:7.0.2" + dependencies: + "@csstools/selector-specificity": "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/456e9ce1eec8a535683c329956acfe53ce5a208345d7f2fcbe662626be8b3c98681e9041d7f4980316714397b0c1c3defde25653d629c396df17803d599c4edf + languageName: node + linkType: hard + +"css-loader@npm:^6.11.0": + version: 6.11.0 + resolution: "css-loader@npm:6.11.0" + dependencies: + icss-utils: "npm:^5.1.0" + postcss: "npm:^8.4.33" + postcss-modules-extract-imports: "npm:^3.1.0" + postcss-modules-local-by-default: "npm:^4.0.5" + postcss-modules-scope: "npm:^3.2.0" + postcss-modules-values: "npm:^4.0.0" + postcss-value-parser: "npm:^4.2.0" + semver: "npm:^7.5.4" + peerDependencies: + "@rspack/core": 0.x || 1.x + webpack: ^5.0.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10c0/bb52434138085fed06a33e2ffbdae9ee9014ad23bf60f59d6b7ee67f28f26c6b1764024d3030bd19fd884d6ee6ee2224eaed64ad19eb18fbbb23d148d353a965 + languageName: node + linkType: hard + +"css-minimizer-webpack-plugin@npm:^5.0.1": + version: 5.0.1 + resolution: "css-minimizer-webpack-plugin@npm:5.0.1" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.18" + cssnano: "npm:^6.0.1" + jest-worker: "npm:^29.4.3" + postcss: "npm:^8.4.24" + schema-utils: "npm:^4.0.1" + serialize-javascript: "npm:^6.0.1" + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + "@parcel/css": + optional: true + "@swc/css": + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + lightningcss: + optional: true + checksum: 10c0/1792259e18f7c5ee25b6bbf60b38b64201747add83d1f751c8c654159b46ebacd0d1103d35f17d97197033e21e02d2ba4a4e9aa14c9c0d067b7c7653c721814e + languageName: node + linkType: hard + +"css-prefers-color-scheme@npm:^10.0.0": + version: 10.0.0 + resolution: "css-prefers-color-scheme@npm:10.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/a66c727bb2455328b18862f720819fc98ff5c1486b69f758bdb5c66f46cc6d484f9fc0bfa4f00f2693c5da6707ad136ca789496982f713ade693f08af624930e + languageName: node + linkType: hard + +"css-select@npm:^4.1.3": + version: 4.3.0 + resolution: "css-select@npm:4.3.0" + dependencies: + boolbase: "npm:^1.0.0" + css-what: "npm:^6.0.1" + domhandler: "npm:^4.3.1" + domutils: "npm:^2.8.0" + nth-check: "npm:^2.0.1" + checksum: 10c0/a489d8e5628e61063d5a8fe0fa1cc7ae2478cb334a388a354e91cf2908154be97eac9fa7ed4dffe87a3e06cf6fcaa6016553115335c4fd3377e13dac7bd5a8e1 + languageName: node + linkType: hard + +"css-select@npm:^5.1.0": + version: 5.1.0 + resolution: "css-select@npm:5.1.0" + dependencies: + boolbase: "npm:^1.0.0" + css-what: "npm:^6.1.0" + domhandler: "npm:^5.0.2" + domutils: "npm:^3.0.1" + nth-check: "npm:^2.0.1" + checksum: 10c0/551c60dba5b54054741032c1793b5734f6ba45e23ae9e82761a3c0ed1acbb8cfedfa443aaba3a3c1a54cac12b456d2012a09d2cd5f0e82e430454c1b9d84d500 + languageName: node + linkType: hard + +"css-tree@npm:^2.3.1": + version: 2.3.1 + resolution: "css-tree@npm:2.3.1" + dependencies: + mdn-data: "npm:2.0.30" + source-map-js: "npm:^1.0.1" + checksum: 10c0/6f8c1a11d5e9b14bf02d10717fc0351b66ba12594166f65abfbd8eb8b5b490dd367f5c7721db241a3c792d935fc6751fbc09f7e1598d421477ad9fadc30f4f24 + languageName: node + linkType: hard + +"css-tree@npm:~2.2.0": + version: 2.2.1 + resolution: "css-tree@npm:2.2.1" + dependencies: + mdn-data: "npm:2.0.28" + source-map-js: "npm:^1.0.1" + checksum: 10c0/47e87b0f02f8ac22f57eceb65c58011dd142d2158128882a0bf963cf2eabb81a4ebbc2e3790c8289be7919fa8b83750c7b69272bd66772c708143b772ba3c186 + languageName: node + linkType: hard + +"css-what@npm:^6.0.1, css-what@npm:^6.1.0": + version: 6.1.0 + resolution: "css-what@npm:6.1.0" + checksum: 10c0/a09f5a6b14ba8dcf57ae9a59474722e80f20406c53a61e9aedb0eedc693b135113ffe2983f4efc4b5065ae639442e9ae88df24941ef159c218b231011d733746 + languageName: node + linkType: hard + +"cssdb@npm:^8.3.0": + version: 8.3.0 + resolution: "cssdb@npm:8.3.0" + checksum: 10c0/56d13cbddd90e63f45f24f71f35314f9718b72760acdf15367e33014eb45df775ae97ec05c08afaa6b4b147c757e9554c1bf39ddcdaeeb26b6c2adfeee503ae7 + languageName: node + linkType: hard + +"cssesc@npm:^3.0.0": + version: 3.0.0 + resolution: "cssesc@npm:3.0.0" + bin: + cssesc: bin/cssesc + checksum: 10c0/6bcfd898662671be15ae7827120472c5667afb3d7429f1f917737f3bf84c4176003228131b643ae74543f17a394446247df090c597bb9a728cce298606ed0aa7 + languageName: node + linkType: hard + +"cssnano-preset-advanced@npm:^6.1.2": + version: 6.1.2 + resolution: "cssnano-preset-advanced@npm:6.1.2" + dependencies: + autoprefixer: "npm:^10.4.19" + browserslist: "npm:^4.23.0" + cssnano-preset-default: "npm:^6.1.2" + postcss-discard-unused: "npm:^6.0.5" + postcss-merge-idents: "npm:^6.0.3" + postcss-reduce-idents: "npm:^6.0.3" + postcss-zindex: "npm:^6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/22d3ddab258e6b31e7e2e7c48712f023b60fadb2813929752dace0326e28cd250830b5420a33f81b01df52d2460cb5f999fff5907f58508809efe1a8a739a707 + languageName: node + linkType: hard + +"cssnano-preset-default@npm:^6.1.2": + version: 6.1.2 + resolution: "cssnano-preset-default@npm:6.1.2" + dependencies: + browserslist: "npm:^4.23.0" + css-declaration-sorter: "npm:^7.2.0" + cssnano-utils: "npm:^4.0.2" + postcss-calc: "npm:^9.0.1" + postcss-colormin: "npm:^6.1.0" + postcss-convert-values: "npm:^6.1.0" + postcss-discard-comments: "npm:^6.0.2" + postcss-discard-duplicates: "npm:^6.0.3" + postcss-discard-empty: "npm:^6.0.3" + postcss-discard-overridden: "npm:^6.0.2" + postcss-merge-longhand: "npm:^6.0.5" + postcss-merge-rules: "npm:^6.1.1" + postcss-minify-font-values: "npm:^6.1.0" + postcss-minify-gradients: "npm:^6.0.3" + postcss-minify-params: "npm:^6.1.0" + postcss-minify-selectors: "npm:^6.0.4" + postcss-normalize-charset: "npm:^6.0.2" + postcss-normalize-display-values: "npm:^6.0.2" + postcss-normalize-positions: "npm:^6.0.2" + postcss-normalize-repeat-style: "npm:^6.0.2" + postcss-normalize-string: "npm:^6.0.2" + postcss-normalize-timing-functions: "npm:^6.0.2" + postcss-normalize-unicode: "npm:^6.1.0" + postcss-normalize-url: "npm:^6.0.2" + postcss-normalize-whitespace: "npm:^6.0.2" + postcss-ordered-values: "npm:^6.0.2" + postcss-reduce-initial: "npm:^6.1.0" + postcss-reduce-transforms: "npm:^6.0.2" + postcss-svgo: "npm:^6.0.3" + postcss-unique-selectors: "npm:^6.0.4" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/af99021f936763850f5f35dc9e6a9dfb0da30856dea36e0420b011da2a447099471db2a5f3d1f5f52c0489da186caf9a439d8f048a80f82617077efb018333fa + languageName: node + linkType: hard + +"cssnano-utils@npm:^4.0.2": + version: 4.0.2 + resolution: "cssnano-utils@npm:4.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/260b8c8ffa48b908aa77ef129f9b8648ecd92aed405b20e7fe6b8370779dd603530344fc9d96683d53533246e48b36ac9d2aa5a476b4f81c547bbad86d187f35 + languageName: node + linkType: hard + +"cssnano@npm:^6.0.1, cssnano@npm:^6.1.2": + version: 6.1.2 + resolution: "cssnano@npm:6.1.2" + dependencies: + cssnano-preset-default: "npm:^6.1.2" + lilconfig: "npm:^3.1.1" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/4df0dc0389b34b38acb09b7cfb07267b0eda95349c6d5e9b7666acc7200bb33359650869a60168e9d878298b05f4ad2c7f070815c90551720a3f4e1037f79691 + languageName: node + linkType: hard + +"csso@npm:^5.0.5": + version: 5.0.5 + resolution: "csso@npm:5.0.5" + dependencies: + css-tree: "npm:~2.2.0" + checksum: 10c0/ab4beb1e97dd7e207c10e9925405b45f15a6cd1b4880a8686ad573aa6d476aed28b4121a666cffd26c37a26179f7b54741f7c257543003bfb244d06a62ad569b + languageName: node + linkType: hard + +"csstype@npm:^3.0.2": + version: 3.1.0 + resolution: "csstype@npm:3.1.0" + checksum: 10c0/4edcf1eb8b8e83e8b1dc557d9f61e720012e6d2453f4c05fa4221dacf604c4d7552383f0cead9adea4b3f23e3da3aa25cc4fb05823b51fb1cbad43e1d8bb45ff + languageName: node + linkType: hard + +"cytoscape-cose-bilkent@npm:^4.1.0": + version: 4.1.0 + resolution: "cytoscape-cose-bilkent@npm:4.1.0" + dependencies: + cose-base: "npm:^1.0.0" + peerDependencies: + cytoscape: ^3.2.0 + checksum: 10c0/5e2480ddba9da1a68e700ed2c674cbfd51e9efdbd55788f1971a68de4eb30708e3b3a5e808bf5628f7a258680406bbe6586d87a9133e02a9bdc1ab1a92f512f2 + languageName: node + linkType: hard + +"cytoscape-fcose@npm:^2.2.0": + version: 2.2.0 + resolution: "cytoscape-fcose@npm:2.2.0" + dependencies: + cose-base: "npm:^2.2.0" + peerDependencies: + cytoscape: ^3.2.0 + checksum: 10c0/ce472c9f85b9057e75c5685396f8e1f2468895e71b184913e05ad56dcf3092618fe59a1054f29cb0995051ba8ebe566ad0dd49a58d62845145624bd60cd44917 + languageName: node + linkType: hard + +"cytoscape@npm:^3.29.3": + version: 3.32.0 + resolution: "cytoscape@npm:3.32.0" + checksum: 10c0/21cb0d2e79ebe137c7218e96edc2fb1c9000faae4f58c6a3c1899d9689c447c91feff94e5de649f227ced66f8c6a092b838de3fff3d8b57366156900f5df6d71 + languageName: node + linkType: hard + +"d3-array@npm:1 - 2": + version: 2.12.1 + resolution: "d3-array@npm:2.12.1" + dependencies: + internmap: "npm:^1.0.0" + checksum: 10c0/7eca10427a9f113a4ca6a0f7301127cab26043fd5e362631ef5a0edd1c4b2dd70c56ed317566700c31e4a6d88b55f3951aaba192291817f243b730cb2352882e + languageName: node + linkType: hard + +"d3-array@npm:2 - 3, d3-array@npm:2.10.0 - 3, d3-array@npm:2.5.0 - 3, d3-array@npm:3, d3-array@npm:^3.2.0": + version: 3.2.4 + resolution: "d3-array@npm:3.2.4" + dependencies: + internmap: "npm:1 - 2" + checksum: 10c0/08b95e91130f98c1375db0e0af718f4371ccacef7d5d257727fe74f79a24383e79aba280b9ffae655483ffbbad4fd1dec4ade0119d88c4749f388641c8bf8c50 + languageName: node + linkType: hard + +"d3-axis@npm:3": + version: 3.0.0 + resolution: "d3-axis@npm:3.0.0" + checksum: 10c0/a271e70ba1966daa5aaf6a7f959ceca3e12997b43297e757c7b945db2e1ead3c6ee226f2abcfa22abbd4e2e28bd2b71a0911794c4e5b911bbba271328a582c78 + languageName: node + linkType: hard + +"d3-brush@npm:3": + version: 3.0.0 + resolution: "d3-brush@npm:3.0.0" + dependencies: + d3-dispatch: "npm:1 - 3" + d3-drag: "npm:2 - 3" + d3-interpolate: "npm:1 - 3" + d3-selection: "npm:3" + d3-transition: "npm:3" + checksum: 10c0/07baf00334c576da2f68a91fc0da5732c3a5fa19bd3d7aed7fd24d1d674a773f71a93e9687c154176f7246946194d77c48c2d8fed757f5dcb1a4740067ec50a8 + languageName: node + linkType: hard + +"d3-chord@npm:3": + version: 3.0.1 + resolution: "d3-chord@npm:3.0.1" + dependencies: + d3-path: "npm:1 - 3" + checksum: 10c0/baa6013914af3f4fe1521f0d16de31a38eb8a71d08ff1dec4741f6f45a828661e5cd3935e39bd14e3032bdc78206c283ca37411da21d46ec3cfc520be6e7a7ce + languageName: node + linkType: hard + +"d3-color@npm:1 - 3, d3-color@npm:3": + version: 3.1.0 + resolution: "d3-color@npm:3.1.0" + checksum: 10c0/a4e20e1115fa696fce041fbe13fbc80dc4c19150fa72027a7c128ade980bc0eeeba4bcf28c9e21f0bce0e0dbfe7ca5869ef67746541dcfda053e4802ad19783c + languageName: node + linkType: hard + +"d3-contour@npm:4": + version: 4.0.2 + resolution: "d3-contour@npm:4.0.2" + dependencies: + d3-array: "npm:^3.2.0" + checksum: 10c0/98bc5fbed6009e08707434a952076f39f1cd6ed8b9288253cc3e6a3286e4e80c63c62d84954b20e64bf6e4ededcc69add54d3db25e990784a59c04edd3449032 + languageName: node + linkType: hard + +"d3-delaunay@npm:6": + version: 6.0.4 + resolution: "d3-delaunay@npm:6.0.4" + dependencies: + delaunator: "npm:5" + checksum: 10c0/57c3aecd2525664b07c4c292aa11cf49b2752c0cf3f5257f752999399fe3c592de2d418644d79df1f255471eec8057a9cc0c3062ed7128cb3348c45f69597754 + languageName: node + linkType: hard + +"d3-dispatch@npm:1 - 3, d3-dispatch@npm:3": + version: 3.0.1 + resolution: "d3-dispatch@npm:3.0.1" + checksum: 10c0/6eca77008ce2dc33380e45d4410c67d150941df7ab45b91d116dbe6d0a3092c0f6ac184dd4602c796dc9e790222bad3ff7142025f5fd22694efe088d1d941753 + languageName: node + linkType: hard + +"d3-drag@npm:2 - 3, d3-drag@npm:3": + version: 3.0.0 + resolution: "d3-drag@npm:3.0.0" + dependencies: + d3-dispatch: "npm:1 - 3" + d3-selection: "npm:3" + checksum: 10c0/d2556e8dc720741a443b595a30af403dd60642dfd938d44d6e9bfc4c71a962142f9a028c56b61f8b4790b65a34acad177d1263d66f103c3c527767b0926ef5aa + languageName: node + linkType: hard + +"d3-dsv@npm:1 - 3, d3-dsv@npm:3": + version: 3.0.1 + resolution: "d3-dsv@npm:3.0.1" + dependencies: + commander: "npm:7" + iconv-lite: "npm:0.6" + rw: "npm:1" + bin: + csv2json: bin/dsv2json.js + csv2tsv: bin/dsv2dsv.js + dsv2dsv: bin/dsv2dsv.js + dsv2json: bin/dsv2json.js + json2csv: bin/json2dsv.js + json2dsv: bin/json2dsv.js + json2tsv: bin/json2dsv.js + tsv2csv: bin/dsv2dsv.js + tsv2json: bin/dsv2json.js + checksum: 10c0/10e6af9e331950ed258f34ab49ac1b7060128ef81dcf32afc790bd1f7e8c3cc2aac7f5f875250a83f21f39bb5925fbd0872bb209f8aca32b3b77d32bab8a65ab + languageName: node + linkType: hard + +"d3-ease@npm:1 - 3, d3-ease@npm:3": + version: 3.0.1 + resolution: "d3-ease@npm:3.0.1" + checksum: 10c0/fec8ef826c0cc35cda3092c6841e07672868b1839fcaf556e19266a3a37e6bc7977d8298c0fcb9885e7799bfdcef7db1baaba9cd4dcf4bc5e952cf78574a88b0 + languageName: node + linkType: hard + +"d3-fetch@npm:3": + version: 3.0.1 + resolution: "d3-fetch@npm:3.0.1" + dependencies: + d3-dsv: "npm:1 - 3" + checksum: 10c0/4f467a79bf290395ac0cbb5f7562483f6a18668adc4c8eb84c9d3eff048b6f6d3b6f55079ba1ebf1908dabe000c941d46be447f8d78453b2dad5fb59fb6aa93b + languageName: node + linkType: hard + +"d3-force@npm:3": + version: 3.0.0 + resolution: "d3-force@npm:3.0.0" + dependencies: + d3-dispatch: "npm:1 - 3" + d3-quadtree: "npm:1 - 3" + d3-timer: "npm:1 - 3" + checksum: 10c0/220a16a1a1ac62ba56df61028896e4b52be89c81040d20229c876efc8852191482c233f8a52bb5a4e0875c321b8e5cb6413ef3dfa4d8fe79eeb7d52c587f52cf + languageName: node + linkType: hard + +"d3-format@npm:1 - 3, d3-format@npm:3": + version: 3.1.0 + resolution: "d3-format@npm:3.1.0" + checksum: 10c0/049f5c0871ebce9859fc5e2f07f336b3c5bfff52a2540e0bac7e703fce567cd9346f4ad1079dd18d6f1e0eaa0599941c1810898926f10ac21a31fd0a34b4aa75 + languageName: node + linkType: hard + +"d3-geo@npm:3": + version: 3.1.1 + resolution: "d3-geo@npm:3.1.1" + dependencies: + d3-array: "npm:2.5.0 - 3" + checksum: 10c0/d32270dd2dc8ac3ea63e8805d63239c4c8ec6c0d339d73b5e5a30a87f8f54db22a78fb434369799465eae169503b25f9a107c642c8a16c32a3285bc0e6d8e8c1 + languageName: node + linkType: hard + +"d3-hierarchy@npm:3": + version: 3.1.2 + resolution: "d3-hierarchy@npm:3.1.2" + checksum: 10c0/6dcdb480539644aa7fc0d72dfc7b03f99dfbcdf02714044e8c708577e0d5981deb9d3e99bbbb2d26422b55bcc342ac89a0fa2ea6c9d7302e2fc0951dd96f89cf + languageName: node + linkType: hard + +"d3-interpolate@npm:1 - 3, d3-interpolate@npm:1.2.0 - 3, d3-interpolate@npm:3": + version: 3.0.1 + resolution: "d3-interpolate@npm:3.0.1" + dependencies: + d3-color: "npm:1 - 3" + checksum: 10c0/19f4b4daa8d733906671afff7767c19488f51a43d251f8b7f484d5d3cfc36c663f0a66c38fe91eee30f40327443d799be17169f55a293a3ba949e84e57a33e6a + languageName: node + linkType: hard + +"d3-path@npm:1": + version: 1.0.9 + resolution: "d3-path@npm:1.0.9" + checksum: 10c0/e35e84df5abc18091f585725b8235e1fa97efc287571585427d3a3597301e6c506dea56b11dfb3c06ca5858b3eb7f02c1bf4f6a716aa9eade01c41b92d497eb5 + languageName: node + linkType: hard + +"d3-path@npm:1 - 3, d3-path@npm:3, d3-path@npm:^3.1.0": + version: 3.1.0 + resolution: "d3-path@npm:3.1.0" + checksum: 10c0/dc1d58ec87fa8319bd240cf7689995111a124b141428354e9637aa83059eb12e681f77187e0ada5dedfce346f7e3d1f903467ceb41b379bfd01cd8e31721f5da + languageName: node + linkType: hard + +"d3-polygon@npm:3": + version: 3.0.1 + resolution: "d3-polygon@npm:3.0.1" + checksum: 10c0/e236aa7f33efa9a4072907af7dc119f85b150a0716759d4fe5f12f62573018264a6cbde8617fbfa6944a7ae48c1c0c8d3f39ae72e11f66dd471e9b5e668385df + languageName: node + linkType: hard + +"d3-quadtree@npm:1 - 3, d3-quadtree@npm:3": + version: 3.0.1 + resolution: "d3-quadtree@npm:3.0.1" + checksum: 10c0/18302d2548bfecaef788152397edec95a76400fd97d9d7f42a089ceb68d910f685c96579d74e3712d57477ed042b056881b47cd836a521de683c66f47ce89090 + languageName: node + linkType: hard + +"d3-random@npm:3": + version: 3.0.1 + resolution: "d3-random@npm:3.0.1" + checksum: 10c0/987a1a1bcbf26e6cf01fd89d5a265b463b2cea93560fc17d9b1c45e8ed6ff2db5924601bcceb808de24c94133f000039eb7fa1c469a7a844ccbf1170cbb25b41 + languageName: node + linkType: hard + +"d3-sankey@npm:^0.12.3": + version: 0.12.3 + resolution: "d3-sankey@npm:0.12.3" + dependencies: + d3-array: "npm:1 - 2" + d3-shape: "npm:^1.2.0" + checksum: 10c0/261debb01a13269f6fc53b9ebaef174a015d5ad646242c23995bf514498829ab8b8f920a7873724a7494288b46bea3ce7ebc5a920b745bc8ae4caa5885cf5204 + languageName: node + linkType: hard + +"d3-scale-chromatic@npm:3": + version: 3.1.0 + resolution: "d3-scale-chromatic@npm:3.1.0" + dependencies: + d3-color: "npm:1 - 3" + d3-interpolate: "npm:1 - 3" + checksum: 10c0/9a3f4671ab0b971f4a411b42180d7cf92bfe8e8584e637ce7e698d705e18d6d38efbd20ec64f60cc0dfe966c20d40fc172565bc28aaa2990c0a006360eed91af + languageName: node + linkType: hard + +"d3-scale@npm:4": + version: 4.0.2 + resolution: "d3-scale@npm:4.0.2" + dependencies: + d3-array: "npm:2.10.0 - 3" + d3-format: "npm:1 - 3" + d3-interpolate: "npm:1.2.0 - 3" + d3-time: "npm:2.1.1 - 3" + d3-time-format: "npm:2 - 4" + checksum: 10c0/65d9ad8c2641aec30ed5673a7410feb187a224d6ca8d1a520d68a7d6eac9d04caedbff4713d1e8545be33eb7fec5739983a7ab1d22d4e5ad35368c6729d362f1 + languageName: node + linkType: hard + +"d3-selection@npm:2 - 3, d3-selection@npm:3": + version: 3.0.0 + resolution: "d3-selection@npm:3.0.0" + checksum: 10c0/e59096bbe8f0cb0daa1001d9bdd6dbc93a688019abc97d1d8b37f85cd3c286a6875b22adea0931b0c88410d025563e1643019161a883c516acf50c190a11b56b + languageName: node + linkType: hard + +"d3-shape@npm:3": + version: 3.2.0 + resolution: "d3-shape@npm:3.2.0" + dependencies: + d3-path: "npm:^3.1.0" + checksum: 10c0/f1c9d1f09926daaf6f6193ae3b4c4b5521e81da7d8902d24b38694517c7f527ce3c9a77a9d3a5722ad1e3ff355860b014557b450023d66a944eabf8cfde37132 + languageName: node + linkType: hard + +"d3-shape@npm:^1.2.0": + version: 1.3.7 + resolution: "d3-shape@npm:1.3.7" + dependencies: + d3-path: "npm:1" + checksum: 10c0/548057ce59959815decb449f15632b08e2a1bdce208f9a37b5f98ec7629dda986c2356bc7582308405ce68aedae7d47b324df41507404df42afaf352907577ae + languageName: node + linkType: hard + +"d3-time-format@npm:2 - 4, d3-time-format@npm:4": + version: 4.1.0 + resolution: "d3-time-format@npm:4.1.0" + dependencies: + d3-time: "npm:1 - 3" + checksum: 10c0/735e00fb25a7fd5d418fac350018713ae394eefddb0d745fab12bbff0517f9cdb5f807c7bbe87bb6eeb06249662f8ea84fec075f7d0cd68609735b2ceb29d206 + languageName: node + linkType: hard + +"d3-time@npm:1 - 3, d3-time@npm:2.1.1 - 3, d3-time@npm:3": + version: 3.1.0 + resolution: "d3-time@npm:3.1.0" + dependencies: + d3-array: "npm:2 - 3" + checksum: 10c0/a984f77e1aaeaa182679b46fbf57eceb6ebdb5f67d7578d6f68ef933f8eeb63737c0949991618a8d29472dbf43736c7d7f17c452b2770f8c1271191cba724ca1 + languageName: node + linkType: hard + +"d3-timer@npm:1 - 3, d3-timer@npm:3": + version: 3.0.1 + resolution: "d3-timer@npm:3.0.1" + checksum: 10c0/d4c63cb4bb5461d7038aac561b097cd1c5673969b27cbdd0e87fa48d9300a538b9e6f39b4a7f0e3592ef4f963d858c8a9f0e92754db73116770856f2fc04561a + languageName: node + linkType: hard + +"d3-transition@npm:2 - 3, d3-transition@npm:3": + version: 3.0.1 + resolution: "d3-transition@npm:3.0.1" + dependencies: + d3-color: "npm:1 - 3" + d3-dispatch: "npm:1 - 3" + d3-ease: "npm:1 - 3" + d3-interpolate: "npm:1 - 3" + d3-timer: "npm:1 - 3" + peerDependencies: + d3-selection: 2 - 3 + checksum: 10c0/4e74535dda7024aa43e141635b7522bb70cf9d3dfefed975eb643b36b864762eca67f88fafc2ca798174f83ca7c8a65e892624f824b3f65b8145c6a1a88dbbad + languageName: node + linkType: hard + +"d3-zoom@npm:3": + version: 3.0.0 + resolution: "d3-zoom@npm:3.0.0" + dependencies: + d3-dispatch: "npm:1 - 3" + d3-drag: "npm:2 - 3" + d3-interpolate: "npm:1 - 3" + d3-selection: "npm:2 - 3" + d3-transition: "npm:2 - 3" + checksum: 10c0/ee2036479049e70d8c783d594c444fe00e398246048e3f11a59755cd0e21de62ece3126181b0d7a31bf37bcf32fd726f83ae7dea4495ff86ec7736ce5ad36fd3 + languageName: node + linkType: hard + +"d3@npm:^7.9.0": + version: 7.9.0 + resolution: "d3@npm:7.9.0" + dependencies: + d3-array: "npm:3" + d3-axis: "npm:3" + d3-brush: "npm:3" + d3-chord: "npm:3" + d3-color: "npm:3" + d3-contour: "npm:4" + d3-delaunay: "npm:6" + d3-dispatch: "npm:3" + d3-drag: "npm:3" + d3-dsv: "npm:3" + d3-ease: "npm:3" + d3-fetch: "npm:3" + d3-force: "npm:3" + d3-format: "npm:3" + d3-geo: "npm:3" + d3-hierarchy: "npm:3" + d3-interpolate: "npm:3" + d3-path: "npm:3" + d3-polygon: "npm:3" + d3-quadtree: "npm:3" + d3-random: "npm:3" + d3-scale: "npm:4" + d3-scale-chromatic: "npm:3" + d3-selection: "npm:3" + d3-shape: "npm:3" + d3-time: "npm:3" + d3-time-format: "npm:4" + d3-timer: "npm:3" + d3-transition: "npm:3" + d3-zoom: "npm:3" + checksum: 10c0/3dd9c08c73cfaa69c70c49e603c85e049c3904664d9c79a1a52a0f52795828a1ff23592dc9a7b2257e711d68a615472a13103c212032f38e016d609796e087e8 + languageName: node + linkType: hard + +"dagre-d3-es@npm:7.0.11": + version: 7.0.11 + resolution: "dagre-d3-es@npm:7.0.11" + dependencies: + d3: "npm:^7.9.0" + lodash-es: "npm:^4.17.21" + checksum: 10c0/52f88bdfeca0d8554bee0c1419377585355b4ef179e5fedd3bac75f772745ecb789f6d7ea377a17566506bc8f151bc0dfe02a5175207a547975f335cd88c726c + languageName: node + linkType: hard + +"dayjs@npm:^1.11.13": + version: 1.11.13 + resolution: "dayjs@npm:1.11.13" + checksum: 10c0/a3caf6ac8363c7dade9d1ee797848ddcf25c1ace68d9fe8678ecf8ba0675825430de5d793672ec87b24a69bf04a1544b176547b2539982275d5542a7955f35b7 + languageName: node + linkType: hard + +"debounce@npm:^1.2.1": + version: 1.2.1 + resolution: "debounce@npm:1.2.1" + checksum: 10c0/6c9320aa0973fc42050814621a7a8a78146c1975799b5b3cc1becf1f77ba9a5aa583987884230da0842a03f385def452fad5d60db97c3d1c8b824e38a8edf500 + languageName: node + linkType: hard + +"debug@npm:2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: "npm:2.0.0" + checksum: 10c0/121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: "npm:2.1.2" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + languageName: node + linkType: hard + +"debug@npm:^4.3.4, debug@npm:^4.4.0": + version: 4.4.0 + resolution: "debug@npm:4.4.0" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/db94f1a182bf886f57b4755f85b3a74c39b5114b9377b7ab375dc2cfa3454f09490cc6c30f829df3fc8042bc8b8995f6567ce5cd96f3bc3688bd24027197d9de + languageName: node + linkType: hard + +"decode-named-character-reference@npm:^1.0.0": + version: 1.0.2 + resolution: "decode-named-character-reference@npm:1.0.2" + dependencies: + character-entities: "npm:^2.0.0" + checksum: 10c0/66a9fc5d9b5385a2b3675c69ba0d8e893393d64057f7dbbb585265bb4fc05ec513d76943b8e5aac7d8016d20eea4499322cbf4cd6d54b466976b78f3a7587a4c + languageName: node + linkType: hard + +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: "npm:^3.1.0" + checksum: 10c0/bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e + languageName: node + linkType: hard + +"deep-extend@npm:^0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 10c0/1c6b0abcdb901e13a44c7d699116d3d4279fdb261983122a3783e7273844d5f2537dc2e1c454a23fcf645917f93fbf8d07101c1d03c015a87faa662755212566 + languageName: node + linkType: hard + +"deepmerge@npm:^4.3.1": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 + languageName: node + linkType: hard + +"default-gateway@npm:^6.0.3": + version: 6.0.3 + resolution: "default-gateway@npm:6.0.3" + dependencies: + execa: "npm:^5.0.0" + checksum: 10c0/5184f9e6e105d24fb44ade9e8741efa54bb75e84625c1ea78c4ef8b81dff09ca52d6dbdd1185cf0dc655bb6b282a64fffaf7ed2dd561b8d9ad6f322b1f039aba + languageName: node + linkType: hard + +"defer-to-connect@npm:^2.0.1": + version: 2.0.1 + resolution: "defer-to-connect@npm:2.0.1" + checksum: 10c0/625ce28e1b5ad10cf77057b9a6a727bf84780c17660f6644dab61dd34c23de3001f03cedc401f7d30a4ed9965c2e8a7336e220a329146f2cf85d4eddea429782 + languageName: node + linkType: hard + +"define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 + languageName: node + linkType: hard + +"define-lazy-prop@npm:^2.0.0": + version: 2.0.0 + resolution: "define-lazy-prop@npm:2.0.0" + checksum: 10c0/db6c63864a9d3b7dc9def55d52764968a5af296de87c1b2cc71d8be8142e445208071953649e0386a8cc37cfcf9a2067a47207f1eb9ff250c2a269658fdae422 + languageName: node + linkType: hard + +"define-properties@npm:^1.1.3": + version: 1.1.4 + resolution: "define-properties@npm:1.1.4" + dependencies: + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: 10c0/1e09acd814c3761f2355d9c8a18fbc2b5d2e1073e1302245c134e96aacbff51b152e2a6f5f5db23af3c43e26f4e3a0d42f569aa4135f49046246c934bfb8e1dc + languageName: node + linkType: hard + +"delaunator@npm:5": + version: 5.0.1 + resolution: "delaunator@npm:5.0.1" + dependencies: + robust-predicates: "npm:^3.0.2" + checksum: 10c0/3d7ea4d964731c5849af33fec0a271bc6753487b331fd7d43ccb17d77834706e1c383e6ab8fda0032da955e7576d1083b9603cdaf9cbdfd6b3ebd1fb8bb675a5 + languageName: node + linkType: hard + +"depd@npm:2.0.0": + version: 2.0.0 + resolution: "depd@npm:2.0.0" + checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c + languageName: node + linkType: hard + +"depd@npm:~1.1.2": + version: 1.1.2 + resolution: "depd@npm:1.1.2" + checksum: 10c0/acb24aaf936ef9a227b6be6d495f0d2eb20108a9a6ad40585c5bda1a897031512fef6484e4fdbb80bd249fdaa82841fa1039f416ece03188e677ba11bcfda249 + languageName: node + linkType: hard + +"dequal@npm:^2.0.0": + version: 2.0.3 + resolution: "dequal@npm:2.0.3" + checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 + languageName: node + linkType: hard + +"destroy@npm:1.2.0": + version: 1.2.0 + resolution: "destroy@npm:1.2.0" + checksum: 10c0/bd7633942f57418f5a3b80d5cb53898127bcf53e24cdf5d5f4396be471417671f0fee48a4ebe9a1e9defbde2a31280011af58a57e090ff822f589b443ed4e643 + languageName: node + linkType: hard + +"detect-node@npm:^2.0.4": + version: 2.1.0 + resolution: "detect-node@npm:2.1.0" + checksum: 10c0/f039f601790f2e9d4654e499913259a798b1f5246ae24f86ab5e8bd4aaf3bce50484234c494f11fb00aecb0c6e2733aa7b1cf3f530865640b65fbbd65b2c4e09 + languageName: node + linkType: hard + +"detect-port@npm:^1.5.1": + version: 1.5.1 + resolution: "detect-port@npm:1.5.1" + dependencies: + address: "npm:^1.0.1" + debug: "npm:4" + bin: + detect: bin/detect-port.js + detect-port: bin/detect-port.js + checksum: 10c0/f2b204ad3a9f8e8b53fea35fcc97469f31a8e3e786a2f59fbc886397e33b5f130c5f964bf001b9a64d990047c3824f6a439308461ff19801df04ab48a754639e + languageName: node + linkType: hard + +"devlop@npm:^1.0.0, devlop@npm:^1.1.0": + version: 1.1.0 + resolution: "devlop@npm:1.1.0" + dependencies: + dequal: "npm:^2.0.0" + checksum: 10c0/e0928ab8f94c59417a2b8389c45c55ce0a02d9ac7fd74ef62d01ba48060129e1d594501b77de01f3eeafc7cb00773819b0df74d96251cf20b31c5b3071f45c0e + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: "npm:^4.0.0" + checksum: 10c0/dcac00920a4d503e38bb64001acb19df4efc14536ada475725e12f52c16777afdee4db827f55f13a908ee7efc0cb282e2e3dbaeeb98c0993dd93d1802d3bf00c + languageName: node + linkType: hard + +"dns-equal@npm:^1.0.0": + version: 1.0.0 + resolution: "dns-equal@npm:1.0.0" + checksum: 10c0/da966e5275ac50546e108af6bc29aaae2164d2ae96d60601b333c4a3aff91f50b6ca14929cf91f20a9cad1587b356323e300cea3ff6588a6a816988485f445f1 + languageName: node + linkType: hard + +"dns-packet@npm:^5.2.2": + version: 5.4.0 + resolution: "dns-packet@npm:5.4.0" + dependencies: + "@leichtgewicht/ip-codec": "npm:^2.0.1" + checksum: 10c0/bd5ecfd7d8b9cacd4d0029819699051c4e231d8fa6ed96e1573f7fee4b9147c3406207a260adbd7fb5c6d08a7db7641836467f450fa88e2ec5075f482e39ed77 + languageName: node + linkType: hard + +"docs@workspace:.": + version: 0.0.0-use.local + resolution: "docs@workspace:." + dependencies: + "@cmfcmf/docusaurus-search-local": "npm:1.1.0" + "@docusaurus/core": "npm:3.8.1" + "@docusaurus/module-type-aliases": "npm:3.8.1" + "@docusaurus/preset-classic": "npm:3.8.1" + "@docusaurus/theme-mermaid": "npm:3.8.1" + "@mdx-js/react": "npm:^3.0.0" + clsx: "npm:^1.1.1" + docusaurus-plugin-typedoc: "npm:0.22.0" + prism-react-renderer: "npm:^2.4.1" + react: "npm:18.3.0" + react-dom: "npm:18.3.0" + typedoc: "npm:0.25.9" + typedoc-plugin-markdown: "npm:3.17.1" + typescript: "npm:5.3.3" + languageName: unknown + linkType: soft + +"docusaurus-plugin-typedoc@npm:0.22.0": + version: 0.22.0 + resolution: "docusaurus-plugin-typedoc@npm:0.22.0" + peerDependencies: + typedoc: ">=0.24.0" + typedoc-plugin-markdown: ">=3.15.0" + checksum: 10c0/7710e7eb89a4669625218c1c41a1b2fb74564fce33995dfcb717ae4323826dfab3ec9cb440e3ee2e7a9d2c45c8fafec5fbfdfe2c77ea9cbb178e0f2212cba468 + languageName: node + linkType: hard + +"dom-converter@npm:^0.2.0": + version: 0.2.0 + resolution: "dom-converter@npm:0.2.0" + dependencies: + utila: "npm:~0.4" + checksum: 10c0/e96aa63bd8c6ee3cd9ce19c3aecfc2c42e50a460e8087114794d4f5ecf3a4f052b34ea3bf2d73b5d80b4da619073b49905e6d7d788ceb7814ca4c29be5354a11 + languageName: node + linkType: hard + +"dom-serializer@npm:^1.0.1": + version: 1.4.1 + resolution: "dom-serializer@npm:1.4.1" + dependencies: + domelementtype: "npm:^2.0.1" + domhandler: "npm:^4.2.0" + entities: "npm:^2.0.0" + checksum: 10c0/67d775fa1ea3de52035c98168ddcd59418356943b5eccb80e3c8b3da53adb8e37edb2cc2f885802b7b1765bf5022aec21dfc32910d7f9e6de4c3148f095ab5e0 + languageName: node + linkType: hard + +"dom-serializer@npm:^2.0.0": + version: 2.0.0 + resolution: "dom-serializer@npm:2.0.0" + dependencies: + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.2" + entities: "npm:^4.2.0" + checksum: 10c0/d5ae2b7110ca3746b3643d3ef60ef823f5f078667baf530cec096433f1627ec4b6fa8c072f09d079d7cda915fd2c7bc1b7b935681e9b09e591e1e15f4040b8e2 + languageName: node + linkType: hard + +"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0, domelementtype@npm:^2.3.0": + version: 2.3.0 + resolution: "domelementtype@npm:2.3.0" + checksum: 10c0/686f5a9ef0fff078c1412c05db73a0dce096190036f33e400a07e2a4518e9f56b1e324f5c576a0a747ef0e75b5d985c040b0d51945ce780c0dd3c625a18cd8c9 + languageName: node + linkType: hard + +"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0, domhandler@npm:^4.3.1": + version: 4.3.1 + resolution: "domhandler@npm:4.3.1" + dependencies: + domelementtype: "npm:^2.2.0" + checksum: 10c0/5c199c7468cb052a8b5ab80b13528f0db3d794c64fc050ba793b574e158e67c93f8336e87fd81e9d5ee43b0e04aea4d8b93ed7be4899cb726a1601b3ba18538b + languageName: node + linkType: hard + +"domhandler@npm:^5.0.1, domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": + version: 5.0.3 + resolution: "domhandler@npm:5.0.3" + dependencies: + domelementtype: "npm:^2.3.0" + checksum: 10c0/bba1e5932b3e196ad6862286d76adc89a0dbf0c773e5ced1eb01f9af930c50093a084eff14b8de5ea60b895c56a04d5de8bbc4930c5543d029091916770b2d2a + languageName: node + linkType: hard + +"dompurify@npm:^3.2.4": + version: 3.2.6 + resolution: "dompurify@npm:3.2.6" + dependencies: + "@types/trusted-types": "npm:^2.0.7" + dependenciesMeta: + "@types/trusted-types": + optional: true + checksum: 10c0/c8f8e5b0879a0d93c84a2e5e78649a47d0c057ed0f7850ca3d573d2cca64b84fb1ff85bd4b20980ade69c4e5b80ae73011340f1c2ff375c7ef98bb8268e1d13a + languageName: node + linkType: hard + +"domutils@npm:^2.5.2, domutils@npm:^2.8.0": + version: 2.8.0 + resolution: "domutils@npm:2.8.0" + dependencies: + dom-serializer: "npm:^1.0.1" + domelementtype: "npm:^2.2.0" + domhandler: "npm:^4.2.0" + checksum: 10c0/d58e2ae01922f0dd55894e61d18119924d88091837887bf1438f2327f32c65eb76426bd9384f81e7d6dcfb048e0f83c19b222ad7101176ad68cdc9c695b563db + languageName: node + linkType: hard + +"domutils@npm:^3.0.1": + version: 3.0.1 + resolution: "domutils@npm:3.0.1" + dependencies: + dom-serializer: "npm:^2.0.0" + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.1" + checksum: 10c0/8ec14e7e54f58cae0062fa9aaf97c05a094733ff6df8ede588c57d96799ceb45d1ea46479e8dd285f43af43b3e7618a501b2b41d2c2080078d5947b5fee2b5f9 + languageName: node + linkType: hard + +"dot-case@npm:^3.0.4": + version: 3.0.4 + resolution: "dot-case@npm:3.0.4" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/5b859ea65097a7ea870e2c91b5768b72ddf7fa947223fd29e167bcdff58fe731d941c48e47a38ec8aa8e43044c8fbd15cd8fa21689a526bc34b6548197cd5b05 + languageName: node + linkType: hard + +"dot-prop@npm:^6.0.1": + version: 6.0.1 + resolution: "dot-prop@npm:6.0.1" + dependencies: + is-obj: "npm:^2.0.0" + checksum: 10c0/30e51ec6408978a6951b21e7bc4938aad01a86f2fdf779efe52330205c6bb8a8ea12f35925c2029d6dc9d1df22f916f32f828ce1e9b259b1371c580541c22b5a + languageName: node + linkType: hard + +"duplexer@npm:^0.1.2": + version: 0.1.2 + resolution: "duplexer@npm:0.1.2" + checksum: 10c0/c57bcd4bdf7e623abab2df43a7b5b23d18152154529d166c1e0da6bee341d84c432d157d7e97b32fecb1bf3a8b8857dd85ed81a915789f550637ed25b8e64fc2 + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + +"ee-first@npm:1.1.1": + version: 1.1.1 + resolution: "ee-first@npm:1.1.1" + checksum: 10c0/b5bb125ee93161bc16bfe6e56c6b04de5ad2aa44234d8f644813cc95d861a6910903132b05093706de2b706599367c4130eb6d170f6b46895686b95f87d017b7 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.5.160": + version: 1.5.166 + resolution: "electron-to-chromium@npm:1.5.166" + checksum: 10c0/0244c09799f492035af63bb87857561aa034670a742cd80a78de5a88a0d536b0945fb078a636777d064d2451401c5d8302dfa8da7c996afe7476bf277b2dea63 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.5.4": + version: 1.5.27 + resolution: "electron-to-chromium@npm:1.5.27" + checksum: 10c0/4a057f469a01829884f2a51f3fc60af7e6a718b15009e4875df122fcdf13babea475ba029af1652a6875b4acfca730c48b13caac5d477d648e622699d3b662bf + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.5.73": + version: 1.5.113 + resolution: "electron-to-chromium@npm:1.5.113" + checksum: 10c0/837fe2fd26adbc4f3ad8e758d14067a14f636f9c2923b5ded8adb93426bbe3fdc83b48ddf9f2cf03be31b5becb0c31144db19c823b696fd52a7bc4583f4bde00 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + languageName: node + linkType: hard + +"emojilib@npm:^2.4.0": + version: 2.4.0 + resolution: "emojilib@npm:2.4.0" + checksum: 10c0/6e66ba8921175842193f974e18af448bb6adb0cf7aeea75e08b9d4ea8e9baba0e4a5347b46ed901491dcaba277485891c33a8d70b0560ca5cc9672a94c21ab8f + languageName: node + linkType: hard + +"emojis-list@npm:^3.0.0": + version: 3.0.0 + resolution: "emojis-list@npm:3.0.0" + checksum: 10c0/7dc4394b7b910444910ad64b812392159a21e1a7ecc637c775a440227dcb4f80eff7fe61f4453a7d7603fa23d23d30cc93fe9e4b5ed985b88d6441cd4a35117b + languageName: node + linkType: hard + +"emoticon@npm:^4.0.1": + version: 4.0.1 + resolution: "emoticon@npm:4.0.1" + checksum: 10c0/2f13c01e1f9892a6826e017d172a95b8e93c9f3dbf9e140e76163d981cb91ae4a848e49c0d4b6904121873541af07575793d222a6ecbdc491ebb3f9d123a4c73 + languageName: node + linkType: hard + +"encodeurl@npm:~1.0.2": + version: 1.0.2 + resolution: "encodeurl@npm:1.0.2" + checksum: 10c0/f6c2387379a9e7c1156c1c3d4f9cb7bb11cf16dd4c1682e1f6746512564b053df5781029b6061296832b59fb22f459dbe250386d217c2f6e203601abb2ee0bec + languageName: node + linkType: hard + +"encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + languageName: node + linkType: hard + +"enhanced-resolve@npm:^5.16.0": + version: 5.16.0 + resolution: "enhanced-resolve@npm:5.16.0" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10c0/dd69669cbb638ccacefd03e04d5e195ee6a99b7f5f8012f86d2df7781834de357923e06064ea621137c4ce0b37cc12b872b4e6d1ac6ab15fe98e7f1dfbbb08c4 + languageName: node + linkType: hard + +"enhanced-resolve@npm:^5.17.1": + version: 5.18.1 + resolution: "enhanced-resolve@npm:5.18.1" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10c0/4cffd9b125225184e2abed9fdf0ed3dbd2224c873b165d0838fd066cde32e0918626cba2f1f4bf6860762f13a7e2364fd89a82b99566be2873d813573ac71846 + languageName: node + linkType: hard + +"entities@npm:^2.0.0": + version: 2.2.0 + resolution: "entities@npm:2.2.0" + checksum: 10c0/7fba6af1f116300d2ba1c5673fc218af1961b20908638391b4e1e6d5850314ee2ac3ec22d741b3a8060479911c99305164aed19b6254bde75e7e6b1b2c3f3aa3 + languageName: node + linkType: hard + +"entities@npm:^4.2.0, entities@npm:^4.3.0, entities@npm:^4.4.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: "npm:^1.2.4" + checksum: 10c0/6bf3191feb7ea2ebda48b577f69bdfac7a2b3c9bcf97307f55fd6ef1bbca0b49f0c219a935aca506c993d8c5d8bddd937766cb760cd5e5a1071351f2df9f9aa4 + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 + languageName: node + linkType: hard + +"es-module-lexer@npm:^1.2.1": + version: 1.5.0 + resolution: "es-module-lexer@npm:1.5.0" + checksum: 10c0/d199853404f3381801eb102befb84a8fc48f93ed86b852c2461c2c4ad4bbbc91128f3d974ff9b8718628260ae3f36e661295ab3e419222868aa31269284e34c9 + languageName: node + linkType: hard + +"escalade@npm:^3.1.1, escalade@npm:^3.1.2, escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 + languageName: node + linkType: hard + +"escape-goat@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-goat@npm:4.0.0" + checksum: 10c0/9d2a8314e2370f2dd9436d177f6b3b1773525df8f895c8f3e1acb716f5fd6b10b336cb1cd9862d4709b36eb207dbe33664838deca9c6d55b8371be4eebb972f6 + languageName: node + linkType: hard + +"escape-html@npm:^1.0.3, escape-html@npm:~1.0.3": + version: 1.0.3 + resolution: "escape-html@npm:1.0.3" + checksum: 10c0/524c739d776b36c3d29fa08a22e03e8824e3b2fd57500e5e44ecf3cc4707c34c60f9ca0781c0e33d191f2991161504c295e98f68c78fe7baa6e57081ec6ac0a3 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^5.0.0": + version: 5.0.0 + resolution: "escape-string-regexp@npm:5.0.0" + checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 + languageName: node + linkType: hard + +"eslint-scope@npm:5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^4.1.1" + checksum: 10c0/d30ef9dc1c1cbdece34db1539a4933fe3f9b14e1ffb27ecc85987902ee663ad7c9473bbd49a9a03195a373741e62e2f807c4938992e019b511993d163450e70a + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: 10c0/9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d + languageName: node + linkType: hard + +"estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"estree-util-attach-comments@npm:^3.0.0": + version: 3.0.0 + resolution: "estree-util-attach-comments@npm:3.0.0" + dependencies: + "@types/estree": "npm:^1.0.0" + checksum: 10c0/ee69bb5c45e2ad074725b90ed181c1c934b29d81bce4b0c7761431e83c4c6ab1b223a6a3d6a4fbeb92128bc5d5ee201d5dd36cf1770aa5e16a40b0cf36e8a1f1 + languageName: node + linkType: hard + +"estree-util-build-jsx@npm:^3.0.0": + version: 3.0.1 + resolution: "estree-util-build-jsx@npm:3.0.1" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + devlop: "npm:^1.0.0" + estree-util-is-identifier-name: "npm:^3.0.0" + estree-walker: "npm:^3.0.0" + checksum: 10c0/274c119817b8e7caa14a9778f1e497fea56cdd2b01df1a1ed037f843178992d3afe85e0d364d485e1e2e239255763553d1b647b15e4a7ba50851bcb43dc6bf80 + languageName: node + linkType: hard + +"estree-util-is-identifier-name@npm:^3.0.0": + version: 3.0.0 + resolution: "estree-util-is-identifier-name@npm:3.0.0" + checksum: 10c0/d1881c6ed14bd588ebd508fc90bf2a541811dbb9ca04dec2f39d27dcaa635f85b5ed9bbbe7fc6fb1ddfca68744a5f7c70456b4b7108b6c4c52780631cc787c5b + languageName: node + linkType: hard + +"estree-util-to-js@npm:^2.0.0": + version: 2.0.0 + resolution: "estree-util-to-js@npm:2.0.0" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + astring: "npm:^1.8.0" + source-map: "npm:^0.7.0" + checksum: 10c0/ac88cb831401ef99e365f92f4af903755d56ae1ce0e0f0fb8ff66e678141f3d529194f0fb15f6c78cd7554c16fda36854df851d58f9e05cfab15bddf7a97cea0 + languageName: node + linkType: hard + +"estree-util-value-to-estree@npm:^3.0.1": + version: 3.4.0 + resolution: "estree-util-value-to-estree@npm:3.4.0" + dependencies: + "@types/estree": "npm:^1.0.0" + checksum: 10c0/e90e0c784b29182a3feb471589ab3c031be3ff1ab068b2b473e9ee96467f99442f2c571b2708ee3493906af5bf1a0aa9712d9f90fb113a30d99669100235ba4f + languageName: node + linkType: hard + +"estree-util-visit@npm:^2.0.0": + version: 2.0.0 + resolution: "estree-util-visit@npm:2.0.0" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + "@types/unist": "npm:^3.0.0" + checksum: 10c0/acda8b03cc8f890d79c7c7361f6c95331ba84b7ccc0c32b49f447fc30206b20002b37ffdfc97b6ad16e6fe065c63ecbae1622492e2b6b4775c15966606217f39 + languageName: node + linkType: hard + +"estree-walker@npm:^3.0.0": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": "npm:^1.0.0" + checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"eta@npm:^2.2.0": + version: 2.2.0 + resolution: "eta@npm:2.2.0" + checksum: 10c0/643b54d9539d2761bf6c5f4f48df1a5ea2d46c7f5a5fdc47a7d4802a8aa2b6262d4d61f724452e226c18cf82db02d48e65293fcc548f26a3f9d75a5ba7c3b859 + languageName: node + linkType: hard + +"etag@npm:~1.8.1": + version: 1.8.1 + resolution: "etag@npm:1.8.1" + checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 + languageName: node + linkType: hard + +"eval@npm:^0.1.8": + version: 0.1.8 + resolution: "eval@npm:0.1.8" + dependencies: + "@types/node": "npm:*" + require-like: "npm:>= 0.1.1" + checksum: 10c0/258e700bff09e3ce3344273d5b6691b8ec5b043538d84f738f14d8b0aded33d64c00c15b380de725b1401b15f428ab35a9e7ca19a7d25f162c4f877c71586be9 + languageName: node + linkType: hard + +"eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.4": + version: 4.0.7 + resolution: "eventemitter3@npm:4.0.7" + checksum: 10c0/5f6d97cbcbac47be798e6355e3a7639a84ee1f7d9b199a07017f1d2f1e2fe236004d14fa5dfaeba661f94ea57805385e326236a6debbc7145c8877fbc0297c6b + languageName: node + linkType: hard + +"events@npm:^3.2.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 + languageName: node + linkType: hard + +"execa@npm:5.1.1, execa@npm:^5.0.0": + version: 5.1.1 + resolution: "execa@npm:5.1.1" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^6.0.0" + human-signals: "npm:^2.1.0" + is-stream: "npm:^2.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^4.0.1" + onetime: "npm:^5.1.2" + signal-exit: "npm:^3.0.3" + strip-final-newline: "npm:^2.0.0" + checksum: 10c0/c8e615235e8de4c5addf2fa4c3da3e3aa59ce975a3e83533b4f6a71750fb816a2e79610dc5f1799b6e28976c9ae86747a36a606655bf8cb414a74d8d507b304f + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 + languageName: node + linkType: hard + +"express@npm:^4.17.3": + version: 4.21.1 + resolution: "express@npm:4.21.1" + dependencies: + accepts: "npm:~1.3.8" + array-flatten: "npm:1.1.1" + body-parser: "npm:1.20.3" + content-disposition: "npm:0.5.4" + content-type: "npm:~1.0.4" + cookie: "npm:0.7.1" + cookie-signature: "npm:1.0.6" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + finalhandler: "npm:1.3.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + merge-descriptors: "npm:1.0.3" + methods: "npm:~1.1.2" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + path-to-regexp: "npm:0.1.10" + proxy-addr: "npm:~2.0.7" + qs: "npm:6.13.0" + range-parser: "npm:~1.2.1" + safe-buffer: "npm:5.2.1" + send: "npm:0.19.0" + serve-static: "npm:1.16.2" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + type-is: "npm:~1.6.18" + utils-merge: "npm:1.0.1" + vary: "npm:~1.1.2" + checksum: 10c0/0c287867e5f6129d3def1edd9b63103a53c40d4dc8628839d4b6827e35eb8f0de5a4656f9d85f4457eba584f9871ebb2ad26c750b36bd75d9bbb8bcebdc4892c + languageName: node + linkType: hard + +"exsolve@npm:^1.0.1": + version: 1.0.2 + resolution: "exsolve@npm:1.0.2" + checksum: 10c0/1f9217c2096c2e5cf32b4326adc99caca272cd5ba7af35aaee22bdd11f8ebb64443f3288ab6034d3baa51ee51f30f92827db6946b4f51937925bd3eedb7eac50 + languageName: node + linkType: hard + +"extend-shallow@npm:^2.0.1": + version: 2.0.1 + resolution: "extend-shallow@npm:2.0.1" + dependencies: + is-extendable: "npm:^0.1.0" + checksum: 10c0/ee1cb0a18c9faddb42d791b2d64867bd6cfd0f3affb711782eb6e894dd193e2934a7f529426aac7c8ddb31ac5d38000a00aa2caf08aa3dfc3e1c8ff6ba340bd9 + languageName: node + linkType: hard + +"extend@npm:^3.0.0": + version: 3.0.2 + resolution: "extend@npm:3.0.2" + checksum: 10c0/73bf6e27406e80aa3e85b0d1c4fd987261e628064e170ca781125c0b635a3dabad5e05adbf07595ea0cf1e6c5396cacb214af933da7cbaf24fe75ff14818e8f9 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.9": + version: 3.2.11 + resolution: "fast-glob@npm:3.2.11" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.4" + checksum: 10c0/f726d4d6545ae9ade242eba78ae418cd8beac6c9291cdc36fc6b3b4e54f04fa0ecde5767256f2a600d6e14dc49a841adb3aa4b5f3f0c06b35dd4f3954965443d + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fast-uri@npm:^3.0.1": + version: 3.0.1 + resolution: "fast-uri@npm:3.0.1" + checksum: 10c0/3cd46d6006083b14ca61ffe9a05b8eef75ef87e9574b6f68f2e17ecf4daa7aaadeff44e3f0f7a0ef4e0f7e7c20fc07beec49ff14dc72d0b500f00386592f2d10 + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.13.0 + resolution: "fastq@npm:1.13.0" + dependencies: + reusify: "npm:^1.0.4" + checksum: 10c0/76c7b5dafb93c7e74359a3e6de834ce7a7c2e3a3184050ed4cb652661de55cf8d4895178d8d3ccd23069395056c7bb15450660d38fb382ca88c142b22694d7c9 + languageName: node + linkType: hard + +"fault@npm:^2.0.0": + version: 2.0.1 + resolution: "fault@npm:2.0.1" + dependencies: + format: "npm:^0.2.0" + checksum: 10c0/b80fbf1019b9ce8b08ee09ce86e02b028563e13a32ac3be34e42bfac00a97b96d8dee6d31e26578ffc16224eb6729e01ff1f97ddfeee00494f4f56c0aeed4bdd + languageName: node + linkType: hard + +"faye-websocket@npm:^0.11.3": + version: 0.11.4 + resolution: "faye-websocket@npm:0.11.4" + dependencies: + websocket-driver: "npm:>=0.5.1" + checksum: 10c0/c6052a0bb322778ce9f89af92890f6f4ce00d5ec92418a35e5f4c6864a4fe736fec0bcebd47eac7c0f0e979b01530746b1c85c83cb04bae789271abf19737420 + languageName: node + linkType: hard + +"feed@npm:^4.2.2": + version: 4.2.2 + resolution: "feed@npm:4.2.2" + dependencies: + xml-js: "npm:^1.6.11" + checksum: 10c0/c0849bde569da94493224525db00614fd1855a5d7c2e990f6e8637bd0298e85c3d329efe476cba77e711e438c3fb48af60cd5ef0c409da5bcd1f479790b0a372 + languageName: node + linkType: hard + +"figures@npm:^3.2.0": + version: 3.2.0 + resolution: "figures@npm:3.2.0" + dependencies: + escape-string-regexp: "npm:^1.0.5" + checksum: 10c0/9c421646ede432829a50bc4e55c7a4eb4bcb7cc07b5bab2f471ef1ab9a344595bbebb6c5c21470093fbb730cd81bbca119624c40473a125293f656f49cb47629 + languageName: node + linkType: hard + +"file-loader@npm:^6.2.0": + version: 6.2.0 + resolution: "file-loader@npm:6.2.0" + dependencies: + loader-utils: "npm:^2.0.0" + schema-utils: "npm:^3.0.0" + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: 10c0/e176a57c2037ab0f78e5755dbf293a6b7f0f8392350a120bd03cc2ce2525bea017458ba28fea14ca535ff1848055e86d1a3a216bdb2561ef33395b27260a1dd3 + languageName: node + linkType: hard + +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 + languageName: node + linkType: hard + +"finalhandler@npm:1.3.1": + version: 1.3.1 + resolution: "finalhandler@npm:1.3.1" + dependencies: + debug: "npm:2.6.9" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + statuses: "npm:2.0.1" + unpipe: "npm:~1.0.0" + checksum: 10c0/d38035831865a49b5610206a3a9a9aae4e8523cbbcd01175d0480ffbf1278c47f11d89be3ca7f617ae6d94f29cf797546a4619cd84dd109009ef33f12f69019f + languageName: node + linkType: hard + +"find-cache-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "find-cache-dir@npm:4.0.0" + dependencies: + common-path-prefix: "npm:^3.0.0" + pkg-dir: "npm:^7.0.0" + checksum: 10c0/0faa7956974726c8769671de696d24c643ca1e5b8f7a2401283caa9e07a5da093293e0a0f4bd18c920ec981d2ef945c7f5b946cde268dfc9077d833ad0293cff + languageName: node + linkType: hard + +"find-up@npm:^6.3.0": + version: 6.3.0 + resolution: "find-up@npm:6.3.0" + dependencies: + locate-path: "npm:^7.1.0" + path-exists: "npm:^5.0.0" + checksum: 10c0/07e0314362d316b2b13f7f11ea4692d5191e718ca3f7264110127520f3347996349bf9e16805abae3e196805814bc66ef4bff2b8904dc4a6476085fc9b0eba07 + languageName: node + linkType: hard + +"flat@npm:^5.0.2": + version: 5.0.2 + resolution: "flat@npm:5.0.2" + bin: + flat: cli.js + checksum: 10c0/f178b13482f0cd80c7fede05f4d10585b1f2fdebf26e12edc138e32d3150c6ea6482b7f12813a1091143bad52bb6d3596bca51a162257a21163c0ff438baa5fe + languageName: node + linkType: hard + +"follow-redirects@npm:^1.0.0": + version: 1.15.1 + resolution: "follow-redirects@npm:1.15.1" + peerDependenciesMeta: + debug: + optional: true + checksum: 10c0/ea21337fe38eac8d75f5af12c425cc40e0bb44dcc3091fd0bde1c828596251a7a9638b5720fee5a0a5c62524450cbe16c52aae1dce88c6aee68577e441842e7f + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.3.0 + resolution: "foreground-child@npm:3.3.0" + dependencies: + cross-spawn: "npm:^7.0.0" + signal-exit: "npm:^4.0.1" + checksum: 10c0/028f1d41000553fcfa6c4bb5c372963bf3d9bf0b1f25a87d1a6253014343fb69dfb1b42d9625d7cf44c8ba429940f3d0ff718b62105d4d4a4f6ef8ca0a53faa2 + languageName: node + linkType: hard + +"form-data-encoder@npm:^2.1.2": + version: 2.1.4 + resolution: "form-data-encoder@npm:2.1.4" + checksum: 10c0/4c06ae2b79ad693a59938dc49ebd020ecb58e4584860a90a230f80a68b026483b022ba5e4143cff06ae5ac8fd446a0b500fabc87bbac3d1f62f2757f8dabcaf7 + languageName: node + linkType: hard + +"format@npm:^0.2.0": + version: 0.2.2 + resolution: "format@npm:0.2.2" + checksum: 10c0/6032ba747541a43abf3e37b402b2f72ee08ebcb58bf84d816443dd228959837f1cddf1e8775b29fa27ff133f4bd146d041bfca5f9cf27f048edf3d493cf8fee6 + languageName: node + linkType: hard + +"forwarded@npm:0.2.0": + version: 0.2.0 + resolution: "forwarded@npm:0.2.0" + checksum: 10c0/9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33 + languageName: node + linkType: hard + +"fraction.js@npm:^4.3.7": + version: 4.3.7 + resolution: "fraction.js@npm:4.3.7" + checksum: 10c0/df291391beea9ab4c263487ffd9d17fed162dbb736982dee1379b2a8cc94e4e24e46ed508c6d278aded9080ba51872f1bc5f3a5fd8d7c74e5f105b508ac28711 + languageName: node + linkType: hard + +"fresh@npm:0.5.2": + version: 0.5.2 + resolution: "fresh@npm:0.5.2" + checksum: 10c0/c6d27f3ed86cc5b601404822f31c900dd165ba63fff8152a3ef714e2012e7535027063bc67ded4cb5b3a49fa596495d46cacd9f47d6328459cf570f08b7d9e5a + languageName: node + linkType: hard + +"fs-extra@npm:^11.1.1, fs-extra@npm:^11.2.0": + version: 11.2.0 + resolution: "fs-extra@npm:11.2.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10c0/d77a9a9efe60532d2e790e938c81a02c1b24904ef7a3efb3990b835514465ba720e99a6ea56fd5e2db53b4695319b644d76d5a0e9988a2beef80aa7b1da63398 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + languageName: node + linkType: hard + +"fs-monkey@npm:^1.0.3": + version: 1.0.3 + resolution: "fs-monkey@npm:1.0.3" + checksum: 10c0/197fd276d224d54a27c6267c69887ec29ccd4bedd83d72b5050abf3b6c6ef83d7b86a85a87f615c24a4e6f9a4888fd151c9f16a37ffb23e37c4c2d14c1da6275 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + +"fsevents@npm:~2.3.2": + version: 2.3.2 + resolution: "fsevents@npm:2.3.2" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/be78a3efa3e181cda3cf7a4637cb527bcebb0bd0ea0440105a3bb45b86f9245b307dc10a2507e8f4498a7d4ec349d1910f4d73e4d4495b16103106e07eee735b + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": + version: 2.3.2 + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin::version=2.3.2&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.1, function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.0" + checksum: 10c0/0a9b82c16696ed6da5e39b1267104475c47e3a9bdbe8b509dfe1710946e38a87be70d759f4bb3cda042d76a41ef47fe769660f3b7c0d1f68750299344ffb15b7 + languageName: node + linkType: hard + +"get-own-enumerable-property-symbols@npm:^3.0.0": + version: 3.0.2 + resolution: "get-own-enumerable-property-symbols@npm:3.0.2" + checksum: 10c0/103999855f3d1718c631472437161d76962cbddcd95cc642a34c07bfb661ed41b6c09a9c669ccdff89ee965beb7126b80eec7b2101e20e31e9cc6c4725305e10 + languageName: node + linkType: hard + +"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: 10c0/49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 + languageName: node + linkType: hard + +"github-slugger@npm:^1.5.0": + version: 1.5.0 + resolution: "github-slugger@npm:1.5.0" + checksum: 10c0/116f99732925f939cbfd6f2e57db1aa7e111a460db0d103e3b3f2fce6909d44311663d4542350706cad806345b9892358cc3b153674f88eeae77f43380b3bfca + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.1": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 + languageName: node + linkType: hard + +"glob-to-regexp@npm:^0.4.1": + version: 0.4.1 + resolution: "glob-to-regexp@npm:0.4.1" + checksum: 10c0/0486925072d7a916f052842772b61c3e86247f0a80cc0deb9b5a3e8a1a9faad5b04fb6f58986a09f34d3e96cd2a22a24b7e9882fb1cf904c31e9a310de96c429 + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7": + version: 10.4.5 + resolution: "glob@npm:10.4.5" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^1.11.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e + languageName: node + linkType: hard + +"glob@npm:^7.1.3": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + languageName: node + linkType: hard + +"global-dirs@npm:^3.0.0": + version: 3.0.0 + resolution: "global-dirs@npm:3.0.0" + dependencies: + ini: "npm:2.0.0" + checksum: 10c0/2b3c05967873662204dfe7159cfef20019e898b5ebe2ac70fc155e4cbe2207732f4b72d4ea1e72f10e91cee139d237ab4d39f1e282751093e7fe83c53abba46f + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 + languageName: node + linkType: hard + +"globals@npm:^15.14.0": + version: 15.15.0 + resolution: "globals@npm:15.15.0" + checksum: 10c0/f9ae80996392ca71316495a39bec88ac43ae3525a438b5626cd9d5ce9d5500d0a98a266409605f8cd7241c7acf57c354a48111ea02a767ba4f374b806d6861fe + languageName: node + linkType: hard + +"globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + dependencies: + array-union: "npm:^2.1.0" + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.2.9" + ignore: "npm:^5.2.0" + merge2: "npm:^1.4.1" + slash: "npm:^3.0.0" + checksum: 10c0/b39511b4afe4bd8a7aead3a27c4ade2b9968649abab0a6c28b1a90141b96ca68ca5db1302f7c7bd29eab66bf51e13916b8e0a3d0ac08f75e1e84a39b35691189 + languageName: node + linkType: hard + +"globby@npm:^13.1.1": + version: 13.1.2 + resolution: "globby@npm:13.1.2" + dependencies: + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.2.11" + ignore: "npm:^5.2.0" + merge2: "npm:^1.4.1" + slash: "npm:^4.0.0" + checksum: 10c0/3366575f4de8862558bfd931cae2c7ed5192f8ce9488e4c65da5aadedcadae36f7625bd85ada77aad3ba93ca0627b424e53f07172f7d12e67eec419694357d33 + languageName: node + linkType: hard + +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.1.3" + checksum: 10c0/505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 + languageName: node + linkType: hard + +"got@npm:^12.1.0": + version: 12.6.1 + resolution: "got@npm:12.6.1" + dependencies: + "@sindresorhus/is": "npm:^5.2.0" + "@szmarczak/http-timer": "npm:^5.0.1" + cacheable-lookup: "npm:^7.0.0" + cacheable-request: "npm:^10.2.8" + decompress-response: "npm:^6.0.0" + form-data-encoder: "npm:^2.1.2" + get-stream: "npm:^6.0.1" + http2-wrapper: "npm:^2.1.10" + lowercase-keys: "npm:^3.0.0" + p-cancelable: "npm:^3.0.0" + responselike: "npm:^3.0.0" + checksum: 10c0/2fe97fcbd7a9ffc7c2d0ecf59aca0a0562e73a7749cadada9770eeb18efbdca3086262625fb65590594edc220a1eca58fab0d26b0c93c2f9a008234da71ca66b + languageName: node + linkType: hard + +"graceful-fs@npm:4.2.10": + version: 4.2.10 + resolution: "graceful-fs@npm:4.2.10" + checksum: 10c0/4223a833e38e1d0d2aea630c2433cfb94ddc07dfc11d511dbd6be1d16688c5be848acc31f9a5d0d0ddbfb56d2ee5a6ae0278aceeb0ca6a13f27e06b9956fb952 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"gray-matter@npm:^4.0.3": + version: 4.0.3 + resolution: "gray-matter@npm:4.0.3" + dependencies: + js-yaml: "npm:^3.13.1" + kind-of: "npm:^6.0.2" + section-matter: "npm:^1.0.0" + strip-bom-string: "npm:^1.0.0" + checksum: 10c0/e38489906dad4f162ca01e0dcbdbed96d1a53740cef446b9bf76d80bec66fa799af07776a18077aee642346c5e1365ed95e4c91854a12bf40ba0d4fb43a625a6 + languageName: node + linkType: hard + +"gzip-size@npm:^6.0.0": + version: 6.0.0 + resolution: "gzip-size@npm:6.0.0" + dependencies: + duplexer: "npm:^0.1.2" + checksum: 10c0/4ccb924626c82125897a997d1c84f2377846a6ef57fbee38f7c0e6b41387fba4d00422274440747b58008b5d60114bac2349c2908e9aba55188345281af40a3f + languageName: node + linkType: hard + +"hachure-fill@npm:^0.5.2": + version: 0.5.2 + resolution: "hachure-fill@npm:0.5.2" + checksum: 10c0/307e3b6f9f2d3c11a82099c3f71eecbb9c440c00c1f896ac1732c23e6dbff16a92bb893d222b8b721b89cf11e58649ca60b4c24e5663f705f877cefd40153429 + languageName: node + linkType: hard + +"handle-thing@npm:^2.0.0": + version: 2.0.1 + resolution: "handle-thing@npm:2.0.1" + checksum: 10c0/7ae34ba286a3434f1993ebd1cc9c9e6b6d8ea672182db28b1afc0a7119229552fa7031e3e5f3cd32a76430ece4e94b7da6f12af2eb39d6239a7693e4bd63a998 + languageName: node + linkType: hard + +"handlebars@npm:^4.7.7": + version: 4.7.8 + resolution: "handlebars@npm:4.7.8" + dependencies: + minimist: "npm:^1.2.5" + neo-async: "npm:^2.6.2" + source-map: "npm:^0.6.1" + uglify-js: "npm:^3.1.4" + wordwrap: "npm:^1.0.0" + dependenciesMeta: + uglify-js: + optional: true + bin: + handlebars: bin/handlebars + checksum: 10c0/7aff423ea38a14bb379316f3857fe0df3c5d66119270944247f155ba1f08e07a92b340c58edaa00cfe985c21508870ee5183e0634dcb53dd405f35c93ef7f10d + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: "npm:^1.0.0" + checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 + languageName: node + linkType: hard + +"has-proto@npm:^1.0.1": + version: 1.0.3 + resolution: "has-proto@npm:1.0.3" + checksum: 10c0/35a6989f81e9f8022c2f4027f8b48a552de714938765d019dbea6bb547bd49ce5010a3c7c32ec6ddac6e48fc546166a3583b128f5a7add8b058a6d8b4afec205 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: 10c0/e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 + languageName: node + linkType: hard + +"has-yarn@npm:^3.0.0": + version: 3.0.0 + resolution: "has-yarn@npm:3.0.0" + checksum: 10c0/38c76618cb764e4a98ea114a3938e0bed6ceafb6bacab2ffb32e7c7d1e18b5e09cd03387d507ee87072388e1f20b1f80947fee62c41fc450edfbbdc02a665787 + languageName: node + linkType: hard + +"has@npm:^1.0.3": + version: 1.0.3 + resolution: "has@npm:1.0.3" + dependencies: + function-bind: "npm:^1.1.1" + checksum: 10c0/e1da0d2bd109f116b632f27782cf23182b42f14972ca9540e4c5aa7e52647407a0a4a76937334fddcb56befe94a3494825ec22b19b51f5e5507c3153fd1a5e1b + languageName: node + linkType: hard + +"hasown@npm:^2.0.0": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 + languageName: node + linkType: hard + +"hast-util-from-parse5@npm:^8.0.0": + version: 8.0.1 + resolution: "hast-util-from-parse5@npm:8.0.1" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/unist": "npm:^3.0.0" + devlop: "npm:^1.0.0" + hastscript: "npm:^8.0.0" + property-information: "npm:^6.0.0" + vfile: "npm:^6.0.0" + vfile-location: "npm:^5.0.0" + web-namespaces: "npm:^2.0.0" + checksum: 10c0/4a30bb885cff1f0e023c429ae3ece73fe4b03386f07234bf23f5555ca087c2573ff4e551035b417ed7615bde559f394cdaf1db2b91c3b7f0575f3563cd238969 + languageName: node + linkType: hard + +"hast-util-parse-selector@npm:^4.0.0": + version: 4.0.0 + resolution: "hast-util-parse-selector@npm:4.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + checksum: 10c0/5e98168cb44470dc274aabf1a28317e4feb09b1eaf7a48bbaa8c1de1b43a89cd195cb1284e535698e658e3ec26ad91bc5e52c9563c36feb75abbc68aaf68fb9f + languageName: node + linkType: hard + +"hast-util-raw@npm:^9.0.0": + version: 9.0.2 + resolution: "hast-util-raw@npm:9.0.2" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/unist": "npm:^3.0.0" + "@ungap/structured-clone": "npm:^1.0.0" + hast-util-from-parse5: "npm:^8.0.0" + hast-util-to-parse5: "npm:^8.0.0" + html-void-elements: "npm:^3.0.0" + mdast-util-to-hast: "npm:^13.0.0" + parse5: "npm:^7.0.0" + unist-util-position: "npm:^5.0.0" + unist-util-visit: "npm:^5.0.0" + vfile: "npm:^6.0.0" + web-namespaces: "npm:^2.0.0" + zwitch: "npm:^2.0.0" + checksum: 10c0/0162c104c3fdf8b749b2d271d36b48f609c2cb3bc30cb21feb087ac67bdf806988c8cd14c2e2c71ff982b0a7525b0b1ffd09476f9d79b517337d78ada8042b0c + languageName: node + linkType: hard + +"hast-util-to-estree@npm:^3.0.0": + version: 3.1.0 + resolution: "hast-util-to-estree@npm:3.1.0" + dependencies: + "@types/estree": "npm:^1.0.0" + "@types/estree-jsx": "npm:^1.0.0" + "@types/hast": "npm:^3.0.0" + comma-separated-tokens: "npm:^2.0.0" + devlop: "npm:^1.0.0" + estree-util-attach-comments: "npm:^3.0.0" + estree-util-is-identifier-name: "npm:^3.0.0" + hast-util-whitespace: "npm:^3.0.0" + mdast-util-mdx-expression: "npm:^2.0.0" + mdast-util-mdx-jsx: "npm:^3.0.0" + mdast-util-mdxjs-esm: "npm:^2.0.0" + property-information: "npm:^6.0.0" + space-separated-tokens: "npm:^2.0.0" + style-to-object: "npm:^0.4.0" + unist-util-position: "npm:^5.0.0" + zwitch: "npm:^2.0.0" + checksum: 10c0/9003a8bac26a4580d5fc9f2a271d17330dd653266425e9f5539feecd2f7538868d6630a18f70698b8b804bf14c306418a3f4ab3119bb4692aca78b0c08b1291e + languageName: node + linkType: hard + +"hast-util-to-jsx-runtime@npm:^2.0.0": + version: 2.3.0 + resolution: "hast-util-to-jsx-runtime@npm:2.3.0" + dependencies: + "@types/estree": "npm:^1.0.0" + "@types/hast": "npm:^3.0.0" + "@types/unist": "npm:^3.0.0" + comma-separated-tokens: "npm:^2.0.0" + devlop: "npm:^1.0.0" + estree-util-is-identifier-name: "npm:^3.0.0" + hast-util-whitespace: "npm:^3.0.0" + mdast-util-mdx-expression: "npm:^2.0.0" + mdast-util-mdx-jsx: "npm:^3.0.0" + mdast-util-mdxjs-esm: "npm:^2.0.0" + property-information: "npm:^6.0.0" + space-separated-tokens: "npm:^2.0.0" + style-to-object: "npm:^1.0.0" + unist-util-position: "npm:^5.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10c0/df7a36dcc792df7667a54438f044b721753d5e09692606d23bf7336bf4651670111fe7728eebbf9f0e4f96ab3346a05bb23037fa1b1d115482b3bc5bde8b6912 + languageName: node + linkType: hard + +"hast-util-to-parse5@npm:^8.0.0": + version: 8.0.0 + resolution: "hast-util-to-parse5@npm:8.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + comma-separated-tokens: "npm:^2.0.0" + devlop: "npm:^1.0.0" + property-information: "npm:^6.0.0" + space-separated-tokens: "npm:^2.0.0" + web-namespaces: "npm:^2.0.0" + zwitch: "npm:^2.0.0" + checksum: 10c0/3c0c7fba026e0c4be4675daf7277f9ff22ae6da801435f1b7104f7740de5422576f1c025023c7b3df1d0a161e13a04c6ab8f98ada96eb50adb287b537849a2bd + languageName: node + linkType: hard + +"hast-util-whitespace@npm:^3.0.0": + version: 3.0.0 + resolution: "hast-util-whitespace@npm:3.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + checksum: 10c0/b898bc9fe27884b272580d15260b6bbdabe239973a147e97fa98c45fa0ffec967a481aaa42291ec34fb56530dc2d484d473d7e2bae79f39c83f3762307edfea8 + languageName: node + linkType: hard + +"hastscript@npm:^8.0.0": + version: 8.0.0 + resolution: "hastscript@npm:8.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + comma-separated-tokens: "npm:^2.0.0" + hast-util-parse-selector: "npm:^4.0.0" + property-information: "npm:^6.0.0" + space-separated-tokens: "npm:^2.0.0" + checksum: 10c0/f0b54bbdd710854b71c0f044612db0fe1b5e4d74fa2001633dc8c535c26033269f04f536f9fd5b03f234de1111808f9e230e9d19493bf919432bb24d541719e0 + languageName: node + linkType: hard + +"he@npm:^1.2.0": + version: 1.2.0 + resolution: "he@npm:1.2.0" + bin: + he: bin/he + checksum: 10c0/a27d478befe3c8192f006cdd0639a66798979dfa6e2125c6ac582a19a5ebfec62ad83e8382e6036170d873f46e4536a7e795bf8b95bf7c247f4cc0825ccc8c17 + languageName: node + linkType: hard + +"history@npm:^4.9.0": + version: 4.10.1 + resolution: "history@npm:4.10.1" + dependencies: + "@babel/runtime": "npm:^7.1.2" + loose-envify: "npm:^1.2.0" + resolve-pathname: "npm:^3.0.0" + tiny-invariant: "npm:^1.0.2" + tiny-warning: "npm:^1.0.0" + value-equal: "npm:^1.0.1" + checksum: 10c0/35377694e4f10f2cf056a9cb1a8ee083e04e4b4717a63baeee4afd565658a62c7e73700bf9e82aa53dbe1ec94e0a25a83c080d63bad8ee6b274a98d2fbc5ed4c + languageName: node + linkType: hard + +"hoist-non-react-statics@npm:^3.1.0": + version: 3.3.2 + resolution: "hoist-non-react-statics@npm:3.3.2" + dependencies: + react-is: "npm:^16.7.0" + checksum: 10c0/fe0889169e845d738b59b64badf5e55fa3cf20454f9203d1eb088df322d49d4318df774828e789898dcb280e8a5521bb59b3203385662ca5e9218a6ca5820e74 + languageName: node + linkType: hard + +"hpack.js@npm:^2.1.6": + version: 2.1.6 + resolution: "hpack.js@npm:2.1.6" + dependencies: + inherits: "npm:^2.0.1" + obuf: "npm:^1.0.0" + readable-stream: "npm:^2.0.1" + wbuf: "npm:^1.1.0" + checksum: 10c0/55b9e824430bab82a19d079cb6e33042d7d0640325678c9917fcc020c61d8a08ca671b6c942c7f0aae9bb6e4b67ffb50734a72f9e21d66407c3138c1983b70f0 + languageName: node + linkType: hard + +"htm@npm:^3.1.1": + version: 3.1.1 + resolution: "htm@npm:3.1.1" + checksum: 10c0/0de4c8fff2b8e76c162235ae80dbf93ca5eef1575bd50596a06ce9bebf1a6da5efc467417c53034a9ffa2ab9ecff819cbec041dc9087894b2b900ad4de26c7e7 + languageName: node + linkType: hard + +"html-entities@npm:^2.3.2": + version: 2.3.3 + resolution: "html-entities@npm:2.3.3" + checksum: 10c0/a76cbdbb276d9499dc7ef800d23f3964254e659f04db51c8d1ff6abfe21992c69b7217ecfd6e3c16ff0aa027ba4261d77f0dba71f55639c16a325bbdf69c535d + languageName: node + linkType: hard + +"html-escaper@npm:^2.0.2": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: 10c0/208e8a12de1a6569edbb14544f4567e6ce8ecc30b9394fcaa4e7bb1e60c12a7c9a1ed27e31290817157e8626f3a4f29e76c8747030822eb84a6abb15c255f0a0 + languageName: node + linkType: hard + +"html-minifier-terser@npm:^6.0.2": + version: 6.1.0 + resolution: "html-minifier-terser@npm:6.1.0" + dependencies: + camel-case: "npm:^4.1.2" + clean-css: "npm:^5.2.2" + commander: "npm:^8.3.0" + he: "npm:^1.2.0" + param-case: "npm:^3.0.4" + relateurl: "npm:^0.2.7" + terser: "npm:^5.10.0" + bin: + html-minifier-terser: cli.js + checksum: 10c0/1aa4e4f01cf7149e3ac5ea84fb7a1adab86da40d38d77a6fff42852b5ee3daccb78b615df97264e3a6a5c33e57f0c77f471d607ca1e1debd1dab9b58286f4b5a + languageName: node + linkType: hard + +"html-minifier-terser@npm:^7.2.0": + version: 7.2.0 + resolution: "html-minifier-terser@npm:7.2.0" + dependencies: + camel-case: "npm:^4.1.2" + clean-css: "npm:~5.3.2" + commander: "npm:^10.0.0" + entities: "npm:^4.4.0" + param-case: "npm:^3.0.4" + relateurl: "npm:^0.2.7" + terser: "npm:^5.15.1" + bin: + html-minifier-terser: cli.js + checksum: 10c0/ffc97c17299d9ec30e17269781b816ea2fc411a9206fc9e768be8f2decb1ea1470892809babb23bb4e3ab1f64d606d97e1803bf526ae3af71edc0fd3070b94b9 + languageName: node + linkType: hard + +"html-tags@npm:^3.3.1": + version: 3.3.1 + resolution: "html-tags@npm:3.3.1" + checksum: 10c0/680165e12baa51bad7397452d247dbcc5a5c29dac0e6754b1187eee3bf26f514bc1907a431dd2f7eb56207611ae595ee76a0acc8eaa0d931e72c791dd6463d79 + languageName: node + linkType: hard + +"html-void-elements@npm:^3.0.0": + version: 3.0.0 + resolution: "html-void-elements@npm:3.0.0" + checksum: 10c0/a8b9ec5db23b7c8053876dad73a0336183e6162bf6d2677376d8b38d654fdc59ba74fdd12f8812688f7db6fad451210c91b300e472afc0909224e0a44c8610d2 + languageName: node + linkType: hard + +"html-webpack-plugin@npm:^5.6.0": + version: 5.6.3 + resolution: "html-webpack-plugin@npm:5.6.3" + dependencies: + "@types/html-minifier-terser": "npm:^6.0.0" + html-minifier-terser: "npm:^6.0.2" + lodash: "npm:^4.17.21" + pretty-error: "npm:^4.0.0" + tapable: "npm:^2.0.0" + peerDependencies: + "@rspack/core": 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10c0/25a21f83a8823d3711396dd8050bc0080c0ae55537352d432903eff58a7d9838fc811e3c26462419036190720357e67c7977efd106fb9a252770632824f0cc25 + languageName: node + linkType: hard + +"htmlparser2@npm:^6.1.0": + version: 6.1.0 + resolution: "htmlparser2@npm:6.1.0" + dependencies: + domelementtype: "npm:^2.0.1" + domhandler: "npm:^4.0.0" + domutils: "npm:^2.5.2" + entities: "npm:^2.0.0" + checksum: 10c0/3058499c95634f04dc66be8c2e0927cd86799413b2d6989d8ae542ca4dbf5fa948695d02c27d573acf44843af977aec6d9a7bdd0f6faa6b2d99e2a729b2a31b6 + languageName: node + linkType: hard + +"htmlparser2@npm:^8.0.1": + version: 8.0.1 + resolution: "htmlparser2@npm:8.0.1" + dependencies: + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.2" + domutils: "npm:^3.0.1" + entities: "npm:^4.3.0" + checksum: 10c0/33942dc6d882f37132fe8e39d5fd860d5abcf52ca769b3742c1b35caae1225db9cfa4486f27ed983db5b6d478944008a515e6ee3a09cfe8fa84af412960e4ca1 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc + languageName: node + linkType: hard + +"http-deceiver@npm:^1.2.7": + version: 1.2.7 + resolution: "http-deceiver@npm:1.2.7" + checksum: 10c0/8bb9b716f5fc55f54a451da7f49b9c695c3e45498a789634daec26b61e4add7c85613a4a9e53726c39d09de7a163891ecd6eb5809adb64500a840fd86fe81d03 + languageName: node + linkType: hard + +"http-errors@npm:2.0.0": + version: 2.0.0 + resolution: "http-errors@npm:2.0.0" + dependencies: + depd: "npm:2.0.0" + inherits: "npm:2.0.4" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + toidentifier: "npm:1.0.1" + checksum: 10c0/fc6f2715fe188d091274b5ffc8b3657bd85c63e969daa68ccb77afb05b071a4b62841acb7a21e417b5539014dff2ebf9550f0b14a9ff126f2734a7c1387f8e19 + languageName: node + linkType: hard + +"http-errors@npm:~1.6.2": + version: 1.6.3 + resolution: "http-errors@npm:1.6.3" + dependencies: + depd: "npm:~1.1.2" + inherits: "npm:2.0.3" + setprototypeof: "npm:1.1.0" + statuses: "npm:>= 1.4.0 < 2" + checksum: 10c0/17ec4046ee974477778bfdd525936c254b872054703ec2caa4d6f099566b8adade636ae6aeeacb39302c5cd6e28fb407ebd937f500f5010d0b6850750414ff78 + languageName: node + linkType: hard + +"http-parser-js@npm:>=0.5.1": + version: 0.5.8 + resolution: "http-parser-js@npm:0.5.8" + checksum: 10c0/4ed89f812c44f84c4ae5d43dd3a0c47942b875b63be0ed2ccecbe6b0018af867d806495fc6e12474aff868721163699c49246585bddea4f0ecc6d2b02e19faf1 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 + languageName: node + linkType: hard + +"http-proxy-middleware@npm:^2.0.3": + version: 2.0.9 + resolution: "http-proxy-middleware@npm:2.0.9" + dependencies: + "@types/http-proxy": "npm:^1.17.8" + http-proxy: "npm:^1.18.1" + is-glob: "npm:^4.0.1" + is-plain-obj: "npm:^3.0.0" + micromatch: "npm:^4.0.2" + peerDependencies: + "@types/express": ^4.17.13 + peerDependenciesMeta: + "@types/express": + optional: true + checksum: 10c0/8e9032af625f7c9f2f0d318f6cdb14eb725cc16ffe7b4ccccea25cf591fa819bb7c3bb579e0b543e0ae9c73059b505a6d728290c757bff27bae526a6ed11c05e + languageName: node + linkType: hard + +"http-proxy@npm:^1.18.1": + version: 1.18.1 + resolution: "http-proxy@npm:1.18.1" + dependencies: + eventemitter3: "npm:^4.0.0" + follow-redirects: "npm:^1.0.0" + requires-port: "npm:^1.0.0" + checksum: 10c0/148dfa700a03fb421e383aaaf88ac1d94521dfc34072f6c59770528c65250983c2e4ec996f2f03aa9f3fe46cd1270a593126068319311e3e8d9e610a37533e94 + languageName: node + linkType: hard + +"http2-wrapper@npm:^2.1.10": + version: 2.2.1 + resolution: "http2-wrapper@npm:2.2.1" + dependencies: + quick-lru: "npm:^5.1.1" + resolve-alpn: "npm:^1.2.0" + checksum: 10c0/7207201d3c6e53e72e510c9b8912e4f3e468d3ecc0cf3bf52682f2aac9cd99358b896d1da4467380adc151cf97c412bedc59dc13dae90c523f42053a7449eedb + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:4" + checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac + languageName: node + linkType: hard + +"human-signals@npm:^2.1.0": + version: 2.1.0 + resolution: "human-signals@npm:2.1.0" + checksum: 10c0/695edb3edfcfe9c8b52a76926cd31b36978782062c0ed9b1192b36bebc75c4c87c82e178dfcb0ed0fc27ca59d434198aac0bd0be18f5781ded775604db22304a + languageName: node + linkType: hard + +"iconv-lite@npm:0.4.24": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3" + checksum: 10c0/c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 + languageName: node + linkType: hard + +"iconv-lite@npm:0.6, iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"icss-utils@npm:^5.0.0, icss-utils@npm:^5.1.0": + version: 5.1.0 + resolution: "icss-utils@npm:5.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/39c92936fabd23169c8611d2b5cc39e39d10b19b0d223352f20a7579f75b39d5f786114a6b8fc62bee8c5fed59ba9e0d38f7219a4db383e324fb3061664b043d + languageName: node + linkType: hard + +"ignore@npm:^5.2.0": + version: 5.2.0 + resolution: "ignore@npm:5.2.0" + checksum: 10c0/7fb7b4c4c52c2555113ff968f8a83b8ac21b076282bfcb3f468c3fb429be69bd56222306c31de95dd452c647fc6ae24339b8047ebe3ef34c02591abfec58da01 + languageName: node + linkType: hard + +"image-size@npm:^2.0.2": + version: 2.0.2 + resolution: "image-size@npm:2.0.2" + bin: + image-size: bin/image-size.js + checksum: 10c0/f09dd0f7cf8511cd20e4f756bdb5a7cb6d2240de3323f41bde266bed8373392a293892bf12e907e2995f52833fd88dd27cf6b1a52ab93968afc716cb78cd7b79 + languageName: node + linkType: hard + +"import-fresh@npm:^3.3.0": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 10c0/7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 + languageName: node + linkType: hard + +"import-lazy@npm:^4.0.0": + version: 4.0.0 + resolution: "import-lazy@npm:4.0.0" + checksum: 10c0/a3520313e2c31f25c0b06aa66d167f329832b68a4f957d7c9daf6e0fa41822b6e84948191648b9b9d8ca82f94740cdf15eecf2401a5b42cd1c33fd84f2225cca + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f + languageName: node + linkType: hard + +"infima@npm:0.2.0-alpha.45": + version: 0.2.0-alpha.45 + resolution: "infima@npm:0.2.0-alpha.45" + checksum: 10c0/b50d103f6864687742067414d09392ccf3be363cf27503925a943ff56bb2392118e2bfdb6b2f89933417015e1770e58f81b2b0caf823f2adfb67f32b1702d469 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.3": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"inherits@npm:2.0.3": + version: 2.0.3 + resolution: "inherits@npm:2.0.3" + checksum: 10c0/6e56402373149ea076a434072671f9982f5fad030c7662be0332122fe6c0fa490acb3cc1010d90b6eff8d640b1167d77674add52dfd1bb85d545cf29e80e73e7 + languageName: node + linkType: hard + +"ini@npm:2.0.0": + version: 2.0.0 + resolution: "ini@npm:2.0.0" + checksum: 10c0/2e0c8f386369139029da87819438b20a1ff3fe58372d93fb1a86e9d9344125ace3a806b8ec4eb160a46e64cbc422fe68251869441676af49b7fc441af2389c25 + languageName: node + linkType: hard + +"ini@npm:^1.3.4, ini@npm:~1.3.0": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a + languageName: node + linkType: hard + +"inline-style-parser@npm:0.1.1": + version: 0.1.1 + resolution: "inline-style-parser@npm:0.1.1" + checksum: 10c0/08832a533f51a1e17619f2eabf2f5ec5e956d6dcba1896351285c65df022c9420de61d73256e1dca8015a52abf96cc84ddc3b73b898b22de6589d3962b5e501b + languageName: node + linkType: hard + +"inline-style-parser@npm:0.2.3": + version: 0.2.3 + resolution: "inline-style-parser@npm:0.2.3" + checksum: 10c0/21b46d39a39c8aeaa738346650469388e8a412dd276ab75aa3d85b1883311e89c86a1fdbb8c2f1958f4c979bae74067f6ba0385455b125faf4fa77e1dbb94799 + languageName: node + linkType: hard + +"internmap@npm:1 - 2": + version: 2.0.3 + resolution: "internmap@npm:2.0.3" + checksum: 10c0/8cedd57f07bbc22501516fbfc70447f0c6812871d471096fad9ea603516eacc2137b633633daf432c029712df0baefd793686388ddf5737e3ea15074b877f7ed + languageName: node + linkType: hard + +"internmap@npm:^1.0.0": + version: 1.0.1 + resolution: "internmap@npm:1.0.1" + checksum: 10c0/60942be815ca19da643b6d4f23bd0bf4e8c97abbd080fb963fe67583b60bdfb3530448ad4486bae40810e92317bded9995cc31411218acc750d72cd4e8646eee + languageName: node + linkType: hard + +"invariant@npm:^2.2.4": + version: 2.2.4 + resolution: "invariant@npm:2.2.4" + dependencies: + loose-envify: "npm:^1.0.0" + checksum: 10c0/5af133a917c0bcf65e84e7f23e779e7abc1cd49cb7fdc62d00d1de74b0d8c1b5ee74ac7766099fb3be1b05b26dfc67bab76a17030d2fe7ea2eef867434362dfc + languageName: node + linkType: hard + +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: "npm:1.1.0" + sprintf-js: "npm:^1.1.3" + checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc + languageName: node + linkType: hard + +"ipaddr.js@npm:1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: 10c0/0486e775047971d3fdb5fb4f063829bac45af299ae0b82dcf3afa2145338e08290563a2a70f34b732d795ecc8311902e541a8530eeb30d75860a78ff4e94ce2a + languageName: node + linkType: hard + +"ipaddr.js@npm:^2.0.1": + version: 2.0.1 + resolution: "ipaddr.js@npm:2.0.1" + checksum: 10c0/0034dfd7a83e82bec6a569549f42c56eb47d051842e10ff0400d97b18f517131834d7c054893a31900cf9d54cf4d974eed97923e5e5965c298d004849f5f0ac9 + languageName: node + linkType: hard + +"is-alphabetical@npm:^2.0.0": + version: 2.0.1 + resolution: "is-alphabetical@npm:2.0.1" + checksum: 10c0/932367456f17237533fd1fc9fe179df77957271020b83ea31da50e5cc472d35ef6b5fb8147453274ffd251134472ce24eb6f8d8398d96dee98237cdb81a6c9a7 + languageName: node + linkType: hard + +"is-alphanumerical@npm:^2.0.0": + version: 2.0.1 + resolution: "is-alphanumerical@npm:2.0.1" + dependencies: + is-alphabetical: "npm:^2.0.0" + is-decimal: "npm:^2.0.0" + checksum: 10c0/4b35c42b18e40d41378293f82a3ecd9de77049b476f748db5697c297f686e1e05b072a6aaae2d16f54d2a57f85b00cbbe755c75f6d583d1c77d6657bd0feb5a2 + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 + languageName: node + linkType: hard + +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: "npm:^2.0.0" + checksum: 10c0/a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38 + languageName: node + linkType: hard + +"is-ci@npm:^3.0.1": + version: 3.0.1 + resolution: "is-ci@npm:3.0.1" + dependencies: + ci-info: "npm:^3.2.0" + bin: + is-ci: bin.js + checksum: 10c0/0e81caa62f4520d4088a5bef6d6337d773828a88610346c4b1119fb50c842587ed8bef1e5d9a656835a599e7209405b5761ddf2339668f2d0f4e889a92fe6051 + languageName: node + linkType: hard + +"is-core-module@npm:^2.9.0": + version: 2.9.0 + resolution: "is-core-module@npm:2.9.0" + dependencies: + has: "npm:^1.0.3" + checksum: 10c0/056fe4c5f9f383dc1c1b0dc3250c300880b9b1e17e1885077d64a1667926ecc11ba696776597616bfd2fd7f87c7476c01b127a0c842b4821bee2414d0e296e6e + languageName: node + linkType: hard + +"is-decimal@npm:^2.0.0": + version: 2.0.1 + resolution: "is-decimal@npm:2.0.1" + checksum: 10c0/8085dd66f7d82f9de818fba48b9e9c0429cb4291824e6c5f2622e96b9680b54a07a624cfc663b24148b8e853c62a1c987cfe8b0b5a13f5156991afaf6736e334 + languageName: node + linkType: hard + +"is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": + version: 2.2.1 + resolution: "is-docker@npm:2.2.1" + bin: + is-docker: cli.js + checksum: 10c0/e828365958d155f90c409cdbe958f64051d99e8aedc2c8c4cd7c89dcf35329daed42f7b99346f7828df013e27deb8f721cf9408ba878c76eb9e8290235fbcdcc + languageName: node + linkType: hard + +"is-extendable@npm:^0.1.0": + version: 0.1.1 + resolution: "is-extendable@npm:0.1.1" + checksum: 10c0/dd5ca3994a28e1740d1e25192e66eed128e0b2ff161a7ea348e87ae4f616554b486854de423877a2a2c171d5f7cd6e8093b91f54533bc88a59ee1c9838c43879 + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + +"is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + languageName: node + linkType: hard + +"is-hexadecimal@npm:^2.0.0": + version: 2.0.1 + resolution: "is-hexadecimal@npm:2.0.1" + checksum: 10c0/3eb60fe2f1e2bbc760b927dcad4d51eaa0c60138cf7fc671803f66353ad90c301605b502c7ea4c6bb0548e1c7e79dfd37b73b632652e3b76030bba603a7e9626 + languageName: node + linkType: hard + +"is-installed-globally@npm:^0.4.0": + version: 0.4.0 + resolution: "is-installed-globally@npm:0.4.0" + dependencies: + global-dirs: "npm:^3.0.0" + is-path-inside: "npm:^3.0.2" + checksum: 10c0/f3e6220ee5824b845c9ed0d4b42c24272701f1f9926936e30c0e676254ca5b34d1b92c6205cae11b283776f9529212c0cdabb20ec280a6451677d6493ca9c22d + languageName: node + linkType: hard + +"is-npm@npm:^6.0.0": + version: 6.0.0 + resolution: "is-npm@npm:6.0.0" + checksum: 10c0/1f064c66325cba6e494783bee4e635caa2655aad7f853a0e045d086e0bb7d83d2d6cdf1745dc9a7c7c93dacbf816fbee1f8d9179b02d5d01674d4f92541dc0d9 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 + languageName: node + linkType: hard + +"is-obj@npm:^1.0.1": + version: 1.0.1 + resolution: "is-obj@npm:1.0.1" + checksum: 10c0/5003acba0af7aa47dfe0760e545a89bbac89af37c12092c3efadc755372cdaec034f130e7a3653a59eb3c1843cfc72ca71eaf1a6c3bafe5a0bab3611a47f9945 + languageName: node + linkType: hard + +"is-obj@npm:^2.0.0": + version: 2.0.0 + resolution: "is-obj@npm:2.0.0" + checksum: 10c0/85044ed7ba8bd169e2c2af3a178cacb92a97aa75de9569d02efef7f443a824b5e153eba72b9ae3aca6f8ce81955271aa2dc7da67a8b720575d3e38104208cb4e + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.2": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 + languageName: node + linkType: hard + +"is-plain-obj@npm:^3.0.0": + version: 3.0.0 + resolution: "is-plain-obj@npm:3.0.0" + checksum: 10c0/8e6483bfb051d42ec9c704c0ede051a821c6b6f9a6c7a3e3b55aa855e00981b0580c8f3b1f5e2e62649b39179b1abfee35d6f8086d999bfaa32c1908d29b07bc + languageName: node + linkType: hard + +"is-plain-obj@npm:^4.0.0": + version: 4.1.0 + resolution: "is-plain-obj@npm:4.1.0" + checksum: 10c0/32130d651d71d9564dc88ba7e6fda0e91a1010a3694648e9f4f47bb6080438140696d3e3e15c741411d712e47ac9edc1a8a9de1fe76f3487b0d90be06ac9975e + languageName: node + linkType: hard + +"is-plain-object@npm:^2.0.4": + version: 2.0.4 + resolution: "is-plain-object@npm:2.0.4" + dependencies: + isobject: "npm:^3.0.1" + checksum: 10c0/f050fdd5203d9c81e8c4df1b3ff461c4bc64e8b5ca383bcdde46131361d0a678e80bcf00b5257646f6c636197629644d53bd8e2375aea633de09a82d57e942f4 + languageName: node + linkType: hard + +"is-reference@npm:^3.0.0": + version: 3.0.2 + resolution: "is-reference@npm:3.0.2" + dependencies: + "@types/estree": "npm:*" + checksum: 10c0/652d31b405e8e8269071cee78fe874b072745012eba202c6dc86880fd603a65ae043e3160990ab4a0a4b33567cbf662eecf3bc6b3c2c1550e6c2b6cf885ce5aa + languageName: node + linkType: hard + +"is-regexp@npm:^1.0.0": + version: 1.0.0 + resolution: "is-regexp@npm:1.0.0" + checksum: 10c0/34cacda1901e00f6e44879378f1d2fa96320ea956c1bec27713130aaf1d44f6e7bd963eed28945bfe37e600cb27df1cf5207302680dad8bdd27b9baff8ecf611 + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 + languageName: node + linkType: hard + +"is-typedarray@npm:^1.0.0": + version: 1.0.0 + resolution: "is-typedarray@npm:1.0.0" + checksum: 10c0/4c096275ba041a17a13cca33ac21c16bc4fd2d7d7eb94525e7cd2c2f2c1a3ab956e37622290642501ff4310601e413b675cf399ad6db49855527d2163b3eeeec + languageName: node + linkType: hard + +"is-wsl@npm:^2.2.0": + version: 2.2.0 + resolution: "is-wsl@npm:2.2.0" + dependencies: + is-docker: "npm:^2.0.0" + checksum: 10c0/a6fa2d370d21be487c0165c7a440d567274fbba1a817f2f0bfa41cc5e3af25041d84267baa22df66696956038a43973e72fca117918c91431920bdef490fa25e + languageName: node + linkType: hard + +"is-yarn-global@npm:^0.4.0": + version: 0.4.1 + resolution: "is-yarn-global@npm:0.4.1" + checksum: 10c0/8ff66f33454614f8e913ad91cc4de0d88d519a46c1ed41b3f589da79504ed0fcfa304064fe3096dda9360c5f35aa210cb8e978fd36798f3118cb66a4de64d365 + languageName: node + linkType: hard + +"isarray@npm:0.0.1": + version: 0.0.1 + resolution: "isarray@npm:0.0.1" + checksum: 10c0/ed1e62da617f71fe348907c71743b5ed550448b455f8d269f89a7c7ddb8ae6e962de3dab6a74a237b06f5eb7f6ece7a45ada8ce96d87fe972926530f91ae3311 + languageName: node + linkType: hard + +"isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + +"isobject@npm:^3.0.1": + version: 3.0.1 + resolution: "isobject@npm:3.0.1" + checksum: 10c0/03344f5064a82f099a0cd1a8a407f4c0d20b7b8485e8e816c39f249e9416b06c322e8dec5b842b6bb8a06de0af9cb48e7bc1b5352f0fadc2f0abac033db3d4db + languageName: node + linkType: hard + +"jackspeak@npm:^3.1.2": + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 + languageName: node + linkType: hard + +"jest-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-util@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + graceful-fs: "npm:^4.2.9" + picomatch: "npm:^2.2.3" + checksum: 10c0/bc55a8f49fdbb8f51baf31d2a4f312fb66c9db1483b82f602c9c990e659cdd7ec529c8e916d5a89452ecbcfae4949b21b40a7a59d4ffc0cd813a973ab08c8150 + languageName: node + linkType: hard + +"jest-worker@npm:^27.4.5": + version: 27.5.1 + resolution: "jest-worker@npm:27.5.1" + dependencies: + "@types/node": "npm:*" + merge-stream: "npm:^2.0.0" + supports-color: "npm:^8.0.0" + checksum: 10c0/8c4737ffd03887b3c6768e4cc3ca0269c0336c1e4b1b120943958ddb035ed2a0fc6acab6dc99631720a3720af4e708ff84fb45382ad1e83c27946adf3623969b + languageName: node + linkType: hard + +"jest-worker@npm:^29.4.3": + version: 29.7.0 + resolution: "jest-worker@npm:29.7.0" + dependencies: + "@types/node": "npm:*" + jest-util: "npm:^29.7.0" + merge-stream: "npm:^2.0.0" + supports-color: "npm:^8.0.0" + checksum: 10c0/5570a3a005b16f46c131968b8a5b56d291f9bbb85ff4217e31c80bd8a02e7de799e59a54b95ca28d5c302f248b54cbffde2d177c2f0f52ffcee7504c6eabf660 + languageName: node + linkType: hard + +"jiti@npm:^1.20.0": + version: 1.21.0 + resolution: "jiti@npm:1.21.0" + bin: + jiti: bin/jiti.js + checksum: 10c0/7f361219fe6c7a5e440d5f1dba4ab763a5538d2df8708cdc22561cf25ea3e44b837687931fca7cdd8cdd9f567300e90be989dd1321650045012d8f9ed6aab07f + languageName: node + linkType: hard + +"joi@npm:^17.9.2": + version: 17.12.2 + resolution: "joi@npm:17.12.2" + dependencies: + "@hapi/hoek": "npm:^9.3.0" + "@hapi/topo": "npm:^5.1.0" + "@sideway/address": "npm:^4.1.5" + "@sideway/formula": "npm:^3.0.1" + "@sideway/pinpoint": "npm:^2.0.0" + checksum: 10c0/2cc89f0fc71282018a9032d48652fe6c62009689a7919512fb5a76735225875d4554da580d8b5c074bc4abd5b0ca0e4b32b3f2ab7e32c9f0b338d43f6bdf1162 + languageName: node + linkType: hard + +"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + +"js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f + languageName: node + linkType: hard + +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 + languageName: node + linkType: hard + +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: 10c0/dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 + languageName: node + linkType: hard + +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" + bin: + jsesc: bin/jsesc + checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 + languageName: node + linkType: hard + +"jsesc@npm:~0.5.0": + version: 0.5.0 + resolution: "jsesc@npm:0.5.0" + bin: + jsesc: bin/jsesc + checksum: 10c0/f93792440ae1d80f091b65f8ceddf8e55c4bb7f1a09dee5dcbdb0db5612c55c0f6045625aa6b7e8edb2e0a4feabd80ee48616dbe2d37055573a84db3d24f96d9 + languageName: node + linkType: hard + +"jsesc@npm:~3.0.2": + version: 3.0.2 + resolution: "jsesc@npm:3.0.2" + bin: + jsesc: bin/jsesc + checksum: 10c0/ef22148f9e793180b14d8a145ee6f9f60f301abf443288117b4b6c53d0ecd58354898dc506ccbb553a5f7827965cd38bc5fb726575aae93c5e8915e2de8290e1 + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 + languageName: node + linkType: hard + +"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 + languageName: node + linkType: hard + +"json5@npm:^2.1.2, json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c + languageName: node + linkType: hard + +"jsonc-parser@npm:^3.2.0": + version: 3.3.1 + resolution: "jsonc-parser@npm:3.3.1" + checksum: 10c0/269c3ae0a0e4f907a914bf334306c384aabb9929bd8c99f909275ebd5c2d3bc70b9bcd119ad794f339dec9f24b6a4ee9cd5a8ab2e6435e730ad4075388fc2ab6 + languageName: node + linkType: hard + +"jsonfile@npm:^6.0.1": + version: 6.1.0 + resolution: "jsonfile@npm:6.1.0" + dependencies: + graceful-fs: "npm:^4.1.6" + universalify: "npm:^2.0.0" + dependenciesMeta: + graceful-fs: + optional: true + checksum: 10c0/4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865 + languageName: node + linkType: hard + +"katex@npm:^0.16.9": + version: 0.16.21 + resolution: "katex@npm:0.16.21" + dependencies: + commander: "npm:^8.3.0" + bin: + katex: cli.js + checksum: 10c0/e2e4139ba72a13f2393308fbb2b4c5511611a19a40a6e39d956cf775e553af3517dbfd0a54477faaf401c923e4654e32296347846b8ff15dfa579f88ff8579bb + languageName: node + linkType: hard + +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e + languageName: node + linkType: hard + +"khroma@npm:^2.1.0": + version: 2.1.0 + resolution: "khroma@npm:2.1.0" + checksum: 10c0/634d98753ff5d2540491cafeb708fc98de0d43f4e6795256d5c8f6e3ad77de93049ea41433928fda3697adf7bbe6fe27351858f6d23b78f8b5775ef314c59891 + languageName: node + linkType: hard + +"kind-of@npm:^6.0.0, kind-of@npm:^6.0.2": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 10c0/61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 + languageName: node + linkType: hard + +"kleur@npm:^3.0.3": + version: 3.0.3 + resolution: "kleur@npm:3.0.3" + checksum: 10c0/cd3a0b8878e7d6d3799e54340efe3591ca787d9f95f109f28129bdd2915e37807bf8918bb295ab86afb8c82196beec5a1adcaf29042ce3f2bd932b038fe3aa4b + languageName: node + linkType: hard + +"kolorist@npm:^1.8.0": + version: 1.8.0 + resolution: "kolorist@npm:1.8.0" + checksum: 10c0/73075db44a692bf6c34a649f3b4b3aea4993b84f6b754cbf7a8577e7c7db44c0bad87752bd23b0ce533f49de2244ce2ce03b7b1b667a85ae170a94782cc50f9b + languageName: node + linkType: hard + +"langium@npm:3.3.1": + version: 3.3.1 + resolution: "langium@npm:3.3.1" + dependencies: + chevrotain: "npm:~11.0.3" + chevrotain-allstar: "npm:~0.3.0" + vscode-languageserver: "npm:~9.0.1" + vscode-languageserver-textdocument: "npm:~1.0.11" + vscode-uri: "npm:~3.0.8" + checksum: 10c0/0c54803068addb0f7c16a57fdb2db2e5d4d9a21259d477c3c7d0587c2c2f65a313f9eeef3c95ac1c2e41cd11d4f2eaf620d2c03fe839a3350ffee59d2b4c7647 + languageName: node + linkType: hard + +"latest-version@npm:^7.0.0": + version: 7.0.0 + resolution: "latest-version@npm:7.0.0" + dependencies: + package-json: "npm:^8.1.0" + checksum: 10c0/68045f5e419e005c12e595ae19687dd88317dd0108b83a8773197876622c7e9d164fe43aacca4f434b2cba105c92848b89277f658eabc5d50e81fb743bbcddb1 + languageName: node + linkType: hard + +"launch-editor@npm:^2.6.0": + version: 2.6.1 + resolution: "launch-editor@npm:2.6.1" + dependencies: + picocolors: "npm:^1.0.0" + shell-quote: "npm:^1.8.1" + checksum: 10c0/82d0bd9a44e7a972157719e63dac1b8196db6ec7066c1ec57a495f6c3d6e734f3c4da89549e7b33eb3b0356668ad02a9e7782b6733f5ebd7a61b7c5f635a3ee9 + languageName: node + linkType: hard + +"layout-base@npm:^1.0.0": + version: 1.0.2 + resolution: "layout-base@npm:1.0.2" + checksum: 10c0/2a55d0460fd9f6ed53d7e301b9eb3dea19bda03815d616a40665ce6dc75c1f4d62e1ca19a897da1cfaf6de1b91de59cd6f2f79ba1258f3d7fccc7d46ca7f3337 + languageName: node + linkType: hard + +"layout-base@npm:^2.0.0": + version: 2.0.1 + resolution: "layout-base@npm:2.0.1" + checksum: 10c0/a44df9ef3cbff9916a10f616635e22b5787c89fa62b2fec6f99e8e6ee512c7cebd22668ce32dab5a83c934ba0a309c51a678aa0b40d70853de6c357893c0a88b + languageName: node + linkType: hard + +"leven@npm:^3.1.0": + version: 3.1.0 + resolution: "leven@npm:3.1.0" + checksum: 10c0/cd778ba3fbab0f4d0500b7e87d1f6e1f041507c56fdcd47e8256a3012c98aaee371d4c15e0a76e0386107af2d42e2b7466160a2d80688aaa03e66e49949f42df + languageName: node + linkType: hard + +"lilconfig@npm:^3.1.1": + version: 3.1.2 + resolution: "lilconfig@npm:3.1.2" + checksum: 10c0/f059630b1a9bddaeba83059db00c672b64dc14074e9f232adce32b38ca1b5686ab737eb665c5ba3c32f147f0002b4bee7311ad0386a9b98547b5623e87071fbe + languageName: node + linkType: hard + +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 10c0/3da6ee62d4cd9f03f5dc90b4df2540fb85b352081bee77fe4bbcd12c9000ead7f35e0a38b8d09a9bb99b13223446dd8689ff3c4959807620726d788701a83d2d + languageName: node + linkType: hard + +"loader-runner@npm:^4.2.0": + version: 4.3.0 + resolution: "loader-runner@npm:4.3.0" + checksum: 10c0/a44d78aae0907a72f73966fe8b82d1439c8c485238bd5a864b1b9a2a3257832effa858790241e6b37876b5446a78889adf2fcc8dd897ce54c089ecc0a0ce0bf0 + languageName: node + linkType: hard + +"loader-utils@npm:^2.0.0": + version: 2.0.4 + resolution: "loader-utils@npm:2.0.4" + dependencies: + big.js: "npm:^5.2.2" + emojis-list: "npm:^3.0.0" + json5: "npm:^2.1.2" + checksum: 10c0/d5654a77f9d339ec2a03d88221a5a695f337bf71eb8dea031b3223420bb818964ba8ed0069145c19b095f6c8b8fd386e602a3fc7ca987042bd8bb1dcc90d7100 + languageName: node + linkType: hard + +"local-pkg@npm:^1.0.0": + version: 1.1.1 + resolution: "local-pkg@npm:1.1.1" + dependencies: + mlly: "npm:^1.7.4" + pkg-types: "npm:^2.0.1" + quansync: "npm:^0.2.8" + checksum: 10c0/fe8f9d0443fb066c3f28a4c89d587dd7cba3ab02645cd16598f8d5f30968acf60af1b0ec2d6ad768475ec9f52baad124f31a93d2fbc034f645bcc02bf3a84882 + languageName: node + linkType: hard + +"locate-path@npm:^7.1.0": + version: 7.2.0 + resolution: "locate-path@npm:7.2.0" + dependencies: + p-locate: "npm:^6.0.0" + checksum: 10c0/139e8a7fe11cfbd7f20db03923cacfa5db9e14fa14887ea121345597472b4a63c1a42a8a5187defeeff6acf98fd568da7382aa39682d38f0af27433953a97751 + languageName: node + linkType: hard + +"lodash-es@npm:4.17.21, lodash-es@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash-es@npm:4.17.21" + checksum: 10c0/fb407355f7e6cd523a9383e76e6b455321f0f153a6c9625e21a8827d10c54c2a2341bd2ae8d034358b60e07325e1330c14c224ff582d04612a46a4f0479ff2f2 + languageName: node + linkType: hard + +"lodash.debounce@npm:^4.0.8": + version: 4.0.8 + resolution: "lodash.debounce@npm:4.0.8" + checksum: 10c0/762998a63e095412b6099b8290903e0a8ddcb353ac6e2e0f2d7e7d03abd4275fe3c689d88960eb90b0dde4f177554d51a690f22a343932ecbc50a5d111849987 + languageName: node + linkType: hard + +"lodash.memoize@npm:^4.1.2": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 10c0/c8713e51eccc650422716a14cece1809cfe34bc5ab5e242b7f8b4e2241c2483697b971a604252807689b9dd69bfe3a98852e19a5b89d506b000b4187a1285df8 + languageName: node + linkType: hard + +"lodash.uniq@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.uniq@npm:4.5.0" + checksum: 10c0/262d400bb0952f112162a320cc4a75dea4f66078b9e7e3075ffbc9c6aa30b3e9df3cf20e7da7d566105e1ccf7804e4fbd7d804eee0b53de05d83f16ffbf41c5e + languageName: node + linkType: hard + +"lodash@npm:^4.17.20, lodash@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c + languageName: node + linkType: hard + +"longest-streak@npm:^3.0.0": + version: 3.1.0 + resolution: "longest-streak@npm:3.1.0" + checksum: 10c0/7c2f02d0454b52834d1bcedef79c557bd295ee71fdabb02d041ff3aa9da48a90b5df7c0409156dedbc4df9b65da18742652aaea4759d6ece01f08971af6a7eaa + languageName: node + linkType: hard + +"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.2.0, loose-envify@npm:^1.3.1, loose-envify@npm:^1.4.0": + version: 1.4.0 + resolution: "loose-envify@npm:1.4.0" + dependencies: + js-tokens: "npm:^3.0.0 || ^4.0.0" + bin: + loose-envify: cli.js + checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e + languageName: node + linkType: hard + +"lower-case@npm:^2.0.2": + version: 2.0.2 + resolution: "lower-case@npm:2.0.2" + dependencies: + tslib: "npm:^2.0.3" + checksum: 10c0/3d925e090315cf7dc1caa358e0477e186ffa23947740e4314a7429b6e62d72742e0bbe7536a5ae56d19d7618ce998aba05caca53c2902bd5742fdca5fc57fd7b + languageName: node + linkType: hard + +"lowercase-keys@npm:^3.0.0": + version: 3.0.0 + resolution: "lowercase-keys@npm:3.0.0" + checksum: 10c0/ef62b9fa5690ab0a6e4ef40c94efce68e3ed124f583cc3be38b26ff871da0178a28b9a84ce0c209653bb25ca135520ab87fea7cd411a54ac4899cb2f30501430 + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb + languageName: node + linkType: hard + +"lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" + dependencies: + yallist: "npm:^3.0.2" + checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 + languageName: node + linkType: hard + +"lunr-languages@npm:^1.4.0": + version: 1.14.0 + resolution: "lunr-languages@npm:1.14.0" + checksum: 10c0/5dc26fa75c8f3f14a69b3d54ae1228907b3552bc26727a14c5f302aab05d2547a924d095f075c9d3439756a38e2dafb78d1b74fc862dc290a13ddce236a55e87 + languageName: node + linkType: hard + +"lunr@npm:^2.3.9": + version: 2.3.9 + resolution: "lunr@npm:2.3.9" + checksum: 10c0/77d7dbb4fbd602aac161e2b50887d8eda28c0fa3b799159cee380fbb311f1e614219126ecbbd2c3a9c685f1720a8109b3c1ca85cc893c39b6c9cc6a62a1d8a8b + languageName: node + linkType: hard + +"make-fetch-happen@npm:^14.0.3": + version: 14.0.3 + resolution: "make-fetch-happen@npm:14.0.3" + dependencies: + "@npmcli/agent": "npm:^3.0.0" + cacache: "npm:^19.0.1" + http-cache-semantics: "npm:^4.1.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^4.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^1.0.0" + proc-log: "npm:^5.0.0" + promise-retry: "npm:^2.0.1" + ssri: "npm:^12.0.0" + checksum: 10c0/c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0 + languageName: node + linkType: hard + +"mark.js@npm:^8.11.1": + version: 8.11.1 + resolution: "mark.js@npm:8.11.1" + checksum: 10c0/5e69e776db61abdd857b5cbb7070c8a3b1b0e5c12bf077fcd5a8c6f17b1f85ed65275aba5662b57136d1b9f82b54bb34d4ef4220f7703c9a7ab806ae1e208cff + languageName: node + linkType: hard + +"markdown-extensions@npm:^2.0.0": + version: 2.0.0 + resolution: "markdown-extensions@npm:2.0.0" + checksum: 10c0/406139da2aa0d5ebad86195c8e8c02412f873c452b4c087ae7bc767af37956141be449998223bb379eea179b5fd38dfa610602b6f29c22ddab5d51e627a7e41d + languageName: node + linkType: hard + +"markdown-table@npm:^2.0.0": + version: 2.0.0 + resolution: "markdown-table@npm:2.0.0" + dependencies: + repeat-string: "npm:^1.0.0" + checksum: 10c0/f257e0781ea50eb946919df84bdee4ba61f983971b277a369ca7276f89740fd0e2749b9b187163a42df4c48682b71962d4007215ce3523480028f06c11ddc2e6 + languageName: node + linkType: hard + +"markdown-table@npm:^3.0.0": + version: 3.0.3 + resolution: "markdown-table@npm:3.0.3" + checksum: 10c0/47433a3f31e4637a184e38e873ab1d2fadfb0106a683d466fec329e99a2d8dfa09f091fa42202c6f13ec94aef0199f449a684b28042c636f2edbc1b7e1811dcd + languageName: node + linkType: hard + +"marked@npm:^15.0.7": + version: 15.0.12 + resolution: "marked@npm:15.0.12" + bin: + marked: bin/marked.js + checksum: 10c0/e09da211544b787ecfb25fed07af206060bf7cd6d9de6cb123f15c496a57f83b7aabea93340aaa94dae9c94e097ae129377cad6310abc16009590972e85f4212 + languageName: node + linkType: hard + +"marked@npm:^4.3.0": + version: 4.3.0 + resolution: "marked@npm:4.3.0" + bin: + marked: bin/marked.js + checksum: 10c0/0013463855e31b9c88d8bb2891a611d10ef1dc79f2e3cbff1bf71ba389e04c5971298c886af0be799d7fa9aa4593b086a136062d59f1210b0480b026a8c5dc47 + languageName: node + linkType: hard + +"mdast-util-directive@npm:^3.0.0": + version: 3.0.0 + resolution: "mdast-util-directive@npm:3.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + "@types/unist": "npm:^3.0.0" + devlop: "npm:^1.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + parse-entities: "npm:^4.0.0" + stringify-entities: "npm:^4.0.0" + unist-util-visit-parents: "npm:^6.0.0" + checksum: 10c0/4a71b27f5f0c4ead5293a12d4118d4d832951ac0efdeba4af2dd78f5679f9cabee80feb3619f219a33674c12df3780def1bd3150d7298aaf0ef734f0dfbab999 + languageName: node + linkType: hard + +"mdast-util-find-and-replace@npm:^3.0.0, mdast-util-find-and-replace@npm:^3.0.1": + version: 3.0.1 + resolution: "mdast-util-find-and-replace@npm:3.0.1" + dependencies: + "@types/mdast": "npm:^4.0.0" + escape-string-regexp: "npm:^5.0.0" + unist-util-is: "npm:^6.0.0" + unist-util-visit-parents: "npm:^6.0.0" + checksum: 10c0/1faca98c4ee10a919f23b8cc6d818e5bb6953216a71dfd35f51066ed5d51ef86e5063b43dcfdc6061cd946e016a9f0d44a1dccadd58452cf4ed14e39377f00cb + languageName: node + linkType: hard + +"mdast-util-from-markdown@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-from-markdown@npm:2.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + "@types/unist": "npm:^3.0.0" + decode-named-character-reference: "npm:^1.0.0" + devlop: "npm:^1.0.0" + mdast-util-to-string: "npm:^4.0.0" + micromark: "npm:^4.0.0" + micromark-util-decode-numeric-character-reference: "npm:^2.0.0" + micromark-util-decode-string: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + unist-util-stringify-position: "npm:^4.0.0" + checksum: 10c0/fb66e917f66e33fc60d6964264c4abd519fd8829a4a58ff9c61b2ba5c337554fb954b9ec31ca1c34e83c1163a73f310c39072d656f9a2d3184fe39c87cbba65a + languageName: node + linkType: hard + +"mdast-util-frontmatter@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-frontmatter@npm:2.0.1" + dependencies: + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.0.0" + escape-string-regexp: "npm:^5.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + micromark-extension-frontmatter: "npm:^2.0.0" + checksum: 10c0/d9b0b70dd9c574cc0220d4e05dd8e9d86ac972a6a5af9e0c49c839b31cb750d4313445cfbbdf9264a7fbe3f8c8d920b45358b8500f4286e6b9dc830095b25b9a + languageName: node + linkType: hard + +"mdast-util-gfm-autolink-literal@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-autolink-literal@npm:2.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + ccount: "npm:^2.0.0" + devlop: "npm:^1.0.0" + mdast-util-find-and-replace: "npm:^3.0.0" + micromark-util-character: "npm:^2.0.0" + checksum: 10c0/821ef91db108f05b321c54fdf4436df9d6badb33e18f714d8d52c0e70f988f5b6b118cdd4d607b4cb3bef1718304ce7e9fb25fa580622c3d20d68c1489c64875 + languageName: node + linkType: hard + +"mdast-util-gfm-footnote@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-footnote@npm:2.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.1.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + checksum: 10c0/c673b22bea24740235e74cfd66765b41a2fa540334f7043fa934b94938b06b7d3c93f2d3b33671910c5492b922c0cc98be833be3b04cfed540e0679650a6d2de + languageName: node + linkType: hard + +"mdast-util-gfm-strikethrough@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-strikethrough@npm:2.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/b053e93d62c7545019bd914271ea9e5667ad3b3b57d16dbf68e56fea39a7e19b4a345e781312714eb3d43fdd069ff7ee22a3ca7f6149dfa774554f19ce3ac056 + languageName: node + linkType: hard + +"mdast-util-gfm-table@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-table@npm:2.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.0.0" + markdown-table: "npm:^3.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/128af47c503a53bd1c79f20642561e54a510ad5e2db1e418d28fefaf1294ab839e6c838e341aef5d7e404f9170b9ca3d1d89605f234efafde93ee51174a6e31e + languageName: node + linkType: hard + +"mdast-util-gfm-task-list-item@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-task-list-item@npm:2.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/258d725288482b636c0a376c296431390c14b4f29588675297cb6580a8598ed311fc73ebc312acfca12cc8546f07a3a285a53a3b082712e2cbf5c190d677d834 + languageName: node + linkType: hard + +"mdast-util-gfm@npm:^3.0.0": + version: 3.0.0 + resolution: "mdast-util-gfm@npm:3.0.0" + dependencies: + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-gfm-autolink-literal: "npm:^2.0.0" + mdast-util-gfm-footnote: "npm:^2.0.0" + mdast-util-gfm-strikethrough: "npm:^2.0.0" + mdast-util-gfm-table: "npm:^2.0.0" + mdast-util-gfm-task-list-item: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/91596fe9bf3e4a0c546d0c57f88106c17956d9afbe88ceb08308e4da2388aff64489d649ddad599caecfdf755fc3ae4c9b82c219b85281bc0586b67599881fca + languageName: node + linkType: hard + +"mdast-util-mdx-expression@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-mdx-expression@npm:2.0.0" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + "@types/hast": "npm:^3.0.0" + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/512848cbc44b9dc7cffc1bb3f95f7e67f0d6562870e56a67d25647f475d411e136b915ba417c8069fb36eac1839d0209fb05fb323d377f35626a82fcb0879363 + languageName: node + linkType: hard + +"mdast-util-mdx-jsx@npm:^3.0.0": + version: 3.1.2 + resolution: "mdast-util-mdx-jsx@npm:3.1.2" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + "@types/hast": "npm:^3.0.0" + "@types/mdast": "npm:^4.0.0" + "@types/unist": "npm:^3.0.0" + ccount: "npm:^2.0.0" + devlop: "npm:^1.1.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + parse-entities: "npm:^4.0.0" + stringify-entities: "npm:^4.0.0" + unist-util-remove-position: "npm:^5.0.0" + unist-util-stringify-position: "npm:^4.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10c0/855b60c3db9bde2fe142bd366597f7bd5892fc288428ba054e26ffcffc07bfe5648c0792d614ba6e08b1eab9784ffc3c1267cf29dfc6db92b419d68b5bcd487d + languageName: node + linkType: hard + +"mdast-util-mdx@npm:^3.0.0": + version: 3.0.0 + resolution: "mdast-util-mdx@npm:3.0.0" + dependencies: + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-mdx-expression: "npm:^2.0.0" + mdast-util-mdx-jsx: "npm:^3.0.0" + mdast-util-mdxjs-esm: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/4faea13f77d6bc9aa64ee41a5e4779110b73444a17fda363df6ebe880ecfa58b321155b71f8801c3faa6d70d6222a32a00cbd6dbf5fad8db417f4688bc9c74e1 + languageName: node + linkType: hard + +"mdast-util-mdxjs-esm@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-mdxjs-esm@npm:2.0.1" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + "@types/hast": "npm:^3.0.0" + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/5bda92fc154141705af2b804a534d891f28dac6273186edf1a4c5e3f045d5b01dbcac7400d27aaf91b7e76e8dce007c7b2fdf136c11ea78206ad00bdf9db46bc + languageName: node + linkType: hard + +"mdast-util-phrasing@npm:^4.0.0": + version: 4.1.0 + resolution: "mdast-util-phrasing@npm:4.1.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + unist-util-is: "npm:^6.0.0" + checksum: 10c0/bf6c31d51349aa3d74603d5e5a312f59f3f65662ed16c58017169a5fb0f84ca98578f626c5ee9e4aa3e0a81c996db8717096705521bddb4a0185f98c12c9b42f + languageName: node + linkType: hard + +"mdast-util-to-hast@npm:^13.0.0": + version: 13.1.0 + resolution: "mdast-util-to-hast@npm:13.1.0" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/mdast": "npm:^4.0.0" + "@ungap/structured-clone": "npm:^1.0.0" + devlop: "npm:^1.0.0" + micromark-util-sanitize-uri: "npm:^2.0.0" + trim-lines: "npm:^3.0.0" + unist-util-position: "npm:^5.0.0" + unist-util-visit: "npm:^5.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/a2b761bfae37b7eb6039e25ca2d3c4dc2f190cdef6b00e404e885d749ecc7f0ce6149f39130bdb02e122785c662eeb84dd1ac999ce3c311ffafe32ecf950071b + languageName: node + linkType: hard + +"mdast-util-to-markdown@npm:^2.0.0": + version: 2.1.0 + resolution: "mdast-util-to-markdown@npm:2.1.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + "@types/unist": "npm:^3.0.0" + longest-streak: "npm:^3.0.0" + mdast-util-phrasing: "npm:^4.0.0" + mdast-util-to-string: "npm:^4.0.0" + micromark-util-decode-string: "npm:^2.0.0" + unist-util-visit: "npm:^5.0.0" + zwitch: "npm:^2.0.0" + checksum: 10c0/8bd37a9627a438ef6418d6642661904d0cc03c5c732b8b018a8e238ef5cc82fe8aef1940b19c6f563245e58b9659f35e527209bd3fe145f3c723ba14d18fc3e6 + languageName: node + linkType: hard + +"mdast-util-to-string@npm:^4.0.0": + version: 4.0.0 + resolution: "mdast-util-to-string@npm:4.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + checksum: 10c0/2d3c1af29bf3fe9c20f552ee9685af308002488f3b04b12fa66652c9718f66f41a32f8362aa2d770c3ff464c034860b41715902ada2306bb0a055146cef064d7 + languageName: node + linkType: hard + +"mdn-data@npm:2.0.28": + version: 2.0.28 + resolution: "mdn-data@npm:2.0.28" + checksum: 10c0/20000932bc4cd1cde9cba4e23f08cc4f816398af4c15ec81040ed25421d6bf07b5cf6b17095972577fb498988f40f4cb589e3169b9357bb436a12d8e07e5ea7b + languageName: node + linkType: hard + +"mdn-data@npm:2.0.30": + version: 2.0.30 + resolution: "mdn-data@npm:2.0.30" + checksum: 10c0/a2c472ea16cee3911ae742593715aa4c634eb3d4b9f1e6ada0902aa90df13dcbb7285d19435f3ff213ebaa3b2e0c0265c1eb0e3fb278fda7f8919f046a410cd9 + languageName: node + linkType: hard + +"media-typer@npm:0.3.0": + version: 0.3.0 + resolution: "media-typer@npm:0.3.0" + checksum: 10c0/d160f31246907e79fed398470285f21bafb45a62869dc469b1c8877f3f064f5eabc4bcc122f9479b8b605bc5c76187d7871cf84c4ee3ecd3e487da1993279928 + languageName: node + linkType: hard + +"memfs@npm:^3.4.3": + version: 3.4.7 + resolution: "memfs@npm:3.4.7" + dependencies: + fs-monkey: "npm:^1.0.3" + checksum: 10c0/56d85a1e6f808218096c17160eb7db694559a6307b76134e48a4927b7f3a3963941f2d86bac34f681cb16fc9d5010f0b7b42523c9b647451887be285a2348ea3 + languageName: node + linkType: hard + +"merge-descriptors@npm:1.0.3": + version: 1.0.3 + resolution: "merge-descriptors@npm:1.0.3" + checksum: 10c0/866b7094afd9293b5ea5dcd82d71f80e51514bed33b4c4e9f516795dc366612a4cbb4dc94356e943a8a6914889a914530badff27f397191b9b75cda20b6bae93 + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb + languageName: node + linkType: hard + +"mermaid@npm:>=11.6.0": + version: 11.6.0 + resolution: "mermaid@npm:11.6.0" + dependencies: + "@braintree/sanitize-url": "npm:^7.0.4" + "@iconify/utils": "npm:^2.1.33" + "@mermaid-js/parser": "npm:^0.4.0" + "@types/d3": "npm:^7.4.3" + cytoscape: "npm:^3.29.3" + cytoscape-cose-bilkent: "npm:^4.1.0" + cytoscape-fcose: "npm:^2.2.0" + d3: "npm:^7.9.0" + d3-sankey: "npm:^0.12.3" + dagre-d3-es: "npm:7.0.11" + dayjs: "npm:^1.11.13" + dompurify: "npm:^3.2.4" + katex: "npm:^0.16.9" + khroma: "npm:^2.1.0" + lodash-es: "npm:^4.17.21" + marked: "npm:^15.0.7" + roughjs: "npm:^4.6.6" + stylis: "npm:^4.3.6" + ts-dedent: "npm:^2.2.0" + uuid: "npm:^11.1.0" + checksum: 10c0/69709ac58992ed532e1173e327b75f4135e226b7b9f61c15a759266a323b726ce429eef554357be1fc68463597a8111e9be4f7f013a6780b558e88ea3bda46b6 + languageName: node + linkType: hard + +"methods@npm:~1.1.2": + version: 1.1.2 + resolution: "methods@npm:1.1.2" + checksum: 10c0/bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 + languageName: node + linkType: hard + +"micromark-core-commonmark@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-core-commonmark@npm:2.0.0" + dependencies: + decode-named-character-reference: "npm:^1.0.0" + devlop: "npm:^1.0.0" + micromark-factory-destination: "npm:^2.0.0" + micromark-factory-label: "npm:^2.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-factory-title: "npm:^2.0.0" + micromark-factory-whitespace: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-chunked: "npm:^2.0.0" + micromark-util-classify-character: "npm:^2.0.0" + micromark-util-html-tag-name: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + micromark-util-resolve-all: "npm:^2.0.0" + micromark-util-subtokenize: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/e087824b98d1f1d0db34791ac53945b0d68fb5e541c6c9da6700cc3db54d6b697d8110d3120d5d30e2fb39443aabddccd3e2bbf684795359f38b5a696fdc5913 + languageName: node + linkType: hard + +"micromark-extension-directive@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-directive@npm:3.0.0" + dependencies: + devlop: "npm:^1.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-factory-whitespace: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + parse-entities: "npm:^4.0.0" + checksum: 10c0/ee84ecb445fb9f94bf36bf8f0dfd2c81b3fb5f46c275b9ac4445b9a0030a1ccbc3174707321b5512116f482e3a1fc8f0541ccaf57f924999f48141818f05595e + languageName: node + linkType: hard + +"micromark-extension-frontmatter@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-frontmatter@npm:2.0.0" + dependencies: + fault: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/7d0d876e598917a67146d29f536d6fbbf9d1b2401a77e2f64a3f80f934a63ff26fa94b01759c9185c24b2a91e4e6abf908fa7aa246f00a7778a6b37a17464300 + languageName: node + linkType: hard + +"micromark-extension-gfm-autolink-literal@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-gfm-autolink-literal@npm:2.0.0" + dependencies: + micromark-util-character: "npm:^2.0.0" + micromark-util-sanitize-uri: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/9349b8a4c45ad6375d85f196ef6ffc7472311bf0e7493dc387cb6e37498c2fa56f0b670f54ae54f0c6bbbed3b22997643f05057ffcc58457ca56368f7a636319 + languageName: node + linkType: hard + +"micromark-extension-gfm-footnote@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-gfm-footnote@npm:2.0.0" + dependencies: + devlop: "npm:^1.0.0" + micromark-core-commonmark: "npm:^2.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + micromark-util-sanitize-uri: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/59958d8a6e28a16470937de69a01476cd9766f310a892655cb6bcd32b0833ffaa8accddb77e031b1c710c856fc943174e1b0f8f2c60dfa542743f4ba7cff6f15 + languageName: node + linkType: hard + +"micromark-extension-gfm-strikethrough@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-gfm-strikethrough@npm:2.0.0" + dependencies: + devlop: "npm:^1.0.0" + micromark-util-chunked: "npm:^2.0.0" + micromark-util-classify-character: "npm:^2.0.0" + micromark-util-resolve-all: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/b1c4f0e12935e1ffa3981a256de38c5c347f91a015cc1002c0bcdbab476fa97a5992f0d5a9788b2437a96bc94fe4c32d5f539d84b2d699a36dafe31b81b41eb1 + languageName: node + linkType: hard + +"micromark-extension-gfm-table@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-gfm-table@npm:2.0.0" + dependencies: + devlop: "npm:^1.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/3777b5074054d97888ffdcb8e383399adc9066a755ad7197423fda16e09769a18d7e713d969c204228d9abf1e18fef19c7b04790698afc973418ea5f75015f72 + languageName: node + linkType: hard + +"micromark-extension-gfm-tagfilter@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-gfm-tagfilter@npm:2.0.0" + dependencies: + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/995558843fff137ae4e46aecb878d8a4691cdf23527dcf1e2f0157d66786be9f7bea0109c52a8ef70e68e3f930af811828ba912239438e31a9cfb9981f44d34d + languageName: node + linkType: hard + +"micromark-extension-gfm-task-list-item@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-extension-gfm-task-list-item@npm:2.0.1" + dependencies: + devlop: "npm:^1.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/16a55040a1697339eeeeebaabbbe28dc9e8281979cdeec343a58dc97f7b447365d3e37329f394455c5d17902639b786c7669dbbc4ea558cf8680eb7808330598 + languageName: node + linkType: hard + +"micromark-extension-gfm@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-gfm@npm:3.0.0" + dependencies: + micromark-extension-gfm-autolink-literal: "npm:^2.0.0" + micromark-extension-gfm-footnote: "npm:^2.0.0" + micromark-extension-gfm-strikethrough: "npm:^2.0.0" + micromark-extension-gfm-table: "npm:^2.0.0" + micromark-extension-gfm-tagfilter: "npm:^2.0.0" + micromark-extension-gfm-task-list-item: "npm:^2.0.0" + micromark-util-combine-extensions: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/970e28df6ebdd7c7249f52a0dda56e0566fbfa9ae56c8eeeb2445d77b6b89d44096880cd57a1c01e7821b1f4e31009109fbaca4e89731bff7b83b8519690e5d9 + languageName: node + linkType: hard + +"micromark-extension-mdx-expression@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-mdx-expression@npm:3.0.0" + dependencies: + "@types/estree": "npm:^1.0.0" + devlop: "npm:^1.0.0" + micromark-factory-mdx-expression: "npm:^2.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-events-to-acorn: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/fa799c594d8ff9ecbbd28e226959c4928590cfcddb60a926d9d859d00fc7acd25684b6f78dbe6a7f0830879a402b4a3628efd40bb9df1f5846e6d2b7332715f7 + languageName: node + linkType: hard + +"micromark-extension-mdx-jsx@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-mdx-jsx@npm:3.0.0" + dependencies: + "@types/acorn": "npm:^4.0.0" + "@types/estree": "npm:^1.0.0" + devlop: "npm:^1.0.0" + estree-util-is-identifier-name: "npm:^3.0.0" + micromark-factory-mdx-expression: "npm:^2.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10c0/18a81c8def7f3a2088dc435bba19e649c19f679464b1a01e2c680f9518820e70fb0974b8403c790aee8f44205833a280b56ba157fe5a5b2903b476c5de5ba353 + languageName: node + linkType: hard + +"micromark-extension-mdx-md@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-mdx-md@npm:2.0.0" + dependencies: + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/bae91c61273de0e5ba80a980c03470e6cd9d7924aa936f46fbda15d780704d9386e945b99eda200e087b96254fbb4271a9545d5ce02676cd6ae67886a8bf82df + languageName: node + linkType: hard + +"micromark-extension-mdxjs-esm@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-mdxjs-esm@npm:3.0.0" + dependencies: + "@types/estree": "npm:^1.0.0" + devlop: "npm:^1.0.0" + micromark-core-commonmark: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-events-to-acorn: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + unist-util-position-from-estree: "npm:^2.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10c0/13e3f726495a960650cdedcba39198ace5bdc953ccb12c14d71fc9ed9bb88e40cc3ba9231e973f6984da3b3573e7ddb23ce409f7c16f52a8d57b608bf46c748d + languageName: node + linkType: hard + +"micromark-extension-mdxjs@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-mdxjs@npm:3.0.0" + dependencies: + acorn: "npm:^8.0.0" + acorn-jsx: "npm:^5.0.0" + micromark-extension-mdx-expression: "npm:^3.0.0" + micromark-extension-mdx-jsx: "npm:^3.0.0" + micromark-extension-mdx-md: "npm:^2.0.0" + micromark-extension-mdxjs-esm: "npm:^3.0.0" + micromark-util-combine-extensions: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/fd84f036ddad0aabbc12e7f1b3e9dcfe31573bbc413c5ae903779ef0366d7a4c08193547e7ba75718c9f45654e45f52e575cfc2f23a5f89205a8a70d9a506aea + languageName: node + linkType: hard + +"micromark-factory-destination@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-factory-destination@npm:2.0.0" + dependencies: + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/b73492f687d41a6a379159c2f3acbf813042346bcea523d9041d0cc6124e6715f0779dbb2a0b3422719e9764c3b09f9707880aa159557e3cb4aeb03b9d274915 + languageName: node + linkType: hard + +"micromark-factory-label@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-factory-label@npm:2.0.0" + dependencies: + devlop: "npm:^1.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/8ffad00487a7891941b1d1f51d53a33c7a659dcf48617edb7a4008dad7aff67ec316baa16d55ca98ae3d75ce1d81628dbf72fedc7c6f108f740dec0d5d21c8ee + languageName: node + linkType: hard + +"micromark-factory-mdx-expression@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-mdx-expression@npm:2.0.1" + dependencies: + "@types/estree": "npm:^1.0.0" + devlop: "npm:^1.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-events-to-acorn: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + unist-util-position-from-estree: "npm:^2.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10c0/d9cf475a73a7fbfa09aba0d057e033d57e45b7adff78692be9efb4405c4a1717ece4594a632f92a4302e4f8f2ae96355785b616e3f5b2fe8599ec24cfdeee12d + languageName: node + linkType: hard + +"micromark-factory-space@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-space@npm:1.1.0" + dependencies: + micromark-util-character: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10c0/3da81187ce003dd4178c7adc4674052fb8befc8f1a700ae4c8227755f38581a4ae963866dc4857488d62d1dc9837606c9f2f435fa1332f62a0f1c49b83c6a822 + languageName: node + linkType: hard + +"micromark-factory-space@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-factory-space@npm:2.0.0" + dependencies: + micromark-util-character: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/103ca954dade963d4ff1d2f27d397833fe855ddc72590205022832ef68b775acdea67949000cee221708e376530b1de78c745267b0bf8366740840783eb37122 + languageName: node + linkType: hard + +"micromark-factory-title@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-factory-title@npm:2.0.0" + dependencies: + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/2b2188e7a011b1b001faf8c860286d246d5c3485ef8819270c60a5808f4c7613e49d4e481dbdff62600ef7acdba0f5100be2d125cbd2a15e236c26b3668a8ebd + languageName: node + linkType: hard + +"micromark-factory-whitespace@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-factory-whitespace@npm:2.0.0" + dependencies: + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/4e91baab0cc71873095134bd0e225d01d9786cde352701402d71b72d317973954754e8f9f1849901f165530e6421202209f4d97c460a27bb0808ec5a3fc3148c + languageName: node + linkType: hard + +"micromark-util-character@npm:^1.0.0, micromark-util-character@npm:^1.1.0": + version: 1.2.0 + resolution: "micromark-util-character@npm:1.2.0" + dependencies: + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10c0/3390a675a50731b58a8e5493cd802e190427f10fa782079b455b00f6b54e406e36882df7d4a3bd32b709f7a2c3735b4912597ebc1c0a99566a8d8d0b816e2cd4 + languageName: node + linkType: hard + +"micromark-util-character@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-util-character@npm:2.1.0" + dependencies: + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/fc37a76aaa5a5138191ba2bef1ac50c36b3bcb476522e98b1a42304ab4ec76f5b036a746ddf795d3de3e7004b2c09f21dd1bad42d161f39b8cfc0acd067e6373 + languageName: node + linkType: hard + +"micromark-util-chunked@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-chunked@npm:2.0.0" + dependencies: + micromark-util-symbol: "npm:^2.0.0" + checksum: 10c0/043b5f2abc8c13a1e2e4c378ead191d1a47ed9e0cd6d0fa5a0a430b2df9e17ada9d5de5a20688a000bbc5932507e746144acec60a9589d9a79fa60918e029203 + languageName: node + linkType: hard + +"micromark-util-classify-character@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-classify-character@npm:2.0.0" + dependencies: + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/2bf5fa5050faa9b69f6c7e51dbaaf02329ab70fabad8229984381b356afbbf69db90f4617bec36d814a7d285fb7cad8e3c4e38d1daf4387dc9e240aa7f9a292a + languageName: node + linkType: hard + +"micromark-util-combine-extensions@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-combine-extensions@npm:2.0.0" + dependencies: + micromark-util-chunked: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/cd4c8d1a85255527facb419ff3b3cc3d7b7f27005c5ef5fa7ef2c4d0e57a9129534fc292a188ec2d467c2c458642d369c5f894bc8a9e142aed6696cc7989d3ea + languageName: node + linkType: hard + +"micromark-util-decode-numeric-character-reference@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.1" + dependencies: + micromark-util-symbol: "npm:^2.0.0" + checksum: 10c0/3f6d684ee8f317c67806e19b3e761956256cb936a2e0533aad6d49ac5604c6536b2041769c6febdd387ab7175b7b7e551851bf2c1f78da943e7a3671ca7635ac + languageName: node + linkType: hard + +"micromark-util-decode-string@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-decode-string@npm:2.0.0" + dependencies: + decode-named-character-reference: "npm:^1.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-decode-numeric-character-reference: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + checksum: 10c0/f5413bebb21bdb686cfa1bcfa7e9c93093a523d1b42443ead303b062d2d680a94e5e8424549f57b8ba9d786a758e5a26a97f56068991bbdbca5d1885b3aa7227 + languageName: node + linkType: hard + +"micromark-util-encode@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-encode@npm:2.0.0" + checksum: 10c0/ebdaafff23100bbf4c74e63b4b1612a9ddf94cd7211d6a076bc6fb0bc32c1b48d6fb615aa0953e607c62c97d849f97f1042260d3eb135259d63d372f401bbbb2 + languageName: node + linkType: hard + +"micromark-util-events-to-acorn@npm:^2.0.0": + version: 2.0.2 + resolution: "micromark-util-events-to-acorn@npm:2.0.2" + dependencies: + "@types/acorn": "npm:^4.0.0" + "@types/estree": "npm:^1.0.0" + "@types/unist": "npm:^3.0.0" + devlop: "npm:^1.0.0" + estree-util-visit: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10c0/2bd2660a49efddb625e6adcabdc3384ae4c50c7a04270737270f4aab53d09e8253e6d2607cd947c4c77f8a9900278915babb240e61fd143dc5bab51d9fd50709 + languageName: node + linkType: hard + +"micromark-util-html-tag-name@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-html-tag-name@npm:2.0.0" + checksum: 10c0/988aa26367449bd345b627ae32cf605076daabe2dc1db71b578a8a511a47123e14af466bcd6dcbdacec60142f07bc2723ec5f7a0eed0f5319ce83b5e04825429 + languageName: node + linkType: hard + +"micromark-util-normalize-identifier@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-normalize-identifier@npm:2.0.0" + dependencies: + micromark-util-symbol: "npm:^2.0.0" + checksum: 10c0/93bf8789b8449538f22cf82ac9b196363a5f3b2f26efd98aef87c4c1b1f8c05be3ef6391ff38316ff9b03c1a6fd077342567598019ddd12b9bd923dacc556333 + languageName: node + linkType: hard + +"micromark-util-resolve-all@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-resolve-all@npm:2.0.0" + dependencies: + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/3b912e88453dcefe728a9080c8934a75ac4732056d6576ceecbcaf97f42c5d6fa2df66db8abdc8427eb167c5ffddefe26713728cfe500bc0e314ed260d6e2746 + languageName: node + linkType: hard + +"micromark-util-sanitize-uri@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-sanitize-uri@npm:2.0.0" + dependencies: + micromark-util-character: "npm:^2.0.0" + micromark-util-encode: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + checksum: 10c0/74763ca1c927dd520d3ab8fd9856a19740acf76fc091f0a1f5d4e99c8cd5f1b81c5a0be3efb564941a071fb6d85fd951103f2760eb6cff77b5ab3abe08341309 + languageName: node + linkType: hard + +"micromark-util-subtokenize@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-subtokenize@npm:2.0.0" + dependencies: + devlop: "npm:^1.0.0" + micromark-util-chunked: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/1907c56c4974d430b984c50b3eb0930241112d931e611f178dee17d58f2976614950631b70f4e9c7e49dbccf21f91654ee61f250e028bf2f2b0f3d3aeb168da8 + languageName: node + linkType: hard + +"micromark-util-symbol@npm:^1.0.0, micromark-util-symbol@npm:^1.0.1": + version: 1.1.0 + resolution: "micromark-util-symbol@npm:1.1.0" + checksum: 10c0/10ceaed33a90e6bfd3a5d57053dbb53f437d4809cc11430b5a09479c0ba601577059be9286df4a7eae6e350a60a2575dc9fa9d9872b5b8d058c875e075c33803 + languageName: node + linkType: hard + +"micromark-util-symbol@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-symbol@npm:2.0.0" + checksum: 10c0/4e76186c185ce4cefb9cea8584213d9ffacd77099d1da30c0beb09fa21f46f66f6de4c84c781d7e34ff763fe3a06b530e132fa9004882afab9e825238d0aa8b3 + languageName: node + linkType: hard + +"micromark-util-types@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-types@npm:1.1.0" + checksum: 10c0/a9749cb0a12a252ff536baabcb7012421b6fad4d91a5fdd80d7b33dc7b4c22e2d0c4637dfe5b902d00247fe6c9b01f4a24fce6b572b16ccaa4da90e6ce2a11e4 + languageName: node + linkType: hard + +"micromark-util-types@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-types@npm:2.0.0" + checksum: 10c0/d74e913b9b61268e0d6939f4209e3abe9dada640d1ee782419b04fd153711112cfaaa3c4d5f37225c9aee1e23c3bb91a1f5223e1e33ba92d33e83956a53e61de + languageName: node + linkType: hard + +"micromark@npm:^4.0.0": + version: 4.0.0 + resolution: "micromark@npm:4.0.0" + dependencies: + "@types/debug": "npm:^4.0.0" + debug: "npm:^4.0.0" + decode-named-character-reference: "npm:^1.0.0" + devlop: "npm:^1.0.0" + micromark-core-commonmark: "npm:^2.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-chunked: "npm:^2.0.0" + micromark-util-combine-extensions: "npm:^2.0.0" + micromark-util-decode-numeric-character-reference: "npm:^2.0.0" + micromark-util-encode: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + micromark-util-resolve-all: "npm:^2.0.0" + micromark-util-sanitize-uri: "npm:^2.0.0" + micromark-util-subtokenize: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/7e91c8d19ff27bc52964100853f1b3b32bb5b2ece57470a34ba1b2f09f4e2a183d90106c4ae585c9f2046969ee088576fed79b2f7061cba60d16652ccc2c64fd + languageName: node + linkType: hard + +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 + languageName: node + linkType: hard + +"mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-db@npm:~1.33.0": + version: 1.33.0 + resolution: "mime-db@npm:1.33.0" + checksum: 10c0/79172ce5468c8503b49dddfdddc18d3f5fe2599f9b5fe1bc321a8cbee14c96730fc6db22f907b23701b05b2936f865795f62ec3a78a7f3c8cb2450bb68c6763e + languageName: node + linkType: hard + +"mime-types@npm:2.1.18": + version: 2.1.18 + resolution: "mime-types@npm:2.1.18" + dependencies: + mime-db: "npm:~1.33.0" + checksum: 10c0/a96a8d12f4bb98bc7bfac6a8ccbd045f40368fc1030d9366050c3613825d3715d1c1f393e10a75a885d2cdc1a26cd6d5e11f3a2a0d5c4d361f00242139430a0f + languageName: node + linkType: hard + +"mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"mime@npm:1.6.0": + version: 1.6.0 + resolution: "mime@npm:1.6.0" + bin: + mime: cli.js + checksum: 10c0/b92cd0adc44888c7135a185bfd0dddc42c32606401c72896a842ae15da71eb88858f17669af41e498b463cd7eb998f7b48939a25b08374c7924a9c8a6f8a81b0 + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 + languageName: node + linkType: hard + +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 10c0/0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 + languageName: node + linkType: hard + +"mimic-response@npm:^4.0.0": + version: 4.0.0 + resolution: "mimic-response@npm:4.0.0" + checksum: 10c0/761d788d2668ae9292c489605ffd4fad220f442fbae6832adce5ebad086d691e906a6d5240c290293c7a11e99fbdbbef04abbbed498bf8699a4ee0f31315e3fb + languageName: node + linkType: hard + +"mini-css-extract-plugin@npm:^2.9.2": + version: 2.9.2 + resolution: "mini-css-extract-plugin@npm:2.9.2" + dependencies: + schema-utils: "npm:^4.0.0" + tapable: "npm:^2.2.1" + peerDependencies: + webpack: ^5.0.0 + checksum: 10c0/5d3218dbd7db48b572925ddac05162a7415bf81b321f1a0c07016ec643cb5720c8a836ae68d45f5de826097a3013b601706c9c5aacb7f610dc2041b271de2ce0 + languageName: node + linkType: hard + +"minimalistic-assert@npm:^1.0.0": + version: 1.0.1 + resolution: "minimalistic-assert@npm:1.0.1" + checksum: 10c0/96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd + languageName: node + linkType: hard + +"minimatch@npm:3.1.2, minimatch@npm:^3.1.1": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.3, minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed + languageName: node + linkType: hard + +"minimist@npm:^1.2.0, minimist@npm:^1.2.5": + version: 1.2.6 + resolution: "minimist@npm:1.2.6" + checksum: 10c0/d0b566204044481c4401abbd24cc75814e753b37268e7fe7ccc78612bf3e37bf1e45a6c43fb0b119445ea1c413c000bde013f320b7211974f2f49bcbec1d0dbf + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + languageName: node + linkType: hard + +"minipass-fetch@npm:^4.0.0": + version: 4.0.0 + resolution: "minipass-fetch@npm:4.0.0" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^3.0.1" + dependenciesMeta: + encoding: + optional: true + checksum: 10c0/7fa30ce7c373fb6f94c086b374fff1589fd7e78451855d2d06c2e2d9df936d131e73e952163063016592ed3081444bd8d1ea608533313b0149156ce23311da4b + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 + languageName: node + linkType: hard + +"minizlib@npm:^3.0.1": + version: 3.0.1 + resolution: "minizlib@npm:3.0.1" + dependencies: + minipass: "npm:^7.0.4" + rimraf: "npm:^5.0.5" + checksum: 10c0/82f8bf70da8af656909a8ee299d7ed3b3372636749d29e105f97f20e88971be31f5ed7642f2e898f00283b68b701cc01307401cdc209b0efc5dd3818220e5093 + languageName: node + linkType: hard + +"mkdirp@npm:^3.0.1": + version: 3.0.1 + resolution: "mkdirp@npm:3.0.1" + bin: + mkdirp: dist/cjs/src/bin.js + checksum: 10c0/9f2b975e9246351f5e3a40dcfac99fcd0baa31fbfab615fe059fb11e51f10e4803c63de1f384c54d656e4db31d000e4767e9ef076a22e12a641357602e31d57d + languageName: node + linkType: hard + +"mlly@npm:^1.7.4": + version: 1.7.4 + resolution: "mlly@npm:1.7.4" + dependencies: + acorn: "npm:^8.14.0" + pathe: "npm:^2.0.1" + pkg-types: "npm:^1.3.0" + ufo: "npm:^1.5.4" + checksum: 10c0/69e738218a13d6365caf930e0ab4e2b848b84eec261597df9788cefb9930f3e40667be9cb58a4718834ba5f97a6efeef31d3b5a95f4388143fd4e0d0deff72ff + languageName: node + linkType: hard + +"mrmime@npm:^2.0.0": + version: 2.0.0 + resolution: "mrmime@npm:2.0.0" + checksum: 10c0/312b35ed288986aec90955410b21ed7427fd1e4ee318cb5fc18765c8d029eeded9444faa46589e5b1ed6b35fb2054a802ac8dcb917ddf6b3e189cb3bf11a965c + languageName: node + linkType: hard + +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 10c0/f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc + languageName: node + linkType: hard + +"ms@npm:2.1.3, ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"multicast-dns@npm:^7.2.5": + version: 7.2.5 + resolution: "multicast-dns@npm:7.2.5" + dependencies: + dns-packet: "npm:^5.2.2" + thunky: "npm:^1.0.2" + bin: + multicast-dns: cli.js + checksum: 10c0/5120171d4bdb1577764c5afa96e413353bff530d1b37081cb29cccc747f989eb1baf40574fe8e27060fc1aef72b59c042f72b9b208413de33bcf411343c69057 + languageName: node + linkType: hard + +"nanoid@npm:^3.3.11": + version: 3.3.11 + resolution: "nanoid@npm:3.3.11" + bin: + nanoid: bin/nanoid.cjs + checksum: 10c0/40e7f70b3d15f725ca072dfc4f74e81fcf1fbb02e491cf58ac0c79093adc9b0a73b152bcde57df4b79cd097e13023d7504acb38404a4da7bc1cd8e887b82fe0b + languageName: node + linkType: hard + +"nanoid@npm:^3.3.7": + version: 3.3.8 + resolution: "nanoid@npm:3.3.8" + bin: + nanoid: bin/nanoid.cjs + checksum: 10c0/4b1bb29f6cfebf3be3bc4ad1f1296fb0a10a3043a79f34fbffe75d1621b4318319211cd420549459018ea3592f0d2f159247a6f874911d6d26eaaadda2478120 + languageName: node + linkType: hard + +"negotiator@npm:0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 + languageName: node + linkType: hard + +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b + languageName: node + linkType: hard + +"neo-async@npm:^2.6.2": + version: 2.6.2 + resolution: "neo-async@npm:2.6.2" + checksum: 10c0/c2f5a604a54a8ec5438a342e1f356dff4bc33ccccdb6dc668d94fe8e5eccfc9d2c2eea6064b0967a767ba63b33763f51ccf2cd2441b461a7322656c1f06b3f5d + languageName: node + linkType: hard + +"no-case@npm:^3.0.4": + version: 3.0.4 + resolution: "no-case@npm:3.0.4" + dependencies: + lower-case: "npm:^2.0.2" + tslib: "npm:^2.0.3" + checksum: 10c0/8ef545f0b3f8677c848f86ecbd42ca0ff3cd9dd71c158527b344c69ba14710d816d8489c746b6ca225e7b615108938a0bda0a54706f8c255933703ac1cf8e703 + languageName: node + linkType: hard + +"node-emoji@npm:^2.1.0": + version: 2.1.3 + resolution: "node-emoji@npm:2.1.3" + dependencies: + "@sindresorhus/is": "npm:^4.6.0" + char-regex: "npm:^1.0.2" + emojilib: "npm:^2.4.0" + skin-tone: "npm:^2.0.0" + checksum: 10c0/e688333373563aa8308df16111eee2b5837b53a51fb63bf8b7fbea2896327c5d24c9984eb0c8ca6ac155d4d9c194dcf1840d271033c1b588c7c45a3b65339ef7 + languageName: node + linkType: hard + +"node-forge@npm:^1": + version: 1.3.1 + resolution: "node-forge@npm:1.3.1" + checksum: 10c0/e882819b251a4321f9fc1d67c85d1501d3004b4ee889af822fd07f64de3d1a8e272ff00b689570af0465d65d6bf5074df9c76e900e0aff23e60b847f2a46fbe8 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 11.0.0 + resolution: "node-gyp@npm:11.0.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^14.0.3" + nopt: "npm:^8.0.0" + proc-log: "npm:^5.0.0" + semver: "npm:^7.3.5" + tar: "npm:^7.4.3" + which: "npm:^5.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/a3b885bbee2d271f1def32ba2e30ffcf4562a3db33af06b8b365e053153e2dd2051b9945783c3c8e852d26a0f20f65b251c7e83361623383a99635c0280ee573 + languageName: node + linkType: hard + +"node-releases@npm:^2.0.18": + version: 2.0.18 + resolution: "node-releases@npm:2.0.18" + checksum: 10c0/786ac9db9d7226339e1dc84bbb42007cb054a346bd9257e6aa154d294f01bc6a6cddb1348fa099f079be6580acbb470e3c048effd5f719325abd0179e566fd27 + languageName: node + linkType: hard + +"node-releases@npm:^2.0.19": + version: 2.0.19 + resolution: "node-releases@npm:2.0.19" + checksum: 10c0/52a0dbd25ccf545892670d1551690fe0facb6a471e15f2cfa1b20142a5b255b3aa254af5f59d6ecb69c2bec7390bc643c43aa63b13bf5e64b6075952e716b1aa + languageName: node + linkType: hard + +"nopt@npm:^8.0.0": + version: 8.0.0 + resolution: "nopt@npm:8.0.0" + dependencies: + abbrev: "npm:^2.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/19cb986f79abaca2d0f0b560021da7b32ee6fcc3de48f3eaeb0c324d36755c17754f886a754c091f01f740c17caf7d6aea8237b7fbaf39f476ae5e30a249f18f + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 + languageName: node + linkType: hard + +"normalize-range@npm:^0.1.2": + version: 0.1.2 + resolution: "normalize-range@npm:0.1.2" + checksum: 10c0/bf39b73a63e0a42ad1a48c2bd1bda5a07ede64a7e2567307a407674e595bcff0fa0d57e8e5f1e7fa5e91000797c7615e13613227aaaa4d6d6e87f5bd5cc95de6 + languageName: node + linkType: hard + +"normalize-url@npm:^8.0.0": + version: 8.0.1 + resolution: "normalize-url@npm:8.0.1" + checksum: 10c0/eb439231c4b84430f187530e6fdac605c5048ef4ec556447a10c00a91fc69b52d8d8298d9d608e68d3e0f7dc2d812d3455edf425e0f215993667c3183bcab1ef + languageName: node + linkType: hard + +"npm-run-path@npm:^4.0.1": + version: 4.0.1 + resolution: "npm-run-path@npm:4.0.1" + dependencies: + path-key: "npm:^3.0.0" + checksum: 10c0/6f9353a95288f8455cf64cbeb707b28826a7f29690244c1e4bb61ec573256e021b6ad6651b394eb1ccfd00d6ec50147253aba2c5fe58a57ceb111fad62c519ac + languageName: node + linkType: hard + +"nprogress@npm:^0.2.0": + version: 0.2.0 + resolution: "nprogress@npm:0.2.0" + checksum: 10c0/eab9a923a1ad1eed71a455ecfbc358442dd9bcd71b9fa3fa1c67eddf5159360b182c218f76fca320c97541a1b45e19ced04e6dcb044a662244c5419f8ae9e821 + languageName: node + linkType: hard + +"nth-check@npm:^2.0.1": + version: 2.1.1 + resolution: "nth-check@npm:2.1.1" + dependencies: + boolbase: "npm:^1.0.0" + checksum: 10c0/5fee7ff309727763689cfad844d979aedd2204a817fbaaf0e1603794a7c20db28548d7b024692f953557df6ce4a0ee4ae46cd8ebd9b36cfb300b9226b567c479 + languageName: node + linkType: hard + +"null-loader@npm:^4.0.1": + version: 4.0.1 + resolution: "null-loader@npm:4.0.1" + dependencies: + loader-utils: "npm:^2.0.0" + schema-utils: "npm:^3.0.0" + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: 10c0/fe9a74a928c9ddc1eab7be0e4322516439562d6efd6feeb0f7c61777d4b79a6a8e5a6bc8133deb59408f3f423bdf84c154a88168154a583154e9e33d544b4d42 + languageName: node + linkType: hard + +"object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 + languageName: node + linkType: hard + +"object-inspect@npm:^1.13.1": + version: 1.13.2 + resolution: "object-inspect@npm:1.13.2" + checksum: 10c0/b97835b4c91ec37b5fd71add84f21c3f1047d1d155d00c0fcd6699516c256d4fcc6ff17a1aced873197fe447f91a3964178fd2a67a1ee2120cdaf60e81a050b4 + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d + languageName: node + linkType: hard + +"object.assign@npm:^4.1.0": + version: 4.1.2 + resolution: "object.assign@npm:4.1.2" + dependencies: + call-bind: "npm:^1.0.0" + define-properties: "npm:^1.1.3" + has-symbols: "npm:^1.0.1" + object-keys: "npm:^1.1.1" + checksum: 10c0/ee0e796fad8952f05644d11632f046dc4b424f9a41d3816e11a612163b12a873c800456be9acdaec6221b72590ab5267e5fe4bf4cf1c67f88b05f82f133ac829 + languageName: node + linkType: hard + +"obuf@npm:^1.0.0, obuf@npm:^1.1.2": + version: 1.1.2 + resolution: "obuf@npm:1.1.2" + checksum: 10c0/520aaac7ea701618eacf000fc96ae458e20e13b0569845800fc582f81b386731ab22d55354b4915d58171db00e79cfcd09c1638c02f89577ef092b38c65b7d81 + languageName: node + linkType: hard + +"on-finished@npm:2.4.1": + version: 2.4.1 + resolution: "on-finished@npm:2.4.1" + dependencies: + ee-first: "npm:1.1.1" + checksum: 10c0/46fb11b9063782f2d9968863d9cbba33d77aa13c17f895f56129c274318b86500b22af3a160fe9995aa41317efcd22941b6eba747f718ced08d9a73afdb087b4 + languageName: node + linkType: hard + +"on-headers@npm:~1.0.2": + version: 1.0.2 + resolution: "on-headers@npm:1.0.2" + checksum: 10c0/f649e65c197bf31505a4c0444875db0258e198292f34b884d73c2f751e91792ef96bb5cf89aa0f4fecc2e4dc662461dda606b1274b0e564f539cae5d2f5fc32f + languageName: node + linkType: hard + +"once@npm:^1.3.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"onetime@npm:^5.1.2": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: "npm:^2.1.0" + checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f + languageName: node + linkType: hard + +"open@npm:^8.0.9, open@npm:^8.4.0": + version: 8.4.0 + resolution: "open@npm:8.4.0" + dependencies: + define-lazy-prop: "npm:^2.0.0" + is-docker: "npm:^2.1.1" + is-wsl: "npm:^2.2.0" + checksum: 10c0/585596580226cbeb7262f36b5acc7eed05211dc26980020a2527f829336b8b07fd79cdc4240f4d995b5615f635e0a59ebb0261c4419fef91edd5d4604c463f18 + languageName: node + linkType: hard + +"opener@npm:^1.5.2": + version: 1.5.2 + resolution: "opener@npm:1.5.2" + bin: + opener: bin/opener-bin.js + checksum: 10c0/dd56256ab0cf796585617bc28e06e058adf09211781e70b264c76a1dbe16e90f868c974e5bf5309c93469157c7d14b89c35dc53fe7293b0e40b4d2f92073bc79 + languageName: node + linkType: hard + +"p-cancelable@npm:^3.0.0": + version: 3.0.0 + resolution: "p-cancelable@npm:3.0.0" + checksum: 10c0/948fd4f8e87b956d9afc2c6c7392de9113dac817cb1cecf4143f7a3d4c57ab5673614a80be3aba91ceec5e4b69fd8c869852d7e8048bc3d9273c4c36ce14b9aa + languageName: node + linkType: hard + +"p-finally@npm:^1.0.0": + version: 1.0.0 + resolution: "p-finally@npm:1.0.0" + checksum: 10c0/6b8552339a71fe7bd424d01d8451eea92d379a711fc62f6b2fe64cad8a472c7259a236c9a22b4733abca0b5666ad503cb497792a0478c5af31ded793d00937e7 + languageName: node + linkType: hard + +"p-limit@npm:^4.0.0": + version: 4.0.0 + resolution: "p-limit@npm:4.0.0" + dependencies: + yocto-queue: "npm:^1.0.0" + checksum: 10c0/a56af34a77f8df2ff61ddfb29431044557fcbcb7642d5a3233143ebba805fc7306ac1d448de724352861cb99de934bc9ab74f0d16fe6a5460bdbdf938de875ad + languageName: node + linkType: hard + +"p-locate@npm:^6.0.0": + version: 6.0.0 + resolution: "p-locate@npm:6.0.0" + dependencies: + p-limit: "npm:^4.0.0" + checksum: 10c0/d72fa2f41adce59c198270aa4d3c832536c87a1806e0f69dffb7c1a7ca998fb053915ca833d90f166a8c082d3859eabfed95f01698a3214c20df6bb8de046312 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 + languageName: node + linkType: hard + +"p-map@npm:^7.0.2": + version: 7.0.3 + resolution: "p-map@npm:7.0.3" + checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c + languageName: node + linkType: hard + +"p-queue@npm:^6.6.2": + version: 6.6.2 + resolution: "p-queue@npm:6.6.2" + dependencies: + eventemitter3: "npm:^4.0.4" + p-timeout: "npm:^3.2.0" + checksum: 10c0/5739ecf5806bbeadf8e463793d5e3004d08bb3f6177bd1a44a005da8fd81bb90f80e4633e1fb6f1dfd35ee663a5c0229abe26aebb36f547ad5a858347c7b0d3e + languageName: node + linkType: hard + +"p-retry@npm:^4.5.0": + version: 4.6.2 + resolution: "p-retry@npm:4.6.2" + dependencies: + "@types/retry": "npm:0.12.0" + retry: "npm:^0.13.1" + checksum: 10c0/d58512f120f1590cfedb4c2e0c42cb3fa66f3cea8a4646632fcb834c56055bb7a6f138aa57b20cc236fb207c9d694e362e0b5c2b14d9b062f67e8925580c73b0 + languageName: node + linkType: hard + +"p-timeout@npm:^3.2.0": + version: 3.2.0 + resolution: "p-timeout@npm:3.2.0" + dependencies: + p-finally: "npm:^1.0.0" + checksum: 10c0/524b393711a6ba8e1d48137c5924749f29c93d70b671e6db761afa784726572ca06149c715632da8f70c090073afb2af1c05730303f915604fd38ee207b70a61 + languageName: node + linkType: hard + +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b + languageName: node + linkType: hard + +"package-json@npm:^8.1.0": + version: 8.1.1 + resolution: "package-json@npm:8.1.1" + dependencies: + got: "npm:^12.1.0" + registry-auth-token: "npm:^5.0.1" + registry-url: "npm:^6.0.0" + semver: "npm:^7.3.7" + checksum: 10c0/83b057878bca229033aefad4ef51569b484e63a65831ddf164dc31f0486817e17ffcb58c819c7af3ef3396042297096b3ffc04e107fd66f8f48756f6d2071c8f + languageName: node + linkType: hard + +"package-manager-detector@npm:^0.2.8": + version: 0.2.11 + resolution: "package-manager-detector@npm:0.2.11" + dependencies: + quansync: "npm:^0.2.7" + checksum: 10c0/247991de461b9e731f3463b7dae9ce187e53095b7b94d7d96eec039abf418b61ccf74464bec1d0c11d97311f33472e77baccd4c5898f77358da4b5b33395e0b1 + languageName: node + linkType: hard + +"param-case@npm:^3.0.4": + version: 3.0.4 + resolution: "param-case@npm:3.0.4" + dependencies: + dot-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/ccc053f3019f878eca10e70ec546d92f51a592f762917dafab11c8b532715dcff58356118a6f350976e4ab109e321756f05739643ed0ca94298e82291e6f9e76 + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: "npm:^3.0.0" + checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 + languageName: node + linkType: hard + +"parse-entities@npm:^4.0.0": + version: 4.0.1 + resolution: "parse-entities@npm:4.0.1" + dependencies: + "@types/unist": "npm:^2.0.0" + character-entities: "npm:^2.0.0" + character-entities-legacy: "npm:^3.0.0" + character-reference-invalid: "npm:^2.0.0" + decode-named-character-reference: "npm:^1.0.0" + is-alphanumerical: "npm:^2.0.0" + is-decimal: "npm:^2.0.0" + is-hexadecimal: "npm:^2.0.0" + checksum: 10c0/9dfa3b0dc43a913c2558c4bd625b1abcc2d6c6b38aa5724b141ed988471977248f7ad234eed57e1bc70b694dd15b0d710a04f66c2f7c096e35abd91962b7d926 + languageName: node + linkType: hard + +"parse-json@npm:^5.2.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": "npm:^7.0.0" + error-ex: "npm:^1.3.1" + json-parse-even-better-errors: "npm:^2.3.0" + lines-and-columns: "npm:^1.1.6" + checksum: 10c0/77947f2253005be7a12d858aedbafa09c9ae39eb4863adf330f7b416ca4f4a08132e453e08de2db46459256fb66afaac5ee758b44fe6541b7cdaf9d252e59585 + languageName: node + linkType: hard + +"parse-numeric-range@npm:^1.3.0": + version: 1.3.0 + resolution: "parse-numeric-range@npm:1.3.0" + checksum: 10c0/53465afaa92111e86697281b684aa4574427360889cc23a1c215488c06b72441febdbf09f47ab0bef9a0c701e059629f3eebd2fe6fb241a254ad7a7a642aebe8 + languageName: node + linkType: hard + +"parse5-htmlparser2-tree-adapter@npm:^7.0.0": + version: 7.0.0 + resolution: "parse5-htmlparser2-tree-adapter@npm:7.0.0" + dependencies: + domhandler: "npm:^5.0.2" + parse5: "npm:^7.0.0" + checksum: 10c0/e820cacb8486e6f7ede403327d18480df086d70e32ede2f6654d8c3a8b4b8dc4a4d5c21c03c18a92ba2466c513b93ca63be4a138dd73cd0995f384eb3b9edf11 + languageName: node + linkType: hard + +"parse5@npm:^7.0.0": + version: 7.0.0 + resolution: "parse5@npm:7.0.0" + dependencies: + entities: "npm:^4.3.0" + checksum: 10c0/10fc17755a7b81279da53988f56d2d0d8b1b832dd1c4df14e2f25d4f15cd363e9ee781428785da3780b32114c8e9eec11a2b68e00e0cea16e9ee839756118c41 + languageName: node + linkType: hard + +"parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": + version: 1.3.3 + resolution: "parseurl@npm:1.3.3" + checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 + languageName: node + linkType: hard + +"pascal-case@npm:^3.1.2": + version: 3.1.2 + resolution: "pascal-case@npm:3.1.2" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/05ff7c344809fd272fc5030ae0ee3da8e4e63f36d47a1e0a4855ca59736254192c5a27b5822ed4bae96e54048eec5f6907713cfcfff7cdf7a464eaf7490786d8 + languageName: node + linkType: hard + +"path-data-parser@npm:0.1.0, path-data-parser@npm:^0.1.0": + version: 0.1.0 + resolution: "path-data-parser@npm:0.1.0" + checksum: 10c0/ba22d54669a8bc4a3df27431fe667900685585d1196085b803d0aa4066b83e709bbf2be7c1d2b56e706b49cc698231d55947c22abbfc4843ca424bbf8c985745 + languageName: node + linkType: hard + +"path-exists@npm:^5.0.0": + version: 5.0.0 + resolution: "path-exists@npm:5.0.0" + checksum: 10c0/b170f3060b31604cde93eefdb7392b89d832dfbc1bed717c9718cbe0f230c1669b7e75f87e19901da2250b84d092989a0f9e44d2ef41deb09aa3ad28e691a40a + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + languageName: node + linkType: hard + +"path-is-inside@npm:1.0.2": + version: 1.0.2 + resolution: "path-is-inside@npm:1.0.2" + checksum: 10c0/7fdd4b41672c70461cce734fc222b33e7b447fa489c7c4377c95e7e6852d83d69741f307d88ec0cc3b385b41cb4accc6efac3c7c511cd18512e95424f5fa980c + languageName: node + linkType: hard + +"path-key@npm:^3.0.0, path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d + languageName: node + linkType: hard + +"path-to-regexp@npm:0.1.10": + version: 0.1.10 + resolution: "path-to-regexp@npm:0.1.10" + checksum: 10c0/34196775b9113ca6df88e94c8d83ba82c0e1a2063dd33bfe2803a980da8d49b91db8104f49d5191b44ea780d46b8670ce2b7f4a5e349b0c48c6779b653f1afe4 + languageName: node + linkType: hard + +"path-to-regexp@npm:3.3.0": + version: 3.3.0 + resolution: "path-to-regexp@npm:3.3.0" + checksum: 10c0/ffa0ebe7088d38d435a8d08b0fe6e8c93ceb2a81a65d4dd1d9a538f52e09d5e3474ed5f553cb3b180d894b0caa10698a68737ab599fd1e56b4663d1a64c9f77b + languageName: node + linkType: hard + +"path-to-regexp@npm:^1.7.0": + version: 1.9.0 + resolution: "path-to-regexp@npm:1.9.0" + dependencies: + isarray: "npm:0.0.1" + checksum: 10c0/de9ddb01b84d9c2c8e2bed18630d8d039e2d6f60a6538595750fa08c7a6482512257464c8da50616f266ab2cdd2428387e85f3b089e4c3f25d0c537e898a0751 + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 10c0/666f6973f332f27581371efaf303fd6c272cc43c2057b37aa99e3643158c7e4b2626549555d88626e99ea9e046f82f32e41bbde5f1508547e9a11b149b52387c + languageName: node + linkType: hard + +"pathe@npm:^2.0.1, pathe@npm:^2.0.3": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 10c0/c118dc5a8b5c4166011b2b70608762e260085180bb9e33e80a50dcdb1e78c010b1624f4280c492c92b05fc276715a4c357d1f9edc570f8f1b3d90b6839ebaca1 + languageName: node + linkType: hard + +"periscopic@npm:^3.0.0": + version: 3.1.0 + resolution: "periscopic@npm:3.1.0" + dependencies: + "@types/estree": "npm:^1.0.0" + estree-walker: "npm:^3.0.0" + is-reference: "npm:^3.0.0" + checksum: 10c0/fb5ce7cd810c49254cdf1cd3892811e6dd1a1dfbdf5f10a0a33fb7141baac36443c4cad4f0e2b30abd4eac613f6ab845c2bc1b7ce66ae9694c7321e6ada5bd96 + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0": + version: 1.1.0 + resolution: "picocolors@npm:1.1.0" + checksum: 10c0/86946f6032148801ef09c051c6fb13b5cf942eaf147e30ea79edb91dd32d700934edebe782a1078ff859fb2b816792e97ef4dab03d7f0b804f6b01a0df35e023 + languageName: node + linkType: hard + +"picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be + languageName: node + linkType: hard + +"pkg-dir@npm:^7.0.0": + version: 7.0.0 + resolution: "pkg-dir@npm:7.0.0" + dependencies: + find-up: "npm:^6.3.0" + checksum: 10c0/1afb23d2efb1ec9d8b2c4a0c37bf146822ad2774f074cb05b853be5dca1b40815c5960dd126df30ab8908349262a266f31b771e877235870a3b8fd313beebec5 + languageName: node + linkType: hard + +"pkg-types@npm:^1.3.0": + version: 1.3.1 + resolution: "pkg-types@npm:1.3.1" + dependencies: + confbox: "npm:^0.1.8" + mlly: "npm:^1.7.4" + pathe: "npm:^2.0.1" + checksum: 10c0/19e6cb8b66dcc66c89f2344aecfa47f2431c988cfa3366bdfdcfb1dd6695f87dcce37fbd90fe9d1605e2f4440b77f391e83c23255347c35cf84e7fd774d7fcea + languageName: node + linkType: hard + +"pkg-types@npm:^2.0.1": + version: 2.1.0 + resolution: "pkg-types@npm:2.1.0" + dependencies: + confbox: "npm:^0.2.1" + exsolve: "npm:^1.0.1" + pathe: "npm:^2.0.3" + checksum: 10c0/7729d0a2367ba0aa2caf0f84a6ff0b73b13f4e9a3d62c229ddfa6d45d1f3898f590acdbaa64d779d56737d4ebea2d085961efd59094b8adf8baa34d829599b75 + languageName: node + linkType: hard + +"points-on-curve@npm:0.2.0, points-on-curve@npm:^0.2.0": + version: 0.2.0 + resolution: "points-on-curve@npm:0.2.0" + checksum: 10c0/f0d92343fcc2ad1f48334633e580574c1e0e28038a756133e171e537f270d6d64203feada5ee556e36f448a1b46e0306dee07b30f589f4e3ad720f6ee38ef48c + languageName: node + linkType: hard + +"points-on-path@npm:^0.2.1": + version: 0.2.1 + resolution: "points-on-path@npm:0.2.1" + dependencies: + path-data-parser: "npm:0.1.0" + points-on-curve: "npm:0.2.0" + checksum: 10c0/a7010340f9f196976f61838e767bb7b0b7f6273ab4fb9eb37c61001fe26fbfc3fcd63c96d5e85b9a4ab579213ab366f2ddaaf60e2a9253e2b91a62db33f395ba + languageName: node + linkType: hard + +"postcss-attribute-case-insensitive@npm:^7.0.1": + version: 7.0.1 + resolution: "postcss-attribute-case-insensitive@npm:7.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/48945abe2024e2d2e4c37d30b8c1aaf37af720f24f6a996f7ea7e7ed33621f5c22cf247ed22028c0c922de040c58c0802729bc39b903cb1693f4b63c0b49da34 + languageName: node + linkType: hard + +"postcss-calc@npm:^9.0.1": + version: 9.0.1 + resolution: "postcss-calc@npm:9.0.1" + dependencies: + postcss-selector-parser: "npm:^6.0.11" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.2.2 + checksum: 10c0/e0df07337162dbcaac5d6e030c7fd289e21da8766a9daca5d6b2b3c8094bb524ae5d74c70048ea7fe5fe4960ce048c60ac97922d917c3bbff34f58e9d2b0eb0e + languageName: node + linkType: hard + +"postcss-clamp@npm:^4.1.0": + version: 4.1.0 + resolution: "postcss-clamp@npm:4.1.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.6 + checksum: 10c0/701261026b38a4c27b3c3711635fac96005f36d3270adb76dbdb1eebc950fc841db45283ee66068a7121565592e9d7967d5534e15b6e4dd266afcabf9eafa905 + languageName: node + linkType: hard + +"postcss-color-functional-notation@npm:^7.0.10": + version: 7.0.10 + resolution: "postcss-color-functional-notation@npm:7.0.10" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/62ee77ef220488cfb4a1c5af4f5203a0c2951c8a0613088ffc946130d48b63ca28ab67b18ed380a288a7ce51c2360a75d8d08d2db389e48f4ebb78a3e52d15b6 + languageName: node + linkType: hard + +"postcss-color-hex-alpha@npm:^10.0.0": + version: 10.0.0 + resolution: "postcss-color-hex-alpha@npm:10.0.0" + dependencies: + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/8a6dcb27403d04b55d6de88bf3074622bcea537fc4436bbcb346e92289c4d17059444e2e6c3554c325e7a777bb4cdc711e764a83123b4000aec211052e957d5b + languageName: node + linkType: hard + +"postcss-color-rebeccapurple@npm:^10.0.0": + version: 10.0.0 + resolution: "postcss-color-rebeccapurple@npm:10.0.0" + dependencies: + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/308e33f76f2b48c1c2121d4502fc053e869f3415898de7d30314353df680e79b37497e7b628e3447edc1049091da3672f7d891e45604f238598e846e06b893ed + languageName: node + linkType: hard + +"postcss-colormin@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-colormin@npm:6.1.0" + dependencies: + browserslist: "npm:^4.23.0" + caniuse-api: "npm:^3.0.0" + colord: "npm:^2.9.3" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/0802963fa0d8f2fe408b2e088117670f5303c69a58c135f0ecf0e5ceff69e95e87111b22c4e29c9adb2f69aa8d3bc175f4e8e8708eeb99c9ffc36c17064de427 + languageName: node + linkType: hard + +"postcss-convert-values@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-convert-values@npm:6.1.0" + dependencies: + browserslist: "npm:^4.23.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/a80066965cb58fe8fcaf79f306b32c83fc678e1f0678e43f4db3e9fee06eed6db92cf30631ad348a17492769d44757400493c91a33ee865ee8dedea9234a11f5 + languageName: node + linkType: hard + +"postcss-custom-media@npm:^11.0.6": + version: 11.0.6 + resolution: "postcss-custom-media@npm:11.0.6" + dependencies: + "@csstools/cascade-layer-name-parser": "npm:^2.0.5" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/media-query-list-parser": "npm:^4.0.3" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/62dcb2858fd490d90aab32062621d58892a7b2a54948ee63af81a2cd61807a11815d28d4ef6bc800c5e142ac73098f7e56822c7cc63192eb20d5b16071543a73 + languageName: node + linkType: hard + +"postcss-custom-properties@npm:^14.0.6": + version: 14.0.6 + resolution: "postcss-custom-properties@npm:14.0.6" + dependencies: + "@csstools/cascade-layer-name-parser": "npm:^2.0.5" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/0eeef77bc713551f5cb8fa5982d24da4e854075f3af020f1c94366c47a23a4cc225ebfecc978bdb17f00ee0bdee9d2c784e0d01adc64a447321e408abbe2c83b + languageName: node + linkType: hard + +"postcss-custom-selectors@npm:^8.0.5": + version: 8.0.5 + resolution: "postcss-custom-selectors@npm:8.0.5" + dependencies: + "@csstools/cascade-layer-name-parser": "npm:^2.0.5" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/bd8f2f85bbec4bd56ff408cb699d9fe649e2af0db82d5752eee05481ae522f06f5a47950ca22fcb4c8601071c03346df67cf20b0b0bcade32ce58d07ebaf9b32 + languageName: node + linkType: hard + +"postcss-dir-pseudo-class@npm:^9.0.1": + version: 9.0.1 + resolution: "postcss-dir-pseudo-class@npm:9.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/da9d3387648c5c3161a653d354c8f3e70a299108df3977e8aa65cf10793e4dd58a2711b3426cd63716245b13584ca8d95adcd6e10e3c9adbc61d08743e2d8690 + languageName: node + linkType: hard + +"postcss-discard-comments@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-discard-comments@npm:6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/338a1fcba7e2314d956e5e5b9bd1e12e6541991bf85ac72aed6e229a029bf60edb31f11576b677623576169aa7d9c75e1be259ac7b50d0b735b841b5518f9da9 + languageName: node + linkType: hard + +"postcss-discard-duplicates@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-discard-duplicates@npm:6.0.3" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/24d2f00e54668f2837eb38a64b1751d7a4a73b2752f9749e61eb728f1fae837984bc2b339f7f5207aff5f66f72551253489114b59b9ba21782072677a81d7d1b + languageName: node + linkType: hard + +"postcss-discard-empty@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-discard-empty@npm:6.0.3" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/1af08bb29f18eda41edf3602b257d89a4cf0a16f79fc773cfebd4a37251f8dbd9b77ac18efe55d0677d000b43a8adf2ef9328d31961c810e9433a38494a1fa65 + languageName: node + linkType: hard + +"postcss-discard-overridden@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-discard-overridden@npm:6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/fda70ef3cd4cb508369c5bbbae44d7760c40ec9f2e65df1cd1b6e0314317fb1d25ae7f64987ca84e66889c1e9d1862487a6ce391c159dfe04d536597bfc5030d + languageName: node + linkType: hard + +"postcss-discard-unused@npm:^6.0.5": + version: 6.0.5 + resolution: "postcss-discard-unused@npm:6.0.5" + dependencies: + postcss-selector-parser: "npm:^6.0.16" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/fca82f17395a7fcc78eab4e03dfb05958beb240c10cacb3836b832c6ea99f5259980c70890a9b7d8b67adf8071b61f3fcf1b432c7a116397aaf67909366da5cc + languageName: node + linkType: hard + +"postcss-double-position-gradients@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-double-position-gradients@npm:6.0.2" + dependencies: + "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/7b4759813f99039c6a7c8e70b46ff4c34c27e723a9ff7f0e1044e293d568357e1d39233f94b1bf3b2768b1207348138faea0781086a66b7b8e39e780657da523 + languageName: node + linkType: hard + +"postcss-focus-visible@npm:^10.0.1": + version: 10.0.1 + resolution: "postcss-focus-visible@npm:10.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/c5ecc8536a708a49a99d0abd68a88a160664e6c832c808db8edd9f0221e7017a258daa87e49daf2cb098cb037005d46cf492403c8c9c92ad8835d30adaccf665 + languageName: node + linkType: hard + +"postcss-focus-within@npm:^9.0.1": + version: 9.0.1 + resolution: "postcss-focus-within@npm:9.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/d6ab49d2a7f33485a9e137dc77ec92c5619a3ec92e1e672734fc604853ff1f3c0c189085c12461614be4fcb03ea0347d91791a45986a18d50b5228d161eda57a + languageName: node + linkType: hard + +"postcss-font-variant@npm:^5.0.0": + version: 5.0.0 + resolution: "postcss-font-variant@npm:5.0.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/ccc96460cf6a52b5439c26c9a5ea0589882e46161e3c2331d4353de7574448f5feef667d1a68f7f39b9fe3ee75d85957383ae82bbfcf87c3162c7345df4a444e + languageName: node + linkType: hard + +"postcss-gap-properties@npm:^6.0.0": + version: 6.0.0 + resolution: "postcss-gap-properties@npm:6.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/4e07e0d3927d0e65d67eaf047ac39e08d39cb1bf74e16e10c7df7f0d01b184a77ea59f63fd5691b5ed6df159970b972db28cb784d883e26e981137696460897d + languageName: node + linkType: hard + +"postcss-image-set-function@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-image-set-function@npm:7.0.0" + dependencies: + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/913fd9492f00122aa0c2550fb0d72130428cbe1e6465bc65e8fe71e9deb10ac0c01d7caceb68b560da759139e8cbc6c90ed22dfe6cf34949af49bb86bcbf4d3a + languageName: node + linkType: hard + +"postcss-lab-function@npm:^7.0.10": + version: 7.0.10 + resolution: "postcss-lab-function@npm:7.0.10" + dependencies: + "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/3e235b52f6c119937a0b41aa351f5f9ef6e17bf1b868e7068c9a04f3d31c247d0296c862388febb7fec5102d81413ccade8a4788904289afd34aa072de71390b + languageName: node + linkType: hard + +"postcss-loader@npm:^7.3.4": + version: 7.3.4 + resolution: "postcss-loader@npm:7.3.4" + dependencies: + cosmiconfig: "npm:^8.3.5" + jiti: "npm:^1.20.0" + semver: "npm:^7.5.4" + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + checksum: 10c0/1bf7614aeea9ad1f8ee6be3a5451576c059391688ea67f825aedc2674056369597faeae4e4a81fe10843884c9904a71403d9a54197e1f560e8fbb9e61f2a2680 + languageName: node + linkType: hard + +"postcss-logical@npm:^8.1.0": + version: 8.1.0 + resolution: "postcss-logical@npm:8.1.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/0e2e9e901d8a550db7f682d46b1f7e4f363c1ada061dc8e4548e2b563c5e39f3684a2d7c3f11fe061188782bca37874e34967fc6179fa6d98a49ff66a0076d27 + languageName: node + linkType: hard + +"postcss-merge-idents@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-merge-idents@npm:6.0.3" + dependencies: + cssnano-utils: "npm:^4.0.2" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/fdb51d971df33218bd5fdd9619e5a4d854e23affcea51f96bf4391260cb8d0bec937854582fa9a19bde1fa1b2a43fa5a2f179da23a3adeb8e8d292a4749a8ed7 + languageName: node + linkType: hard + +"postcss-merge-longhand@npm:^6.0.5": + version: 6.0.5 + resolution: "postcss-merge-longhand@npm:6.0.5" + dependencies: + postcss-value-parser: "npm:^4.2.0" + stylehacks: "npm:^6.1.1" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/5a223a7f698c05ab42e9997108a7ff27ea1e0c33a11a353d65a04fc89c3b5b750b9e749550d76b6406329117a055adfc79dde7fee48dca5c8e167a2854ae3fea + languageName: node + linkType: hard + +"postcss-merge-rules@npm:^6.1.1": + version: 6.1.1 + resolution: "postcss-merge-rules@npm:6.1.1" + dependencies: + browserslist: "npm:^4.23.0" + caniuse-api: "npm:^3.0.0" + cssnano-utils: "npm:^4.0.2" + postcss-selector-parser: "npm:^6.0.16" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/6d8952dbb19b1e59bf5affe0871fa1be6515103466857cff5af879d6cf619659f8642ec7a931cabb7cdbd393d8c1e91748bf70bee70fa3edea010d4e25786d04 + languageName: node + linkType: hard + +"postcss-minify-font-values@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-minify-font-values@npm:6.1.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/0d6567170c22a7db42096b5eac298f041614890fbe01759a9fa5ccda432f2bb09efd399d92c11bf6675ae13ccd259db4602fad3c358317dee421df5f7ab0a003 + languageName: node + linkType: hard + +"postcss-minify-gradients@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-minify-gradients@npm:6.0.3" + dependencies: + colord: "npm:^2.9.3" + cssnano-utils: "npm:^4.0.2" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/7fcbcec94fe5455b89fe1b424a451198e60e0407c894bbacdc062d9fdef2f8571b483b5c3bb17f22d2f1249431251b2de22e1e4e8b0614d10624f8ee6e71afd2 + languageName: node + linkType: hard + +"postcss-minify-params@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-minify-params@npm:6.1.0" + dependencies: + browserslist: "npm:^4.23.0" + cssnano-utils: "npm:^4.0.2" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/e5c38c3e5fb42e2ca165764f983716e57d854a63a477f7389ccc94cd2ab8123707006613bd7f29acc6eafd296fff513aa6d869c98ac52590f886d641cb21a59e + languageName: node + linkType: hard + +"postcss-minify-selectors@npm:^6.0.4": + version: 6.0.4 + resolution: "postcss-minify-selectors@npm:6.0.4" + dependencies: + postcss-selector-parser: "npm:^6.0.16" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/695ec2e1e3a7812b0cabe1105d0ed491760be3d8e9433914fb5af1fc30a84e6dc24089cd31b7e300de620b8e7adf806526c1acf8dd14077a7d1d2820c60a327c + languageName: node + linkType: hard + +"postcss-modules-extract-imports@npm:^3.1.0": + version: 3.1.0 + resolution: "postcss-modules-extract-imports@npm:3.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/402084bcab376083c4b1b5111b48ec92974ef86066f366f0b2d5b2ac2b647d561066705ade4db89875a13cb175b33dd6af40d16d32b2ea5eaf8bac63bd2bf219 + languageName: node + linkType: hard + +"postcss-modules-local-by-default@npm:^4.0.5": + version: 4.2.0 + resolution: "postcss-modules-local-by-default@npm:4.2.0" + dependencies: + icss-utils: "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" + postcss-value-parser: "npm:^4.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/b0b83feb2a4b61f5383979d37f23116c99bc146eba1741ca3cf1acca0e4d0dbf293ac1810a6ab4eccbe1ee76440dd0a9eb2db5b3bba4f99fc1b3ded16baa6358 + languageName: node + linkType: hard + +"postcss-modules-scope@npm:^3.2.0": + version: 3.2.1 + resolution: "postcss-modules-scope@npm:3.2.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/bd2d81f79e3da0ef6365b8e2c78cc91469d05b58046b4601592cdeef6c4050ed8fe1478ae000a1608042fc7e692cb51fecbd2d9bce3f4eace4d32e883ffca10b + languageName: node + linkType: hard + +"postcss-modules-values@npm:^4.0.0": + version: 4.0.0 + resolution: "postcss-modules-values@npm:4.0.0" + dependencies: + icss-utils: "npm:^5.0.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/dd18d7631b5619fb9921b198c86847a2a075f32e0c162e0428d2647685e318c487a2566cc8cc669fc2077ef38115cde7a068e321f46fb38be3ad49646b639dbc + languageName: node + linkType: hard + +"postcss-nesting@npm:^13.0.2": + version: 13.0.2 + resolution: "postcss-nesting@npm:13.0.2" + dependencies: + "@csstools/selector-resolve-nested": "npm:^3.1.0" + "@csstools/selector-specificity": "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/bfa0578b3b686c6374f5a7b2f6ef955cb7e13400de95a919975a982ae43c1e25db37385618f210715ff15393dc7ff8c26c7b156f06b8fb3118a426099cf7f1f2 + languageName: node + linkType: hard + +"postcss-normalize-charset@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-charset@npm:6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/af32a3b4cf94163d728b8aa935b2494c9f69fbc96a33b35f67ae15dbdef7fcc8732569df97cbaaf20ca6c0103c39adad0cfce2ba07ffed283796787f6c36f410 + languageName: node + linkType: hard + +"postcss-normalize-display-values@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-display-values@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/782761850c7e697fdb6c3ff53076de716a71b60f9e835efb2f7ef238de347c88b5d55f0d43cf5c608e1ee58de65360e3d9fccd5f20774bba08ded7c87d8a5651 + languageName: node + linkType: hard + +"postcss-normalize-positions@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-positions@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/9fdd42a47226bbda5f68774f3c4c3a90eb4fa708aef5a997c6a52fe6cac06585c9774038fe3bc1aa86a203c29223b8d8db6ebe7580c1aa293154f2b48db0b038 + languageName: node + linkType: hard + +"postcss-normalize-repeat-style@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-repeat-style@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/9133ccbdf1286920c1cd0d01c1c5fa0bd3251b717f2f3e47d691dcc44978ac1dc419d20d9ae5428bd48ee542059e66b823ba699356f5968ccced5606c7c7ca34 + languageName: node + linkType: hard + +"postcss-normalize-string@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-string@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/fecc2d52c4029b24fecf2ca2fb45df5dbdf9f35012194ad4ea80bc7be3252cdcb21a0976400902320595aa6178f2cc625cc804c6b6740aef6efa42105973a205 + languageName: node + linkType: hard + +"postcss-normalize-timing-functions@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-timing-functions@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/a22af0b3374704e59ae70bbbcc66b7029137e284f04e30a2ad548818d1540d6c1ed748dd8f689b9b6df5c1064085a00ad07b6f7e25ffaad49d4e661b616cdeae + languageName: node + linkType: hard + +"postcss-normalize-unicode@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-normalize-unicode@npm:6.1.0" + dependencies: + browserslist: "npm:^4.23.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/ff5746670d94dd97b49a0955c3c71ff516fb4f54bbae257f877d179bacc44a62e50a0fd6e7ddf959f2ca35c335de4266b0c275d880bb57ad7827189339ab1582 + languageName: node + linkType: hard + +"postcss-normalize-url@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-url@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/4718f1c0657788d2c560b340ee8e0a4eb3eb053eba6fbbf489e9a6e739b4c5f9ce1957f54bd03497c50a1f39962bf6ab9ff6ba4976b69dd160f6afd1670d69b7 + languageName: node + linkType: hard + +"postcss-normalize-whitespace@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-normalize-whitespace@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/d5275a88e29a894aeb83a2a833e816d2456dbf3f39961628df596ce205dcc4895186a023812ff691945e0804241ccc53e520d16591b5812288474b474bbaf652 + languageName: node + linkType: hard + +"postcss-opacity-percentage@npm:^3.0.0": + version: 3.0.0 + resolution: "postcss-opacity-percentage@npm:3.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/15c7d66036fa966d265c8737196646b3f93deb83d4eea0b17ed5033460599afc31d3a989345e4d7c472963b2a2bb75c83d06979d5d30d6a60fcc7f74cb6d8d40 + languageName: node + linkType: hard + +"postcss-ordered-values@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-ordered-values@npm:6.0.2" + dependencies: + cssnano-utils: "npm:^4.0.2" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/aece23a289228aa804217a85f8da198d22b9123f02ca1310b81834af380d6fbe115e4300683599b4a2ab7f1c6a1dbd6789724c47c38e2b0a3774f2ea4b4f0963 + languageName: node + linkType: hard + +"postcss-overflow-shorthand@npm:^6.0.0": + version: 6.0.0 + resolution: "postcss-overflow-shorthand@npm:6.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/6598321b2ed0b68461135395bba9c7f76a4672617770df1e8487f459bc975f4ded6c3d37b6f72a44f4f77f7b6789e0c6f927e66dbbf1bcde1537167dbea39968 + languageName: node + linkType: hard + +"postcss-page-break@npm:^3.0.4": + version: 3.0.4 + resolution: "postcss-page-break@npm:3.0.4" + peerDependencies: + postcss: ^8 + checksum: 10c0/eaaf4d8922b35f2acd637eb059f7e2510b24d65eb8f31424799dd5a98447b6ef010b41880c26e78f818e00f842295638ec75f89d5d489067f53e3dd3db74a00f + languageName: node + linkType: hard + +"postcss-place@npm:^10.0.0": + version: 10.0.0 + resolution: "postcss-place@npm:10.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/ebb13deaac7648ba6042622375a31f78fbcc5209b7d196e478debbdf94525963fe621c932f4737a5b6b3d487af3b5ed6d059ed6193fdcbff6d3d5b150886ccc1 + languageName: node + linkType: hard + +"postcss-preset-env@npm:^10.2.1": + version: 10.2.3 + resolution: "postcss-preset-env@npm:10.2.3" + dependencies: + "@csstools/postcss-cascade-layers": "npm:^5.0.1" + "@csstools/postcss-color-function": "npm:^4.0.10" + "@csstools/postcss-color-mix-function": "npm:^3.0.10" + "@csstools/postcss-color-mix-variadic-function-arguments": "npm:^1.0.0" + "@csstools/postcss-content-alt-text": "npm:^2.0.6" + "@csstools/postcss-exponential-functions": "npm:^2.0.9" + "@csstools/postcss-font-format-keywords": "npm:^4.0.0" + "@csstools/postcss-gamut-mapping": "npm:^2.0.10" + "@csstools/postcss-gradients-interpolation-method": "npm:^5.0.10" + "@csstools/postcss-hwb-function": "npm:^4.0.10" + "@csstools/postcss-ic-unit": "npm:^4.0.2" + "@csstools/postcss-initial": "npm:^2.0.1" + "@csstools/postcss-is-pseudo-class": "npm:^5.0.3" + "@csstools/postcss-light-dark-function": "npm:^2.0.9" + "@csstools/postcss-logical-float-and-clear": "npm:^3.0.0" + "@csstools/postcss-logical-overflow": "npm:^2.0.0" + "@csstools/postcss-logical-overscroll-behavior": "npm:^2.0.0" + "@csstools/postcss-logical-resize": "npm:^3.0.0" + "@csstools/postcss-logical-viewport-units": "npm:^3.0.4" + "@csstools/postcss-media-minmax": "npm:^2.0.9" + "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^3.0.5" + "@csstools/postcss-nested-calc": "npm:^4.0.0" + "@csstools/postcss-normalize-display-values": "npm:^4.0.0" + "@csstools/postcss-oklab-function": "npm:^4.0.10" + "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/postcss-random-function": "npm:^2.0.1" + "@csstools/postcss-relative-color-syntax": "npm:^3.0.10" + "@csstools/postcss-scope-pseudo-class": "npm:^4.0.1" + "@csstools/postcss-sign-functions": "npm:^1.1.4" + "@csstools/postcss-stepped-value-functions": "npm:^4.0.9" + "@csstools/postcss-text-decoration-shorthand": "npm:^4.0.2" + "@csstools/postcss-trigonometric-functions": "npm:^4.0.9" + "@csstools/postcss-unset-value": "npm:^4.0.0" + autoprefixer: "npm:^10.4.21" + browserslist: "npm:^4.25.0" + css-blank-pseudo: "npm:^7.0.1" + css-has-pseudo: "npm:^7.0.2" + css-prefers-color-scheme: "npm:^10.0.0" + cssdb: "npm:^8.3.0" + postcss-attribute-case-insensitive: "npm:^7.0.1" + postcss-clamp: "npm:^4.1.0" + postcss-color-functional-notation: "npm:^7.0.10" + postcss-color-hex-alpha: "npm:^10.0.0" + postcss-color-rebeccapurple: "npm:^10.0.0" + postcss-custom-media: "npm:^11.0.6" + postcss-custom-properties: "npm:^14.0.6" + postcss-custom-selectors: "npm:^8.0.5" + postcss-dir-pseudo-class: "npm:^9.0.1" + postcss-double-position-gradients: "npm:^6.0.2" + postcss-focus-visible: "npm:^10.0.1" + postcss-focus-within: "npm:^9.0.1" + postcss-font-variant: "npm:^5.0.0" + postcss-gap-properties: "npm:^6.0.0" + postcss-image-set-function: "npm:^7.0.0" + postcss-lab-function: "npm:^7.0.10" + postcss-logical: "npm:^8.1.0" + postcss-nesting: "npm:^13.0.2" + postcss-opacity-percentage: "npm:^3.0.0" + postcss-overflow-shorthand: "npm:^6.0.0" + postcss-page-break: "npm:^3.0.4" + postcss-place: "npm:^10.0.0" + postcss-pseudo-class-any-link: "npm:^10.0.1" + postcss-replace-overflow-wrap: "npm:^4.0.0" + postcss-selector-not: "npm:^8.0.1" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/f3d2ea8b95083acad2cf74aca93904dd3158639bf692d1d471598b538e0c6b4447ae306e7bc1c2426dd465e7c9715373678855b7e211e194b507ef8184e83f99 + languageName: node + linkType: hard + +"postcss-pseudo-class-any-link@npm:^10.0.1": + version: 10.0.1 + resolution: "postcss-pseudo-class-any-link@npm:10.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/95e883996e87baf14fc09d25f9a763a2e9d599eb3b9c6b736e83a8c3d0b55841bcb886bccdf51b5b7fefc128cbd0187ad8841f59878f85bd1613642e592d7673 + languageName: node + linkType: hard + +"postcss-reduce-idents@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-reduce-idents@npm:6.0.3" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/d9f9209e52ebb3d1d7feefc0be24fc74792e064e0fdec99554f050c6b882c61073d5d40986c545061b30e5ead881615e92c965dc765d8d83b2dec10d6a664e1f + languageName: node + linkType: hard + +"postcss-reduce-initial@npm:^6.1.0": + version: 6.1.0 + resolution: "postcss-reduce-initial@npm:6.1.0" + dependencies: + browserslist: "npm:^4.23.0" + caniuse-api: "npm:^3.0.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/a8f28cf51ce9a1b9423cce1a01c1d7cbee90125930ec36435a0073e73aef402d90affe2fd3600c964b679cf738869fda447b95a9acce74414e9d67d5c6ba8646 + languageName: node + linkType: hard + +"postcss-reduce-transforms@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-reduce-transforms@npm:6.0.2" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/755ef27b3d083f586ac831f0c611a66e76f504d27e2100dc7674f6b86afad597901b4520cb889fe58ca70e852aa7fd0c0acb69a63d39dfe6a95860b472394e7c + languageName: node + linkType: hard + +"postcss-replace-overflow-wrap@npm:^4.0.0": + version: 4.0.0 + resolution: "postcss-replace-overflow-wrap@npm:4.0.0" + peerDependencies: + postcss: ^8.0.3 + checksum: 10c0/451361b714528cd3632951256ef073769cde725a46cda642a6864f666fb144921fa55e614aec1bcf5946f37d6ffdcca3b932b76f3d997c07b076e8db152b128d + languageName: node + linkType: hard + +"postcss-selector-not@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-selector-not@npm:8.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/491ea3dcc421cd90135be786078521605e2062fb93624ea8813cfd5ba0d35143f931e2e608d5f20effd5ea7d3f4786d2afea2afa42d117779a0288e135f132b6 + languageName: node + linkType: hard + +"postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.16": + version: 6.1.2 + resolution: "postcss-selector-parser@npm:6.1.2" + dependencies: + cssesc: "npm:^3.0.0" + util-deprecate: "npm:^1.0.2" + checksum: 10c0/523196a6bd8cf660bdf537ad95abd79e546d54180f9afb165a4ab3e651ac705d0f8b8ce6b3164fb9e3279ce482c5f751a69eb2d3a1e8eb0fd5e82294fb3ef13e + languageName: node + linkType: hard + +"postcss-selector-parser@npm:^7.0.0": + version: 7.1.0 + resolution: "postcss-selector-parser@npm:7.1.0" + dependencies: + cssesc: "npm:^3.0.0" + util-deprecate: "npm:^1.0.2" + checksum: 10c0/0fef257cfd1c0fe93c18a3f8a6e739b4438b527054fd77e9a62730a89b2d0ded1b59314a7e4aaa55bc256204f40830fecd2eb50f20f8cb7ab3a10b52aa06c8aa + languageName: node + linkType: hard + +"postcss-sort-media-queries@npm:^5.2.0": + version: 5.2.0 + resolution: "postcss-sort-media-queries@npm:5.2.0" + dependencies: + sort-css-media-queries: "npm:2.2.0" + peerDependencies: + postcss: ^8.4.23 + checksum: 10c0/5e7f265a21999bdbf6592f7e15b3e889dd93bc9b15fe048958e8f85603ac276e69ef50305e8b41b10f4eea68917c9c25c7956fa9c3ba7f8577c1149416d35c4e + languageName: node + linkType: hard + +"postcss-svgo@npm:^6.0.3": + version: 6.0.3 + resolution: "postcss-svgo@npm:6.0.3" + dependencies: + postcss-value-parser: "npm:^4.2.0" + svgo: "npm:^3.2.0" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/994b15a88cbb411f32cfa98957faa5623c76f2d75fede51f5f47238f06b367ebe59c204fecbdaf21ccb9e727239a4b290087e04c502392658a0c881ddfbd61f2 + languageName: node + linkType: hard + +"postcss-unique-selectors@npm:^6.0.4": + version: 6.0.4 + resolution: "postcss-unique-selectors@npm:6.0.4" + dependencies: + postcss-selector-parser: "npm:^6.0.16" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/bfb99d8a7c675c93f2e65c9d9d563477bfd46fdce9e2727d42d57982b31ccbaaf944e8034bfbefe48b3119e77fba7eb1b181c19b91cb3a5448058fa66a7c9ae9 + languageName: node + linkType: hard + +"postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": + version: 4.2.0 + resolution: "postcss-value-parser@npm:4.2.0" + checksum: 10c0/f4142a4f56565f77c1831168e04e3effd9ffcc5aebaf0f538eee4b2d465adfd4b85a44257bb48418202a63806a7da7fe9f56c330aebb3cac898e46b4cbf49161 + languageName: node + linkType: hard + +"postcss-zindex@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-zindex@npm:6.0.2" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/346291703e1f2dd954144d2bb251713dad6ae10e8aa05c3873dee2fc7a30d72da7866bec060abd932b9b839bc1495f73d813dde5312750a69d7ad33c435ce7ea + languageName: node + linkType: hard + +"postcss@npm:^8.4.21, postcss@npm:^8.4.24, postcss@npm:^8.4.33": + version: 8.4.47 + resolution: "postcss@npm:8.4.47" + dependencies: + nanoid: "npm:^3.3.7" + picocolors: "npm:^1.1.0" + source-map-js: "npm:^1.2.1" + checksum: 10c0/929f68b5081b7202709456532cee2a145c1843d391508c5a09de2517e8c4791638f71dd63b1898dba6712f8839d7a6da046c72a5e44c162e908f5911f57b5f44 + languageName: node + linkType: hard + +"postcss@npm:^8.5.4": + version: 8.5.4 + resolution: "postcss@npm:8.5.4" + dependencies: + nanoid: "npm:^3.3.11" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/0feff648614a834f7cd5396ea6b05b658ca0507e10a4eaad03b56c348f6aec93f42a885fc1b30522630c6a7e49ae53b38a061e3cba526f2d9857afbe095a22bb + languageName: node + linkType: hard + +"preact@npm:^10.13.2": + version: 10.20.1 + resolution: "preact@npm:10.20.1" + checksum: 10c0/3834f00d663c6ab90ddbfd618b7eee8612c5b4c0a2953d283b2b749340b5cc0c9efa91d70583ba6a5f65a641a87257c5bb3b414d9ad1bfb9eab5468c978b19d3 + languageName: node + linkType: hard + +"pretty-error@npm:^4.0.0": + version: 4.0.0 + resolution: "pretty-error@npm:4.0.0" + dependencies: + lodash: "npm:^4.17.20" + renderkid: "npm:^3.0.0" + checksum: 10c0/dc292c087e2857b2e7592784ab31e37a40f3fa918caa11eba51f9fb2853e1d4d6e820b219917e35f5721d833cfd20fdf4f26ae931a90fd1ad0cae2125c345138 + languageName: node + linkType: hard + +"pretty-time@npm:^1.1.0": + version: 1.1.0 + resolution: "pretty-time@npm:1.1.0" + checksum: 10c0/ba9d7af19cd43838fb2b147654990949575e400dc2cc24bf71ec4a6c4033a38ba8172b1014b597680c6d4d3c075e94648b2c13a7206c5f0c90b711c7388726f3 + languageName: node + linkType: hard + +"prism-react-renderer@npm:^2.3.0, prism-react-renderer@npm:^2.4.1": + version: 2.4.1 + resolution: "prism-react-renderer@npm:2.4.1" + dependencies: + "@types/prismjs": "npm:^1.26.0" + clsx: "npm:^2.0.0" + peerDependencies: + react: ">=16.0.0" + checksum: 10c0/ebbe8feb975224344bbdd046b3a937d121592dbe4b8f22ba0be31f5af37b9a8219f441138ef6cab1c5b96f2aa6b529015200959f7e5e85b60ca69c81d35edcd4 + languageName: node + linkType: hard + +"prismjs@npm:^1.29.0": + version: 1.30.0 + resolution: "prismjs@npm:1.30.0" + checksum: 10c0/f56205bfd58ef71ccfcbcb691fd0eb84adc96c6ff21b0b69fc6fdcf02be42d6ef972ba4aed60466310de3d67733f6a746f89f2fb79c00bf217406d465b3e8f23 + languageName: node + linkType: hard + +"proc-log@npm:^5.0.0": + version: 5.0.0 + resolution: "proc-log@npm:5.0.0" + checksum: 10c0/bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3 + languageName: node + linkType: hard + +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 + languageName: node + linkType: hard + +"prompts@npm:^2.4.2": + version: 2.4.2 + resolution: "prompts@npm:2.4.2" + dependencies: + kleur: "npm:^3.0.3" + sisteransi: "npm:^1.0.5" + checksum: 10c0/16f1ac2977b19fe2cf53f8411cc98db7a3c8b115c479b2ca5c82b5527cd937aa405fa04f9a5960abeb9daef53191b53b4d13e35c1f5d50e8718c76917c5f1ea4 + languageName: node + linkType: hard + +"prop-types@npm:^15.6.2, prop-types@npm:^15.7.2": + version: 15.8.1 + resolution: "prop-types@npm:15.8.1" + dependencies: + loose-envify: "npm:^1.4.0" + object-assign: "npm:^4.1.1" + react-is: "npm:^16.13.1" + checksum: 10c0/59ece7ca2fb9838031d73a48d4becb9a7cc1ed10e610517c7d8f19a1e02fa47f7c27d557d8a5702bec3cfeccddc853579832b43f449e54635803f277b1c78077 + languageName: node + linkType: hard + +"property-information@npm:^6.0.0": + version: 6.4.1 + resolution: "property-information@npm:6.4.1" + checksum: 10c0/fc8cb86b0040f1be93437ad52cd815c4744343686852b116e2231997b92e160f3540498beacc953ad1509461d6f70ba9020766083aacdffcede2d87ca8b48a18 + languageName: node + linkType: hard + +"proto-list@npm:~1.2.1": + version: 1.2.4 + resolution: "proto-list@npm:1.2.4" + checksum: 10c0/b9179f99394ec8a68b8afc817690185f3b03933f7b46ce2e22c1930dc84b60d09f5ad222beab4e59e58c6c039c7f7fcf620397235ef441a356f31f9744010e12 + languageName: node + linkType: hard + +"proxy-addr@npm:~2.0.7": + version: 2.0.7 + resolution: "proxy-addr@npm:2.0.7" + dependencies: + forwarded: "npm:0.2.0" + ipaddr.js: "npm:1.9.1" + checksum: 10c0/c3eed999781a35f7fd935f398b6d8920b6fb00bbc14287bc6de78128ccc1a02c89b95b56742bf7cf0362cc333c61d138532049c7dedc7a328ef13343eff81210 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.1.1 + resolution: "punycode@npm:2.1.1" + checksum: 10c0/83815ca9b9177f055771f31980cbec7ffaef10257d50a95ab99b4a30f0404846e85fa6887ee1bbc0aaddb7bad6d96e2fa150a016051ff0f6b92be4ad613ddca8 + languageName: node + linkType: hard + +"pupa@npm:^3.1.0": + version: 3.1.0 + resolution: "pupa@npm:3.1.0" + dependencies: + escape-goat: "npm:^4.0.0" + checksum: 10c0/02afa6e4547a733484206aaa8f8eb3fbfb12d3dd17d7ca4fa1ea390a7da2cb8f381e38868bbf68009c4d372f8f6059f553171b6a712d8f2802c7cd43d513f06c + languageName: node + linkType: hard + +"qs@npm:6.13.0": + version: 6.13.0 + resolution: "qs@npm:6.13.0" + dependencies: + side-channel: "npm:^1.0.6" + checksum: 10c0/62372cdeec24dc83a9fb240b7533c0fdcf0c5f7e0b83343edd7310f0ab4c8205a5e7c56406531f2e47e1b4878a3821d652be4192c841de5b032ca83619d8f860 + languageName: node + linkType: hard + +"quansync@npm:^0.2.7, quansync@npm:^0.2.8": + version: 0.2.8 + resolution: "quansync@npm:0.2.8" + checksum: 10c0/7dae50c11dab2f94ae841183dd79a920a085e01961f9aeb594dd4793ad7b2e6e39ae106051c91f7175c5897de98800cfd52fe6836e32670c3c220fad2ec4598d + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 + languageName: node + linkType: hard + +"quick-lru@npm:^5.1.1": + version: 5.1.1 + resolution: "quick-lru@npm:5.1.1" + checksum: 10c0/a24cba5da8cec30d70d2484be37622580f64765fb6390a928b17f60cd69e8dbd32a954b3ff9176fa1b86d86ff2ba05252fae55dc4d40d0291c60412b0ad096da + languageName: node + linkType: hard + +"randombytes@npm:^2.1.0": + version: 2.1.0 + resolution: "randombytes@npm:2.1.0" + dependencies: + safe-buffer: "npm:^5.1.0" + checksum: 10c0/50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 + languageName: node + linkType: hard + +"range-parser@npm:1.2.0": + version: 1.2.0 + resolution: "range-parser@npm:1.2.0" + checksum: 10c0/c7aef4f6588eb974c475649c157f197d07437d8c6c8ff7e36280a141463fb5ab7a45918417334ebd7b665c6b8321cf31c763f7631dd5f5db9372249261b8b02a + languageName: node + linkType: hard + +"range-parser@npm:^1.2.1, range-parser@npm:~1.2.1": + version: 1.2.1 + resolution: "range-parser@npm:1.2.1" + checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0 + languageName: node + linkType: hard + +"raw-body@npm:2.5.2": + version: 2.5.2 + resolution: "raw-body@npm:2.5.2" + dependencies: + bytes: "npm:3.1.2" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + unpipe: "npm:1.0.0" + checksum: 10c0/b201c4b66049369a60e766318caff5cb3cc5a900efd89bdac431463822d976ad0670912c931fdbdcf5543207daf6f6833bca57aa116e1661d2ea91e12ca692c4 + languageName: node + linkType: hard + +"rc@npm:1.2.8": + version: 1.2.8 + resolution: "rc@npm:1.2.8" + dependencies: + deep-extend: "npm:^0.6.0" + ini: "npm:~1.3.0" + minimist: "npm:^1.2.0" + strip-json-comments: "npm:~2.0.1" + bin: + rc: ./cli.js + checksum: 10c0/24a07653150f0d9ac7168e52943cc3cb4b7a22c0e43c7dff3219977c2fdca5a2760a304a029c20811a0e79d351f57d46c9bde216193a0f73978496afc2b85b15 + languageName: node + linkType: hard + +"react-dom@npm:18.3.0": + version: 18.3.0 + resolution: "react-dom@npm:18.3.0" + dependencies: + loose-envify: "npm:^1.1.0" + scheduler: "npm:^0.23.1" + peerDependencies: + react: ^18.3.0 + checksum: 10c0/5072767a5d67e242579e5ed46094bf5665385fcfc50584e818273ba668f768348bfd9101841fa3986635635b1238a7a5b2d28b73b134ebbe58a415311afd60d4 + languageName: node + linkType: hard + +"react-fast-compare@npm:^3.2.0": + version: 3.2.0 + resolution: "react-fast-compare@npm:3.2.0" + checksum: 10c0/2a7d75ce9fb5da1e3c01f74a5cd592f3369a8cc8d44e93654bf147ab221f430238e8be70677e896f2bfcb96a1cb7a47a8d05d84633de764a9d57d27005a4bb9e + languageName: node + linkType: hard + +"react-helmet-async@npm:@slorber/react-helmet-async@1.3.0": + version: 1.3.0 + resolution: "@slorber/react-helmet-async@npm:1.3.0" + dependencies: + "@babel/runtime": "npm:^7.12.5" + invariant: "npm:^2.2.4" + prop-types: "npm:^15.7.2" + react-fast-compare: "npm:^3.2.0" + shallowequal: "npm:^1.1.0" + peerDependencies: + react: ^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/7a13470a0d27d6305657c7fa6b066443c94acdb22bd0decca772298bc852ce04fdc65f1207f0d546995bf7d4ca09e21c81f96b4954544937c01eda82e2caa142 + languageName: node + linkType: hard + +"react-is@npm:^16.13.1, react-is@npm:^16.6.0, react-is@npm:^16.7.0": + version: 16.13.1 + resolution: "react-is@npm:16.13.1" + checksum: 10c0/33977da7a5f1a287936a0c85639fec6ca74f4f15ef1e59a6bc20338fc73dc69555381e211f7a3529b8150a1f71e4225525b41b60b52965bda53ce7d47377ada1 + languageName: node + linkType: hard + +"react-json-view-lite@npm:^2.3.0": + version: 2.4.1 + resolution: "react-json-view-lite@npm:2.4.1" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + checksum: 10c0/cc171d8cca04683b97292ffdd8bad4970d77ccb929ed1eff3d40d46893c69e569226742f3330c090be88f894bd8e97352286ff16989c1e765f9fda487ca44ee8 + languageName: node + linkType: hard + +"react-loadable-ssr-addon-v5-slorber@npm:^1.0.1": + version: 1.0.1 + resolution: "react-loadable-ssr-addon-v5-slorber@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.10.3" + peerDependencies: + react-loadable: "*" + webpack: ">=4.41.1 || 5.x" + checksum: 10c0/7b0645f66adec56646f985ba8094c66a1c0a4627d96ad80eea32431d773ef1f79aa47d3247a8f21db3b064a0c6091653c5b5d3483b7046722eb64e55bffe635c + languageName: node + linkType: hard + +"react-loadable@npm:@docusaurus/react-loadable@6.0.0": + version: 6.0.0 + resolution: "@docusaurus/react-loadable@npm:6.0.0" + dependencies: + "@types/react": "npm:*" + peerDependencies: + react: "*" + checksum: 10c0/6b145d1a8d2e7342ceef58dd154aa990322f72a6cb98955ab8ce8e3f0dc7f0c5d00f9c2e4efa8d356c5effed72a130b5588857332b11faba0398f5429b484b04 + languageName: node + linkType: hard + +"react-router-config@npm:^5.1.1": + version: 5.1.1 + resolution: "react-router-config@npm:5.1.1" + dependencies: + "@babel/runtime": "npm:^7.1.2" + peerDependencies: + react: ">=15" + react-router: ">=5" + checksum: 10c0/1f8f4e55ca68b7b012293e663eb0ee4d670a3df929b78928f713ef98cd9d62c7f5c30a098d6668e64bbb11c7d6bb24e9e6b9c985a8b82465a1858dc7ba663f2b + languageName: node + linkType: hard + +"react-router-dom@npm:^5.3.4": + version: 5.3.4 + resolution: "react-router-dom@npm:5.3.4" + dependencies: + "@babel/runtime": "npm:^7.12.13" + history: "npm:^4.9.0" + loose-envify: "npm:^1.3.1" + prop-types: "npm:^15.6.2" + react-router: "npm:5.3.4" + tiny-invariant: "npm:^1.0.2" + tiny-warning: "npm:^1.0.0" + peerDependencies: + react: ">=15" + checksum: 10c0/f04f727e2ed2e9d1d3830af02cc61690ff67b1524c0d18690582bfba0f4d14142ccc88fb6da6befad644fddf086f5ae4c2eb7048c67da8a0b0929c19426421b0 + languageName: node + linkType: hard + +"react-router@npm:5.3.4, react-router@npm:^5.3.4": + version: 5.3.4 + resolution: "react-router@npm:5.3.4" + dependencies: + "@babel/runtime": "npm:^7.12.13" + history: "npm:^4.9.0" + hoist-non-react-statics: "npm:^3.1.0" + loose-envify: "npm:^1.3.1" + path-to-regexp: "npm:^1.7.0" + prop-types: "npm:^15.6.2" + react-is: "npm:^16.6.0" + tiny-invariant: "npm:^1.0.2" + tiny-warning: "npm:^1.0.0" + peerDependencies: + react: ">=15" + checksum: 10c0/e15c00dfef199249b4c6e6d98e5e76cc352ce66f3270f13df37cc069ddf7c05e43281e8c308fc407e4435d72924373baef1d2890e0f6b0b1eb423cf47315a053 + languageName: node + linkType: hard + +"react@npm:18.3.0": + version: 18.3.0 + resolution: "react@npm:18.3.0" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: 10c0/ad87bbfdb0c5466148c657da18b0d5458e835389fc591d59840f0e6ec797a004073a01c8cdbff1767a8774c7219054a56f74dacd67bdbb849f1314e427999268 + languageName: node + linkType: hard + +"readable-stream@npm:^2.0.1": + version: 2.3.7 + resolution: "readable-stream@npm:2.3.7" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.3" + isarray: "npm:~1.0.0" + process-nextick-args: "npm:~2.0.0" + safe-buffer: "npm:~5.1.1" + string_decoder: "npm:~1.1.1" + util-deprecate: "npm:~1.0.1" + checksum: 10c0/1708755e6cf9daff6ff60fa5b4575636472289c5b95d38058a91f94732b8d024a940a0d4d955639195ce42c22cab16973ee8fea8deedd24b5fec3dd596465f86 + languageName: node + linkType: hard + +"readable-stream@npm:^3.0.6": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 + languageName: node + linkType: hard + +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: "npm:^2.2.1" + checksum: 10c0/6fa848cf63d1b82ab4e985f4cf72bd55b7dcfd8e0a376905804e48c3634b7e749170940ba77b32804d5fe93b3cc521aa95a8d7e7d725f830da6d93f3669ce66b + languageName: node + linkType: hard + +"regenerate-unicode-properties@npm:^10.1.0": + version: 10.1.1 + resolution: "regenerate-unicode-properties@npm:10.1.1" + dependencies: + regenerate: "npm:^1.4.2" + checksum: 10c0/89adb5ee5ba081380c78f9057c02e156a8181969f6fcca72451efc45612e0c3df767b4333f8d8479c274d9c6fe52ec4854f0d8a22ef95dccbe87da8e5f2ac77d + languageName: node + linkType: hard + +"regenerate-unicode-properties@npm:^10.2.0": + version: 10.2.0 + resolution: "regenerate-unicode-properties@npm:10.2.0" + dependencies: + regenerate: "npm:^1.4.2" + checksum: 10c0/5510785eeaf56bbfdf4e663d6753f125c08d2a372d4107bc1b756b7bf142e2ed80c2733a8b54e68fb309ba37690e66a0362699b0e21d5c1f0255dea1b00e6460 + languageName: node + linkType: hard + +"regenerate@npm:^1.4.2": + version: 1.4.2 + resolution: "regenerate@npm:1.4.2" + checksum: 10c0/f73c9eba5d398c818edc71d1c6979eaa05af7a808682749dd079f8df2a6d91a9b913db216c2c9b03e0a8ba2bba8701244a93f45211afbff691c32c7b275db1b8 + languageName: node + linkType: hard + +"regenerator-runtime@npm:^0.14.0": + version: 0.14.1 + resolution: "regenerator-runtime@npm:0.14.1" + checksum: 10c0/1b16eb2c4bceb1665c89de70dcb64126a22bc8eb958feef3cd68fe11ac6d2a4899b5cd1b80b0774c7c03591dc57d16631a7f69d2daa2ec98100e2f29f7ec4cc4 + languageName: node + linkType: hard + +"regenerator-transform@npm:^0.15.2": + version: 0.15.2 + resolution: "regenerator-transform@npm:0.15.2" + dependencies: + "@babel/runtime": "npm:^7.8.4" + checksum: 10c0/7cfe6931ec793269701994a93bab89c0cc95379191fad866270a7fea2adfec67ea62bb5b374db77058b60ba4509319d9b608664d0d288bd9989ca8dbd08fae90 + languageName: node + linkType: hard + +"regexpu-core@npm:^5.3.1": + version: 5.3.2 + resolution: "regexpu-core@npm:5.3.2" + dependencies: + "@babel/regjsgen": "npm:^0.8.0" + regenerate: "npm:^1.4.2" + regenerate-unicode-properties: "npm:^10.1.0" + regjsparser: "npm:^0.9.1" + unicode-match-property-ecmascript: "npm:^2.0.0" + unicode-match-property-value-ecmascript: "npm:^2.1.0" + checksum: 10c0/7945d5ab10c8bbed3ca383d4274687ea825aee4ab93a9c51c6e31e1365edd5ea807f6908f800ba017b66c462944ba68011164e7055207747ab651f8111ef3770 + languageName: node + linkType: hard + +"regexpu-core@npm:^6.2.0": + version: 6.2.0 + resolution: "regexpu-core@npm:6.2.0" + dependencies: + regenerate: "npm:^1.4.2" + regenerate-unicode-properties: "npm:^10.2.0" + regjsgen: "npm:^0.8.0" + regjsparser: "npm:^0.12.0" + unicode-match-property-ecmascript: "npm:^2.0.0" + unicode-match-property-value-ecmascript: "npm:^2.1.0" + checksum: 10c0/bbcb83a854bf96ce4005ee4e4618b71c889cda72674ce6092432f0039b47890c2d0dfeb9057d08d440999d9ea03879ebbb7f26ca005ccf94390e55c348859b98 + languageName: node + linkType: hard + +"registry-auth-token@npm:^5.0.1": + version: 5.0.2 + resolution: "registry-auth-token@npm:5.0.2" + dependencies: + "@pnpm/npm-conf": "npm:^2.1.0" + checksum: 10c0/20fc2225681cc54ae7304b31ebad5a708063b1949593f02dfe5fb402bc1fc28890cecec6497ea396ba86d6cca8a8480715926dfef8cf1f2f11e6f6cc0a1b4bde + languageName: node + linkType: hard + +"registry-url@npm:^6.0.0": + version: 6.0.1 + resolution: "registry-url@npm:6.0.1" + dependencies: + rc: "npm:1.2.8" + checksum: 10c0/66e2221c8113fc35ee9d23fe58cb516fc8d556a189fb8d6f1011a02efccc846c4c9b5075b4027b99a5d5c9ad1345ac37f297bea3c0ca30d607ec8084bf561b90 + languageName: node + linkType: hard + +"regjsgen@npm:^0.8.0": + version: 0.8.0 + resolution: "regjsgen@npm:0.8.0" + checksum: 10c0/44f526c4fdbf0b29286101a282189e4dbb303f4013cf3fea058668d96d113b9180d3d03d1e13f6d4cbde38b7728bf951aecd9dc199938c080093a9a6f0d7a6bd + languageName: node + linkType: hard + +"regjsparser@npm:^0.12.0": + version: 0.12.0 + resolution: "regjsparser@npm:0.12.0" + dependencies: + jsesc: "npm:~3.0.2" + bin: + regjsparser: bin/parser + checksum: 10c0/99d3e4e10c8c7732eb7aa843b8da2fd8b647fe144d3711b480e4647dc3bff4b1e96691ccf17f3ace24aa866a50b064236177cb25e6e4fbbb18285d99edaed83b + languageName: node + linkType: hard + +"regjsparser@npm:^0.9.1": + version: 0.9.1 + resolution: "regjsparser@npm:0.9.1" + dependencies: + jsesc: "npm:~0.5.0" + bin: + regjsparser: bin/parser + checksum: 10c0/fe44fcf19a99fe4f92809b0b6179530e5ef313ff7f87df143b08ce9a2eb3c4b6189b43735d645be6e8f4033bfb015ed1ca54f0583bc7561bed53fd379feb8225 + languageName: node + linkType: hard + +"rehype-raw@npm:^7.0.0": + version: 7.0.0 + resolution: "rehype-raw@npm:7.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + hast-util-raw: "npm:^9.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/1435b4b6640a5bc3abe3b2133885c4dbff5ef2190ef9cfe09d6a63f74dd7d7ffd0cede70603278560ccf1acbfb9da9faae4b68065a28bc5aa88ad18e40f32d52 + languageName: node + linkType: hard + +"relateurl@npm:^0.2.7": + version: 0.2.7 + resolution: "relateurl@npm:0.2.7" + checksum: 10c0/c248b4e3b32474f116a804b537fa6343d731b80056fb506dffd91e737eef4cac6be47a65aae39b522b0db9d0b1011d1a12e288d82a109ecd94a5299d82f6573a + languageName: node + linkType: hard + +"remark-directive@npm:^3.0.0": + version: 3.0.0 + resolution: "remark-directive@npm:3.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + mdast-util-directive: "npm:^3.0.0" + micromark-extension-directive: "npm:^3.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/eeec4d70501c5bce55b2528fa0c8f1e2a5c713c9f72a7d4678dd3868c425620ec409a719bb2656663296bc476c63f5d7bcacd5a9059146bfc89d40e4ce13a7f6 + languageName: node + linkType: hard + +"remark-emoji@npm:^4.0.0": + version: 4.0.1 + resolution: "remark-emoji@npm:4.0.1" + dependencies: + "@types/mdast": "npm:^4.0.2" + emoticon: "npm:^4.0.1" + mdast-util-find-and-replace: "npm:^3.0.1" + node-emoji: "npm:^2.1.0" + unified: "npm:^11.0.4" + checksum: 10c0/27f88892215f3efe8f25c43f226a82d70144a1ae5906d36f6e09390b893b2d5524d5949bd8ca6a02be0e3cb5cba908b35c4221f4e07f34e93d13d6ff9347dbb8 + languageName: node + linkType: hard + +"remark-frontmatter@npm:^5.0.0": + version: 5.0.0 + resolution: "remark-frontmatter@npm:5.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + mdast-util-frontmatter: "npm:^2.0.0" + micromark-extension-frontmatter: "npm:^2.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/102325d5edbcf30eaf74de8a0a6e03096cc2370dfef19080fd2dd208f368fbb2323388751ac9931a1aa38a4f2828fa4bad6c52dc5249dcadcd34861693b52bf9 + languageName: node + linkType: hard + +"remark-gfm@npm:^4.0.0": + version: 4.0.0 + resolution: "remark-gfm@npm:4.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + mdast-util-gfm: "npm:^3.0.0" + micromark-extension-gfm: "npm:^3.0.0" + remark-parse: "npm:^11.0.0" + remark-stringify: "npm:^11.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/db0aa85ab718d475c2596e27c95be9255d3b0fc730a4eda9af076b919f7dd812f7be3ac020611a8dbe5253fd29671d7b12750b56e529fdc32dfebad6dbf77403 + languageName: node + linkType: hard + +"remark-mdx@npm:^3.0.0": + version: 3.0.1 + resolution: "remark-mdx@npm:3.0.1" + dependencies: + mdast-util-mdx: "npm:^3.0.0" + micromark-extension-mdxjs: "npm:^3.0.0" + checksum: 10c0/9e16cd5ff3b30620bd25351a2dd1701627fa5555785b35ee5fe07bd1e6793a9c825cc1f6af9e54a44351f74879f8b5ea2bce8e5a21379aeab58935e76a4d69ce + languageName: node + linkType: hard + +"remark-parse@npm:^11.0.0": + version: 11.0.0 + resolution: "remark-parse@npm:11.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/6eed15ddb8680eca93e04fcb2d1b8db65a743dcc0023f5007265dda558b09db595a087f622062ccad2630953cd5cddc1055ce491d25a81f3317c858348a8dd38 + languageName: node + linkType: hard + +"remark-rehype@npm:^11.0.0": + version: 11.1.0 + resolution: "remark-rehype@npm:11.1.0" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/mdast": "npm:^4.0.0" + mdast-util-to-hast: "npm:^13.0.0" + unified: "npm:^11.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/7a9534847ea70e78cf09227a4302af7e491f625fd092351a1b1ee27a2de0a369ac4acf069682e8a8ec0a55847b3e83f0be76b2028aa90e98e69e21420b9794c3 + languageName: node + linkType: hard + +"remark-stringify@npm:^11.0.0": + version: 11.0.0 + resolution: "remark-stringify@npm:11.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/0cdb37ce1217578f6f847c7ec9f50cbab35df5b9e3903d543e74b405404e67c07defcb23cd260a567b41b769400f6de03c2c3d9cd6ae7a6707d5c8d89ead489f + languageName: node + linkType: hard + +"renderkid@npm:^3.0.0": + version: 3.0.0 + resolution: "renderkid@npm:3.0.0" + dependencies: + css-select: "npm:^4.1.3" + dom-converter: "npm:^0.2.0" + htmlparser2: "npm:^6.1.0" + lodash: "npm:^4.17.21" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/24a9fae4cc50e731d059742d1b3eec163dc9e3872b12010d120c3fcbd622765d9cda41f79a1bbb4bf63c1d3442f18a08f6e1642cb5d7ebf092a0ce3f7a3bd143 + languageName: node + linkType: hard + +"repeat-string@npm:^1.0.0": + version: 1.6.1 + resolution: "repeat-string@npm:1.6.1" + checksum: 10c0/87fa21bfdb2fbdedc44b9a5b118b7c1239bdd2c2c1e42742ef9119b7d412a5137a1d23f1a83dc6bb686f4f27429ac6f542e3d923090b44181bafa41e8ac0174d + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: 10c0/aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 + languageName: node + linkType: hard + +"require-like@npm:>= 0.1.1": + version: 0.1.2 + resolution: "require-like@npm:0.1.2" + checksum: 10c0/9035ff6c4000a56ede6fc51dd5c56541fafa5a7dddc9b1c3a5f9148d95ee21c603c9bf5c6e37b19fc7de13d9294260842d8590b2ffd6c7c773e78603d1af8050 + languageName: node + linkType: hard + +"requires-port@npm:^1.0.0": + version: 1.0.0 + resolution: "requires-port@npm:1.0.0" + checksum: 10c0/b2bfdd09db16c082c4326e573a82c0771daaf7b53b9ce8ad60ea46aa6e30aaf475fe9b164800b89f93b748d2c234d8abff945d2551ba47bf5698e04cd7713267 + languageName: node + linkType: hard + +"resolve-alpn@npm:^1.2.0": + version: 1.2.1 + resolution: "resolve-alpn@npm:1.2.1" + checksum: 10c0/b70b29c1843bc39781ef946c8cd4482e6d425976599c0f9c138cec8209e4e0736161bf39319b01676a847000085dfdaf63583c6fb4427bf751a10635bd2aa0c4 + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 + languageName: node + linkType: hard + +"resolve-pathname@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-pathname@npm:3.0.0" + checksum: 10c0/c6ec49b670dc35b9a303c47fa83ba9348a71e92d64a4c4bb85e1b659a29b407aa1ac1cb14a9b5b502982132ca77482bd80534bca147439d66880d35a137fe723 + languageName: node + linkType: hard + +"resolve@npm:^1.14.2": + version: 1.22.1 + resolution: "resolve@npm:1.22.1" + dependencies: + is-core-module: "npm:^2.9.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/6d58b1cb40f3fc80b9e45dd799d84cdc3829a993e4b9fa3b59d331e1dfacd0870e1851f4d0eb549d68c796e0b7087b43d1aec162653ccccff9e18191221a6e7d + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.14.2#optional!builtin": + version: 1.22.1 + resolution: "resolve@patch:resolve@npm%3A1.22.1#optional!builtin::version=1.22.1&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.9.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/0d8ccceba5537769c42aa75e4aa75ae854aac866a11d7e9ffdb1663f0158ee646a0d48fc2818ed5e7fb364d64220a1fb9092a160e11e00cbdd5fbab39a13092c + languageName: node + linkType: hard + +"responselike@npm:^3.0.0": + version: 3.0.0 + resolution: "responselike@npm:3.0.0" + dependencies: + lowercase-keys: "npm:^3.0.0" + checksum: 10c0/8af27153f7e47aa2c07a5f2d538cb1e5872995f0e9ff77def858ecce5c3fe677d42b824a62cde502e56d275ab832b0a8bd350d5cd6b467ac0425214ac12ae658 + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe + languageName: node + linkType: hard + +"retry@npm:^0.13.1": + version: 0.13.1 + resolution: "retry@npm:0.13.1" + checksum: 10c0/9ae822ee19db2163497e074ea919780b1efa00431d197c7afdb950e42bf109196774b92a49fc9821f0b8b328a98eea6017410bfc5e8a0fc19c85c6d11adb3772 + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: 10c0/c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: bin.js + checksum: 10c0/9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 + languageName: node + linkType: hard + +"rimraf@npm:^5.0.5": + version: 5.0.10 + resolution: "rimraf@npm:5.0.10" + dependencies: + glob: "npm:^10.3.7" + bin: + rimraf: dist/esm/bin.mjs + checksum: 10c0/7da4fd0e15118ee05b918359462cfa1e7fe4b1228c7765195a45b55576e8c15b95db513b8466ec89129666f4af45ad978a3057a02139afba1a63512a2d9644cc + languageName: node + linkType: hard + +"robust-predicates@npm:^3.0.2": + version: 3.0.2 + resolution: "robust-predicates@npm:3.0.2" + checksum: 10c0/4ecd53649f1c2d49529c85518f2fa69ffb2f7a4453f7fd19c042421c7b4d76c3efb48bc1c740c8f7049346d7cb58cf08ee0c9adaae595cc23564d360adb1fde4 + languageName: node + linkType: hard + +"roughjs@npm:^4.6.6": + version: 4.6.6 + resolution: "roughjs@npm:4.6.6" + dependencies: + hachure-fill: "npm:^0.5.2" + path-data-parser: "npm:^0.1.0" + points-on-curve: "npm:^0.2.0" + points-on-path: "npm:^0.2.1" + checksum: 10c0/68c11bf4516aa014cef2fe52426a9bab237c2f500d13e1a4f13b523cb5723667bf2d92b9619325efdc5bc2a193588ff5af8d51683df17cfb8720e96fe2b92b0c + languageName: node + linkType: hard + +"rtlcss@npm:^4.1.0": + version: 4.1.1 + resolution: "rtlcss@npm:4.1.1" + dependencies: + escalade: "npm:^3.1.1" + picocolors: "npm:^1.0.0" + postcss: "npm:^8.4.21" + strip-json-comments: "npm:^3.1.1" + bin: + rtlcss: bin/rtlcss.js + checksum: 10c0/8667f09f683139abf1d5a58e284fa57c903f1f502a86cd1a7fa867777378f7f93a3c156ba27852b826299156451fbf8c6413710ab1cce8e6da87dd31a266c669 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 + languageName: node + linkType: hard + +"rw@npm:1": + version: 1.3.3 + resolution: "rw@npm:1.3.3" + checksum: 10c0/b1e1ef37d1e79d9dc7050787866e30b6ddcb2625149276045c262c6b4d53075ddc35f387a856a8e76f0d0df59f4cd58fe24707e40797ebee66e542b840ed6a53 + languageName: node + linkType: hard + +"safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 + languageName: node + linkType: hard + +"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"sax@npm:^1.2.4": + version: 1.2.4 + resolution: "sax@npm:1.2.4" + checksum: 10c0/6e9b05ff443ee5e5096ce92d31c0740a20d33002fad714ebcb8fc7a664d9ee159103ebe8f7aef0a1f7c5ecacdd01f177f510dff95611c589399baf76437d3fe3 + languageName: node + linkType: hard + +"scheduler@npm:^0.23.1": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: 10c0/26383305e249651d4c58e6705d5f8425f153211aef95f15161c151f7b8de885f24751b377e4a0b3dd42cce09aad3f87a61dab7636859c0d89b7daf1a1e2a5c78 + languageName: node + linkType: hard + +"schema-dts@npm:^1.1.2": + version: 1.1.5 + resolution: "schema-dts@npm:1.1.5" + checksum: 10c0/babe23a1577c75c5df79d73acf34af3399e60928eab46f2236a0c4212061f5778d613a31c9e9ec86a2807d20b1ea460673d72d3fe1f64fb7543867460e607f76 + languageName: node + linkType: hard + +"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": + version: 3.3.0 + resolution: "schema-utils@npm:3.3.0" + dependencies: + "@types/json-schema": "npm:^7.0.8" + ajv: "npm:^6.12.5" + ajv-keywords: "npm:^3.5.2" + checksum: 10c0/fafdbde91ad8aa1316bc543d4b61e65ea86970aebbfb750bfb6d8a6c287a23e415e0e926c2498696b242f63af1aab8e585252637fabe811fd37b604351da6500 + languageName: node + linkType: hard + +"schema-utils@npm:^4.0.0, schema-utils@npm:^4.0.1": + version: 4.2.0 + resolution: "schema-utils@npm:4.2.0" + dependencies: + "@types/json-schema": "npm:^7.0.9" + ajv: "npm:^8.9.0" + ajv-formats: "npm:^2.1.1" + ajv-keywords: "npm:^5.1.0" + checksum: 10c0/8dab7e7800316387fd8569870b4b668cfcecf95ac551e369ea799bbcbfb63fb0365366d4b59f64822c9f7904d8c5afcfaf5a6124a4b08783e558cd25f299a6b4 + languageName: node + linkType: hard + +"schema-utils@npm:^4.3.0": + version: 4.3.0 + resolution: "schema-utils@npm:4.3.0" + dependencies: + "@types/json-schema": "npm:^7.0.9" + ajv: "npm:^8.9.0" + ajv-formats: "npm:^2.1.1" + ajv-keywords: "npm:^5.1.0" + checksum: 10c0/c23f0fa73ef71a01d4a2bb7af4c91e0d356ec640e071aa2d06ea5e67f042962bb7ac7c29a60a295bb0125878801bc3209197a2b8a833dd25bd38e37c3ed21427 + languageName: node + linkType: hard + +"section-matter@npm:^1.0.0": + version: 1.0.0 + resolution: "section-matter@npm:1.0.0" + dependencies: + extend-shallow: "npm:^2.0.1" + kind-of: "npm:^6.0.0" + checksum: 10c0/8007f91780adc5aaa781a848eaae50b0f680bbf4043b90cf8a96778195b8fab690c87fe7a989e02394ce69890e330811ec8dab22397d384673ce59f7d750641d + languageName: node + linkType: hard + +"select-hose@npm:^2.0.0": + version: 2.0.0 + resolution: "select-hose@npm:2.0.0" + checksum: 10c0/01cc52edd29feddaf379efb4328aededa633f0ac43c64b11a8abd075ff34f05b0d280882c4fbcbdf1a0658202c9cd2ea8d5985174dcf9a2dac7e3a4996fa9b67 + languageName: node + linkType: hard + +"selfsigned@npm:^2.1.1": + version: 2.4.1 + resolution: "selfsigned@npm:2.4.1" + dependencies: + "@types/node-forge": "npm:^1.3.0" + node-forge: "npm:^1" + checksum: 10c0/521829ec36ea042f7e9963bf1da2ed040a815cf774422544b112ec53b7edc0bc50a0f8cc2ae7aa6cc19afa967c641fd96a15de0fc650c68651e41277d2e1df09 + languageName: node + linkType: hard + +"semver-diff@npm:^4.0.0": + version: 4.0.0 + resolution: "semver-diff@npm:4.0.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/3ed1bb22f39b4b6e98785bb066e821eabb9445d3b23e092866c50e7df8b9bd3eda617b242f81db4159586e0e39b0deb908dd160a24f783bd6f52095b22cd68ea + languageName: node + linkType: hard + +"semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d + languageName: node + linkType: hard + +"semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.4": + version: 7.6.0 + resolution: "semver@npm:7.6.0" + dependencies: + lru-cache: "npm:^6.0.0" + bin: + semver: bin/semver.js + checksum: 10c0/fbfe717094ace0aa8d6332d7ef5ce727259815bd8d8815700853f4faf23aacbd7192522f0dc5af6df52ef4fa85a355ebd2f5d39f554bd028200d6cf481ab9b53 + languageName: node + linkType: hard + +"send@npm:0.19.0": + version: 0.19.0 + resolution: "send@npm:0.19.0" + dependencies: + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + mime: "npm:1.6.0" + ms: "npm:2.1.3" + on-finished: "npm:2.4.1" + range-parser: "npm:~1.2.1" + statuses: "npm:2.0.1" + checksum: 10c0/ea3f8a67a8f0be3d6bf9080f0baed6d2c51d11d4f7b4470de96a5029c598a7011c497511ccc28968b70ef05508675cebff27da9151dd2ceadd60be4e6cf845e3 + languageName: node + linkType: hard + +"serialize-javascript@npm:^6.0.0, serialize-javascript@npm:^6.0.1, serialize-javascript@npm:^6.0.2": + version: 6.0.2 + resolution: "serialize-javascript@npm:6.0.2" + dependencies: + randombytes: "npm:^2.1.0" + checksum: 10c0/2dd09ef4b65a1289ba24a788b1423a035581bef60817bea1f01eda8e3bda623f86357665fe7ac1b50f6d4f583f97db9615b3f07b2a2e8cbcb75033965f771dd2 + languageName: node + linkType: hard + +"serve-handler@npm:^6.1.6": + version: 6.1.6 + resolution: "serve-handler@npm:6.1.6" + dependencies: + bytes: "npm:3.0.0" + content-disposition: "npm:0.5.2" + mime-types: "npm:2.1.18" + minimatch: "npm:3.1.2" + path-is-inside: "npm:1.0.2" + path-to-regexp: "npm:3.3.0" + range-parser: "npm:1.2.0" + checksum: 10c0/1e1cb6bbc51ee32bc1505f2e0605bdc2e96605c522277c977b67f83be9d66bd1eec8604388714a4d728e036d86b629bc9aec02120ea030d3d2c3899d44696503 + languageName: node + linkType: hard + +"serve-index@npm:^1.9.1": + version: 1.9.1 + resolution: "serve-index@npm:1.9.1" + dependencies: + accepts: "npm:~1.3.4" + batch: "npm:0.6.1" + debug: "npm:2.6.9" + escape-html: "npm:~1.0.3" + http-errors: "npm:~1.6.2" + mime-types: "npm:~2.1.17" + parseurl: "npm:~1.3.2" + checksum: 10c0/a666471a24196f74371edf2c3c7bcdd82adbac52f600804508754b5296c3567588bf694258b19e0cb23a567acfa20d9721bfdaed3286007b81f9741ada8a3a9c + languageName: node + linkType: hard + +"serve-static@npm:1.16.2": + version: 1.16.2 + resolution: "serve-static@npm:1.16.2" + dependencies: + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + parseurl: "npm:~1.3.3" + send: "npm:0.19.0" + checksum: 10c0/528fff6f5e12d0c5a391229ad893910709bc51b5705962b09404a1d813857578149b8815f35d3ee5752f44cd378d0f31669d4b1d7e2d11f41e08283d5134bd1f + languageName: node + linkType: hard + +"set-function-length@npm:^1.2.1": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c + languageName: node + linkType: hard + +"setprototypeof@npm:1.1.0": + version: 1.1.0 + resolution: "setprototypeof@npm:1.1.0" + checksum: 10c0/a77b20876689c6a89c3b42f0c3596a9cae02f90fc902570cbd97198e9e8240382086c9303ad043e88cee10f61eae19f1004e51d885395a1e9bf49f9ebed12872 + languageName: node + linkType: hard + +"setprototypeof@npm:1.2.0": + version: 1.2.0 + resolution: "setprototypeof@npm:1.2.0" + checksum: 10c0/68733173026766fa0d9ecaeb07f0483f4c2dc70ca376b3b7c40b7cda909f94b0918f6c5ad5ce27a9160bdfb475efaa9d5e705a11d8eaae18f9835d20976028bc + languageName: node + linkType: hard + +"shallow-clone@npm:^3.0.0": + version: 3.0.1 + resolution: "shallow-clone@npm:3.0.1" + dependencies: + kind-of: "npm:^6.0.2" + checksum: 10c0/7bab09613a1b9f480c85a9823aebec533015579fa055ba6634aa56ba1f984380670eaf33b8217502931872aa1401c9fcadaa15f9f604d631536df475b05bcf1e + languageName: node + linkType: hard + +"shallowequal@npm:^1.1.0": + version: 1.1.0 + resolution: "shallowequal@npm:1.1.0" + checksum: 10c0/b926efb51cd0f47aa9bc061add788a4a650550bbe50647962113a4579b60af2abe7b62f9b02314acc6f97151d4cf87033a2b15fc20852fae306d1a095215396c + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"shell-quote@npm:^1.8.1": + version: 1.8.1 + resolution: "shell-quote@npm:1.8.1" + checksum: 10c0/8cec6fd827bad74d0a49347057d40dfea1e01f12a6123bf82c4649f3ef152fc2bc6d6176e6376bffcd205d9d0ccb4f1f9acae889384d20baff92186f01ea455a + languageName: node + linkType: hard + +"shiki@npm:^0.14.7": + version: 0.14.7 + resolution: "shiki@npm:0.14.7" + dependencies: + ansi-sequence-parser: "npm:^1.1.0" + jsonc-parser: "npm:^3.2.0" + vscode-oniguruma: "npm:^1.7.0" + vscode-textmate: "npm:^8.0.0" + checksum: 10c0/5c7fcbb870d0facccc7ae2f3410a28121f8e0b3f298e4e956de817ad6ab60a4c7e20a9184edfe50a93447addbb88b95b69e6ef88ac16ac6ca3e94c50771a6459 + languageName: node + linkType: hard + +"side-channel@npm:^1.0.6": + version: 1.0.6 + resolution: "side-channel@npm:1.0.6" + dependencies: + call-bind: "npm:^1.0.7" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.4" + object-inspect: "npm:^1.13.1" + checksum: 10c0/d2afd163dc733cc0a39aa6f7e39bf0c436293510dbccbff446733daeaf295857dbccf94297092ec8c53e2503acac30f0b78830876f0485991d62a90e9cad305f + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + languageName: node + linkType: hard + +"sirv@npm:^2.0.3": + version: 2.0.4 + resolution: "sirv@npm:2.0.4" + dependencies: + "@polka/url": "npm:^1.0.0-next.24" + mrmime: "npm:^2.0.0" + totalist: "npm:^3.0.0" + checksum: 10c0/68f8ee857f6a9415e9c07a1f31c7c561df8d5f1b1ba79bee3de583fa37da8718def5309f6b1c6e2c3ef77de45d74f5e49efc7959214443aa92d42e9c99180a4e + languageName: node + linkType: hard + +"sisteransi@npm:^1.0.5": + version: 1.0.5 + resolution: "sisteransi@npm:1.0.5" + checksum: 10c0/230ac975cca485b7f6fe2b96a711aa62a6a26ead3e6fb8ba17c5a00d61b8bed0d7adc21f5626b70d7c33c62ff4e63933017a6462942c719d1980bb0b1207ad46 + languageName: node + linkType: hard + +"sitemap@npm:^7.1.1": + version: 7.1.1 + resolution: "sitemap@npm:7.1.1" + dependencies: + "@types/node": "npm:^17.0.5" + "@types/sax": "npm:^1.2.1" + arg: "npm:^5.0.0" + sax: "npm:^1.2.4" + bin: + sitemap: dist/cli.js + checksum: 10c0/d25abe5c78f08e6014792e0f4d59353042a5a795788decdd87cb03bda736d248426a618e5028e18325f04b3e9d0ecb02d126ed6177365aa2703fa77df8f4f4e0 + languageName: node + linkType: hard + +"skin-tone@npm:^2.0.0": + version: 2.0.0 + resolution: "skin-tone@npm:2.0.0" + dependencies: + unicode-emoji-modifier-base: "npm:^1.0.0" + checksum: 10c0/82d4c2527864f9cbd6cb7f3c4abb31e2224752234d5013b881d3e34e9ab543545b05206df5a17d14b515459fcb265ce409f9cfe443903176b0360cd20e4e4ba5 + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 10c0/e18488c6a42bdfd4ac5be85b2ced3ccd0224773baae6ad42cfbb9ec74fc07f9fa8396bd35ee638084ead7a2a0818eb5e7151111544d4731ce843019dab4be47b + languageName: node + linkType: hard + +"slash@npm:^4.0.0": + version: 4.0.0 + resolution: "slash@npm:4.0.0" + checksum: 10c0/b522ca75d80d107fd30d29df0549a7b2537c83c4c4ecd12cd7d4ea6c8aaca2ab17ada002e7a1d78a9d736a0261509f26ea5b489082ee443a3a810586ef8eff18 + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"snake-case@npm:^3.0.4": + version: 3.0.4 + resolution: "snake-case@npm:3.0.4" + dependencies: + dot-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/ab19a913969f58f4474fe9f6e8a026c8a2142a01f40b52b79368068343177f818cdfef0b0c6b9558f298782441d5ca8ed5932eb57822439fad791d866e62cecd + languageName: node + linkType: hard + +"sockjs@npm:^0.3.24": + version: 0.3.24 + resolution: "sockjs@npm:0.3.24" + dependencies: + faye-websocket: "npm:^0.11.3" + uuid: "npm:^8.3.2" + websocket-driver: "npm:^0.7.4" + checksum: 10c0/aa102c7d921bf430215754511c81ea7248f2dcdf268fbdb18e4d8183493a86b8793b164c636c52f474a886f747447c962741df2373888823271efdb9d2594f33 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + socks: "npm:^2.8.3" + checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 + languageName: node + linkType: hard + +"socks@npm:^2.8.3": + version: 2.8.3 + resolution: "socks@npm:2.8.3" + dependencies: + ip-address: "npm:^9.0.5" + smart-buffer: "npm:^4.2.0" + checksum: 10c0/d54a52bf9325165770b674a67241143a3d8b4e4c8884560c4e0e078aace2a728dffc7f70150660f51b85797c4e1a3b82f9b7aa25e0a0ceae1a243365da5c51a7 + languageName: node + linkType: hard + +"sort-css-media-queries@npm:2.2.0": + version: 2.2.0 + resolution: "sort-css-media-queries@npm:2.2.0" + checksum: 10c0/7478308c7ca93409f959ab993d41de2f0515ed5f51b671908ecb777aae0d63be97b454d59d80e14ee4874884618a2e825d4ae7ccb225779276904dd175f4e766 + languageName: node + linkType: hard + +"source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + +"source-map-support@npm:~0.5.20": + version: 0.5.21 + resolution: "source-map-support@npm:0.5.21" + dependencies: + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 10c0/9ee09942f415e0f721d6daad3917ec1516af746a8120bba7bb56278707a37f1eb8642bde456e98454b8a885023af81a16e646869975f06afc1a711fb90484e7d + languageName: node + linkType: hard + +"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.0": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 + languageName: node + linkType: hard + +"source-map@npm:^0.7.0": + version: 0.7.4 + resolution: "source-map@npm:0.7.4" + checksum: 10c0/dc0cf3768fe23c345ea8760487f8c97ef6fca8a73c83cd7c9bf2fde8bc2c34adb9c0824d6feb14bc4f9e37fb522e18af621543f1289038a66ac7586da29aa7dc + languageName: node + linkType: hard + +"space-separated-tokens@npm:^2.0.0": + version: 2.0.2 + resolution: "space-separated-tokens@npm:2.0.2" + checksum: 10c0/6173e1d903dca41dcab6a2deed8b4caf61bd13b6d7af8374713500570aa929ff9414ae09a0519f4f8772df993300305a395d4871f35bc4ca72b6db57e1f30af8 + languageName: node + linkType: hard + +"spdy-transport@npm:^3.0.0": + version: 3.0.0 + resolution: "spdy-transport@npm:3.0.0" + dependencies: + debug: "npm:^4.1.0" + detect-node: "npm:^2.0.4" + hpack.js: "npm:^2.1.6" + obuf: "npm:^1.1.2" + readable-stream: "npm:^3.0.6" + wbuf: "npm:^1.7.3" + checksum: 10c0/eaf7440fa90724fffc813c386d4a8a7427d967d6e46d7c51d8f8a533d1a6911b9823ea9218703debbae755337e85f110185d7a00ae22ec5c847077b908ce71bb + languageName: node + linkType: hard + +"spdy@npm:^4.0.2": + version: 4.0.2 + resolution: "spdy@npm:4.0.2" + dependencies: + debug: "npm:^4.1.0" + handle-thing: "npm:^2.0.0" + http-deceiver: "npm:^1.2.7" + select-hose: "npm:^2.0.0" + spdy-transport: "npm:^3.0.0" + checksum: 10c0/983509c0be9d06fd00bb9dff713c5b5d35d3ffd720db869acdd5ad7aa6fc0e02c2318b58f75328957d8ff772acdf1f7d19382b6047df342044ff3e2d6805ccdf + languageName: node + linkType: hard + +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb + languageName: node + linkType: hard + +"srcset@npm:^4.0.0": + version: 4.0.0 + resolution: "srcset@npm:4.0.0" + checksum: 10c0/0685c3bd2423b33831734fb71560cd8784f024895e70ee2ac2c392e30047c27ffd9481e001950fb0503f4906bc3fe963145935604edad77944d09c9800990660 + languageName: node + linkType: hard + +"ssri@npm:^12.0.0": + version: 12.0.0 + resolution: "ssri@npm:12.0.0" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/caddd5f544b2006e88fa6b0124d8d7b28208b83c72d7672d5ade44d794525d23b540f3396108c4eb9280dcb7c01f0bef50682f5b4b2c34291f7c5e211fd1417d + languageName: node + linkType: hard + +"statuses@npm:2.0.1": + version: 2.0.1 + resolution: "statuses@npm:2.0.1" + checksum: 10c0/34378b207a1620a24804ce8b5d230fea0c279f00b18a7209646d5d47e419d1cc23e7cbf33a25a1e51ac38973dc2ac2e1e9c647a8e481ef365f77668d72becfd0 + languageName: node + linkType: hard + +"statuses@npm:>= 1.4.0 < 2": + version: 1.5.0 + resolution: "statuses@npm:1.5.0" + checksum: 10c0/e433900956357b3efd79b1c547da4d291799ac836960c016d10a98f6a810b1b5c0dcc13b5a7aa609a58239b5190e1ea176ad9221c2157d2fd1c747393e6b2940 + languageName: node + linkType: hard + +"std-env@npm:^3.7.0": + version: 3.8.1 + resolution: "std-env@npm:3.8.1" + checksum: 10c0/e9b19cca6bc6f06f91607db5b636662914ca8ec9efc525a99da6ec7e493afec109d3b017d21d9782b4369fcfb2891c7c4b4e3c60d495fdadf6861ce434e07bf8 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: "npm:~5.2.0" + checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d + languageName: node + linkType: hard + +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: "npm:~5.1.0" + checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e + languageName: node + linkType: hard + +"stringify-entities@npm:^4.0.0": + version: 4.0.3 + resolution: "stringify-entities@npm:4.0.3" + dependencies: + character-entities-html4: "npm:^2.0.0" + character-entities-legacy: "npm:^3.0.0" + checksum: 10c0/e4582cd40b082e95bc2075bed656dcbc24e83538830f15cb5a025f1ba8d341adbdb3c66efb6a5bfd6860a3ea426322135aa666cf128bf03c961553e2f9f2d4ed + languageName: node + linkType: hard + +"stringify-object@npm:^3.3.0": + version: 3.3.0 + resolution: "stringify-object@npm:3.3.0" + dependencies: + get-own-enumerable-property-symbols: "npm:^3.0.0" + is-obj: "npm:^1.0.1" + is-regexp: "npm:^1.0.0" + checksum: 10c0/ba8078f84128979ee24b3de9a083489cbd3c62cb8572a061b47d4d82601a8ae4b4d86fa8c54dd955593da56bb7c16a6de51c27221fdc6b7139bb4f29d815f35b + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.0.1 + resolution: "strip-ansi@npm:7.0.1" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: 10c0/a94805f54caefae6cf4870ee6acfe50cff69d90a37994bf02c096042d9939ee211e1568f34b9fa5efa03c7d7fea79cb3ac8a4e517ceb848284ae300da06ca7e9 + languageName: node + linkType: hard + +"strip-bom-string@npm:^1.0.0": + version: 1.0.0 + resolution: "strip-bom-string@npm:1.0.0" + checksum: 10c0/5c5717e2643225aa6a6d659d34176ab2657037f1fe2423ac6fcdb488f135e14fef1022030e426d8b4d0989e09adbd5c3288d5d3b9c632abeefd2358dfc512bca + languageName: node + linkType: hard + +"strip-final-newline@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-final-newline@npm:2.0.0" + checksum: 10c0/bddf8ccd47acd85c0e09ad7375409d81653f645fda13227a9d459642277c253d877b68f2e5e4d819fe75733b0e626bac7e954c04f3236f6d196f79c94fa4a96f + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd + languageName: node + linkType: hard + +"strip-json-comments@npm:~2.0.1": + version: 2.0.1 + resolution: "strip-json-comments@npm:2.0.1" + checksum: 10c0/b509231cbdee45064ff4f9fd73609e2bcc4e84a4d508e9dd0f31f70356473fde18abfb5838c17d56fb236f5a06b102ef115438de0600b749e818a35fbbc48c43 + languageName: node + linkType: hard + +"style-to-object@npm:^0.4.0": + version: 0.4.4 + resolution: "style-to-object@npm:0.4.4" + dependencies: + inline-style-parser: "npm:0.1.1" + checksum: 10c0/3a733080da66952881175b17d65f92985cf94c1ca358a92cf21b114b1260d49b94a404ed79476047fb95698d64c7e366ca7443f0225939e2fb34c38bbc9c7639 + languageName: node + linkType: hard + +"style-to-object@npm:^1.0.0": + version: 1.0.6 + resolution: "style-to-object@npm:1.0.6" + dependencies: + inline-style-parser: "npm:0.2.3" + checksum: 10c0/be5e8e3f0e35c0338de4112b9d861db576a52ebbd97f2501f1fb2c900d05c8fc42c5114407fa3a7f8b39301146cd8ca03a661bf52212394125a9629d5b771aba + languageName: node + linkType: hard + +"stylehacks@npm:^6.1.1": + version: 6.1.1 + resolution: "stylehacks@npm:6.1.1" + dependencies: + browserslist: "npm:^4.23.0" + postcss-selector-parser: "npm:^6.0.16" + peerDependencies: + postcss: ^8.4.31 + checksum: 10c0/2dd2bccfd8311ff71492e63a7b8b86c3d7b1fff55d4ba5a2357aff97743e633d351cdc2f5ae3c0057637d00dab4ef5fc5b218a1b370e4585a41df22b5a5128be + languageName: node + linkType: hard + +"stylis@npm:^4.3.6": + version: 4.3.6 + resolution: "stylis@npm:4.3.6" + checksum: 10c0/e736d484983a34f7c65d362c67dc79b7bce388054b261c2b7b23d02eaaf280617033f65d44b1ea341854f4331a5074b885668ac8741f98c13a6cfd6443ae85d0 + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: "npm:^3.0.0" + checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 + languageName: node + linkType: hard + +"supports-color@npm:^8.0.0": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 + languageName: node + linkType: hard + +"svg-parser@npm:^2.0.4": + version: 2.0.4 + resolution: "svg-parser@npm:2.0.4" + checksum: 10c0/02f6cb155dd7b63ebc2f44f36365bc294543bebb81b614b7628f1af3c54ab64f7e1cec20f06e252bf95bdde78441ae295a412c68ad1678f16a6907d924512b7a + languageName: node + linkType: hard + +"svgo@npm:^3.0.2, svgo@npm:^3.2.0": + version: 3.3.2 + resolution: "svgo@npm:3.3.2" + dependencies: + "@trysound/sax": "npm:0.2.0" + commander: "npm:^7.2.0" + css-select: "npm:^5.1.0" + css-tree: "npm:^2.3.1" + css-what: "npm:^6.1.0" + csso: "npm:^5.0.5" + picocolors: "npm:^1.0.0" + bin: + svgo: ./bin/svgo + checksum: 10c0/a6badbd3d1d6dbb177f872787699ab34320b990d12e20798ecae915f0008796a0f3c69164f1485c9def399e0ce0a5683eb4a8045e51a5e1c364bb13a0d9f79e1 + languageName: node + linkType: hard + +"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: 10c0/bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 + languageName: node + linkType: hard + +"tar@npm:^7.4.3": + version: 7.4.3 + resolution: "tar@npm:7.4.3" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.0.1" + mkdirp: "npm:^3.0.1" + yallist: "npm:^5.0.0" + checksum: 10c0/d4679609bb2a9b48eeaf84632b6d844128d2412b95b6de07d53d8ee8baf4ca0857c9331dfa510390a0727b550fd543d4d1a10995ad86cdf078423fbb8d99831d + languageName: node + linkType: hard + +"terser-webpack-plugin@npm:^5.3.10, terser-webpack-plugin@npm:^5.3.9": + version: 5.3.10 + resolution: "terser-webpack-plugin@npm:5.3.10" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.20" + jest-worker: "npm:^27.4.5" + schema-utils: "npm:^3.1.1" + serialize-javascript: "npm:^6.0.1" + terser: "npm:^5.26.0" + peerDependencies: + webpack: ^5.1.0 + peerDependenciesMeta: + "@swc/core": + optional: true + esbuild: + optional: true + uglify-js: + optional: true + checksum: 10c0/66d1ed3174542560911cf96f4716aeea8d60e7caab212291705d50072b6ba844c7391442541b13c848684044042bea9ec87512b8506528c12854943da05faf91 + languageName: node + linkType: hard + +"terser-webpack-plugin@npm:^5.3.11": + version: 5.3.14 + resolution: "terser-webpack-plugin@npm:5.3.14" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.25" + jest-worker: "npm:^27.4.5" + schema-utils: "npm:^4.3.0" + serialize-javascript: "npm:^6.0.2" + terser: "npm:^5.31.1" + peerDependencies: + webpack: ^5.1.0 + peerDependenciesMeta: + "@swc/core": + optional: true + esbuild: + optional: true + uglify-js: + optional: true + checksum: 10c0/9b060947241af43bd6fd728456f60e646186aef492163672a35ad49be6fbc7f63b54a7356c3f6ff40a8f83f00a977edc26f044b8e106cc611c053c8c0eaf8569 + languageName: node + linkType: hard + +"terser@npm:^5.10.0, terser@npm:^5.15.1, terser@npm:^5.26.0": + version: 5.30.0 + resolution: "terser@npm:5.30.0" + dependencies: + "@jridgewell/source-map": "npm:^0.3.3" + acorn: "npm:^8.8.2" + commander: "npm:^2.20.0" + source-map-support: "npm:~0.5.20" + bin: + terser: bin/terser + checksum: 10c0/f648e4ad775a04ea89c6f935762a78ad41adf6d65b69f793dfa8d995b12accefd261ccc06965d15ae2b62b8b6bc52029adf90d2193c5e850a230ff89ea9a7518 + languageName: node + linkType: hard + +"terser@npm:^5.31.1": + version: 5.39.0 + resolution: "terser@npm:5.39.0" + dependencies: + "@jridgewell/source-map": "npm:^0.3.3" + acorn: "npm:^8.8.2" + commander: "npm:^2.20.0" + source-map-support: "npm:~0.5.20" + bin: + terser: bin/terser + checksum: 10c0/83326545ea1aecd6261030568b6191ccfa4cb6aa61d9ea41746a52479f50017a78b77e4725fbbc207c5df841ffa66a773c5ac33636e95c7ab94fe7e0379ae5c7 + languageName: node + linkType: hard + +"thunky@npm:^1.0.2": + version: 1.1.0 + resolution: "thunky@npm:1.1.0" + checksum: 10c0/369764f39de1ce1de2ba2fa922db4a3f92e9c7f33bcc9a713241bc1f4a5238b484c17e0d36d1d533c625efb00e9e82c3e45f80b47586945557b45abb890156d2 + languageName: node + linkType: hard + +"tiny-invariant@npm:^1.0.2": + version: 1.2.0 + resolution: "tiny-invariant@npm:1.2.0" + checksum: 10c0/a7dd29c5256fdc4901e3adadaa203da62bd23c6a79830f7aa99ea2df5e2e82f84051550dcafb82af18b2d61d75dcc17993f01f938e9ad8f20cf4c514fff88d47 + languageName: node + linkType: hard + +"tiny-warning@npm:^1.0.0": + version: 1.0.3 + resolution: "tiny-warning@npm:1.0.3" + checksum: 10c0/ef8531f581b30342f29670cb41ca248001c6fd7975ce22122bd59b8d62b4fc84ad4207ee7faa95cde982fa3357cd8f4be650142abc22805538c3b1392d7084fa + languageName: node + linkType: hard + +"tinyexec@npm:^0.3.2": + version: 0.3.2 + resolution: "tinyexec@npm:0.3.2" + checksum: 10c0/3efbf791a911be0bf0821eab37a3445c2ba07acc1522b1fa84ae1e55f10425076f1290f680286345ed919549ad67527d07281f1c19d584df3b74326909eb1f90 + languageName: node + linkType: hard + +"tinypool@npm:^1.0.2": + version: 1.1.0 + resolution: "tinypool@npm:1.1.0" + checksum: 10c0/deb6bde5e3d85d4ba043806c66f43fb5b649716312a47b52761a83668ffc71cd0ea4e24254c1b02a3702e5c27e02605f0189a1460f6284a5930a08bd0c06435c + languageName: node + linkType: hard + +"to-fast-properties@npm:^2.0.0": + version: 2.0.0 + resolution: "to-fast-properties@npm:2.0.0" + checksum: 10c0/b214d21dbfb4bce3452b6244b336806ffea9c05297148d32ebb428d5c43ce7545bdfc65a1ceb58c9ef4376a65c0cb2854d645f33961658b3e3b4f84910ddcdd7 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 + languageName: node + linkType: hard + +"toidentifier@npm:1.0.1": + version: 1.0.1 + resolution: "toidentifier@npm:1.0.1" + checksum: 10c0/93937279934bd66cc3270016dd8d0afec14fb7c94a05c72dc57321f8bd1fa97e5bea6d1f7c89e728d077ca31ea125b78320a616a6c6cd0e6b9cb94cb864381c1 + languageName: node + linkType: hard + +"totalist@npm:^3.0.0": + version: 3.0.1 + resolution: "totalist@npm:3.0.1" + checksum: 10c0/4bb1fadb69c3edbef91c73ebef9d25b33bbf69afe1e37ce544d5f7d13854cda15e47132f3e0dc4cafe300ddb8578c77c50a65004d8b6e97e77934a69aa924863 + languageName: node + linkType: hard + +"trim-lines@npm:^3.0.0": + version: 3.0.1 + resolution: "trim-lines@npm:3.0.1" + checksum: 10c0/3a1611fa9e52aa56a94c69951a9ea15b8aaad760eaa26c56a65330dc8adf99cb282fc07cc9d94968b7d4d88003beba220a7278bbe2063328eb23fb56f9509e94 + languageName: node + linkType: hard + +"trough@npm:^2.0.0": + version: 2.2.0 + resolution: "trough@npm:2.2.0" + checksum: 10c0/58b671fc970e7867a48514168894396dd94e6d9d6456aca427cc299c004fe67f35ed7172a36449086b2edde10e78a71a284ec0076809add6834fb8f857ccb9b0 + languageName: node + linkType: hard + +"ts-dedent@npm:^2.2.0": + version: 2.2.0 + resolution: "ts-dedent@npm:2.2.0" + checksum: 10c0/175adea838468cc2ff7d5e97f970dcb798bbcb623f29c6088cb21aa2880d207c5784be81ab1741f56b9ac37840cbaba0c0d79f7f8b67ffe61c02634cafa5c303 + languageName: node + linkType: hard + +"tslib@npm:^2.0.3, tslib@npm:^2.6.0": + version: 2.6.2 + resolution: "tslib@npm:2.6.2" + checksum: 10c0/e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb + languageName: node + linkType: hard + +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: 10c0/902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 + languageName: node + linkType: hard + +"type-fest@npm:^1.0.1": + version: 1.4.0 + resolution: "type-fest@npm:1.4.0" + checksum: 10c0/a3c0f4ee28ff6ddf800d769eafafcdeab32efa38763c1a1b8daeae681920f6e345d7920bf277245235561d8117dab765cb5f829c76b713b4c9de0998a5397141 + languageName: node + linkType: hard + +"type-fest@npm:^2.13.0, type-fest@npm:^2.5.0": + version: 2.19.0 + resolution: "type-fest@npm:2.19.0" + checksum: 10c0/a5a7ecf2e654251613218c215c7493574594951c08e52ab9881c9df6a6da0aeca7528c213c622bc374b4e0cb5c443aa3ab758da4e3c959783ce884c3194e12cb + languageName: node + linkType: hard + +"type-is@npm:~1.6.18": + version: 1.6.18 + resolution: "type-is@npm:1.6.18" + dependencies: + media-typer: "npm:0.3.0" + mime-types: "npm:~2.1.24" + checksum: 10c0/a23daeb538591b7efbd61ecf06b6feb2501b683ffdc9a19c74ef5baba362b4347e42f1b4ed81f5882a8c96a3bfff7f93ce3ffaf0cbbc879b532b04c97a55db9d + languageName: node + linkType: hard + +"typedarray-to-buffer@npm:^3.1.5": + version: 3.1.5 + resolution: "typedarray-to-buffer@npm:3.1.5" + dependencies: + is-typedarray: "npm:^1.0.0" + checksum: 10c0/4ac5b7a93d604edabf3ac58d3a2f7e07487e9f6e98195a080e81dbffdc4127817f470f219d794a843b87052cedef102b53ac9b539855380b8c2172054b7d5027 + languageName: node + linkType: hard + +"typedoc-plugin-markdown@npm:3.17.1": + version: 3.17.1 + resolution: "typedoc-plugin-markdown@npm:3.17.1" + dependencies: + handlebars: "npm:^4.7.7" + peerDependencies: + typedoc: ">=0.24.0" + checksum: 10c0/5c9322cd6b5218b1c8b18e6c9df45ad0f99dea9b9cee4006f1f286b04725db47e26856b3e07069beabbd65d8357da34563707d50027b19bb18fd3633a3591349 + languageName: node + linkType: hard + +"typedoc@npm:0.25.9": + version: 0.25.9 + resolution: "typedoc@npm:0.25.9" + dependencies: + lunr: "npm:^2.3.9" + marked: "npm:^4.3.0" + minimatch: "npm:^9.0.3" + shiki: "npm:^0.14.7" + peerDependencies: + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x + bin: + typedoc: bin/typedoc + checksum: 10c0/6964bbe2bbaf3aa9f538bc5b4199086fa3affd87796895cb0464caa9d6594ad883348273385cf3babc37ff95622d264eebf305bdfb35cebb94c3570c57080cff + languageName: node + linkType: hard + +"typescript@npm:5.3.3": + version: 5.3.3 + resolution: "typescript@npm:5.3.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/e33cef99d82573624fc0f854a2980322714986bc35b9cb4d1ce736ed182aeab78e2cb32b385efa493b2a976ef52c53e20d6c6918312353a91850e2b76f1ea44f + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A5.3.3#optional!builtin": + version: 5.3.3 + resolution: "typescript@patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/1d0a5f4ce496c42caa9a30e659c467c5686eae15d54b027ee7866744952547f1be1262f2d40de911618c242b510029d51d43ff605dba8fb740ec85ca2d3f9500 + languageName: node + linkType: hard + +"ufo@npm:^1.5.4": + version: 1.5.4 + resolution: "ufo@npm:1.5.4" + checksum: 10c0/b5dc4dc435c49c9ef8890f1b280a19ee4d0954d1d6f9ab66ce62ce64dd04c7be476781531f952a07c678d51638d02ad4b98e16237be29149295b0f7c09cda765 + languageName: node + linkType: hard + +"uglify-js@npm:^3.1.4": + version: 3.17.4 + resolution: "uglify-js@npm:3.17.4" + bin: + uglifyjs: bin/uglifyjs + checksum: 10c0/8b7fcdca69deb284fed7d2025b73eb747ce37f9aca6af53422844f46427152d5440601b6e2a033e77856a2f0591e4167153d5a21b68674ad11f662034ec13ced + languageName: node + linkType: hard + +"unicode-canonical-property-names-ecmascript@npm:^2.0.0": + version: 2.0.0 + resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" + checksum: 10c0/0fe812641bcfa3ae433025178a64afb5d9afebc21a922dafa7cba971deebb5e4a37350423890750132a85c936c290fb988146d0b1bd86838ad4897f4fc5bd0de + languageName: node + linkType: hard + +"unicode-emoji-modifier-base@npm:^1.0.0": + version: 1.0.0 + resolution: "unicode-emoji-modifier-base@npm:1.0.0" + checksum: 10c0/b37623fcf0162186debd20f116483e035a2d5b905b932a2c472459d9143d446ebcbefb2a494e2fe4fa7434355396e2a95ec3fc1f0c29a3bc8f2c827220e79c66 + languageName: node + linkType: hard + +"unicode-match-property-ecmascript@npm:^2.0.0": + version: 2.0.0 + resolution: "unicode-match-property-ecmascript@npm:2.0.0" + dependencies: + unicode-canonical-property-names-ecmascript: "npm:^2.0.0" + unicode-property-aliases-ecmascript: "npm:^2.0.0" + checksum: 10c0/4d05252cecaf5c8e36d78dc5332e03b334c6242faf7cf16b3658525441386c0a03b5f603d42cbec0f09bb63b9fd25c9b3b09667aee75463cac3efadae2cd17ec + languageName: node + linkType: hard + +"unicode-match-property-value-ecmascript@npm:^2.1.0": + version: 2.1.0 + resolution: "unicode-match-property-value-ecmascript@npm:2.1.0" + checksum: 10c0/f5b9499b9e0ffdc6027b744d528f17ec27dd7c15da03254ed06851feec47e0531f20d410910c8a49af4a6a190f4978413794c8d75ce112950b56d583b5d5c7f2 + languageName: node + linkType: hard + +"unicode-property-aliases-ecmascript@npm:^2.0.0": + version: 2.0.0 + resolution: "unicode-property-aliases-ecmascript@npm:2.0.0" + checksum: 10c0/db7f7ae188ce1a59b133a2c97021aebe30acc18a55f41074d126dcce5ac9d789dbd3ce7947e391b23db27f969251037b6ae05871d036aaa6cc0a6510c429aa1c + languageName: node + linkType: hard + +"unified@npm:^11.0.0, unified@npm:^11.0.3, unified@npm:^11.0.4": + version: 11.0.4 + resolution: "unified@npm:11.0.4" + dependencies: + "@types/unist": "npm:^3.0.0" + bail: "npm:^2.0.0" + devlop: "npm:^1.0.0" + extend: "npm:^3.0.0" + is-plain-obj: "npm:^4.0.0" + trough: "npm:^2.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/b550cdc994d54c84e2e098eb02cfa53535cbc140c148aa3296f235cb43082b499d239110f342fa65eb37ad919472a93cc62f062a83541485a69498084cc87ba1 + languageName: node + linkType: hard + +"unique-filename@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-filename@npm:4.0.0" + dependencies: + unique-slug: "npm:^5.0.0" + checksum: 10c0/38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc + languageName: node + linkType: hard + +"unique-slug@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-slug@npm:5.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10c0/d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293 + languageName: node + linkType: hard + +"unique-string@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-string@npm:3.0.0" + dependencies: + crypto-random-string: "npm:^4.0.0" + checksum: 10c0/b35ea034b161b2a573666ec16c93076b4b6106b8b16c2415808d747ab3a0566b5db0c4be231d4b11cfbc16d7fd915c9d8a45884bff0e2db11b799775b2e1e017 + languageName: node + linkType: hard + +"unist-util-is@npm:^6.0.0": + version: 6.0.0 + resolution: "unist-util-is@npm:6.0.0" + dependencies: + "@types/unist": "npm:^3.0.0" + checksum: 10c0/9419352181eaa1da35eca9490634a6df70d2217815bb5938a04af3a662c12c5607a2f1014197ec9c426fbef18834f6371bfdb6f033040fa8aa3e965300d70e7e + languageName: node + linkType: hard + +"unist-util-position-from-estree@npm:^2.0.0": + version: 2.0.0 + resolution: "unist-util-position-from-estree@npm:2.0.0" + dependencies: + "@types/unist": "npm:^3.0.0" + checksum: 10c0/39127bf5f0594e0a76d9241dec4f7aa26323517120ce1edd5ed91c8c1b9df7d6fb18af556e4b6250f1c7368825720ed892e2b6923be5cdc08a9bb16536dc37b3 + languageName: node + linkType: hard + +"unist-util-position@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-position@npm:5.0.0" + dependencies: + "@types/unist": "npm:^3.0.0" + checksum: 10c0/dde3b31e314c98f12b4dc6402f9722b2bf35e96a4f2d463233dd90d7cde2d4928074a7a11eff0a5eb1f4e200f27fc1557e0a64a7e8e4da6558542f251b1b7400 + languageName: node + linkType: hard + +"unist-util-remove-position@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-remove-position@npm:5.0.0" + dependencies: + "@types/unist": "npm:^3.0.0" + unist-util-visit: "npm:^5.0.0" + checksum: 10c0/e8c76da4399446b3da2d1c84a97c607b37d03d1d92561e14838cbe4fdcb485bfc06c06cfadbb808ccb72105a80643976d0660d1fe222ca372203075be9d71105 + languageName: node + linkType: hard + +"unist-util-stringify-position@npm:^4.0.0": + version: 4.0.0 + resolution: "unist-util-stringify-position@npm:4.0.0" + dependencies: + "@types/unist": "npm:^3.0.0" + checksum: 10c0/dfe1dbe79ba31f589108cb35e523f14029b6675d741a79dea7e5f3d098785045d556d5650ec6a8338af11e9e78d2a30df12b1ee86529cded1098da3f17ee999e + languageName: node + linkType: hard + +"unist-util-visit-parents@npm:^6.0.0": + version: 6.0.1 + resolution: "unist-util-visit-parents@npm:6.0.1" + dependencies: + "@types/unist": "npm:^3.0.0" + unist-util-is: "npm:^6.0.0" + checksum: 10c0/51b1a5b0aa23c97d3e03e7288f0cdf136974df2217d0999d3de573c05001ef04cccd246f51d2ebdfb9e8b0ed2704451ad90ba85ae3f3177cf9772cef67f56206 + languageName: node + linkType: hard + +"unist-util-visit@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-visit@npm:5.0.0" + dependencies: + "@types/unist": "npm:^3.0.0" + unist-util-is: "npm:^6.0.0" + unist-util-visit-parents: "npm:^6.0.0" + checksum: 10c0/51434a1d80252c1540cce6271a90fd1a106dbe624997c09ed8879279667fb0b2d3a685e02e92bf66598dcbe6cdffa7a5f5fb363af8fdf90dda6c855449ae39a5 + languageName: node + linkType: hard + +"universalify@npm:^2.0.0": + version: 2.0.0 + resolution: "universalify@npm:2.0.0" + checksum: 10c0/07092b9f46df61b823d8ab5e57f0ee5120c178b39609a95e4a15a98c42f6b0b8e834e66fbb47ff92831786193be42f1fd36347169b88ce8639d0f9670af24a71 + languageName: node + linkType: hard + +"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": + version: 1.0.0 + resolution: "unpipe@npm:1.0.0" + checksum: 10c0/193400255bd48968e5c5383730344fbb4fa114cdedfab26e329e50dd2d81b134244bb8a72c6ac1b10ab0281a58b363d06405632c9d49ca9dfd5e90cbd7d0f32c + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.1.0": + version: 1.1.0 + resolution: "update-browserslist-db@npm:1.1.0" + dependencies: + escalade: "npm:^3.1.2" + picocolors: "npm:^1.0.1" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 10c0/a7452de47785842736fb71547651c5bbe5b4dc1e3722ccf48a704b7b34e4dcf633991eaa8e4a6a517ffb738b3252eede3773bef673ef9021baa26b056d63a5b9 + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.1.1, update-browserslist-db@npm:^1.1.3": + version: 1.1.3 + resolution: "update-browserslist-db@npm:1.1.3" + dependencies: + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.1" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 10c0/682e8ecbf9de474a626f6462aa85927936cdd256fe584c6df2508b0df9f7362c44c957e9970df55dfe44d3623807d26316ea2c7d26b80bb76a16c56c37233c32 + languageName: node + linkType: hard + +"update-notifier@npm:^6.0.2": + version: 6.0.2 + resolution: "update-notifier@npm:6.0.2" + dependencies: + boxen: "npm:^7.0.0" + chalk: "npm:^5.0.1" + configstore: "npm:^6.0.0" + has-yarn: "npm:^3.0.0" + import-lazy: "npm:^4.0.0" + is-ci: "npm:^3.0.1" + is-installed-globally: "npm:^0.4.0" + is-npm: "npm:^6.0.0" + is-yarn-global: "npm:^0.4.0" + latest-version: "npm:^7.0.0" + pupa: "npm:^3.1.0" + semver: "npm:^7.3.7" + semver-diff: "npm:^4.0.0" + xdg-basedir: "npm:^5.1.0" + checksum: 10c0/ad3980073312df904133a6e6c554a7f9d0832ed6275e55f5a546313fe77a0f20f23a7b1b4aeb409e20a78afb06f4d3b2b28b332d9cfb55745b5d1ea155810bcc + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + languageName: node + linkType: hard + +"url-loader@npm:^4.1.1": + version: 4.1.1 + resolution: "url-loader@npm:4.1.1" + dependencies: + loader-utils: "npm:^2.0.0" + mime-types: "npm:^2.1.27" + schema-utils: "npm:^3.0.0" + peerDependencies: + file-loader: "*" + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + file-loader: + optional: true + checksum: 10c0/71b6300e02ce26c70625eae1a2297c0737635038c62691bb3007ac33e85c0130efc74bfb444baf5c6b3bad5953491159d31d66498967d1417865d0c7e7cd1a64 + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 + languageName: node + linkType: hard + +"utila@npm:~0.4": + version: 0.4.0 + resolution: "utila@npm:0.4.0" + checksum: 10c0/2791604e09ca4f77ae314df83e80d1805f867eb5c7e13e7413caee01273c278cf2c9a3670d8d25c889a877f7b149d892fe61b0181a81654b425e9622ab23d42e + languageName: node + linkType: hard + +"utility-types@npm:^3.10.0": + version: 3.10.0 + resolution: "utility-types@npm:3.10.0" + checksum: 10c0/79a6f7ea0cdd4fcafcec8c6e68e1e0cfa657e414b6f1696552d89ae70a3634b12ac6c16b7a0a3bfdb0a222ebc3d9a7649f2de434a78f2d65d318b50f314a85e4 + languageName: node + linkType: hard + +"utils-merge@npm:1.0.1": + version: 1.0.1 + resolution: "utils-merge@npm:1.0.1" + checksum: 10c0/02ba649de1b7ca8854bfe20a82f1dfbdda3fb57a22ab4a8972a63a34553cf7aa51bc9081cf7e001b035b88186d23689d69e71b510e610a09a4c66f68aa95b672 + languageName: node + linkType: hard + +"uuid@npm:^11.1.0": + version: 11.1.0 + resolution: "uuid@npm:11.1.0" + bin: + uuid: dist/esm/bin/uuid + checksum: 10c0/34aa51b9874ae398c2b799c88a127701408cd581ee89ec3baa53509dd8728cbb25826f2a038f9465f8b7be446f0fbf11558862965b18d21c993684297628d4d3 + languageName: node + linkType: hard + +"uuid@npm:^8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 10c0/bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54 + languageName: node + linkType: hard + +"value-equal@npm:^1.0.1": + version: 1.0.1 + resolution: "value-equal@npm:1.0.1" + checksum: 10c0/79068098355483ef29f4d3753999ad880875b87625d7e9055cad9346ea4b7662aad3a66f87976801b0dd7a6f828ba973d28b1669ebcd37eaf88cc5f687c1a691 + languageName: node + linkType: hard + +"vary@npm:~1.1.2": + version: 1.1.2 + resolution: "vary@npm:1.1.2" + checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f + languageName: node + linkType: hard + +"vfile-location@npm:^5.0.0": + version: 5.0.2 + resolution: "vfile-location@npm:5.0.2" + dependencies: + "@types/unist": "npm:^3.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/cfc7e49de93ac5be6f3c9a9fe77676756e00d33a6c69d9c1ce279b06eedafa67fe5d0da2334b40e97963c43b014501bca2f829dfd6622a3290fb6f7dd2b9339e + languageName: node + linkType: hard + +"vfile-message@npm:^4.0.0": + version: 4.0.2 + resolution: "vfile-message@npm:4.0.2" + dependencies: + "@types/unist": "npm:^3.0.0" + unist-util-stringify-position: "npm:^4.0.0" + checksum: 10c0/07671d239a075f888b78f318bc1d54de02799db4e9dce322474e67c35d75ac4a5ac0aaf37b18801d91c9f8152974ea39678aa72d7198758b07f3ba04fb7d7514 + languageName: node + linkType: hard + +"vfile@npm:^6.0.0, vfile@npm:^6.0.1": + version: 6.0.1 + resolution: "vfile@npm:6.0.1" + dependencies: + "@types/unist": "npm:^3.0.0" + unist-util-stringify-position: "npm:^4.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10c0/443bda43e5ad3b73c5976e987dba2b2d761439867ba7d5d7c5f4b01d3c1cb1b976f5f0e6b2399a00dc9b4eaec611bd9984ce9ce8a75a72e60aed518b10a902d2 + languageName: node + linkType: hard + +"vscode-jsonrpc@npm:8.2.0": + version: 8.2.0 + resolution: "vscode-jsonrpc@npm:8.2.0" + checksum: 10c0/0789c227057a844f5ead55c84679206227a639b9fb76e881185053abc4e9848aa487245966cc2393fcb342c4541241b015a1a2559fddd20ac1e68945c95344e6 + languageName: node + linkType: hard + +"vscode-languageserver-protocol@npm:3.17.5": + version: 3.17.5 + resolution: "vscode-languageserver-protocol@npm:3.17.5" + dependencies: + vscode-jsonrpc: "npm:8.2.0" + vscode-languageserver-types: "npm:3.17.5" + checksum: 10c0/5f38fd80da9868d706eaa4a025f4aff9c3faad34646bcde1426f915cbd8d7e8b6c3755ce3fef6eebd256ba3145426af1085305f8a76e34276d2e95aaf339a90b + languageName: node + linkType: hard + +"vscode-languageserver-textdocument@npm:~1.0.11": + version: 1.0.12 + resolution: "vscode-languageserver-textdocument@npm:1.0.12" + checksum: 10c0/534349894b059602c4d97615a1147b6c4c031141c2093e59657f54e38570f5989c21b376836f13b9375419869242e9efb4066643208b21ab1e1dee111a0f00fb + languageName: node + linkType: hard + +"vscode-languageserver-types@npm:3.17.5": + version: 3.17.5 + resolution: "vscode-languageserver-types@npm:3.17.5" + checksum: 10c0/1e1260de79a2cc8de3e46f2e0182cdc94a7eddab487db5a3bd4ee716f67728e685852707d72c059721ce500447be9a46764a04f0611e94e4321ffa088eef36f8 + languageName: node + linkType: hard + +"vscode-languageserver@npm:~9.0.1": + version: 9.0.1 + resolution: "vscode-languageserver@npm:9.0.1" + dependencies: + vscode-languageserver-protocol: "npm:3.17.5" + bin: + installServerIntoExtension: bin/installServerIntoExtension + checksum: 10c0/8a0838d77c98a211c76e54bd3a6249fc877e4e1a73322673fb0e921168d8e91de4f170f1d4ff7e8b6289d0698207afc6aba6662d4c1cd8e4bd7cae96afd6b0c2 + languageName: node + linkType: hard + +"vscode-oniguruma@npm:^1.7.0": + version: 1.7.0 + resolution: "vscode-oniguruma@npm:1.7.0" + checksum: 10c0/bef0073c665ddf8c86e51da94529c905856559e9aba97a9882f951acd572da560384775941ab6e7e8db94d9c578b25fefb951e4b73c37e8712e16b0231de2689 + languageName: node + linkType: hard + +"vscode-textmate@npm:^8.0.0": + version: 8.0.0 + resolution: "vscode-textmate@npm:8.0.0" + checksum: 10c0/836f7fe73fc94998a38ca193df48173a2b6eab08b4943d83c8cac9a2a0c3546cfdab4cf1b10b890ec4a4374c5bee03a885ef0e83e7fd2bd618cf00781c017c04 + languageName: node + linkType: hard + +"vscode-uri@npm:~3.0.8": + version: 3.0.8 + resolution: "vscode-uri@npm:3.0.8" + checksum: 10c0/f7f217f526bf109589969fe6e66b71e70b937de1385a1d7bb577ca3ee7c5e820d3856a86e9ff2fa9b7a0bc56a3dd8c3a9a557d3fedd7df414bc618d5e6b567f9 + languageName: node + linkType: hard + +"watchpack@npm:^2.4.1": + version: 2.4.1 + resolution: "watchpack@npm:2.4.1" + dependencies: + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.1.2" + checksum: 10c0/c694de0a61004e587a8a0fdc9cfec20ee692c52032d9ab2c2e99969a37fdab9e6e1bd3164ed506f9a13f7c83e65563d563e0d6b87358470cdb7309b83db78683 + languageName: node + linkType: hard + +"wbuf@npm:^1.1.0, wbuf@npm:^1.7.3": + version: 1.7.3 + resolution: "wbuf@npm:1.7.3" + dependencies: + minimalistic-assert: "npm:^1.0.0" + checksum: 10c0/56edcc5ef2b3d30913ba8f1f5cccc364d180670b24d5f3f8849c1e6fb514e5c7e3a87548ae61227a82859eba6269c11393ae24ce12a2ea1ecb9b465718ddced7 + languageName: node + linkType: hard + +"web-namespaces@npm:^2.0.0": + version: 2.0.1 + resolution: "web-namespaces@npm:2.0.1" + checksum: 10c0/df245f466ad83bd5cd80bfffc1674c7f64b7b84d1de0e4d2c0934fb0782e0a599164e7197a4bce310ee3342fd61817b8047ff04f076a1ce12dd470584142a4bd + languageName: node + linkType: hard + +"webpack-bundle-analyzer@npm:^4.10.2": + version: 4.10.2 + resolution: "webpack-bundle-analyzer@npm:4.10.2" + dependencies: + "@discoveryjs/json-ext": "npm:0.5.7" + acorn: "npm:^8.0.4" + acorn-walk: "npm:^8.0.0" + commander: "npm:^7.2.0" + debounce: "npm:^1.2.1" + escape-string-regexp: "npm:^4.0.0" + gzip-size: "npm:^6.0.0" + html-escaper: "npm:^2.0.2" + opener: "npm:^1.5.2" + picocolors: "npm:^1.0.0" + sirv: "npm:^2.0.3" + ws: "npm:^7.3.1" + bin: + webpack-bundle-analyzer: lib/bin/analyzer.js + checksum: 10c0/00603040e244ead15b2d92981f0559fa14216381349412a30070a7358eb3994cd61a8221d34a3b3fb8202dc3d1c5ee1fbbe94c5c52da536e5b410aa1cf279a48 + languageName: node + linkType: hard + +"webpack-dev-middleware@npm:^5.3.4": + version: 5.3.4 + resolution: "webpack-dev-middleware@npm:5.3.4" + dependencies: + colorette: "npm:^2.0.10" + memfs: "npm:^3.4.3" + mime-types: "npm:^2.1.31" + range-parser: "npm:^1.2.1" + schema-utils: "npm:^4.0.0" + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: 10c0/257df7d6bc5494d1d3cb66bba70fbdf5a6e0423e39b6420f7631aeb52435afbfbff8410a62146dcdf3d2f945c62e03193aae2ac1194a2f7d5a2523b9d194e9e1 + languageName: node + linkType: hard + +"webpack-dev-server@npm:^4.15.2": + version: 4.15.2 + resolution: "webpack-dev-server@npm:4.15.2" + dependencies: + "@types/bonjour": "npm:^3.5.9" + "@types/connect-history-api-fallback": "npm:^1.3.5" + "@types/express": "npm:^4.17.13" + "@types/serve-index": "npm:^1.9.1" + "@types/serve-static": "npm:^1.13.10" + "@types/sockjs": "npm:^0.3.33" + "@types/ws": "npm:^8.5.5" + ansi-html-community: "npm:^0.0.8" + bonjour-service: "npm:^1.0.11" + chokidar: "npm:^3.5.3" + colorette: "npm:^2.0.10" + compression: "npm:^1.7.4" + connect-history-api-fallback: "npm:^2.0.0" + default-gateway: "npm:^6.0.3" + express: "npm:^4.17.3" + graceful-fs: "npm:^4.2.6" + html-entities: "npm:^2.3.2" + http-proxy-middleware: "npm:^2.0.3" + ipaddr.js: "npm:^2.0.1" + launch-editor: "npm:^2.6.0" + open: "npm:^8.0.9" + p-retry: "npm:^4.5.0" + rimraf: "npm:^3.0.2" + schema-utils: "npm:^4.0.0" + selfsigned: "npm:^2.1.1" + serve-index: "npm:^1.9.1" + sockjs: "npm:^0.3.24" + spdy: "npm:^4.0.2" + webpack-dev-middleware: "npm:^5.3.4" + ws: "npm:^8.13.0" + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + bin: + webpack-dev-server: bin/webpack-dev-server.js + checksum: 10c0/625bd5b79360afcf98782c8b1fd710b180bb0e96d96b989defff550c546890010ceea82ffbecb2a0a23f7f018bc72f2dee7b3070f7b448fb0110df6657fb2904 + languageName: node + linkType: hard + +"webpack-merge@npm:^5.9.0": + version: 5.10.0 + resolution: "webpack-merge@npm:5.10.0" + dependencies: + clone-deep: "npm:^4.0.1" + flat: "npm:^5.0.2" + wildcard: "npm:^2.0.0" + checksum: 10c0/b607c84cabaf74689f965420051a55a08722d897bdd6c29cb0b2263b451c090f962d41ecf8c9bf56b0ab3de56e65476ace0a8ecda4f4a4663684243d90e0512b + languageName: node + linkType: hard + +"webpack-merge@npm:^6.0.1": + version: 6.0.1 + resolution: "webpack-merge@npm:6.0.1" + dependencies: + clone-deep: "npm:^4.0.1" + flat: "npm:^5.0.2" + wildcard: "npm:^2.0.1" + checksum: 10c0/bf1429567858b353641801b8a2696ca0aac270fc8c55d4de8a7b586fe07d27fdcfc83099a98ab47e6162383db8dd63bb8cc25b1beb2ec82150422eec843b0dc0 + languageName: node + linkType: hard + +"webpack-sources@npm:^3.2.3": + version: 3.2.3 + resolution: "webpack-sources@npm:3.2.3" + checksum: 10c0/2ef63d77c4fad39de4a6db17323d75eb92897b32674e97d76f0a1e87c003882fc038571266ad0ef581ac734cbe20952912aaa26155f1905e96ce251adbb1eb4e + languageName: node + linkType: hard + +"webpack@npm:^5.88.1": + version: 5.91.0 + resolution: "webpack@npm:5.91.0" + dependencies: + "@types/eslint-scope": "npm:^3.7.3" + "@types/estree": "npm:^1.0.5" + "@webassemblyjs/ast": "npm:^1.12.1" + "@webassemblyjs/wasm-edit": "npm:^1.12.1" + "@webassemblyjs/wasm-parser": "npm:^1.12.1" + acorn: "npm:^8.7.1" + acorn-import-assertions: "npm:^1.9.0" + browserslist: "npm:^4.21.10" + chrome-trace-event: "npm:^1.0.2" + enhanced-resolve: "npm:^5.16.0" + es-module-lexer: "npm:^1.2.1" + eslint-scope: "npm:5.1.1" + events: "npm:^3.2.0" + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.2.11" + json-parse-even-better-errors: "npm:^2.3.1" + loader-runner: "npm:^4.2.0" + mime-types: "npm:^2.1.27" + neo-async: "npm:^2.6.2" + schema-utils: "npm:^3.2.0" + tapable: "npm:^2.1.1" + terser-webpack-plugin: "npm:^5.3.10" + watchpack: "npm:^2.4.1" + webpack-sources: "npm:^3.2.3" + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: 10c0/74a3e0ea1c9a492accf035317f31769ffeaaab415811524b9f17bc7bf7012c5b6e1a9860df5ca6903f3ae2618727b801eb47d9351a2595dfffb25941d368b88c + languageName: node + linkType: hard + +"webpack@npm:^5.95.0": + version: 5.98.0 + resolution: "webpack@npm:5.98.0" + dependencies: + "@types/eslint-scope": "npm:^3.7.7" + "@types/estree": "npm:^1.0.6" + "@webassemblyjs/ast": "npm:^1.14.1" + "@webassemblyjs/wasm-edit": "npm:^1.14.1" + "@webassemblyjs/wasm-parser": "npm:^1.14.1" + acorn: "npm:^8.14.0" + browserslist: "npm:^4.24.0" + chrome-trace-event: "npm:^1.0.2" + enhanced-resolve: "npm:^5.17.1" + es-module-lexer: "npm:^1.2.1" + eslint-scope: "npm:5.1.1" + events: "npm:^3.2.0" + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.2.11" + json-parse-even-better-errors: "npm:^2.3.1" + loader-runner: "npm:^4.2.0" + mime-types: "npm:^2.1.27" + neo-async: "npm:^2.6.2" + schema-utils: "npm:^4.3.0" + tapable: "npm:^2.1.1" + terser-webpack-plugin: "npm:^5.3.11" + watchpack: "npm:^2.4.1" + webpack-sources: "npm:^3.2.3" + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: 10c0/bee4fa77f444802f0beafb2ff30eb5454a606163ad7d3cc9a5dcc9d24033c62407bed04601b25dea49ea3969b352c1b530a86c753246f42560a4a084eefb094e + languageName: node + linkType: hard + +"webpackbar@npm:^6.0.1": + version: 6.0.1 + resolution: "webpackbar@npm:6.0.1" + dependencies: + ansi-escapes: "npm:^4.3.2" + chalk: "npm:^4.1.2" + consola: "npm:^3.2.3" + figures: "npm:^3.2.0" + markdown-table: "npm:^2.0.0" + pretty-time: "npm:^1.1.0" + std-env: "npm:^3.7.0" + wrap-ansi: "npm:^7.0.0" + peerDependencies: + webpack: 3 || 4 || 5 + checksum: 10c0/8dfa2c55f8122f729c7efd515a2b50fb752c0d0cb27ec2ecdbc70d90a86d5f69f466c9c5d01004f71b500dafba957ecd4413fca196a98cf99a39b705f98cae97 + languageName: node + linkType: hard + +"websocket-driver@npm:>=0.5.1, websocket-driver@npm:^0.7.4": + version: 0.7.4 + resolution: "websocket-driver@npm:0.7.4" + dependencies: + http-parser-js: "npm:>=0.5.1" + safe-buffer: "npm:>=5.1.0" + websocket-extensions: "npm:>=0.1.1" + checksum: 10c0/5f09547912b27bdc57bac17b7b6527d8993aa4ac8a2d10588bb74aebaf785fdcf64fea034aae0c359b7adff2044dd66f3d03866e4685571f81b13e548f9021f1 + languageName: node + linkType: hard + +"websocket-extensions@npm:>=0.1.1": + version: 0.1.4 + resolution: "websocket-extensions@npm:0.1.4" + checksum: 10c0/bbc8c233388a0eb8a40786ee2e30d35935cacbfe26ab188b3e020987e85d519c2009fe07cfc37b7f718b85afdba7e54654c9153e6697301f72561bfe429177e0 + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + +"which@npm:^5.0.0": + version: 5.0.0 + resolution: "which@npm:5.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 10c0/e556e4cd8b7dbf5df52408c9a9dd5ac6518c8c5267c8953f5b0564073c66ed5bf9503b14d876d0e9c7844d4db9725fb0dcf45d6e911e17e26ab363dc3965ae7b + languageName: node + linkType: hard + +"widest-line@npm:^4.0.1": + version: 4.0.1 + resolution: "widest-line@npm:4.0.1" + dependencies: + string-width: "npm:^5.0.1" + checksum: 10c0/7da9525ba45eaf3e4ed1a20f3dcb9b85bd9443962450694dae950f4bdd752839747bbc14713522b0b93080007de8e8af677a61a8c2114aa553ad52bde72d0f9c + languageName: node + linkType: hard + +"wildcard@npm:^2.0.0": + version: 2.0.0 + resolution: "wildcard@npm:2.0.0" + checksum: 10c0/4e22a45f4fa7f0f0d3e11860ee9ce9225246d41af6ec507e6a7d64c2692afb40d695b92c8f801deda8d3536007c2ec07981079fd0c8bb38b8521de072b33ab7a + languageName: node + linkType: hard + +"wildcard@npm:^2.0.1": + version: 2.0.1 + resolution: "wildcard@npm:2.0.1" + checksum: 10c0/08f70cd97dd9a20aea280847a1fe8148e17cae7d231640e41eb26d2388697cbe65b67fd9e68715251c39b080c5ae4f76d71a9a69fa101d897273efdfb1b58bf7 + languageName: node + linkType: hard + +"wordwrap@npm:^1.0.0": + version: 1.0.0 + resolution: "wordwrap@npm:1.0.0" + checksum: 10c0/7ed2e44f3c33c5c3e3771134d2b0aee4314c9e49c749e37f464bf69f2bcdf0cbf9419ca638098e2717cff4875c47f56a007532f6111c3319f557a2ca91278e92 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.0.1, wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"write-file-atomic@npm:^3.0.3": + version: 3.0.3 + resolution: "write-file-atomic@npm:3.0.3" + dependencies: + imurmurhash: "npm:^0.1.4" + is-typedarray: "npm:^1.0.0" + signal-exit: "npm:^3.0.2" + typedarray-to-buffer: "npm:^3.1.5" + checksum: 10c0/7fb67affd811c7a1221bed0c905c26e28f0041e138fb19ccf02db57a0ef93ea69220959af3906b920f9b0411d1914474cdd90b93a96e5cd9e8368d9777caac0e + languageName: node + linkType: hard + +"ws@npm:^7.3.1": + version: 7.5.8 + resolution: "ws@npm:7.5.8" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/0d2e3f16102dc7fe7544e1f7c09a12cdd2b2ac3134ba3f9dabdc7e8c003d5a7797caa29fdb13d22cd5e2a7481d80fde779526d73a7b4b57d0480d6f62e5571d5 + languageName: node + linkType: hard + +"ws@npm:^8.13.0": + version: 8.16.0 + resolution: "ws@npm:8.16.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/a7783bb421c648b1e622b423409cb2a58ac5839521d2f689e84bc9dc41d59379c692dd405b15a997ea1d4c0c2e5314ad707332d0c558f15232d2bc07c0b4618a + languageName: node + linkType: hard + +"xdg-basedir@npm:^5.0.1, xdg-basedir@npm:^5.1.0": + version: 5.1.0 + resolution: "xdg-basedir@npm:5.1.0" + checksum: 10c0/c88efabc71ffd996ba9ad8923a8cc1c7c020a03e2c59f0ffa72e06be9e724ad2a0fccef488757bc6ed3d8849d753dd25082d1035d95cb179e79eae4d034d0b80 + languageName: node + linkType: hard + +"xml-js@npm:^1.6.11": + version: 1.6.11 + resolution: "xml-js@npm:1.6.11" + dependencies: + sax: "npm:^1.2.4" + bin: + xml-js: ./bin/cli.js + checksum: 10c0/c83631057f10bf90ea785cee434a8a1a0030c7314fe737ad9bf568a281083b565b28b14c9e9ba82f11fc9dc582a3a907904956af60beb725be1c9ad4b030bc5a + languageName: node + linkType: hard + +"yallist@npm:^3.0.2": + version: 3.1.1 + resolution: "yallist@npm:3.1.1" + checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + languageName: node + linkType: hard + +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 + languageName: node + linkType: hard + +"yocto-queue@npm:^1.0.0": + version: 1.0.0 + resolution: "yocto-queue@npm:1.0.0" + checksum: 10c0/856117aa15cf5103d2a2fb173f0ab4acb12b4b4d0ed3ab249fdbbf612e55d1cadfd27a6110940e24746fb0a78cf640b522cc8bca76f30a3b00b66e90cf82abe0 + languageName: node + linkType: hard + +"zwitch@npm:^2.0.0": + version: 2.0.4 + resolution: "zwitch@npm:2.0.4" + checksum: 10c0/3c7830cdd3378667e058ffdb4cf2bb78ac5711214e2725900873accb23f3dfe5f9e7e5a06dcdc5f29605da976fc45c26d9a13ca334d6eea2245a15e77b8fc06e + languageName: node + linkType: hard diff --git a/Dockers/strapi/strapi/examples/empty/.env.example b/Dockers/strapi/strapi/examples/empty/.env.example new file mode 100644 index 0000000..78c956e --- /dev/null +++ b/Dockers/strapi/strapi/examples/empty/.env.example @@ -0,0 +1,8 @@ +HOST=0.0.0.0 +PORT=1337 +APP_KEYS="toBeModified1,toBeModified2" +API_TOKEN_SALT=tobemodified +ADMIN_JWT_SECRET=tobemodified +TRANSFER_TOKEN_SALT=tobemodified +JWT_SECRET=tobemodified +ENCRYPTION_KEY=tobemodified diff --git a/Dockers/strapi/strapi/examples/empty/.gitignore b/Dockers/strapi/strapi/examples/empty/.gitignore new file mode 100644 index 0000000..74c092d --- /dev/null +++ b/Dockers/strapi/strapi/examples/empty/.gitignore @@ -0,0 +1,117 @@ +############################ +# OS X +############################ + +.DS_Store +.AppleDouble +.LSOverride +Icon +.Spotlight-V100 +.Trashes +._* + + +############################ +# Linux +############################ + +*~ + + +############################ +# Windows +############################ + +Thumbs.db +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ +*.cab +*.msi +*.msm +*.msp + + +############################ +# Packages +############################ + +*.7z +*.csv +*.dat +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip +*.com +*.class +*.dll +*.exe +*.o +*.seed +*.so +*.swo +*.swp +*.swn +*.swm +*.out +*.pid + + +############################ +# Logs and databases +############################ + +.tmp +*.log +*.sql +*.sqlite +*.sqlite3 + + +############################ +# Misc. +############################ + +*# +ssl +.idea +nbproject +public/uploads/* +!public/uploads/.gitkeep + +############################ +# Node.js +############################ + +lib-cov +lcov.info +pids +logs +results +node_modules +.node_history + +############################ +# Tests +############################ + +/coverage/ + +############################ +# Strapi +############################ + +.env +license.txt +exports +*.cache +dist +build +documentation +.strapi-updater.json +types/generated +.strapi \ No newline at end of file diff --git a/Dockers/strapi/strapi/examples/empty/README.md b/Dockers/strapi/strapi/examples/empty/README.md new file mode 100644 index 0000000..931729f --- /dev/null +++ b/Dockers/strapi/strapi/examples/empty/README.md @@ -0,0 +1,61 @@ +# 🚀 Getting started with Strapi + +Strapi comes with a full featured [Command Line Interface](https://docs.strapi.io/dev-docs/cli) (CLI) which lets you scaffold and manage your project in seconds. + +### `develop` + +Start your Strapi application with autoReload enabled. [Learn more](https://docs.strapi.io/dev-docs/cli#strapi-develop) + +``` +npm run develop +# or +yarn develop +``` + +### `start` + +Start your Strapi application with autoReload disabled. [Learn more](https://docs.strapi.io/dev-docs/cli#strapi-start) + +``` +npm run start +# or +yarn start +``` + +### `build` + +Build your admin panel. [Learn more](https://docs.strapi.io/dev-docs/cli#strapi-build) + +``` +npm run build +# or +yarn build +``` + +## ⚙️ Deployment + +Strapi gives you many possible deployment options for your project including [Strapi Cloud](https://cloud.strapi.io). Browse the [deployment section of the documentation](https://docs.strapi.io/dev-docs/deployment) to find the best solution for your use case. + +``` +yarn strapi deploy +``` + +## 📚 Learn more + +- [Resource center](https://strapi.io/resource-center) - Strapi resource center. +- [Strapi documentation](https://docs.strapi.io) - Official Strapi documentation. +- [Strapi tutorials](https://strapi.io/tutorials) - List of tutorials made by the core team and the community. +- [Strapi blog](https://strapi.io/blog) - Official Strapi blog containing articles made by the Strapi team and the community. +- [Changelog](https://strapi.io/changelog) - Find out about the Strapi product updates, new features and general improvements. + +Feel free to check out the [Strapi GitHub repository](https://github.com/strapi/strapi). Your feedback and contributions are welcome! + +## ✨ Community + +- [Discord](https://discord.strapi.io) - Come chat with the Strapi community including the core team. +- [Forum](https://forum.strapi.io/) - Place to discuss, ask questions and find answers, show your Strapi project and get feedback or just talk with other Community members. +- [Awesome Strapi](https://github.com/strapi/awesome-strapi) - A curated list of awesome things related to Strapi. + +--- + +🤫 Psst! [Strapi is hiring](https://strapi.io/careers). diff --git a/Dockers/strapi/strapi/examples/empty/config/admin.ts b/Dockers/strapi/strapi/examples/empty/config/admin.ts new file mode 100644 index 0000000..286b118 --- /dev/null +++ b/Dockers/strapi/strapi/examples/empty/config/admin.ts @@ -0,0 +1,22 @@ +const adminConfig = ({ env }) => ({ + auth: { + secret: env('ADMIN_JWT_SECRET', 'example-token'), + }, + apiToken: { + salt: env('API_TOKEN_SALT', 'example-salt'), + }, + secrets: { + encryptionKey: env('ENCRYPTION_KEY', 'example-key'), + }, + transfer: { + token: { + salt: env('TRANSFER_TOKEN_SALT', 'example-salt'), + }, + }, + flags: { + nps: env.bool('FLAG_NPS', true), + promoteEE: env.bool('FLAG_PROMOTE_EE', true), + }, +}); + +export default adminConfig; diff --git a/Dockers/strapi/strapi/config/api.ts b/Dockers/strapi/strapi/examples/empty/config/api.ts similarity index 100% rename from Dockers/strapi/strapi/config/api.ts rename to Dockers/strapi/strapi/examples/empty/config/api.ts diff --git a/Dockers/strapi/strapi/config/database.ts b/Dockers/strapi/strapi/examples/empty/config/database.ts similarity index 100% rename from Dockers/strapi/strapi/config/database.ts rename to Dockers/strapi/strapi/examples/empty/config/database.ts diff --git a/Dockers/strapi/strapi/config/plugins.ts b/Dockers/strapi/strapi/examples/empty/config/features.ts similarity index 100% rename from Dockers/strapi/strapi/config/plugins.ts rename to Dockers/strapi/strapi/examples/empty/config/features.ts diff --git a/Dockers/strapi/strapi/config/middlewares.ts b/Dockers/strapi/strapi/examples/empty/config/middlewares.ts similarity index 100% rename from Dockers/strapi/strapi/config/middlewares.ts rename to Dockers/strapi/strapi/examples/empty/config/middlewares.ts diff --git a/Dockers/strapi/strapi/examples/empty/config/plugins.ts b/Dockers/strapi/strapi/examples/empty/config/plugins.ts new file mode 100644 index 0000000..56bf55f --- /dev/null +++ b/Dockers/strapi/strapi/examples/empty/config/plugins.ts @@ -0,0 +1 @@ +export default () => ({}); diff --git a/Dockers/strapi/strapi/examples/empty/config/server.ts b/Dockers/strapi/strapi/examples/empty/config/server.ts new file mode 100644 index 0000000..a4cc8af --- /dev/null +++ b/Dockers/strapi/strapi/examples/empty/config/server.ts @@ -0,0 +1,9 @@ +const serverConfig = ({ env }) => ({ + host: env('HOST', '0.0.0.0'), + port: env.int('PORT', 1337), + app: { + keys: env.array('APP_KEYS', ['toBeModified1', 'toBeModified2']), + }, +}); + +export default serverConfig; diff --git a/Dockers/strapi/strapi/public/uploads/.gitkeep b/Dockers/strapi/strapi/examples/empty/database/migrations/.gitkeep similarity index 100% rename from Dockers/strapi/strapi/public/uploads/.gitkeep rename to Dockers/strapi/strapi/examples/empty/database/migrations/.gitkeep diff --git a/Dockers/strapi/strapi/favicon.png b/Dockers/strapi/strapi/examples/empty/favicon.png similarity index 100% rename from Dockers/strapi/strapi/favicon.png rename to Dockers/strapi/strapi/examples/empty/favicon.png diff --git a/Dockers/strapi/strapi/examples/empty/package.json b/Dockers/strapi/strapi/examples/empty/package.json new file mode 100644 index 0000000..41bf581 --- /dev/null +++ b/Dockers/strapi/strapi/examples/empty/package.json @@ -0,0 +1,39 @@ +{ + "name": "empty", + "version": "0.0.0", + "private": true, + "description": "A Strapi application", + "scripts": { + "build": "strapi build", + "console": "strapi console", + "deploy": "strapi deploy", + "dev": "strapi develop", + "develop": "strapi develop", + "start": "strapi start", + "strapi": "strapi", + "upgrade": "npx @strapi/upgrade latest", + "upgrade:dry": "npx @strapi/upgrade latest --dry" + }, + "dependencies": { + "@strapi/plugin-users-permissions": "workspace:*", + "@strapi/strapi": "workspace:*", + "better-sqlite3": "11.3.0", + "react": "18.3.1", + "react-dom": "18.3.1", + "react-router-dom": "6.22.3", + "styled-components": "6.1.8" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "typescript": "^5" + }, + "engines": { + "node": ">=18.0.0 <=22.x.x", + "npm": ">=6.0.0" + }, + "strapi": { + "uuid": "getstarted" + } +} diff --git a/Dockers/strapi/strapi/public/robots.txt b/Dockers/strapi/strapi/examples/empty/public/robots.txt similarity index 100% rename from Dockers/strapi/strapi/public/robots.txt rename to Dockers/strapi/strapi/examples/empty/public/robots.txt diff --git a/Dockers/strapi/strapi/src/api/.gitkeep b/Dockers/strapi/strapi/examples/empty/public/uploads/.gitkeep similarity index 100% rename from Dockers/strapi/strapi/src/api/.gitkeep rename to Dockers/strapi/strapi/examples/empty/public/uploads/.gitkeep diff --git a/Dockers/strapi/strapi/examples/empty/src/admin/app.tsx b/Dockers/strapi/strapi/examples/empty/src/admin/app.tsx new file mode 100644 index 0000000..692aa36 --- /dev/null +++ b/Dockers/strapi/strapi/examples/empty/src/admin/app.tsx @@ -0,0 +1,10 @@ +import type { StrapiApp } from '@strapi/strapi/admin'; + +export default { + config: { + locales: ['fr'], + }, + bootstrap(app: StrapiApp) { + console.log(app); + }, +}; diff --git a/Dockers/strapi/strapi/src/admin/tsconfig.json b/Dockers/strapi/strapi/examples/empty/src/admin/tsconfig.json similarity index 100% rename from Dockers/strapi/strapi/src/admin/tsconfig.json rename to Dockers/strapi/strapi/examples/empty/src/admin/tsconfig.json diff --git a/Dockers/strapi/strapi/examples/empty/src/admin/vite.config.example.ts b/Dockers/strapi/strapi/examples/empty/src/admin/vite.config.example.ts new file mode 100644 index 0000000..85f6982 --- /dev/null +++ b/Dockers/strapi/strapi/examples/empty/src/admin/vite.config.example.ts @@ -0,0 +1,12 @@ +import { mergeConfig, type UserConfig } from 'vite'; + +export default (config: UserConfig) => { + // Important: always return the modified config + return mergeConfig(config, { + resolve: { + alias: { + '@': '/src', + }, + }, + }); +}; diff --git a/Dockers/strapi/strapi/src/extensions/.gitkeep b/Dockers/strapi/strapi/examples/empty/src/api/.gitkeep similarity index 100% rename from Dockers/strapi/strapi/src/extensions/.gitkeep rename to Dockers/strapi/strapi/examples/empty/src/api/.gitkeep diff --git a/Dockers/strapi/strapi/examples/empty/src/extensions/.gitkeep b/Dockers/strapi/strapi/examples/empty/src/extensions/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Dockers/strapi/strapi/src/index.ts b/Dockers/strapi/strapi/examples/empty/src/index.ts similarity index 100% rename from Dockers/strapi/strapi/src/index.ts rename to Dockers/strapi/strapi/examples/empty/src/index.ts diff --git a/Dockers/strapi/strapi/tsconfig.json b/Dockers/strapi/strapi/examples/empty/tsconfig.json similarity index 100% rename from Dockers/strapi/strapi/tsconfig.json rename to Dockers/strapi/strapi/examples/empty/tsconfig.json diff --git a/Dockers/strapi/strapi/examples/experimental-dev/.env.template b/Dockers/strapi/strapi/examples/experimental-dev/.env.template new file mode 100644 index 0000000..59cb06f --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/.env.template @@ -0,0 +1,4 @@ +# You'll need this to run the project, most likely. +USE_EXPERIMENTAL_DEPENDENCIES=true +# This is very experimental and isn't required to use with react@19 +USE_REACT_COMPILER=false diff --git a/Dockers/strapi/strapi/examples/experimental-dev/.gitignore b/Dockers/strapi/strapi/examples/experimental-dev/.gitignore new file mode 100644 index 0000000..7923dda --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/.gitignore @@ -0,0 +1,116 @@ +############################ +# OS X +############################ + +.DS_Store +.AppleDouble +.LSOverride +Icon +.Spotlight-V100 +.Trashes +._* + + +############################ +# Linux +############################ + +*~ + + +############################ +# Windows +############################ + +Thumbs.db +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ +*.cab +*.msi +*.msm +*.msp + + +############################ +# Packages +############################ + +*.7z +*.csv +*.dat +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip +*.com +*.class +*.dll +*.exe +*.o +*.seed +*.so +*.swo +*.swp +*.swn +*.swm +*.out +*.pid + + +############################ +# Logs and databases +############################ + +.tmp +*.log +*.sql +*.sqlite +*.sqlite3 + + +############################ +# Misc. +############################ + +*# +ssl +.idea +nbproject +public/uploads/* +!public/uploads/.gitkeep + +############################ +# Node.js +############################ + +lib-cov +lcov.info +pids +logs +results +node_modules +.node_history + +############################ +# Tests +############################ + +coverage + +############################ +# Strapi +############################ + +.env +license.txt +exports +*.cache +dist +build +.strapi-updater.json +types/generated +.strapi \ No newline at end of file diff --git a/Dockers/strapi/strapi/examples/experimental-dev/README.md b/Dockers/strapi/strapi/examples/experimental-dev/README.md new file mode 100644 index 0000000..f1d7eb4 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/README.md @@ -0,0 +1,11 @@ +# Experimental Dev + +This app is used to run experimental dependencies in Strapi. Specifically right now, used to test react19 release candidates & the react-compiler + +## Getting started + +To run the example you should include `USE_EXPERIMENTAL_DEPENDENCIES=true` in your `.env` file. This flag is used by the `@strapi/strapi` cli package and disabled checking against the dependency versions in your project as for production applications we only officially support v17/18 of react. + +## Using the compiler + +The compiler is extremely experimental. To activate it, you need to add `USE_REACT_COMPILER=true` to your `.env` file. Compilation _may_ be slower because it's only a babel plugin, so instead of using `@vitejs/plugin-react-swc` we're using `@vitejs/plugin-react` which arguably may be slower. diff --git a/Dockers/strapi/strapi/examples/experimental-dev/config/admin.ts b/Dockers/strapi/strapi/examples/experimental-dev/config/admin.ts new file mode 100644 index 0000000..e0f87f9 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/config/admin.ts @@ -0,0 +1,19 @@ +const adminConfig = ({ env }) => ({ + auth: { + secret: env('ADMIN_JWT_SECRET', 'example-token'), + }, + apiToken: { + salt: env('API_TOKEN_SALT', 'example-salt'), + }, + transfer: { + token: { + salt: env('TRANSFER_TOKEN_SALT', 'example-salt'), + }, + }, + flags: { + nps: env.bool('FLAG_NPS', true), + promoteEE: env.bool('FLAG_PROMOTE_EE', true), + }, +}); + +export default adminConfig; diff --git a/Dockers/strapi/strapi/examples/experimental-dev/config/api.ts b/Dockers/strapi/strapi/examples/experimental-dev/config/api.ts new file mode 100644 index 0000000..37f7c14 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/config/api.ts @@ -0,0 +1,7 @@ +export default { + rest: { + defaultLimit: 25, + maxLimit: 100, + withCount: true, + }, +}; diff --git a/Dockers/strapi/strapi/examples/experimental-dev/config/database.ts b/Dockers/strapi/strapi/examples/experimental-dev/config/database.ts new file mode 100644 index 0000000..a239a7f --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/config/database.ts @@ -0,0 +1,11 @@ +import path from 'path'; + +export default ({ env }) => ({ + connection: { + client: 'sqlite', + connection: { + filename: path.join(__dirname, '..', '..', env('DATABASE_FILENAME', '.tmp/data.db')), + }, + useNullAsDefault: true, + }, +}); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/config/middlewares.ts b/Dockers/strapi/strapi/examples/experimental-dev/config/middlewares.ts new file mode 100644 index 0000000..829f5c0 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/config/middlewares.ts @@ -0,0 +1,12 @@ +export default [ + 'strapi::logger', + 'strapi::errors', + 'strapi::security', + 'strapi::cors', + 'strapi::poweredBy', + 'strapi::query', + 'strapi::body', + 'strapi::session', + 'strapi::favicon', + 'strapi::public', +]; diff --git a/Dockers/strapi/strapi/examples/experimental-dev/config/server.ts b/Dockers/strapi/strapi/examples/experimental-dev/config/server.ts new file mode 100644 index 0000000..a4cc8af --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/config/server.ts @@ -0,0 +1,9 @@ +const serverConfig = ({ env }) => ({ + host: env('HOST', '0.0.0.0'), + port: env.int('PORT', 1337), + app: { + keys: env.array('APP_KEYS', ['toBeModified1', 'toBeModified2']), + }, +}); + +export default serverConfig; diff --git a/Dockers/strapi/strapi/examples/experimental-dev/favicon.png b/Dockers/strapi/strapi/examples/experimental-dev/favicon.png new file mode 100644 index 0000000..df668a8 Binary files /dev/null and b/Dockers/strapi/strapi/examples/experimental-dev/favicon.png differ diff --git a/Dockers/strapi/strapi/examples/experimental-dev/package.json b/Dockers/strapi/strapi/examples/experimental-dev/package.json new file mode 100644 index 0000000..29bb3b3 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/package.json @@ -0,0 +1,34 @@ +{ + "name": "experimental-dev", + "version": "0.0.0", + "private": true, + "description": "A Strapi application", + "license": "MIT", + "author": { + "name": "A Strapi developer" + }, + "scripts": { + "build": "strapi build", + "develop": "strapi develop", + "start": "strapi start", + "strapi": "strapi" + }, + "dependencies": { + "@strapi/plugin-users-permissions": "workspace:*", + "@strapi/strapi": "workspace:*", + "better-sqlite3": "11.3.0", + "react": "rc", + "react-dom": "rc", + "react-router-dom": "6.22.3", + "styled-components": "6.1.8" + }, + "engines": { + "node": ">=18.0.0 <=22.x.x", + "npm": ">=6.0.0" + }, + "devDependencies": { + "@vitejs/plugin-react": "4.2.1", + "babel-plugin-react-compiler": "0.0.0-experimental-c23de8d-20240515", + "vite": "5.4.19" + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/public/robots.txt b/Dockers/strapi/strapi/examples/experimental-dev/public/robots.txt new file mode 100644 index 0000000..ff5d316 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/public/robots.txt @@ -0,0 +1,3 @@ +# To prevent search engines from seeing the site altogether, uncomment the next two lines: +# User-Agent: * +# Disallow: / diff --git a/Dockers/strapi/strapi/examples/experimental-dev/public/uploads/.gitkeep b/Dockers/strapi/strapi/examples/experimental-dev/public/uploads/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/admin/vite.config.ts b/Dockers/strapi/strapi/examples/experimental-dev/src/admin/vite.config.ts new file mode 100644 index 0000000..f9168f0 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/admin/vite.config.ts @@ -0,0 +1,30 @@ +import { UserConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +export default (config: UserConfig): UserConfig => { + const USE_REACT_COMPILER = process.env.USE_REACT_COMPILER === 'true'; + + if (USE_REACT_COMPILER) { + console.log('--------------------------------'); + console.log('---- Using React Compiler ----'); + console.log('--------------------------------'); + + const existingPlugins = config.plugins?.slice(1) ?? []; + + const newConfig: UserConfig = { + ...config, + plugins: [ + react({ + babel: { + plugins: [['babel-plugin-react-compiler']], + }, + }), + ...existingPlugins, + ], + }; + + return newConfig; + } + + return config; +}; diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/.gitkeep b/Dockers/strapi/strapi/examples/experimental-dev/src/api/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/article/content-types/article/schema.json b/Dockers/strapi/strapi/examples/experimental-dev/src/api/article/content-types/article/schema.json new file mode 100644 index 0000000..60445ed --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/article/content-types/article/schema.json @@ -0,0 +1,46 @@ +{ + "kind": "collectionType", + "collectionName": "articles", + "info": { + "singularName": "article", + "pluralName": "articles", + "displayName": "Article", + "description": "" + }, + "options": { + "draftAndPublish": true + }, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "attributes": { + "title": { + "type": "string" + }, + "content": { + "type": "blocks" + }, + "authors": { + "type": "relation", + "relation": "manyToMany", + "target": "api::author.author", + "inversedBy": "articles" + }, + "slug": { + "type": "uid", + "targetField": "title" + }, + "seo": { + "type": "component", + "repeatable": false, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "component": "meta.seo" + } + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/article/controllers/article.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/article/controllers/article.js new file mode 100644 index 0000000..c4bca44 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/article/controllers/article.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * article controller + */ + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::article.article'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/article/documentation/1.0.0/article.json b/Dockers/strapi/strapi/examples/experimental-dev/src/api/article/documentation/1.0.0/article.json new file mode 100644 index 0000000..11021b2 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/article/documentation/1.0.0/article.json @@ -0,0 +1,587 @@ +{ + "/articles": { + "get": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArticleListResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Article"], + "parameters": [ + { + "name": "sort", + "in": "query", + "description": "Sort by attributes ascending (asc) or descending (desc)", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "pagination[withCount]", + "in": "query", + "description": "Return page/pageSize (default: true)", + "deprecated": false, + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "pagination[page]", + "in": "query", + "description": "Page number (default: 0)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[pageSize]", + "in": "query", + "description": "Page size (default: 25)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[start]", + "in": "query", + "description": "Offset value (default: 0)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[limit]", + "in": "query", + "description": "Number of entities to return (default: 25)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "fields", + "in": "query", + "description": "Fields to return (ex: title,author)", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "populate", + "in": "query", + "description": "Relations to return", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "filters", + "in": "query", + "description": "Filters to apply", + "deprecated": false, + "required": false, + "schema": { + "type": "object" + }, + "style": "deepObject" + }, + { + "name": "locale", + "in": "query", + "description": "Locale to apply", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + } + ], + "operationId": "get/articles" + }, + "post": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArticleResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Article"], + "parameters": [], + "operationId": "post/articles", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArticleRequest" + } + } + } + } + } + }, + "/articles/{id}": { + "get": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArticleResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Article"], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "", + "deprecated": false, + "required": true, + "schema": { + "type": "number" + } + } + ], + "operationId": "get/articles/{id}" + }, + "put": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArticleResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Article"], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "", + "deprecated": false, + "required": true, + "schema": { + "type": "number" + } + } + ], + "operationId": "put/articles/{id}", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArticleRequest" + } + } + } + } + }, + "delete": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "integer", + "format": "int64" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Article"], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "", + "deprecated": false, + "required": true, + "schema": { + "type": "number" + } + } + ], + "operationId": "delete/articles/{id}" + } + }, + "/articles/{id}/localizations": { + "post": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArticleLocalizationResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Article"], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "", + "deprecated": false, + "required": true, + "schema": { + "type": "number" + } + } + ], + "operationId": "post/articles/{id}/localizations", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArticleLocalizationRequest" + } + } + } + } + } + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/article/routes/article.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/article/routes/article.js new file mode 100644 index 0000000..4d843fa --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/article/routes/article.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * article router + */ + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::article.article'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/article/services/article.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/article/services/article.js new file mode 100644 index 0000000..b9890be --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/article/services/article.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * article service + */ + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::article.article'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/author/content-types/author/schema.json b/Dockers/strapi/strapi/examples/experimental-dev/src/api/author/content-types/author/schema.json new file mode 100644 index 0000000..4230bee --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/author/content-types/author/schema.json @@ -0,0 +1,29 @@ +{ + "kind": "collectionType", + "collectionName": "authors", + "info": { + "singularName": "author", + "pluralName": "authors", + "displayName": "Author" + }, + "options": { + "draftAndPublish": true + }, + "pluginOptions": {}, + "attributes": { + "name": { + "type": "string" + }, + "profile": { + "allowedTypes": ["images", "files", "videos", "audios"], + "type": "media", + "multiple": false + }, + "articles": { + "type": "relation", + "relation": "manyToMany", + "target": "api::article.article", + "mappedBy": "authors" + } + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/author/controllers/author.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/author/controllers/author.js new file mode 100644 index 0000000..93de2e1 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/author/controllers/author.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * author controller + */ + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::author.author'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/author/documentation/1.0.0/author.json b/Dockers/strapi/strapi/examples/experimental-dev/src/api/author/documentation/1.0.0/author.json new file mode 100644 index 0000000..767d2cb --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/author/documentation/1.0.0/author.json @@ -0,0 +1,587 @@ +{ + "/authors": { + "get": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthorListResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Author"], + "parameters": [ + { + "name": "sort", + "in": "query", + "description": "Sort by attributes ascending (asc) or descending (desc)", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "pagination[withCount]", + "in": "query", + "description": "Return page/pageSize (default: true)", + "deprecated": false, + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "pagination[page]", + "in": "query", + "description": "Page number (default: 0)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[pageSize]", + "in": "query", + "description": "Page size (default: 25)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[start]", + "in": "query", + "description": "Offset value (default: 0)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[limit]", + "in": "query", + "description": "Number of entities to return (default: 25)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "fields", + "in": "query", + "description": "Fields to return (ex: title,author)", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "populate", + "in": "query", + "description": "Relations to return", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "filters", + "in": "query", + "description": "Filters to apply", + "deprecated": false, + "required": false, + "schema": { + "type": "object" + }, + "style": "deepObject" + }, + { + "name": "locale", + "in": "query", + "description": "Locale to apply", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + } + ], + "operationId": "get/authors" + }, + "post": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthorResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Author"], + "parameters": [], + "operationId": "post/authors", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthorRequest" + } + } + } + } + } + }, + "/authors/{id}": { + "get": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthorResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Author"], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "", + "deprecated": false, + "required": true, + "schema": { + "type": "number" + } + } + ], + "operationId": "get/authors/{id}" + }, + "put": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthorResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Author"], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "", + "deprecated": false, + "required": true, + "schema": { + "type": "number" + } + } + ], + "operationId": "put/authors/{id}", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthorRequest" + } + } + } + } + }, + "delete": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "integer", + "format": "int64" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Author"], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "", + "deprecated": false, + "required": true, + "schema": { + "type": "number" + } + } + ], + "operationId": "delete/authors/{id}" + } + }, + "/authors/{id}/localizations": { + "post": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthorLocalizationResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Author"], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "", + "deprecated": false, + "required": true, + "schema": { + "type": "number" + } + } + ], + "operationId": "post/authors/{id}/localizations", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthorLocalizationRequest" + } + } + } + } + } + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/author/routes/author.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/author/routes/author.js new file mode 100644 index 0000000..934f67b --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/author/routes/author.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * author router + */ + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::author.author'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/author/services/author.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/author/services/author.js new file mode 100644 index 0000000..61f296f --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/author/services/author.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * author service + */ + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::author.author'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/config/controllers/config.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/config/controllers/config.js new file mode 100644 index 0000000..7caa975 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/config/controllers/config.js @@ -0,0 +1,25 @@ +const { createTestTransferToken } = require('../../../create-transfer-token'); + +module.exports = { + rateLimitEnable(ctx) { + const { value } = ctx.request.body; + + const configService = strapi.service('api::config.config'); + + configService.rateLimitEnable(value); + + ctx.send(200); + }, + async permissionsPrune(ctx) { + const permissionService = strapi.service('admin::permission'); + + await permissionService.cleanPermissionsInDatabase(); + + ctx.send(200); + }, + async resetTransferToken(ctx) { + await createTestTransferToken(strapi); + + ctx.send(200); + }, +}; diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/config/routes/config.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/config/routes/config.js new file mode 100644 index 0000000..1d93161 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/config/routes/config.js @@ -0,0 +1,30 @@ +'use strict'; + +module.exports = { + routes: [ + { + method: 'POST', + path: '/config/ratelimit/enable', + handler: 'config.rateLimitEnable', + config: { + auth: false, + }, + }, + { + method: 'POST', + path: '/config/permissions/prune', + handler: 'config.permissionsPrune', + config: { + auth: false, + }, + }, + { + method: 'POST', + path: '/config/resettransfertoken', + handler: 'config.resetTransferToken', + config: { + auth: false, + }, + }, + ], +}; diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/config/services/config.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/config/services/config.js new file mode 100644 index 0000000..262feb6 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/config/services/config.js @@ -0,0 +1,8 @@ +module.exports = { + async rateLimitEnable(value) { + strapi.config.set('admin.rateLimit.enabled', !!value); + }, + async adminAutoOpenEnable(value) { + strapi.config.set('admin.autoOpen', !!value); + }, +}; diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/homepage/content-types/homepage/schema.json b/Dockers/strapi/strapi/examples/experimental-dev/src/api/homepage/content-types/homepage/schema.json new file mode 100644 index 0000000..9d52d17 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/homepage/content-types/homepage/schema.json @@ -0,0 +1,36 @@ +{ + "kind": "singleType", + "collectionName": "homepages", + "info": { + "singularName": "homepage", + "pluralName": "homepages", + "displayName": "Homepage", + "description": "" + }, + "options": { + "draftAndPublish": true + }, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "attributes": { + "title": { + "type": "string" + }, + "content": { + "type": "blocks" + }, + "admin_user": { + "type": "relation", + "relation": "oneToOne", + "target": "admin::user" + }, + "seo": { + "type": "component", + "repeatable": false, + "component": "meta.seo" + } + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/homepage/controllers/homepage.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/homepage/controllers/homepage.js new file mode 100644 index 0000000..8deb30e --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/homepage/controllers/homepage.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * homepage controller + */ + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::homepage.homepage'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/homepage/documentation/1.0.0/homepage.json b/Dockers/strapi/strapi/examples/experimental-dev/src/api/homepage/documentation/1.0.0/homepage.json new file mode 100644 index 0000000..fb983a1 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/homepage/documentation/1.0.0/homepage.json @@ -0,0 +1,397 @@ +{ + "/homepage": { + "get": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HomepageResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Homepage"], + "parameters": [ + { + "name": "sort", + "in": "query", + "description": "Sort by attributes ascending (asc) or descending (desc)", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "pagination[withCount]", + "in": "query", + "description": "Return page/pageSize (default: true)", + "deprecated": false, + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "pagination[page]", + "in": "query", + "description": "Page number (default: 0)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[pageSize]", + "in": "query", + "description": "Page size (default: 25)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[start]", + "in": "query", + "description": "Offset value (default: 0)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[limit]", + "in": "query", + "description": "Number of entities to return (default: 25)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "fields", + "in": "query", + "description": "Fields to return (ex: title,author)", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "populate", + "in": "query", + "description": "Relations to return", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "filters", + "in": "query", + "description": "Filters to apply", + "deprecated": false, + "required": false, + "schema": { + "type": "object" + }, + "style": "deepObject" + }, + { + "name": "locale", + "in": "query", + "description": "Locale to apply", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + } + ], + "operationId": "get/homepage" + }, + "put": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HomepageResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Homepage"], + "parameters": [], + "operationId": "put/homepage", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HomepageRequest" + } + } + } + } + }, + "delete": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "integer", + "format": "int64" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Homepage"], + "parameters": [], + "operationId": "delete/homepage" + } + }, + "/homepage/localizations": { + "post": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HomepageLocalizationResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Homepage"], + "parameters": [], + "operationId": "post/homepage/localizations", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HomepageLocalizationRequest" + } + } + } + } + } + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/homepage/routes/homepage.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/homepage/routes/homepage.js new file mode 100644 index 0000000..40dc32a --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/homepage/routes/homepage.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * homepage router + */ + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::homepage.homepage'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/homepage/services/homepage.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/homepage/services/homepage.js new file mode 100644 index 0000000..86c6bd8 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/homepage/services/homepage.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * homepage service + */ + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::homepage.homepage'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/product/content-types/product/schema.json b/Dockers/strapi/strapi/examples/experimental-dev/src/api/product/content-types/product/schema.json new file mode 100644 index 0000000..0411361 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/product/content-types/product/schema.json @@ -0,0 +1,97 @@ +{ + "kind": "collectionType", + "collectionName": "products", + "info": { + "singularName": "product", + "pluralName": "products", + "displayName": "Products", + "description": "" + }, + "options": { + "draftAndPublish": true + }, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "attributes": { + "name": { + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "type": "string", + "required": true + }, + "slug": { + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "type": "uid", + "targetField": "name", + "required": true + }, + "isAvailable": { + "pluginOptions": { + "i18n": { + "localized": false + } + }, + "type": "boolean", + "default": true, + "required": true + }, + "description": { + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "type": "blocks" + }, + "images": { + "type": "media", + "multiple": true, + "required": false, + "allowedTypes": ["images", "files", "videos", "audios"], + "pluginOptions": { + "i18n": { + "localized": false + } + } + }, + "seo": { + "type": "component", + "repeatable": false, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "component": "meta.seo" + }, + "sku": { + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "type": "integer", + "unique": true + }, + "variations": { + "type": "component", + "repeatable": true, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "component": "product.variations" + } + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/product/controllers/product.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/product/controllers/product.js new file mode 100644 index 0000000..dabdaef --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/product/controllers/product.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * product controller + */ + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::product.product'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/product/documentation/1.0.0/product.json b/Dockers/strapi/strapi/examples/experimental-dev/src/api/product/documentation/1.0.0/product.json new file mode 100644 index 0000000..666229c --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/product/documentation/1.0.0/product.json @@ -0,0 +1,587 @@ +{ + "/products": { + "get": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProductListResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Product"], + "parameters": [ + { + "name": "sort", + "in": "query", + "description": "Sort by attributes ascending (asc) or descending (desc)", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "pagination[withCount]", + "in": "query", + "description": "Return page/pageSize (default: true)", + "deprecated": false, + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "pagination[page]", + "in": "query", + "description": "Page number (default: 0)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[pageSize]", + "in": "query", + "description": "Page size (default: 25)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[start]", + "in": "query", + "description": "Offset value (default: 0)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[limit]", + "in": "query", + "description": "Number of entities to return (default: 25)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "fields", + "in": "query", + "description": "Fields to return (ex: title,author)", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "populate", + "in": "query", + "description": "Relations to return", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "filters", + "in": "query", + "description": "Filters to apply", + "deprecated": false, + "required": false, + "schema": { + "type": "object" + }, + "style": "deepObject" + }, + { + "name": "locale", + "in": "query", + "description": "Locale to apply", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + } + ], + "operationId": "get/products" + }, + "post": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProductResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Product"], + "parameters": [], + "operationId": "post/products", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProductRequest" + } + } + } + } + } + }, + "/products/{id}": { + "get": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProductResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Product"], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "", + "deprecated": false, + "required": true, + "schema": { + "type": "number" + } + } + ], + "operationId": "get/products/{id}" + }, + "put": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProductResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Product"], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "", + "deprecated": false, + "required": true, + "schema": { + "type": "number" + } + } + ], + "operationId": "put/products/{id}", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProductRequest" + } + } + } + } + }, + "delete": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "integer", + "format": "int64" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Product"], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "", + "deprecated": false, + "required": true, + "schema": { + "type": "number" + } + } + ], + "operationId": "delete/products/{id}" + } + }, + "/products/{id}/localizations": { + "post": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProductLocalizationResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Product"], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "", + "deprecated": false, + "required": true, + "schema": { + "type": "number" + } + } + ], + "operationId": "post/products/{id}/localizations", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProductLocalizationRequest" + } + } + } + } + } + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/product/routes/product.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/product/routes/product.js new file mode 100644 index 0000000..910584d --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/product/routes/product.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * product router + */ + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::product.product'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/product/services/product.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/product/services/product.js new file mode 100644 index 0000000..59c6ed4 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/product/services/product.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * product service + */ + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::product.product'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/shop/content-types/shop/schema.json b/Dockers/strapi/strapi/examples/experimental-dev/src/api/shop/content-types/shop/schema.json new file mode 100644 index 0000000..826ef64 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/shop/content-types/shop/schema.json @@ -0,0 +1,54 @@ +{ + "kind": "singleType", + "collectionName": "shops", + "info": { + "singularName": "shop", + "pluralName": "shops", + "displayName": "Shop", + "description": "" + }, + "options": { + "draftAndPublish": true + }, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "attributes": { + "title": { + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "type": "string", + "required": true + }, + "content": { + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "type": "dynamiczone", + "components": [ + "page-blocks.product-carousel", + "page-blocks.hero-image", + "page-blocks.content-and-image" + ], + "required": true, + "min": 2 + }, + "seo": { + "type": "component", + "repeatable": false, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "component": "meta.seo" + } + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/shop/controllers/shop.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/shop/controllers/shop.js new file mode 100644 index 0000000..f31f88f --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/shop/controllers/shop.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * shop controller + */ + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::shop.shop'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/shop/documentation/1.0.0/shop.json b/Dockers/strapi/strapi/examples/experimental-dev/src/api/shop/documentation/1.0.0/shop.json new file mode 100644 index 0000000..fd7ce46 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/shop/documentation/1.0.0/shop.json @@ -0,0 +1,397 @@ +{ + "/shop": { + "get": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ShopResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Shop"], + "parameters": [ + { + "name": "sort", + "in": "query", + "description": "Sort by attributes ascending (asc) or descending (desc)", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "pagination[withCount]", + "in": "query", + "description": "Return page/pageSize (default: true)", + "deprecated": false, + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "pagination[page]", + "in": "query", + "description": "Page number (default: 0)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[pageSize]", + "in": "query", + "description": "Page size (default: 25)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[start]", + "in": "query", + "description": "Offset value (default: 0)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[limit]", + "in": "query", + "description": "Number of entities to return (default: 25)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "fields", + "in": "query", + "description": "Fields to return (ex: title,author)", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "populate", + "in": "query", + "description": "Relations to return", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "filters", + "in": "query", + "description": "Filters to apply", + "deprecated": false, + "required": false, + "schema": { + "type": "object" + }, + "style": "deepObject" + }, + { + "name": "locale", + "in": "query", + "description": "Locale to apply", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + } + ], + "operationId": "get/shop" + }, + "put": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ShopResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Shop"], + "parameters": [], + "operationId": "put/shop", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ShopRequest" + } + } + } + } + }, + "delete": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "integer", + "format": "int64" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Shop"], + "parameters": [], + "operationId": "delete/shop" + } + }, + "/shop/localizations": { + "post": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ShopLocalizationResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Shop"], + "parameters": [], + "operationId": "post/shop/localizations", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ShopLocalizationRequest" + } + } + } + } + } + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/shop/routes/shop.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/shop/routes/shop.js new file mode 100644 index 0000000..3af8d52 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/shop/routes/shop.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * shop router + */ + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::shop.shop'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/shop/services/shop.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/shop/services/shop.js new file mode 100644 index 0000000..15a6547 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/shop/services/shop.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * shop service + */ + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::shop.shop'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/unique/content-types/unique/schema.json b/Dockers/strapi/strapi/examples/experimental-dev/src/api/unique/content-types/unique/schema.json new file mode 100644 index 0000000..5c281d3 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/unique/content-types/unique/schema.json @@ -0,0 +1,63 @@ +{ + "kind": "collectionType", + "collectionName": "unique", + "info": { + "singularName": "unique", + "pluralName": "uniques", + "displayName": "Unique" + }, + "options": { + "draftAndPublish": true + }, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "attributes": { + "uniqueString": { + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "type": "string", + "unique": true + }, + "uniqueNumber": { + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "unique": true, + "type": "integer" + }, + "uniqueEmail": { + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "type": "email", + "unique": true + }, + "uniqueDate": { + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "unique": true, + "type": "date" + }, + "UID": { + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "type": "uid" + } + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/unique/controllers/unique.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/unique/controllers/unique.js new file mode 100644 index 0000000..1718da3 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/unique/controllers/unique.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * unique controller + */ + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::unique.unique'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/unique/documentation/1.0.0/unique.json b/Dockers/strapi/strapi/examples/experimental-dev/src/api/unique/documentation/1.0.0/unique.json new file mode 100644 index 0000000..eb1674f --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/unique/documentation/1.0.0/unique.json @@ -0,0 +1,587 @@ +{ + "/uniques": { + "get": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UniqueListResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Unique"], + "parameters": [ + { + "name": "sort", + "in": "query", + "description": "Sort by attributes ascending (asc) or descending (desc)", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "pagination[withCount]", + "in": "query", + "description": "Return page/pageSize (default: true)", + "deprecated": false, + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "pagination[page]", + "in": "query", + "description": "Page number (default: 0)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[pageSize]", + "in": "query", + "description": "Page size (default: 25)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[start]", + "in": "query", + "description": "Offset value (default: 0)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[limit]", + "in": "query", + "description": "Number of entities to return (default: 25)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "fields", + "in": "query", + "description": "Fields to return (ex: title,author)", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "populate", + "in": "query", + "description": "Relations to return", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "filters", + "in": "query", + "description": "Filters to apply", + "deprecated": false, + "required": false, + "schema": { + "type": "object" + }, + "style": "deepObject" + }, + { + "name": "locale", + "in": "query", + "description": "Locale to apply", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + } + ], + "operationId": "get/uniques" + }, + "post": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UniqueResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Unique"], + "parameters": [], + "operationId": "post/uniques", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UniqueRequest" + } + } + } + } + } + }, + "/uniques/{id}": { + "get": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UniqueResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Unique"], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "", + "deprecated": false, + "required": true, + "schema": { + "type": "number" + } + } + ], + "operationId": "get/uniques/{id}" + }, + "put": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UniqueResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Unique"], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "", + "deprecated": false, + "required": true, + "schema": { + "type": "number" + } + } + ], + "operationId": "put/uniques/{id}", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UniqueRequest" + } + } + } + } + }, + "delete": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "integer", + "format": "int64" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Unique"], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "", + "deprecated": false, + "required": true, + "schema": { + "type": "number" + } + } + ], + "operationId": "delete/uniques/{id}" + } + }, + "/uniques/{id}/localizations": { + "post": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UniqueLocalizationResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Unique"], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "", + "deprecated": false, + "required": true, + "schema": { + "type": "number" + } + } + ], + "operationId": "post/uniques/{id}/localizations", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UniqueLocalizationRequest" + } + } + } + } + } + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/unique/routes/unique.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/unique/routes/unique.js new file mode 100644 index 0000000..0725a49 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/unique/routes/unique.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * unique router + */ + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::unique.unique'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/unique/services/unique.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/unique/services/unique.js new file mode 100644 index 0000000..d4b3189 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/unique/services/unique.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * unique service + */ + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::unique.unique'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/upcoming-match/content-types/upcoming-match/schema.json b/Dockers/strapi/strapi/examples/experimental-dev/src/api/upcoming-match/content-types/upcoming-match/schema.json new file mode 100644 index 0000000..1675de3 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/upcoming-match/content-types/upcoming-match/schema.json @@ -0,0 +1,24 @@ +{ + "kind": "singleType", + "collectionName": "upcoming_matches", + "info": { + "singularName": "upcoming-match", + "pluralName": "upcoming-matches", + "displayName": "Upcoming Matches" + }, + "options": { + "draftAndPublish": true + }, + "pluginOptions": {}, + "attributes": { + "title": { + "type": "string" + }, + "number_of_upcoming_matches": { + "type": "integer" + }, + "next_match": { + "type": "date" + } + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/upcoming-match/controllers/upcoming-match.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/upcoming-match/controllers/upcoming-match.js new file mode 100644 index 0000000..ec179ae --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/upcoming-match/controllers/upcoming-match.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * upcoming-match controller + */ + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::upcoming-match.upcoming-match'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/upcoming-match/documentation/1.0.0/upcoming-match.json b/Dockers/strapi/strapi/examples/experimental-dev/src/api/upcoming-match/documentation/1.0.0/upcoming-match.json new file mode 100644 index 0000000..19b6d6e --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/upcoming-match/documentation/1.0.0/upcoming-match.json @@ -0,0 +1,397 @@ +{ + "/upcoming-match": { + "get": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpcomingMatchResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Upcoming-match"], + "parameters": [ + { + "name": "sort", + "in": "query", + "description": "Sort by attributes ascending (asc) or descending (desc)", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "pagination[withCount]", + "in": "query", + "description": "Return page/pageSize (default: true)", + "deprecated": false, + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "pagination[page]", + "in": "query", + "description": "Page number (default: 0)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[pageSize]", + "in": "query", + "description": "Page size (default: 25)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[start]", + "in": "query", + "description": "Offset value (default: 0)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "pagination[limit]", + "in": "query", + "description": "Number of entities to return (default: 25)", + "deprecated": false, + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "fields", + "in": "query", + "description": "Fields to return (ex: title,author)", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "populate", + "in": "query", + "description": "Relations to return", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "filters", + "in": "query", + "description": "Filters to apply", + "deprecated": false, + "required": false, + "schema": { + "type": "object" + }, + "style": "deepObject" + }, + { + "name": "locale", + "in": "query", + "description": "Locale to apply", + "deprecated": false, + "required": false, + "schema": { + "type": "string" + } + } + ], + "operationId": "get/upcoming-match" + }, + "put": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpcomingMatchResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Upcoming-match"], + "parameters": [], + "operationId": "put/upcoming-match", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpcomingMatchRequest" + } + } + } + } + }, + "delete": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "integer", + "format": "int64" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Upcoming-match"], + "parameters": [], + "operationId": "delete/upcoming-match" + } + }, + "/upcoming-match/localizations": { + "post": { + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpcomingMatchLocalizationResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "tags": ["Upcoming-match"], + "parameters": [], + "operationId": "post/upcoming-match/localizations", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpcomingMatchLocalizationRequest" + } + } + } + } + } + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/upcoming-match/routes/upcoming-match.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/upcoming-match/routes/upcoming-match.js new file mode 100644 index 0000000..e45d157 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/upcoming-match/routes/upcoming-match.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * upcoming-match router + */ + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::upcoming-match.upcoming-match'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/api/upcoming-match/services/upcoming-match.js b/Dockers/strapi/strapi/examples/experimental-dev/src/api/upcoming-match/services/upcoming-match.js new file mode 100644 index 0000000..3ae29ec --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/api/upcoming-match/services/upcoming-match.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * upcoming-match service + */ + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::upcoming-match.upcoming-match'); diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/components/meta/seo.json b/Dockers/strapi/strapi/examples/experimental-dev/src/components/meta/seo.json new file mode 100644 index 0000000..4e2865b --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/components/meta/seo.json @@ -0,0 +1,28 @@ +{ + "collectionName": "components_meta_seos", + "info": { + "displayName": "Seo", + "description": "" + }, + "options": {}, + "attributes": { + "title": { + "type": "string" + }, + "description": { + "type": "text", + "maxLength": 150 + }, + "indexable": { + "type": "boolean", + "default": false, + "required": true + }, + "image": { + "type": "media", + "multiple": true, + "required": false, + "allowedTypes": ["images"] + } + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/components/page-blocks/content-and-image.json b/Dockers/strapi/strapi/examples/experimental-dev/src/components/page-blocks/content-and-image.json new file mode 100644 index 0000000..97e9438 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/components/page-blocks/content-and-image.json @@ -0,0 +1,22 @@ +{ + "collectionName": "components_page_blocks_content_and_images", + "info": { + "displayName": "Content and Image" + }, + "options": {}, + "attributes": { + "content": { + "type": "blocks" + }, + "media": { + "allowedTypes": ["images", "files", "videos", "audios"], + "type": "media", + "multiple": true + }, + "content_is_left": { + "type": "boolean", + "default": true, + "required": true + } + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/components/page-blocks/hero-image.json b/Dockers/strapi/strapi/examples/experimental-dev/src/components/page-blocks/hero-image.json new file mode 100644 index 0000000..a27873a --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/components/page-blocks/hero-image.json @@ -0,0 +1,21 @@ +{ + "collectionName": "components_page_blocks_hero_images", + "info": { + "displayName": "Hero Image" + }, + "options": {}, + "attributes": { + "title": { + "type": "string" + }, + "content": { + "type": "blocks" + }, + "background_image": { + "allowedTypes": ["images", "files", "videos", "audios"], + "type": "media", + "multiple": false, + "required": false + } + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/components/page-blocks/product-carousel.json b/Dockers/strapi/strapi/examples/experimental-dev/src/components/page-blocks/product-carousel.json new file mode 100644 index 0000000..928c8dd --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/components/page-blocks/product-carousel.json @@ -0,0 +1,19 @@ +{ + "collectionName": "components_page_blocks_product_carousels", + "info": { + "displayName": "Product carousel" + }, + "options": {}, + "attributes": { + "title": { + "type": "string", + "minLength": 5, + "maxLength": 20 + }, + "products": { + "type": "relation", + "relation": "oneToMany", + "target": "api::product.product" + } + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/components/product/variations.json b/Dockers/strapi/strapi/examples/experimental-dev/src/components/product/variations.json new file mode 100644 index 0000000..0c5f32a --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/components/product/variations.json @@ -0,0 +1,21 @@ +{ + "collectionName": "components_product_variations", + "info": { + "displayName": "variations" + }, + "options": {}, + "attributes": { + "name": { + "type": "string" + }, + "description": { + "type": "text" + }, + "price": { + "type": "decimal" + }, + "sku": { + "type": "integer" + } + } +} diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/extensions/.gitkeep b/Dockers/strapi/strapi/examples/experimental-dev/src/extensions/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Dockers/strapi/strapi/examples/experimental-dev/src/index.ts b/Dockers/strapi/strapi/examples/experimental-dev/src/index.ts new file mode 100644 index 0000000..99f3cad --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/src/index.ts @@ -0,0 +1,20 @@ +import '@strapi/strapi'; + +export default { + /** + * An asynchronous register function that runs before + * your application is initialized. + * + * This gives you an opportunity to extend code. + */ + register(/*{ strapi }*/) {}, + + /** + * An asynchronous bootstrap function that runs before + * your application gets started. + * + * This gives you an opportunity to set up your data model, + * run jobs, or perform some special logic. + */ + bootstrap(/*{ strapi }*/) {}, +}; diff --git a/Dockers/strapi/strapi/examples/experimental-dev/tsconfig.json b/Dockers/strapi/strapi/examples/experimental-dev/tsconfig.json new file mode 100644 index 0000000..d3d6028 --- /dev/null +++ b/Dockers/strapi/strapi/examples/experimental-dev/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "@strapi/typescript-utils/tsconfigs/server", + "compilerOptions": { + "outDir": "dist", + "rootDir": "." + }, + "include": ["./", "src/**/*.json"], + "exclude": [ + "node_modules/", + "build/", + "dist/", + ".cache/", + ".tmp/", + "src/admin/", + "**/*.test.ts", + "src/plugins/**" + ] +} diff --git a/Dockers/strapi/strapi/examples/getstarted/.env.example b/Dockers/strapi/strapi/examples/getstarted/.env.example new file mode 100644 index 0000000..9727fb2 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/.env.example @@ -0,0 +1,3 @@ +HOST=localhost +PORT=1337 +APP_KEYS="toBeModified1,toBeModified2" \ No newline at end of file diff --git a/Dockers/strapi/strapi/examples/getstarted/.gitignore b/Dockers/strapi/strapi/examples/getstarted/.gitignore new file mode 100644 index 0000000..74c092d --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/.gitignore @@ -0,0 +1,117 @@ +############################ +# OS X +############################ + +.DS_Store +.AppleDouble +.LSOverride +Icon +.Spotlight-V100 +.Trashes +._* + + +############################ +# Linux +############################ + +*~ + + +############################ +# Windows +############################ + +Thumbs.db +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ +*.cab +*.msi +*.msm +*.msp + + +############################ +# Packages +############################ + +*.7z +*.csv +*.dat +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip +*.com +*.class +*.dll +*.exe +*.o +*.seed +*.so +*.swo +*.swp +*.swn +*.swm +*.out +*.pid + + +############################ +# Logs and databases +############################ + +.tmp +*.log +*.sql +*.sqlite +*.sqlite3 + + +############################ +# Misc. +############################ + +*# +ssl +.idea +nbproject +public/uploads/* +!public/uploads/.gitkeep + +############################ +# Node.js +############################ + +lib-cov +lcov.info +pids +logs +results +node_modules +.node_history + +############################ +# Tests +############################ + +/coverage/ + +############################ +# Strapi +############################ + +.env +license.txt +exports +*.cache +dist +build +documentation +.strapi-updater.json +types/generated +.strapi \ No newline at end of file diff --git a/Dockers/strapi/strapi/examples/getstarted/.npmrc b/Dockers/strapi/strapi/examples/getstarted/.npmrc new file mode 100644 index 0000000..43c97e7 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/Dockers/strapi/strapi/examples/getstarted/README.md b/Dockers/strapi/strapi/examples/getstarted/README.md new file mode 100644 index 0000000..7ff1c1f --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/README.md @@ -0,0 +1,42 @@ +# getstarted + +This is an example app you can run to test your changes quickly. + +## Requirements + +- Docker +- Docker compose +- Node + +## Installation + +By default once you have setup the monorepo you will be able to run the getstarted app with a sqlite DB directly. + +If you wish to run the getstarted app with another database you can use the `docker-compose.dev.yml` file at the root of the directory. + +### start the databases + +Run the following command at the root of the monorepo + +``` +docker-compose -f docker-compose.dev.yml up -d +``` + +If you need to stop the running databases you can stop them with the following command: + +``` +docker-compose -f docker-compose.dev.yml stop +``` + +### run the getstarted app with a specific database + +``` +DB={dbName} yarn develop +``` + +The way it works is that the `getstarted` app has a specific `database.js` config file that will use the `DB` environment variable to setup the right database connection. You can look at the code [here](./config/database.js) + +**Warning** + +You might have some errors while connecting to the databases. +They might be coming from a conflict between a locally running database instance and the docker instance. To avoid the errors either shutdown your local database instance or change the ports in the `./config/database.js` and the `docker-compose.dev.yml` file. diff --git a/Dockers/strapi/strapi/examples/getstarted/config/admin.js b/Dockers/strapi/strapi/examples/getstarted/config/admin.js new file mode 100644 index 0000000..f94415b --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/config/admin.js @@ -0,0 +1,39 @@ +module.exports = ({ env }) => ({ + // autoOpen: false, + auth: { + secret: env('ADMIN_JWT_SECRET', 'example-token'), + }, + apiToken: { + salt: env('API_TOKEN_SALT', 'example-salt'), + }, + auditLogs: { + enabled: env.bool('AUDIT_LOGS_ENABLED', true), + }, + transfer: { + token: { + salt: env('TRANSFER_TOKEN_SALT', 'example-salt'), + }, + }, + secrets: { + encryptionKey: env('ENCRYPTION_KEY', 'example-key'), + }, + flags: { + nps: env.bool('FLAG_NPS', true), + promoteEE: env.bool('FLAG_PROMOTE_EE', true), + }, + preview: { + enabled: env.bool('PREVIEW_ENABLED', true), + config: { + handler: (uid, { documentId, locale, status }) => { + const contentType = strapi.contentType(uid); + const kind = contentType.kind === 'collectionType' ? 'collection-types' : 'single-types'; + const apiName = + contentType.kind === 'collectionType' + ? contentType.info.pluralName + : contentType.info.singularName; + + return `/admin/preview/${kind}/${apiName}/${documentId}/${locale}/${status}`; + }, + }, + }, +}); diff --git a/Dockers/strapi/strapi/examples/getstarted/config/api.js b/Dockers/strapi/strapi/examples/getstarted/config/api.js new file mode 100644 index 0000000..e537026 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/config/api.js @@ -0,0 +1,7 @@ +module.exports = { + rest: { + defaultLimit: 25, + maxLimit: 30, + withCount: true, + }, +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/config/database.js b/Dockers/strapi/strapi/examples/getstarted/config/database.js new file mode 100644 index 0000000..88aa65c --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/config/database.js @@ -0,0 +1,51 @@ +const sqlite = { + client: 'sqlite', + connection: { + filename: '.tmp/data.db', + }, + useNullAsDefault: true, +}; + +const postgres = { + client: 'postgres', + connection: { + database: 'strapi', + user: 'strapi', + password: 'strapi', + port: 5432, + host: 'localhost', + }, +}; + +const mysql = { + client: 'mysql', + connection: { + database: 'strapi', + user: 'strapi', + password: 'strapi', + port: 3306, + host: 'localhost', + }, +}; + +const mariadb = { + client: 'mysql', + connection: { + database: 'strapi', + user: 'strapi', + password: 'strapi', + port: 3307, + host: 'localhost', + }, +}; + +const db = { + mysql, + sqlite, + postgres, + mariadb, +}; + +module.exports = { + connection: process.env.DB ? db[process.env.DB] || db.sqlite : db.sqlite, +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/config/features.js b/Dockers/strapi/strapi/examples/getstarted/config/features.js new file mode 100644 index 0000000..c381b75 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/config/features.js @@ -0,0 +1 @@ +module.exports = ({ env }) => ({}); diff --git a/Dockers/strapi/strapi/examples/getstarted/config/middlewares.js b/Dockers/strapi/strapi/examples/getstarted/config/middlewares.js new file mode 100644 index 0000000..c7b6ae4 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/config/middlewares.js @@ -0,0 +1,46 @@ +'use strict'; + +const responseHandlers = require('./src/response-handlers'); + +module.exports = [ + 'strapi::logger', + 'strapi::errors', + { + name: 'strapi::security', + config: { + contentSecurityPolicy: { + useDefaults: true, + directives: { + 'frame-src': ["'self'"], // URLs that will be loaded in an iframe (e.g. Content Preview) + // Needed to load the `@vercel/stega` lib on the dummy-preview page + 'script-src': ["'self'", "'unsafe-inline'", 'https://cdn.jsdelivr.net'], + }, + }, + }, + }, + 'strapi::cors', + 'strapi::poweredBy', + 'strapi::query', + 'strapi::body', + 'strapi::session', + // 'strapi::compression', + // 'strapi::ip', + { + name: 'strapi::responses', + config: { + handlers: responseHandlers, + }, + }, + 'strapi::favicon', + 'strapi::public', + { + name: 'global::test-middleware', + config: { + foo: 'bar', + }, + }, + { + resolve: './src/custom/middleware.js', + config: {}, + }, +]; diff --git a/Dockers/strapi/strapi/examples/getstarted/config/plugins.js b/Dockers/strapi/strapi/examples/getstarted/config/plugins.js new file mode 100644 index 0000000..3473ac7 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/config/plugins.js @@ -0,0 +1,38 @@ +'use strict'; + +module.exports = () => ({ + graphql: { + enabled: true, + config: { + endpoint: '/graphql', + + defaultLimit: 25, + maxLimit: 100, + + apolloServer: { + tracing: true, + }, + + v4CompatibilityMode: true, + }, + }, + documentation: { + config: { + info: { + version: '1.0.0', + }, + }, + }, + myplugin: { + enabled: true, + resolve: `./src/plugins/local-plugin`, // From the root of the project + config: { + testConf: 3, + }, + }, + // NOTE: set enabled:true to test with a pre-built plugin. Make sure to run yarn build in the plugin folder first + todo: { + enabled: false, + resolve: `../plugins/todo-example`, // From the /examples/plugins folder + }, +}); diff --git a/Dockers/strapi/strapi/examples/getstarted/config/server.js b/Dockers/strapi/strapi/examples/getstarted/config/server.js new file mode 100644 index 0000000..538c813 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/config/server.js @@ -0,0 +1,45 @@ +'use strict'; + +const cronTasks = require('./src/cron-tasks'); + +module.exports = ({ env }) => ({ + host: env('HOST', '0.0.0.0'), + port: env.int('PORT', 1337), + url: 'http://localhost:1337', + cron: { + enabled: true, + tasks: cronTasks, + }, + app: { + keys: env.array('APP_KEYS', ['toBeModified1', 'toBeModified2']), + }, + webhooks: { + // TODO: V5, set to false by default + // Receive populated relations in webhook and db lifecycle payloads + // This only populates relations in all content-manager endpoints + populateRelations: env.bool('WEBHOOKS_POPULATE_RELATIONS', true), + }, + // ℹ️ http_proxy is the env var used by system to set proxy globally + globalProxy: env('http_proxy'), + http: { + serverOptions: { + requestTimeout: 1000 * 60 * 10, // set request timeout to 600000ms (10 minutes) + }, + }, + transfer: { + remote: { + // enabled: false, + }, + }, + logger: { + config: { + level: 'silly', + }, + updates: { + // enabled: false, + }, + startup: { + // enabled: false, + }, + }, +}); diff --git a/Dockers/strapi/strapi/examples/getstarted/config/src/cron-tasks.js b/Dockers/strapi/strapi/examples/getstarted/config/src/cron-tasks.js new file mode 100644 index 0000000..5b28909 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/config/src/cron-tasks.js @@ -0,0 +1,28 @@ +'use strict'; + +/** + * Cron config that gives you an opportunity + * to run scheduled jobs. + * + * The cron format consists of: + * [MINUTE] [HOUR] [DAY OF MONTH] [MONTH OF YEAR] [DAY OF WEEK] [YEAR (optional)] + * + * It uses https://github.com/node-schedule/node-schedule under the hood + */ + +module.exports = { + /** + * Simple example. + * Every monday at 1am. + */ + // '0 0 1 * * 1': async function({ strapi }) { + // // Add your own logic here (e.g. send a queue of email, create a database backup, etc.). + // }, + // 'myJob': { + // task: ({ strapi }) => { /* Add your own logic here */ }, + // options: { + // rule: '* * * * * *', + // end: new Date().getTime() + 6000, + // } + // } +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/config/src/response-handlers.js b/Dockers/strapi/strapi/examples/getstarted/config/src/response-handlers.js new file mode 100644 index 0000000..2ad17f9 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/config/src/response-handlers.js @@ -0,0 +1,7 @@ +'use strict'; + +module.exports = { + 404: async (/* ctx */) => { + // return ctx.notFound('My custom message 404'); + }, +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/data/data.json b/Dockers/strapi/strapi/examples/getstarted/data/data.json new file mode 100644 index 0000000..d0d0cee --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/data/data.json @@ -0,0 +1,241 @@ +{ + "global": { + "siteName": "Strapi Blog", + "defaultSeo": { + "metaTitle": "Page", + "metaDescription": "A blog made with Strapi", + "shareImage": null + }, + "siteDescription": "A Blog made with Strapi", + "favicon": null + }, + "about": { + "title": "About the strapi blog", + "blocks": [ + { + "__component": "shared.quote", + "title": "Thelonius Monk", + "body": "You've got to dig it to dig it, you dig?" + }, + { + "__component": "shared.rich-text", + "body": "## Dedit imago conspicuus cum capillis totidem inhibere\n\nLorem markdownum **rerum**, est limine: columbas: ab infelix hostem arbore nudis\ncrudelis. Videtur reliquit ambo ferrum dote sub amne fatis **illuc**, in magis,\nnec." + }, + { + "__component": "shared.media", + "file": "coffee-art.jpg" + } + ] + }, + "categories": [ + { + "name": "news", + "slug": "news" + }, + { + "name": "tech", + "slug": "tech" + }, + { + "name": "food", + "slug": "food" + }, + { + "name": "nature", + "slug": "nature" + }, + { + "name": "story", + "slug": "story" + } + ], + "authors": [ + { + "name": "David Doe", + "email": "daviddoe@strapi.io", + "avatar": "daviddoe@strapi.io.jpg" + }, + { + "name": "Sarah Baker", + "email": "sarahbaker@strapi.io", + "avatar": "sarahbaker@strapi.io.jpg" + } + ], + "articles": [ + { + "title": "The internet's Own boy", + "slug": "the-internet-s-own-boy", + "category": { + "id": 5 + }, + "author": { + "id": 1 + }, + "description": "Follow the story of Aaron Swartz, the boy who could change the world", + "cover": null, + "blocks": [ + { + "__component": "shared.rich-text", + "body": "## Probant \n\nse Lorem markdownum negat. Argo *saxa* videnda cornuaque hunc qui tanta spes teneas! Obliquis est dicenti est salutat ille tamen iuvenum nostrae dolore. - Colores nocituraque comitata eripiunt - Addit quodcunque solum cui et dextram illis - Nulli meus nec extemplo ille ferebat pressit Se blandita fulvae vox gravem Pittheus cesserunt sanguine herbis tu comitum tenuit. Sui in ruunt; Doridaque maculosae fuissem! Et loqui. \n\n## Abit sua\n\nse Lorem markdownum negat. Argo *saxa* videnda cornuaque hunc qui tanta spes teneas! Obliquis est dicenti est salutat ille tamen iuvenum nostrae dolore. - Colores nocituraque comitata eripiunt - Addit quodcunque solum cui et dextram illis - Nulli meus nec extemplo ille ferebat pressit Se blandita fulvae vox gravem Pittheus cesserunt sanguine herbis tu comitum tenuit. Sui in ruunt; Doridaque maculosae fuissem! Et loqui. " + }, + { + "__component": "shared.quote", + "title": "Thelonius Monk", + "body": "You've got to dig it to dig it, you dig?" + }, + { + "__component": "shared.media", + "file": "coffee-art.jpg" + }, + { + "__component": "shared.rich-text", + "body": "## Spatiantia astra \n\nFoeda, medio silva *errandum*: onus formam munere. Mutata bibulis est auxiliare arces etiamnunc verbis virgineo Priamidas illa Thescelus, nam fit locis lucis auras. Exitus hospes gratulor ut pondere [speslimite](http://www.curas.io/figuram); quid habent, Avernales faciente de. Pervenit Ino sonabile supplex cognoscenti vires, Bacchumque errat miserarum venandi dignabere dedisti. Discrimina iuncosaque virgaque tot sine superest [fissus](http://quos.org/sitet.aspx). Non color esset potest non sumit, sed vix arserat. Nisi immo silva tantum pectusque quos pennis quisquam artus!" + }, + { + "__component": "shared.slider", + "files": ["coffee-art.jpg", "coffee-beans.jpg"] + } + ] + }, + { + "title": "This shrimp is awesome", + "slug": "this-shrimp-is-awesome", + "category": { + "id": 4 + }, + "author": { + "id": 1 + }, + "description": "Mantis shrimps, or stomatopods, are marine crustaceans of the order Stomatopoda.", + "cover": null, + "blocks": [ + { + "__component": "shared.rich-text", + "body": "## Probant \n\nse Lorem markdownum negat. Argo *saxa* videnda cornuaque hunc qui tanta spes teneas! Obliquis est dicenti est salutat ille tamen iuvenum nostrae dolore. - Colores nocituraque comitata eripiunt - Addit quodcunque solum cui et dextram illis - Nulli meus nec extemplo ille ferebat pressit Se blandita fulvae vox gravem Pittheus cesserunt sanguine herbis tu comitum tenuit. Sui in ruunt; Doridaque maculosae fuissem! Et loqui. \n\n## Abit sua\n\nse Lorem markdownum negat. Argo *saxa* videnda cornuaque hunc qui tanta spes teneas! Obliquis est dicenti est salutat ille tamen iuvenum nostrae dolore. - Colores nocituraque comitata eripiunt - Addit quodcunque solum cui et dextram illis - Nulli meus nec extemplo ille ferebat pressit Se blandita fulvae vox gravem Pittheus cesserunt sanguine herbis tu comitum tenuit. Sui in ruunt; Doridaque maculosae fuissem! Et loqui. " + }, + { + "__component": "shared.quote", + "title": "Thelonius Monk", + "body": "You've got to dig it to dig it, you dig?" + }, + { + "__component": "shared.media", + "file": "coffee-art.jpg" + }, + { + "__component": "shared.rich-text", + "body": "## Spatiantia astra \n\nFoeda, medio silva *errandum*: onus formam munere. Mutata bibulis est auxiliare arces etiamnunc verbis virgineo Priamidas illa Thescelus, nam fit locis lucis auras. Exitus hospes gratulor ut pondere [speslimite](http://www.curas.io/figuram); quid habent, Avernales faciente de. Pervenit Ino sonabile supplex cognoscenti vires, Bacchumque errat miserarum venandi dignabere dedisti. Discrimina iuncosaque virgaque tot sine superest [fissus](http://quos.org/sitet.aspx). Non color esset potest non sumit, sed vix arserat. Nisi immo silva tantum pectusque quos pennis quisquam artus!" + }, + { + "__component": "shared.slider", + "files": ["coffee-art.jpg", "coffee-beans.jpg"] + } + ] + }, + { + "title": "A bug is becoming a meme on the internet", + "slug": "a-bug-is-becoming-a-meme-on-the-internet", + "category": { + "id": 2 + }, + "author": { + "id": 2 + }, + "description": "How a bug on MySQL is becoming a meme on the internet", + "cover": null, + "blocks": [ + { + "__component": "shared.rich-text", + "body": "## Probant \n\nse Lorem markdownum negat. Argo *saxa* videnda cornuaque hunc qui tanta spes teneas! Obliquis est dicenti est salutat ille tamen iuvenum nostrae dolore. - Colores nocituraque comitata eripiunt - Addit quodcunque solum cui et dextram illis - Nulli meus nec extemplo ille ferebat pressit Se blandita fulvae vox gravem Pittheus cesserunt sanguine herbis tu comitum tenuit. Sui in ruunt; Doridaque maculosae fuissem! Et loqui. \n\n## Abit sua\n\nse Lorem markdownum negat. Argo *saxa* videnda cornuaque hunc qui tanta spes teneas! Obliquis est dicenti est salutat ille tamen iuvenum nostrae dolore. - Colores nocituraque comitata eripiunt - Addit quodcunque solum cui et dextram illis - Nulli meus nec extemplo ille ferebat pressit Se blandita fulvae vox gravem Pittheus cesserunt sanguine herbis tu comitum tenuit. Sui in ruunt; Doridaque maculosae fuissem! Et loqui. " + }, + { + "__component": "shared.quote", + "title": "Thelonius Monk", + "body": "You've got to dig it to dig it, you dig?" + }, + { + "__component": "shared.media", + "file": "coffee-art.jpg" + }, + { + "__component": "shared.rich-text", + "body": "## Spatiantia astra \n\nFoeda, medio silva *errandum*: onus formam munere. Mutata bibulis est auxiliare arces etiamnunc verbis virgineo Priamidas illa Thescelus, nam fit locis lucis auras. Exitus hospes gratulor ut pondere [speslimite](http://www.curas.io/figuram); quid habent, Avernales faciente de. Pervenit Ino sonabile supplex cognoscenti vires, Bacchumque errat miserarum venandi dignabere dedisti. Discrimina iuncosaque virgaque tot sine superest [fissus](http://quos.org/sitet.aspx). Non color esset potest non sumit, sed vix arserat. Nisi immo silva tantum pectusque quos pennis quisquam artus!" + }, + { + "__component": "shared.slider", + "files": ["coffee-art.jpg", "coffee-beans.jpg"] + } + ] + }, + { + "title": "Beautiful picture", + "slug": "beautiful-picture", + "category": { + "id": 4 + }, + "author": { + "id": 2 + }, + "description": "Description of a beautiful picture", + "cover": null, + "blocks": [ + { + "__component": "shared.rich-text", + "body": "## Probant \n\nse Lorem markdownum negat. Argo *saxa* videnda cornuaque hunc qui tanta spes teneas! Obliquis est dicenti est salutat ille tamen iuvenum nostrae dolore. - Colores nocituraque comitata eripiunt - Addit quodcunque solum cui et dextram illis - Nulli meus nec extemplo ille ferebat pressit Se blandita fulvae vox gravem Pittheus cesserunt sanguine herbis tu comitum tenuit. Sui in ruunt; Doridaque maculosae fuissem! Et loqui. \n\n## Abit sua\n\nse Lorem markdownum negat. Argo *saxa* videnda cornuaque hunc qui tanta spes teneas! Obliquis est dicenti est salutat ille tamen iuvenum nostrae dolore. - Colores nocituraque comitata eripiunt - Addit quodcunque solum cui et dextram illis - Nulli meus nec extemplo ille ferebat pressit Se blandita fulvae vox gravem Pittheus cesserunt sanguine herbis tu comitum tenuit. Sui in ruunt; Doridaque maculosae fuissem! Et loqui. " + }, + { + "__component": "shared.quote", + "title": "Thelonius Monk", + "body": "You've got to dig it to dig it, you dig?" + }, + { + "__component": "shared.media", + "file": "coffee-art.jpg" + }, + { + "__component": "shared.rich-text", + "body": "## Spatiantia astra \n\nFoeda, medio silva *errandum*: onus formam munere. Mutata bibulis est auxiliare arces etiamnunc verbis virgineo Priamidas illa Thescelus, nam fit locis lucis auras. Exitus hospes gratulor ut pondere [speslimite](http://www.curas.io/figuram); quid habent, Avernales faciente de. Pervenit Ino sonabile supplex cognoscenti vires, Bacchumque errat miserarum venandi dignabere dedisti. Discrimina iuncosaque virgaque tot sine superest [fissus](http://quos.org/sitet.aspx). Non color esset potest non sumit, sed vix arserat. Nisi immo silva tantum pectusque quos pennis quisquam artus!" + }, + { + "__component": "shared.slider", + "files": ["coffee-art.jpg", "coffee-beans.jpg"] + } + ] + }, + { + "title": "What's inside a Black Hole", + "slug": "what-s-inside-a-black-hole", + "category": { + "id": 1 + }, + "author": { + "id": 2 + }, + "description": "Maybe the answer is in this article, or not...", + "cover": null, + "blocks": [ + { + "__component": "shared.rich-text", + "body": "## Probant \n\nse Lorem markdownum negat. Argo *saxa* videnda cornuaque hunc qui tanta spes teneas! Obliquis est dicenti est salutat ille tamen iuvenum nostrae dolore. - Colores nocituraque comitata eripiunt - Addit quodcunque solum cui et dextram illis - Nulli meus nec extemplo ille ferebat pressit Se blandita fulvae vox gravem Pittheus cesserunt sanguine herbis tu comitum tenuit. Sui in ruunt; Doridaque maculosae fuissem! Et loqui. \n\n## Abit sua\n\nse Lorem markdownum negat. Argo *saxa* videnda cornuaque hunc qui tanta spes teneas! Obliquis est dicenti est salutat ille tamen iuvenum nostrae dolore. - Colores nocituraque comitata eripiunt - Addit quodcunque solum cui et dextram illis - Nulli meus nec extemplo ille ferebat pressit Se blandita fulvae vox gravem Pittheus cesserunt sanguine herbis tu comitum tenuit. Sui in ruunt; Doridaque maculosae fuissem! Et loqui. " + }, + { + "__component": "shared.quote", + "title": "Thelonius Monk", + "body": "You've got to dig it to dig it, you dig?" + }, + { + "__component": "shared.media", + "file": "coffee-art.jpg" + }, + { + "__component": "shared.rich-text", + "body": "## Spatiantia astra \n\nFoeda, medio silva *errandum*: onus formam munere. Mutata bibulis est auxiliare arces etiamnunc verbis virgineo Priamidas illa Thescelus, nam fit locis lucis auras. Exitus hospes gratulor ut pondere [speslimite](http://www.curas.io/figuram); quid habent, Avernales faciente de. Pervenit Ino sonabile supplex cognoscenti vires, Bacchumque errat miserarum venandi dignabere dedisti. Discrimina iuncosaque virgaque tot sine superest [fissus](http://quos.org/sitet.aspx). Non color esset potest non sumit, sed vix arserat. Nisi immo silva tantum pectusque quos pennis quisquam artus!" + }, + { + "__component": "shared.slider", + "files": ["coffee-art.jpg", "coffee-beans.jpg"] + } + ] + } + ] +} diff --git a/Dockers/strapi/strapi/examples/getstarted/data/uploads/a-bug-is-becoming-a-meme-on-the-internet.jpg b/Dockers/strapi/strapi/examples/getstarted/data/uploads/a-bug-is-becoming-a-meme-on-the-internet.jpg new file mode 100644 index 0000000..3f87d36 Binary files /dev/null and b/Dockers/strapi/strapi/examples/getstarted/data/uploads/a-bug-is-becoming-a-meme-on-the-internet.jpg differ diff --git a/Dockers/strapi/strapi/examples/getstarted/data/uploads/beautiful-picture.jpg b/Dockers/strapi/strapi/examples/getstarted/data/uploads/beautiful-picture.jpg new file mode 100644 index 0000000..ec46439 Binary files /dev/null and b/Dockers/strapi/strapi/examples/getstarted/data/uploads/beautiful-picture.jpg differ diff --git a/Dockers/strapi/strapi/examples/getstarted/data/uploads/coffee-art.jpg b/Dockers/strapi/strapi/examples/getstarted/data/uploads/coffee-art.jpg new file mode 100644 index 0000000..15b5e8b Binary files /dev/null and b/Dockers/strapi/strapi/examples/getstarted/data/uploads/coffee-art.jpg differ diff --git a/Dockers/strapi/strapi/examples/getstarted/data/uploads/coffee-beans.jpg b/Dockers/strapi/strapi/examples/getstarted/data/uploads/coffee-beans.jpg new file mode 100644 index 0000000..3719255 Binary files /dev/null and b/Dockers/strapi/strapi/examples/getstarted/data/uploads/coffee-beans.jpg differ diff --git a/Dockers/strapi/strapi/examples/getstarted/data/uploads/coffee-shadow.jpg b/Dockers/strapi/strapi/examples/getstarted/data/uploads/coffee-shadow.jpg new file mode 100644 index 0000000..3289d58 Binary files /dev/null and b/Dockers/strapi/strapi/examples/getstarted/data/uploads/coffee-shadow.jpg differ diff --git a/Dockers/strapi/strapi/examples/getstarted/data/uploads/daviddoe@strapi.io.jpg b/Dockers/strapi/strapi/examples/getstarted/data/uploads/daviddoe@strapi.io.jpg new file mode 100644 index 0000000..ee8adca Binary files /dev/null and b/Dockers/strapi/strapi/examples/getstarted/data/uploads/daviddoe@strapi.io.jpg differ diff --git a/Dockers/strapi/strapi/examples/getstarted/data/uploads/default-image.png b/Dockers/strapi/strapi/examples/getstarted/data/uploads/default-image.png new file mode 100644 index 0000000..3d3467d Binary files /dev/null and b/Dockers/strapi/strapi/examples/getstarted/data/uploads/default-image.png differ diff --git a/Dockers/strapi/strapi/examples/getstarted/data/uploads/favicon.png b/Dockers/strapi/strapi/examples/getstarted/data/uploads/favicon.png new file mode 100644 index 0000000..5325337 Binary files /dev/null and b/Dockers/strapi/strapi/examples/getstarted/data/uploads/favicon.png differ diff --git a/Dockers/strapi/strapi/examples/getstarted/data/uploads/sarahbaker@strapi.io.jpg b/Dockers/strapi/strapi/examples/getstarted/data/uploads/sarahbaker@strapi.io.jpg new file mode 100644 index 0000000..924be75 Binary files /dev/null and b/Dockers/strapi/strapi/examples/getstarted/data/uploads/sarahbaker@strapi.io.jpg differ diff --git a/Dockers/strapi/strapi/examples/getstarted/data/uploads/the-internet-s-own-boy.jpg b/Dockers/strapi/strapi/examples/getstarted/data/uploads/the-internet-s-own-boy.jpg new file mode 100644 index 0000000..5381a5f Binary files /dev/null and b/Dockers/strapi/strapi/examples/getstarted/data/uploads/the-internet-s-own-boy.jpg differ diff --git a/Dockers/strapi/strapi/examples/getstarted/data/uploads/this-shrimp-is-awesome.jpg b/Dockers/strapi/strapi/examples/getstarted/data/uploads/this-shrimp-is-awesome.jpg new file mode 100644 index 0000000..d001553 Binary files /dev/null and b/Dockers/strapi/strapi/examples/getstarted/data/uploads/this-shrimp-is-awesome.jpg differ diff --git a/Dockers/strapi/strapi/examples/getstarted/data/uploads/we-love-pizza.jpg b/Dockers/strapi/strapi/examples/getstarted/data/uploads/we-love-pizza.jpg new file mode 100644 index 0000000..5a0fc58 Binary files /dev/null and b/Dockers/strapi/strapi/examples/getstarted/data/uploads/we-love-pizza.jpg differ diff --git a/Dockers/strapi/strapi/examples/getstarted/data/uploads/what-s-inside-a-black-hole.jpg b/Dockers/strapi/strapi/examples/getstarted/data/uploads/what-s-inside-a-black-hole.jpg new file mode 100644 index 0000000..83ec497 Binary files /dev/null and b/Dockers/strapi/strapi/examples/getstarted/data/uploads/what-s-inside-a-black-hole.jpg differ diff --git a/Dockers/strapi/strapi/examples/getstarted/ecosystem.config.js b/Dockers/strapi/strapi/examples/getstarted/ecosystem.config.js new file mode 100644 index 0000000..3b92b09 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/ecosystem.config.js @@ -0,0 +1,12 @@ +module.exports = { + apps: [ + { + name: 'strapi-getstarted', + script: 'npm', + args: 'start', + env: { + NODE_ENV: 'production', + }, + }, + ], +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/favicon.png b/Dockers/strapi/strapi/examples/getstarted/favicon.png new file mode 100644 index 0000000..df668a8 Binary files /dev/null and b/Dockers/strapi/strapi/examples/getstarted/favicon.png differ diff --git a/Dockers/strapi/strapi/examples/getstarted/jsconfig.json b/Dockers/strapi/strapi/examples/getstarted/jsconfig.json new file mode 100644 index 0000000..03be888 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/jsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "jsx": "react", + "module": "NodeNext", + "moduleResolution": "nodenext", + "target": "ES2021", + "checkJs": true, + "allowJs": true + }, + "exclude": ["node_modules"] +} diff --git a/Dockers/strapi/strapi/examples/getstarted/package.json b/Dockers/strapi/strapi/examples/getstarted/package.json new file mode 100644 index 0000000..a355195 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/package.json @@ -0,0 +1,46 @@ +{ + "name": "getstarted", + "version": "0.0.0", + "private": true, + "description": "A Strapi application.", + "license": "SEE LICENSE IN LICENSE", + "scripts": { + "build": "strapi build", + "build:ce": "STRAPI_DISABLE_EE=true strapi build", + "develop": "strapi develop", + "develop:ce": "STRAPI_DISABLE_EE=true strapi develop", + "start": "strapi start", + "strapi": "strapi" + }, + "dependencies": { + "@strapi/blocks-react-renderer": "1.0.2", + "@strapi/icons": "2.0.0-rc.29", + "@strapi/plugin-color-picker": "workspace:*", + "@strapi/plugin-documentation": "workspace:*", + "@strapi/plugin-graphql": "workspace:*", + "@strapi/plugin-sentry": "workspace:*", + "@strapi/plugin-users-permissions": "workspace:*", + "@strapi/provider-email-mailgun": "workspace:*", + "@strapi/provider-upload-aws-s3": "workspace:*", + "@strapi/provider-upload-cloudinary": "workspace:*", + "@strapi/strapi": "workspace:*", + "better-sqlite3": "11.3.0", + "lodash": "4.17.21", + "mysql2": "3.9.8", + "passport-google-oauth2": "0.2.0", + "pg": "8.11.1", + "react": "18.3.1", + "react-dom": "18.3.1", + "react-intl": "6.6.2", + "react-router-dom": "6.22.3", + "strapi-plugin-workspace-plugin": "workspace:*", + "styled-components": "6.1.8" + }, + "engines": { + "node": ">=18.0.0 <=22.x.x", + "npm": ">=6.0.0" + }, + "strapi": { + "uuid": "getstarted" + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/public/robots.txt b/Dockers/strapi/strapi/examples/getstarted/public/robots.txt new file mode 100644 index 0000000..ff5d316 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/public/robots.txt @@ -0,0 +1,3 @@ +# To prevent search engines from seeing the site altogether, uncomment the next two lines: +# User-Agent: * +# Disallow: / diff --git a/Dockers/strapi/strapi/examples/getstarted/public/uploads/.gitkeep b/Dockers/strapi/strapi/examples/getstarted/public/uploads/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Dockers/strapi/strapi/examples/getstarted/src/admin/app.jsx b/Dockers/strapi/strapi/examples/getstarted/src/admin/app.jsx new file mode 100644 index 0000000..2b4d161 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/admin/app.jsx @@ -0,0 +1,16 @@ +import React from 'react'; + +import { Button } from '@strapi/design-system'; + +import { registerPreviewRoute } from './preview'; + +const config = { + locales: ['it', 'es', 'en', 'en-GB'], +}; + +export default { + config, + register: (app) => { + registerPreviewRoute(app); + }, +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/admin/preview/dummy-preview.jsx b/Dockers/strapi/strapi/examples/getstarted/src/admin/preview/dummy-preview.jsx new file mode 100644 index 0000000..9b5006c --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/admin/preview/dummy-preview.jsx @@ -0,0 +1,289 @@ +import * as React from 'react'; +import { useParams, useLoaderData, useRevalidator } from 'react-router-dom'; +import { BlocksRenderer } from '@strapi/blocks-react-renderer'; + +import { Page, Layouts } from '@strapi/admin/strapi-admin'; +import { + Grid, + Flex, + Typography, + JSONInput, + Box, + IconButton, + Link, + LinkButton, + Button, +} from '@strapi/design-system'; +import { ChevronDown, ChevronRight } from '@strapi/icons'; + +const filterAttributes = (item) => { + const excludedKeys = ['documentId', 'id', 'createdAt', 'updatedAt', 'publishedAt']; + return Object.entries(item).filter(([key]) => !excludedKeys.includes(key)); +}; + +const ToggleableContainer = ({ headerText, children, isEmpty = false }) => { + const [isExpanded, setIsExpanded] = React.useState(false); + + return ( + + setIsExpanded(!isExpanded)} + paddingTop={1} + paddingBottom={1} + marginLeft={-1} + disabled={isEmpty} + color="neutral600" + > + {isExpanded ? : } + {headerText} + + {isExpanded && ( + + {children} + + )} + + ); +}; + +const NestedValue = ({ value, level = 0, arrayIndex = undefined, fieldName = undefined }) => { + if (fieldName === 'blocks') { + return ( + + {value ? : 'null'} + + ); + } + + // Use the email type to test clickable preview elements + if (fieldName === 'email') { + return ( + + ); + } + + if (Array.isArray(value)) { + return ( + + + {value.map((item, index) => ( + + {typeof item === 'object' && item !== null ? ( + + ) : ( + + + [{index}] + + + + )} + + ))} + + + ); + } + + if (typeof value === 'object' && value !== null) { + const entries = filterAttributes(value); + + return ( + + + {entries.map(([key, val]) => ( + + + {key} + + + + ))} + + + ); + } + + return ( + + {String(value)} + + ); +}; + +const Entry = ({ data }) => { + return ( + + {filterAttributes(data).map(([key, value]) => ( + + + {key} + + + + + + ))} + + ); +}; + +const PreviewComponent = () => { + const { apiName, documentId, locale, status: documentStatus } = useParams(); + const { main, unrelated } = useLoaderData(); + const revalidator = useRevalidator(); + + React.useEffect(() => { + const handleMessage = (event) => { + const { origin, data } = event; + + /** + * This is a special case because this is an admin page that's meant to be embedded within + * the admin itself. For real user websites, this will likely be something like this instead: + * `if (origin !== process.env.API_URL) return` + */ + if (origin !== window.origin) { + return; + } + + if (data?.type === 'strapiUpdate') { + // The data is stale, force a refetch + revalidator.revalidate(); + } else if (data?.type === 'strapiScript') { + const script = window.document.createElement('script'); + script.textContent = data.payload.script; + window.document.head.appendChild(script); + } + }; + + window.addEventListener('message', handleMessage); + + window.parent?.postMessage({ type: 'previewReady' }, '*'); + + return () => { + window.removeEventListener('message', handleMessage); + }; + }, []); + + return ( + + + + {`Previewing ${apiName}`} + + + + + URL metadata + + + + + Content Type + + + {apiName} + + + + + Document Id + + + {documentId} + + + + + Status + + + {documentStatus} + + + + + Locale + + {locale} + + + + Rest API data + + {revalidator.state === 'loading' && Refreshing data...} + {main ? ( + <> + + + + ) : ( + No data found + )} + {unrelated && ( + <> + + Unrelated API data + + + + )} + + + + + + ); +}; + +export { PreviewComponent }; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/admin/preview/index.jsx b/Dockers/strapi/strapi/examples/getstarted/src/admin/preview/index.jsx new file mode 100644 index 0000000..8d9d3fa --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/admin/preview/index.jsx @@ -0,0 +1,78 @@ +import React from 'react'; +import { lazy } from 'react'; + +const Preview = lazy(() => + // @ts-ignore + import('./dummy-preview').then((module) => ({ + default: module.PreviewComponent, + })) +); + +// Pre-fetch the preview data before the route renders +const previewLoader = async ({ params }) => { + const { apiName, documentId, locale, status, collectionType } = params; + const apiToken = process.env.STRAPI_ADMIN_API_TOKEN; + + if (!documentId) { + throw new Error('Document ID is required'); + } + + if (!apiToken) { + throw new Error('STRAPI_ADMIN_API_TOKEN is not set'); + } + + try { + const headers = { + 'Content-Type': 'application/json', + Authorization: `Bearer ${apiToken}`, + 'strapi-encode-source-maps': 'true', + }; + const searchParams = new URLSearchParams({ + locale, + status, + populate: '*', + }); + const route = collectionType === 'collection-types' ? `${apiName}/${documentId}` : apiName; + + // Make both fetch requests in parallel + const [mainResponse, unrelatedResponse] = await Promise.all([ + fetch(`/api/${route}?${searchParams.toString()}`, { headers }), + fetch(`/api/homepage?status=draft`, { headers }), + ]); + + if (!mainResponse.ok) { + throw new Error(`HTTP error! status: ${mainResponse.status}`); + } + + if (!unrelatedResponse.ok) { + throw new Error(`HTTP error! status: ${unrelatedResponse.status}`); + } + + // Process both responses in parallel + const [mainResult, unrelatedResult] = await Promise.all([ + mainResponse.json(), + unrelatedResponse.json(), + ]); + + return { + main: mainResult.data, + unrelated: unrelatedResult.data, + }; + } catch (error) { + console.error('Error fetching preview data:', error); + throw error; + } +}; + +export const registerPreviewRoute = (app) => { + app.router.addRoute({ + path: 'preview/*', + children: [ + { + path: ':collectionType/:apiName/:documentId/:locale/:status', + element: , + loader: previewLoader, + }, + ], + }); +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/admin/webpack.config.js b/Dockers/strapi/strapi/examples/getstarted/src/admin/webpack.config.js new file mode 100644 index 0000000..1ca45c2 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/admin/webpack.config.js @@ -0,0 +1,9 @@ +'use strict'; + +/* eslint-disable no-unused-vars */ +module.exports = (config, webpack) => { + // Note: we provide webpack above so you should not `require` it + // Perform customizations to webpack config + // Important: return the modified config + return config; +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/address/content-types/address/lifecycles.js b/Dockers/strapi/strapi/examples/getstarted/src/api/address/content-types/address/lifecycles.js new file mode 100644 index 0000000..9e8522c --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/address/content-types/address/lifecycles.js @@ -0,0 +1,5 @@ +module.exports = { + beforeUpdate() { + const ctx = strapi.requestContext.get(); + }, +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/address/content-types/address/schema.json b/Dockers/strapi/strapi/examples/getstarted/src/api/address/content-types/address/schema.json new file mode 100755 index 0000000..a57b9cb --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/address/content-types/address/schema.json @@ -0,0 +1,73 @@ +{ + "kind": "collectionType", + "collectionName": "addresses", + "info": { + "displayName": "Address", + "singularName": "address", + "pluralName": "addresses", + "description": "", + "name": "Address" + }, + "options": { + "draftAndPublish": false + }, + "pluginOptions": {}, + "attributes": { + "postal_code": { + "type": "string", + "maxLength": 2 + }, + "categories": { + "type": "relation", + "relation": "manyToMany", + "target": "api::category.category", + "inversedBy": "addresses" + }, + "cover": { + "type": "media", + "multiple": false, + "required": false + }, + "images": { + "type": "media", + "multiple": true, + "required": false, + "allowedTypes": ["images"] + }, + "city": { + "type": "string", + "maxLength": 200, + "required": true + }, + "json": { + "type": "json" + }, + "slug": { + "type": "uid" + }, + "notrepeat_req": { + "type": "component", + "component": "blog.test-como", + "repeatable": false, + "required": true + }, + "notrepeat_optional": { + "type": "component", + "component": "blog.test-como", + "repeatable": false + }, + "repeat_req": { + "type": "component", + "component": "blog.test-como", + "repeatable": true, + "required": true + }, + "repeat_req_min": { + "type": "component", + "component": "blog.test-como", + "repeatable": true, + "required": false, + "min": 2 + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/address/controllers/address.js b/Dockers/strapi/strapi/examples/getstarted/src/api/address/controllers/address.js new file mode 100644 index 0000000..1e508b1 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/address/controllers/address.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::address.address'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/address/index.js b/Dockers/strapi/strapi/examples/getstarted/src/api/address/index.js new file mode 100644 index 0000000..39e97ca --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/address/index.js @@ -0,0 +1,8 @@ +module.exports = { + register() { + // console.log('Address API register'); + }, + bootstrap() { + // console.log('Address API bootstrap'); + }, +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/address/middlewares/address-middleware.js b/Dockers/strapi/strapi/examples/getstarted/src/api/address/middlewares/address-middleware.js new file mode 100644 index 0000000..9e31b84 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/address/middlewares/address-middleware.js @@ -0,0 +1,6 @@ +module.exports = (options) => { + return (ctx, next) => { + ctx.set('X-Strapi-Test', 'Address Middleware'); + return next(); + }; +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/address/policies/address.js b/Dockers/strapi/strapi/examples/getstarted/src/api/address/policies/address.js new file mode 100644 index 0000000..dddee23 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/address/policies/address.js @@ -0,0 +1,3 @@ +module.exports = (policyCtx, config, { strapi }) => { + return true; +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/address/routes/address.js b/Dockers/strapi/strapi/examples/getstarted/src/api/address/routes/address.js new file mode 100755 index 0000000..5499184 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/address/routes/address.js @@ -0,0 +1,12 @@ +'use strict'; + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::address.address', { + config: { + find: { + // auth: false, + }, + }, + only: ['find', 'findOne'], +}); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/address/services/address.js b/Dockers/strapi/strapi/examples/getstarted/src/api/address/services/address.js new file mode 100644 index 0000000..949c82c --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/address/services/address.js @@ -0,0 +1,3 @@ +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::address.address'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/category/content-types/category/schema.json b/Dockers/strapi/strapi/examples/getstarted/src/api/category/content-types/category/schema.json new file mode 100755 index 0000000..f8a03c4 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/category/content-types/category/schema.json @@ -0,0 +1,69 @@ +{ + "kind": "collectionType", + "collectionName": "categories", + "info": { + "displayName": "Category", + "singularName": "category", + "pluralName": "categories", + "description": "", + "name": "Category" + }, + "options": { + "draftAndPublish": true + }, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "attributes": { + "name": { + "type": "string", + "pluginOptions": { + "i18n": { + "localized": true + } + } + }, + "addresses": { + "type": "relation", + "relation": "manyToMany", + "target": "api::address.address", + "mappedBy": "categories" + }, + "temps": { + "type": "relation", + "relation": "manyToMany", + "target": "api::temp.temp", + "mappedBy": "categories" + }, + "datetime": { + "pluginOptions": { + "i18n": { + "localized": false + } + }, + "type": "datetime" + }, + "date": { + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "type": "date" + }, + "relation_locales": { + "type": "relation", + "relation": "manyToMany", + "target": "api::relation-locale.relation-locale", + "mappedBy": "categories" + }, + "relation": { + "type": "relation", + "relation": "oneToOne", + "target": "api::relation-locale.relation-locale", + "mappedBy": "category" + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/category/controllers/category.js b/Dockers/strapi/strapi/examples/getstarted/src/api/category/controllers/category.js new file mode 100644 index 0000000..33db063 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/category/controllers/category.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::category.category'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/category/routes/category.js b/Dockers/strapi/strapi/examples/getstarted/src/api/category/routes/category.js new file mode 100755 index 0000000..eb65fc5 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/category/routes/category.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::category.category'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/category/services/category.js b/Dockers/strapi/strapi/examples/getstarted/src/api/category/services/category.js new file mode 100644 index 0000000..92dbe89 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/category/services/category.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::category.category'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/condition/content-types/condition/schema.json b/Dockers/strapi/strapi/examples/getstarted/src/api/condition/content-types/condition/schema.json new file mode 100644 index 0000000..8fe2b60 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/condition/content-types/condition/schema.json @@ -0,0 +1,33 @@ +{ + "kind": "collectionType", + "collectionName": "conditions", + "info": { + "singularName": "condition", + "pluralName": "conditions", + "displayName": "Condition" + }, + "options": { + "draftAndPublish": true + }, + "pluginOptions": {}, + "attributes": { + "isActive": { + "type": "boolean" + }, + "country": { + "type": "relation", + "relation": "oneToOne", + "target": "api::country.country", + "conditions": { + "visible": { + "==": [ + { + "var": "isActive" + }, + true + ] + } + } + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/condition/controllers/condition.js b/Dockers/strapi/strapi/examples/getstarted/src/api/condition/controllers/condition.js new file mode 100644 index 0000000..32495ec --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/condition/controllers/condition.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * condition controller + */ + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::condition.condition'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/condition/routes/condition.js b/Dockers/strapi/strapi/examples/getstarted/src/api/condition/routes/condition.js new file mode 100644 index 0000000..fa94bc0 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/condition/routes/condition.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * condition router + */ + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::condition.condition'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/condition/services/condition.js b/Dockers/strapi/strapi/examples/getstarted/src/api/condition/services/condition.js new file mode 100644 index 0000000..cae9abe --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/condition/services/condition.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * condition service + */ + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::condition.condition'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/country/content-types/country/schema.json b/Dockers/strapi/strapi/examples/getstarted/src/api/country/content-types/country/schema.json new file mode 100755 index 0000000..6215b27 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/country/content-types/country/schema.json @@ -0,0 +1,56 @@ +{ + "kind": "collectionType", + "collectionName": "countries", + "info": { + "displayName": "Country", + "singularName": "country", + "pluralName": "countries", + "description": "", + "name": "Country" + }, + "options": { + "draftAndPublish": false + }, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "attributes": { + "name": { + "type": "string", + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "minLength": 3, + "required": true + }, + "code": { + "type": "string", + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "conditions": { + "visible": { + "==": [ + { + "var": "visible" + }, + true + ] + } + }, + "minLength": 2, + "maxLength": 3, + "required": true, + "unique": true + }, + "visible": { + "type": "boolean" + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/country/controllers/country.js b/Dockers/strapi/strapi/examples/getstarted/src/api/country/controllers/country.js new file mode 100644 index 0000000..17a5075 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/country/controllers/country.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::country.country'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/country/routes/country.js b/Dockers/strapi/strapi/examples/getstarted/src/api/country/routes/country.js new file mode 100755 index 0000000..a1492e2 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/country/routes/country.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::country.country'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/country/services/country.js b/Dockers/strapi/strapi/examples/getstarted/src/api/country/services/country.js new file mode 100644 index 0000000..882e7c1 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/country/services/country.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::country.country'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/homepage/content-types/homepage/schema.json b/Dockers/strapi/strapi/examples/getstarted/src/api/homepage/content-types/homepage/schema.json new file mode 100644 index 0000000..6cf6a1e --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/homepage/content-types/homepage/schema.json @@ -0,0 +1,77 @@ +{ + "kind": "singleType", + "collectionName": "homepages", + "info": { + "displayName": "Homepage", + "singularName": "homepage", + "pluralName": "homepages", + "description": "" + }, + "options": { + "draftAndPublish": true + }, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "attributes": { + "title": { + "type": "string", + "required": true, + "pluginOptions": { + "i18n": { + "localized": true + } + } + }, + "slug": { + "type": "uid", + "targetField": "title", + "required": true, + "pluginOptions": { + "i18n": { + "localized": true + } + } + }, + "mediaType": { + "type": "enumeration", + "enum": ["multiple", "single"], + "default": "multiple", + "required": true + }, + "single": { + "type": "media", + "multiple": false, + "required": false, + "conditions": { + "visible": { + "==": [ + { + "var": "mediaType" + }, + "single" + ] + } + }, + "allowedTypes": ["images", "files", "videos"] + }, + "multiple": { + "type": "media", + "multiple": true, + "required": false, + "conditions": { + "visible": { + "==": [ + { + "var": "mediaType" + }, + "multiple" + ] + } + }, + "allowedTypes": ["images", "videos"] + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/homepage/controllers/homepage.js b/Dockers/strapi/strapi/examples/getstarted/src/api/homepage/controllers/homepage.js new file mode 100644 index 0000000..0beed55 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/homepage/controllers/homepage.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::homepage.homepage'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/homepage/routes/homepage.js b/Dockers/strapi/strapi/examples/getstarted/src/api/homepage/routes/homepage.js new file mode 100644 index 0000000..75b218d --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/homepage/routes/homepage.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::homepage.homepage'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/homepage/services/homepage.js b/Dockers/strapi/strapi/examples/getstarted/src/api/homepage/services/homepage.js new file mode 100644 index 0000000..1463a6a --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/homepage/services/homepage.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::homepage.homepage'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/kitchensink/content-types/kitchensink/schema.json b/Dockers/strapi/strapi/examples/getstarted/src/api/kitchensink/content-types/kitchensink/schema.json new file mode 100644 index 0000000..d706dea --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/kitchensink/content-types/kitchensink/schema.json @@ -0,0 +1,161 @@ +{ + "kind": "collectionType", + "collectionName": "kitchensinks", + "info": { + "displayName": "Kitchen Sink", + "singularName": "kitchensink", + "pluralName": "kitchensinks", + "description": "", + "name": "Kitchen Sink" + }, + "options": { + "draftAndPublish": true + }, + "pluginOptions": {}, + "attributes": { + "short_text": { + "type": "string" + }, + "long_text": { + "type": "text" + }, + "rich_text": { + "type": "richtext" + }, + "blocks": { + "type": "blocks" + }, + "integer": { + "type": "integer" + }, + "biginteger": { + "type": "biginteger" + }, + "decimal": { + "type": "decimal" + }, + "float": { + "type": "float" + }, + "date": { + "type": "date" + }, + "datetime": { + "type": "datetime" + }, + "time": { + "type": "time" + }, + "timestamp": { + "type": "timestamp" + }, + "boolean": { + "type": "boolean" + }, + "email": { + "type": "email" + }, + "password": { + "type": "password" + }, + "enumeration": { + "type": "enumeration", + "enum": ["A", "B", "C", "D", "E"] + }, + "single_media": { + "type": "media", + "multiple": false, + "required": false, + "allowedTypes": ["images", "files", "videos"] + }, + "multiple_media": { + "type": "media", + "multiple": true, + "required": false, + "allowedTypes": ["images", "files", "videos"] + }, + "json": { + "type": "json" + }, + "single_compo": { + "type": "component", + "repeatable": false, + "component": "basic.simple" + }, + "repeatable_compo": { + "type": "component", + "repeatable": true, + "component": "basic.simple" + }, + "dynamiczone": { + "type": "dynamiczone", + "components": ["basic.simple", "blog.test-como", "default.closingperiod"] + }, + "one_way_tag": { + "type": "relation", + "relation": "oneToOne", + "target": "api::tag.tag" + }, + "one_to_one_tag": { + "type": "relation", + "relation": "oneToOne", + "target": "api::tag.tag", + "private": true, + "inversedBy": "one_to_one_kitchensink" + }, + "one_to_many_tags": { + "type": "relation", + "relation": "oneToMany", + "target": "api::tag.tag", + "mappedBy": "many_to_one_kitchensink" + }, + "many_to_one_tag": { + "type": "relation", + "relation": "manyToOne", + "target": "api::tag.tag", + "inversedBy": "one_to_many_kitchensinks" + }, + "many_to_many_tags": { + "type": "relation", + "relation": "manyToMany", + "target": "api::tag.tag", + "inversedBy": "many_to_many_kitchensinks" + }, + "many_way_tags": { + "type": "relation", + "relation": "oneToMany", + "target": "api::tag.tag" + }, + "morph_to_one": { + "type": "relation", + "relation": "morphToOne" + }, + "morph_to_many": { + "type": "relation", + "relation": "morphToMany" + }, + "morph_one": { + "type": "relation", + "relation": "morphOne", + "target": "api::tag.tag", + "morphBy": "taggable" + }, + "custom_field": { + "type": "customField", + "customField": "plugin::color-picker.color" + }, + "custom_field_with_default_options": { + "type": "customField", + "regex": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$", + "customField": "plugin::color-picker.color" + }, + "cats": { + "type": "dynamiczone", + "components": ["basic.relation", "basic.simple"] + }, + "slug": { + "type": "uid", + "targetField": "short_text" + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/kitchensink/controllers/kitchensink.js b/Dockers/strapi/strapi/examples/getstarted/src/api/kitchensink/controllers/kitchensink.js new file mode 100644 index 0000000..b98fd8a --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/kitchensink/controllers/kitchensink.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::kitchensink.kitchensink'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/kitchensink/routes/kitchensink.js b/Dockers/strapi/strapi/examples/getstarted/src/api/kitchensink/routes/kitchensink.js new file mode 100644 index 0000000..d6b4c6d --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/kitchensink/routes/kitchensink.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::kitchensink.kitchensink'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/kitchensink/services/kitchensink.js b/Dockers/strapi/strapi/examples/getstarted/src/api/kitchensink/services/kitchensink.js new file mode 100644 index 0000000..20954fd --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/kitchensink/services/kitchensink.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::kitchensink.kitchensink'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/like/content-types/like/schema.json b/Dockers/strapi/strapi/examples/getstarted/src/api/like/content-types/like/schema.json new file mode 100755 index 0000000..ff08290 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/like/content-types/like/schema.json @@ -0,0 +1,27 @@ +{ + "kind": "collectionType", + "collectionName": "likes", + "info": { + "displayName": "Like", + "singularName": "like", + "pluralName": "likes", + "description": "" + }, + "options": { + "comment": "", + "draftAndPublish": false + }, + "attributes": { + "author": { + "type": "relation", + "relation": "oneToOne", + "target": "plugin::users-permissions.user" + }, + "review": { + "type": "relation", + "relation": "manyToOne", + "target": "api::review.review", + "inversedBy": "likes" + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/like/controllers/like.js b/Dockers/strapi/strapi/examples/getstarted/src/api/like/controllers/like.js new file mode 100644 index 0000000..2e38228 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/like/controllers/like.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::like.like'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/like/routes/like.js b/Dockers/strapi/strapi/examples/getstarted/src/api/like/routes/like.js new file mode 100755 index 0000000..3de1763 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/like/routes/like.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::like.like'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/like/services/like.js b/Dockers/strapi/strapi/examples/getstarted/src/api/like/services/like.js new file mode 100644 index 0000000..be483e3 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/like/services/like.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::like.like'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/menu/content-types/menu/schema.json b/Dockers/strapi/strapi/examples/getstarted/src/api/menu/content-types/menu/schema.json new file mode 100755 index 0000000..f997900 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/menu/content-types/menu/schema.json @@ -0,0 +1,31 @@ +{ + "kind": "collectionType", + "collectionName": "menus", + "info": { + "description": "", + "displayName": "Menu", + "singularName": "menu", + "pluralName": "menus" + }, + "options": { + "comment": "", + "draftAndPublish": false + }, + "attributes": { + "description": { + "type": "text" + }, + "menusections": { + "type": "relation", + "relation": "oneToMany", + "target": "api::menusection.menusection", + "mappedBy": "menu" + }, + "restaurant": { + "type": "relation", + "relation": "oneToOne", + "target": "api::restaurant.restaurant", + "mappedBy": "menu" + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/menu/controllers/menu.js b/Dockers/strapi/strapi/examples/getstarted/src/api/menu/controllers/menu.js new file mode 100644 index 0000000..88eaf69 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/menu/controllers/menu.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::menu.menu'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/menu/routes/menu.js b/Dockers/strapi/strapi/examples/getstarted/src/api/menu/routes/menu.js new file mode 100755 index 0000000..d351181 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/menu/routes/menu.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::menu.menu'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/menu/services/menu.js b/Dockers/strapi/strapi/examples/getstarted/src/api/menu/services/menu.js new file mode 100644 index 0000000..732b9a6 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/menu/services/menu.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::menu.menu'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/menusection/content-types/menusection/schema.json b/Dockers/strapi/strapi/examples/getstarted/src/api/menusection/content-types/menusection/schema.json new file mode 100755 index 0000000..6b38d21 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/menusection/content-types/menusection/schema.json @@ -0,0 +1,33 @@ +{ + "kind": "collectionType", + "collectionName": "menusections", + "info": { + "displayName": "Menu Section", + "singularName": "menusection", + "pluralName": "menusections", + "description": "" + }, + "options": { + "comment": "", + "draftAndPublish": false + }, + "attributes": { + "name": { + "type": "string", + "required": true, + "minLength": 6 + }, + "dishes": { + "component": "default.dish", + "type": "component", + "repeatable": true, + "required": true + }, + "menu": { + "type": "relation", + "relation": "manyToOne", + "target": "api::menu.menu", + "inversedBy": "menusections" + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/menusection/controllers/menusection.js b/Dockers/strapi/strapi/examples/getstarted/src/api/menusection/controllers/menusection.js new file mode 100644 index 0000000..05838ac --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/menusection/controllers/menusection.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::menusection.menusection'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/menusection/routes/menusection.js b/Dockers/strapi/strapi/examples/getstarted/src/api/menusection/routes/menusection.js new file mode 100755 index 0000000..be5fd1f --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/menusection/routes/menusection.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::menusection.menusection'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/menusection/services/menusection.js b/Dockers/strapi/strapi/examples/getstarted/src/api/menusection/services/menusection.js new file mode 100644 index 0000000..2fb1d87 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/menusection/services/menusection.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::menusection.menusection'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/relation-locale/content-types/relation-locale/schema.json b/Dockers/strapi/strapi/examples/getstarted/src/api/relation-locale/content-types/relation-locale/schema.json new file mode 100644 index 0000000..d314810 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/relation-locale/content-types/relation-locale/schema.json @@ -0,0 +1,80 @@ +{ + "kind": "collectionType", + "collectionName": "relation_locales", + "info": { + "singularName": "relation-locale", + "pluralName": "relation-locales", + "displayName": "Relations", + "description": "" + }, + "options": { + "draftAndPublish": true + }, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "attributes": { + "categories": { + "type": "relation", + "relation": "manyToMany", + "target": "api::category.category", + "inversedBy": "relation_locales" + }, + "title": { + "type": "string", + "pluginOptions": { + "i18n": { + "localized": true + } + } + }, + "repeatable_relations": { + "type": "component", + "repeatable": true, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "component": "basic.relation" + }, + "dynamic_relations": { + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "type": "dynamiczone", + "components": ["basic.relation", "basic.simple"] + }, + "single_relation": { + "type": "component", + "repeatable": false, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "component": "basic.relation" + }, + "require_single_relation": { + "type": "component", + "repeatable": false, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "component": "basic.relation", + "required": true + }, + "category": { + "type": "relation", + "relation": "oneToOne", + "target": "api::category.category", + "inversedBy": "relation" + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/relation-locale/controllers/relation-locale.js b/Dockers/strapi/strapi/examples/getstarted/src/api/relation-locale/controllers/relation-locale.js new file mode 100644 index 0000000..f709817 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/relation-locale/controllers/relation-locale.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * relation-locale controller + */ + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::relation-locale.relation-locale'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/relation-locale/routes/relation-locale.js b/Dockers/strapi/strapi/examples/getstarted/src/api/relation-locale/routes/relation-locale.js new file mode 100644 index 0000000..986f307 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/relation-locale/routes/relation-locale.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * relation-locale router + */ + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::relation-locale.relation-locale'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/relation-locale/services/relation-locale.js b/Dockers/strapi/strapi/examples/getstarted/src/api/relation-locale/services/relation-locale.js new file mode 100644 index 0000000..ae8a921 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/relation-locale/services/relation-locale.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * relation-locale service + */ + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::relation-locale.relation-locale'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/restaurant/content-types/restaurant/lifecycles.js b/Dockers/strapi/strapi/examples/getstarted/src/api/restaurant/content-types/restaurant/lifecycles.js new file mode 100755 index 0000000..b8e043a --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/restaurant/content-types/restaurant/lifecycles.js @@ -0,0 +1,38 @@ +'use strict'; + +/** + * Lifecycle callbacks for the `Restaurant` model. + */ + +module.exports = { + beforeCreate(event) { + // console.log('beforeCreate'); + }, + afterCreate(event) { + // console.log('afterCreate'); + }, + beforeUpdate(event) { + // console.log('beforeUpdate'); + }, + afterUpdate(event) { + // console.log('afterUpdate'); + }, + beforeDelete(event) { + // console.log('beforeDelete'); + }, + afterDelete(event) { + // console.log('afterDelete'); + }, + beforeFindMany(event) { + // console.log('beforeFindMany'); + }, + afterFindMany(event) { + // console.log('afterFindMany'); + }, + beforeFindOne(event) { + // console.log('beforeFindOne'); + }, + afterFindOne(event) { + // console.log('afterFindOne'); + }, +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/restaurant/content-types/restaurant/schema.json b/Dockers/strapi/strapi/examples/getstarted/src/api/restaurant/content-types/restaurant/schema.json new file mode 100755 index 0000000..69d0c49 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/restaurant/content-types/restaurant/schema.json @@ -0,0 +1,192 @@ +{ + "kind": "collectionType", + "collectionName": "restaurants", + "info": { + "displayName": "Restaurant", + "singularName": "restaurant", + "pluralName": "restaurants", + "description": "", + "name": "Restaurant" + }, + "options": { + "draftAndPublish": true + }, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "attributes": { + "name": { + "maxLength": 50, + "required": true, + "minLength": 5, + "type": "string", + "pluginOptions": { + "i18n": { + "localized": true + } + } + }, + "slug": { + "type": "uid", + "targetField": "name", + "pluginOptions": {} + }, + "priceRange": { + "enum": ["very_cheap", "cheap", "average", "expensive", "very_expensive"], + "type": "enumeration", + "pluginOptions": { + "i18n": { + "localized": true + } + } + }, + "closingPeriod": { + "component": "default.closingperiod", + "type": "component", + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "repeatable": false, + "required": true + }, + "contactEmail": { + "type": "email", + "pluginOptions": { + "i18n": { + "localized": true + } + } + }, + "stars": { + "required": true, + "type": "integer", + "min": 0, + "max": 3, + "pluginOptions": { + "i18n": { + "localized": true + } + } + }, + "averagePrice": { + "type": "float", + "min": 0, + "max": 35.12, + "pluginOptions": { + "i18n": { + "localized": true + } + } + }, + "address": { + "type": "relation", + "relation": "oneToOne", + "target": "api::address.address" + }, + "cover": { + "type": "media", + "multiple": false, + "required": false, + "pluginOptions": { + "i18n": { + "localized": true + } + } + }, + "timestamp": { + "type": "timestamp" + }, + "images": { + "type": "media", + "multiple": true, + "required": false, + "pluginOptions": { + "i18n": { + "localized": true + } + } + }, + "shortDescription": { + "type": "text", + "pluginOptions": { + "i18n": { + "localized": true + } + } + }, + "since": { + "type": "date", + "pluginOptions": { + "i18n": { + "localized": true + } + } + }, + "categories": { + "type": "relation", + "relation": "oneToMany", + "target": "api::category.category" + }, + "description": { + "type": "richtext", + "required": true, + "minLength": 10, + "pluginOptions": { + "i18n": { + "localized": true + } + } + }, + "services": { + "component": "default.restaurantservice", + "repeatable": true, + "type": "component", + "max": 4, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "min": 2, + "required": true + }, + "menu": { + "type": "relation", + "relation": "oneToOne", + "target": "api::menu.menu", + "inversedBy": "restaurant" + }, + "openingTimes": { + "component": "default.openingtimes", + "type": "component", + "repeatable": true, + "min": 2, + "max": 10, + "pluginOptions": { + "i18n": { + "localized": true + } + } + }, + "dz": { + "type": "dynamiczone", + "components": [ + "default.openingtimes", + "default.restaurantservice", + "default.closingperiod", + "default.dish" + ], + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "required": true, + "min": 3 + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/restaurant/controllers/restaurant.js b/Dockers/strapi/strapi/examples/getstarted/src/api/restaurant/controllers/restaurant.js new file mode 100644 index 0000000..ec87838 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/restaurant/controllers/restaurant.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::restaurant.restaurant'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/restaurant/routes/restaurant.js b/Dockers/strapi/strapi/examples/getstarted/src/api/restaurant/routes/restaurant.js new file mode 100755 index 0000000..db1eeb2 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/restaurant/routes/restaurant.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::restaurant.restaurant'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/restaurant/services/restaurant.js b/Dockers/strapi/strapi/examples/getstarted/src/api/restaurant/services/restaurant.js new file mode 100644 index 0000000..0ed4da4 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/restaurant/services/restaurant.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::restaurant.restaurant'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/review/content-types/review/schema.json b/Dockers/strapi/strapi/examples/getstarted/src/api/review/content-types/review/schema.json new file mode 100755 index 0000000..60c356e --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/review/content-types/review/schema.json @@ -0,0 +1,42 @@ +{ + "kind": "collectionType", + "collectionName": "reviews", + "info": { + "displayName": "Review", + "singularName": "review", + "pluralName": "reviews", + "description": "" + }, + "options": { + "comment": "", + "draftAndPublish": false + }, + "attributes": { + "comment": { + "type": "text", + "required": true + }, + "rating": { + "type": "integer", + "required": true, + "min": 1, + "max": 5 + }, + "likes": { + "type": "relation", + "relation": "oneToMany", + "target": "api::like.like", + "mappedBy": "review" + }, + "author": { + "type": "relation", + "relation": "oneToOne", + "target": "plugin::users-permissions.user" + }, + "restaurant": { + "type": "relation", + "relation": "oneToOne", + "target": "api::restaurant.restaurant" + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/review/controllers/review.js b/Dockers/strapi/strapi/examples/getstarted/src/api/review/controllers/review.js new file mode 100644 index 0000000..429c8e1 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/review/controllers/review.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::review.review'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/review/routes/review.js b/Dockers/strapi/strapi/examples/getstarted/src/api/review/routes/review.js new file mode 100755 index 0000000..52054d3 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/review/routes/review.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::review.review'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/review/services/review.js b/Dockers/strapi/strapi/examples/getstarted/src/api/review/services/review.js new file mode 100644 index 0000000..5422f5f --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/review/services/review.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::review.review'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/tag/content-types/tag/schema.json b/Dockers/strapi/strapi/examples/getstarted/src/api/tag/content-types/tag/schema.json new file mode 100644 index 0000000..ebfb85e --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/tag/content-types/tag/schema.json @@ -0,0 +1,56 @@ +{ + "kind": "collectionType", + "collectionName": "tags", + "info": { + "displayName": "Tag", + "singularName": "tag", + "pluralName": "tags", + "description": "" + }, + "options": { + "draftAndPublish": true + }, + "pluginOptions": {}, + "attributes": { + "name": { + "type": "string" + }, + "many_to_one_kitchensink": { + "type": "relation", + "relation": "manyToOne", + "target": "api::kitchensink.kitchensink", + "inversedBy": "one_to_many_tags" + }, + "one_to_many_kitchensinks": { + "type": "relation", + "relation": "oneToMany", + "target": "api::kitchensink.kitchensink", + "mappedBy": "many_to_one_tag" + }, + "many_to_many_kitchensinks": { + "type": "relation", + "relation": "manyToMany", + "target": "api::kitchensink.kitchensink", + "mappedBy": "many_to_many_tags" + }, + "one_to_one_kitchensink": { + "type": "relation", + "relation": "oneToOne", + "target": "api::kitchensink.kitchensink", + "mappedBy": "one_to_one_tag" + }, + "taggable": { + "type": "relation", + "relation": "morphToOne", + "morphColumn": { + "typeColumn": { + "name": "taggable_type" + }, + "idColumn": { + "name": "taggable_id", + "referencedColumn": "id" + } + } + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/tag/controllers/tag.js b/Dockers/strapi/strapi/examples/getstarted/src/api/tag/controllers/tag.js new file mode 100644 index 0000000..08913dc --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/tag/controllers/tag.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::tag.tag'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/tag/routes/tag.js b/Dockers/strapi/strapi/examples/getstarted/src/api/tag/routes/tag.js new file mode 100644 index 0000000..52be92c --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/tag/routes/tag.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::tag.tag'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/tag/services/tag.js b/Dockers/strapi/strapi/examples/getstarted/src/api/tag/services/tag.js new file mode 100644 index 0000000..e9a36f0 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/tag/services/tag.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::tag.tag'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/temp/content-types/temp/schema.json b/Dockers/strapi/strapi/examples/getstarted/src/api/temp/content-types/temp/schema.json new file mode 100644 index 0000000..a5959df --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/temp/content-types/temp/schema.json @@ -0,0 +1,32 @@ +{ + "kind": "collectionType", + "collectionName": "temps", + "info": { + "singularName": "temp", + "pluralName": "temps", + "displayName": "temp", + "name": "temp", + "description": "" + }, + "options": { + "draftAndPublish": false + }, + "pluginOptions": {}, + "attributes": { + "name": { + "type": "string", + "pluginOptions": {} + }, + "category": { + "type": "relation", + "relation": "oneToOne", + "target": "api::category.category" + }, + "categories": { + "type": "relation", + "relation": "manyToMany", + "target": "api::category.category", + "inversedBy": "temps" + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/temp/controllers/temp.js b/Dockers/strapi/strapi/examples/getstarted/src/api/temp/controllers/temp.js new file mode 100644 index 0000000..52a544b --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/temp/controllers/temp.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::temp.temp'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/temp/routes/temp.js b/Dockers/strapi/strapi/examples/getstarted/src/api/temp/routes/temp.js new file mode 100644 index 0000000..6af6ec8 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/temp/routes/temp.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::temp.temp'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/api/temp/services/temp.js b/Dockers/strapi/strapi/examples/getstarted/src/api/temp/services/temp.js new file mode 100644 index 0000000..082866a --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/api/temp/services/temp.js @@ -0,0 +1,5 @@ +'use strict'; + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::temp.temp'); diff --git a/Dockers/strapi/strapi/examples/getstarted/src/components/basic/relation.json b/Dockers/strapi/strapi/examples/getstarted/src/components/basic/relation.json new file mode 100644 index 0000000..422c4fd --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/components/basic/relation.json @@ -0,0 +1,14 @@ +{ + "collectionName": "components_basic_relations", + "info": { + "displayName": "Relation" + }, + "options": {}, + "attributes": { + "categories": { + "type": "relation", + "relation": "oneToMany", + "target": "api::category.category" + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/components/basic/simple.json b/Dockers/strapi/strapi/examples/getstarted/src/components/basic/simple.json new file mode 100644 index 0000000..d8f4c8b --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/components/basic/simple.json @@ -0,0 +1,18 @@ +{ + "collectionName": "components_basic_simples", + "info": { + "displayName": "simple", + "icon": "ambulance", + "description": "" + }, + "options": {}, + "attributes": { + "name": { + "type": "string", + "required": true + }, + "test": { + "type": "string" + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/components/blog/test-como.json b/Dockers/strapi/strapi/examples/getstarted/src/components/blog/test-como.json new file mode 100644 index 0000000..8d48e88 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/components/blog/test-como.json @@ -0,0 +1,15 @@ +{ + "collectionName": "components_blog_test_comos", + "info": { + "displayName": "test comp", + "icon": "air-freshener", + "description": "" + }, + "options": {}, + "attributes": { + "name": { + "type": "string", + "default": "toto" + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/components/default/apple.json b/Dockers/strapi/strapi/examples/getstarted/src/components/default/apple.json new file mode 100644 index 0000000..9c177c7 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/components/default/apple.json @@ -0,0 +1,15 @@ +{ + "collectionName": "components_default_apples", + "info": { + "displayName": "apple", + "icon": "apple-alt", + "description": "" + }, + "options": {}, + "attributes": { + "name": { + "type": "string", + "required": true + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/components/default/car.json b/Dockers/strapi/strapi/examples/getstarted/src/components/default/car.json new file mode 100644 index 0000000..7b01917 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/components/default/car.json @@ -0,0 +1,13 @@ +{ + "collectionName": "components_default_cars", + "info": { + "displayName": "car", + "icon": "align-right" + }, + "options": {}, + "attributes": { + "name": { + "type": "string" + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/components/default/closingperiod.json b/Dockers/strapi/strapi/examples/getstarted/src/components/default/closingperiod.json new file mode 100644 index 0000000..d24b562 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/components/default/closingperiod.json @@ -0,0 +1,34 @@ +{ + "collectionName": "components_closingperiods", + "info": { + "displayName": "closingperiod", + "description": "", + "icon": "angry" + }, + "attributes": { + "label": { + "type": "string", + "default": "toto" + }, + "start_date": { + "type": "date", + "required": true + }, + "end_date": { + "type": "date", + "required": true + }, + "media": { + "type": "media", + "multiple": false, + "required": false + }, + "dish": { + "component": "default.dish", + "type": "component", + "repeatable": true, + "required": true, + "min": 2 + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/components/default/dish.json b/Dockers/strapi/strapi/examples/getstarted/src/components/default/dish.json new file mode 100644 index 0000000..b0afbb0 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/components/default/dish.json @@ -0,0 +1,33 @@ +{ + "collectionName": "components_dishes", + "info": { + "displayName": "dish", + "description": "", + "icon": "address-book" + }, + "attributes": { + "name": { + "type": "string", + "required": false, + "default": "My super dish" + }, + "description": { + "type": "text" + }, + "price": { + "type": "float" + }, + "picture": { + "type": "media", + "required": false + }, + "very_long_description": { + "type": "richtext" + }, + "categories": { + "type": "relation", + "relation": "oneToOne", + "target": "api::category.category" + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/components/default/openingtimes.json b/Dockers/strapi/strapi/examples/getstarted/src/components/default/openingtimes.json new file mode 100644 index 0000000..eda99be --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/components/default/openingtimes.json @@ -0,0 +1,19 @@ +{ + "collectionName": "components_openingtimes", + "info": { + "displayName": "openingtimes", + "description": "", + "icon": "calendar" + }, + "attributes": { + "label": { + "type": "string", + "required": true, + "default": "something" + }, + "time": { + "type": "string" + }, + "dishrep": { "type": "component", "repeatable": true, "component": "default.dish" } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/components/default/restaurantservice.json b/Dockers/strapi/strapi/examples/getstarted/src/components/default/restaurantservice.json new file mode 100644 index 0000000..8c79e16 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/components/default/restaurantservice.json @@ -0,0 +1,23 @@ +{ + "collectionName": "components_restaurantservices", + "info": { + "displayName": "restaurantservice", + "description": "", + "icon": "cannabis" + }, + "attributes": { + "name": { + "type": "string", + "required": true, + "default": "something" + }, + "media": { + "type": "media" + }, + "is_available": { + "type": "boolean", + "required": true, + "default": true + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/components/default/temp.json b/Dockers/strapi/strapi/examples/getstarted/src/components/default/temp.json new file mode 100644 index 0000000..6fcb76c --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/components/default/temp.json @@ -0,0 +1,18 @@ +{ + "collectionName": "components_default_temps", + "info": { + "displayName": "temp", + "icon": "adjust", + "description": "" + }, + "options": {}, + "attributes": { + "name": { + "type": "string", + "required": true + }, + "url": { + "type": "string" + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/custom/middleware.js b/Dockers/strapi/strapi/examples/getstarted/src/custom/middleware.js new file mode 100644 index 0000000..4ed190d --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/custom/middleware.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = () => { + return (ctx, next) => next(); +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/extensions/myplugin/content-types/test/schema.json b/Dockers/strapi/strapi/examples/getstarted/src/extensions/myplugin/content-types/test/schema.json new file mode 100644 index 0000000..0cfd516 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/extensions/myplugin/content-types/test/schema.json @@ -0,0 +1,27 @@ +{ + "kind": "collectionType", + "info": { + "displayName": "Test", + "singularName": "test", + "pluralName": "tests", + "description": "" + }, + "options": {}, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "attributes": { + "type": { + "type": "string", + "required": true, + "unique": true, + "pluginOptions": { + "i18n": { + "localized": true + } + } + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/extensions/users-permissions/content-types/user/schema.json b/Dockers/strapi/strapi/examples/getstarted/src/extensions/users-permissions/content-types/user/schema.json new file mode 100644 index 0000000..f7c431d --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/extensions/users-permissions/content-types/user/schema.json @@ -0,0 +1,72 @@ +{ + "collectionName": "up_users", + "info": { + "name": "User", + "description": "", + "singularName": "user", + "pluralName": "users", + "displayName": "User" + }, + "options": {}, + "attributes": { + "username": { + "type": "string", + "minLength": 3, + "unique": true, + "configurable": false, + "required": true + }, + "email": { + "type": "email", + "minLength": 6, + "configurable": false, + "required": true + }, + "provider": { + "type": "string", + "configurable": false + }, + "password": { + "type": "password", + "minLength": 6, + "maxLength": 72, + "configurable": false, + "private": true, + "searchable": false + }, + "resetPasswordToken": { + "type": "string", + "configurable": false, + "private": true, + "searchable": false + }, + "confirmationToken": { + "type": "string", + "configurable": false, + "private": true, + "searchable": false + }, + "confirmed": { + "type": "boolean", + "default": false, + "configurable": false + }, + "blocked": { + "type": "boolean", + "default": false, + "configurable": false + }, + "role": { + "type": "relation", + "relation": "manyToOne", + "target": "plugin::users-permissions.role", + "inversedBy": "users", + "configurable": false + }, + "picture": { + "type": "media", + "multiple": false, + "required": false + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/extensions/users-permissions/strapi-server.js b/Dockers/strapi/strapi/examples/getstarted/src/extensions/users-permissions/strapi-server.js new file mode 100644 index 0000000..9ad0863 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/extensions/users-permissions/strapi-server.js @@ -0,0 +1,3 @@ +module.exports = (plugin) => { + return plugin; +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/index.js b/Dockers/strapi/strapi/examples/getstarted/src/index.js new file mode 100644 index 0000000..a1dd6da --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/index.js @@ -0,0 +1,28 @@ +'use strict'; + +module.exports = { + /** + * An asynchronous register function that runs before + * your application is initialized. + * + * This gives you an opportunity to extend code. + */ + register({ strapi }) {}, + + /** + * An asynchronous bootstrap function that runs before + * your application gets started. + * + * This gives you an opportunity to set up your data model, + * run jobs, or perform some special logic. + */ + async bootstrap({ strapi }) {}, + + /** + * An asynchronous destroy function that runs before + * your application gets shut down. + * + * This gives you an opportunity to gracefully stop services you run. + */ + destroy({ strapi }) {}, +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/middlewares/test-middleware.js b/Dockers/strapi/strapi/examples/getstarted/src/middlewares/test-middleware.js new file mode 100644 index 0000000..cbce6f8 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/middlewares/test-middleware.js @@ -0,0 +1,15 @@ +'use strict'; + +/** + * `test-middleware` middleware + */ + +module.exports = (config, { strapi }) => { + // This middleware is called on every request + // Add your own logic here. + return async (ctx, next) => { + // strapi.log.info('In application test-middleware middleware.'); + + await next(); + }; +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/index.js b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/index.js new file mode 100644 index 0000000..fe50526 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/index.js @@ -0,0 +1,90 @@ +import { PuzzlePiece } from '@strapi/icons'; + +import { prefixPluginTranslations } from './utils/prefixPluginTranslations'; +import pluginPkg from '../../package.json'; +import pluginId from './pluginId'; + +const name = pluginPkg.strapi.name; + +export default { + register(app) { + app.addMenuLink({ + to: `plugins/${pluginId}`, + icon: PuzzlePiece, + intlLabel: { + id: `${pluginId}.plugin.name`, + defaultMessage: 'My plugin', + }, + Component: () => import('./pages/App'), + permissions: [], + }); + + app.registerPlugin({ + id: pluginId, + name, + }); + + const allTypes = [ + 'biginteger', + 'boolean', + 'date', + 'datetime', + 'decimal', + 'email', + 'enumeration', + 'float', + 'integer', + 'json', + 'password', + 'richtext', + 'string', + 'text', + 'time', + 'uid', + ]; + + allTypes.forEach((type) => { + const upcasedType = type.charAt(0).toUpperCase() + type.slice(1); + const customField = { + type, + pluginId: 'myplugin', + name: `custom${upcasedType}`, + intlLabel: { + id: 'customfieldtest', + defaultMessage: `custom${upcasedType}`, + }, + intlDescription: { + id: 'customfieldtest', + defaultMessage: `custom${upcasedType}`, + }, + components: { + Input: PuzzlePiece, + }, + }; + + app.customFields.register(customField); + }); + }, + bootstrap() {}, + async registerTrads({ locales }) { + const importedTrads = await Promise.all( + locales.map((locale) => { + return import(`./translations/${locale}.json`) + .then(({ default: data }) => { + return { + data: prefixPluginTranslations(data, pluginId), + locale, + }; + }) + .catch(() => { + return { + data: {}, + locale, + }; + }); + }) + ); + + return Promise.resolve(importedTrads); + }, +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/pages/App/index.jsx b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/pages/App/index.jsx new file mode 100644 index 0000000..ebd50fc --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/pages/App/index.jsx @@ -0,0 +1,9 @@ +import React from 'react'; +import { FormattedMessage } from 'react-intl'; +import getTrad from '../../utils/getTrad'; + +const App = () => { + return ; +}; + +export default App; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/pluginId.js b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/pluginId.js new file mode 100644 index 0000000..f5ad7de --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/pluginId.js @@ -0,0 +1,5 @@ +import pluginPkg from '../../package.json'; + +const pluginId = pluginPkg.name.replace(/^strapi-plugin-/i, ''); + +export default pluginId; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/translations/en.json b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/translations/en.json new file mode 100644 index 0000000..5a983e4 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/translations/en.json @@ -0,0 +1,3 @@ +{ + "plugin.name": "My plugin" +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/translations/es.json b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/translations/es.json new file mode 100644 index 0000000..5743afb --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/translations/es.json @@ -0,0 +1,3 @@ +{ + "plugin.name": "Mi plugin" +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/translations/ru.json b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/translations/ru.json new file mode 100644 index 0000000..6cae4ea --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/translations/ru.json @@ -0,0 +1,3 @@ +{ + "plugin.name": "Мой плагин" +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/translations/tr.json b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/translations/tr.json new file mode 100644 index 0000000..d441ffb --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/translations/tr.json @@ -0,0 +1,3 @@ +{ + "plugin.name": "Benim eklentim" +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/translations/uk.json b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/translations/uk.json new file mode 100644 index 0000000..1149e83 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/translations/uk.json @@ -0,0 +1,3 @@ +{ + "plugin.name": "Мій плаґін" +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/utils/getTrad.js b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/utils/getTrad.js new file mode 100644 index 0000000..d0a071b --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/utils/getTrad.js @@ -0,0 +1,5 @@ +import pluginId from '../pluginId'; + +const getTrad = (id) => `${pluginId}.${id}`; + +export default getTrad; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/utils/prefixPluginTranslations.js b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/utils/prefixPluginTranslations.js new file mode 100644 index 0000000..b7b93b2 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/admin/src/utils/prefixPluginTranslations.js @@ -0,0 +1,11 @@ +const prefixPluginTranslations = (trad, pluginId) => { + if (!pluginId) { + throw new TypeError("pluginId can't be empty"); + } + return Object.keys(trad).reduce((acc, current) => { + acc[`${pluginId}.${current}`] = trad[current]; + return acc; + }, {}); +}; + +export { prefixPluginTranslations }; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/package.json b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/package.json new file mode 100644 index 0000000..cfacf84 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/package.json @@ -0,0 +1,11 @@ +{ + "name": "strapi-plugin-local-plugin", + "version": "0.0.0", + "private": true, + "description": "This is the description of my plugin.", + "strapi": { + "name": "local-plugin", + "description": "This plugin is linked as a local plugin", + "kind": "plugin" + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/config/index.js b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/config/index.js new file mode 100644 index 0000000..d16884e --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/config/index.js @@ -0,0 +1,12 @@ +'use strict'; + +module.exports = { + default: { + testConf: 1, + }, + validator: (config) => { + if (typeof config.testConf !== 'number') { + throw new Error('testConfig has to be a number'); + } + }, +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/content-types/index.js b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/content-types/index.js new file mode 100644 index 0000000..6d7eede --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/content-types/index.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = { + test: require('./test'), +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/content-types/test/index.js b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/content-types/test/index.js new file mode 100644 index 0000000..fd1640d --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/content-types/test/index.js @@ -0,0 +1,7 @@ +'use strict'; + +const schema = require('./schema'); + +module.exports = { + schema, +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/content-types/test/schema.json b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/content-types/test/schema.json new file mode 100644 index 0000000..80c8326 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/content-types/test/schema.json @@ -0,0 +1,27 @@ +{ + "info": { + "displayName": "Test", + "singularName": "test", + "pluralName": "tests", + "description": "" + }, + "options": {}, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "attributes": { + "type": { + "type": "string", + "required": true, + "unique": true, + "configurable": true, + "pluginOptions": { + "i18n": { + "localized": true + } + } + } + } +} diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/controllers/index.js b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/controllers/index.js new file mode 100644 index 0000000..6d7eede --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/controllers/index.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = { + test: require('./test'), +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/controllers/test.js b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/controllers/test.js new file mode 100644 index 0000000..1328e25 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/controllers/test.js @@ -0,0 +1,8 @@ +module.exports = { + findOne(ctx) { + ctx.body = {}; + }, + find(ctx) { + ctx.body = []; + }, +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/graphql.js b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/graphql.js new file mode 100644 index 0000000..48e8f2b --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/graphql.js @@ -0,0 +1,9 @@ +'use strict'; + +const crudActionsToDisable = ['create', 'update', 'delete']; + +module.exports = ({ strapi }) => { + const extension = strapi.plugin('graphql').service('extension'); + + extension.shadowCRUD('plugin::myplugin.test').disableActions(crudActionsToDisable); +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/register.js b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/register.js new file mode 100644 index 0000000..2d333ad --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/register.js @@ -0,0 +1,35 @@ +'use strict'; + +module.exports = ({ strapi }) => { + const allTypes = [ + 'biginteger', + 'boolean', + 'date', + 'datetime', + 'decimal', + 'email', + 'enumeration', + 'float', + 'integer', + 'json', + 'password', + 'richtext', + 'string', + 'text', + 'time', + 'uid', + ]; + + allTypes.forEach((type) => { + const upcasedType = type.charAt(0).toUpperCase() + type.slice(1); + strapi.customFields.register({ + type, + name: `custom${upcasedType}`, + plugin: 'myplugin', + }); + }); + + if (strapi.plugin('graphql')) { + require('./graphql')({ strapi }); + } +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/routes.js b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/routes.js new file mode 100644 index 0000000..952f54c --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/server/routes.js @@ -0,0 +1,8 @@ +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = { + test: createCoreRouter('plugin::myplugin.test', { + type: 'content-api', + only: ['find', 'findOne'], + }), +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/strapi-admin.js b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/strapi-admin.js new file mode 100644 index 0000000..a0369f6 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/strapi-admin.js @@ -0,0 +1,3 @@ +import admin from './admin/src'; + +export default admin; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/strapi-server.js b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/strapi-server.js new file mode 100644 index 0000000..599615d --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/plugins/local-plugin/strapi-server.js @@ -0,0 +1,17 @@ +'use strict'; + +const config = require('./server/config'); +const contentTypes = require('./server/content-types'); +const controllers = require('./server/controllers'); +const register = require('./server/register'); +const routes = require('./server/routes'); + +module.exports = () => { + return { + register, + config, + controllers, + contentTypes, + routes, + }; +}; diff --git a/Dockers/strapi/strapi/examples/getstarted/src/policies/test-policy.js b/Dockers/strapi/strapi/examples/getstarted/src/policies/test-policy.js new file mode 100644 index 0000000..43c77d8 --- /dev/null +++ b/Dockers/strapi/strapi/examples/getstarted/src/policies/test-policy.js @@ -0,0 +1,18 @@ +'use strict'; + +/** + * `test-policy` policy + */ + +module.exports = (policyCtx, config, { strapi }) => { + // Add your own logic here. + strapi.log.info('In test-policy policy.'); + + const canDoSomething = true; + + if (canDoSomething) { + return true; + } + + return false; +}; diff --git a/Dockers/strapi/strapi/examples/kitchensink-ts/.gitignore b/Dockers/strapi/strapi/examples/kitchensink-ts/.gitignore new file mode 100644 index 0000000..7923dda --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink-ts/.gitignore @@ -0,0 +1,116 @@ +############################ +# OS X +############################ + +.DS_Store +.AppleDouble +.LSOverride +Icon +.Spotlight-V100 +.Trashes +._* + + +############################ +# Linux +############################ + +*~ + + +############################ +# Windows +############################ + +Thumbs.db +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ +*.cab +*.msi +*.msm +*.msp + + +############################ +# Packages +############################ + +*.7z +*.csv +*.dat +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip +*.com +*.class +*.dll +*.exe +*.o +*.seed +*.so +*.swo +*.swp +*.swn +*.swm +*.out +*.pid + + +############################ +# Logs and databases +############################ + +.tmp +*.log +*.sql +*.sqlite +*.sqlite3 + + +############################ +# Misc. +############################ + +*# +ssl +.idea +nbproject +public/uploads/* +!public/uploads/.gitkeep + +############################ +# Node.js +############################ + +lib-cov +lcov.info +pids +logs +results +node_modules +.node_history + +############################ +# Tests +############################ + +coverage + +############################ +# Strapi +############################ + +.env +license.txt +exports +*.cache +dist +build +.strapi-updater.json +types/generated +.strapi \ No newline at end of file diff --git a/Dockers/strapi/strapi/examples/kitchensink-ts/README.md b/Dockers/strapi/strapi/examples/kitchensink-ts/README.md new file mode 100644 index 0000000..8616543 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink-ts/README.md @@ -0,0 +1,57 @@ +# 🚀 Getting started with Strapi + +Strapi comes with a full featured [Command Line Interface](https://docs.strapi.io/developer-docs/latest/developer-resources/cli/CLI.html) (CLI) which lets you scaffold and manage your project in seconds. + +### `develop` + +Start your Strapi application with autoReload enabled. [Learn more](https://docs.strapi.io/developer-docs/latest/developer-resources/cli/CLI.html#strapi-develop) + +``` +npm run develop +# or +yarn develop +``` + +### `start` + +Start your Strapi application with autoReload disabled. [Learn more](https://docs.strapi.io/developer-docs/latest/developer-resources/cli/CLI.html#strapi-start) + +``` +npm run start +# or +yarn start +``` + +### `build` + +Build your admin panel. [Learn more](https://docs.strapi.io/developer-docs/latest/developer-resources/cli/CLI.html#strapi-build) + +``` +npm run build +# or +yarn build +``` + +## ⚙️ Deployment + +Strapi gives you many possible deployment options for your project. Find the one that suits you on the [deployment section of the documentation](https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/deployment.html). + +## 📚 Learn more + +- [Resource center](https://strapi.io/resource-center) - Strapi resource center. +- [Strapi documentation](https://docs.strapi.io) - Official Strapi documentation. +- [Strapi tutorials](https://strapi.io/tutorials) - List of tutorials made by the core team and the community. +- [Strapi blog](https://docs.strapi.io) - Official Strapi blog containing articles made by the Strapi team and the community. +- [Changelog](https://strapi.io/changelog) - Find out about the Strapi product updates, new features and general improvements. + +Feel free to check out the [Strapi GitHub repository](https://github.com/strapi/strapi). Your feedback and contributions are welcome! + +## ✨ Community + +- [Discord](https://discord.strapi.io) - Come chat with the Strapi community including the core team. +- [Forum](https://forum.strapi.io/) - Place to discuss, ask questions and find answers, show your Strapi project and get feedback or just talk with other Community members. +- [Awesome Strapi](https://github.com/strapi/awesome-strapi) - A curated list of awesome things related to Strapi. + +--- + +🤫 Psst! [Strapi is hiring](https://strapi.io/careers). diff --git a/Dockers/strapi/strapi/examples/kitchensink-ts/config/admin.ts b/Dockers/strapi/strapi/examples/kitchensink-ts/config/admin.ts new file mode 100644 index 0000000..e0f87f9 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink-ts/config/admin.ts @@ -0,0 +1,19 @@ +const adminConfig = ({ env }) => ({ + auth: { + secret: env('ADMIN_JWT_SECRET', 'example-token'), + }, + apiToken: { + salt: env('API_TOKEN_SALT', 'example-salt'), + }, + transfer: { + token: { + salt: env('TRANSFER_TOKEN_SALT', 'example-salt'), + }, + }, + flags: { + nps: env.bool('FLAG_NPS', true), + promoteEE: env.bool('FLAG_PROMOTE_EE', true), + }, +}); + +export default adminConfig; diff --git a/Dockers/strapi/strapi/examples/kitchensink-ts/config/api.ts b/Dockers/strapi/strapi/examples/kitchensink-ts/config/api.ts new file mode 100644 index 0000000..37f7c14 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink-ts/config/api.ts @@ -0,0 +1,7 @@ +export default { + rest: { + defaultLimit: 25, + maxLimit: 100, + withCount: true, + }, +}; diff --git a/Dockers/strapi/strapi/examples/kitchensink-ts/config/database.ts b/Dockers/strapi/strapi/examples/kitchensink-ts/config/database.ts new file mode 100644 index 0000000..a239a7f --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink-ts/config/database.ts @@ -0,0 +1,11 @@ +import path from 'path'; + +export default ({ env }) => ({ + connection: { + client: 'sqlite', + connection: { + filename: path.join(__dirname, '..', '..', env('DATABASE_FILENAME', '.tmp/data.db')), + }, + useNullAsDefault: true, + }, +}); diff --git a/Dockers/strapi/strapi/examples/kitchensink-ts/config/middlewares.ts b/Dockers/strapi/strapi/examples/kitchensink-ts/config/middlewares.ts new file mode 100644 index 0000000..829f5c0 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink-ts/config/middlewares.ts @@ -0,0 +1,12 @@ +export default [ + 'strapi::logger', + 'strapi::errors', + 'strapi::security', + 'strapi::cors', + 'strapi::poweredBy', + 'strapi::query', + 'strapi::body', + 'strapi::session', + 'strapi::favicon', + 'strapi::public', +]; diff --git a/Dockers/strapi/strapi/examples/kitchensink-ts/config/server.ts b/Dockers/strapi/strapi/examples/kitchensink-ts/config/server.ts new file mode 100644 index 0000000..a4cc8af --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink-ts/config/server.ts @@ -0,0 +1,9 @@ +const serverConfig = ({ env }) => ({ + host: env('HOST', '0.0.0.0'), + port: env.int('PORT', 1337), + app: { + keys: env.array('APP_KEYS', ['toBeModified1', 'toBeModified2']), + }, +}); + +export default serverConfig; diff --git a/Dockers/strapi/strapi/examples/kitchensink-ts/favicon.png b/Dockers/strapi/strapi/examples/kitchensink-ts/favicon.png new file mode 100644 index 0000000..df668a8 Binary files /dev/null and b/Dockers/strapi/strapi/examples/kitchensink-ts/favicon.png differ diff --git a/Dockers/strapi/strapi/examples/kitchensink-ts/package.json b/Dockers/strapi/strapi/examples/kitchensink-ts/package.json new file mode 100644 index 0000000..47dd6b9 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink-ts/package.json @@ -0,0 +1,32 @@ +{ + "name": "kitchensink-ts", + "version": "0.0.0", + "private": true, + "description": "A Strapi application", + "license": "MIT", + "author": { + "name": "A Strapi developer" + }, + "scripts": { + "build": "strapi build", + "develop": "strapi develop", + "start": "strapi start", + "strapi": "strapi" + }, + "dependencies": { + "@strapi/plugin-users-permissions": "workspace:*", + "@strapi/strapi": "workspace:*", + "better-sqlite3": "11.3.0", + "react": "18.3.1", + "react-dom": "18.3.1", + "react-router-dom": "6.22.3", + "styled-components": "6.1.8" + }, + "engines": { + "node": ">=18.0.0 <=22.x.x", + "npm": ">=6.0.0" + }, + "strapi": { + "uuid": "getstarted" + } +} diff --git a/Dockers/strapi/strapi/examples/kitchensink-ts/public/robots.txt b/Dockers/strapi/strapi/examples/kitchensink-ts/public/robots.txt new file mode 100644 index 0000000..ff5d316 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink-ts/public/robots.txt @@ -0,0 +1,3 @@ +# To prevent search engines from seeing the site altogether, uncomment the next two lines: +# User-Agent: * +# Disallow: / diff --git a/Dockers/strapi/strapi/examples/kitchensink-ts/public/uploads/.gitkeep b/Dockers/strapi/strapi/examples/kitchensink-ts/public/uploads/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Dockers/strapi/strapi/src/admin/app.example.tsx b/Dockers/strapi/strapi/examples/kitchensink-ts/src/admin/app.example.tsx similarity index 100% rename from Dockers/strapi/strapi/src/admin/app.example.tsx rename to Dockers/strapi/strapi/examples/kitchensink-ts/src/admin/app.example.tsx diff --git a/Dockers/strapi/strapi/examples/kitchensink-ts/src/admin/tsconfig.json b/Dockers/strapi/strapi/examples/kitchensink-ts/src/admin/tsconfig.json new file mode 100644 index 0000000..083046e --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink-ts/src/admin/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Bundler", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": ["../plugins/**/admin/src/**/*", "./"], + "exclude": ["node_modules/", "build/", "dist/", "**/*.test.ts"] +} diff --git a/Dockers/strapi/strapi/examples/kitchensink-ts/src/admin/webpack.config.example.ts b/Dockers/strapi/strapi/examples/kitchensink-ts/src/admin/webpack.config.example.ts new file mode 100644 index 0000000..b3ef42f --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink-ts/src/admin/webpack.config.example.ts @@ -0,0 +1,6 @@ +export default (config, webpack) => { + // Note: we provide webpack above so you should not `require` it + // Perform customizations to webpack config + // Important: return the modified config + return config; +}; diff --git a/Dockers/strapi/strapi/examples/kitchensink-ts/src/api/.gitkeep b/Dockers/strapi/strapi/examples/kitchensink-ts/src/api/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Dockers/strapi/strapi/examples/kitchensink-ts/src/extensions/.gitkeep b/Dockers/strapi/strapi/examples/kitchensink-ts/src/extensions/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Dockers/strapi/strapi/examples/kitchensink-ts/src/index.ts b/Dockers/strapi/strapi/examples/kitchensink-ts/src/index.ts new file mode 100644 index 0000000..99f3cad --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink-ts/src/index.ts @@ -0,0 +1,20 @@ +import '@strapi/strapi'; + +export default { + /** + * An asynchronous register function that runs before + * your application is initialized. + * + * This gives you an opportunity to extend code. + */ + register(/*{ strapi }*/) {}, + + /** + * An asynchronous bootstrap function that runs before + * your application gets started. + * + * This gives you an opportunity to set up your data model, + * run jobs, or perform some special logic. + */ + bootstrap(/*{ strapi }*/) {}, +}; diff --git a/Dockers/strapi/strapi/examples/kitchensink-ts/tsconfig.json b/Dockers/strapi/strapi/examples/kitchensink-ts/tsconfig.json new file mode 100644 index 0000000..96c75aa --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink-ts/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "outDir": "dist", + "rootDir": ".", + "module": "CommonJS", + "moduleResolution": "Node", + "lib": ["ES2020"], + "target": "ES2019", + + "strict": false, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + + "incremental": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "noEmitOnError": true, + "noImplicitThis": true + }, + "include": ["./", "src/**/*.json"], + "exclude": [ + "node_modules/", + "build/", + "dist/", + ".cache/", + ".tmp/", + "src/admin/", + "**/*.test.ts", + "src/plugins/**" + ] +} diff --git a/Dockers/strapi/strapi/examples/kitchensink/.env.example b/Dockers/strapi/strapi/examples/kitchensink/.env.example new file mode 100644 index 0000000..b667b6c --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/.env.example @@ -0,0 +1,2 @@ +HOST=0.0.0.0 +PORT=1337 diff --git a/Dockers/strapi/strapi/examples/kitchensink/.eslintignore b/Dockers/strapi/strapi/examples/kitchensink/.eslintignore new file mode 100644 index 0000000..90759a5 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/.eslintignore @@ -0,0 +1,3 @@ +.cache +build +**/node_modules/** diff --git a/Dockers/strapi/strapi/examples/kitchensink/.eslintrc b/Dockers/strapi/strapi/examples/kitchensink/.eslintrc new file mode 100644 index 0000000..3f1f234 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/.eslintrc @@ -0,0 +1,27 @@ +{ + "parser": "@babel/eslint-parser", + "extends": "eslint:recommended", + "env": { + "commonjs": true, + "es6": true, + "node": true, + "browser": false + }, + "parserOptions": { + "ecmaFeatures": { + "experimentalObjectRestSpread": true, + "jsx": false + }, + "sourceType": "module" + }, + "globals": { + "strapi": true + }, + "rules": { + "indent": ["error", 2, { "SwitchCase": 1 }], + "linebreak-style": ["error", "unix"], + "no-console": 0, + "quotes": ["error", "single"], + "semi": ["error", "always"] + } +} diff --git a/Dockers/strapi/strapi/examples/kitchensink/.gitignore b/Dockers/strapi/strapi/examples/kitchensink/.gitignore new file mode 100644 index 0000000..7923dda --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/.gitignore @@ -0,0 +1,116 @@ +############################ +# OS X +############################ + +.DS_Store +.AppleDouble +.LSOverride +Icon +.Spotlight-V100 +.Trashes +._* + + +############################ +# Linux +############################ + +*~ + + +############################ +# Windows +############################ + +Thumbs.db +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ +*.cab +*.msi +*.msm +*.msp + + +############################ +# Packages +############################ + +*.7z +*.csv +*.dat +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip +*.com +*.class +*.dll +*.exe +*.o +*.seed +*.so +*.swo +*.swp +*.swn +*.swm +*.out +*.pid + + +############################ +# Logs and databases +############################ + +.tmp +*.log +*.sql +*.sqlite +*.sqlite3 + + +############################ +# Misc. +############################ + +*# +ssl +.idea +nbproject +public/uploads/* +!public/uploads/.gitkeep + +############################ +# Node.js +############################ + +lib-cov +lcov.info +pids +logs +results +node_modules +.node_history + +############################ +# Tests +############################ + +coverage + +############################ +# Strapi +############################ + +.env +license.txt +exports +*.cache +dist +build +.strapi-updater.json +types/generated +.strapi \ No newline at end of file diff --git a/Dockers/strapi/strapi/examples/kitchensink/README.md b/Dockers/strapi/strapi/examples/kitchensink/README.md new file mode 100644 index 0000000..4d901a0 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/README.md @@ -0,0 +1,3 @@ +# Strapi application + +A quick description of your strapi application diff --git a/Dockers/strapi/strapi/examples/kitchensink/config/admin.js b/Dockers/strapi/strapi/examples/kitchensink/config/admin.js new file mode 100644 index 0000000..59f35b0 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/config/admin.js @@ -0,0 +1,18 @@ +module.exports = ({ env }) => ({ + // autoOpen: false, + auth: { + secret: env('ADMIN_JWT_SECRET', 'example-token'), + }, + apiToken: { + salt: env('API_TOKEN_SALT', 'example-salt'), + }, + transfer: { + token: { + salt: env('TRANSFER_TOKEN_SALT', 'example-salt'), + }, + }, + flags: { + nps: env.bool('FLAG_NPS', true), + promoteEE: env.bool('FLAG_PROMOTE_EE', true), + }, +}); diff --git a/Dockers/strapi/strapi/examples/kitchensink/config/api.js b/Dockers/strapi/strapi/examples/kitchensink/config/api.js new file mode 100644 index 0000000..62f8b65 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/config/api.js @@ -0,0 +1,7 @@ +module.exports = { + rest: { + defaultLimit: 25, + maxLimit: 100, + withCount: true, + }, +}; diff --git a/Dockers/strapi/strapi/examples/kitchensink/config/database.js b/Dockers/strapi/strapi/examples/kitchensink/config/database.js new file mode 100644 index 0000000..ac20ae7 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/config/database.js @@ -0,0 +1,11 @@ +const path = require('path'); + +module.exports = ({ env }) => ({ + connection: { + client: 'sqlite', + connection: { + filename: path.join(__dirname, '..', env('DATABASE_FILENAME', '.tmp/data.db')), + }, + useNullAsDefault: true, + }, +}); diff --git a/Dockers/strapi/strapi/examples/kitchensink/config/functions/bootstrap.js b/Dockers/strapi/strapi/examples/kitchensink/config/functions/bootstrap.js new file mode 100644 index 0000000..3e3b9c9 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/config/functions/bootstrap.js @@ -0,0 +1,13 @@ +'use strict'; + +/** + * An asynchronous bootstrap function that runs before + * your application gets started. + * + * This gives you an opportunity to set up your data model, + * run jobs, or perform some special logic. + * + * See more details here: https://strapi.io/documentation/developer-docs/latest/setup-deployment-guides/configurations.html#bootstrap + */ + +module.exports = () => {}; diff --git a/Dockers/strapi/strapi/examples/kitchensink/config/functions/cron.js b/Dockers/strapi/strapi/examples/kitchensink/config/functions/cron.js new file mode 100644 index 0000000..fe26854 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/config/functions/cron.js @@ -0,0 +1,21 @@ +'use strict'; + +/** + * Cron config that gives you an opportunity + * to run scheduled jobs. + * + * The cron format consists of: + * [SECOND (optional)] [MINUTE] [HOUR] [DAY OF MONTH] [MONTH OF YEAR] [DAY OF WEEK] + * + * See more details here: https://strapi.io/documentation/developer-docs/latest/setup-deployment-guides/configurations.html#cron-tasks + */ + +module.exports = { + /** + * Simple example. + * Every monday at 1am. + */ + // '0 1 * * 1': () => { + // + // } +}; diff --git a/Dockers/strapi/strapi/examples/kitchensink/config/functions/responses/404.js b/Dockers/strapi/strapi/examples/kitchensink/config/functions/responses/404.js new file mode 100644 index 0000000..bcbfb07 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/config/functions/responses/404.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = async (/* ctx */) => { + // return ctx.notFound('My custom message 404'); +}; diff --git a/Dockers/strapi/strapi/examples/kitchensink/config/plugins.js b/Dockers/strapi/strapi/examples/kitchensink/config/plugins.js new file mode 100644 index 0000000..9e4e4c0 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/config/plugins.js @@ -0,0 +1,4 @@ +module.exports = { + // ... + // ... +}; diff --git a/Dockers/strapi/strapi/examples/kitchensink/config/server.js b/Dockers/strapi/strapi/examples/kitchensink/config/server.js new file mode 100644 index 0000000..5bbd548 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/config/server.js @@ -0,0 +1,7 @@ +module.exports = ({ env }) => ({ + host: env('HOST', '0.0.0.0'), + port: env.int('PORT', 1337), + app: { + keys: env.array('APP_KEYS', ['toBeModified1', 'toBeModified2']), + }, +}); diff --git a/Dockers/strapi/strapi/examples/kitchensink/favicon.png b/Dockers/strapi/strapi/examples/kitchensink/favicon.png new file mode 100644 index 0000000..df668a8 Binary files /dev/null and b/Dockers/strapi/strapi/examples/kitchensink/favicon.png differ diff --git a/Dockers/strapi/strapi/examples/kitchensink/jsconfig.json b/Dockers/strapi/strapi/examples/kitchensink/jsconfig.json new file mode 100644 index 0000000..08ac60b --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/jsconfig.json @@ -0,0 +1,5 @@ +{ + "compilerOptions": { + "checkJs": true + } +} diff --git a/Dockers/strapi/strapi/examples/kitchensink/package.json b/Dockers/strapi/strapi/examples/kitchensink/package.json new file mode 100644 index 0000000..fdc36be --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/package.json @@ -0,0 +1,37 @@ +{ + "name": "kitchensink", + "version": "0.0.0", + "private": true, + "description": "A Strapi application.", + "license": "SEE LICENSE IN LICENSE", + "scripts": { + "build": "strapi build", + "build:ce": "STRAPI_DISABLE_EE=true strapi build", + "develop": "strapi develop", + "develop:ce": "STRAPI_DISABLE_EE=true strapi develop", + "start": "strapi start", + "strapi": "strapi" + }, + "dependencies": { + "@strapi/provider-email-mailgun": "workspace:*", + "@strapi/provider-upload-aws-s3": "workspace:*", + "@strapi/provider-upload-cloudinary": "workspace:*", + "@strapi/strapi": "workspace:*", + "better-sqlite3": "11.3.0", + "lodash": "4.17.21", + "mysql2": "3.9.8", + "passport-google-oauth2": "0.2.0", + "pg": "8.11.1", + "react": "18.3.1", + "react-dom": "18.3.1", + "react-router-dom": "6.22.3", + "styled-components": "6.1.8" + }, + "engines": { + "node": ">=18.0.0 <=22.x.x", + "npm": ">=6.0.0" + }, + "strapi": { + "uuid": "getstarted" + } +} diff --git a/Dockers/strapi/strapi/examples/kitchensink/public/robots.txt b/Dockers/strapi/strapi/examples/kitchensink/public/robots.txt new file mode 100644 index 0000000..ff5d316 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/public/robots.txt @@ -0,0 +1,3 @@ +# To prevent search engines from seeing the site altogether, uncomment the next two lines: +# User-Agent: * +# Disallow: / diff --git a/Dockers/strapi/strapi/examples/kitchensink/public/uploads/.gitkeep b/Dockers/strapi/strapi/examples/kitchensink/public/uploads/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Dockers/strapi/strapi/examples/kitchensink/src/admin/app.example.js b/Dockers/strapi/strapi/examples/kitchensink/src/admin/app.example.js new file mode 100644 index 0000000..8bce391 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/src/admin/app.example.js @@ -0,0 +1,37 @@ +import theme from './extensions/theme'; + +const config = { + auth: { + logo: 'https://images.unsplash.com/photo-1593642634367-d91a135587b5?ixid=MnwxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=750&q=80', + }, + head: { + favicon: + 'https://images.unsplash.com/photo-1593642634367-d91a135587b5?ixid=MnwxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=750&q=80', + title: 'Strapi test', + }, + locales: ['fr', 'de'], + menu: { + logo: 'https://images.unsplash.com/photo-1593642634367-d91a135587b5?ixid=MnwxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=750&q=80', + }, + theme, + translations: { + fr: { + 'Auth.form.email.label': 'test', + Users: 'Utilisateurs', + City: 'CITY FRENCH', + // Customize the label of the CM table.. + Id: 'ID french', + }, + }, + tutorials: false, + notifications: { releases: false }, +}; + +const bootstrap = (app) => { + console.log(app); +}; + +export default { + config, + bootstrap, +}; diff --git a/Dockers/strapi/strapi/examples/kitchensink/src/admin/app.js b/Dockers/strapi/strapi/examples/kitchensink/src/admin/app.js new file mode 100644 index 0000000..951cb07 --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/src/admin/app.js @@ -0,0 +1,37 @@ +import theme from './extensions/theme'; + +const config = { + auth: { + logo: 'https://images.unsplash.com/photo-1593642634367-d91a135587b5?ixid=MnwxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=750&q=80', + }, + head: { + favicon: + 'https://images.unsplash.com/photo-1593642634367-d91a135587b5?ixid=MnwxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=750&q=80', + title: 'Strapi tesrrt', + }, + locales: ['fr', 'de'], + menu: { + logo: 'https://images.unsplash.com/photo-1593642634367-d91a135587b5?ixid=MnwxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=750&q=80', + }, + theme, + translations: { + fr: { + 'Auth.form.email.label': 'test', + Users: 'Utilisateurs', + City: 'CITY FRENCH', + // Customize the label of the CM table.. + Id: 'ID french', + }, + }, + tutorials: false, + notifications: { releases: false }, +}; + +const bootstrap = (app) => { + console.log(app); +}; + +export default { + config, + bootstrap, +}; diff --git a/Dockers/strapi/strapi/examples/kitchensink/src/admin/extensions/theme.js b/Dockers/strapi/strapi/examples/kitchensink/src/admin/extensions/theme.js new file mode 100644 index 0000000..ad6e1ea --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/src/admin/extensions/theme.js @@ -0,0 +1,47 @@ +const theme = { + colors: { + alternative100: '#f6ecfc', + alternative200: '#e0c1f4', + alternative500: '#ac73e6', + alternative600: '#9736e8', + alternative700: '#8312d1', + danger100: '#fcecea', + danger200: '#f5c0b8', + danger500: '#ee5e52', + danger600: '#d02b20', + danger700: '#b72b1a', + neutral0: 'black', + neutral100: '#f6f6f9', + neutral150: '#eaeaef', + neutral200: '#dcdce4', + neutral300: '#c0c0cf', + neutral400: '#a5a5ba', + neutral500: '#8e8ea9', + neutral600: '#666687', + neutral700: '#4a4a6a', + neutral800: '#32324d', + neutral900: '#212134', + primary100: '#f0f0ff', + primary200: '#d9d8ff', + primary500: '#7b79ff', + primary600: '#4945ff', + primary700: '#271fe0', + secondary100: '#eaf5ff', + secondary200: '#b8e1ff', + secondary500: '#66b7f1', + secondary600: '#0c75af', + secondary700: '#006096', + success100: '#eafbe7', + success200: '#c6f0c2', + success500: '#5cb176', + success600: '#328048', + success700: '#2f6846', + warning100: '#fdf4dc', + warning200: '#fae7b9', + warning500: '#f29d41', + warning600: '#d9822f', + warning700: '#be5d01', + }, +}; + +export default theme; diff --git a/Dockers/strapi/strapi/examples/kitchensink/src/admin/webpack.config.example.js b/Dockers/strapi/strapi/examples/kitchensink/src/admin/webpack.config.example.js new file mode 100644 index 0000000..a36d60f --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/src/admin/webpack.config.example.js @@ -0,0 +1,10 @@ +'use strict'; + +/* eslint-disable no-unused-vars */ +module.exports = (config, webpack) => { + // Note: we provide webpack above so you should not `require` it + // Perform customizations to webpack config + // Important: return the modified config + console.log('custom'); + return config; +}; diff --git a/Dockers/strapi/strapi/examples/kitchensink/src/api/.gitkeep b/Dockers/strapi/strapi/examples/kitchensink/src/api/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Dockers/strapi/strapi/examples/kitchensink/src/api/testing/content-types/testing/schema.json b/Dockers/strapi/strapi/examples/kitchensink/src/api/testing/content-types/testing/schema.json new file mode 100644 index 0000000..576537a --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/src/api/testing/content-types/testing/schema.json @@ -0,0 +1,17 @@ +{ + "kind": "collectionType", + "collectionName": "testings", + "info": { + "singularName": "testing", + "pluralName": "testings", + "displayName": "testing" + }, + "options": { + "draftAndPublish": true + }, + "attributes": { + "title": { + "type": "string" + } + } +} diff --git a/Dockers/strapi/strapi/examples/kitchensink/src/api/testing/controllers/testing.js b/Dockers/strapi/strapi/examples/kitchensink/src/api/testing/controllers/testing.js new file mode 100644 index 0000000..4127b8f --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/src/api/testing/controllers/testing.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * testing controller + */ + +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::testing.testing'); diff --git a/Dockers/strapi/strapi/examples/kitchensink/src/api/testing/routes/testing.js b/Dockers/strapi/strapi/examples/kitchensink/src/api/testing/routes/testing.js new file mode 100644 index 0000000..18fa07c --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/src/api/testing/routes/testing.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * testing router + */ + +const { createCoreRouter } = require('@strapi/strapi').factories; + +module.exports = createCoreRouter('api::testing.testing'); diff --git a/Dockers/strapi/strapi/examples/kitchensink/src/api/testing/services/testing.js b/Dockers/strapi/strapi/examples/kitchensink/src/api/testing/services/testing.js new file mode 100644 index 0000000..510389a --- /dev/null +++ b/Dockers/strapi/strapi/examples/kitchensink/src/api/testing/services/testing.js @@ -0,0 +1,9 @@ +'use strict'; + +/** + * testing service + */ + +const { createCoreService } = require('@strapi/strapi').factories; + +module.exports = createCoreService('api::testing.testing'); diff --git a/Dockers/strapi/strapi/examples/kitchensink/src/extensions/.gitkeep b/Dockers/strapi/strapi/examples/kitchensink/src/extensions/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/.gitignore b/Dockers/strapi/strapi/examples/plugins/todo-example/.gitignore new file mode 100644 index 0000000..c9fcb82 --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/.gitignore @@ -0,0 +1,204 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/node,macos,windows +# Edit at https://www.toptal.com/developers/gitignore?templates=node,macos,windows + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.toptal.com/developers/gitignore/api/node,macos,windows diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/.prettierrc.js b/Dockers/strapi/strapi/examples/plugins/todo-example/.prettierrc.js new file mode 100644 index 0000000..102e3fa --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/.prettierrc.js @@ -0,0 +1,8 @@ +module.exports = { + endOfLine: 'lf', + semi: true, + singleQuote: true, + tabWidth: 2, + trailingComma: 'es5', + printWidth: 100, +}; diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/README.md b/Dockers/strapi/strapi/examples/plugins/todo-example/README.md new file mode 100644 index 0000000..0ba948e --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/README.md @@ -0,0 +1 @@ +# strapi-plugin-todo-example diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/components/TaskModal.jsx b/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/components/TaskModal.jsx new file mode 100644 index 0000000..aec13b5 --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/components/TaskModal.jsx @@ -0,0 +1,105 @@ +import * as React from 'react'; +import { Modal, Typography, Button, TextInput } from '@strapi/design-system'; +import { + unstable_useContentManagerContext as useContentManagerContext, + useFetchClient, +} from '@strapi/strapi/admin'; + +const TaskModal = ({ handleClose, refetchTasks, task = null, action, isOpen }) => { + const [name, setName] = React.useState(task?.name ?? ''); + const [status, setStatus] = React.useState(''); + const fetchClient = useFetchClient(); + + const { id, model } = useContentManagerContext(); + + const handleSubmit = async (e) => { + // Prevent submitting parent form + e.preventDefault(); + e.stopPropagation(); + + try { + // Show loading state + setStatus('loading'); + + if (action === 'create') { + // Create task and link it to the related entry + await fetchClient.post('/todo/tasks', { + name, + isDone: false, + related: { + __type: model, + id, + }, + }); + } else if (action === 'edit') { + // Update task + await fetchClient.put(`/todo/tasks/${task.documentId}`, { + name, + }); + } + + // Refetch tasks list so it includes up to date data + await refetchTasks(); + + // Remove loading and close popup + setStatus('success'); + setName(''); + + handleClose(); + } catch (e) { + setStatus('error'); + } + }; + + const getError = () => { + // Form validation error + if (name.length > 40) { + return 'Content is too long'; + } + // API error + if (status === 'error') { + return 'Could not create todo'; + } + return null; + }; + + return ( + { + handleClose(); + }} + > + + + + {action === 'create' && 'Add todo'} + {action === 'edit' && 'Edit todo'} + + + + setName(e.target.value)} + value={name} + /> + {getError()} + + + + + + + + + + ); +}; + +export default TaskModal; diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/components/TasksList.jsx b/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/components/TasksList.jsx new file mode 100644 index 0000000..2419f0a --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/components/TasksList.jsx @@ -0,0 +1,123 @@ +import * as React from 'react'; +import styled from 'styled-components'; +import { Box, Flex, Checkbox, IconButton, Typography } from '@strapi/design-system'; +import { Trash, Pencil } from '@strapi/icons'; +import TaskModal from './TaskModal'; +import { useFetchClient } from '@strapi/strapi/admin'; + +const Wrapper = styled(Flex)` + min-height: 2rem; + + > :last-child { + visibility: hidden; + } + + &:hover { + > :last-child { + visibility: visible; + } + } +`; + +const TasksList = ({ tasks, status, refetchTasks, isCreatingEntry }) => { + const [taskBeingEdited, setTaskBeingEdited] = React.useState(null); + const fetchClient = useFetchClient(); + + const toggleTask = async (documentId, isChecked) => { + // Update task in database + await fetchClient.put(`/todo/tasks/${documentId}`, { + isDone: isChecked, + }); + + // Call API to update local cache + await refetchTasks(); + }; + + const openEditModal = async (documentId) => { + setTaskBeingEdited(documentId); + }; + + const deleteTask = async (documentId) => { + await fetchClient.del(`/todo/tasks/${documentId}`); + await refetchTasks(); + }; + + // Disabled + if (isCreatingEntry) { + return ( + + Save your entry to start managing todos. + + ); + } + + // Loading state + if (status === 'loading') { + return ( + + Fetching todos... + + ); + } + + // Error state + if (status === 'error') { + return ( + + Could not fetch tasks. + + ); + } + + // Empty state + if (tasks == null || tasks.length === 0) { + return ( + + No todo yet. + + ); + } + + // Success state, show all tasks + return ( + <> + setTaskBeingEdited(null)} + refetchTasks={refetchTasks} + task={tasks.find((task) => task.documentId === taskBeingEdited)} + isOpen={taskBeingEdited !== null} + /> + + {tasks.map((task) => ( + + toggleTask(task.documentId, checked)} + > + + {task.name} + + + + openEditModal(task.documentId)}> + + + deleteTask(task.documentId)}> + + + + + ))} + + ); +}; + +export default TasksList; diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/components/TodoCard.jsx b/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/components/TodoCard.jsx new file mode 100644 index 0000000..e2597fe --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/components/TodoCard.jsx @@ -0,0 +1,64 @@ +import * as React from 'react'; +import { Box, Divider, Flex, TextButton, Typography } from '@strapi/design-system'; +import { Plus } from '@strapi/icons'; +import { unstable_useContentManagerContext as useContentManagerContext } from '@strapi/strapi/admin'; +import TaskModal from './TaskModal'; +import useRelatedTasks from '../hooks/useRelatedTasks'; +import TasksList from './TasksList'; + +const TodoCard = () => { + const [createModalIsShown, setCreateModalIsShown] = React.useState(false); + const { status, tasks, refetchTasks } = useRelatedTasks(); + + const { isCreatingEntry } = useContentManagerContext(); + + return ( + + setCreateModalIsShown(false)} + refetchTasks={refetchTasks} + isOpen={createModalIsShown} + /> + + + Todos + + + + + + + } + onClick={() => setCreateModalIsShown(true)} + disabled={isCreatingEntry} + > + + Add todo + + + + {tasks.filter((task) => task.isDone).length}/{tasks.length} + + + + + + + + + ); +}; + +export default TodoCard; diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/hooks/useRelatedTasks.js b/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/hooks/useRelatedTasks.js new file mode 100644 index 0000000..0890ccf --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/hooks/useRelatedTasks.js @@ -0,0 +1,35 @@ +import * as React from 'react'; +import { + useFetchClient, + unstable_useContentManagerContext as useContentManagerContext, +} from '@strapi/strapi/admin'; + +function useRelatedTasks() { + const fetchClient = useFetchClient(); + + const { model, id, isSingleType } = useContentManagerContext(); + + const [status, setStatus] = React.useState('loading'); + const [tasks, setTasks] = React.useState([]); + + const refetchTasks = React.useCallback(async () => { + try { + const { data } = await fetchClient.get( + `/todo/tasks/${model}?documentId=${isSingleType ? '' : id}` + ); + + setTasks(data); + setStatus('success'); + } catch (e) { + setStatus('error'); + } + }, [fetchClient, id, isSingleType, model]); + + React.useEffect(() => { + refetchTasks(); + }, [id, isSingleType, setTasks, setStatus, refetchTasks]); + + return { status, tasks, refetchTasks }; +} + +export default useRelatedTasks; diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/index.jsx b/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/index.jsx new file mode 100644 index 0000000..87049ca --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/index.jsx @@ -0,0 +1,42 @@ +import { prefixPluginTranslations } from './utils/prefixPluginTranslations'; +import TodoCard from './components/TodoCard'; + +const name = 'todo-example'; + +/** @type import('@strapi/strapi/admin').PluginDefinition */ +export default { + register(app) { + app.registerPlugin({ + id: 'todo-example', + name, + }); + }, + + bootstrap(app) { + app.getPlugin('content-manager').injectComponent('editView', 'right-links', { + name: 'my-plugin-my-compo', + Component: TodoCard, + }); + }, + + async registerTrads({ locales }) { + const importedTrads = await Promise.all( + locales.map((locale) => { + return import(`./translations/${locale}.json`) + .then(({ default: data }) => { + return { + data: prefixPluginTranslations(data, name), + locale, + }; + }) + .catch(() => { + return { + data: {}, + locale, + }; + }); + }) + ); + return Promise.resolve(importedTrads); + }, +}; diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/translations/en.json b/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/translations/en.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/translations/en.json @@ -0,0 +1 @@ +{} diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/translations/fr.json b/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/translations/fr.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/translations/fr.json @@ -0,0 +1 @@ +{} diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/utils/prefixPluginTranslations.js b/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/utils/prefixPluginTranslations.js new file mode 100644 index 0000000..e83bc99 --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/admin/src/utils/prefixPluginTranslations.js @@ -0,0 +1,23 @@ +/** + * @typedef {Object.} TradOptions + */ + +/** + * Prefixes the keys of the translation object with the plugin ID. + * + * @param {TradOptions} trad - The translation object. + * @param {string} pluginId - The plugin ID to prefix. + * @returns {TradOptions} - The new translation object with prefixed keys. + * @throws {TypeError} - If the pluginId is empty. + */ +export function prefixPluginTranslations(trad, pluginId) { + if (!pluginId) { + throw new TypeError("pluginId can't be empty"); + } + + return Object.keys(trad).reduce((acc, current) => { + acc[`${pluginId}.${current}`] = trad[current]; + + return acc; + }, {}); +} diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/jsconfig.json b/Dockers/strapi/strapi/examples/plugins/todo-example/jsconfig.json new file mode 100644 index 0000000..1da3f2a --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/jsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "jsx": "react", + "module": "NodeNext", + "moduleResolution": "nodenext", + "target": "ES2021", + "checkJs": true, + "allowJs": true + } +} diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/package.json b/Dockers/strapi/strapi/examples/plugins/todo-example/package.json new file mode 100644 index 0000000..c3dea94 --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/package.json @@ -0,0 +1,52 @@ +{ + "name": "strapi-plugin-todo-example", + "version": "0.0.0", + "description": "Keep track of your content management with todo lists", + "license": "SEE LICENSE IN LICENSE", + "exports": { + "./package.json": "./package.json", + "./strapi-admin": { + "source": "./admin/src/index.jsx", + "import": "./dist/admin/index.mjs", + "require": "./dist/admin/index.js", + "default": "./dist/admin/index.js" + }, + "./strapi-server": { + "source": "./server/src/index.js", + "import": "./dist/server/index.mjs", + "require": "./dist/server/index.js", + "default": "./dist/server/index.js" + } + }, + "scripts": { + "build": "strapi-plugin build", + "watch": "strapi-plugin watch", + "lint": "eslint ." + }, + "peerDependencies": { + "@strapi/strapi": "workspace:*" + }, + "dependencies": { + "@strapi/design-system": "2.0.0-rc.29", + "@strapi/icons": "2.0.0-rc.29", + "eslint": "8.50.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "react-router-dom": "^6.0.0", + "styled-components": "^6.0.0" + }, + "devDependencies": { + "@strapi/sdk-plugin": "^5.2.0", + "@strapi/strapi": "workspace:*" + }, + "engines": { + "node": ">=18.0.0 <=22.x.x", + "npm": ">=6.0.0" + }, + "strapi": { + "name": "todo-example", + "displayName": "Todo example", + "description": "Keep track of your content management with todo lists.", + "kind": "plugin" + } +} diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/screenshot.png b/Dockers/strapi/strapi/examples/plugins/todo-example/screenshot.png new file mode 100644 index 0000000..a652818 Binary files /dev/null and b/Dockers/strapi/strapi/examples/plugins/todo-example/screenshot.png differ diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/content-types/index.js b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/content-types/index.js new file mode 100644 index 0000000..4435722 --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/content-types/index.js @@ -0,0 +1,7 @@ +'use strict'; + +const task = require('./task'); + +module.exports = { + task: { schema: task }, +}; diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/content-types/task.js b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/content-types/task.js new file mode 100644 index 0000000..7352d17 --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/content-types/task.js @@ -0,0 +1,36 @@ +module.exports = { + info: { + tableName: 'task', + singularName: 'task', // kebab-case mandatory + pluralName: 'tasks', // kebab-case mandatory + displayName: 'Task', + description: 'A task in Strapi', + kind: 'collectionType', + }, + options: { + draftAndPublish: false, + }, + pluginOptions: { + 'content-manager': { + visible: false, + }, + 'content-type-builder': { + visible: false, + }, + }, + attributes: { + name: { + type: 'string', + required: true, + maxLength: 40, + }, + isDone: { + type: 'boolean', + default: false, + }, + related: { + type: 'relation', + relation: 'morphToOne', + }, + }, +}; diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/controllers/index.js b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/controllers/index.js new file mode 100644 index 0000000..6afca0e --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/controllers/index.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = { + tasks: require('./tasks'), +}; diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/controllers/tasks.js b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/controllers/tasks.js new file mode 100644 index 0000000..e0469f1 --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/controllers/tasks.js @@ -0,0 +1,29 @@ +'use strict'; + +const { getService } = require('../utils'); + +const controller = { + async createTask(ctx) { + return getService('tasks').createTask(ctx.request.body); + }, + + async updateTask(ctx) { + const data = ctx.request.body; + const { documentId } = ctx.params; + return getService('tasks').updateTask({ documentId, data }); + }, + + async deleteTask(ctx) { + const { documentId } = ctx.params; + + return getService('tasks').deleteTask(documentId); + }, + + async listRelatedTasks(ctx) { + const { slug } = ctx.params; + const { documentId } = ctx.query; + return getService('tasks').listRelatedTasks({ slug, documentId }); + }, +}; + +module.exports = controller; diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/index.js b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/index.js new file mode 100644 index 0000000..f88472d --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/index.js @@ -0,0 +1,13 @@ +'use strict'; + +const contentTypes = require('./content-types'); +const controllers = require('./controllers'); +const routes = require('./routes'); +const services = require('./services'); + +module.exports = { + controllers, + routes, + services, + contentTypes, +}; diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/routes/admin.js b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/routes/admin.js new file mode 100644 index 0000000..c48e2a1 --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/routes/admin.js @@ -0,0 +1,27 @@ +'use strict'; + +module.exports = { + type: 'admin', + routes: [ + { + method: 'POST', + path: '/tasks', + handler: 'tasks.createTask', + }, + { + method: 'PUT', + path: '/tasks/:documentId', + handler: 'tasks.updateTask', + }, + { + method: 'DELETE', + path: '/tasks/:documentId', + handler: 'tasks.deleteTask', + }, + { + method: 'GET', + path: '/tasks/:slug', + handler: 'tasks.listRelatedTasks', + }, + ], +}; diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/routes/index.js b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/routes/index.js new file mode 100644 index 0000000..772e5b9 --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/routes/index.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = { + admin: require('./admin'), +}; diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/services/index.js b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/services/index.js new file mode 100644 index 0000000..6afca0e --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/services/index.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = { + tasks: require('./tasks'), +}; diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/services/tasks.js b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/services/tasks.js new file mode 100644 index 0000000..6f10e8b --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/services/tasks.js @@ -0,0 +1,32 @@ +'use strict'; + +module.exports = ({ strapi }) => ({ + async createTask(data) { + return strapi.documents('plugin::todo.task').create({ data }); + }, + + async updateTask({ documentId, data }) { + return strapi.documents('plugin::todo.task').update({ + documentId, + data, + }); + }, + + async deleteTask(documentId) { + return strapi.documents('plugin::todo.task').delete({ + documentId, + }); + }, + + async listRelatedTasks({ documentId, slug }) { + return strapi.db.query('plugin::todo.task').findMany({ + where: { + // Only pass the related ID if it's pointing to a collection type + ...(documentId !== '' && { + target_id: documentId, + }), + target_type: slug, + }, + }); + }, +}); diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/utils/index.js b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/utils/index.js new file mode 100644 index 0000000..faa7705 --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/server/src/utils/index.js @@ -0,0 +1,10 @@ +'use strict'; + +// Retrieve a local service +function getService(name) { + return strapi.plugin('todo').service(name); +} + +module.exports = { + getService, +}; diff --git a/Dockers/strapi/strapi/examples/plugins/todo-example/strapi-server.js b/Dockers/strapi/strapi/examples/plugins/todo-example/strapi-server.js new file mode 100644 index 0000000..bf55958 --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/todo-example/strapi-server.js @@ -0,0 +1,3 @@ +'use strict'; + +module.exports = require('./dist/server'); diff --git a/Dockers/strapi/strapi/examples/plugins/workspace-plugin/admin/src/index.js b/Dockers/strapi/strapi/examples/plugins/workspace-plugin/admin/src/index.js new file mode 100644 index 0000000..3ac1bbb --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/workspace-plugin/admin/src/index.js @@ -0,0 +1,30 @@ +import { PuzzlePiece } from '@strapi/icons'; + +import pluginPkg from '../../package.json'; +import pluginId from './pluginId'; + +const name = pluginPkg.strapi.name; + +export default { + register(app) { + app.addMenuLink({ + to: `/plugins/${pluginId}`, + icon: PuzzlePiece, + intlLabel: { + id: `${pluginId}.plugin.name`, + defaultMessage: 'My plugin', + }, + Component: async () => { + const component = await import('./pages/App'); + + return component; + }, + permissions: [], + }); + + app.registerPlugin({ + id: pluginId, + name, + }); + }, +}; diff --git a/Dockers/strapi/strapi/examples/plugins/workspace-plugin/admin/src/pages/App/index.jsx b/Dockers/strapi/strapi/examples/plugins/workspace-plugin/admin/src/pages/App/index.jsx new file mode 100644 index 0000000..8d11481 --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/workspace-plugin/admin/src/pages/App/index.jsx @@ -0,0 +1,5 @@ +const App = () => { + return 'I am a workspace plugin, imported via node_modules.'; +}; + +export default App; diff --git a/Dockers/strapi/strapi/examples/plugins/workspace-plugin/admin/src/pluginId.js b/Dockers/strapi/strapi/examples/plugins/workspace-plugin/admin/src/pluginId.js new file mode 100644 index 0000000..f5ad7de --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/workspace-plugin/admin/src/pluginId.js @@ -0,0 +1,5 @@ +import pluginPkg from '../../package.json'; + +const pluginId = pluginPkg.name.replace(/^strapi-plugin-/i, ''); + +export default pluginId; diff --git a/Dockers/strapi/strapi/examples/plugins/workspace-plugin/package.json b/Dockers/strapi/strapi/examples/plugins/workspace-plugin/package.json new file mode 100644 index 0000000..ce8e30d --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/workspace-plugin/package.json @@ -0,0 +1,24 @@ +{ + "name": "strapi-plugin-workspace-plugin", + "version": "0.0.0", + "private": true, + "description": "This is the description of my plugin.", + "exports": { + "./strapi-admin": { + "source": "./admin/src/index.js", + "require": "./admin/src/index.js", + "default": "./admin/src/index.js" + }, + "./strapi-server": { + "source": "./server/index.js", + "require": "./server/index.js", + "default": "./server/index.js" + }, + "./package.json": "./package.json" + }, + "strapi": { + "name": "my-plugin", + "description": "This plugin is used as an npm module and linked that way.", + "kind": "plugin" + } +} diff --git a/Dockers/strapi/strapi/examples/plugins/workspace-plugin/server/config/index.js b/Dockers/strapi/strapi/examples/plugins/workspace-plugin/server/config/index.js new file mode 100644 index 0000000..d16884e --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/workspace-plugin/server/config/index.js @@ -0,0 +1,12 @@ +'use strict'; + +module.exports = { + default: { + testConf: 1, + }, + validator: (config) => { + if (typeof config.testConf !== 'number') { + throw new Error('testConfig has to be a number'); + } + }, +}; diff --git a/Dockers/strapi/strapi/examples/plugins/workspace-plugin/server/index.js b/Dockers/strapi/strapi/examples/plugins/workspace-plugin/server/index.js new file mode 100644 index 0000000..2c6ddbf --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/workspace-plugin/server/index.js @@ -0,0 +1,11 @@ +'use strict'; + +const config = require('./config'); +const register = require('./register'); + +module.exports = () => { + return { + register, + config, + }; +}; diff --git a/Dockers/strapi/strapi/examples/plugins/workspace-plugin/server/register.js b/Dockers/strapi/strapi/examples/plugins/workspace-plugin/server/register.js new file mode 100644 index 0000000..dec509e --- /dev/null +++ b/Dockers/strapi/strapi/examples/plugins/workspace-plugin/server/register.js @@ -0,0 +1,3 @@ +'use strict'; + +module.exports = ({ strapi }) => {}; diff --git a/Dockers/strapi/strapi/fileTransformer.js b/Dockers/strapi/strapi/fileTransformer.js new file mode 100644 index 0000000..a554a6b --- /dev/null +++ b/Dockers/strapi/strapi/fileTransformer.js @@ -0,0 +1,7 @@ +const path = require('path'); + +module.exports = { + process(src, filename) { + return 'module.exports = ' + JSON.stringify(path.basename(filename)) + ';'; + }, +}; diff --git a/Dockers/strapi/strapi/jest-preset.front.js b/Dockers/strapi/strapi/jest-preset.front.js new file mode 100644 index 0000000..1dc4aa7 --- /dev/null +++ b/Dockers/strapi/strapi/jest-preset.front.js @@ -0,0 +1,91 @@ +'use strict'; + +const path = require('path'); + +const moduleNameMapper = { + '.*\\.(css|less|styl|scss|sass)$': '@strapi/admin-test-utils/file-mock', + '.*\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga|ico)$': + '@strapi/admin-test-utils/file-mock', + /** + * we're mapping the following packages to the monorepos node_modules + * so if you link a package e.g. `design-system` the correct dependencies + * are used and the tests run correctly. + **/ + '^react$': path.join(__dirname, 'node_modules/react'), + '^react-dom$': path.join(__dirname, 'node_modules/react-dom'), + '^react-router-dom$': path.join(__dirname, 'node_modules/react-router-dom'), + '^styled-components$': path.join(__dirname, 'node_modules/styled-components'), +}; + +/** + * @type {import('jest').Config} + */ +module.exports = { + rootDir: __dirname, + moduleNameMapper, + /* Tells jest to ignore duplicated manual mock files, such as index.js */ + modulePathIgnorePatterns: ['.*__mocks__.*'], + testPathIgnorePatterns: ['node_modules/', 'dist/'], + globalSetup: '@strapi/admin-test-utils/global-setup', + setupFiles: ['@strapi/admin-test-utils/setup'], + setupFilesAfterEnv: ['@strapi/admin-test-utils/after-env'], + testEnvironment: '@strapi/admin-test-utils/environment', + prettierPath: require.resolve('prettier-2'), + transform: { + '^.+\\.js(x)?$': [ + '@swc/jest', + { + jsc: { + parser: { + jsx: true, + dynamicImport: true, + }, + // this should match the minimum supported node.js version + target: 'es2020', + }, + }, + ], + '\\.ts$': [ + '@swc/jest', + { + jsc: { + parser: { + syntax: 'typescript', + }, + }, + }, + ], + '\\.tsx$': [ + '@swc/jest', + { + jsc: { + parser: { + syntax: 'typescript', + tsx: true, + }, + transform: { + react: { + runtime: 'automatic', + }, + }, + }, + }, + ], + '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': + path.join(__dirname, 'fileTransformer.js'), + }, + transformIgnorePatterns: [ + 'node_modules/(?!(react-dnd|dnd-core|react-dnd-html5-backend|@react-dnd|fractional-indexing)/)', + ], + testMatch: ['**/tests/**/?(*.)+(spec|test).[jt]s?(x)'], + testEnvironmentOptions: { + url: 'http://localhost:1337/admin', + }, + // Use `jest-watch-typeahead` version 0.6.5. Newest version 1.0.0 does not support jest@26 + // Reference: https://github.com/jest-community/jest-watch-typeahead/releases/tag/v1.0.0 + watchPlugins: ['jest-watch-typeahead/filename', 'jest-watch-typeahead/testname'], + + // NOTE: this doesn't work with projects due to a jest bug, so we also set it + // using jest.setTimeout() in the after-env script + testTimeout: 60 * 1000, +}; diff --git a/Dockers/strapi/strapi/jest-preset.unit.js b/Dockers/strapi/strapi/jest-preset.unit.js new file mode 100644 index 0000000..8619b71 --- /dev/null +++ b/Dockers/strapi/strapi/jest-preset.unit.js @@ -0,0 +1,21 @@ +'use strict'; + +module.exports = { + setupFilesAfterEnv: [__dirname + '/tests/setup/unit.setup.js'], + modulePathIgnorePatterns: ['.cache', 'dist'], + testPathIgnorePatterns: [ + '.testdata.{js,ts}', + '.test.utils.{js,ts}', + '.d.ts', + '__tests__/resources', + 'tests/resources', + ], + prettierPath: require.resolve('prettier-2'), + testMatch: ['**/__tests__/**/*.{js,ts,jsx,tsx}'], + transform: { + '^.+\\.(t|j)sx?$': ['@swc/jest'], + }, + // Use `jest-watch-typeahead` version 0.6.5. Newest version 1.0.0 does not support jest@26 + // Reference: https://github.com/jest-community/jest-watch-typeahead/releases/tag/v1.0.0 + watchPlugins: ['jest-watch-typeahead/filename', 'jest-watch-typeahead/testname'], +}; diff --git a/Dockers/strapi/strapi/jest.config.api.js b/Dockers/strapi/strapi/jest.config.api.js new file mode 100644 index 0000000..49d438a --- /dev/null +++ b/Dockers/strapi/strapi/jest.config.api.js @@ -0,0 +1,18 @@ +'use strict'; + +module.exports = { + displayName: 'API integration tests', + testMatch: ['**/?(*.)+(spec|test).api.(js|ts)'], + testEnvironment: 'node', + setupFilesAfterEnv: ['/tests/setup/jest-api.setup.js'], + coveragePathIgnorePatterns: [ + '/dist/', + '/node_modules/', + '/out-tsc/', + '/test/', + ], + transform: { + '^.+\\.ts$': ['@swc/jest'], + }, + modulePathIgnorePatterns: ['.cache'], +}; diff --git a/Dockers/strapi/strapi/jest.config.cli.js b/Dockers/strapi/strapi/jest.config.cli.js new file mode 100644 index 0000000..cf6e3b8 --- /dev/null +++ b/Dockers/strapi/strapi/jest.config.cli.js @@ -0,0 +1,18 @@ +'use strict'; + +module.exports = { + displayName: 'CLI tests', + testMatch: ['**/?(*.)+(spec|test).cli.(js|ts)'], + testEnvironment: 'node', + setupFilesAfterEnv: ['/../../../../tests/setup/jest-cli.setup.js'], + coveragePathIgnorePatterns: [ + '/dist/', + '/node_modules/', + '/out-tsc/', + '/test/', + ], + transform: { + '^.+\\.ts$': ['@swc/jest'], + }, + modulePathIgnorePatterns: ['.cache'], +}; diff --git a/Dockers/strapi/strapi/jest.config.front.js b/Dockers/strapi/strapi/jest.config.front.js new file mode 100644 index 0000000..be0d1bc --- /dev/null +++ b/Dockers/strapi/strapi/jest.config.front.js @@ -0,0 +1,12 @@ +'use strict'; + +/** @type {import('jest').Config} */ +const config = { + projects: [ + '/packages/plugins/*/jest.config.front.js', + '/packages/core/*/jest.config.front.js', + '/scripts/*/jest.config.front.js', + ], +}; + +module.exports = config; diff --git a/Dockers/strapi/strapi/jest.config.js b/Dockers/strapi/strapi/jest.config.js new file mode 100644 index 0000000..6ef1408 --- /dev/null +++ b/Dockers/strapi/strapi/jest.config.js @@ -0,0 +1,15 @@ +'use strict'; + +/** @type {import('jest').Config} */ +const config = { + projects: [ + '/packages/plugins/*/jest.config.js', + '/packages/utils/*/jest.config.js', + '/packages/generators/*/jest.config.js', + '/packages/core/*/jest.config.js', + '/packages/providers/*/jest.config.js', + '/.github/actions/*/jest.config.js', + ], +}; + +module.exports = config; diff --git a/Dockers/strapi/strapi/jsconfig.json b/Dockers/strapi/strapi/jsconfig.json new file mode 100644 index 0000000..39b38bc --- /dev/null +++ b/Dockers/strapi/strapi/jsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "rootDir": ".", + "module": "commonjs", + "target": "es6" + }, + "exclude": [ + "**/node_modules/*", + ".git", + ".npm", + "**/.cache/*", + "**/.tmp/*", + "**/dist/*", + "**/build/*", + "**/*.test.js", + "**/*.test.api.js", + "**/examples/getstarted/*", + "**/examples/kitchensink/*" + ] +} diff --git a/Dockers/strapi/strapi/lerna.json b/Dockers/strapi/strapi/lerna.json new file mode 100644 index 0000000..76dc488 --- /dev/null +++ b/Dockers/strapi/strapi/lerna.json @@ -0,0 +1,4 @@ +{ + "version": "5.7.0", + "npmClient": "yarn" +} diff --git a/Dockers/strapi/strapi/lint-staged.config.js b/Dockers/strapi/strapi/lint-staged.config.js new file mode 100644 index 0000000..94192d4 --- /dev/null +++ b/Dockers/strapi/strapi/lint-staged.config.js @@ -0,0 +1,50 @@ +'use strict'; + +const path = require('path'); +const fs = require('fs'); +const findUp = require('find-up'); + +const includes = ['packages', '.github']; + +const root = path.resolve(__dirname); + +function extractPackageName(pkgJsonPath) { + return JSON.parse(fs.readFileSync(pkgJsonPath).toString()).name; +} + +function getLintCommand(files) { + const affectedFolders = new Set(); + + for (const file of files) { + const r = findUp.sync('package.json', { cwd: file }); + const relPath = path.relative(root, r); + + if (includes.some((incl) => relPath.startsWith(incl))) { + affectedFolders.add(r); + } + } + + const affectedPackages = [...affectedFolders].map(extractPackageName); + + if (affectedPackages.length === 0) { + return null; + } + return `nx run-many -t lint -p ${affectedPackages.join()}`; +} + +function getCodeCommands(files) { + const lintCmd = getLintCommand(files); + + const prettierCmd = `prettier --write ${files.join(' ')}`; + + if (lintCmd) { + return [lintCmd, prettierCmd]; + } + + return [prettierCmd]; +} + +module.exports = { + '*.{js,ts,jsx,tsx,json}': getCodeCommands, + '*.{md,mdx,css,scss,yaml,yml}': ['prettier --write'], +}; diff --git a/Dockers/strapi/strapi/nx.json b/Dockers/strapi/strapi/nx.json new file mode 100644 index 0000000..11c0ebd --- /dev/null +++ b/Dockers/strapi/strapi/nx.json @@ -0,0 +1,117 @@ +{ + "namedInputs": { + "default": ["{projectRoot}/**/*"], + "production": [ + "{workspaceRoot}/rollup.utils.mjs", + "!{projectRoot}/**/*.test.ts", + "!{projectRoot}/**/*.test.js", + "!{projectRoot}/**/*.test.api.js", + "!{projectRoot}/**/__mocks__/**", + "!{projectRoot}/**/__tests__/**", + "!{projectRoot}/**/*.md", + "!{projectRoot}/jest.config.js", + "!{projectRoot}/jest.config.front.js", + "!{projectRoot}/tsconfig.eslint.json", + "!{projectRoot}/.eslintignore", + "!{projectRoot}/.eslintrc.js" + ] + }, + "cli": { + "packageManager": "yarn" + }, + "targetDefaults": { + "build": { + "inputs": ["default", "^production"], + "outputs": ["{projectRoot}/dist"], + "dependsOn": ["^build"], + "cache": true + }, + "build:code": { + "inputs": ["default", "^production"], + "outputs": ["{projectRoot}/dist"], + "cache": true + }, + "build:types": { + "inputs": ["default", "^production"], + "outputs": ["{projectRoot}/dist"], + "dependsOn": ["^build:types"], + "cache": true + }, + "test:unit": { + "inputs": ["default", "{workspaceRoot}/jest-preset.unit.js"], + "cache": true + }, + "test:front": { + "inputs": ["default", "{workspaceRoot}/jest-preset.front.js"], + "cache": true + }, + "lint": { + "inputs": [ + "{projectRoot}/**/*.js", + "{projectRoot}/**/*.ts", + "{projectRoot}/.eslintrc.js", + "{projectRoot}/.eslintignore", + "{projectRoot}/tsconfig.eslint.json", + "{workspaceRoot}/packages/utils/eslint-config-custom/**/*" + ], + "cache": true + } + }, + "useInferencePlugins": false, + "parallel": 8, + "pluginsConfig": { + "@nx/js": { + "analyzeSourceFiles": false + } + }, + "release": { + "projects": ["packages/**/*", ".github/actions/check-pr-status", "scripts/front"], + "changelog": { + "workspaceChangelog": { + "file": false, + "createRelease": "github" + } + }, + "version": { + "conventionalCommits": false, + "git": { + "commitMessage": "release: {version}" + } + }, + "conventionalCommits": { + "types": { + "docs": { + "changelog": { + "title": "📚 Documentation Changes" + } + }, + "enhancement": { + "changelog": { + "title": "💅 Enhancement" + } + }, + "feat": { + "changelog": { + "title": "🚀 New feature" + } + }, + "fix": { + "changelog": { + "title": "🔥 Bug fix" + } + }, + "security": { + "semverBump": "patch", + "changelog": { + "title": "🚨 Security" + } + }, + "chore": { + "changelog": { + "title": "⚙️ Chore" + } + } + } + } + } +} diff --git a/Dockers/strapi/strapi/package-lock.json b/Dockers/strapi/strapi/package-lock.json deleted file mode 100644 index 24fbfde..0000000 --- a/Dockers/strapi/strapi/package-lock.json +++ /dev/null @@ -1,18004 +0,0 @@ -{ - "name": "strapi", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "strapi", - "version": "0.1.0", - "dependencies": { - "@strapi/plugin-cloud": "5.13.0", - "@strapi/plugin-users-permissions": "5.13.0", - "@strapi/strapi": "5.13.0", - "pg": "8.8.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", - "react-router-dom": "^6.0.0", - "styled-components": "^6.0.0" - }, - "devDependencies": { - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "typescript": "^5" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", - "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.27.1", - "@babel/types": "^7.27.1", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", - "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", - "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.1.tgz", - "integrity": "sha512-909rVuj3phpjW6y0MCXAZ5iNeORePa6ldJvp2baWGcTjwqbBDDz6xoS5JHJ7lS88NlwLYj07ImL/8IUMtDZzTA==", - "license": "MIT", - "dependencies": { - "core-js-pure": "^3.30.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", - "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", - "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@casl/ability": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@casl/ability/-/ability-6.5.0.tgz", - "integrity": "sha512-3guc94ugr5ylZQIpJTLz0CDfwNi0mxKVECj1vJUPAvs+Lwunh/dcuUjwzc4MHM9D8JOYX0XUZMEPedpB3vIbOw==", - "license": "MIT", - "dependencies": { - "@ucast/mongo2js": "^1.3.0" - }, - "funding": { - "url": "https://github.com/stalniy/casl/blob/master/BACKERS.md" - } - }, - "node_modules/@codemirror/autocomplete": { - "version": "6.18.6", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz", - "integrity": "sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@codemirror/commands": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.8.1.tgz", - "integrity": "sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.4.0", - "@codemirror/view": "^6.27.0", - "@lezer/common": "^1.1.0" - } - }, - "node_modules/@codemirror/lang-json": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.1.tgz", - "integrity": "sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@lezer/json": "^1.0.0" - } - }, - "node_modules/@codemirror/language": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.11.0.tgz", - "integrity": "sha512-A7+f++LodNNc1wGgoRDTt78cOwWm9KVezApgjOMp1W4hM0898nsqBXwF+sbePE7ZRcjN7Sa1Z5m2oN27XkmEjQ==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.23.0", - "@lezer/common": "^1.1.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0", - "style-mod": "^4.0.0" - } - }, - "node_modules/@codemirror/lint": { - "version": "6.8.5", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.5.tgz", - "integrity": "sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.35.0", - "crelt": "^1.0.5" - } - }, - "node_modules/@codemirror/search": { - "version": "6.5.10", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.10.tgz", - "integrity": "sha512-RMdPdmsrUf53pb2VwflKGHEe1XVM07hI7vV2ntgw1dmqhimpatSJKva4VA9h4TLUDOD4EIF02201oZurpnEFsg==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "crelt": "^1.0.5" - } - }, - "node_modules/@codemirror/state": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz", - "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==", - "license": "MIT", - "dependencies": { - "@marijn/find-cluster-break": "^1.0.0" - } - }, - "node_modules/@codemirror/theme-one-dark": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.2.tgz", - "integrity": "sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/highlight": "^1.0.0" - } - }, - "node_modules/@codemirror/view": { - "version": "6.36.7", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.36.7.tgz", - "integrity": "sha512-kCWGW/chWGPgZqfZ36Um9Iz0X2IVpmCjg1P/qY6B6a2ecXtWRRAigmpJ6YgUQ5lTWXMyyVdfmpzhLZmsZQMbtg==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^6.5.0", - "style-mod": "^4.1.0", - "w3c-keyname": "^2.2.4" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "license": "MIT", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", - "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.13.5", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", - "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/serialize": "^1.3.3", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@emotion/cache": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", - "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.9.0", - "@emotion/sheet": "^1.4.0", - "@emotion/utils": "^1.4.2", - "@emotion/weak-memoize": "^0.4.0", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/hash": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", - "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", - "license": "MIT" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", - "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.8.1" - } - }, - "node_modules/@emotion/is-prop-valid/node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", - "license": "MIT" - }, - "node_modules/@emotion/memoize": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", - "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", - "license": "MIT" - }, - "node_modules/@emotion/react": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", - "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.13.5", - "@emotion/cache": "^11.14.0", - "@emotion/serialize": "^1.3.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", - "@emotion/utils": "^1.4.2", - "@emotion/weak-memoize": "^0.4.0", - "hoist-non-react-statics": "^3.3.1" - }, - "peerDependencies": { - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/serialize": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", - "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", - "license": "MIT", - "dependencies": { - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/unitless": "^0.10.0", - "@emotion/utils": "^1.4.2", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", - "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", - "license": "MIT" - }, - "node_modules/@emotion/unitless": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", - "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", - "license": "MIT" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", - "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@emotion/utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", - "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", - "license": "MIT" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", - "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", - "license": "MIT" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.0.tgz", - "integrity": "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.0.tgz", - "integrity": "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.0", - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz", - "integrity": "sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", - "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", - "license": "MIT" - }, - "node_modules/@formatjs/ecma402-abstract": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz", - "integrity": "sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==", - "license": "MIT", - "dependencies": { - "@formatjs/intl-localematcher": "0.5.4", - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/fast-memoize": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", - "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.6.tgz", - "integrity": "sha512-etVau26po9+eewJKYoiBKP6743I1br0/Ie00Pb/S/PtmYfmjTcOn2YCh2yNkSZI12h6Rg+BOgQYborXk46BvkA==", - "license": "MIT", - "dependencies": { - "@formatjs/ecma402-abstract": "1.18.2", - "@formatjs/icu-skeleton-parser": "1.8.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.0.tgz", - "integrity": "sha512-QWLAYvM0n8hv7Nq5BEs4LKIjevpVpbGLAJgOaYzg9wABEoX1j0JO1q2/jVkO6CVlq0dbsxZCngS5aXbysYueqA==", - "license": "MIT", - "dependencies": { - "@formatjs/ecma402-abstract": "1.18.2", - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/intl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-2.10.0.tgz", - "integrity": "sha512-X3xT9guVkKDS86EKV80lS0KxoazUglkJTGZO66sKY7otgl0VeStPA8B3u8UkKT47PexVV98fUzjpkchYmbe9nw==", - "license": "MIT", - "dependencies": { - "@formatjs/ecma402-abstract": "1.18.2", - "@formatjs/fast-memoize": "2.2.0", - "@formatjs/icu-messageformat-parser": "2.7.6", - "@formatjs/intl-displaynames": "6.6.6", - "@formatjs/intl-listformat": "7.5.5", - "intl-messageformat": "10.5.11", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "typescript": "^4.7 || 5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@formatjs/intl-displaynames": { - "version": "6.6.6", - "resolved": "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-6.6.6.tgz", - "integrity": "sha512-Dg5URSjx0uzF8VZXtHb6KYZ6LFEEhCbAbKoYChYHEOnMFTw/ZU3jIo/NrujzQD2EfKPgQzIq73LOUvW6Z/LpFA==", - "license": "MIT", - "dependencies": { - "@formatjs/ecma402-abstract": "1.18.2", - "@formatjs/intl-localematcher": "0.5.4", - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/intl-listformat": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.5.5.tgz", - "integrity": "sha512-XoI52qrU6aBGJC9KJddqnacuBbPlb/bXFN+lIFVFhQ1RnFHpzuFrlFdjD9am2O7ZSYsyqzYRpkVcXeT1GHkwDQ==", - "license": "MIT", - "dependencies": { - "@formatjs/ecma402-abstract": "1.18.2", - "@formatjs/intl-localematcher": "0.5.4", - "tslib": "^2.4.0" - } - }, - "node_modules/@formatjs/intl-localematcher": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", - "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@hapi/bourne": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-3.0.0.tgz", - "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==", - "license": "BSD-3-Clause" - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", - "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", - "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.5" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", - "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", - "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.2.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", - "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.11.tgz", - "integrity": "sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@internationalized/date": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.4.tgz", - "integrity": "sha512-qoVJVro+O0rBaw+8HPjUB1iH8Ihf8oziEnqMnvhJUSuVIrHOuZ6eNLHNvzXJKUvAtaDiqMnRlg8Z2mgh09BlUw==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - } - }, - "node_modules/@internationalized/number": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.5.3.tgz", - "integrity": "sha512-rd1wA3ebzlp0Mehj5YTuTI50AQEx80gWFyHcQu+u91/5NgdwBecO8BH6ipPfE+lmQ9d63vpB3H9SHoIUiupllw==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@juggle/resize-observer": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", - "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", - "license": "Apache-2.0" - }, - "node_modules/@koa/cors": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@koa/cors/-/cors-5.0.0.tgz", - "integrity": "sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==", - "license": "MIT", - "dependencies": { - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@koa/router": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/@koa/router/-/router-12.0.2.tgz", - "integrity": "sha512-sYcHglGKTxGF+hQ6x67xDfkE9o+NhVlRHBqq6gLywaMc6CojK/5vFZByphdonKinYlMLkEkacm+HEse9HzwgTA==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "http-errors": "^2.0.0", - "koa-compose": "^4.1.0", - "methods": "^1.1.2", - "path-to-regexp": "^6.3.0" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/@lezer/common": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", - "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==", - "license": "MIT" - }, - "node_modules/@lezer/highlight": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz", - "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@lezer/json": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@lezer/json/-/json-1.0.3.tgz", - "integrity": "sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/lr": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", - "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@marijn/find-cluster-break": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", - "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", - "license": "MIT" - }, - "node_modules/@mux/mux-player": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mux/mux-player/-/mux-player-3.1.0.tgz", - "integrity": "sha512-vU7HjvM3KLDfMwMfjbotlhjQrakwm9A4zixxtzBdxwDMLKf0FUKiFOGyTGOdsIKNBRVlS5Ffz9ERU+3Hh+XcBQ==", - "license": "MIT", - "dependencies": { - "@mux/mux-video": "0.22.0", - "@mux/playback-core": "0.27.0", - "media-chrome": "~4.2.1", - "player.style": "^0.0.8" - } - }, - "node_modules/@mux/mux-player-react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mux/mux-player-react/-/mux-player-react-3.1.0.tgz", - "integrity": "sha512-oJWcRtDNE84KKSi/5tz7CKGHBLA34V9XlLnv30qqVMAvfifa3S0lY82gP41YA0OfYANwp5Sg29bbh3quekusPg==", - "license": "MIT", - "dependencies": { - "@mux/mux-player": "3.1.0", - "@mux/playback-core": "0.27.0", - "prop-types": "^15.7.2" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^17.0.0-0 || ^18 || ^18.0.0-0 || ^19 || ^19.0.0-0", - "react": "^17.0.2 || ^17.0.0-0 || ^18 || ^18.0.0-0 || ^19 || ^19.0.0-0", - "react-dom": "^17.0.2 || ^17.0.2-0 || ^18 || ^18.0.0-0 || ^19 || ^19.0.0-0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@mux/mux-video": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@mux/mux-video/-/mux-video-0.22.0.tgz", - "integrity": "sha512-VrY4AVc6KkQcG0EPOtHf7aGXFwO1DTLZKtRRdPCx0KWSAlwR1II5YnHcEAwPbi1Uv94Hykq3Lbjt5dLqRNXKtA==", - "license": "MIT", - "dependencies": { - "@mux/playback-core": "0.27.0", - "castable-video": "~1.1.0", - "custom-media-element": "~1.3.1", - "media-tracks": "~0.3.2" - } - }, - "node_modules/@mux/playback-core": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@mux/playback-core/-/playback-core-0.27.0.tgz", - "integrity": "sha512-9kzpGRJNXLNMfFV6hvOde2+Uy3HyllwwEt9H5r4gYXOmrivQ6IWIGr9nXrUy7fmNkx6H05W+96zt1GhtBTlSDQ==", - "license": "MIT", - "dependencies": { - "hls.js": "~1.5.11", - "mux-embed": "^5.3.1" - } - }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@paralleldrive/cuid2": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", - "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "^1.1.5" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz", - "integrity": "sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==", - "license": "MIT", - "dependencies": { - "ansi-html": "^0.0.9", - "core-js-pure": "^3.23.3", - "error-stack-parser": "^2.0.6", - "html-entities": "^2.1.0", - "loader-utils": "^2.0.4", - "schema-utils": "^4.2.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">= 10.13" - }, - "peerDependencies": { - "@types/webpack": "4.x || 5.x", - "react-refresh": ">=0.10.0 <1.0.0", - "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <5.0.0", - "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x || 5.x", - "webpack-hot-middleware": "2.x", - "webpack-plugin-serve": "0.x || 1.x" - }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - }, - "sockjs-client": { - "optional": true - }, - "type-fest": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - }, - "webpack-hot-middleware": { - "optional": true - }, - "webpack-plugin-serve": { - "optional": true - } - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "license": "MIT", - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "license": "MIT", - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "license": "ISC" - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", - "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", - "license": "MIT", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "license": "MIT" - }, - "node_modules/@radix-ui/number": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz", - "integrity": "sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/@radix-ui/primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", - "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/@radix-ui/react-accordion": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.1.2.tgz", - "integrity": "sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collapsible": "1.0.3", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-alert-dialog": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.0.5.tgz", - "integrity": "sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-dialog": "1.0.5", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", - "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.0.4.tgz", - "integrity": "sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.0.4.tgz", - "integrity": "sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1", - "@radix-ui/react-use-previous": "1.0.1", - "@radix-ui/react-use-size": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collapsible": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.0.3.tgz", - "integrity": "sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", - "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", - "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", - "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz", - "integrity": "sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.4", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-portal": "1.0.4", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2", - "@radix-ui/react-use-controllable-state": "1.0.1", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/react-remove-scroll": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", - "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.3", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz", - "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz", - "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-escape-keydown": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.6.tgz", - "integrity": "sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-menu": "2.0.6", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", - "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz", - "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", - "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.0.6.tgz", - "integrity": "sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.4", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-popper": "1.1.3", - "@radix-ui/react-portal": "1.0.4", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-roving-focus": "1.0.4", - "@radix-ui/react-slot": "1.0.2", - "@radix-ui/react-use-callback-ref": "1.0.1", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu/node_modules/react-remove-scroll": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", - "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.3", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.7.tgz", - "integrity": "sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.4", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-popper": "1.1.3", - "@radix-ui/react-portal": "1.0.4", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2", - "@radix-ui/react-use-controllable-state": "1.0.1", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/react-remove-scroll": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", - "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.3", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.3.tgz", - "integrity": "sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1", - "@radix-ui/react-use-rect": "1.0.1", - "@radix-ui/react-use-size": "1.0.1", - "@radix-ui/rect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz", - "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz", - "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", - "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-slot": "1.0.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.0.3.tgz", - "integrity": "sha512-5G6Om/tYSxjSeEdrb1VfKkfZfn/1IlPWd731h2RfPuSbIfNUgfqAwbKfJCg/PP6nuUCTrYzalwHSpSinoWoCag==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-radio-group": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.1.3.tgz", - "integrity": "sha512-x+yELayyefNeKeTx4fjK6j99Fs6c4qKm3aY38G3swQVTN6xMpsrbigC0uHs2L//g8q4qR7qOcww8430jJmi2ag==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-roving-focus": "1.0.4", - "@radix-ui/react-use-controllable-state": "1.0.1", - "@radix-ui/react-use-previous": "1.0.1", - "@radix-ui/react-use-size": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz", - "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-scroll-area": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.5.tgz", - "integrity": "sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/number": "1.0.1", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-separator": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.0.3.tgz", - "integrity": "sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", - "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-switch": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.0.3.tgz", - "integrity": "sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1", - "@radix-ui/react-use-previous": "1.0.1", - "@radix-ui/react-use-size": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.0.4.tgz", - "integrity": "sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-roving-focus": "1.0.4", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.0.3.tgz", - "integrity": "sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle-group": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.4.tgz", - "integrity": "sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-roving-focus": "1.0.4", - "@radix-ui/react-toggle": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toolbar": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.0.4.tgz", - "integrity": "sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-roving-focus": "1.0.4", - "@radix-ui/react-separator": "1.0.3", - "@radix-ui/react-toggle-group": "1.0.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.7.tgz", - "integrity": "sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-popper": "1.1.3", - "@radix-ui/react-portal": "1.0.4", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2", - "@radix-ui/react-use-controllable-state": "1.0.1", - "@radix-ui/react-visually-hidden": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", - "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", - "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", - "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", - "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz", - "integrity": "sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz", - "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/rect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz", - "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz", - "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz", - "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/@react-dnd/asap": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.2.tgz", - "integrity": "sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==", - "license": "MIT" - }, - "node_modules/@react-dnd/invariant": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.2.tgz", - "integrity": "sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==", - "license": "MIT" - }, - "node_modules/@react-dnd/shallowequal": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz", - "integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==", - "license": "MIT" - }, - "node_modules/@reduxjs/toolkit": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", - "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", - "license": "MIT", - "dependencies": { - "immer": "^9.0.21", - "redux": "^4.2.1", - "redux-thunk": "^2.4.2", - "reselect": "^4.1.8" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18", - "react-redux": "^7.2.1 || ^8.0.2" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-redux": { - "optional": true - } - } - }, - "node_modules/@remix-run/router": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", - "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", - "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz", - "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz", - "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz", - "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz", - "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz", - "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz", - "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz", - "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz", - "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz", - "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz", - "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz", - "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz", - "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz", - "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz", - "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz", - "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz", - "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz", - "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz", - "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz", - "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rushstack/node-core-library": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.13.0.tgz", - "integrity": "sha512-IGVhy+JgUacAdCGXKUrRhwHMTzqhWwZUI+qEPcdzsb80heOw0QPbhhoVsoiMF7Klp8eYsp7hzpScMXmOa3Uhfg==", - "license": "MIT", - "dependencies": { - "ajv": "~8.13.0", - "ajv-draft-04": "~1.0.0", - "ajv-formats": "~3.0.1", - "fs-extra": "~11.3.0", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.22.1", - "semver": "~7.5.4" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@rushstack/node-core-library/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@rushstack/node-core-library/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@rushstack/terminal": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.15.2.tgz", - "integrity": "sha512-7Hmc0ysK5077R/IkLS9hYu0QuNafm+TbZbtYVzCMbeOdMjaRboLKrhryjwZSRJGJzu+TV1ON7qZHeqf58XfLpA==", - "license": "MIT", - "dependencies": { - "@rushstack/node-core-library": "5.13.0", - "supports-color": "~8.1.1" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@rushstack/terminal/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@rushstack/ts-command-line": { - "version": "4.23.7", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.7.tgz", - "integrity": "sha512-Gr9cB7DGe6uz5vq2wdr89WbVDKz0UeuFEn5H2CfWDe7JvjFFaiV15gi6mqDBTbHhHCWS7w8mF1h3BnIfUndqdA==", - "license": "MIT", - "dependencies": { - "@rushstack/terminal": "0.15.2", - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "string-argv": "~0.3.1" - } - }, - "node_modules/@rushstack/ts-command-line/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@rushstack/ts-command-line/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, - "node_modules/@simov/deep-extend": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@simov/deep-extend/-/deep-extend-1.0.0.tgz", - "integrity": "sha512-Arv8/ZPcdKAMJnNF8cks35mPq1y3JnwH1lWpfWDKlJoj+Vw2xmA4+oL7m9GVHTgdX0mGFR7bCPTBTGbxhnfJJw==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sindresorhus/slugify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-1.1.0.tgz", - "integrity": "sha512-ujZRbmmizX26yS/HnB3P9QNlNa4+UvHh+rIse3RbOXLp8yl6n1TxB4t7NHggtVgS8QmmOtzXo48kCxZGACpkPw==", - "license": "MIT", - "dependencies": { - "@sindresorhus/transliterate": "^0.1.1", - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sindresorhus/transliterate": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-0.1.2.tgz", - "integrity": "sha512-5/kmIOY9FF32nicXH+5yLNTX4NJ4atl7jRgqAJuIn/iyDFXBktOKDxCvyGE/EzmF4ngSUvjXxQUQlQiZ5lfw+w==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0", - "lodash.deburr": "^4.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sindresorhus/transliterate/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@strapi/admin": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/admin/-/admin-5.13.0.tgz", - "integrity": "sha512-aapj2WtabFlEq9ie4n5f8wlXiRr++iJORkwUdal+FNxsAwt3CDFsBK7ahmb+yNMpaura3/heABV+MW7q01I0hA==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@casl/ability": "6.5.0", - "@internationalized/date": "3.5.4", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-toolbar": "1.0.4", - "@reduxjs/toolkit": "1.9.7", - "@strapi/design-system": "2.0.0-rc.23", - "@strapi/icons": "2.0.0-rc.23", - "@strapi/permissions": "5.13.0", - "@strapi/types": "5.13.0", - "@strapi/typescript-utils": "5.13.0", - "@strapi/utils": "5.13.0", - "@testing-library/dom": "10.1.0", - "@testing-library/react": "15.0.7", - "@testing-library/user-event": "14.5.2", - "axios": "1.8.4", - "bcryptjs": "2.4.3", - "boxen": "5.1.2", - "chalk": "^4.1.2", - "codemirror5": "npm:codemirror@^5.65.11", - "cross-env": "^7.0.3", - "date-fns": "2.30.0", - "execa": "5.1.1", - "fast-deep-equal": "3.1.3", - "formik": "2.4.5", - "fractional-indexing": "3.2.0", - "fs-extra": "11.2.0", - "highlight.js": "^10.4.1", - "immer": "9.0.21", - "inquirer": "8.2.5", - "invariant": "^2.2.4", - "is-localhost-ip": "2.0.0", - "jsonwebtoken": "9.0.0", - "koa": "2.15.4", - "koa-compose": "4.1.0", - "koa-passport": "6.0.0", - "koa-static": "5.0.0", - "koa2-ratelimit": "^1.1.3", - "lodash": "4.17.21", - "node-schedule": "2.1.1", - "ora": "5.4.1", - "p-map": "4.0.0", - "passport-local": "1.0.0", - "pluralize": "8.0.0", - "punycode": "2.3.1", - "qs": "6.11.1", - "react-dnd": "16.0.1", - "react-dnd-html5-backend": "16.0.1", - "react-intl": "6.6.2", - "react-is": "^18.2.0", - "react-query": "3.39.3", - "react-redux": "8.1.3", - "react-select": "5.8.0", - "react-window": "1.8.10", - "rimraf": "5.0.5", - "sanitize-html": "2.13.0", - "scheduler": "0.23.0", - "semver": "7.5.4", - "sift": "16.0.1", - "typescript": "5.4.4", - "use-context-selector": "1.4.1", - "yup": "0.32.9", - "zod": "^3.22.4" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - }, - "peerDependencies": { - "@strapi/data-transfer": "^5.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.0.0", - "styled-components": "^6.0.0" - } - }, - "node_modules/@strapi/admin/node_modules/typescript": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", - "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@strapi/admin/node_modules/use-context-selector": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/use-context-selector/-/use-context-selector-1.4.1.tgz", - "integrity": "sha512-Io2ArvcRO+6MWIhkdfMFt+WKQX+Vb++W8DS2l03z/Vw/rz3BclKpM0ynr4LYGyU85Eke+Yx5oIhTY++QR0ZDoA==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": "*", - "react-native": "*", - "scheduler": ">=0.19.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@strapi/cloud-cli": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/cloud-cli/-/cloud-cli-5.13.0.tgz", - "integrity": "sha512-qouQ+9A2vsNOR9PIKdkVBChYwBu4+98jlKVbWAwN3yVvvcEdNeymFJq7wxsMGSiT7/5THf1zSmUneI6atG7xFw==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@strapi/utils": "5.13.0", - "axios": "1.8.4", - "boxen": "5.1.2", - "chalk": "4.1.2", - "cli-progress": "3.12.0", - "commander": "8.3.0", - "eventsource": "2.0.2", - "fast-safe-stringify": "2.1.1", - "fs-extra": "11.2.0", - "inquirer": "8.2.5", - "jsonwebtoken": "9.0.0", - "jwks-rsa": "3.1.0", - "lodash": "4.17.21", - "minimatch": "9.0.3", - "open": "8.4.0", - "ora": "5.4.1", - "pkg-up": "3.1.0", - "tar": "6.2.1", - "xdg-app-paths": "8.3.0", - "yup": "0.32.9" - }, - "bin": { - "cloud-cli": "bin/index.js" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - } - }, - "node_modules/@strapi/content-manager": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/content-manager/-/content-manager-5.13.0.tgz", - "integrity": "sha512-DqvqLFLOUHmU+9WdhQUIwC5AVuR3fcrw/XV/lJPDnAU09h/fo9RwCNedc0XqY69wnh5C7rYsLh/bedK+lz9bIA==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@radix-ui/react-toolbar": "1.0.4", - "@reduxjs/toolkit": "1.9.7", - "@sindresorhus/slugify": "1.1.0", - "@strapi/design-system": "2.0.0-rc.23", - "@strapi/icons": "2.0.0-rc.23", - "@strapi/types": "5.13.0", - "@strapi/utils": "5.13.0", - "codemirror5": "npm:codemirror@^5.65.11", - "date-fns": "2.30.0", - "fractional-indexing": "3.2.0", - "highlight.js": "^10.4.1", - "immer": "9.0.21", - "koa": "2.15.4", - "lodash": "4.17.21", - "markdown-it": "^13.0.2", - "markdown-it-abbr": "^1.0.4", - "markdown-it-container": "^3.0.0", - "markdown-it-deflist": "^2.1.0", - "markdown-it-emoji": "^2.0.0", - "markdown-it-footnote": "^3.0.3", - "markdown-it-ins": "^3.0.1", - "markdown-it-mark": "^3.0.1", - "markdown-it-sub": "^1.0.0", - "markdown-it-sup": "1.0.0", - "node-schedule": "2.1.1", - "prismjs": "1.30.0", - "qs": "6.11.1", - "react-dnd": "16.0.1", - "react-dnd-html5-backend": "16.0.1", - "react-helmet": "^6.1.0", - "react-intl": "6.6.2", - "react-query": "3.39.3", - "react-redux": "8.1.3", - "react-window": "1.8.10", - "sanitize-html": "2.13.0", - "slate": "0.94.1", - "slate-history": "0.93.0", - "slate-react": "0.98.3", - "yup": "0.32.9" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - }, - "peerDependencies": { - "@strapi/admin": "^5.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.0.0", - "styled-components": "^6.0.0" - } - }, - "node_modules/@strapi/content-releases": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/content-releases/-/content-releases-5.13.0.tgz", - "integrity": "sha512-10BsJP5jMwHf47yhLEFlAdDr3urck3oQpCQRSvCApzbNbLYhxMNn4nS+vqGfgkH0PCOD8SVoQAGPG3IbDdXqUg==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@reduxjs/toolkit": "1.9.7", - "@strapi/database": "5.13.0", - "@strapi/design-system": "2.0.0-rc.23", - "@strapi/icons": "2.0.0-rc.23", - "@strapi/types": "5.13.0", - "@strapi/utils": "5.13.0", - "date-fns": "2.30.0", - "date-fns-tz": "2.0.1", - "formik": "2.4.5", - "lodash": "4.17.21", - "node-schedule": "2.1.1", - "qs": "6.11.1", - "react-intl": "6.6.2", - "react-redux": "8.1.3", - "yup": "0.32.9" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - }, - "peerDependencies": { - "@strapi/admin": "^5.0.0", - "@strapi/content-manager": "^5.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.0.0", - "styled-components": "^6.0.0" - } - }, - "node_modules/@strapi/content-type-builder": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/content-type-builder/-/content-type-builder-5.13.0.tgz", - "integrity": "sha512-NBwrF2XBA2VbqM9olLShVbuk5X902TXHNaiCy64Dxi+rWafZ7flkMsygkwyNEfecnUbF1L6wpgnrC00CR60j0A==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@reduxjs/toolkit": "1.9.7", - "@sindresorhus/slugify": "1.1.0", - "@strapi/design-system": "2.0.0-rc.23", - "@strapi/generators": "5.13.0", - "@strapi/icons": "2.0.0-rc.23", - "@strapi/utils": "5.13.0", - "date-fns": "2.30.0", - "fs-extra": "11.2.0", - "immer": "9.0.21", - "lodash": "4.17.21", - "pluralize": "8.0.0", - "qs": "6.11.1", - "react-intl": "6.6.2", - "react-redux": "8.1.3", - "yup": "0.32.9" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - }, - "peerDependencies": { - "@strapi/admin": "^5.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.0.0", - "styled-components": "^6.0.0" - } - }, - "node_modules/@strapi/core": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/core/-/core-5.13.0.tgz", - "integrity": "sha512-5kDKiBKSwO5mkQpyfeUtuL/BLpSBqZW4fcpSLB7ndHkztsk/2GnFS1ct8RskL8SufxLpDbpxKi5qQr23650Aqg==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@koa/cors": "5.0.0", - "@koa/router": "12.0.2", - "@paralleldrive/cuid2": "2.2.2", - "@strapi/admin": "5.13.0", - "@strapi/database": "5.13.0", - "@strapi/generators": "5.13.0", - "@strapi/logger": "5.13.0", - "@strapi/permissions": "5.13.0", - "@strapi/types": "5.13.0", - "@strapi/typescript-utils": "5.13.0", - "@strapi/utils": "5.13.0", - "bcryptjs": "2.4.3", - "boxen": "5.1.2", - "chalk": "4.1.2", - "ci-info": "4.0.0", - "cli-table3": "0.6.2", - "commander": "8.3.0", - "configstore": "5.0.1", - "copyfiles": "2.4.1", - "debug": "4.3.4", - "delegates": "1.0.0", - "dotenv": "16.4.5", - "execa": "5.1.1", - "fs-extra": "11.2.0", - "glob": "10.3.10", - "global-agent": "3.0.0", - "http-errors": "2.0.0", - "inquirer": "8.2.5", - "is-docker": "2.2.1", - "koa": "2.15.4", - "koa-body": "6.0.1", - "koa-compose": "4.1.0", - "koa-compress": "5.1.1", - "koa-favicon": "2.1.0", - "koa-helmet": "7.0.2", - "koa-ip": "^2.1.3", - "koa-session": "6.4.0", - "koa-static": "5.0.0", - "lodash": "4.17.21", - "mime-types": "2.1.35", - "node-schedule": "2.1.1", - "open": "8.4.0", - "ora": "5.4.1", - "package-json": "7.0.0", - "pkg-up": "3.1.0", - "qs": "6.11.1", - "resolve.exports": "2.0.2", - "semver": "7.5.4", - "statuses": "2.0.1", - "typescript": "5.4.4", - "undici": "6.21.2", - "yup": "0.32.9" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - } - }, - "node_modules/@strapi/core/node_modules/ci-info": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", - "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@strapi/core/node_modules/cli-table3": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", - "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/@strapi/core/node_modules/typescript": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", - "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@strapi/data-transfer": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/data-transfer/-/data-transfer-5.13.0.tgz", - "integrity": "sha512-zx+q50R+/QWNJo8VxBwWFwT11+pG9G+8yIldUoFoW71SL+htXSk8UKuGitZ80huMPD4TbwXa+UCrja6J8vZHPw==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@strapi/logger": "5.13.0", - "@strapi/types": "5.13.0", - "@strapi/utils": "5.13.0", - "chalk": "4.1.2", - "cli-table3": "0.6.5", - "commander": "8.3.0", - "fs-extra": "11.2.0", - "inquirer": "8.2.5", - "lodash": "4.17.21", - "ora": "5.4.1", - "resolve-cwd": "3.0.0", - "semver": "7.5.4", - "stream-chain": "2.2.5", - "stream-json": "1.8.0", - "tar": "6.2.1", - "tar-stream": "2.2.0", - "ws": "8.17.1" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - } - }, - "node_modules/@strapi/database": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/database/-/database-5.13.0.tgz", - "integrity": "sha512-jkouPxhDZaOBSKVqVEBFoKY68WVE7YV63+kFsWMIi1mjbghqG+HeLHgCE7nCxRydZYnbxrBo3H2Rj09pMUPNIw==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@paralleldrive/cuid2": "2.2.2", - "@strapi/utils": "5.13.0", - "ajv": "8.16.0", - "date-fns": "2.30.0", - "debug": "4.3.4", - "fs-extra": "11.2.0", - "knex": "3.0.1", - "lodash": "4.17.21", - "semver": "7.5.4", - "umzug": "3.8.1" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - } - }, - "node_modules/@strapi/design-system": { - "version": "2.0.0-rc.23", - "resolved": "https://registry.npmjs.org/@strapi/design-system/-/design-system-2.0.0-rc.23.tgz", - "integrity": "sha512-PXWVlNqA4GDPxx8B2r7LFuQtWgGgjnPXnCOZhynpqqEVVcFkrYmRCPALFhHPD4J3hpEadlUinvlcisMymVviUw==", - "license": "MIT", - "dependencies": { - "@codemirror/lang-json": "6.0.1", - "@floating-ui/react-dom": "2.1.0", - "@internationalized/date": "3.5.4", - "@internationalized/number": "3.5.3", - "@radix-ui/react-accordion": "1.1.2", - "@radix-ui/react-alert-dialog": "1.0.5", - "@radix-ui/react-avatar": "1.0.4", - "@radix-ui/react-checkbox": "1.0.4", - "@radix-ui/react-dialog": "1.0.5", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-dropdown-menu": "2.0.6", - "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.4", - "@radix-ui/react-popover": "1.0.7", - "@radix-ui/react-progress": "1.0.3", - "@radix-ui/react-radio-group": "1.1.3", - "@radix-ui/react-scroll-area": "1.0.5", - "@radix-ui/react-switch": "1.0.3", - "@radix-ui/react-tabs": "1.0.4", - "@radix-ui/react-tooltip": "1.0.7", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@strapi/ui-primitives": "2.0.0-rc.23", - "@uiw/react-codemirror": "4.22.2", - "lodash": "4.17.21", - "react-remove-scroll": "2.5.10" - }, - "peerDependencies": { - "@strapi/icons": "^2.0.0 || ^2.0.0-beta || ^2.0.0-alpha", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "styled-components": "^6.0.0" - } - }, - "node_modules/@strapi/email": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/email/-/email-5.13.0.tgz", - "integrity": "sha512-1lyxvZqEx2DyG0FbDKM66vdXcOHWWrSOf9iu4bq2E2qkwfNEUAdZtqL6uJexLxVx7AjxvoOD2cooTyJItPSqtA==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@strapi/design-system": "2.0.0-rc.23", - "@strapi/icons": "2.0.0-rc.23", - "@strapi/provider-email-sendmail": "5.13.0", - "@strapi/utils": "5.13.0", - "koa2-ratelimit": "^1.1.3", - "lodash": "4.17.21", - "react-intl": "6.6.2", - "react-query": "3.39.3", - "yup": "0.32.9" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - }, - "peerDependencies": { - "@strapi/admin": "^5.0.0", - "koa": "^2.15.2", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.0.0", - "styled-components": "^6.0.0" - } - }, - "node_modules/@strapi/generators": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/generators/-/generators-5.13.0.tgz", - "integrity": "sha512-zRQcQ9PAYcnPPsQc1Ux+dobVrDFE/Kby3thUxeRAp4MA16F4pY/unTufK3gtVk9/6+iwVOStUw1LwdCXdSj5Wg==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@sindresorhus/slugify": "1.1.0", - "@strapi/typescript-utils": "5.13.0", - "@strapi/utils": "5.13.0", - "chalk": "4.1.2", - "copyfiles": "2.4.1", - "fs-extra": "11.2.0", - "node-plop": "0.26.3", - "plop": "4.0.1", - "pluralize": "8.0.0" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - } - }, - "node_modules/@strapi/i18n": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/i18n/-/i18n-5.13.0.tgz", - "integrity": "sha512-H+ScummSJ34LvKPE09j8cExjIMtT2vnECUGAyFkoBDjnhnRQ2Y+2ak26O/2bdKjFe2m285T71QCZKqe+rLLVNw==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@reduxjs/toolkit": "1.9.7", - "@strapi/design-system": "2.0.0-rc.23", - "@strapi/icons": "2.0.0-rc.23", - "@strapi/utils": "5.13.0", - "lodash": "4.17.21", - "qs": "6.11.1", - "react-intl": "6.6.2", - "react-redux": "8.1.3", - "yup": "0.32.9" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - }, - "peerDependencies": { - "@strapi/admin": "^5.0.0", - "@strapi/content-manager": "^5.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.0.0", - "styled-components": "^6.0.0" - } - }, - "node_modules/@strapi/icons": { - "version": "2.0.0-rc.23", - "resolved": "https://registry.npmjs.org/@strapi/icons/-/icons-2.0.0-rc.23.tgz", - "integrity": "sha512-sJ7iQ8kZ28z3mTkDm/gnsWIQljK3w0UaOk2irO77iSmbh+uR3W9gDF5CP/4Z+KDUqnjDke2kaOIPRI67etvi9A==", - "license": "MIT", - "peerDependencies": { - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "styled-components": "^6.0.0" - } - }, - "node_modules/@strapi/logger": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/logger/-/logger-5.13.0.tgz", - "integrity": "sha512-0kgmTxhbh5y6mRPZXiDqlC/YI7JJOAU7kjzW4DGsvwsBwLeRK2M3AUoRJcXCHl7r6H0ghDE4rCfB0AZfzCWksA==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "lodash": "4.17.21", - "winston": "3.10.0" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - } - }, - "node_modules/@strapi/permissions": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/permissions/-/permissions-5.13.0.tgz", - "integrity": "sha512-ChP6uOpNC6i/tKRL+DYoy6OmQSNHfBSqNUWzL1N2EmydB7Vc8Bz6CxkAaCiC6UHO8d4fH+M4Kqkf1eYQ2Q7xoA==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@casl/ability": "6.5.0", - "@strapi/utils": "5.13.0", - "lodash": "4.17.21", - "qs": "6.11.1", - "sift": "16.0.1" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - } - }, - "node_modules/@strapi/plugin-cloud": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/plugin-cloud/-/plugin-cloud-5.13.0.tgz", - "integrity": "sha512-FWU8SJJIHyFyMzC5WLgRTHSPcsjGritgJqKtqqlNPXXmxY+nVKYP27zs8HqDsbo9Ctmxqt8F4KwquK4BF8i1Mw==", - "license": "MIT", - "dependencies": { - "@strapi/design-system": "2.0.0-rc.23", - "@strapi/icons": "2.0.0-rc.23", - "react-intl": "6.6.2" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - }, - "peerDependencies": { - "@strapi/strapi": "^5.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.0.0", - "styled-components": "^6.0.0" - } - }, - "node_modules/@strapi/plugin-users-permissions": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/plugin-users-permissions/-/plugin-users-permissions-5.13.0.tgz", - "integrity": "sha512-WOI08EYmY7E6McCVWIJTajOUaOE4tOo/+N8Zn3pK+miTBmAzzeFmrtEv7TwQD12SdZBnVHvxhmL/ekL3JMDrJw==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@strapi/design-system": "2.0.0-rc.23", - "@strapi/icons": "2.0.0-rc.23", - "@strapi/utils": "5.13.0", - "bcryptjs": "2.4.3", - "formik": "2.4.5", - "grant": "^5.4.8", - "immer": "9.0.21", - "jsonwebtoken": "9.0.0", - "jwk-to-pem": "2.0.5", - "koa": "2.15.4", - "koa2-ratelimit": "^1.1.3", - "lodash": "4.17.21", - "prop-types": "^15.8.1", - "purest": "4.0.2", - "react-intl": "6.6.2", - "react-query": "3.39.3", - "react-redux": "8.1.3", - "url-join": "4.0.1", - "yup": "0.32.9" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - }, - "peerDependencies": { - "@strapi/strapi": "^5.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.0.0", - "styled-components": "^6.0.0" - } - }, - "node_modules/@strapi/provider-email-sendmail": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/provider-email-sendmail/-/provider-email-sendmail-5.13.0.tgz", - "integrity": "sha512-lnXGp1RuhsnM6/t5+GSHcypL0LqXFcljx55Eg2v5R43VykZaYiJciqhiX38q1R/CDOoC7RRdQD9jlVUyjBSUNQ==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@strapi/utils": "5.13.0", - "sendmail": "^1.6.1" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - } - }, - "node_modules/@strapi/provider-upload-local": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/provider-upload-local/-/provider-upload-local-5.13.0.tgz", - "integrity": "sha512-Re4DDF+LXqik5dHNYtA9iVofNsogi//mmWP65/6RA7qRWnXSz18UtbHSbA4BfmyHFICldpmmuwkzep46h2rJmw==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@strapi/utils": "5.13.0", - "fs-extra": "11.2.0" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - } - }, - "node_modules/@strapi/review-workflows": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/review-workflows/-/review-workflows-5.13.0.tgz", - "integrity": "sha512-QMBVRkZvhIQekdD2fcCjK/7Y/AXQXXyzGnPddCMwkI3fWnxTPxQNkbHVVcvXFAQUZSj/S4yZGHO7qtpHSd7ryQ==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@reduxjs/toolkit": "1.9.7", - "@strapi/design-system": "2.0.0-rc.23", - "@strapi/icons": "2.0.0-rc.23", - "@strapi/utils": "5.13.0", - "fractional-indexing": "3.2.0", - "react-dnd": "16.0.1", - "react-dnd-html5-backend": "16.0.1", - "react-helmet": "^6.1.0", - "react-intl": "6.6.2", - "react-redux": "8.1.3", - "yup": "0.32.9" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - }, - "peerDependencies": { - "@strapi/admin": "^5.0.0", - "@strapi/content-manager": "^5.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.0.0", - "styled-components": "^6.0.0" - } - }, - "node_modules/@strapi/strapi": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/strapi/-/strapi-5.13.0.tgz", - "integrity": "sha512-1Yr42A5MCNrkUnJhIP0drYqidOLzVed3HGbmBQwQvzQuXWKzjnSapclrUN++uReqQmIWlri2XbaPnhhuz8eAwA==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@pmmmwh/react-refresh-webpack-plugin": "0.5.15", - "@strapi/admin": "5.13.0", - "@strapi/cloud-cli": "5.13.0", - "@strapi/content-manager": "5.13.0", - "@strapi/content-releases": "5.13.0", - "@strapi/content-type-builder": "5.13.0", - "@strapi/core": "5.13.0", - "@strapi/data-transfer": "5.13.0", - "@strapi/database": "5.13.0", - "@strapi/email": "5.13.0", - "@strapi/generators": "5.13.0", - "@strapi/i18n": "5.13.0", - "@strapi/logger": "5.13.0", - "@strapi/permissions": "5.13.0", - "@strapi/review-workflows": "5.13.0", - "@strapi/types": "5.13.0", - "@strapi/typescript-utils": "5.13.0", - "@strapi/upload": "5.13.0", - "@strapi/utils": "5.13.0", - "@types/nodemon": "1.19.6", - "@vitejs/plugin-react-swc": "3.6.0", - "boxen": "5.1.2", - "browserslist": "^4.23.0", - "browserslist-to-esbuild": "1.2.0", - "chalk": "4.1.2", - "chokidar": "3.6.0", - "ci-info": "3.8.0", - "cli-progress": "3.12.0", - "cli-table3": "0.6.5", - "commander": "8.3.0", - "concurrently": "8.2.2", - "copyfiles": "2.4.1", - "css-loader": "^6.10.0", - "dotenv": "16.4.5", - "esbuild-loader": "4.3.0", - "esbuild-register": "3.5.0", - "execa": "5.1.1", - "fork-ts-checker-webpack-plugin": "8.0.0", - "fs-extra": "11.2.0", - "get-latest-version": "5.1.0", - "git-url-parse": "14.0.0", - "html-webpack-plugin": "5.6.0", - "inquirer": "8.2.5", - "lodash": "4.17.21", - "mini-css-extract-plugin": "2.7.7", - "nodemon": "3.0.2", - "ora": "5.4.1", - "outdent": "0.8.0", - "pkg-up": "3.1.0", - "prettier": "3.3.3", - "react-refresh": "0.14.0", - "read-pkg-up": "7.0.1", - "resolve-from": "5.0.0", - "semver": "7.5.4", - "style-loader": "3.3.4", - "typescript": "5.4.4", - "vite": "5.4.17", - "webpack": "^5.90.3", - "webpack-bundle-analyzer": "^4.10.1", - "webpack-dev-middleware": "6.1.2", - "webpack-hot-middleware": "2.26.1", - "yalc": "1.0.0-pre.53", - "yup": "0.32.9" - }, - "bin": { - "strapi": "bin/strapi.js" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - }, - "peerDependencies": { - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.0.0", - "styled-components": "^6.0.0" - } - }, - "node_modules/@strapi/strapi/node_modules/typescript": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", - "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@strapi/types": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/types/-/types-5.13.0.tgz", - "integrity": "sha512-ylbIl3PAXwnTSNhlM4a/o90xNN2kEfRnd/o+RaIGXf/xIrLSrQQigH6EmVcxhAiSd6UH0Tpjcyyjk0C2BPprUQ==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@casl/ability": "6.5.0", - "@koa/cors": "5.0.0", - "@koa/router": "12.0.2", - "@strapi/database": "5.13.0", - "@strapi/logger": "5.13.0", - "@strapi/permissions": "5.13.0", - "@strapi/utils": "5.13.0", - "commander": "8.3.0", - "koa": "2.15.4", - "koa-body": "6.0.1", - "node-schedule": "2.1.1", - "typedoc": "0.25.10", - "typedoc-github-wiki-theme": "1.1.0", - "typedoc-plugin-markdown": "3.17.1" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - } - }, - "node_modules/@strapi/types/node_modules/typedoc": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.10.tgz", - "integrity": "sha512-v10rtOFojrjW9og3T+6wAKeJaGMuojU87DXGZ33sfs+554wgPTRG+s07Ag1BjPZI85Y5QPVouPI63JQ6fcQM5w==", - "license": "Apache-2.0", - "dependencies": { - "lunr": "^2.3.9", - "marked": "^4.3.0", - "minimatch": "^9.0.3", - "shiki": "^0.14.7" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 16" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x" - } - }, - "node_modules/@strapi/types/node_modules/typedoc-github-wiki-theme": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/typedoc-github-wiki-theme/-/typedoc-github-wiki-theme-1.1.0.tgz", - "integrity": "sha512-VyFmz8ZV2j/qEsCjD5EtR6FgZsCoy64Zr6SS9kCTcq7zx69Cx4UJBx8Ga/naxqs08TDggE6myIfODY6awwAGcA==", - "license": "MIT", - "peerDependencies": { - "typedoc": ">=0.24.0", - "typedoc-plugin-markdown": ">=3.15.0" - } - }, - "node_modules/@strapi/types/node_modules/typedoc-plugin-markdown": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.17.1.tgz", - "integrity": "sha512-QzdU3fj0Kzw2XSdoL15ExLASt2WPqD7FbLeaqwT70+XjKyTshBnUlQA5nNREO1C2P8Uen0CDjsBLMsCQ+zd0lw==", - "license": "MIT", - "dependencies": { - "handlebars": "^4.7.7" - }, - "peerDependencies": { - "typedoc": ">=0.24.0" - } - }, - "node_modules/@strapi/types/node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@strapi/typescript-utils": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/typescript-utils/-/typescript-utils-5.13.0.tgz", - "integrity": "sha512-eyd3TfbaSaY88cT45PQ6pwr1FkncpJP0WYFiMco5KbecFevR0XKt0yF8PCDgSshNqWHhC0xnQJ/GuXrPkfNT6Q==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "chalk": "4.1.2", - "cli-table3": "0.6.5", - "fs-extra": "11.2.0", - "lodash": "4.17.21", - "prettier": "3.3.3", - "typescript": "5.4.4" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - } - }, - "node_modules/@strapi/typescript-utils/node_modules/typescript": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", - "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@strapi/ui-primitives": { - "version": "2.0.0-rc.23", - "resolved": "https://registry.npmjs.org/@strapi/ui-primitives/-/ui-primitives-2.0.0-rc.23.tgz", - "integrity": "sha512-YMH9z0k/aX8HYrq+sDCc5v2cPPqRBwgzQ/NxkzV1pvqvonKFgH3V3sQTXM3tStVkz4z4RuxB/lXoEZXGe/aVdg==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.0.1", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.4", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-popper": "1.1.3", - "@radix-ui/react-portal": "1.0.4", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2", - "@radix-ui/react-use-controllable-state": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1", - "@radix-ui/react-use-previous": "1.0.1", - "@radix-ui/react-visually-hidden": "1.0.3", - "aria-hidden": "1.2.4", - "react-remove-scroll": "2.5.10" - }, - "peerDependencies": { - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - } - }, - "node_modules/@strapi/upload": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/upload/-/upload-5.13.0.tgz", - "integrity": "sha512-+V7J4vw5j1AdDt8M2XEUWxbkO/3FHpGG3AbOzJb1phNRcl0LCeX4FPUc2UbnpGCA7V7d8RJwaHA6r9Ldvk1lwA==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@mux/mux-player-react": "3.1.0", - "@strapi/design-system": "2.0.0-rc.23", - "@strapi/icons": "2.0.0-rc.23", - "@strapi/provider-upload-local": "5.13.0", - "@strapi/utils": "5.13.0", - "byte-size": "8.1.1", - "cropperjs": "1.6.1", - "date-fns": "2.30.0", - "formik": "2.4.5", - "fs-extra": "11.2.0", - "immer": "9.0.21", - "koa-range": "0.3.0", - "koa-static": "5.0.0", - "lodash": "4.17.21", - "mime-types": "2.1.35", - "prop-types": "^15.8.1", - "qs": "6.11.1", - "react-dnd": "16.0.1", - "react-intl": "6.6.2", - "react-query": "3.39.3", - "react-redux": "8.1.3", - "react-select": "5.8.0", - "sharp": "0.33.5", - "yup": "0.32.9" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - }, - "peerDependencies": { - "@strapi/admin": "^5.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.0.0", - "styled-components": "^6.0.0" - } - }, - "node_modules/@strapi/utils": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@strapi/utils/-/utils-5.13.0.tgz", - "integrity": "sha512-SFUBgQKBu3VC6yY940D7GWHY7u1gXvfnx5dVGV1z5JIzIUeFRbipogrmfhJxAFxFdQSnfjLUsmwILOlLP4tucA==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@sindresorhus/slugify": "1.1.0", - "date-fns": "2.30.0", - "execa": "5.1.1", - "http-errors": "2.0.0", - "lodash": "4.17.21", - "node-machine-id": "1.1.12", - "p-map": "4.0.0", - "preferred-pm": "3.1.2", - "yup": "0.32.9", - "zod": "^3.22.4" - }, - "engines": { - "node": ">=18.0.0 <=22.x.x", - "npm": ">=6.0.0" - } - }, - "node_modules/@swc/core": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.24.tgz", - "integrity": "sha512-MaQEIpfcEMzx3VWWopbofKJvaraqmL6HbLlw2bFZ7qYqYw3rkhM0cQVEgyzbHtTWwCwPMFZSC2DUbhlZgrMfLg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.21" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.11.24", - "@swc/core-darwin-x64": "1.11.24", - "@swc/core-linux-arm-gnueabihf": "1.11.24", - "@swc/core-linux-arm64-gnu": "1.11.24", - "@swc/core-linux-arm64-musl": "1.11.24", - "@swc/core-linux-x64-gnu": "1.11.24", - "@swc/core-linux-x64-musl": "1.11.24", - "@swc/core-win32-arm64-msvc": "1.11.24", - "@swc/core-win32-ia32-msvc": "1.11.24", - "@swc/core-win32-x64-msvc": "1.11.24" - }, - "peerDependencies": { - "@swc/helpers": ">=0.5.17" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.24.tgz", - "integrity": "sha512-dhtVj0PC1APOF4fl5qT2neGjRLgHAAYfiVP8poJelhzhB/318bO+QCFWAiimcDoyMgpCXOhTp757gnoJJrheWA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.24.tgz", - "integrity": "sha512-H/3cPs8uxcj2Fe3SoLlofN5JG6Ny5bl8DuZ6Yc2wr7gQFBmyBkbZEz+sPVgsID7IXuz7vTP95kMm1VL74SO5AQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.24.tgz", - "integrity": "sha512-PHJgWEpCsLo/NGj+A2lXZ2mgGjsr96ULNW3+T3Bj2KTc8XtMUkE8tmY2Da20ItZOvPNC/69KroU7edyo1Flfbw==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.24.tgz", - "integrity": "sha512-C2FJb08+n5SD4CYWCTZx1uR88BN41ZieoHvI8A55hfVf2woT8+6ZiBzt74qW2g+ntZ535Jts5VwXAKdu41HpBg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.24.tgz", - "integrity": "sha512-ypXLIdszRo0re7PNNaXN0+2lD454G8l9LPK/rbfRXnhLWDBPURxzKlLlU/YGd2zP98wPcVooMmegRSNOKfvErw==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.24.tgz", - "integrity": "sha512-IM7d+STVZD48zxcgo69L0yYptfhaaE9cMZ+9OoMxirNafhKKXwoZuufol1+alEFKc+Wbwp+aUPe/DeWC/Lh3dg==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.24.tgz", - "integrity": "sha512-DZByJaMVzSfjQKKQn3cqSeqwy6lpMaQDQQ4HPlch9FWtDx/dLcpdIhxssqZXcR2rhaQVIaRQsCqwV6orSDGAGw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.24.tgz", - "integrity": "sha512-Q64Ytn23y9aVDKN5iryFi8mRgyHw3/kyjTjT4qFCa8AEb5sGUuSj//AUZ6c0J7hQKMHlg9do5Etvoe61V98/JQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.24.tgz", - "integrity": "sha512-9pKLIisE/Hh2vJhGIPvSoTK4uBSPxNVyXHmOrtdDot4E1FUUI74Vi8tFdlwNbaj8/vusVnb8xPXsxF1uB0VgiQ==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.24.tgz", - "integrity": "sha512-sybnXtOsdB+XvzVFlBVGgRHLqp3yRpHK7CrmpuDKszhj/QhmsaZzY/GHSeALlMtLup13M0gqbcQvsTNlAHTg3w==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "license": "Apache-2.0" - }, - "node_modules/@swc/helpers": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@swc/types": { - "version": "0.1.21", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.21.tgz", - "integrity": "sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==", - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@testing-library/dom": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.1.0.tgz", - "integrity": "sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@testing-library/react": { - "version": "15.0.7", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-15.0.7.tgz", - "integrity": "sha512-cg0RvEdD1TIhhkm1IeYMQxrzy0MtUNfa3minv4MjbgcYzJAZ7yD0i0lwoPOTPr+INtiXFezt2o8xMSnyHhEn2Q==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^10.0.0", - "@types/react-dom": "^18.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@testing-library/user-event": { - "version": "14.5.2", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", - "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", - "license": "MIT", - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "node_modules/@types/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/argparse": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", - "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", - "license": "MIT" - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "license": "MIT" - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/co-body": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@types/co-body/-/co-body-6.1.3.tgz", - "integrity": "sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/content-disposition": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz", - "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==", - "license": "MIT" - }, - "node_modules/@types/cookies": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz", - "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/express": "*", - "@types/keygrip": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "license": "MIT" - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/fined": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@types/fined/-/fined-1.1.5.tgz", - "integrity": "sha512-2N93vadEGDFhASTIRbizbl4bNqpMOId5zZfj6hHqYZfEzEfO9onnU4Im8xvzo8uudySDveDHBOOSlTWf38ErfQ==", - "license": "MIT" - }, - "node_modules/@types/follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/@types/follow-redirects/-/follow-redirects-1.14.4.tgz", - "integrity": "sha512-GWXfsD0Jc1RWiFmMuMFCpXMzi9L7oPDVwxUnZdg89kDNnqsRfUKXEtUYtA98A6lig1WXH/CYY/fvPW9HuN5fTA==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/formidable": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-2.0.6.tgz", - "integrity": "sha512-L4HcrA05IgQyNYJj6kItuIkXrInJvsXTPC5B1i64FggWKKqSL+4hgt7asiSNva75AoLQjq29oPxFfU4GAQ6Z2w==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "license": "MIT", - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz", - "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==", - "license": "MIT", - "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "license": "MIT" - }, - "node_modules/@types/http-assert": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.6.tgz", - "integrity": "sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==", - "license": "MIT" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "license": "MIT" - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "license": "MIT" - }, - "node_modules/@types/inquirer": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-6.5.0.tgz", - "integrity": "sha512-rjaYQ9b9y/VFGOpqBEXRavc3jh0a+e6evAbI31tMda8VlPaSy0AZJfXsvmIe3wklc7W6C3zCSfleuMXR7NOyXw==", - "license": "MIT", - "dependencies": { - "@types/through": "*", - "rxjs": "^6.4.0" - } - }, - "node_modules/@types/inquirer/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@types/inquirer/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@types/is-hotkey": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@types/is-hotkey/-/is-hotkey-0.1.10.tgz", - "integrity": "sha512-RvC8KMw5BCac1NvRRyaHgMMEtBaZ6wh0pyPTBu7izn4Sj/AX9Y4aXU5c7rX8PnM/knsuUpC1IeoBkANtxBypsQ==", - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.9.tgz", - "integrity": "sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==", - "license": "MIT", - "dependencies": { - "@types/ms": "*", - "@types/node": "*" - } - }, - "node_modules/@types/keygrip": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", - "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==", - "license": "MIT" - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/koa": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.15.0.tgz", - "integrity": "sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==", - "license": "MIT", - "dependencies": { - "@types/accepts": "*", - "@types/content-disposition": "*", - "@types/cookies": "*", - "@types/http-assert": "*", - "@types/http-errors": "*", - "@types/keygrip": "*", - "@types/koa-compose": "*", - "@types/node": "*" - } - }, - "node_modules/@types/koa-compose": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz", - "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", - "license": "MIT", - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/liftoff": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/liftoff/-/liftoff-4.0.3.tgz", - "integrity": "sha512-UgbL2kR5pLrWICvr8+fuSg0u43LY250q7ZMkC+XKC3E+rs/YBDEnQIzsnhU5dYsLlwMi3R75UvCL87pObP1sxw==", - "license": "MIT", - "dependencies": { - "@types/fined": "*", - "@types/node": "*" - } - }, - "node_modules/@types/lodash": { - "version": "4.17.16", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz", - "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==", - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "license": "MIT" - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.17.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.45.tgz", - "integrity": "sha512-vO9+E1smq+149wsmmLdM8SKVW7gRzLjfo0mU7kiykhV6rL+GEUhUmW7VywJNSxJHQzt9QBIHEo+3SG4MrFTqbA==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/nodemon": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/nodemon/-/nodemon-1.19.6.tgz", - "integrity": "sha512-vjKuaQOLUA5EY2zkUmWG1ipXbKt9Wd+H/0SiIuHVeH4cHtt6509iRUGH9ZR0iqgUrtj3BrP9KqoTuV3ZCbQcYA==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "license": "MIT" - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", - "license": "MIT" - }, - "node_modules/@types/qs": { - "version": "6.9.18", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", - "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.21", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.21.tgz", - "integrity": "sha512-gXLBtmlcRJeT09/sI4PxVwyrku6SaNUj/6cMubjE6T6XdY1fDmBL7r0nX0jbSZPU/Xr0KuwLLZh6aOYY5d91Xw==", - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.12", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", - "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/stylis": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", - "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", - "license": "MIT" - }, - "node_modules/@types/through": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", - "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT" - }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", - "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==", - "license": "MIT" - }, - "node_modules/@ucast/core": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@ucast/core/-/core-1.10.2.tgz", - "integrity": "sha512-ons5CwXZ/51wrUPfoduC+cO7AS1/wRb0ybpQJ9RrssossDxVy4t49QxWoWgfBDvVKsz9VXzBk9z0wqTdZ+Cq8g==", - "license": "Apache-2.0" - }, - "node_modules/@ucast/js": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@ucast/js/-/js-3.0.4.tgz", - "integrity": "sha512-TgG1aIaCMdcaEyckOZKQozn1hazE0w90SVdlpIJ/er8xVumE11gYAtSbw/LBeUnA4fFnFWTcw3t6reqseeH/4Q==", - "license": "Apache-2.0", - "dependencies": { - "@ucast/core": "^1.0.0" - } - }, - "node_modules/@ucast/mongo": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@ucast/mongo/-/mongo-2.4.3.tgz", - "integrity": "sha512-XcI8LclrHWP83H+7H2anGCEeDq0n+12FU2mXCTz6/Tva9/9ddK/iacvvhCyW6cijAAOILmt0tWplRyRhVyZLsA==", - "license": "Apache-2.0", - "dependencies": { - "@ucast/core": "^1.4.1" - } - }, - "node_modules/@ucast/mongo2js": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@ucast/mongo2js/-/mongo2js-1.4.0.tgz", - "integrity": "sha512-vR9RJ3BHlkI3RfKJIZFdVktxWvBCQRiSTeJSWN9NPxP5YJkpfXvcBWAMLwvyJx4HbB+qib5/AlSDEmQiuQyx2w==", - "license": "Apache-2.0", - "dependencies": { - "@ucast/core": "^1.6.1", - "@ucast/js": "^3.0.0", - "@ucast/mongo": "^2.4.0" - } - }, - "node_modules/@uiw/codemirror-extensions-basic-setup": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.22.2.tgz", - "integrity": "sha512-zcHGkldLFN3cGoI5XdOGAkeW24yaAgrDEYoyPyWHODmPiNwybQQoZGnH3qUdzZwUaXtAcLWoAeOPzfNRW2yGww==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/commands": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/lint": "^6.0.0", - "@codemirror/search": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - }, - "peerDependencies": { - "@codemirror/autocomplete": ">=6.0.0", - "@codemirror/commands": ">=6.0.0", - "@codemirror/language": ">=6.0.0", - "@codemirror/lint": ">=6.0.0", - "@codemirror/search": ">=6.0.0", - "@codemirror/state": ">=6.0.0", - "@codemirror/view": ">=6.0.0" - } - }, - "node_modules/@uiw/react-codemirror": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.22.2.tgz", - "integrity": "sha512-okCSl+WJG63gRx8Fdz7v0C6RakBQnbb3pHhuzIgDB+fwhipgFodSnu2n9oOsQesJ5YQ7mSOcKMgX0JEsu4nnfQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.6", - "@codemirror/commands": "^6.1.0", - "@codemirror/state": "^6.1.1", - "@codemirror/theme-one-dark": "^6.0.0", - "@uiw/codemirror-extensions-basic-setup": "4.22.2", - "codemirror": "^6.0.0" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - }, - "peerDependencies": { - "@babel/runtime": ">=7.11.0", - "@codemirror/state": ">=6.0.0", - "@codemirror/theme-one-dark": ">=6.0.0", - "@codemirror/view": ">=6.0.0", - "codemirror": ">=6.0.0", - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@vitejs/plugin-react-swc": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.6.0.tgz", - "integrity": "sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==", - "license": "MIT", - "dependencies": { - "@swc/core": "^1.3.107" - }, - "peerDependencies": { - "vite": "^4 || ^5" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/addressparser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", - "integrity": "sha512-aQX7AISOMM7HFE0iZ3+YnD07oIeJqWGVnJ+ZIKaBZAk03ftmVYVqsGas/rbXKR21n4D/hKCSHypvcyOkds/xzg==", - "license": "MIT" - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-draft-04": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", - "license": "MIT", - "peerDependencies": { - "ajv": "^8.5.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", - "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-sequence-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.3.tgz", - "integrity": "sha512-+fksAx9eG3Ab6LDnLs3ZqZa8KVJ/jYnX+D4Qe1azX+LFGFAXqynCQLOdLpNYN/l9e7l6hMWwZbrnctqr6eSQSw==", - "license": "MIT" - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/aria-hidden": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", - "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "license": "MIT" - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", - "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", - "license": "MIT" - }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bl/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "license": "MIT" - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "license": "MIT" - }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/broadcast-channel": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", - "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.7.2", - "detect-node": "^2.1.0", - "js-sha3": "0.8.0", - "microseconds": "0.2.0", - "nano-time": "1.0.0", - "oblivious-set": "1.0.0", - "rimraf": "3.0.2", - "unload": "2.2.0" - } - }, - "node_modules/broadcast-channel/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/broadcast-channel/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/broadcast-channel/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/broadcast-channel/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "license": "MIT" - }, - "node_modules/browserslist": { - "version": "4.24.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", - "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001716", - "electron-to-chromium": "^1.5.149", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/browserslist-to-esbuild": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserslist-to-esbuild/-/browserslist-to-esbuild-1.2.0.tgz", - "integrity": "sha512-ftrrbI/VHBgEnmnSyhkqvQVMp6jAKybfs0qMIlm7SLBrQTGMsdCIP4q3BoKeLsZTBQllIQtY9kbxgRYV2WU47g==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.17.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/buffer-writer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/buildmail": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-3.10.0.tgz", - "integrity": "sha512-6e5sDN/pl3en5Klqdfyir7LEIBiFr9oqZuvYaEyVwjxpIbBZN+98e0j87Fz2Ukl8ud32rbk9VGOZAnsOZ7pkaA==", - "deprecated": "This project is unmaintained", - "license": "MIT", - "dependencies": { - "addressparser": "1.0.1", - "libbase64": "0.1.0", - "libmime": "2.1.0", - "libqp": "1.1.0", - "nodemailer-fetch": "1.6.0", - "nodemailer-shared": "1.1.0" - } - }, - "node_modules/buildmail/node_modules/iconv-lite": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "integrity": "sha512-QwVuTNQv7tXC5mMWFX5N5wGjmybjNBBD8P3BReTkPmipoxTUFgWM2gXNvldHQr6T14DH0Dh6qBVg98iJt7u4mQ==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/buildmail/node_modules/libmime": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/libmime/-/libmime-2.1.0.tgz", - "integrity": "sha512-4be2R6/jOasyPTw0BkpIZBVk2cElqjdIdS0PRPhbOCV4wWuL/ZcYYpN1BCTVB+6eIQ0uuAwp5hQTHFrM5Joa8w==", - "license": "MIT", - "dependencies": { - "iconv-lite": "0.4.13", - "libbase64": "0.1.0", - "libqp": "1.1.0" - } - }, - "node_modules/byte-size": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-8.1.1.tgz", - "integrity": "sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==", - "license": "MIT", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cache-content-type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", - "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", - "license": "MIT", - "dependencies": { - "mime-types": "^2.1.18", - "ylru": "^1.2.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001717", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz", - "integrity": "sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, - "node_modules/capital-case/node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/capital-case/node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/capital-case/node_modules/upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/castable-video": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/castable-video/-/castable-video-1.1.7.tgz", - "integrity": "sha512-L2GkREds6UJVI8yIuiKXVFv5xNiulR+9nNUIutsDT1av5icCma423cB3GyyYsOdvudQ83Y27eC/290HXUSSleA==", - "license": "MIT", - "dependencies": { - "custom-media-element": "~1.4.2" - } - }, - "node_modules/castable-video/node_modules/custom-media-element": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/custom-media-element/-/custom-media-element-1.4.2.tgz", - "integrity": "sha512-AM6FRWqJyW7pWTvXb4uJj6yvHE7C6UutdhJ5o3XO5NEl5aWFcfnpz8/TuW8qr1+/wfbj50wRvdArnSNjTmjmVw==", - "license": "MIT" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/change-case": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.1.0.tgz", - "integrity": "sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==", - "license": "MIT", - "dependencies": { - "camel-case": "^3.0.0", - "constant-case": "^2.0.0", - "dot-case": "^2.1.0", - "header-case": "^1.0.0", - "is-lower-case": "^1.1.0", - "is-upper-case": "^1.1.0", - "lower-case": "^1.1.1", - "lower-case-first": "^1.0.0", - "no-case": "^2.3.2", - "param-case": "^2.1.0", - "pascal-case": "^2.0.0", - "path-case": "^2.1.0", - "sentence-case": "^2.1.0", - "snake-case": "^2.1.0", - "swap-case": "^1.1.0", - "title-case": "^2.1.0", - "upper-case": "^1.1.1", - "upper-case-first": "^1.1.0" - } - }, - "node_modules/change-case/node_modules/camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/change-case/node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/change-case/node_modules/pascal-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", - "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", - "license": "MIT", - "dependencies": { - "camel-case": "^3.0.0", - "upper-case-first": "^1.1.0" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "license": "MIT" - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-progress": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", - "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "license": "ISC", - "engines": { - "node": ">= 10" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clone-response/node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/co-body": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.2.0.tgz", - "integrity": "sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==", - "license": "MIT", - "dependencies": { - "@hapi/bourne": "^3.0.0", - "inflation": "^2.0.0", - "qs": "^6.5.2", - "raw-body": "^2.3.3", - "type-is": "^1.6.16" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/codemirror": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz", - "integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/commands": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/lint": "^6.0.0", - "@codemirror/search": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - } - }, - "node_modules/codemirror5": { - "name": "codemirror", - "version": "5.65.19", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.19.tgz", - "integrity": "sha512-+aFkvqhaAVr1gferNMuN8vkTSrWIFvzlMV9I2KBLCWS2WpZ2+UAkZjlMZmEuT+gcXTi6RrGQCkWq1/bDtGqhIA==", - "license": "MIT" - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "license": "MIT" - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "license": "MIT", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/colorspace/node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/colorspace/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/colorspace/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compute-scroll-into-view": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", - "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==", - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/concurrently": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", - "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "date-fns": "^2.30.0", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "spawn-command": "0.0.2", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": "^14.13.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "license": "MIT", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "license": "BSD-2-Clause", - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/constant-case": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", - "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", - "license": "MIT", - "dependencies": { - "snake-case": "^2.1.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/cookies": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", - "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/copyfiles": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", - "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", - "license": "MIT", - "dependencies": { - "glob": "^7.0.5", - "minimatch": "^3.0.3", - "mkdirp": "^1.0.4", - "noms": "0.0.0", - "through2": "^2.0.1", - "untildify": "^4.0.0", - "yargs": "^16.1.0" - }, - "bin": { - "copyfiles": "copyfiles", - "copyup": "copyfiles" - } - }, - "node_modules/copyfiles/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/copyfiles/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/copyfiles/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/copyfiles/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/copyfiles/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/copyfiles/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/core-js-pure": { - "version": "3.42.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.42.0.tgz", - "integrity": "sha512-007bM04u91fF4kMgwom2I5cQxAFIy8jVulgr9eozILl/SZE53QOqnW/+vviC+wQWLv+AunBG+8Q0TLoeSsSxRQ==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "license": "MIT", - "dependencies": { - "buffer": "^5.1.0" - } - }, - "node_modules/crelt": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", - "license": "MIT" - }, - "node_modules/cron-parser": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", - "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", - "license": "MIT", - "dependencies": { - "luxon": "^3.2.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/cropperjs": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/cropperjs/-/cropperjs-1.6.1.tgz", - "integrity": "sha512-F4wsi+XkDHCOMrHMYjrTEE4QBOrsHHN5/2VsVAaRq8P7E5z7xQpT75S+f/9WikmBEailas3+yo+6zPIomW+NOA==", - "license": "MIT" - }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/css-loader": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-to-react-native": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", - "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "license": "MIT", - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/custom-media-element": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/custom-media-element/-/custom-media-element-1.3.3.tgz", - "integrity": "sha512-5Tenv3iLP8ZiLHcT0qSyfDPrqzkCMxczeLY7cTndbsMF7EkVgL/74a6hxNrn/F6RuD74TLK6R2r0GsmntTTtRg==", - "license": "MIT" - }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/date-fns-tz": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-2.0.1.tgz", - "integrity": "sha512-fJCG3Pwx8HUoLhkepdsP7Z5RsucUi+ZBOxyM5d0ZZ6c4SdYustq0VMmOu6Wf7bli+yS/Jwp91TOCqn9jMcVrUA==", - "license": "MIT", - "peerDependencies": { - "date-fns": "2.x" - } - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-7.0.0.tgz", - "integrity": "sha512-6IvPrADQyyPGLpMnUh6kfKiqy7SrbXbjoUuZ90WMBJKErzv2pCiwlGEXjRX9/54OnTq+XFVnkOnOMzclLI5aEA==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", - "license": "MIT" - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/del": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", - "license": "MIT", - "dependencies": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/del/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/del/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/del/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/del/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/del/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "license": "MIT" - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT" - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "license": "MIT" - }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "license": "ISC", - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/direction": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/direction/-/direction-1.0.4.tgz", - "integrity": "sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==", - "license": "MIT", - "bin": { - "direction": "cli.js" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dkim-signer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dkim-signer/-/dkim-signer-0.2.2.tgz", - "integrity": "sha512-24OZ3cCA30UTRz+Plpg+ibfPq3h7tDtsJRg75Bo0pGakZePXcPBddY80bKi1Bi7Jsz7tL5Cw527mhCRDvNFgfg==", - "license": "MIT", - "dependencies": { - "libmime": "^2.0.3" - } - }, - "node_modules/dnd-core": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.1.tgz", - "integrity": "sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==", - "license": "MIT", - "dependencies": { - "@react-dnd/asap": "^5.0.1", - "@react-dnd/invariant": "^4.0.1", - "redux": "^4.2.0" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "license": "MIT" - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", - "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.151", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.151.tgz", - "integrity": "sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA==", - "license": "ISC" - }, - "node_modules/elliptic": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", - "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "license": "MIT", - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", - "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.4", - "@esbuild/android-arm": "0.25.4", - "@esbuild/android-arm64": "0.25.4", - "@esbuild/android-x64": "0.25.4", - "@esbuild/darwin-arm64": "0.25.4", - "@esbuild/darwin-x64": "0.25.4", - "@esbuild/freebsd-arm64": "0.25.4", - "@esbuild/freebsd-x64": "0.25.4", - "@esbuild/linux-arm": "0.25.4", - "@esbuild/linux-arm64": "0.25.4", - "@esbuild/linux-ia32": "0.25.4", - "@esbuild/linux-loong64": "0.25.4", - "@esbuild/linux-mips64el": "0.25.4", - "@esbuild/linux-ppc64": "0.25.4", - "@esbuild/linux-riscv64": "0.25.4", - "@esbuild/linux-s390x": "0.25.4", - "@esbuild/linux-x64": "0.25.4", - "@esbuild/netbsd-arm64": "0.25.4", - "@esbuild/netbsd-x64": "0.25.4", - "@esbuild/openbsd-arm64": "0.25.4", - "@esbuild/openbsd-x64": "0.25.4", - "@esbuild/sunos-x64": "0.25.4", - "@esbuild/win32-arm64": "0.25.4", - "@esbuild/win32-ia32": "0.25.4", - "@esbuild/win32-x64": "0.25.4" - } - }, - "node_modules/esbuild-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-4.3.0.tgz", - "integrity": "sha512-D7HeJNdkDKKMarPQO/3dlJT6RwN2YJO7ENU6RPlpOz5YxSHnUNi2yvW41Bckvi1EVwctIaLzlb0ni5ag2GINYA==", - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "get-tsconfig": "^4.7.0", - "loader-utils": "^2.0.4", - "webpack-sources": "^1.4.3" - }, - "funding": { - "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" - }, - "peerDependencies": { - "webpack": "^4.40.0 || ^5.0.0" - } - }, - "node_modules/esbuild-register": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.5.0.tgz", - "integrity": "sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "peerDependencies": { - "esbuild": ">=0.12 <1" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/eventsource": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", - "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "license": "MIT", - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "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.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT" - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT" - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "license": "MIT" - }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-yarn-workspace-root2": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", - "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", - "license": "Apache-2.0", - "dependencies": { - "micromatch": "^4.0.2", - "pkg-dir": "^4.2.0" - } - }, - "node_modules/findup-sync": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", - "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", - "license": "MIT", - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.3", - "micromatch": "^4.0.4", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/fined": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", - "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^5.0.0", - "object.defaults": "^1.1.0", - "object.pick": "^1.3.0", - "parse-filepath": "^1.0.2" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/flagged-respawn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", - "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==", - "license": "MIT", - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT" - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", - "license": "MIT", - "dependencies": { - "for-in": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", - "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "fs-extra": "^10.0.0", - "memfs": "^3.4.1", - "minimatch": "^3.0.4", - "node-abort-controller": "^3.0.1", - "schema-utils": "^3.1.1", - "semver": "^7.3.5", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">=12.13.0", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "typescript": ">3.6.0", - "webpack": "^5.11.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formidable": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.5.tgz", - "integrity": "sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q==", - "license": "MIT", - "dependencies": { - "@paralleldrive/cuid2": "^2.2.2", - "dezalgo": "^1.0.4", - "once": "^1.4.0", - "qs": "^6.11.0" - }, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, - "node_modules/formik": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/formik/-/formik-2.4.5.tgz", - "integrity": "sha512-Gxlht0TD3vVdzMDHwkiNZqJ7Mvg77xQNfmBRrNtvzcHZs72TJppSTDKHpImCMJZwcWPBJ8jSQQ95GJzXFf1nAQ==", - "funding": [ - { - "type": "individual", - "url": "https://opencollective.com/formik" - } - ], - "license": "Apache-2.0", - "dependencies": { - "@types/hoist-non-react-statics": "^3.3.1", - "deepmerge": "^2.1.1", - "hoist-non-react-statics": "^3.3.0", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "react-fast-compare": "^2.0.1", - "tiny-warning": "^1.0.2", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/formik/node_modules/deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fractional-indexing": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fractional-indexing/-/fractional-indexing-3.2.0.tgz", - "integrity": "sha512-PcOxmqwYCW7O2ovKRU8OoQQj2yqTfEB/yeTYk4gPid6dN5ODRfU1hXd9tTVZzax/0NkO7AxpHykvZnT1aYp/BQ==", - "license": "CC0-1.0", - "engines": { - "node": "^14.13.1 || >=16.0.0" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT" - }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", - "license": "Unlicense" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-it": { - "version": "8.6.8", - "resolved": "https://registry.npmjs.org/get-it/-/get-it-8.6.8.tgz", - "integrity": "sha512-O2H5qFvFJ26XFnELV2/4y0YKpQVtlKisSrzmdL09L82ZuGoIGXGhtr1GWzt/BIrhxa38DWHNrSloU7dF/ZSQrQ==", - "license": "MIT", - "dependencies": { - "@types/follow-redirects": "^1.14.4", - "decompress-response": "^7.0.0", - "follow-redirects": "^1.15.9", - "is-retry-allowed": "^2.2.0", - "through2": "^4.0.2", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/get-it/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/get-it/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/get-it/node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "license": "MIT", - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/get-latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-latest-version/-/get-latest-version-5.1.0.tgz", - "integrity": "sha512-Q6IBWr/zzw57zIkJmNhI23eRTw3nZ4BWWK034meLwOYU9L3J3IpXiyM73u2pYUwN6U7ahkerCwg2T0jlxiLwsw==", - "license": "MIT", - "dependencies": { - "get-it": "^8.0.9", - "registry-auth-token": "^5.0.2", - "registry-url": "^5.1.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=14.18" - } - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-tsconfig": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", - "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/getopts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", - "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==", - "license": "MIT" - }, - "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", - "license": "MIT", - "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" - } - }, - "node_modules/git-url-parse": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-14.0.0.tgz", - "integrity": "sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==", - "license": "MIT", - "dependencies": { - "git-up": "^7.0.0" - } - }, - "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "license": "BSD-2-Clause" - }, - "node_modules/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "license": "BSD-3-Clause", - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "license": "MIT", - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "license": "MIT", - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/globby/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/globby/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globby/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/grant": { - "version": "5.4.24", - "resolved": "https://registry.npmjs.org/grant/-/grant-5.4.24.tgz", - "integrity": "sha512-PD5AvSI7wgCBDi2mEd6M/TIe+70c/fVc3Ik4B0s4mloWTy9J800eUEcxivOiyqSP9wvBy2QjWq1JR8gOfDMnEg==", - "license": "MIT", - "dependencies": { - "qs": "^6.14.0", - "request-compose": "^2.1.7", - "request-oauth": "^1.0.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "optionalDependencies": { - "cookie": "^0.7.2", - "cookie-signature": "^1.2.2", - "jwk-to-pem": "^2.0.7", - "jws": "^4.0.0" - } - }, - "node_modules/grant/node_modules/jwk-to-pem": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/jwk-to-pem/-/jwk-to-pem-2.0.7.tgz", - "integrity": "sha512-cSVphrmWr6reVchuKQZdfSs4U9c5Y4hwZggPoz6cbVnTpAVgGRpEuQng86IyqLeGZlhTh+c4MAreB6KbdQDKHQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "asn1.js": "^5.3.0", - "elliptic": "^6.6.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/grant/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "license": "MIT", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/header-case": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", - "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.3" - } - }, - "node_modules/helmet": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-6.2.0.tgz", - "integrity": "sha512-DWlwuXLLqbrIOltR6tFQXShj/+7Cyp0gLi6uAb8qMdFh/YBBFbKSgQ6nbXmScYd8emMctuthmgIa7tUfo9Rtyg==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", - "license": "BSD-3-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/hls.js": { - "version": "1.5.20", - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.5.20.tgz", - "integrity": "sha512-uu0VXUK52JhihhnN/MVVo1lvqNNuhoxkonqgO3IpjvQiGpJBdIXMGkofjQb/j9zvV7a1SW8U9g1FslWx/1HOiQ==", - "license": "Apache-2.0" - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "license": "MIT", - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" - }, - "node_modules/html-entities": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", - "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "license": "MIT" - }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", - "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/http-assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", - "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", - "license": "MIT", - "dependencies": { - "deep-equal": "~1.0.1", - "http-errors": "~1.8.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-assert/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-assert/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-assert/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "license": "BSD-2-Clause" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "license": "ISC" - }, - "node_modules/ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "license": "ISC", - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz", - "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/inquirer": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", - "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/intl-messageformat": { - "version": "10.5.11", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.11.tgz", - "integrity": "sha512-eYq5fkFBVxc7GIFDzpFQkDOZgNayNTQn4Oufe8jw6YY6OHVw70/4pA3FyCsQ0Gb2DnvEJEMmN2tOaXUGByM+kg==", - "license": "BSD-3-Clause", - "dependencies": { - "@formatjs/ecma402-abstract": "1.18.2", - "@formatjs/fast-memoize": "2.2.0", - "@formatjs/icu-messageformat-parser": "2.7.6", - "tslib": "^2.4.0" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "license": "MIT", - "dependencies": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-class-hotfix": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz", - "integrity": "sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==", - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hotkey": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.1.8.tgz", - "integrity": "sha512-qs3NZ1INIS+H+yeo7cD9pDfwYV/jqRh1JG9S9zYrNudkoUQg7OL7ziXqRKu+InFjUIDoP2o6HIkLYMh1pcWgyQ==", - "license": "MIT" - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-localhost-ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-localhost-ip/-/is-localhost-ip-2.0.0.tgz", - "integrity": "sha512-vlgs2cSgMOfnKU8c1ewgKPyum9rVrjjLLW2HBdL5i0iAJjOs8NY55ZBd/hqUTaYR0EO9CKZd3hVSC2HlIbygTQ==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/is-lower-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", - "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", - "license": "MIT", - "dependencies": { - "lower-case": "^1.1.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "license": "MIT", - "dependencies": { - "is-unc-path": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-retry-allowed": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", - "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-ssh": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", - "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", - "license": "MIT", - "dependencies": { - "protocols": "^2.0.1" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-type-of": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-type-of/-/is-type-of-1.4.0.tgz", - "integrity": "sha512-EddYllaovi5ysMLMEN7yzHEKh8A850cZ7pykrY1aNRQGn/CDjRDE9qEWbIdt7xGEVJmjBXzU/fNnC4ABTm8tEQ==", - "license": "MIT", - "dependencies": { - "core-util-is": "^1.0.2", - "is-class-hotfix": "~0.0.6", - "isstream": "~0.1.2" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "license": "MIT" - }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "license": "MIT", - "dependencies": { - "unc-path-regex": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-upper-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", - "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", - "license": "MIT", - "dependencies": { - "upper-case": "^1.1.0" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" - }, - "node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "license": "MIT", - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "license": "MIT" - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "license": "MIT" - }, - "node_modules/jose": { - "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "license": "MIT" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/js-yaml/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/js-yaml/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "license": "ISC" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "license": "MIT" - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", - "license": "MIT", - "dependencies": { - "jws": "^3.2.2", - "lodash": "^4.17.21", - "ms": "^2.1.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/node_modules/jwa": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", - "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsonwebtoken/node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "license": "MIT", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "license": "MIT", - "optional": true, - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwk-to-pem": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/jwk-to-pem/-/jwk-to-pem-2.0.5.tgz", - "integrity": "sha512-L90jwellhO8jRKYwbssU9ifaMVqajzj3fpRjDKcsDzrslU9syRbFqfkXtT4B89HYAap+xsxNcxgBSB09ig+a7A==", - "license": "Apache-2.0", - "dependencies": { - "asn1.js": "^5.3.0", - "elliptic": "^6.5.4", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwks-rsa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.1.0.tgz", - "integrity": "sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==", - "license": "MIT", - "dependencies": { - "@types/express": "^4.17.17", - "@types/jsonwebtoken": "^9.0.2", - "debug": "^4.3.4", - "jose": "^4.14.6", - "limiter": "^1.1.5", - "lru-memoizer": "^2.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "license": "MIT", - "optional": true, - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/keygrip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", - "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", - "license": "MIT", - "dependencies": { - "tsscmp": "1.0.6" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/knex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/knex/-/knex-3.0.1.tgz", - "integrity": "sha512-ruASxC6xPyDklRdrcDy6a9iqK+R9cGK214aiQa+D9gX2ZnHZKv6o6JC9ZfgxILxVAul4bZ13c3tgOAHSuQ7/9g==", - "license": "MIT", - "dependencies": { - "colorette": "2.0.19", - "commander": "^10.0.0", - "debug": "4.3.4", - "escalade": "^3.1.1", - "esm": "^3.2.25", - "get-package-type": "^0.1.0", - "getopts": "2.3.0", - "interpret": "^2.2.0", - "lodash": "^4.17.21", - "pg-connection-string": "2.6.1", - "rechoir": "^0.8.0", - "resolve-from": "^5.0.0", - "tarn": "^3.0.2", - "tildify": "2.0.0" - }, - "bin": { - "knex": "bin/cli.js" - }, - "engines": { - "node": ">=16" - }, - "peerDependenciesMeta": { - "better-sqlite3": { - "optional": true - }, - "mysql": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-native": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "tedious": { - "optional": true - } - } - }, - "node_modules/knex/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/koa": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.4.tgz", - "integrity": "sha512-7fNBIdrU2PEgLljXoPWoyY4r1e+ToWCmzS/wwMPbUNs7X+5MMET1ObhJBlUkF5uZG9B6QhM2zS1TsH6adegkiQ==", - "license": "MIT", - "dependencies": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", - "cookies": "~0.9.0", - "debug": "^4.3.2", - "delegates": "^1.0.0", - "depd": "^2.0.0", - "destroy": "^1.0.4", - "encodeurl": "^1.0.2", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.3.0", - "http-errors": "^1.6.3", - "is-generator-function": "^1.0.7", - "koa-compose": "^4.1.0", - "koa-convert": "^2.0.0", - "on-finished": "^2.3.0", - "only": "~0.0.2", - "parseurl": "^1.3.2", - "statuses": "^1.5.0", - "type-is": "^1.6.16", - "vary": "^1.1.2" - }, - "engines": { - "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" - } - }, - "node_modules/koa-body": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/koa-body/-/koa-body-6.0.1.tgz", - "integrity": "sha512-M8ZvMD8r+kPHy28aWP9VxL7kY8oPWA+C7ZgCljrCMeaU7uX6wsIQgDHskyrAr9sw+jqnIXyv4Mlxri5R4InIJg==", - "license": "MIT", - "dependencies": { - "@types/co-body": "^6.1.0", - "@types/formidable": "^2.0.5", - "@types/koa": "^2.13.5", - "co-body": "^6.1.0", - "formidable": "^2.0.1", - "zod": "^3.19.1" - } - }, - "node_modules/koa-compose": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", - "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", - "license": "MIT" - }, - "node_modules/koa-compress": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/koa-compress/-/koa-compress-5.1.1.tgz", - "integrity": "sha512-UgMIN7ZoEP2DuoSQmD6CYvFSLt0NReGlc2qSY4bO4Oq0L56OiD9pDG41Kj/zFmVY/A3Wvmn4BqKcfq5H30LGIg==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "compressible": "^2.0.18", - "http-errors": "^1.8.1", - "koa-is-json": "^1.0.0" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/koa-compress/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-compress/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-compress/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-convert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", - "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", - "license": "MIT", - "dependencies": { - "co": "^4.6.0", - "koa-compose": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/koa-favicon": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/koa-favicon/-/koa-favicon-2.1.0.tgz", - "integrity": "sha512-LvukcooYjxKtnZq0RXdBup+JDhaHwLgnLlDHB/xvjwQEjbc4rbp/0WkmOzpOvaHujc+fIwPear0dpKX1V+dHVg==", - "license": "MIT", - "dependencies": { - "mz": "^2.7.0" - } - }, - "node_modules/koa-helmet": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/koa-helmet/-/koa-helmet-7.0.2.tgz", - "integrity": "sha512-AvzS6VuEfFgbAm0mTUnkk/BpMarMcs5A56g+f0sfrJ6m63wII48d2GDrnUQGp0Nj+RR950vNtgqXm9UJSe7GOg==", - "license": "MIT", - "dependencies": { - "helmet": "^6.0.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/koa-ip": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/koa-ip/-/koa-ip-2.1.3.tgz", - "integrity": "sha512-QLVBByImwDq9enZXVOD3Astk876B7N0IYta7Kik4iyNB462rVzBB1/LD0Ek1F+v9nGUTHBFyhh8043EIlskK9Q==", - "license": "MIT", - "dependencies": { - "debug": "4.3.4", - "lodash.isplainobject": "4.0.6", - "request-ip": "3.3.0" - } - }, - "node_modules/koa-is-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", - "integrity": "sha512-+97CtHAlWDx0ndt0J8y3P12EWLwTLMXIfMnYDev3wOTwH/RpBGMlfn4bDXlMEg1u73K6XRE9BbUp+5ZAYoRYWw==", - "license": "MIT" - }, - "node_modules/koa-passport": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/koa-passport/-/koa-passport-6.0.0.tgz", - "integrity": "sha512-bgcrQN7Ylfgi1PVr5l6hHYkr38RHUzx+ty3m7e/xoTte8MR0zbDt6+pvP3/nuF/yXL6Ba7IzX1rSqmCy6OrrIw==", - "license": "MIT", - "dependencies": { - "passport": "^0.6.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/koa-range": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/koa-range/-/koa-range-0.3.0.tgz", - "integrity": "sha512-Ich3pCz6RhtbajYXRWjIl6O5wtrLs6kE3nkXc9XmaWe+MysJyZO7K4L3oce1Jpg/iMgCbj+5UCiMm/rqVtcDIg==", - "license": "MIT", - "dependencies": { - "stream-slice": "^0.1.2" - }, - "engines": { - "node": ">=7" - } - }, - "node_modules/koa-send": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", - "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "resolve-path": "^1.4.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/koa-send/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-send/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-send/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-session": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/koa-session/-/koa-session-6.4.0.tgz", - "integrity": "sha512-h/dxmSOvNEXpHQPRs4TV03TZVFyZIjmYQiTAW5JBFTYBOZ0VdpZ8QEE6Dud75g8z9JNGXi3m++VqRmqToB+c2A==", - "license": "MIT", - "dependencies": { - "crc": "^3.8.0", - "debug": "^4.3.3", - "is-type-of": "^1.2.1", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/koa-static": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", - "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", - "license": "MIT", - "dependencies": { - "debug": "^3.1.0", - "koa-send": "^5.0.0" - }, - "engines": { - "node": ">= 7.6.0" - } - }, - "node_modules/koa-static/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/koa/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa/node_modules/http-errors/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa2-ratelimit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/koa2-ratelimit/-/koa2-ratelimit-1.1.3.tgz", - "integrity": "sha512-gdrIw6m/D7pmScScL4dz50qLbRR3UGqvO1Vuy2dc7hVIuFAl1OVTnu6WFyEJ5GbfyLZFaCMWzRw6t4krvzvUTg==", - "license": "MIT", - "engines": { - "node": ">=7.10.1" - }, - "peerDependencies": { - "mongoose": ">= 5", - "redis": ">= 4.0.0", - "sequelize": ">=5.8.7" - }, - "peerDependenciesMeta": { - "mongoose": { - "optional": true - }, - "redis": { - "optional": true - }, - "sequelize": { - "optional": true - } - } - }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT" - }, - "node_modules/libbase64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz", - "integrity": "sha512-B91jifmFw1DKEqEWstSpg1PbtUbBzR4yQAPT86kCQXBtud1AJVA+Z6RSklSrqmKe4q2eiEufgnhqJKPgozzfIQ==", - "license": "MIT" - }, - "node_modules/libmime": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/libmime/-/libmime-2.1.3.tgz", - "integrity": "sha512-ABr2f4O+K99sypmkF/yPz2aXxUFHEZzv+iUkxItCeKZWHHXdQPpDXd6rV1kBBwL4PserzLU09EIzJ2lxC9hPfQ==", - "license": "MIT", - "dependencies": { - "iconv-lite": "0.4.15", - "libbase64": "0.1.0", - "libqp": "1.1.0" - } - }, - "node_modules/libmime/node_modules/iconv-lite": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", - "integrity": "sha512-RGR+c9Lm+tLsvU57FTJJtdbv2hQw42Yl2n26tVIBaYmZzLN+EGfroUugN/z9nJf9kOXd49hBmpoGr4FEm+A4pw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/libqp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", - "integrity": "sha512-4Rgfa0hZpG++t1Vi2IiqXG9Ad1ig4QTmtuZF946QJP4bPqOYC78ixUXgz5TW/wE7lNaNKlplSYTxQ+fR2KZ0EA==", - "license": "MIT" - }, - "node_modules/liftoff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-4.0.0.tgz", - "integrity": "sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==", - "license": "MIT", - "dependencies": { - "extend": "^3.0.2", - "findup-sync": "^5.0.0", - "fined": "^2.0.0", - "flagged-respawn": "^2.0.0", - "is-plain-object": "^5.0.0", - "object.map": "^1.0.1", - "rechoir": "^0.8.0", - "resolve": "^1.20.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/linkify-it": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", - "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", - "license": "MIT", - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/load-yaml-file": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", - "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.13.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "license": "MIT", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "license": "MIT" - }, - "node_modules/lodash.deburr": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", - "integrity": "sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==", - "license": "MIT" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/logform": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", - "license": "MIT", - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/logform/node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/long-timeout": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", - "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==", - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", - "license": "MIT" - }, - "node_modules/lower-case-first": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", - "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", - "license": "MIT", - "dependencies": { - "lower-case": "^1.1.2" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lru-memoizer": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz", - "integrity": "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==", - "license": "MIT", - "dependencies": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "6.0.0" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "license": "MIT" - }, - "node_modules/luxon": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz", - "integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "license": "MIT", - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/mailcomposer": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-3.12.0.tgz", - "integrity": "sha512-zBeDoKUTNI8IAsazoMQFt3eVSVRtDtgrvBjBVdBjxDEX+5KLlKtEFCrBXnxPhs8aTYufUS1SmbFnGpjHS53deg==", - "deprecated": "This project is unmaintained", - "license": "MIT", - "dependencies": { - "buildmail": "3.10.0", - "libmime": "2.1.0" - } - }, - "node_modules/mailcomposer/node_modules/iconv-lite": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "integrity": "sha512-QwVuTNQv7tXC5mMWFX5N5wGjmybjNBBD8P3BReTkPmipoxTUFgWM2gXNvldHQr6T14DH0Dh6qBVg98iJt7u4mQ==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/mailcomposer/node_modules/libmime": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/libmime/-/libmime-2.1.0.tgz", - "integrity": "sha512-4be2R6/jOasyPTw0BkpIZBVk2cElqjdIdS0PRPhbOCV4wWuL/ZcYYpN1BCTVB+6eIQ0uuAwp5hQTHFrM5Joa8w==", - "license": "MIT", - "dependencies": { - "iconv-lite": "0.4.13", - "libbase64": "0.1.0", - "libqp": "1.1.0" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/markdown-it": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", - "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "~3.0.1", - "linkify-it": "^4.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it-abbr": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-it-abbr/-/markdown-it-abbr-1.0.4.tgz", - "integrity": "sha512-ZeA4Z4SaBbYysZap5iZcxKmlPL6bYA8grqhzJIHB1ikn7njnzaP8uwbtuXc4YXD5LicI4/2Xmc0VwmSiFV04gg==", - "license": "MIT" - }, - "node_modules/markdown-it-container": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-3.0.0.tgz", - "integrity": "sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==", - "license": "MIT" - }, - "node_modules/markdown-it-deflist": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/markdown-it-deflist/-/markdown-it-deflist-2.1.0.tgz", - "integrity": "sha512-3OuqoRUlSxJiuQYu0cWTLHNhhq2xtoSFqsZK8plANg91+RJQU1ziQ6lA2LzmFAEes18uPBsHZpcX6We5l76Nzg==", - "license": "MIT" - }, - "node_modules/markdown-it-emoji": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz", - "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==", - "license": "MIT" - }, - "node_modules/markdown-it-footnote": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz", - "integrity": "sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w==", - "license": "MIT" - }, - "node_modules/markdown-it-ins": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/markdown-it-ins/-/markdown-it-ins-3.0.1.tgz", - "integrity": "sha512-32SSfZqSzqyAmmQ4SHvhxbFqSzPDqsZgMHDwxqPzp+v+t8RsmqsBZRG+RfRQskJko9PfKC2/oxyOs4Yg/CfiRw==", - "license": "MIT" - }, - "node_modules/markdown-it-mark": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/markdown-it-mark/-/markdown-it-mark-3.0.1.tgz", - "integrity": "sha512-HyxjAu6BRsdt6Xcv6TKVQnkz/E70TdGXEFHRYBGLncRE9lBFwDNLVtFojKxjJWgJ+5XxUwLaHXy+2sGBbDn+4A==", - "license": "MIT" - }, - "node_modules/markdown-it-sub": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-sub/-/markdown-it-sub-1.0.0.tgz", - "integrity": "sha512-z2Rm/LzEE1wzwTSDrI+FlPEveAAbgdAdPhdWarq/ZGJrGW/uCQbKAnhoCsE4hAbc3SEym26+W2z/VQB0cQiA9Q==", - "license": "MIT" - }, - "node_modules/markdown-it-sup": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-sup/-/markdown-it-sup-1.0.0.tgz", - "integrity": "sha512-E32m0nV9iyhRR7CrhnzL5msqic7rL1juWre6TQNxsnApg7Uf+F97JOKxUijg5YwXz86lZ0mqfOnutoryyNdntQ==", - "license": "MIT" - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/match-sorter": { - "version": "6.3.4", - "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.4.tgz", - "integrity": "sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.8", - "remove-accents": "0.5.0" - } - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "license": "MIT" - }, - "node_modules/media-chrome": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/media-chrome/-/media-chrome-4.2.3.tgz", - "integrity": "sha512-gzwFy2b+RLsEtnPzUzqzf2L5XkaTLQr8POOyLOcoebWSAWg31cPy2vfXNiUnd93sc5IxwJ8OAwkKxnaJNZ8Gjg==", - "license": "MIT" - }, - "node_modules/media-tracks": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/media-tracks/-/media-tracks-0.3.3.tgz", - "integrity": "sha512-9P2FuUHnZZ3iji+2RQk7Zkh5AmZTnOG5fODACnjhCVveX1McY3jmCRHofIEI+yTBqplz7LXy48c7fQ3Uigp88w==", - "license": "MIT" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "license": "Unlicense", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", - "license": "MIT" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/microseconds": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", - "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==", - "license": "MIT" - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.7.7", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.7.tgz", - "integrity": "sha512-+0n11YGyRavUR3IlaOzJ0/4Il1avMvJ1VJfhWfCn24ITQXhRr1gghbhhrda6tgtNcpZaWKdSuwKq20Jb7fnlyw==", - "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "license": "MIT" - }, - "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" - }, - "node_modules/multistream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", - "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "once": "^1.4.0", - "readable-stream": "^3.6.0" - } - }, - "node_modules/multistream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/multistream/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "license": "ISC" - }, - "node_modules/mux-embed": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/mux-embed/-/mux-embed-5.9.0.tgz", - "integrity": "sha512-wmunL3uoPhma/tWy8PrDPZkvJpXvSFBwbD3KkC4PG8Ztjfb1X3hRJwGUAQyRz7z99b/ovLm2UTTitrkvStjH4w==", - "license": "MIT" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nano-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", - "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", - "license": "ISC", - "dependencies": { - "big-integer": "^1.6.16" - } - }, - "node_modules/nanoclone": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", - "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" - }, - "node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "license": "MIT", - "dependencies": { - "lower-case": "^1.1.1" - } - }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "license": "MIT" - }, - "node_modules/node-machine-id": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", - "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", - "license": "MIT" - }, - "node_modules/node-plop": { - "version": "0.26.3", - "resolved": "https://registry.npmjs.org/node-plop/-/node-plop-0.26.3.tgz", - "integrity": "sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==", - "license": "MIT", - "dependencies": { - "@babel/runtime-corejs3": "^7.9.2", - "@types/inquirer": "^6.5.0", - "change-case": "^3.1.0", - "del": "^5.1.0", - "globby": "^10.0.1", - "handlebars": "^4.4.3", - "inquirer": "^7.1.0", - "isbinaryfile": "^4.0.2", - "lodash.get": "^4.4.2", - "mkdirp": "^0.5.1", - "resolve": "^1.12.0" - }, - "engines": { - "node": ">=8.9.4" - } - }, - "node_modules/node-plop/node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/node-plop/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/node-plop/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/node-plop/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "license": "MIT" - }, - "node_modules/node-schedule": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.1.tgz", - "integrity": "sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==", - "license": "MIT", - "dependencies": { - "cron-parser": "^4.2.0", - "long-timeout": "0.1.1", - "sorted-array-functions": "^1.3.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/nodemailer-fetch": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", - "integrity": "sha512-P7S5CEVGAmDrrpn351aXOLYs1R/7fD5NamfMCHyi6WIkbjS2eeZUB/TkuvpOQr0bvRZicVqo59+8wbhR3yrJbQ==", - "license": "MIT" - }, - "node_modules/nodemailer-shared": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", - "integrity": "sha512-68xW5LSyPWv8R0GLm6veAvm7E+XFXkVgvE3FW0FGxNMMZqMkPFeGDVALfR1DPdSfcoO36PnW7q5AAOgFImEZGg==", - "license": "MIT", - "dependencies": { - "nodemailer-fetch": "1.6.0" - } - }, - "node_modules/nodemon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.2.tgz", - "integrity": "sha512-9qIN2LNTrEzpOPBaWHTm4Asy1LxXLSickZStAQ4IZe7zsoIpD/A7LWxhZV3t4Zu352uBcqVnRsDXSMR2Sc3lTA==", - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^4", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/nodemon/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/nodemon/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/nodemon/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/noms": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", - "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", - "license": "ISC", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "~1.0.31" - } - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "license": "ISC" - }, - "node_modules/npm-packlist": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", - "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", - "license": "ISC", - "dependencies": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-packlist/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm-packlist/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-packlist/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", - "license": "MIT", - "dependencies": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", - "license": "MIT", - "dependencies": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/oblivious-set": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", - "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==", - "license": "MIT" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "license": "MIT", - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/only": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", - "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==" - }, - "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-paths": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/os-paths/-/os-paths-7.4.0.tgz", - "integrity": "sha512-Ux1J4NUqC6tZayBqLN1kUlDAEvLiQlli/53sSddU4IN+h+3xxnv2HmRSMpVSvr1hvJzotfMs3ERvETGK+f4OwA==", - "license": "MIT", - "engines": { - "node": ">= 4.0" - }, - "optionalDependencies": { - "fsevents": "*" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/outdent": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.8.0.tgz", - "integrity": "sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==", - "license": "MIT" - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-7.0.0.tgz", - "integrity": "sha512-CHJqc94AA8YfSLHGQT3DbvSIuE12NLFekpM4n7LRrAd3dOJtA911+4xe9q6nC3/jcKraq7nNS9VxgtT0KC+diA==", - "license": "MIT", - "dependencies": { - "got": "^11.8.2", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json/node_modules/registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "license": "MIT", - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/packet-reader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==", - "license": "MIT" - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/param-case/node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/param-case/node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/param-case/node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", - "license": "MIT", - "dependencies": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-path": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz", - "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==", - "license": "MIT", - "dependencies": { - "protocols": "^2.0.0" - } - }, - "node_modules/parse-srcset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", - "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==", - "license": "MIT" - }, - "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", - "license": "MIT", - "dependencies": { - "parse-path": "^7.0.0" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/pascal-case/node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/pascal-case/node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/passport": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", - "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", - "license": "MIT", - "dependencies": { - "passport-strategy": "1.x.x", - "pause": "0.0.1", - "utils-merge": "^1.0.1" - }, - "engines": { - "node": ">= 0.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jaredhanson" - } - }, - "node_modules/passport-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", - "integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==", - "dependencies": { - "passport-strategy": "1.x.x" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/passport-strategy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/path-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", - "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", - "license": "MIT", - "dependencies": { - "path-root-regex": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" - }, - "node_modules/pg": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz", - "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==", - "license": "MIT", - "dependencies": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", - "pg-connection-string": "^2.5.0", - "pg-pool": "^3.5.2", - "pg-protocol": "^1.5.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } - } - }, - "node_modules/pg-connection-string": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.1.tgz", - "integrity": "sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==", - "license": "MIT" - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "license": "ISC", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pg-pool": { - "version": "3.9.6", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.9.6.tgz", - "integrity": "sha512-rFen0G7adh1YmgvrmE5IPIqbb+IgEzENUm+tzm6MLLDSlPRoZVhzU1WdML9PV2W5GOdRA9qBKURlbt1OsXOsPw==", - "license": "MIT", - "peerDependencies": { - "pg": ">=8.0" - } - }, - "node_modules/pg-protocol": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.9.5.tgz", - "integrity": "sha512-DYTWtWpfd5FOro3UnAfwvhD8jh59r2ig8bPtc9H8Ds7MscE/9NYruUQWFAOuraRl29jwcT2kyMFQ3MxeaVjUhg==", - "license": "MIT" - }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "license": "MIT", - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "license": "MIT", - "dependencies": { - "split2": "^4.1.0" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/player.style": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/player.style/-/player.style-0.0.8.tgz", - "integrity": "sha512-ScmFzio3634eEn+ejpkEw13F5xYvnPghtaZz/Kg7QQP78ECrxdjRVqwVPZhUwbYxmg5OIScByOgHfrHpzTtR1Q==", - "license": "MIT", - "workspaces": [ - ".", - "site", - "examples/*", - "scripts/*", - "themes/*" - ], - "dependencies": { - "media-chrome": "^4.1.0" - } - }, - "node_modules/plop": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/plop/-/plop-4.0.1.tgz", - "integrity": "sha512-5n8QU93kvL/ObOzBcPAB1siVFtAH1TZM6TntJ3JK5kXT0jIgnQV+j+uaOWWFJlg1cNkzLYm8klgASF65K36q9w==", - "license": "MIT", - "dependencies": { - "@types/liftoff": "^4.0.3", - "chalk": "^5.3.0", - "interpret": "^3.1.1", - "liftoff": "^4.0.0", - "minimist": "^1.2.8", - "node-plop": "^0.32.0", - "ora": "^8.0.0", - "v8flags": "^4.0.1" - }, - "bin": { - "plop": "bin/plop.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/plop/node_modules/@types/inquirer": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.8.tgz", - "integrity": "sha512-CgPD5kFGWsb8HJ5K7rfWlifao87m4ph8uioU7OTncJevmE/VLIqAAjfQtko578JZg7/f69K4FgqYym3gNr7DeA==", - "license": "MIT", - "dependencies": { - "@types/through": "*", - "rxjs": "^7.2.0" - } - }, - "node_modules/plop/node_modules/aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "license": "MIT", - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/plop/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/plop/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/plop/node_modules/change-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", - "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "capital-case": "^1.0.4", - "constant-case": "^3.0.4", - "dot-case": "^3.0.4", - "header-case": "^2.0.4", - "no-case": "^3.0.4", - "param-case": "^3.0.4", - "pascal-case": "^3.1.2", - "path-case": "^3.0.4", - "sentence-case": "^3.0.4", - "snake-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/plop/node_modules/clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "node_modules/plop/node_modules/constant-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case": "^2.0.2" - } - }, - "node_modules/plop/node_modules/del": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-7.1.0.tgz", - "integrity": "sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==", - "license": "MIT", - "dependencies": { - "globby": "^13.1.2", - "graceful-fs": "^4.2.10", - "is-glob": "^4.0.3", - "is-path-cwd": "^3.0.0", - "is-path-inside": "^4.0.0", - "p-map": "^5.5.0", - "rimraf": "^3.0.2", - "slash": "^4.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/plop/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "license": "MIT" - }, - "node_modules/plop/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/plop/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "license": "MIT", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/header-case": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "license": "MIT", - "dependencies": { - "capital-case": "^1.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/plop/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/inquirer": { - "version": "9.3.7", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.7.tgz", - "integrity": "sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w==", - "license": "MIT", - "dependencies": { - "@inquirer/figures": "^1.0.3", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "external-editor": "^3.1.0", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/plop/node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/plop/node_modules/inquirer/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/plop/node_modules/is-path-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", - "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/isbinaryfile": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.4.tgz", - "integrity": "sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==", - "license": "MIT", - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/plop/node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/plop/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/plop/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/plop/node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/plop/node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/plop/node_modules/node-plop": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/node-plop/-/node-plop-0.32.0.tgz", - "integrity": "sha512-lKFSRSRuDHhwDKMUobdsvaWCbbDRbV3jMUSMiajQSQux1aNUevAZVxUHc2JERI//W8ABPRbi3ebYuSuIzkNIpQ==", - "license": "MIT", - "dependencies": { - "@types/inquirer": "^9.0.3", - "change-case": "^4.1.2", - "del": "^7.1.0", - "globby": "^13.2.2", - "handlebars": "^4.7.8", - "inquirer": "^9.2.10", - "isbinaryfile": "^5.0.0", - "lodash.get": "^4.4.2", - "lower-case": "^2.0.2", - "mkdirp": "^3.0.1", - "resolve": "^1.22.4", - "title-case": "^3.0.3", - "upper-case": "^2.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/plop/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/ora": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", - "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/ora/node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/ora/node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/ora/node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/ora/node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/ora/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/plop/node_modules/p-map": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", - "license": "MIT", - "dependencies": { - "aggregate-error": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/path-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/plop/node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/plop/node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/plop/node_modules/sentence-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, - "node_modules/plop/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/plop/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/plop/node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/plop/node_modules/title-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", - "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/plop/node_modules/upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/plop/node_modules/upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/plop/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/pony-cause": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.11.tgz", - "integrity": "sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==", - "license": "0BSD", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", - "license": "MIT", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "license": "ISC", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "license": "MIT", - "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/preferred-pm": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.1.2.tgz", - "integrity": "sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==", - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0", - "find-yarn-workspace-root2": "1.2.16", - "path-exists": "^4.0.0", - "which-pm": "2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/preferred-pm/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/preferred-pm/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/preferred-pm/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/preferred-pm/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/preferred-pm/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/pretty-format/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT" - }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/property-expr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", - "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==", - "license": "MIT" - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "license": "ISC" - }, - "node_modules/protocols": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", - "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", - "license": "MIT" - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/purest": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/purest/-/purest-4.0.2.tgz", - "integrity": "sha512-Uq6kdia8zGVHOb/0zAOb7FvKFMKeyeTZTLEwpO0JR3cIFEkpH6asv3ls9M9URDjHiYIdgAPmht5ecSbvPacfyg==", - "license": "Apache-2.0", - "dependencies": { - "@simov/deep-extend": "^1.0.0", - "qs": "^6.10.3", - "request-compose": "^2.1.4", - "request-multipart": "^1.0.0", - "request-oauth": "^1.0.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/qs": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", - "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dnd": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-16.0.1.tgz", - "integrity": "sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==", - "license": "MIT", - "dependencies": { - "@react-dnd/invariant": "^4.0.1", - "@react-dnd/shallowequal": "^4.0.1", - "dnd-core": "^16.0.1", - "fast-deep-equal": "^3.1.3", - "hoist-non-react-statics": "^3.3.2" - }, - "peerDependencies": { - "@types/hoist-non-react-statics": ">= 3.3.1", - "@types/node": ">= 12", - "@types/react": ">= 16", - "react": ">= 16.14" - }, - "peerDependenciesMeta": { - "@types/hoist-non-react-statics": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-dnd-html5-backend": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.1.tgz", - "integrity": "sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==", - "license": "MIT", - "dependencies": { - "dnd-core": "^16.0.1" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-dom/node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/react-fast-compare": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", - "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==", - "license": "MIT" - }, - "node_modules/react-helmet": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", - "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", - "license": "MIT", - "dependencies": { - "object-assign": "^4.1.1", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.1.1", - "react-side-effect": "^2.1.0" - }, - "peerDependencies": { - "react": ">=16.3.0" - } - }, - "node_modules/react-helmet/node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", - "license": "MIT" - }, - "node_modules/react-intl": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-6.6.2.tgz", - "integrity": "sha512-IpW2IkLtGENSFlX3vfH11rjuCIsW0VyjT0Q1pPKMZPtT2z1FxLt4weFT5Ezti2TScT1xiyb3aQBFth9EB7jzAg==", - "license": "BSD-3-Clause", - "dependencies": { - "@formatjs/ecma402-abstract": "1.18.2", - "@formatjs/icu-messageformat-parser": "2.7.6", - "@formatjs/intl": "2.10.0", - "@formatjs/intl-displaynames": "6.6.6", - "@formatjs/intl-listformat": "7.5.5", - "@types/hoist-non-react-statics": "^3.3.1", - "@types/react": "16 || 17 || 18", - "hoist-non-react-statics": "^3.3.2", - "intl-messageformat": "10.5.11", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "react": "^16.6.0 || 17 || 18", - "typescript": "^4.7 || 5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, - "node_modules/react-query": { - "version": "3.39.3", - "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", - "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.5.5", - "broadcast-channel": "^3.4.1", - "match-sorter": "^6.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/react-redux": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", - "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.1", - "@types/hoist-non-react-statics": "^3.3.1", - "@types/use-sync-external-store": "^0.0.3", - "hoist-non-react-statics": "^3.3.2", - "react-is": "^18.0.0", - "use-sync-external-store": "^1.0.0" - }, - "peerDependencies": { - "@types/react": "^16.8 || ^17.0 || ^18.0", - "@types/react-dom": "^16.8 || ^17.0 || ^18.0", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0", - "react-native": ">=0.59", - "redux": "^4 || ^5.0.0-beta.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - }, - "redux": { - "optional": true - } - } - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-remove-scroll": { - "version": "2.5.10", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.10.tgz", - "integrity": "sha512-m3zvBRANPBw3qxVVjEIPEQinkcwlFZ4qyomuWVpNJdv4c6MvHfXV0C3L9Jx5rr3HeBHKNRX+1jreB5QloDIJjA==", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.6", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", - "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", - "license": "MIT", - "dependencies": { - "react-style-singleton": "^2.2.2", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-router": { - "version": "6.30.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.0.tgz", - "integrity": "sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==", - "license": "MIT", - "dependencies": { - "@remix-run/router": "1.23.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/react-router-dom": { - "version": "6.30.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.0.tgz", - "integrity": "sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==", - "license": "MIT", - "dependencies": { - "@remix-run/router": "1.23.0", - "react-router": "6.30.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/react-select": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.8.0.tgz", - "integrity": "sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.0", - "@emotion/cache": "^11.4.0", - "@emotion/react": "^11.8.1", - "@floating-ui/dom": "^1.0.1", - "@types/react-transition-group": "^4.4.0", - "memoize-one": "^6.0.0", - "prop-types": "^15.6.0", - "react-transition-group": "^4.3.0", - "use-isomorphic-layout-effect": "^1.1.2" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-side-effect": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz", - "integrity": "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==", - "license": "MIT", - "peerDependencies": { - "react": "^16.3.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", - "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", - "license": "MIT", - "dependencies": { - "get-nonce": "^1.0.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/react-window": { - "version": "1.8.10", - "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.10.tgz", - "integrity": "sha512-Y0Cx+dnU6NLa5/EvoHukUD0BklJ8qITCtVEPY1C/nL8wwoZ0b5aEw8Ff1dOVHw7fCzMt55XfJDd8S8W8LCaUCg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.0.0", - "memoize-one": ">=3.1.1 <6" - }, - "engines": { - "node": ">8.0.0" - }, - "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-window/node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "license": "MIT" - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "license": "MIT", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "license": "MIT", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, - "node_modules/redux-thunk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", - "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", - "license": "MIT", - "peerDependencies": { - "redux": "^4" - } - }, - "node_modules/registry-auth-token": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", - "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", - "license": "MIT", - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "license": "MIT", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remove-accents": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", - "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", - "license": "MIT" - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/request-compose": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/request-compose/-/request-compose-2.1.7.tgz", - "integrity": "sha512-27amNkWTK4Qq25XEwdmrhb4VLMiQzRSKuDfsy1o1griykcyXk5MxMHmJG+OKTRdO9PgsO7Kkn7GrEkq0UAIIMQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/request-ip": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/request-ip/-/request-ip-3.3.0.tgz", - "integrity": "sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA==", - "license": "MIT" - }, - "node_modules/request-multipart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/request-multipart/-/request-multipart-1.0.0.tgz", - "integrity": "sha512-dazx88T19dIKFNc0XdlZV8H46D2RmNFdR4mipcbrFOaN70PSSSMM3urVY+eVbrpraf/fHXccxFhLvG1wkSUtKQ==", - "license": "Apache-2.0", - "dependencies": { - "bl": "^4.0.3", - "isstream": "^0.1.2", - "mime-types": "^2.1.28", - "multistream": "^4.0.1", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/request-oauth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/request-oauth/-/request-oauth-1.0.1.tgz", - "integrity": "sha512-85THTg1RgOYtqQw42JON6AqvHLptlj1biw265Tsq4fD4cPdUvhDB2Qh9NTv17yCD322ROuO9aOmpc4GyayGVBA==", - "license": "Apache-2.0", - "dependencies": { - "oauth-sign": "^0.9.0", - "qs": "^6.9.6", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/reselect": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", - "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==", - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "license": "MIT" - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-path": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", - "integrity": "sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==", - "license": "MIT", - "dependencies": { - "http-errors": "~1.6.2", - "path-is-absolute": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/resolve-path/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/resolve-path/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/resolve-path/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "license": "ISC" - }, - "node_modules/resolve-path/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "license": "ISC" - }, - "node_modules/resolve-path/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "license": "BSD-3-Clause", - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/rollup": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", - "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.7" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.40.2", - "@rollup/rollup-android-arm64": "4.40.2", - "@rollup/rollup-darwin-arm64": "4.40.2", - "@rollup/rollup-darwin-x64": "4.40.2", - "@rollup/rollup-freebsd-arm64": "4.40.2", - "@rollup/rollup-freebsd-x64": "4.40.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", - "@rollup/rollup-linux-arm-musleabihf": "4.40.2", - "@rollup/rollup-linux-arm64-gnu": "4.40.2", - "@rollup/rollup-linux-arm64-musl": "4.40.2", - "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", - "@rollup/rollup-linux-riscv64-gnu": "4.40.2", - "@rollup/rollup-linux-riscv64-musl": "4.40.2", - "@rollup/rollup-linux-s390x-gnu": "4.40.2", - "@rollup/rollup-linux-x64-gnu": "4.40.2", - "@rollup/rollup-linux-x64-musl": "4.40.2", - "@rollup/rollup-win32-arm64-msvc": "4.40.2", - "@rollup/rollup-win32-ia32-msvc": "4.40.2", - "@rollup/rollup-win32-x64-msvc": "4.40.2", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/sanitize-html": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.13.0.tgz", - "integrity": "sha512-Xff91Z+4Mz5QiNSLdLWwjgBDm5b1RU6xBT0+12rapjiaR7SwfRdjw8f+6Rir2MXKLrDicRFHdb51hGOAxmsUIA==", - "license": "MIT", - "dependencies": { - "deepmerge": "^4.2.2", - "escape-string-regexp": "^4.0.0", - "htmlparser2": "^8.0.0", - "is-plain-object": "^5.0.0", - "parse-srcset": "^1.0.2", - "postcss": "^8.3.11" - } - }, - "node_modules/sanitize-html/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/sanitize-html/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/sanitize-html/node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/sanitize-html/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/sanitize-html/node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/scroll-into-view-if-needed": { - "version": "2.2.31", - "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", - "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", - "license": "MIT", - "dependencies": { - "compute-scroll-into-view": "^1.0.20" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "license": "MIT" - }, - "node_modules/sendmail": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/sendmail/-/sendmail-1.6.1.tgz", - "integrity": "sha512-lIhvnjSi5e5jL8wA1GPP6j2QVlx6JOEfmdn0QIfmuJdmXYGmJ375kcOU0NSm/34J+nypm4sa1AXrYE5w3uNIIA==", - "license": "MIT", - "dependencies": { - "dkim-signer": "0.2.2", - "mailcomposer": "3.12.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/sentence-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", - "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0", - "upper-case-first": "^1.1.2" - } - }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "license": "MIT" - }, - "node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" - } - }, - "node_modules/sharp/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shiki": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz", - "integrity": "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==", - "license": "MIT", - "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sift": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", - "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==", - "license": "MIT" - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT" - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/slate": { - "version": "0.94.1", - "resolved": "https://registry.npmjs.org/slate/-/slate-0.94.1.tgz", - "integrity": "sha512-GH/yizXr1ceBoZ9P9uebIaHe3dC/g6Plpf9nlUwnvoyf6V1UOYrRwkabtOCd3ZfIGxomY4P7lfgLr7FPH8/BKA==", - "license": "MIT", - "dependencies": { - "immer": "^9.0.6", - "is-plain-object": "^5.0.0", - "tiny-warning": "^1.0.3" - } - }, - "node_modules/slate-history": { - "version": "0.93.0", - "resolved": "https://registry.npmjs.org/slate-history/-/slate-history-0.93.0.tgz", - "integrity": "sha512-Gr1GMGPipRuxIz41jD2/rbvzPj8eyar56TVMyJBvBeIpQSSjNISssvGNDYfJlSWM8eaRqf6DAcxMKzsLCYeX6g==", - "license": "MIT", - "dependencies": { - "is-plain-object": "^5.0.0" - }, - "peerDependencies": { - "slate": ">=0.65.3" - } - }, - "node_modules/slate-react": { - "version": "0.98.3", - "resolved": "https://registry.npmjs.org/slate-react/-/slate-react-0.98.3.tgz", - "integrity": "sha512-p1BnF9eRyRM0i5hkgOb11KgmpWLQm9Zyp6jVkOAj5fPdIGheKhg48Z7aWKrayeJ4nmRyi/NjRZz/io5hQcphmw==", - "license": "MIT", - "dependencies": { - "@juggle/resize-observer": "^3.4.0", - "@types/is-hotkey": "^0.1.1", - "@types/lodash": "^4.14.149", - "direction": "^1.0.3", - "is-hotkey": "^0.1.6", - "is-plain-object": "^5.0.0", - "lodash": "^4.17.4", - "scroll-into-view-if-needed": "^2.2.20", - "tiny-invariant": "1.0.6" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0", - "slate": ">=0.65.3" - } - }, - "node_modules/snake-case": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", - "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/sorted-array-functions": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", - "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==", - "license": "MIT" - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "license": "MIT" - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawn-command": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", - "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==" - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "license": "CC0-1.0" - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "license": "ISC", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "license": "BSD-3-Clause" - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stream-chain": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", - "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", - "license": "BSD-3-Clause" - }, - "node_modules/stream-json": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.8.0.tgz", - "integrity": "sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==", - "license": "BSD-3-Clause", - "dependencies": { - "stream-chain": "^2.2.5" - } - }, - "node_modules/stream-slice": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/stream-slice/-/stream-slice-0.1.2.tgz", - "integrity": "sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA==", - "license": "MIT" - }, - "node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "license": "MIT" - }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "license": "MIT", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/style-loader": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", - "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", - "license": "MIT", - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/style-mod": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", - "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", - "license": "MIT" - }, - "node_modules/styled-components": { - "version": "6.1.18", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.18.tgz", - "integrity": "sha512-Mvf3gJFzZCkhjY2Y/Fx9z1m3dxbza0uI9H1CbNZm/jSHCojzJhQ0R7bByrlFJINnMzz/gPulpoFFGymNwrsMcw==", - "license": "MIT", - "dependencies": { - "@emotion/is-prop-valid": "1.2.2", - "@emotion/unitless": "0.8.1", - "@types/stylis": "4.2.5", - "css-to-react-native": "3.2.0", - "csstype": "3.1.3", - "postcss": "8.4.49", - "shallowequal": "1.1.0", - "stylis": "4.3.2", - "tslib": "2.6.2" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0" - } - }, - "node_modules/styled-components/node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", - "license": "MIT" - }, - "node_modules/styled-components/node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/styled-components/node_modules/stylis": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", - "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", - "license": "MIT" - }, - "node_modules/styled-components/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "license": "0BSD" - }, - "node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", - "license": "MIT" - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/swap-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", - "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", - "license": "MIT", - "dependencies": { - "lower-case": "^1.1.1", - "upper-case": "^1.1.1" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tar-stream/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/tarn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", - "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/terser": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", - "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT" - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT" - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/through2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/through2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/tildify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", - "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/tiny-invariant": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.6.tgz", - "integrity": "sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==", - "license": "MIT" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", - "license": "MIT" - }, - "node_modules/title-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", - "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.0.3" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/toposort": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==", - "license": "MIT" - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/touch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", - "license": "ISC", - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", - "license": "MIT", - "engines": { - "node": ">=0.6.x" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "license": "MIT" - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/umzug": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/umzug/-/umzug-3.8.1.tgz", - "integrity": "sha512-k0HjOc3b/s8vH24BUTvnaFiKhfWI9UQAGpqHDG+3866CGlBTB83Xs5wZ1io1mwYLj/GHvQ34AxKhbpYnWtkRJg==", - "license": "MIT", - "dependencies": { - "@rushstack/ts-command-line": "^4.12.2", - "emittery": "^0.13.0", - "fast-glob": "^3.3.2", - "pony-cause": "^2.1.4", - "type-fest": "^4.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/umzug/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "license": "MIT" - }, - "node_modules/undici": { - "version": "6.21.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.2.tgz", - "integrity": "sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==", - "license": "MIT", - "engines": { - "node": ">=18.17" - } - }, - "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "license": "MIT" - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "license": "MIT", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unload": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", - "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.6.2", - "detect-node": "^2.0.4" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", - "license": "MIT" - }, - "node_modules/upper-case-first": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", - "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", - "license": "MIT", - "dependencies": { - "upper-case": "^1.1.1" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "license": "MIT" - }, - "node_modules/use-callback-ref": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", - "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.0.tgz", - "integrity": "sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", - "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", - "license": "MIT", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", - "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8flags": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.1.tgz", - "integrity": "sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==", - "license": "MIT", - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "5.4.17", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.17.tgz", - "integrity": "sha512-5+VqZryDj4wgCs55o9Lp+p8GE78TLVg0lasCH5xFZ4jacZjtqZa6JUw9/p0WeAojaOfncSM6v77InkFPGnvPvg==", - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "license": "MIT" - }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "license": "MIT" - }, - "node_modules/w3c-keyname": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", - "license": "MIT" - }, - "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webpack": { - "version": "5.99.8", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.8.tgz", - "integrity": "sha512-lQ3CPiSTpfOnrEGeXDwoq5hIGzSjmwD72GdfVzF7CQAI7t47rJG9eDWvcEkEn3CUQymAElVvDg3YNTlCYj+qUQ==", - "license": "MIT", - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "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.11", - "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": "^4.3.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", - "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", - "license": "MIT", - "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", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", - "integrity": "sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==", - "license": "MIT", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.12", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "node_modules/webpack-hot-middleware": { - "version": "2.26.1", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.26.1.tgz", - "integrity": "sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==", - "license": "MIT", - "dependencies": { - "ansi-html-community": "0.0.8", - "html-entities": "^2.1.0", - "strip-ansi": "^6.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "license": "MIT", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/webpack-sources/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-pm": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", - "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", - "license": "MIT", - "dependencies": { - "load-yaml-file": "^0.2.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8.15" - } - }, - "node_modules/which-pm/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "license": "MIT", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/winston": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz", - "integrity": "sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==", - "license": "MIT", - "dependencies": { - "@colors/colors": "1.5.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.4.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.5.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", - "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", - "license": "MIT", - "dependencies": { - "logform": "^2.7.0", - "readable-stream": "^3.6.2", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/winston-transport/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/winston/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/winston/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xdg-app-paths": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/xdg-app-paths/-/xdg-app-paths-8.3.0.tgz", - "integrity": "sha512-mgxlWVZw0TNWHoGmXq+NC3uhCIc55dDpAlDkMQUaIAcQzysb0kxctwv//fvuW61/nAAeUBJMQ8mnZjMmuYwOcQ==", - "license": "MIT", - "dependencies": { - "xdg-portable": "^10.6.0" - }, - "engines": { - "node": ">= 4.0" - }, - "optionalDependencies": { - "fsevents": "*" - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/xdg-portable": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/xdg-portable/-/xdg-portable-10.6.0.tgz", - "integrity": "sha512-xrcqhWDvtZ7WLmt8G4f3hHy37iK7D2idtosRgkeiSPZEPmBShp0VfmRBLWAPC6zLF48APJ21yfea+RfQMF4/Aw==", - "license": "MIT", - "dependencies": { - "os-paths": "^7.4.0" - }, - "engines": { - "node": ">= 4.0" - }, - "optionalDependencies": { - "fsevents": "*" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yalc": { - "version": "1.0.0-pre.53", - "resolved": "https://registry.npmjs.org/yalc/-/yalc-1.0.0-pre.53.tgz", - "integrity": "sha512-tpNqBCpTXplnduzw5XC+FF8zNJ9L/UXmvQyyQj7NKrDNavbJtHvzmZplL5ES/RCnjX7JR7W9wz5GVDXVP3dHUQ==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "detect-indent": "^6.0.0", - "fs-extra": "^8.0.1", - "glob": "^7.1.4", - "ignore": "^5.0.4", - "ini": "^2.0.0", - "npm-packlist": "^2.1.5", - "yargs": "^16.1.1" - }, - "bin": { - "yalc": "src/yalc.js" - } - }, - "node_modules/yalc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/yalc/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/yalc/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/yalc/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/yalc/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yalc/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/yalc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/yalc/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/yalc/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yalc/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/ylru": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", - "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yup": { - "version": "0.32.9", - "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.9.tgz", - "integrity": "sha512-Ci1qN+i2H0XpY7syDQ0k5zKQ/DoxO0LzPg8PAR/X4Mpj6DqaeCoIYEEjDJwhArh3Fa7GWbQQVDZKeXYlSH4JMg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.5", - "@types/lodash": "^4.14.165", - "lodash": "^4.17.20", - "lodash-es": "^4.17.15", - "nanoclone": "^0.2.1", - "property-expr": "^2.0.4", - "toposort": "^2.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/zod": { - "version": "3.24.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", - "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/Dockers/strapi/strapi/package.json b/Dockers/strapi/strapi/package.json index 4df3472..23522df 100644 --- a/Dockers/strapi/strapi/package.json +++ b/Dockers/strapi/strapi/package.json @@ -1,41 +1,182 @@ { "name": "strapi", - "version": "0.1.0", "private": true, - "description": "A Strapi application", - "scripts": { - "build": "strapi build", - "console": "strapi console", - "deploy": "strapi deploy", - "dev": "strapi develop", - "develop": "strapi develop", - "start": "strapi start", - "strapi": "strapi", - "upgrade": "npx @strapi/upgrade latest", - "upgrade:dry": "npx @strapi/upgrade latest --dry" + "bugs": { + "url": "https://github.com/strapi/strapi/issues" }, - "dependencies": { - "@strapi/plugin-cloud": "5.13.0", - "@strapi/plugin-users-permissions": "5.13.0", - "@strapi/strapi": "5.13.0", - "pg": "8.8.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", - "react-router-dom": "^6.0.0", - "styled-components": "^6.0.0" + "repository": { + "type": "git", + "url": "git://github.com/strapi/strapi.git" + }, + "license": "SEE LICENSE IN LICENSE", + "author": { + "name": "Strapi Solutions SAS", + "email": "hi@strapi.io", + "url": "https://strapi.io" + }, + "maintainers": [ + { + "name": "Strapi Solutions SAS", + "email": "hi@strapi.io", + "url": "https://strapi.io" + } + ], + "workspaces": [ + "packages/*", + "packages/*/*", + "examples/*", + "examples/plugins/*", + "examples/*/src/plugins/*", + ".github/actions/*", + "scripts/*" + ], + "scripts": { + "build": "nx run-many --targets build:code,build:types --nx-ignore-cycles", + "build:code": "nx run-many --target=build:code --nx-ignore-cycles", + "build:types": "nx run-many --target=build:types --nx-ignore-cycles", + "watch": "nx watch --all -- 'nx run-many --targets build:code,build:types --projects $NX_PROJECT_NAME'", + "build:size": "cd examples/getstarted && yarn build", + "build:ts": "nx run-many --target=build:ts --nx-ignore-cycles", + "build:watch": "nx watch --all --nx-ignore-cycles -- nx run \\$NX_PROJECT_NAME:build --nx-ignore-cycles", + "clean": "nx run-many --target=clean --nx-ignore-cycles", + "commit": "commit", + "doc:api": "node scripts/open-api/serve.js", + "format": "yarn format:code && yarn format:other", + "format:code": "yarn prettier:code --write", + "format:other": "yarn prettier:other --write", + "lint": "nx run-many --target=lint --nx-ignore-cycles && yarn lint:other", + "lint:fix": "nx run-many --target=lint --nx-ignore-cycles -- --fix", + "lint:other": "npm run prettier:other -- --check", + "prepare": "husky install", + "prettier:check": "yarn prettier:code --check && yarn prettier:other --check", + "prettier:code": "prettier --cache --cache-strategy content \"**/*.{js,ts,jsx,tsx,json}\"", + "prettier:other": "prettier --cache --cache-strategy content \"**/*.{md,mdx,css,scss,yaml,yml}\"", + "prettier:write": "prettier --write \"**/*.{js,ts,jsx,tsx,json,md,mdx,css,scss,yaml,yml}\"", + "release": "node scripts/release.js", + "setup": "yarn && yarn clean && yarn build --skip-nx-cache", + "test:api": "node tests/scripts/run-api-tests.js", + "test:api:clean": "rimraf ./coverage", + "test:clean": "run-s -c test:api:clean test:e2e:clean test:cli:clean", + "test:cli": "node tests/scripts/run-cli-tests.js", + "test:cli:clean": "node tests/scripts/run-cli-tests.js clean", + "test:cli:debug": "node tests/scripts/run-cli-tests.js --debug", + "test:e2e": "node tests/scripts/run-e2e-tests.js", + "test:e2e:clean": "node tests/scripts/run-e2e-tests.js clean", + "test:front": "cross-env IS_EE=true jest --config jest.config.front.js --runInBand", + "test:front:all": "cross-env IS_EE=true nx run-many --target=test:front --nx-ignore-cycles", + "test:front:all:ce": "cross-env IS_EE=false nx run-many --target=test:front:ce --nx-ignore-cycles", + "test:front:ce": "cross-env IS_EE=false run test:front", + "test:front:update": "run test:front -u", + "test:front:update:ce": "yarn test:front:ce -u", + "test:front:watch": "cross-env IS_EE=true run test:front --watch", + "test:front:watch:ce": "cross-env IS_EE=false run test:front --watch", + "test:generate-app": "yarn build:ts && node tests/scripts/generate-test-app.js", + "test:generate-app:no-build": "node tests/scripts/generate-test-app.js", + "test:ts": "yarn test:ts:packages && yarn test:ts:front && yarn test:ts:back", + "test:ts:back": "nx run-many --target=test:ts:back --nx-ignore-cycles", + "test:ts:front": "nx run-many --target=test:ts:front --nx-ignore-cycles", + "test:ts:packages": "nx run-many --target=test:ts --nx-ignore-cycles", + "test:unit": "jest --config jest.config.js", + "test:unit:update": "jest --config jest.config.js -u", + "test:unit:all": "nx run-many --target=test:unit --nx-ignore-cycles", + "test:unit:watch": "run test:unit --watch" + }, + "resolutions": { + "@types/koa": "2.13.4", + "@babel/core": "7.26.10", + "@babel/runtime": "7.26.10", + "@babel/runtime-corejs3": "7.26.10" }, "devDependencies": { - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "typescript": "^5" + "@babel/core": "7.26.10", + "@babel/eslint-parser": "^7.27.0", + "@babel/preset-react": "7.26.3", + "@commitlint/cli": "19.2.0", + "@commitlint/config-conventional": "19.1.0", + "@commitlint/prompt-cli": "19.2.0", + "@nx/js": "20.4.6", + "@playwright/test": "1.48.2", + "@rollup/plugin-commonjs": "28.0.1", + "@rollup/plugin-dynamic-import-vars": "2.1.5", + "@rollup/plugin-image": "3.0.3", + "@rollup/plugin-json": "6.1.0", + "@rollup/plugin-node-resolve": "15.3.0", + "@rollup/plugin-swc": "0.4.0", + "@strapi/admin-test-utils": "workspace:*", + "@strapi/eslint-config": "0.2.0", + "@swc-node/register": "~1.9.1", + "@swc/cli": "0.3.10", + "@swc/core": "1.4.8", + "@swc/helpers": "0.5.7", + "@swc/jest": "0.2.36", + "@types/fs-extra": "11.0.4", + "@types/git-url-parse": "9.0.3", + "@types/prompts": "2.4.9", + "@types/react": "18.3.2", + "@types/react-dom": "18.3.0", + "@typescript-eslint/eslint-plugin": "6.7.3", + "@typescript-eslint/parser": "6.7.3", + "chalk": "4.1.2", + "chokidar": "3.6.0", + "coffee": "5.5.1", + "core-js": "3.36.0", + "create-strapi-app": "workspace:*", + "cross-env": "7.0.3", + "dotenv": "16.4.5", + "eslint": "8.50.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-airbnb-typescript": "^17.1.0", + "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "3.6.1", + "eslint-plugin-check-file": "2.6.2", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jest-dom": "5.1.0", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-rxjs": "5.0.3", + "eslint-plugin-testing-library": "6.0.2", + "execa": "5.1.1", + "find-up": "5.0.0", + "fs-extra": "11.2.0", + "get-port": "5.1.1", + "glob": "10.3.10", + "husky": "8.0.3", + "inquirer": "8.2.5", + "jest": "29.6.0", + "jest-circus": "29.6.0", + "jest-cli": "29.6.0", + "jest-environment-jsdom": "29.6.1", + "jest-watch-typeahead": "2.2.2", + "lerna": "8.2.0", + "lint-staged": "15.2.10", + "lodash": "4.17.21", + "npm-run-all": "4.1.5", + "nx": "20.4.6", + "plop": "4.0.1", + "prettier": "3.3.3", + "prettier-2": "npm:prettier@^2", + "qs": "6.11.1", + "rimraf": "5.0.5", + "rollup": "4.27.4", + "rollup-plugin-html": "0.2.1", + "semver": "7.5.4", + "stream-chain": "2.2.5", + "stream-json": "1.8.0", + "supertest": "6.3.3", + "tar": "6.2.1", + "ts-jest": "29.1.0", + "typescript": "5.4.4", + "yalc": "1.0.0-pre.53", + "yargs": "17.7.2" }, + "packageManager": "yarn@4.5.0", "engines": { "node": ">=18.0.0 <=22.x.x", "npm": ">=6.0.0" }, - "strapi": { - "uuid": "a5e7d420-c9db-467a-b641-c2d46a4b6944", - "installId": "e487c2e54e1c70b1e697d57a039937cce1954444d01e42a1d557cd8d5d1e28e6" - } + "isStrapiMonorepo": true } diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/.eslintignore b/Dockers/strapi/strapi/packages/admin-test-utils/.eslintignore new file mode 100644 index 0000000..498c517 --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/.eslintignore @@ -0,0 +1,4 @@ +node_modules/ +dist/ +.eslintrc.js +rollup.config.mjs diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/.eslintrc.js b/Dockers/strapi/strapi/packages/admin-test-utils/.eslintrc.js new file mode 100644 index 0000000..cab8fe8 --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + root: true, + extends: ['custom/back/typescript'], + parserOptions: { + project: ['./tsconfig.json'], + }, +}; diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/.gitignore b/Dockers/strapi/strapi/packages/admin-test-utils/.gitignore new file mode 100755 index 0000000..9585e32 --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/.gitignore @@ -0,0 +1,99 @@ +############################ +# OS X +############################ + +.DS_Store +.AppleDouble +.LSOverride +Icon +.Spotlight-V100 +.Trashes +._* + +############################ +# Linux +############################ + +*~ + +############################ +# Windows +############################ + +Thumbs.db +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ +*.cab +*.msi +*.msm +*.msp + +############################ +# Packages +############################ + +*.7z +*.csv +*.dat +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip +*.com +*.class +*.dll +*.exe +*.o +*.seed +*.so +*.swo +*.swp +*.swn +*.swm +*.out +*.pid + +############################ +# Logs and databases +############################ + +.tmp +*.log +*.sql +*.sqlite + +############################ +# Misc. +############################ + +*# +.idea +nbproject + +############################ +# Node.js +############################ + +lib-cov +lcov.info +pids +logs +results +build +node_modules +.node_history +package-lock.json + +############################ +# Tests +############################ + +testApp +coverage + +dist/ +docs/ diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/LICENSE b/Dockers/strapi/strapi/packages/admin-test-utils/LICENSE new file mode 100644 index 0000000..d82875f --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/LICENSE @@ -0,0 +1,37 @@ +Copyright (c) 2015-present Strapi Solutions SAS + +Portions of the Strapi software are licensed as follows: + +* All software that resides under an "ee/" directory (the “EE Software”), if that directory exists, is licensed under the license defined below. + +Enterprise License + +If you or the company you represent has entered into a written agreement referencing the Enterprise Edition of the Strapi source code available at +https://github.com/strapi/strapi, then such agreement applies to your use of the Enterprise Edition of the Strapi Software. If you or the company you +represent is using the Enterprise Edition of the Strapi Software in connection with a subscription to our cloud offering, then the agreement you have +agreed to with respect to our cloud offering and the licenses included in such agreement apply to your use of the Enterprise Edition of the Strapi Software. +Otherwise, the Strapi Enterprise Software License Agreement (found here https://strapi.io/enterprise-terms) applies to your use of the Enterprise Edition of the Strapi Software. + +BY ACCESSING OR USING THE ENTERPRISE EDITION OF THE STRAPI SOFTWARE, YOU ARE AGREEING TO BE BOUND BY THE RELEVANT REFERENCED AGREEMENT. +IF YOU ARE NOT AUTHORIZED TO ACCEPT THESE TERMS ON BEHALF OF THE COMPANY YOU REPRESENT OR IF YOU DO NOT AGREE TO ALL OF THE RELEVANT TERMS AND CONDITIONS REFERENCED AND YOU +HAVE NOT OTHERWISE EXECUTED A WRITTEN AGREEMENT WITH STRAPI, YOU ARE NOT AUTHORIZED TO ACCESS OR USE OR ALLOW ANY USER TO ACCESS OR USE ANY PART OF +THE ENTERPRISE EDITION OF THE STRAPI SOFTWARE. YOUR ACCESS RIGHTS ARE CONDITIONAL ON YOUR CONSENT TO THE RELEVANT REFERENCED TERMS TO THE EXCLUSION OF ALL OTHER TERMS; +IF THE RELEVANT REFERENCED TERMS ARE CONSIDERED AN OFFER BY YOU, ACCEPTANCE IS EXPRESSLY LIMITED TO THE RELEVANT REFERENCED TERMS. + +* All software outside of the above-mentioned directories or restrictions above is available under the "MIT Expat" license as set forth below. + +MIT Expat License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/README.md b/Dockers/strapi/strapi/packages/admin-test-utils/README.md new file mode 100644 index 0000000..e69de29 diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/custom.d.ts b/Dockers/strapi/strapi/packages/admin-test-utils/custom.d.ts new file mode 100644 index 0000000..4e08ece --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/custom.d.ts @@ -0,0 +1,23 @@ +export {}; + +declare global { + interface Window { + strapi: { + backendURL: string; + isEE: boolean; + features: { + SSO: 'sso'; + isEnabled: (featureName?: string) => boolean; + }; + future: { + isEnabled: (name: string) => boolean; + }; + projectType: string; + telemetryDisabled: boolean; + flags: { + nps: boolean; + promoteEE: boolean; + }; + }; + } +} diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/package.json b/Dockers/strapi/strapi/packages/admin-test-utils/package.json new file mode 100644 index 0000000..e77d73d --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/package.json @@ -0,0 +1,101 @@ +{ + "name": "@strapi/admin-test-utils", + "version": "5.24.1", + "private": true, + "description": "Test utilities for the Strapi administration panel", + "license": "MIT", + "author": { + "name": "Strapi Solutions SAS", + "email": "hi@strapi.io", + "url": "https://strapi.io" + }, + "maintainers": [ + { + "name": "Strapi Solutions SAS", + "email": "hi@strapi.io", + "url": "https://strapi.io" + } + ], + "exports": { + ".": { + "types": "./dist/index.d.ts", + "module": "./dist/index.mjs", + "require": "./dist/index.js", + "source": "./src/index.ts", + "default": "./dist/index.js" + }, + "./after-env": { + "types": "./dist/after-env.d.ts", + "module": "./dist/after-env.mjs", + "require": "./dist/after-env.js", + "source": "./src/after-env.ts", + "default": "./dist/after-env.js" + }, + "./environment": { + "types": "./dist/environment.d.ts", + "module": "./dist/environment.mjs", + "require": "./dist/environment.js", + "source": "./src/environment.ts", + "default": "./dist/environment.js" + }, + "./file-mock": { + "types": "./dist/file-mock.d.ts", + "module": "./dist/file-mock.mjs", + "require": "./dist/file-mock.js", + "source": "./src/file-mock.ts", + "default": "./dist/file-mock.js" + }, + "./global-setup": { + "types": "./dist/global-setup.d.ts", + "module": "./dist/global-setup.mjs", + "require": "./dist/global-setup.js", + "source": "./src/global-setup.ts", + "default": "./dist/global-setup.js" + }, + "./setup": { + "types": "./dist/setup.d.ts", + "module": "./dist/setup.mjs", + "require": "./dist/setup.js", + "source": "./src/setup.ts", + "default": "./dist/setup.js" + }, + "./package.json": "./package.json" + }, + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "source": "./src/index.ts", + "types": "./dist/index.d.ts", + "scripts": { + "build": "run -T run-p build:code build:types", + "build:code": "run -T rollup -c", + "build:types": "run -T tsc -p tsconfig.build.json --emitDeclarationOnly", + "watch": "run -T run-p watch:code watch:types", + "watch:code": "run -T rollup -c -w", + "watch:types": "run -T tsc -p tsconfig.build.json --emitDeclarationOnly -w", + "clean": "run -T rimraf ./dist", + "lint": "run -T eslint .", + "test:ts": "run -T tsc --noEmit" + }, + "dependencies": { + "@juggle/resize-observer": "3.4.0", + "jest-styled-components": "7.1.1", + "whatwg-fetch": "3.6.2" + }, + "devDependencies": { + "@reduxjs/toolkit": "1.9.7", + "@testing-library/jest-dom": "6.4.5", + "eslint-config-custom": "5.24.1", + "jest-environment-jsdom": "29.6.1", + "styled-components": "6.1.8", + "tsconfig": "5.24.1" + }, + "peerDependencies": { + "@reduxjs/toolkit": "^1.9.7", + "@testing-library/jest-dom": "^5.16.5", + "jest-environment-jsdom": "^29.0.0", + "styled-components": "^6.0.0" + }, + "engines": { + "node": ">=18.0.0 <=22.x.x" + } +} diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/rollup.config.mjs b/Dockers/strapi/strapi/packages/admin-test-utils/rollup.config.mjs new file mode 100644 index 0000000..3e53109 --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/rollup.config.mjs @@ -0,0 +1,12 @@ +import { baseConfig } from '../../rollup.utils.mjs'; + +export default baseConfig({ + input: { + index: './src/index.ts', + 'after-env': './src/after-env.ts', + environment: './src/environment.ts', + 'file-mock': './src/file-mock.ts', + 'global-setup': './src/global-setup.ts', + setup: './src/setup.ts', + }, +}); diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/src/after-env.ts b/Dockers/strapi/strapi/packages/admin-test-utils/src/after-env.ts new file mode 100644 index 0000000..d8082c0 --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/src/after-env.ts @@ -0,0 +1,7 @@ +import '@testing-library/jest-dom'; +import 'jest-styled-components'; +import 'whatwg-fetch'; + +// Note: We set this here because setting it in the config is broken for projects: https://github.com/jestjs/jest/issues/9696 +// Also, there are issues with async tests unless it is set at global scope: https://github.com/jestjs/jest/issues/11543 +jest.setTimeout(60 * 1000); diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/src/environment.ts b/Dockers/strapi/strapi/packages/admin-test-utils/src/environment.ts new file mode 100644 index 0000000..e7a1ae0 --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/src/environment.ts @@ -0,0 +1,15 @@ +import { TestEnvironment } from 'jest-environment-jsdom'; + +/* ------------------------------------------------------------------------------------------------- + * JSDOM env + * -----------------------------------------------------------------------------------------------*/ + +// https://github.com/facebook/jest/blob/v29.4.3/website/versioned_docs/version-29.4/Configuration.md#testenvironment-string +export default class CustomJSDOMEnvironment extends TestEnvironment { + constructor(...args: ConstructorParameters) { + super(...args); + + // TODO: remove once https://github.com/jsdom/jsdom/issues/3363 is closed. + this.global.structuredClone = structuredClone; + } +} diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/src/file-mock.ts b/Dockers/strapi/strapi/packages/admin-test-utils/src/file-mock.ts new file mode 100644 index 0000000..112fb2e --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/src/file-mock.ts @@ -0,0 +1 @@ +export default 'IMAGE_MOCK'; diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/collection-types/address.ts b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/collection-types/address.ts new file mode 100644 index 0000000..8eb77c9 --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/collection-types/address.ts @@ -0,0 +1,423 @@ +const address = { + uid: 'api::address.address', + settings: { + bulkable: true, + filterable: true, + searchable: true, + pageSize: 10, + mainField: 'postal_coder', + defaultSortBy: 'postal_coder', + defaultSortOrder: 'ASC', + }, + metadatas: { + id: { edit: {}, list: { label: 'Id', searchable: true, sortable: true } }, + postal_coder: { + edit: { + label: 'Postal_coder', + description: '', + placeholder: '', + visible: true, + editable: true, + }, + list: { label: 'Postal_coder', searchable: true, sortable: true }, + }, + categories: { + list: { + label: 'Categories', + searchable: false, + sortable: false, + mainField: { name: 'name', schema: { type: 'string' } }, + }, + edit: { + label: 'Categories', + description: '', + placeholder: '', + visible: true, + editable: true, + mainField: { name: 'name', schema: { type: 'string' } }, + }, + }, + cover: { + edit: { label: 'Cover', description: '', placeholder: '', visible: true, editable: true }, + list: { label: 'Cover', searchable: false, sortable: false }, + }, + images: { + edit: { label: 'Images', description: '', placeholder: '', visible: true, editable: true }, + list: { label: 'Images', searchable: false, sortable: false }, + }, + city: { + edit: { label: 'City', description: '', placeholder: '', visible: true, editable: true }, + list: { label: 'City', searchable: true, sortable: true }, + }, + likes: { + list: { + label: 'Likes', + searchable: false, + sortable: false, + mainField: { name: 'id', schema: { type: 'integer' } }, + }, + edit: { + label: 'Likes', + description: '', + placeholder: '', + visible: true, + editable: true, + mainField: { name: 'id', schema: { type: 'integer' } }, + }, + }, + json: { + edit: { label: 'Json', description: '', placeholder: '', visible: true, editable: true }, + list: { label: 'Json', searchable: false, sortable: false }, + }, + slug: { + edit: { label: 'Slug', description: '', placeholder: '', visible: true, editable: true }, + list: { label: 'Slug', searchable: true, sortable: true }, + }, + notrepeat_req: { + edit: { + label: 'Notrepeat_req', + description: '', + placeholder: '', + visible: true, + editable: true, + }, + list: { label: 'Notrepeat_req', searchable: false, sortable: false }, + }, + repeat_req: { + edit: { + label: 'Repeat_req', + description: '', + placeholder: '', + visible: true, + editable: true, + }, + list: { label: 'Repeat_req', searchable: false, sortable: false }, + }, + repeat_req_min: { + edit: { + label: 'Repeat_req_min', + description: '', + placeholder: '', + visible: true, + editable: true, + }, + list: { label: 'Repeat_req_min', searchable: false, sortable: false }, + }, + createdAt: { + edit: { + label: 'CreatedAt', + description: '', + placeholder: '', + visible: false, + editable: true, + }, + list: { label: 'CreatedAt', searchable: true, sortable: true }, + }, + updatedAt: { + edit: { + label: 'UpdatedAt', + description: '', + placeholder: '', + visible: false, + editable: true, + }, + list: { label: 'UpdatedAt', searchable: true, sortable: true }, + }, + }, + layouts: { + list: [ + { + key: '__id_key__', + name: 'id', + fieldSchema: { type: 'integer' }, + metadatas: { label: 'Id', searchable: true, sortable: true }, + }, + { + key: '__postal_coder_key__', + name: 'postal_coder', + fieldSchema: { type: 'string', pluginOptions: { i18n: { localized: true } } }, + metadatas: { label: 'Postal_coder', searchable: true, sortable: true }, + }, + { + key: '__categories_key__', + name: 'categories', + fieldSchema: { + collection: 'category', + via: 'addresses', + dominant: true, + attribute: 'category', + column: 'id', + isVirtual: true, + type: 'relation', + targetModel: 'api::category.category', + relationType: 'manyToMany', + }, + metadatas: { + label: 'Categories', + searchable: false, + sortable: false, + mainField: { name: 'name', schema: { type: 'string' } }, + }, + queryInfos: { + endPoint: 'collection-types/api::address.address', + defaultParams: {}, + }, + }, + { + key: '__cover_key__', + name: 'cover', + fieldSchema: { + type: 'media', + multiple: false, + required: false, + allowedTypes: ['files', 'images', 'videos'], + pluginOptions: { i18n: { localized: true } }, + }, + metadatas: { label: 'Cover', searchable: false, sortable: false }, + }, + ], + edit: [ + [ + { + name: 'postal_coder', + size: 6, + fieldSchema: { type: 'string', pluginOptions: { i18n: { localized: true } } }, + metadatas: { + label: 'Postal_coder', + description: '', + placeholder: '', + visible: true, + editable: true, + }, + }, + { + name: 'cover', + size: 6, + fieldSchema: { + type: 'media', + multiple: false, + required: false, + allowedTypes: ['files', 'images', 'videos'], + pluginOptions: { i18n: { localized: true } }, + }, + metadatas: { + label: 'Cover', + description: '', + placeholder: '', + visible: true, + editable: true, + }, + }, + ], + [ + { + name: 'images', + size: 6, + fieldSchema: { + type: 'media', + multiple: true, + required: false, + allowedTypes: ['images'], + pluginOptions: { i18n: { localized: true } }, + }, + metadatas: { + label: 'Images', + description: '', + placeholder: '', + visible: true, + editable: true, + }, + }, + { + name: 'city', + size: 6, + fieldSchema: { + type: 'string', + required: true, + maxLength: 200, + pluginOptions: { i18n: { localized: true } }, + }, + metadatas: { + label: 'City', + description: '', + placeholder: '', + visible: true, + editable: true, + }, + }, + ], + [ + { + name: 'json', + size: 12, + fieldSchema: { type: 'json', pluginOptions: { i18n: { localized: true } } }, + metadatas: { + label: 'Json', + description: '', + placeholder: '', + visible: true, + editable: true, + }, + }, + ], + [ + { + name: 'slug', + size: 6, + fieldSchema: { type: 'uid', targetField: 'city' }, + metadatas: { + label: 'Slug', + description: '', + placeholder: '', + visible: true, + editable: true, + }, + }, + ], + [ + { + name: 'notrepeat_req', + size: 12, + fieldSchema: { + type: 'component', + repeatable: false, + pluginOptions: { i18n: { localized: false } }, + component: 'blog.test-como', + required: true, + }, + metadatas: { + label: 'Notrepeat_req', + description: '', + placeholder: '', + visible: true, + editable: true, + }, + }, + ], + [ + { + name: 'repeat_req', + size: 12, + fieldSchema: { + type: 'component', + repeatable: true, + pluginOptions: { i18n: { localized: true } }, + component: 'blog.test-como', + required: true, + }, + metadatas: { + label: 'Repeat_req', + description: '', + placeholder: '', + visible: true, + editable: true, + }, + }, + ], + [ + { + name: 'repeat_req_min', + size: 12, + fieldSchema: { + type: 'component', + repeatable: true, + pluginOptions: { i18n: { localized: true } }, + component: 'blog.test-como', + required: false, + min: 2, + }, + metadatas: { + label: 'Repeat_req_min', + description: '', + placeholder: '', + visible: true, + editable: true, + }, + }, + ], + ], + }, + isDisplayed: true, + apiID: 'address', + kind: 'collectionType', + info: { displayName: 'addresse', name: 'address', description: '', label: 'Addresses' }, + options: { + increments: true, + timestamps: ['createdAt', 'updatedAt'], + comment: '', + }, + pluginOptions: { i18n: { localized: true } }, + attributes: { + id: { type: 'integer' }, + postal_coder: { type: 'string', pluginOptions: { i18n: { localized: true } } }, + categories: { + collection: 'category', + via: 'addresses', + dominant: true, + attribute: 'category', + column: 'id', + isVirtual: true, + type: 'relation', + targetModel: 'api::category.category', + relationType: 'manyToMany', + }, + cover: { + type: 'media', + multiple: false, + required: false, + allowedTypes: ['files', 'images', 'videos'], + pluginOptions: { i18n: { localized: true } }, + }, + images: { + type: 'media', + multiple: true, + required: false, + allowedTypes: ['images'], + pluginOptions: { i18n: { localized: true } }, + }, + city: { + type: 'string', + required: true, + maxLength: 200, + pluginOptions: { i18n: { localized: true } }, + }, + likes: { + collection: 'like', + via: 'address', + isVirtual: true, + type: 'relation', + targetModel: 'api::like.like', + relationType: 'oneToMany', + }, + json: { type: 'json', pluginOptions: { i18n: { localized: true } } }, + slug: { type: 'uid', targetField: 'city' }, + notrepeat_req: { + type: 'component', + repeatable: false, + pluginOptions: { i18n: { localized: false } }, + component: 'blog.test-como', + required: true, + }, + repeat_req: { + type: 'component', + repeatable: true, + pluginOptions: { i18n: { localized: true } }, + component: 'blog.test-como', + required: true, + }, + repeat_req_min: { + type: 'component', + repeatable: true, + pluginOptions: { i18n: { localized: true } }, + component: 'blog.test-como', + required: false, + min: 2, + }, + createdAt: { type: 'timestamp' }, + updatedAt: { type: 'timestamp' }, + }, +}; + +type Address = typeof address; + +export { address, Address }; diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/collection-types/index.ts b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/collection-types/index.ts new file mode 100644 index 0000000..d152d74 --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/collection-types/index.ts @@ -0,0 +1,3 @@ +import { address, type Address } from './address'; + +export { Address, address }; diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/index.ts b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/index.ts new file mode 100644 index 0000000..8876e21 --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/index.ts @@ -0,0 +1,6 @@ +import store from './store'; + +export * as collectionTypes from './collection-types'; +export * as metaData from './meta-data'; +export * as permissions from './permissions'; +export { store }; diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/meta-data/address.ts b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/meta-data/address.ts new file mode 100644 index 0000000..31ee936 --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/meta-data/address.ts @@ -0,0 +1,101 @@ +const address = { + id: { edit: {}, list: { label: 'Id', searchable: true, sortable: true } }, + postal_coder: { + edit: { + label: 'Postal_coder', + description: '', + placeholder: '', + visible: true, + editable: true, + }, + list: { label: 'Postal_coder', searchable: true, sortable: true }, + }, + categories: { + list: { + label: 'Categories', + searchable: false, + sortable: false, + mainField: { name: 'name', schema: { type: 'string' } }, + }, + edit: { + label: 'Categories', + description: '', + placeholder: '', + visible: true, + editable: true, + mainField: { name: 'name', schema: { type: 'string' } }, + }, + }, + cover: { + edit: { label: 'Cover', description: '', placeholder: '', visible: true, editable: true }, + list: { label: 'Cover', searchable: false, sortable: false }, + }, + images: { + edit: { label: 'Images', description: '', placeholder: '', visible: true, editable: true }, + list: { label: 'Images', searchable: false, sortable: false }, + }, + city: { + edit: { label: 'City', description: '', placeholder: '', visible: true, editable: true }, + list: { label: 'City', searchable: true, sortable: true }, + }, + likes: { + list: { + label: 'Likes', + searchable: false, + sortable: false, + mainField: { name: 'id', schema: { type: 'integer' } }, + }, + edit: { + label: 'Likes', + description: '', + placeholder: '', + visible: true, + editable: true, + mainField: { name: 'id', schema: { type: 'integer' } }, + }, + }, + json: { + edit: { label: 'Json', description: '', placeholder: '', visible: true, editable: true }, + list: { label: 'Json', searchable: false, sortable: false }, + }, + slug: { + edit: { label: 'Slug', description: '', placeholder: '', visible: true, editable: true }, + list: { label: 'Slug', searchable: true, sortable: true }, + }, + notrepeat_req: { + edit: { + label: 'Notrepeat_req', + description: '', + placeholder: '', + visible: true, + editable: true, + }, + list: { label: 'Notrepeat_req', searchable: false, sortable: false }, + }, + repeat_req: { + edit: { label: 'Repeat_req', description: '', placeholder: '', visible: true, editable: true }, + list: { label: 'Repeat_req', searchable: false, sortable: false }, + }, + repeat_req_min: { + edit: { + label: 'Repeat_req_min', + description: '', + placeholder: '', + visible: true, + editable: true, + }, + list: { label: 'Repeat_req_min', searchable: false, sortable: false }, + }, + createdAt: { + edit: { label: 'Created_at', description: '', placeholder: '', visible: false, editable: true }, + list: { label: 'Created_at', searchable: true, sortable: true }, + }, + updatedAt: { + edit: { label: 'Updated_at', description: '', placeholder: '', visible: false, editable: true }, + list: { label: 'Updated_at', searchable: true, sortable: true }, + }, +}; + +type Address = typeof address; + +export { address, Address }; diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/meta-data/index.ts b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/meta-data/index.ts new file mode 100644 index 0000000..d152d74 --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/meta-data/index.ts @@ -0,0 +1,3 @@ +import { address, type Address } from './address'; + +export { Address, address }; diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/permissions/admin-permissions.ts b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/permissions/admin-permissions.ts new file mode 100644 index 0000000..245ceae --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/permissions/admin-permissions.ts @@ -0,0 +1,1910 @@ +// TODO: this should be called user +const admin = [ + { + id: 133, + action: 'plugin::content-manager.explorer.create', + actionParameters: {}, + subject: 'plugin::users-permissions.user', + properties: { + fields: [ + 'username', + 'email', + 'provider', + 'password', + 'resetPasswordToken', + 'confirmationToken', + 'confirmed', + 'blocked', + 'role', + 'picture', + ], + }, + conditions: [], + }, + { + id: 137, + action: 'plugin::content-manager.explorer.create', + actionParameters: {}, + subject: 'api::homepage.homepage', + properties: { + fields: ['title', 'slug', 'single', 'multiple'], + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 138, + action: 'plugin::content-manager.explorer.create', + actionParameters: {}, + subject: 'api::kitchensink.kitchensink', + properties: { + fields: [ + 'short_text', + 'long_text', + 'rich_text', + 'blocks', + 'integer', + 'biginteger', + 'decimal', + 'float', + 'date', + 'datetime', + 'time', + 'timestamp', + 'boolean', + 'email', + 'password', + 'enumeration', + 'single_media', + 'multiple_media', + 'json', + 'single_compo.name', + 'single_compo.test', + 'repeatable_compo.name', + 'repeatable_compo.test', + 'dynamiczone', + 'one_way_tag', + 'one_to_one_tag', + 'one_to_many_tags', + 'many_to_one_tag', + 'many_to_many_tags', + 'many_way_tags', + 'morph_to_one', + 'morph_to_many', + 'custom_field', + 'custom_field_with_default_options', + 'cats', + ], + }, + conditions: [], + }, + { + id: 139, + action: 'plugin::content-manager.explorer.create', + actionParameters: {}, + subject: 'api::like.like', + properties: { + fields: ['author', 'review'], + }, + conditions: [], + }, + { + id: 140, + action: 'plugin::content-manager.explorer.create', + actionParameters: {}, + subject: 'api::menu.menu', + properties: { + fields: ['description', 'menusections', 'restaurant'], + }, + conditions: [], + }, + { + id: 141, + action: 'plugin::content-manager.explorer.create', + actionParameters: {}, + subject: 'api::menusection.menusection', + properties: { + fields: [ + 'name', + 'dishes.name', + 'dishes.description', + 'dishes.price', + 'dishes.picture', + 'dishes.very_long_description', + 'dishes.categories', + 'menu', + ], + }, + conditions: [], + }, + { + id: 142, + action: 'plugin::content-manager.explorer.create', + actionParameters: {}, + subject: 'api::relation-locale.relation-locale', + properties: { + fields: [ + 'categories', + 'title', + 'repeatable_relations.categories', + 'dynamic_relations', + 'single_relation.categories', + 'require_single_relation.categories', + ], + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 143, + action: 'plugin::content-manager.explorer.create', + actionParameters: {}, + subject: 'api::restaurant.restaurant', + properties: { + fields: [ + 'name', + 'slug', + 'priceRange', + 'closingPeriod.label', + 'closingPeriod.start_date', + 'closingPeriod.end_date', + 'closingPeriod.media', + 'closingPeriod.dish.name', + 'closingPeriod.dish.description', + 'closingPeriod.dish.price', + 'closingPeriod.dish.picture', + 'closingPeriod.dish.very_long_description', + 'closingPeriod.dish.categories', + 'contactEmail', + 'stars', + 'averagePrice', + 'address', + 'cover', + 'timestamp', + 'images', + 'shortDescription', + 'since', + 'categories', + 'description', + 'services.name', + 'services.media', + 'services.is_available', + 'menu', + 'openingTimes.label', + 'openingTimes.time', + 'openingTimes.dishrep.name', + 'openingTimes.dishrep.description', + 'openingTimes.dishrep.price', + 'openingTimes.dishrep.picture', + 'openingTimes.dishrep.very_long_description', + 'openingTimes.dishrep.categories', + 'dz', + ], + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 144, + action: 'plugin::content-manager.explorer.create', + actionParameters: {}, + subject: 'api::review.review', + properties: { + fields: ['comment', 'rating', 'likes', 'author', 'restaurant'], + }, + conditions: [], + }, + { + id: 145, + action: 'plugin::content-manager.explorer.create', + actionParameters: {}, + subject: 'api::tag.tag', + properties: { + fields: [ + 'name', + 'many_to_one_kitchensink', + 'one_to_many_kitchensinks', + 'many_to_many_kitchensinks', + 'one_to_one_kitchensink', + ], + }, + conditions: [], + }, + { + id: 146, + action: 'plugin::content-manager.explorer.create', + actionParameters: {}, + subject: 'api::temp.temp', + properties: { + fields: ['name', 'category', 'categories'], + }, + conditions: [], + }, + { + id: 148, + action: 'plugin::content-manager.explorer.read', + actionParameters: {}, + subject: 'plugin::users-permissions.user', + properties: { + fields: [ + 'username', + 'email', + 'provider', + 'password', + 'resetPasswordToken', + 'confirmationToken', + 'confirmed', + 'blocked', + 'role', + 'picture', + ], + }, + conditions: [], + }, + { + id: 152, + action: 'plugin::content-manager.explorer.read', + actionParameters: {}, + subject: 'api::homepage.homepage', + properties: { + fields: ['title', 'slug', 'single', 'multiple'], + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 153, + action: 'plugin::content-manager.explorer.read', + actionParameters: {}, + subject: 'api::kitchensink.kitchensink', + properties: { + fields: [ + 'short_text', + 'long_text', + 'rich_text', + 'blocks', + 'integer', + 'biginteger', + 'decimal', + 'float', + 'date', + 'datetime', + 'time', + 'timestamp', + 'boolean', + 'email', + 'password', + 'enumeration', + 'single_media', + 'multiple_media', + 'json', + 'single_compo.name', + 'single_compo.test', + 'repeatable_compo.name', + 'repeatable_compo.test', + 'dynamiczone', + 'one_way_tag', + 'one_to_one_tag', + 'one_to_many_tags', + 'many_to_one_tag', + 'many_to_many_tags', + 'many_way_tags', + 'morph_to_one', + 'morph_to_many', + 'custom_field', + 'custom_field_with_default_options', + 'cats', + ], + }, + conditions: [], + }, + { + id: 154, + action: 'plugin::content-manager.explorer.read', + actionParameters: {}, + subject: 'api::like.like', + properties: { + fields: ['author', 'review'], + }, + conditions: [], + }, + { + id: 155, + action: 'plugin::content-manager.explorer.read', + actionParameters: {}, + subject: 'api::menu.menu', + properties: { + fields: ['description', 'menusections', 'restaurant'], + }, + conditions: [], + }, + { + id: 156, + action: 'plugin::content-manager.explorer.read', + actionParameters: {}, + subject: 'api::menusection.menusection', + properties: { + fields: [ + 'name', + 'dishes.name', + 'dishes.description', + 'dishes.price', + 'dishes.picture', + 'dishes.very_long_description', + 'dishes.categories', + 'menu', + ], + }, + conditions: [], + }, + { + id: 157, + action: 'plugin::content-manager.explorer.read', + actionParameters: {}, + subject: 'api::relation-locale.relation-locale', + properties: { + fields: [ + 'categories', + 'title', + 'repeatable_relations.categories', + 'dynamic_relations', + 'single_relation.categories', + 'require_single_relation.categories', + ], + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 158, + action: 'plugin::content-manager.explorer.read', + actionParameters: {}, + subject: 'api::restaurant.restaurant', + properties: { + fields: [ + 'name', + 'slug', + 'priceRange', + 'closingPeriod.label', + 'closingPeriod.start_date', + 'closingPeriod.end_date', + 'closingPeriod.media', + 'closingPeriod.dish.name', + 'closingPeriod.dish.description', + 'closingPeriod.dish.price', + 'closingPeriod.dish.picture', + 'closingPeriod.dish.very_long_description', + 'closingPeriod.dish.categories', + 'contactEmail', + 'stars', + 'averagePrice', + 'address', + 'cover', + 'timestamp', + 'images', + 'shortDescription', + 'since', + 'categories', + 'description', + 'services.name', + 'services.media', + 'services.is_available', + 'menu', + 'openingTimes.label', + 'openingTimes.time', + 'openingTimes.dishrep.name', + 'openingTimes.dishrep.description', + 'openingTimes.dishrep.price', + 'openingTimes.dishrep.picture', + 'openingTimes.dishrep.very_long_description', + 'openingTimes.dishrep.categories', + 'dz', + ], + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 159, + action: 'plugin::content-manager.explorer.read', + actionParameters: {}, + subject: 'api::review.review', + properties: { + fields: ['comment', 'rating', 'likes', 'author', 'restaurant'], + }, + conditions: [], + }, + { + id: 160, + action: 'plugin::content-manager.explorer.read', + actionParameters: {}, + subject: 'api::tag.tag', + properties: { + fields: [ + 'name', + 'many_to_one_kitchensink', + 'one_to_many_kitchensinks', + 'many_to_many_kitchensinks', + 'one_to_one_kitchensink', + ], + }, + conditions: [], + }, + { + id: 161, + action: 'plugin::content-manager.explorer.read', + actionParameters: {}, + subject: 'api::temp.temp', + properties: { + fields: ['name', 'category', 'categories'], + }, + conditions: [], + }, + { + id: 163, + action: 'plugin::content-manager.explorer.update', + actionParameters: {}, + subject: 'plugin::users-permissions.user', + properties: { + fields: [ + 'username', + 'email', + 'provider', + 'password', + 'resetPasswordToken', + 'confirmationToken', + 'confirmed', + 'blocked', + 'role', + 'picture', + ], + }, + conditions: [], + }, + { + id: 167, + action: 'plugin::content-manager.explorer.update', + actionParameters: {}, + subject: 'api::homepage.homepage', + properties: { + fields: ['title', 'slug', 'single', 'multiple'], + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 168, + action: 'plugin::content-manager.explorer.update', + actionParameters: {}, + subject: 'api::kitchensink.kitchensink', + properties: { + fields: [ + 'short_text', + 'long_text', + 'rich_text', + 'blocks', + 'integer', + 'biginteger', + 'decimal', + 'float', + 'date', + 'datetime', + 'time', + 'timestamp', + 'boolean', + 'email', + 'password', + 'enumeration', + 'single_media', + 'multiple_media', + 'json', + 'single_compo.name', + 'single_compo.test', + 'repeatable_compo.name', + 'repeatable_compo.test', + 'dynamiczone', + 'one_way_tag', + 'one_to_one_tag', + 'one_to_many_tags', + 'many_to_one_tag', + 'many_to_many_tags', + 'many_way_tags', + 'morph_to_one', + 'morph_to_many', + 'custom_field', + 'custom_field_with_default_options', + 'cats', + ], + }, + conditions: [], + }, + { + id: 169, + action: 'plugin::content-manager.explorer.update', + actionParameters: {}, + subject: 'api::like.like', + properties: { + fields: ['author', 'review'], + }, + conditions: [], + }, + { + id: 170, + action: 'plugin::content-manager.explorer.update', + actionParameters: {}, + subject: 'api::menu.menu', + properties: { + fields: ['description', 'menusections', 'restaurant'], + }, + conditions: [], + }, + { + id: 171, + action: 'plugin::content-manager.explorer.update', + actionParameters: {}, + subject: 'api::menusection.menusection', + properties: { + fields: [ + 'name', + 'dishes.name', + 'dishes.description', + 'dishes.price', + 'dishes.picture', + 'dishes.very_long_description', + 'dishes.categories', + 'menu', + ], + }, + conditions: [], + }, + { + id: 172, + action: 'plugin::content-manager.explorer.update', + actionParameters: {}, + subject: 'api::relation-locale.relation-locale', + properties: { + fields: [ + 'categories', + 'title', + 'repeatable_relations.categories', + 'dynamic_relations', + 'single_relation.categories', + 'require_single_relation.categories', + ], + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 173, + action: 'plugin::content-manager.explorer.update', + actionParameters: {}, + subject: 'api::restaurant.restaurant', + properties: { + fields: [ + 'name', + 'slug', + 'priceRange', + 'closingPeriod.label', + 'closingPeriod.start_date', + 'closingPeriod.end_date', + 'closingPeriod.media', + 'closingPeriod.dish.name', + 'closingPeriod.dish.description', + 'closingPeriod.dish.price', + 'closingPeriod.dish.picture', + 'closingPeriod.dish.very_long_description', + 'closingPeriod.dish.categories', + 'contactEmail', + 'stars', + 'averagePrice', + 'address', + 'cover', + 'timestamp', + 'images', + 'shortDescription', + 'since', + 'categories', + 'description', + 'services.name', + 'services.media', + 'services.is_available', + 'menu', + 'openingTimes.label', + 'openingTimes.time', + 'openingTimes.dishrep.name', + 'openingTimes.dishrep.description', + 'openingTimes.dishrep.price', + 'openingTimes.dishrep.picture', + 'openingTimes.dishrep.very_long_description', + 'openingTimes.dishrep.categories', + 'dz', + ], + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 174, + action: 'plugin::content-manager.explorer.update', + actionParameters: {}, + subject: 'api::review.review', + properties: { + fields: ['comment', 'rating', 'likes', 'author', 'restaurant'], + }, + conditions: [], + }, + { + id: 175, + action: 'plugin::content-manager.explorer.update', + actionParameters: {}, + subject: 'api::tag.tag', + properties: { + fields: [ + 'name', + 'many_to_one_kitchensink', + 'one_to_many_kitchensinks', + 'many_to_many_kitchensinks', + 'one_to_one_kitchensink', + ], + }, + conditions: [], + }, + { + id: 176, + action: 'plugin::content-manager.explorer.update', + actionParameters: {}, + subject: 'api::temp.temp', + properties: { + fields: ['name', 'category', 'categories'], + }, + conditions: [], + }, + { + id: 177, + action: 'plugin::content-manager.explorer.delete', + actionParameters: {}, + subject: 'plugin::myplugin.test', + properties: { + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 178, + action: 'plugin::content-manager.explorer.delete', + actionParameters: {}, + subject: 'plugin::users-permissions.user', + properties: {}, + conditions: [], + }, + { + id: 179, + action: 'plugin::content-manager.explorer.delete', + actionParameters: {}, + subject: 'api::address.address', + properties: {}, + conditions: [], + }, + { + id: 180, + action: 'plugin::content-manager.explorer.delete', + actionParameters: {}, + subject: 'api::category.category', + properties: { + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 181, + action: 'plugin::content-manager.explorer.delete', + actionParameters: {}, + subject: 'api::country.country', + properties: { + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 182, + action: 'plugin::content-manager.explorer.delete', + actionParameters: {}, + subject: 'api::homepage.homepage', + properties: { + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 183, + action: 'plugin::content-manager.explorer.delete', + actionParameters: {}, + subject: 'api::kitchensink.kitchensink', + properties: {}, + conditions: [], + }, + { + id: 184, + action: 'plugin::content-manager.explorer.delete', + actionParameters: {}, + subject: 'api::like.like', + properties: {}, + conditions: [], + }, + { + id: 185, + action: 'plugin::content-manager.explorer.delete', + actionParameters: {}, + subject: 'api::menu.menu', + properties: {}, + conditions: [], + }, + { + id: 186, + action: 'plugin::content-manager.explorer.delete', + actionParameters: {}, + subject: 'api::menusection.menusection', + properties: {}, + conditions: [], + }, + { + id: 187, + action: 'plugin::content-manager.explorer.delete', + actionParameters: {}, + subject: 'api::relation-locale.relation-locale', + properties: { + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 188, + action: 'plugin::content-manager.explorer.delete', + actionParameters: {}, + subject: 'api::restaurant.restaurant', + properties: { + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 189, + action: 'plugin::content-manager.explorer.delete', + actionParameters: {}, + subject: 'api::review.review', + properties: {}, + conditions: [], + }, + { + id: 190, + action: 'plugin::content-manager.explorer.delete', + actionParameters: {}, + subject: 'api::tag.tag', + properties: {}, + conditions: [], + }, + { + id: 191, + action: 'plugin::content-manager.explorer.delete', + actionParameters: {}, + subject: 'api::temp.temp', + properties: {}, + conditions: [], + }, + { + id: 192, + action: 'plugin::content-manager.explorer.publish', + actionParameters: {}, + subject: 'api::category.category', + properties: { + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 193, + action: 'plugin::content-manager.explorer.publish', + actionParameters: {}, + subject: 'api::homepage.homepage', + properties: { + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 194, + action: 'plugin::content-manager.explorer.publish', + actionParameters: {}, + subject: 'api::kitchensink.kitchensink', + properties: {}, + conditions: [], + }, + { + id: 195, + action: 'plugin::content-manager.explorer.publish', + actionParameters: {}, + subject: 'api::relation-locale.relation-locale', + properties: { + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 196, + action: 'plugin::content-manager.explorer.publish', + actionParameters: {}, + subject: 'api::restaurant.restaurant', + properties: { + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 197, + action: 'plugin::content-manager.explorer.publish', + actionParameters: {}, + subject: 'api::tag.tag', + properties: {}, + conditions: [], + }, + { + id: 198, + action: 'plugin::content-manager.explorer.publish', + actionParameters: {}, + subject: 'api::temp.temp', + properties: {}, + conditions: [], + }, + { + id: 199, + action: 'plugin::content-manager.single-types.configure-view', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 200, + action: 'plugin::content-manager.collection-types.configure-view', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 201, + action: 'plugin::content-manager.components.configure-layout', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 202, + action: 'plugin::content-type-builder.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 203, + action: 'plugin::email.settings.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 204, + action: 'plugin::upload.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 205, + action: 'plugin::upload.assets.create', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 206, + action: 'plugin::upload.assets.update', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 207, + action: 'plugin::upload.assets.download', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 208, + action: 'plugin::upload.assets.copy-link', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 209, + action: 'plugin::upload.configure-view', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 210, + action: 'plugin::upload.settings.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 211, + action: 'plugin::documentation.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 212, + action: 'plugin::documentation.settings.update', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 213, + action: 'plugin::documentation.settings.regenerate', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 214, + action: 'plugin::documentation.settings.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 215, + action: 'plugin::i18n.locale.create', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 216, + action: 'plugin::i18n.locale.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 217, + action: 'plugin::i18n.locale.update', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 218, + action: 'plugin::i18n.locale.delete', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 219, + action: 'plugin::users-permissions.roles.create', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 220, + action: 'plugin::users-permissions.roles.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 221, + action: 'plugin::users-permissions.roles.update', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 222, + action: 'plugin::users-permissions.roles.delete', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 223, + action: 'plugin::users-permissions.providers.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 224, + action: 'plugin::users-permissions.providers.update', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 225, + action: 'plugin::users-permissions.email-templates.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 226, + action: 'plugin::users-permissions.email-templates.update', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 227, + action: 'plugin::users-permissions.advanced-settings.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 228, + action: 'plugin::users-permissions.advanced-settings.update', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 229, + action: 'admin::marketplace.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 230, + action: 'admin::webhooks.create', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 231, + action: 'admin::webhooks.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 232, + action: 'admin::webhooks.update', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 233, + action: 'admin::webhooks.delete', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 234, + action: 'admin::users.create', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 235, + action: 'admin::users.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 236, + action: 'admin::users.update', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 237, + action: 'admin::users.delete', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 238, + action: 'admin::roles.create', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 239, + action: 'admin::roles.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 240, + action: 'admin::roles.update', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 241, + action: 'admin::roles.delete', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 242, + action: 'admin::api-tokens.access', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 243, + action: 'admin::api-tokens.create', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 244, + action: 'admin::api-tokens.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 245, + action: 'admin::api-tokens.update', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 246, + action: 'admin::api-tokens.regenerate', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 247, + action: 'admin::api-tokens.delete', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 248, + action: 'admin::project-settings.update', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 249, + action: 'admin::project-settings.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 250, + action: 'admin::transfer.tokens.access', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 251, + action: 'admin::transfer.tokens.create', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 252, + action: 'admin::transfer.tokens.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 253, + action: 'admin::transfer.tokens.update', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 254, + action: 'admin::transfer.tokens.regenerate', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 255, + action: 'admin::transfer.tokens.delete', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 323, + action: 'plugin::content-manager.explorer.create', + actionParameters: {}, + subject: 'api::category.category', + properties: { + fields: ['name', 'addresses', 'temps', 'datetime', 'date', 'relation_locales'], + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 325, + action: 'plugin::content-manager.explorer.read', + actionParameters: {}, + subject: 'api::category.category', + properties: { + fields: ['name', 'addresses', 'temps', 'datetime', 'date', 'relation_locales'], + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 327, + action: 'plugin::content-manager.explorer.update', + actionParameters: {}, + subject: 'api::category.category', + properties: { + fields: ['name', 'addresses', 'temps', 'datetime', 'date', 'relation_locales'], + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 331, + action: 'plugin::content-manager.explorer.create', + actionParameters: {}, + subject: 'api::country.country', + properties: { + fields: ['name', 'code'], + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 332, + action: 'plugin::content-manager.explorer.read', + actionParameters: {}, + subject: 'api::country.country', + properties: { + fields: ['name', 'code'], + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 333, + action: 'plugin::content-manager.explorer.update', + actionParameters: {}, + subject: 'api::country.country', + properties: { + fields: ['name', 'code'], + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 337, + action: 'plugin::content-manager.explorer.create', + actionParameters: {}, + subject: 'api::address.address', + properties: { + fields: [ + 'postal_code', + 'categories', + 'cover', + 'images', + 'city', + 'json', + 'slug', + 'notrepeat_req.name', + 'repeat_req.name', + 'repeat_req_min.name', + ], + }, + conditions: [], + }, + { + id: 338, + action: 'plugin::content-manager.explorer.read', + actionParameters: {}, + subject: 'api::address.address', + properties: { + fields: [ + 'postal_code', + 'categories', + 'cover', + 'images', + 'city', + 'json', + 'slug', + 'notrepeat_req.name', + 'repeat_req.name', + 'repeat_req_min.name', + ], + }, + conditions: [], + }, + { + id: 339, + action: 'plugin::content-manager.explorer.update', + actionParameters: {}, + subject: 'api::address.address', + properties: { + fields: [ + 'postal_code', + 'categories', + 'cover', + 'images', + 'city', + 'json', + 'slug', + 'notrepeat_req.name', + 'repeat_req.name', + 'repeat_req_min.name', + ], + }, + conditions: [], + }, + { + id: 347, + action: 'admin::review-workflows.stage.transition', + actionParameters: { + from: 1, + }, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 350, + action: 'admin::review-workflows.stage.transition', + actionParameters: { + from: 2, + }, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 353, + action: 'admin::review-workflows.stage.transition', + actionParameters: { + from: 3, + }, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 356, + action: 'admin::review-workflows.stage.transition', + actionParameters: { + from: 4, + }, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 359, + action: 'admin::provider-login.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 360, + action: 'admin::provider-login.update', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 361, + action: 'admin::audit-logs.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 362, + action: 'admin::review-workflows.create', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 363, + action: 'admin::review-workflows.read', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 364, + action: 'admin::review-workflows.update', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 365, + action: 'admin::review-workflows.delete', + actionParameters: {}, + subject: null, + properties: {}, + conditions: [], + }, + { + id: 375, + action: 'plugin::content-manager.explorer.create', + actionParameters: {}, + subject: 'plugin::myplugin.test', + properties: { + fields: ['type'], + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 376, + action: 'plugin::content-manager.explorer.read', + actionParameters: {}, + subject: 'plugin::myplugin.test', + properties: { + fields: ['type'], + locales: ['en-GB', 'de'], + }, + conditions: [], + }, + { + id: 377, + action: 'plugin::content-manager.explorer.update', + actionParameters: {}, + subject: 'plugin::myplugin.test', + properties: { + fields: ['type'], + locales: ['en-GB', 'de'], + }, + conditions: [], + }, +]; + +const app = { + contentManager: { + main: [], + collectionTypesConfigurations: [ + { + action: 'plugin::content-manager.collection-types.configure-view', + subject: null, + }, + ], + componentsConfigurations: [ + { + action: 'plugin::content-manager.components.configure-layout', + subject: null, + }, + ], + singleTypesConfigurations: [ + { + action: 'plugin::content-manager.single-types.configure-view', + subject: null, + }, + ], + }, + marketplace: { + main: [{ action: 'admin::marketplace.read', subject: null }], + read: [{ action: 'admin::marketplace.read', subject: null }], + }, + settings: { + roles: { + main: [ + { + action: 'admin::roles.create', + subject: null, + }, + { + action: 'admin::roles.update', + subject: null, + }, + { + action: 'admin::roles.read', + subject: null, + }, + { + action: 'admin::roles.delete', + subject: null, + }, + ], + create: [ + { + action: 'admin::roles.create', + subject: null, + }, + ], + delete: [ + { + action: 'admin::roles.delete', + subject: null, + }, + ], + read: [ + { + action: 'admin::roles.read', + subject: null, + }, + ], + update: [ + { + action: 'admin::roles.update', + subject: null, + }, + ], + }, + users: { + main: [ + { + action: 'admin::users.create', + subject: null, + }, + { + action: 'admin::users.read', + subject: null, + }, + { + action: 'admin::users.update', + subject: null, + }, + { + action: 'admin::users.delete', + subject: null, + }, + ], + create: [ + { + action: 'admin::users.create', + subject: null, + }, + ], + delete: [ + { + action: 'admin::users.delete', + subject: null, + }, + ], + read: [ + { + action: 'admin::users.read', + subject: null, + }, + ], + update: [ + { + action: 'admin::users.update', + subject: null, + }, + ], + }, + webhooks: { + main: [ + { + action: 'admin::webhooks.create', + subject: null, + }, + { + action: 'admin::webhooks.read', + subject: null, + }, + { + action: 'admin::webhooks.update', + subject: null, + }, + { + action: 'admin::webhooks.delete', + subject: null, + }, + ], + create: [ + { + action: 'admin::webhooks.create', + subject: null, + }, + ], + delete: [ + { + action: 'admin::webhooks.delete', + subject: null, + }, + ], + read: [ + { + action: 'admin::webhooks.read', + subject: null, + }, + { + action: 'admin::webhooks.update', + subject: null, + }, + { + action: 'admin::webhooks.delete', + subject: null, + }, + ], + update: [ + { + action: 'admin::webhooks.update', + subject: null, + }, + ], + }, + 'api-tokens': { + main: [ + { + action: 'admin::api-tokens.access', + subject: null, + }, + ], + create: [ + { + action: 'admin::api-tokens.create', + subject: null, + }, + ], + delete: [ + { + action: 'admin::api-tokens.delete', + subject: null, + }, + ], + read: [ + { + action: 'admin::api-tokens.read', + subject: null, + }, + ], + update: [ + { + action: 'admin::api-tokens.update', + subject: null, + }, + ], + regenerate: [ + { + action: 'admin::api-tokens.regenerate', + subject: null, + }, + ], + }, + 'transfer-tokens': { + main: [ + { + action: 'admin::transfer.tokens.access', + subject: null, + }, + ], + create: [ + { + action: 'admin::transfer.tokens.create', + subject: null, + }, + ], + delete: [ + { + action: 'admin::transfer.tokens.delete', + subject: null, + }, + ], + read: [ + { + action: 'admin::transfer.tokens.read', + subject: null, + }, + ], + update: [ + { + action: 'admin::transfer.tokens.update', + subject: null, + }, + ], + regenerate: [ + { + action: 'admin::transfer.tokens.regenerate', + subject: null, + }, + ], + }, + 'project-settings': { + read: [ + { + action: 'admin::project-settings.read', + subject: null, + }, + ], + update: [ + { + action: 'admin::project-settings.update', + subject: null, + }, + ], + }, + auditLogs: { + main: [ + { + action: 'admin::audit-logs.read', + subject: null, + }, + ], + read: [ + { + action: 'admin::audit-logs.read', + subject: null, + }, + ], + update: [ + { + action: 'admin::audit-logs.update', + subject: null, + }, + ], + }, + 'review-workflows': { + main: [ + { + action: 'admin::review-workflows.read', + subject: null, + }, + ], + read: [ + { + action: 'admin::review-workflows.read', + subject: null, + }, + ], + create: [ + { + action: 'admin::review-workflows.create', + subject: null, + }, + ], + delete: [ + { + action: 'admin::review-workflows.delete', + subject: null, + }, + ], + update: [ + { + action: 'admin::review-workflows.update', + subject: null, + }, + ], + }, + sso: { + main: [ + { + action: 'admin::provider-login.read', + subject: null, + }, + ], + read: [ + { + action: 'admin::provider-login.read', + subject: null, + }, + ], + update: [ + { + action: 'admin::provider-login.update', + subject: null, + }, + ], + }, + }, +}; + +type Admin = typeof admin; +type App = typeof app; + +export { admin, Admin, app, App }; diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/permissions/content-manager-permissions.ts b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/permissions/content-manager-permissions.ts new file mode 100644 index 0000000..f1cbd35 --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/permissions/content-manager-permissions.ts @@ -0,0 +1,63 @@ +const contentManager = [ + { + id: 2817, + action: 'plugin::content-manager.single-types.configure-view', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 2818, + action: 'plugin::content-manager.collection-types.configure-view', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 2819, + action: 'plugin::content-manager.components.configure-layout', + subject: null, + properties: {}, + conditions: [], + }, + { + action: 'plugin::content-manager.explorer.create', + subject: 'foo', + properties: { + fields: ['f1'], + }, + conditions: [], + }, + { + action: 'plugin::content-manager.explorer.create', + subject: 'foo', + properties: { + fields: ['f2'], + }, + conditions: [], + }, + { + action: 'plugin::content-manager.explorer.read', + subject: 'foo', + properties: { + fields: ['f1'], + }, + conditions: [], + }, + { + action: 'plugin::content-manager.explorer.delete', + subject: 'bar', + }, + { + action: 'plugin::content-manager.explorer.update', + subject: 'bar', + properties: { + fields: ['f1'], + }, + conditions: [], + }, +]; + +type ContentManager = typeof contentManager; + +export { contentManager, ContentManager }; diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/permissions/content-type-builder-permissions.ts b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/permissions/content-type-builder-permissions.ts new file mode 100644 index 0000000..76752b4 --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/permissions/content-type-builder-permissions.ts @@ -0,0 +1,42 @@ +const contentTypeBuilder = [ + { + id: 2820, + action: 'plugin::content-type-builder.read', + subject: null, + properties: {}, + conditions: [], + }, + { id: 2821, action: 'plugin::upload.read', subject: null, properties: {}, conditions: [] }, + { + id: 2822, + action: 'plugin::upload.assets.create', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 2823, + action: 'plugin::upload.assets.update', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 2824, + action: 'plugin::upload.assets.download', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 2825, + action: 'plugin::upload.assets.copy-link', + subject: null, + properties: {}, + conditions: [], + }, +]; + +type ContentTypeBuilder = typeof contentTypeBuilder; + +export { contentTypeBuilder, ContentTypeBuilder }; diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/permissions/documentation-permissions.ts b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/permissions/documentation-permissions.ts new file mode 100644 index 0000000..daafa6d --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/permissions/documentation-permissions.ts @@ -0,0 +1,34 @@ +const documentation = [ + { + id: 214, + action: 'plugin::documentation.settings.read', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 212, + action: 'plugin::documentation.settings.update', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 213, + action: 'plugin::documentation.settings.regenerate', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 214, + action: 'plugin::documentation.settings.read', + subject: null, + properties: {}, + conditions: [], + }, +]; + +type Documentation = typeof documentation; + +export { documentation, Documentation }; diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/permissions/index.ts b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/permissions/index.ts new file mode 100644 index 0000000..bb2894d --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/permissions/index.ts @@ -0,0 +1,29 @@ +/** + * TODO: These types could be done better, since they're mock data + * for user-permissions plugin it might be better to extract them + * from that package and use them here. + */ + +import { admin, type Admin, app, type App } from './admin-permissions'; +import { contentManager, type ContentManager } from './content-manager-permissions'; +import { contentTypeBuilder, type ContentTypeBuilder } from './content-type-builder-permissions'; +import { type Documentation, documentation } from './documentation-permissions'; + +// TODO: this should be called userPermissions +const allPermissions = [...admin, ...contentManager, ...contentTypeBuilder, ...documentation]; + +type AdminPermissions = typeof allPermissions; + +export { + admin, + Admin, + app, + App, + contentManager, + ContentManager, + contentTypeBuilder, + ContentTypeBuilder, + allPermissions, + AdminPermissions, + Documentation, +}; diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/store/index.ts b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/store/index.ts new file mode 100644 index 0000000..c448d57 --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/src/fixtures/store/index.ts @@ -0,0 +1,20 @@ +import { combineReducers, configureStore } from '@reduxjs/toolkit'; + +const reducers = { + admin_app: jest.fn(() => ({ permissions: {}, status: 'init' })), +}; + +const store = configureStore({ + reducer: combineReducers(reducers), + middleware: (getDefaultMiddleware: any) => + getDefaultMiddleware({ + // Disable timing checks for test env + immutableCheck: false, + serializableCheck: false, + }), +}); + +export default { + store, + state: store.getState(), +}; diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/src/global-setup.ts b/Dockers/strapi/strapi/packages/admin-test-utils/src/global-setup.ts new file mode 100644 index 0000000..6ffd457 --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/src/global-setup.ts @@ -0,0 +1,7 @@ +const globalSetup = async () => { + process.env.TZ = 'UTC'; + process.env.LANG = 'en_US.UTF-8'; + process.env.ADMIN_PATH = '/admin'; +}; + +export default globalSetup; diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/src/index.ts b/Dockers/strapi/strapi/packages/admin-test-utils/src/index.ts new file mode 100644 index 0000000..c3d1f37 --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/src/index.ts @@ -0,0 +1 @@ +export * as fixtures from './fixtures'; diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/src/setup.ts b/Dockers/strapi/strapi/packages/admin-test-utils/src/setup.ts new file mode 100644 index 0000000..8c4ebe3 --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/src/setup.ts @@ -0,0 +1,255 @@ +import { format } from 'util'; +import { ResizeObserver } from '@juggle/resize-observer'; + +/* ------------------------------------------------------------------------------------------------- + * IntersectionObserver + * -----------------------------------------------------------------------------------------------*/ + +const mockIntersectionObserver = jest.fn(); +mockIntersectionObserver.mockReturnValue({ + observe: () => null, + unobserve: () => null, + disconnect: () => null, +}); +window.IntersectionObserver = mockIntersectionObserver; + +/* ------------------------------------------------------------------------------------------------- + * ResizeObserver + * -----------------------------------------------------------------------------------------------*/ + +window.ResizeObserver = ResizeObserver; + +/* ------------------------------------------------------------------------------------------------- + * requestIdleCallback + * -----------------------------------------------------------------------------------------------*/ + +type SetTimeout = typeof window.setTimeout; + +window.setImmediate = + window.setImmediate || + ((fn: Parameters[0], ...args: any[]) => window.setTimeout(fn, 0, ...args)); + +window.clearImmediate = window.clearImmediate || window.clearTimeout; + +// @ts-expect-error – mocking for testing +window.requestIdleCallback = setImmediate; +// @ts-expect-error – mocking for testing +window.cancelIdleCallback = clearImmediate; + +/* ------------------------------------------------------------------------------------------------- + * ResizeObserver + * -----------------------------------------------------------------------------------------------*/ + +/** + * If there's a prop type error then we want to throw an + * error so that the test fails. + * + * In the CI we fail the entire process if anything is logged to the console. + * This is to stop pollution, you shouldn't need to log _anything_ to the console + * for tests. + */ +window.console = { + ...window.console, + warn(...args: any[]) { + throw new Error(format(...args)); + }, + error(...args: any[]) { + const message = format(...args); + + if (/(Invalid prop|Failed prop type)/gi.test(message)) { + throw new Error(message); + + // Ignore errors thrown by styled-components. This can be removed once we upgrade + // to styled-components@6 and have separate props that are rendered in the DOM by + // the ones that aren't using the $ prefix. + // https://styled-components.com/docs/faqs#transient-as-and-forwardedas-props-have-been-dropped + } else if ( + /React does not recognize the .* prop on a DOM element/.test(message) || + /Unknown event handler property/.test(message) + ) { + // do nothing + } else if (/Support for defaultProps will be removed/gi.test(message)) { + // do nothing + } else { + throw new Error(message); + } + }, +}; + +/* ------------------------------------------------------------------------------------------------- + * Strapi + * -----------------------------------------------------------------------------------------------*/ + +window.strapi = { + backendURL: 'http://localhost:1337', + isEE: false, + features: { + SSO: 'sso', + isEnabled: () => false, + }, + future: { + isEnabled: () => false, + }, + projectType: 'Community', + telemetryDisabled: true, + flags: { + nps: true, + promoteEE: true, + }, +}; + +/* ------------------------------------------------------------------------------------------------- + * matchMedia + * -----------------------------------------------------------------------------------------------*/ + +Object.defineProperty(window, 'matchMedia', { + writable: true, + value: jest.fn().mockImplementation((query) => ({ + matches: false, + media: query, + onchange: null, + /** + * @deprecated + */ + addListener: jest.fn(), + /** + * @deprecated + */ + removeListener: jest.fn(), + addEventListener: jest.fn(), + removeEventListener: jest.fn(), + dispatchEvent: jest.fn(), + })), +}); + +/* ------------------------------------------------------------------------------------------------- + * scrollTo + * -----------------------------------------------------------------------------------------------*/ + +Object.defineProperty(window, 'scrollTo', { + writable: true, + value: jest.fn(), +}); + +/* ------------------------------------------------------------------------------------------------- + * prompt + * -----------------------------------------------------------------------------------------------*/ + +Object.defineProperty(window, 'prompt', { + writable: true, + value: jest.fn(), +}); + +/* ------------------------------------------------------------------------------------------------- + * URL + * -----------------------------------------------------------------------------------------------*/ + +window.URL.createObjectURL = jest + .fn() + .mockImplementation((file) => `http://localhost:4000/assets/${file.name}`); + +/* ------------------------------------------------------------------------------------------------- + * createRange + * -----------------------------------------------------------------------------------------------*/ + +document.createRange = () => { + const range = new Range(); + // @ts-expect-error we don't need to implement all the methods + range.getClientRects = jest.fn(() => ({ + item: () => null, + length: 0, + })); + + return range; +}; + +/* ------------------------------------------------------------------------------------------------- + * localStorage + * -----------------------------------------------------------------------------------------------*/ + +class LocalStorageMock { + store: Map; + + constructor() { + this.store = new Map(); + } + + clear() { + this.store.clear(); + } + + getItem(key: string) { + /** + * We return null to avoid returning `undefined` + * because `undefined` is not a valid JSON value. + */ + return this.store.get(key) ?? null; + } + + setItem(key: string, value: unknown) { + this.store.set(key, String(value)); + } + + removeItem(key: string) { + this.store.delete(key); + } + + get length() { + return this.store.size; + } +} + +Object.defineProperty(window, 'localStorage', { + writable: true, + value: new LocalStorageMock(), +}); + +/* ------------------------------------------------------------------------------------------------- + * PointerEvents + * -----------------------------------------------------------------------------------------------*/ + +/** + * JSDOM doesn't implement PointerEvent so we need to mock our own implementation + * Default to mouse left click interaction + * https://github.com/radix-ui/primitives/issues/1822 + * https://github.com/jsdom/jsdom/pull/2666 + */ +class MockPointerEvent extends Event { + button: number; + + ctrlKey: boolean; + + pointerType: string; + + constructor( + type: string, + props: EventInit & { button?: number; ctrlKey?: boolean; pointerType?: string } + ) { + super(type, props); + this.button = props.button || 0; + this.ctrlKey = props.ctrlKey || false; + this.pointerType = props.pointerType || 'mouse'; + } +} + +Object.defineProperty(window, 'PointerEvent', { + writable: true, + value: MockPointerEvent, +}); + +window.HTMLElement.prototype.scrollIntoView = jest.fn(); +window.HTMLElement.prototype.releasePointerCapture = jest.fn(); +window.HTMLElement.prototype.hasPointerCapture = jest.fn(); + +/* ------------------------------------------------------------------------------------------------- + * Navigator + * -----------------------------------------------------------------------------------------------*/ + +/** + * Navigator is a large object so we only mock the properties we need. + */ +Object.assign(navigator, { + clipboard: { + writeText: jest.fn(), + }, +}); diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/tsconfig.build.json b/Dockers/strapi/strapi/packages/admin-test-utils/tsconfig.build.json new file mode 100644 index 0000000..d952dff --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "outDir": "dist" + }, + "include": ["src", "custom.d.ts"], + "exclude": ["**/__tests__/**"] +} diff --git a/Dockers/strapi/strapi/packages/admin-test-utils/tsconfig.json b/Dockers/strapi/strapi/packages/admin-test-utils/tsconfig.json new file mode 100644 index 0000000..85b5eed --- /dev/null +++ b/Dockers/strapi/strapi/packages/admin-test-utils/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "tsconfig/client.json", + "include": ["src", "./custom.d.ts"], + "exclude": ["node_modules"] +} diff --git a/Dockers/strapi/strapi/packages/cli/cloud/.eslintignore b/Dockers/strapi/strapi/packages/cli/cloud/.eslintignore new file mode 100644 index 0000000..927e1ff --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/.eslintignore @@ -0,0 +1,6 @@ +node_modules/ +.eslintrc.js +dist/ +bin/ +jest.config.js +rollup.config.mjs diff --git a/Dockers/strapi/strapi/packages/cli/cloud/.eslintrc.js b/Dockers/strapi/strapi/packages/cli/cloud/.eslintrc.js new file mode 100644 index 0000000..a165f57 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom/back/typescript'], +}; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/LICENSE b/Dockers/strapi/strapi/packages/cli/cloud/LICENSE new file mode 100644 index 0000000..d82875f --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/LICENSE @@ -0,0 +1,37 @@ +Copyright (c) 2015-present Strapi Solutions SAS + +Portions of the Strapi software are licensed as follows: + +* All software that resides under an "ee/" directory (the “EE Software”), if that directory exists, is licensed under the license defined below. + +Enterprise License + +If you or the company you represent has entered into a written agreement referencing the Enterprise Edition of the Strapi source code available at +https://github.com/strapi/strapi, then such agreement applies to your use of the Enterprise Edition of the Strapi Software. If you or the company you +represent is using the Enterprise Edition of the Strapi Software in connection with a subscription to our cloud offering, then the agreement you have +agreed to with respect to our cloud offering and the licenses included in such agreement apply to your use of the Enterprise Edition of the Strapi Software. +Otherwise, the Strapi Enterprise Software License Agreement (found here https://strapi.io/enterprise-terms) applies to your use of the Enterprise Edition of the Strapi Software. + +BY ACCESSING OR USING THE ENTERPRISE EDITION OF THE STRAPI SOFTWARE, YOU ARE AGREEING TO BE BOUND BY THE RELEVANT REFERENCED AGREEMENT. +IF YOU ARE NOT AUTHORIZED TO ACCEPT THESE TERMS ON BEHALF OF THE COMPANY YOU REPRESENT OR IF YOU DO NOT AGREE TO ALL OF THE RELEVANT TERMS AND CONDITIONS REFERENCED AND YOU +HAVE NOT OTHERWISE EXECUTED A WRITTEN AGREEMENT WITH STRAPI, YOU ARE NOT AUTHORIZED TO ACCESS OR USE OR ALLOW ANY USER TO ACCESS OR USE ANY PART OF +THE ENTERPRISE EDITION OF THE STRAPI SOFTWARE. YOUR ACCESS RIGHTS ARE CONDITIONAL ON YOUR CONSENT TO THE RELEVANT REFERENCED TERMS TO THE EXCLUSION OF ALL OTHER TERMS; +IF THE RELEVANT REFERENCED TERMS ARE CONSIDERED AN OFFER BY YOU, ACCEPTANCE IS EXPRESSLY LIMITED TO THE RELEVANT REFERENCED TERMS. + +* All software outside of the above-mentioned directories or restrictions above is available under the "MIT Expat" license as set forth below. + +MIT Expat License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Dockers/strapi/strapi/packages/cli/cloud/README.md b/Dockers/strapi/strapi/packages/cli/cloud/README.md new file mode 100644 index 0000000..7175098 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/README.md @@ -0,0 +1,3 @@ +# Cloud CLI + +This package includes the `cloud` CLI to manage Strapi projects on the cloud. diff --git a/Dockers/strapi/strapi/packages/cli/cloud/bin/index.js b/Dockers/strapi/strapi/packages/cli/cloud/bin/index.js new file mode 100755 index 0000000..a88ceaa --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/bin/index.js @@ -0,0 +1,7 @@ +#!/usr/bin/env node + +'use strict'; + +const { runStrapiCloudCommand } = require('../dist/bin'); + +runStrapiCloudCommand(process.argv); diff --git a/Dockers/strapi/strapi/packages/cli/cloud/jest.config.js b/Dockers/strapi/strapi/packages/cli/cloud/jest.config.js new file mode 100644 index 0000000..d2ac50a --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/jest.config.js @@ -0,0 +1,6 @@ +'use strict'; + +module.exports = { + preset: '../../../jest-preset.unit.js', + displayName: 'Cloud CLI', +}; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/package.json b/Dockers/strapi/strapi/packages/cli/cloud/package.json new file mode 100644 index 0000000..1277a5b --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/package.json @@ -0,0 +1,82 @@ +{ + "name": "@strapi/cloud-cli", + "version": "5.24.1", + "description": "Commands to interact with the Strapi Cloud", + "keywords": [ + "strapi", + "cloud", + "cli" + ], + "homepage": "https://strapi.io", + "bugs": { + "url": "https://github.com/strapi/strapi/issues" + }, + "repository": { + "type": "git", + "url": "git://github.com/strapi/strapi.git" + }, + "license": "SEE LICENSE IN LICENSE", + "author": { + "name": "Strapi Solutions SAS", + "email": "hi@strapi.io", + "url": "https://strapi.io" + }, + "maintainers": [ + { + "name": "Strapi Solutions SAS", + "email": "hi@strapi.io", + "url": "https://strapi.io" + } + ], + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "source": "./src/index.ts", + "types": "./dist/index.d.ts", + "bin": "./bin/index.js", + "files": [ + "./dist", + "./bin" + ], + "scripts": { + "build": "run -T npm-run-all clean --parallel build:code build:types", + "build:code": "run -T rollup -c", + "build:types": "run -T tsc -p tsconfig.build.json --emitDeclarationOnly", + "clean": "run -T rimraf ./dist", + "lint": "run -T eslint .", + "test:unit": "run -T jest", + "watch": "run -T rollup -c -w" + }, + "dependencies": { + "@strapi/utils": "5.24.1", + "axios": "1.12.2", + "boxen": "5.1.2", + "chalk": "4.1.2", + "cli-progress": "3.12.0", + "commander": "8.3.0", + "eventsource": "2.0.2", + "fast-safe-stringify": "2.1.1", + "fs-extra": "11.2.0", + "inquirer": "8.2.5", + "jsonwebtoken": "9.0.0", + "jwks-rsa": "3.1.0", + "lodash": "4.17.21", + "minimatch": "9.0.3", + "open": "8.4.0", + "ora": "5.4.1", + "pkg-up": "3.1.0", + "tar": "6.2.1", + "xdg-app-paths": "8.3.0", + "yup": "0.32.9" + }, + "devDependencies": { + "@types/cli-progress": "3.11.5", + "@types/eventsource": "1.1.15", + "@types/lodash": "^4.14.191", + "eslint-config-custom": "5.24.1", + "tsconfig": "5.24.1" + }, + "engines": { + "node": ">=18.0.0 <=22.x.x", + "npm": ">=6.0.0" + } +} diff --git a/Dockers/strapi/strapi/packages/cli/cloud/rollup.config.mjs b/Dockers/strapi/strapi/packages/cli/cloud/rollup.config.mjs new file mode 100644 index 0000000..70ce0fd --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/rollup.config.mjs @@ -0,0 +1,9 @@ +import { baseConfig } from '../../../rollup.utils.mjs'; + +export default baseConfig({ + input: { + index: './src/index.ts', + bin: './src/bin.ts', + }, + rootDir: './src', +}); diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/bin.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/bin.ts new file mode 100644 index 0000000..0bac6f3 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/bin.ts @@ -0,0 +1,38 @@ +import { Command } from 'commander'; +import { createLogger } from './services'; +import { getContext, setContext } from './services/context'; +import { CLIContext } from './types'; +import { buildStrapiCloudCommands } from './index'; + +function loadStrapiCloudCommand(argv = process.argv, command = new Command()) { + // Initial program setup + command.storeOptionsAsProperties(false).allowUnknownOption(true); + + // Help command + command.helpOption('-h, --help', 'Display help for command'); + command.addHelpCommand('help [command]', 'Display help for command'); + + const cwd = process.cwd(); + + const hasDebug = argv.includes('--debug'); + const hasSilent = argv.includes('--silent'); + + const logger = createLogger({ debug: hasDebug, silent: hasSilent, timestamp: false }); + + setContext({ + user: { id: '' }, + cwd, + logger, + }); + + const ctx: CLIContext = getContext(); + + buildStrapiCloudCommands({ command, ctx, argv }); +} + +function runStrapiCloudCommand(argv = process.argv, command = new Command()) { + loadStrapiCloudCommand(argv, command); + command.parse(argv); +} + +export { runStrapiCloudCommand }; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/cloud/command.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/cloud/command.ts new file mode 100644 index 0000000..b23762c --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/cloud/command.ts @@ -0,0 +1,14 @@ +import { Command } from 'commander'; +import { runAction } from '../utils/helpers'; +import listAction from '../environment/list/action'; + +export function defineCloudNamespace(command: Command, ctx: unknown): Command { + const cloud = command.command('cloud').description('Manage Strapi Cloud projects'); + + // Define cloud namespace aliases: + cloud + .command('environments') + .description('Alias for cloud environment list') + .action(() => runAction('list', listAction)(ctx)); + return cloud; +} diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/config/api.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/config/api.ts new file mode 100644 index 0000000..018ca57 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/config/api.ts @@ -0,0 +1,6 @@ +import { env } from '@strapi/utils'; + +export const apiConfig = { + apiBaseUrl: env('STRAPI_CLI_CLOUD_API', 'https://cloud-cli-api.strapi.io'), + dashboardBaseUrl: env('STRAPI_CLI_CLOUD_DASHBOARD', 'https://cloud.strapi.io'), +}; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/config/local.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/config/local.ts new file mode 100644 index 0000000..01539a7 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/config/local.ts @@ -0,0 +1,57 @@ +import path from 'path'; +import os from 'os'; +import fse from 'fs-extra'; +import XDGAppPaths from 'xdg-app-paths'; + +const APP_FOLDER_NAME = 'com.strapi.cli'; + +export const CONFIG_FILENAME = 'config.json'; + +export type LocalConfig = { + token?: string; + installId?: string; +}; + +async function checkDirectoryExists(directoryPath: string) { + try { + const fsStat = await fse.lstat(directoryPath); + return fsStat.isDirectory(); + } catch (e) { + return false; + } +} + +// Determine storage path based on the operating system +export async function getTmpStoragePath() { + const storagePath = path.join(os.tmpdir(), APP_FOLDER_NAME); + await fse.ensureDir(storagePath); + return storagePath; +} + +async function getConfigPath() { + const configDirs = XDGAppPaths(APP_FOLDER_NAME).configDirs(); + const configPath = configDirs.find(checkDirectoryExists); + + if (!configPath) { + await fse.ensureDir(configDirs[0]); + return configDirs[0]; + } + return configPath; +} + +export async function getLocalConfig(): Promise { + const configPath = await getConfigPath(); + const configFilePath = path.join(configPath, CONFIG_FILENAME); + await fse.ensureFile(configFilePath); + try { + return await fse.readJSON(configFilePath, { encoding: 'utf8', throws: true }); + } catch (e) { + return {}; + } +} + +export async function saveLocalConfig(data: LocalConfig) { + const configPath = await getConfigPath(); + const configFilePath = path.join(configPath, CONFIG_FILENAME); + await fse.writeJson(configFilePath, data, { encoding: 'utf8', spaces: 2, mode: 0o600 }); +} diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/create-growth-sso-trial/action.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/create-growth-sso-trial/action.ts new file mode 100644 index 0000000..20a6909 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/create-growth-sso-trial/action.ts @@ -0,0 +1,53 @@ +import { cloudApiFactory, tokenServiceFactory } from '../services'; +import { getContext } from '../services/context'; +import { createLogger } from '../services/logger'; +import { trackEvent } from '../utils/analytics'; + +interface CreateGrowthSsoTrialInput { + strapiVersion: string | undefined; +} + +interface CreateGrowthSsoTrialResponse { + license: string; +} + +export default async ({ + strapiVersion, +}: CreateGrowthSsoTrialInput): Promise => { + const logger = createLogger(); + const { retrieveToken } = await tokenServiceFactory({ logger }); + + const token = await retrieveToken(); + if (!token) { + return; + } + + const cloudApiService = await cloudApiFactory({ logger }, token); + + try { + const { data: config } = await cloudApiService.config(); + if (!config?.featureFlags?.growthSsoTrialEnabled) { + return; + } + } catch (e: unknown) { + logger.debug('Failed to get cli config', e); + return; + } + + try { + const response = await cloudApiService.createTrial({ strapiVersion: strapiVersion || '' }); + + const ctx = getContext(); + + await trackEvent(ctx, cloudApiService, 'didCreateGrowthSsoTrial', { + strapiVersion: strapiVersion || '', + }); + + return { license: response.data?.licenseKey }; + } catch (e: Error | unknown) { + logger.debug(e); + logger.error( + 'We encountered an issue while creating your trial. Please try again in a moment. If the problem persists, contact support for assistance.' + ); + } +}; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/create-growth-sso-trial/index.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/create-growth-sso-trial/index.ts new file mode 100644 index 0000000..152e386 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/create-growth-sso-trial/index.ts @@ -0,0 +1,5 @@ +import action from './action'; + +export { action }; + +export { action as createGrowthSsoTrial }; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/action.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/action.ts new file mode 100644 index 0000000..051873e --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/action.ts @@ -0,0 +1,154 @@ +import inquirer from 'inquirer'; +import { AxiosError } from 'axios'; +import { defaults } from 'lodash/fp'; +import { + CLIContext, + CloudApiService, + CloudCliConfig, + CreateProjectResponse, + ProjectAnswers, + ProjectInput, +} from '../types'; +import { cloudApiFactory, local, tokenServiceFactory } from '../services'; +import { VERSION } from '../services/cli-api'; +import { getProjectNameFromPackageJson } from './utils/get-project-name-from-pkg'; +import { promptLogin } from '../login/action'; +import { + getDefaultsFromQuestions, + getProjectNodeVersionDefault, + questionDefaultValuesMapper, +} from './utils/project-questions.utils'; +import { apiConfig } from '../config/api'; +import { notificationServiceFactory } from '../services/notification'; +import { + environmentCreationErrorFactory, + environmentErrorMessageFactory, +} from '../utils/error-message-factories'; + +async function handleError(ctx: CLIContext, error: Error) { + const { logger } = ctx; + logger.debug(error); + if (error instanceof AxiosError) { + const errorMessage = typeof error.response?.data === 'string' ? error.response.data : null; + switch (error.response?.status) { + case 400: + logger.error(errorMessage || 'Invalid input. Please check your inputs and try again.'); + return; + case 403: + logger.error( + errorMessage || + 'You do not have permission to create a project. Please contact support for assistance.' + ); + return; + case 503: + logger.error( + 'Strapi Cloud project creation is currently unavailable. Please try again later.' + ); + return; + default: + if (errorMessage) { + logger.error(errorMessage); + throw error; + } + break; + } + } + logger.error( + 'We encountered an issue while creating your project. Please try again in a moment. If the problem persists, contact support for assistance.' + ); +} + +async function createProject( + ctx: CLIContext, + cloudApi: CloudApiService, + projectInput: ProjectInput, + token: string, + config: CloudCliConfig +) { + const { logger } = ctx; + const projectSpinner = logger.spinner('Setting up your project...').start(); + projectSpinner.indent = 1; + const notificationService = notificationServiceFactory(ctx); + const { waitForEnvironmentCreation, close } = notificationService( + `${apiConfig.apiBaseUrl}/${VERSION}/notifications`, + token, + config + ); + let projectData: CreateProjectResponse; + try { + const { data } = await cloudApi.createProject(projectInput); + projectData = data; + await local.save({ project: data }); + projectSpinner.succeed('Project created successfully!'); + } catch (e: Error | unknown) { + projectSpinner.fail(`An error occurred while creating the project on Strapi Cloud.`); + close(); + throw e; + } + if (config.featureFlags.asyncProjectCreationEnabled) { + const environmentSpinner = logger + .spinner('Setting up your environment... This may take a minute...') + .start(); + environmentSpinner.indent = 1; + try { + await waitForEnvironmentCreation(projectData.environmentInternalName); + environmentSpinner.succeed('Environment created successfully!\n'); + } catch (e: Error | unknown) { + environmentSpinner.fail( + `An error occurred while creating the environment on Strapi Cloud.\n` + ); + const environmentErrorMessage = environmentErrorMessageFactory({ + projectName: projectData.name, + firstLine: config.projectCreation.errors.environmentCreationFailed.firstLine, + secondLine: config.projectCreation.errors.environmentCreationFailed.secondLine, + }); + logger.log(environmentCreationErrorFactory(environmentErrorMessage)); + return; + } + } + close(); + return projectData; +} + +export default async (ctx: CLIContext) => { + const { logger } = ctx; + const { getValidToken, eraseToken } = await tokenServiceFactory(ctx); + + const token = await getValidToken(ctx, promptLogin); + if (!token) { + return; + } + + const cloudApi = await cloudApiFactory(ctx, token); + const { data: config } = await cloudApi.config(); + const projectName = await getProjectNameFromPackageJson(ctx); + + const defaultAnswersMapper = questionDefaultValuesMapper({ + name: projectName, + nodeVersion: getProjectNodeVersionDefault, + }); + const questions = defaultAnswersMapper(config.projectCreation.questions); + const defaultValues = { + ...config.projectCreation.defaults, + ...getDefaultsFromQuestions(questions), + }; + + const projectAnswersDefaulted = defaults(defaultValues); + const projectAnswers = await inquirer.prompt(questions); + + const projectInput: ProjectInput = projectAnswersDefaulted(projectAnswers); + + try { + return await createProject(ctx, cloudApi, projectInput, token, config); + } catch (e: Error | unknown) { + if (e instanceof AxiosError && e.response?.status === 401) { + logger.warn('Oops! Your session has expired. Please log in again to retry.'); + await eraseToken(); + if (await promptLogin(ctx)) { + return await createProject(ctx, cloudApi, projectInput, token, config); + } + } else { + await handleError(ctx, e as Error); + } + } +}; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/command.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/command.ts new file mode 100644 index 0000000..e084eb9 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/command.ts @@ -0,0 +1,17 @@ +import { createCommand } from 'commander'; +import { type StrapiCloudCommand } from '../types'; +import { runAction } from '../utils/helpers'; +import action from './action'; + +/** + * `$ create project in Strapi cloud` + */ +const command: StrapiCloudCommand = ({ ctx }) => { + return createCommand('cloud:create-project') + .description('Create a Strapi Cloud project') + .option('-d, --debug', 'Enable debugging mode with verbose logs') + .option('-s, --silent', "Don't log anything") + .action(() => runAction('cloud:create-project', action)(ctx)); +}; + +export default command; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/index.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/index.ts new file mode 100644 index 0000000..4b8e5bc --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/index.ts @@ -0,0 +1,12 @@ +import action from './action'; +import command from './command'; +import type { StrapiCloudCommandInfo } from '../types'; + +export { action, command }; + +export default { + name: 'create-project', + description: 'Create a new project', + action, + command, +} as StrapiCloudCommandInfo; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/utils/__tests__/get-project-name-from-pkg.test.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/utils/__tests__/get-project-name-from-pkg.test.ts new file mode 100644 index 0000000..3328235 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/utils/__tests__/get-project-name-from-pkg.test.ts @@ -0,0 +1,30 @@ +import { CLIContext } from '../../../types'; +import { loadPkg } from '../../../utils/pkg'; +import { getProjectNameFromPackageJson } from '../get-project-name-from-pkg'; + +// Mock the loadPkg function +jest.mock('../../../utils/pkg', () => ({ + loadPkg: jest.fn(), +})); + +describe('getProjectNameFromPackageJson', () => { + const mockCtx: CLIContext = {} as CLIContext; + + it('should return the project name from package.json', async () => { + (loadPkg as jest.Mock).mockResolvedValue({ name: 'test-project' }); + const projectName = await getProjectNameFromPackageJson(mockCtx); + expect(projectName).toEqual('test-project'); + }); + + it('should return default project name if package.json has no name', async () => { + (loadPkg as jest.Mock).mockResolvedValue({}); + const projectName = await getProjectNameFromPackageJson(mockCtx); + expect(projectName).toEqual('my-strapi-project'); + }); + + it('should return default project name on error', async () => { + (loadPkg as jest.Mock).mockRejectedValue(new Error('Failed to load package.json')); + const projectName = await getProjectNameFromPackageJson(mockCtx); + expect(projectName).toEqual('my-strapi-project'); + }); +}); diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/utils/__tests__/project-questions.test.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/utils/__tests__/project-questions.test.ts new file mode 100644 index 0000000..1801265 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/utils/__tests__/project-questions.test.ts @@ -0,0 +1,132 @@ +import type { DistinctQuestion } from 'inquirer'; +import type { ProjectAnswers } from '../../../types'; +import { + getProjectNodeVersionDefault, + getDefaultsFromQuestions, + questionDefaultValuesMapper, +} from '../project-questions.utils'; + +describe('getProjectNodeVersionDefault', () => { + it('should return the current node version if it is in the list of choices', () => { + const currentNodeVersion = global.process.versions.node.split('.')[0]; + const question: DistinctQuestion = { + name: 'nodeVersion', + type: 'list', + choices: [{ value: currentNodeVersion }, { value: '14' }], + }; + + const result = getProjectNodeVersionDefault(question); + + expect(result).toEqual(currentNodeVersion); + }); + + it('should return the default value if the current node version is not in the list of choices', () => { + const question: DistinctQuestion = { + name: 'nodeVersion', + type: 'list', + choices: [{ value: 'fake-ver' }, { value: 'fake-ver-2' }], + default: 'fake-ver', + }; + + const result = getProjectNodeVersionDefault(question); + + expect(result).toEqual('fake-ver'); + }); + + it('should return the default value if the question type is not a list', () => { + const question: DistinctQuestion = { + name: 'nodeVersion', + type: 'input', + default: '12', + }; + + const result = getProjectNodeVersionDefault(question); + + expect(result).toEqual('12'); + }); +}); + +describe('getDefaultsFromQuestions', () => { + it('should return the default values from questions with static defaults', () => { + const questions: ReadonlyArray> = [ + { name: 'name', type: 'input', default: 'Default Project' }, + { name: 'nodeVersion', type: 'input', default: '1' }, + ]; + + const result = getDefaultsFromQuestions(questions); + + expect(result).toEqual({ + name: 'Default Project', + nodeVersion: '1', + }); + }); + + it('should return an empty object when no questions have defaults', () => { + const questions: ReadonlyArray> = [ + { name: 'name', type: 'input', default: 'toto' }, + { name: 'nodeVersion', type: 'input' }, + ]; + + const result = getDefaultsFromQuestions(questions); + + expect(result).toEqual({ name: 'toto' }); + }); +}); + +describe('questionDefaultValuesMapper', () => { + it('should apply static default values to questions', () => { + const questions: ReadonlyArray> = [ + { name: 'name', type: 'input' }, + { name: 'nodeVersion', type: 'input' }, + ]; + + const mapper = { + name: 'Default Project', + nodeVersion: '1', + }; + + const result = questionDefaultValuesMapper(mapper)(questions); + + expect(result).toEqual([ + { name: 'name', type: 'input', default: 'Default Project' }, + { name: 'nodeVersion', type: 'input', default: '1' }, + ]); + }); + + it('should apply dynamic default values to questions', () => { + const questions: ReadonlyArray> = [ + { name: 'name', type: 'input' }, + { name: 'nodeVersion', type: 'input' }, + ]; + + const mapper = { + name: () => 'Dynamic Default', + nodeVersion: () => '2', + }; + + const result = questionDefaultValuesMapper(mapper)(questions); + + expect(result).toEqual([ + { name: 'name', type: 'input', default: 'Dynamic Default' }, + { name: 'nodeVersion', type: 'input', default: '2' }, + ]); + }); + + it('should leave questions unchanged if they are not in the mapper', () => { + const questions: ReadonlyArray> = [ + { name: 'name', type: 'input' }, + { name: 'nodeVersion', type: 'input' }, + ]; + + const mapper = { + region: 'AMS', + }; + + const result = questionDefaultValuesMapper(mapper)(questions); + + expect(result).toEqual([ + { name: 'name', type: 'input' }, + { name: 'nodeVersion', type: 'input' }, + ]); + }); +}); diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/utils/get-project-name-from-pkg.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/utils/get-project-name-from-pkg.ts new file mode 100644 index 0000000..c12315e --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/utils/get-project-name-from-pkg.ts @@ -0,0 +1,11 @@ +import { CLIContext } from '../../types'; +import { PackageJson, loadPkg } from '../../utils/pkg'; + +export async function getProjectNameFromPackageJson(ctx: CLIContext): Promise { + try { + const packageJson = (await loadPkg(ctx)) as PackageJson; + return packageJson.name || 'my-strapi-project'; + } catch (e) { + return 'my-strapi-project'; + } +} diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/utils/project-questions.utils.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/utils/project-questions.utils.ts new file mode 100644 index 0000000..acaa532 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/create-project/utils/project-questions.utils.ts @@ -0,0 +1,74 @@ +import { DistinctQuestion } from 'inquirer'; +import type { ProjectAnswers } from '../../types'; + +/** + * Apply default values to questions based on the provided mapper + * @param questionsMap - A partial object with keys matching the ProjectAnswers keys and values being the default value or a function to get the default value + */ +export function questionDefaultValuesMapper( + questionsMap: Partial<{ + [K in keyof ProjectAnswers]: + | ((question: DistinctQuestion) => ProjectAnswers[K]) + | ProjectAnswers[K]; + }> +) { + return ( + questions: ReadonlyArray> + ): ReadonlyArray> => { + return questions.map((question) => { + const questionName = question.name as keyof ProjectAnswers; + + // If the question is part of the mapper, apply the default value + if (questionName in questionsMap) { + const questionDefault = questionsMap[questionName]; + + // If the default value is a function, call it with the question and get the default value + if (typeof questionDefault === 'function') { + return { + ...question, + default: questionDefault(question), + }; + } + // else we consider it as a static value + return { + ...question, + default: questionDefault, + }; + } + // If the question is not part of the mapper, return the question as is + return question; + }); + }; +} + +/** + * Get default values from questions + * @param questions - An array of questions for project creation + */ +export function getDefaultsFromQuestions( + questions: ReadonlyArray> +): Partial { + return questions.reduce((acc, question) => { + if (question.default && question.name) { + return { ...acc, [question.name]: question.default }; + } + return acc; + }, {}); +} + +/** + * Get the default node version based on the current node version if it is in the list of choices + * @param question - The question for the node version in project creation + */ +export function getProjectNodeVersionDefault(question: DistinctQuestion): string { + const currentNodeVersion = process.versions.node.split('.')[0]; + + // Node Version question is set up as a list, but the type of inquirer is dynamic and the question can change in the future (it comes from API) + if (question.type === 'list' && Array.isArray(question.choices)) { + const choice = question.choices.find((choice) => choice.value === currentNodeVersion); + if (choice) { + return choice.value; + } + } + return question.default; +} diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/deploy-project/action.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/deploy-project/action.ts new file mode 100644 index 0000000..7321e8f --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/deploy-project/action.ts @@ -0,0 +1,408 @@ +import fse from 'fs-extra'; +import inquirer from 'inquirer'; +import boxen from 'boxen'; +import path from 'path'; +import chalk from 'chalk'; +import { AxiosError } from 'axios'; +import * as crypto from 'node:crypto'; +import { apiConfig } from '../config/api'; +import { compressFilesToTar } from '../utils/compress-files'; +import createProjectAction from '../create-project/action'; +import type { + CLIContext, + CloudApiService, + CloudCliConfig, + EnvironmentDetails, + ProjectInfo, +} from '../types'; +import { getTmpStoragePath } from '../config/local'; +import { cloudApiFactory, tokenServiceFactory, local } from '../services'; +import { VERSION } from '../services/cli-api'; +import { notificationServiceFactory } from '../services/notification'; +import { loadPkg } from '../utils/pkg'; +import { buildLogsServiceFactory } from '../services/build-logs'; +import { promptLogin } from '../login/action'; +import { trackEvent } from '../utils/analytics'; +import { + environmentCreationErrorFactory, + environmentErrorMessageFactory, +} from '../utils/error-message-factories'; + +type PackageJson = { + name: string; + strapi?: { + uuid: string; + }; +}; + +interface CmdOptions { + env?: string; + force?: boolean; +} + +const boxenOptions: boxen.Options = { + padding: 1, + margin: 1, + align: 'center', + borderColor: 'yellow', + borderStyle: 'round', +}; + +const QUIT_OPTION = 'Quit'; + +async function promptForEnvironment(environments: string[]): Promise { + const choices = environments.map((env) => ({ name: env, value: env })); + const { selectedEnvironment } = await inquirer.prompt([ + { + type: 'list', + name: 'selectedEnvironment', + message: 'Select the environment to deploy:', + choices: [...choices, { name: chalk.grey(`(${QUIT_OPTION})`), value: null }], + }, + ]); + if (selectedEnvironment === null) { + process.exit(1); + } + + return selectedEnvironment; +} + +async function upload( + ctx: CLIContext, + project: Omit, + cliConfig: CloudCliConfig, + token: string, + maxProjectFileSize: number +) { + const cloudApi = await cloudApiFactory(ctx, token); + try { + const storagePath = await getTmpStoragePath(); + const projectFolder = path.resolve(process.cwd()); + const packageJson = (await loadPkg(ctx)) as PackageJson; + + if (!packageJson) { + ctx.logger.error( + 'Unable to deploy the project. Please make sure the package.json file is correctly formatted.' + ); + return; + } + + const compressSpinner = ctx.logger.spinner('Compressing project...').start(); + compressSpinner.indent = 1; + // hash packageJson.name to avoid conflicts + const hashname = crypto.createHash('sha512').update(packageJson.name).digest('hex'); + const compressedFilename = `${hashname}.tar.gz`; + try { + ctx.logger.debug( + 'Compression parameters\n', + `Storage path: ${storagePath}\n`, + `Project folder: ${projectFolder}\n`, + `Compressed filename: ${compressedFilename}` + ); + await compressFilesToTar(storagePath, projectFolder, compressedFilename); + compressSpinner.succeed(`Project compressed successfully!`); + } catch (e: unknown) { + compressSpinner.fail( + 'Project compression failed. Try again later or check for large/incompatible files.' + ); + ctx.logger.debug(e); + process.exit(1); + } + + const tarFilePath = path.resolve(storagePath, compressedFilename); + const fileStats = await fse.stat(tarFilePath); + + if (fileStats.size > maxProjectFileSize) { + ctx.logger.log( + 'Unable to proceed: Your project is too big to be transferred, please use a git repo instead.' + ); + try { + await fse.remove(tarFilePath); + } catch (e: any) { + ctx.logger.log('Unable to remove file: ', tarFilePath); + ctx.logger.debug(e); + } + return; + } + + const progressBar = ctx.logger.progressBar(100, ' ∷ Uploading project'); + + try { + const { data } = await cloudApi.deploy( + { filePath: tarFilePath, project }, + { + onUploadProgress(progressEvent) { + const total = progressEvent.total || fileStats.size; + const percentage = Math.round((progressEvent.loaded * 100) / total); + progressBar.update(percentage); + }, + } + ); + + progressBar.update(100); + progressBar.stop(); + ctx.logger.log(`${chalk.green.bold('✔')} Upload finished!\n`); + return data.build_id; + } catch (e: any) { + progressBar.stop(); + await handleUploadError(ctx, e, project, cliConfig); + } finally { + await fse.remove(tarFilePath); + } + process.exit(0); + } catch (e: any) { + ctx.logger.error('An error occurred while deploying the project. Please try again later.'); + ctx.logger.debug(e); + process.exit(1); + } +} + +async function handleUploadError( + ctx: CLIContext, + error: any, + project: any, + cliConfig: CloudCliConfig +) { + const { logger } = ctx; + logger.debug(error); + + if (error.response?.status) { + switch (error.response.status) { + case 405: { + const environmentErrorMessage = environmentErrorMessageFactory({ + projectName: project.name, + firstLine: cliConfig.projectDeployment.errors.environmentNotReady.firstLine, + secondLine: cliConfig.projectDeployment.errors.environmentNotReady.secondLine, + }); + logger.log(environmentCreationErrorFactory(environmentErrorMessage)); + return; + } + case 413: + logger.error( + 'The project you are trying to upload is too big. Please remove unnecessary files and try again.' + ); + return; + default: + break; + } + } + logger.error('An error occurred while deploying the project. Please try again later.'); +} + +async function getProject(ctx: CLIContext) { + const { project } = await local.retrieve(); + if (!project) { + try { + const projectResponse = await createProjectAction(ctx); + if (projectResponse) { + const { project: projectSaved } = await local.retrieve(); + return projectSaved; + } + } catch (e: any) { + ctx.logger.error('An error occurred while deploying the project. Please try again later.'); + ctx.logger.debug(e); + process.exit(1); + } + } + return project; +} + +async function getConfig({ + ctx, + cloudApiService, +}: { + ctx: CLIContext; + cloudApiService: CloudApiService; +}): Promise { + try { + const { data: cliConfig } = await cloudApiService.config(); + return cliConfig; + } catch (e) { + ctx.logger.debug('Failed to get cli config', e); + return null; + } +} + +function validateEnvironment(ctx: CLIContext, environment: string, environments: string[]): void { + if (!environments.includes(environment)) { + ctx.logger.error(`Environment ${environment} does not exist.`); + process.exit(1); + } +} + +async function getTargetEnvironment( + ctx: CLIContext, + opts: CmdOptions, + project: Omit, + environments: string[] +): Promise { + if (opts.env) { + validateEnvironment(ctx, opts.env, environments); + return opts.env; + } + + if (project.targetEnvironment) { + return project.targetEnvironment; + } + + if (environments.length > 1) { + return promptForEnvironment(environments); + } + + return environments[0]; +} + +function hasPendingOrLiveDeployment( + environments: EnvironmentDetails[], + targetEnvironment: string +): boolean { + const environment = environments.find((env) => env.name === targetEnvironment); + if (!environment) { + throw new Error(`Environment details ${targetEnvironment} not found.`); + } + return environment.hasPendingDeployment || environment.hasLiveDeployment || false; +} + +export default async (ctx: CLIContext, opts: CmdOptions) => { + const { getValidToken } = await tokenServiceFactory(ctx); + const token = await getValidToken(ctx, promptLogin); + if (!token) { + return; + } + + const project = await getProject(ctx); + if (!project) { + process.exit(1); + } + + const cloudApiService = await cloudApiFactory(ctx, token); + let projectData; + let environments: string[]; + let environmentsDetails: EnvironmentDetails[]; + + try { + const { + data: { data, metadata }, + } = await cloudApiService.getProject({ name: project.name }); + projectData = data; + environments = projectData.environments; + environmentsDetails = projectData.environmentsDetails; + const isProjectSuspended = projectData.suspendedAt; + + if (isProjectSuspended) { + ctx.logger.log( + '\n Oops! This project has been suspended. \n\n Please reactivate it from the dashboard to continue deploying: ' + ); + ctx.logger.log(chalk.underline(`${metadata.dashboardUrls.project}`)); + return; + } + } catch (e: Error | unknown) { + if (e instanceof AxiosError && e.response?.data) { + if (e.response.status === 404) { + ctx.logger.warn( + `The project associated with this folder does not exist in Strapi Cloud. \nPlease link your local project to an existing Strapi Cloud project using the ${chalk.cyan( + 'link' + )} command before deploying.` + ); + } else { + ctx.logger.error(e.response.data); + } + } else { + ctx.logger.error( + "An error occurred while retrieving the project's information. Please try again later." + ); + } + ctx.logger.debug(e); + return; + } + + await trackEvent(ctx, cloudApiService, 'willDeployWithCLI', { + projectInternalName: project.name, + }); + + const notificationService = notificationServiceFactory(ctx); + const buildLogsService = buildLogsServiceFactory(ctx); + + const cliConfig = await getConfig({ ctx, cloudApiService }); + if (!cliConfig) { + ctx.logger.error( + 'An error occurred while retrieving data from Strapi Cloud. Please check your network or try again later.' + ); + return; + } + + let maxSize: number = parseInt(cliConfig.maxProjectFileSize, 10); + if (Number.isNaN(maxSize)) { + ctx.logger.debug( + 'An error occurred while parsing the maxProjectFileSize. Using default value.' + ); + maxSize = 100000000; + } + + project.targetEnvironment = await getTargetEnvironment(ctx, opts, project, environments); + + if (!opts.force) { + const shouldDisplayWarning = hasPendingOrLiveDeployment( + environmentsDetails, + project.targetEnvironment + ); + if (shouldDisplayWarning) { + ctx.logger.log(boxen(cliConfig.projectDeployment.confirmationText, boxenOptions)); + const { confirm } = await inquirer.prompt([ + { + type: 'confirm', + name: 'confirm', + message: `Do you want to proceed with deployment to ${chalk.cyan(projectData.displayName)} on ${chalk.cyan(project.targetEnvironment)} environment?`, + }, + ]); + if (!confirm) { + process.exit(1); + } + } + } + + const buildId = await upload(ctx, project, cliConfig, token, maxSize); + + if (!buildId) { + return; + } + + let notifications: ReturnType | null = null; + + try { + ctx.logger.log( + `∷ Deploying project to ${chalk.cyan(project.targetEnvironment ?? `production`)} environment...` + ); + + notifications = notificationService( + `${apiConfig.apiBaseUrl}/${VERSION}/notifications`, + token, + cliConfig + ); + + await buildLogsService(`${apiConfig.apiBaseUrl}/${VERSION}/logs/${buildId}`, token, cliConfig); + const dashboardUrlLine = + chalk.cyan(' → ') + + chalk.cyan.underline(`${apiConfig.dashboardBaseUrl}/projects/${project.name}/deployments`); + ctx.logger.log( + boxen(`Project and deployment logs ready at:\n${dashboardUrlLine}`, { + padding: 1, + margin: 1, + borderStyle: 'round', + borderColor: 'white', + titleAlignment: 'left', + }) + ); + } catch (e: Error | unknown) { + ctx.logger.debug(e); + if (e instanceof Error) { + ctx.logger.error(e.message); + } else { + ctx.logger.error('An error occurred while deploying the project. Please try again later.'); + } + } finally { + if (notifications) { + notifications.close(); + } + } +}; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/deploy-project/command.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/deploy-project/command.ts new file mode 100644 index 0000000..2322de3 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/deploy-project/command.ts @@ -0,0 +1,20 @@ +import { createCommand } from 'commander'; +import { type StrapiCloudCommand } from '../types'; +import { runAction } from '../utils/helpers'; +import action from './action'; + +/** + * `$ deploy project to the cloud` + */ +const command: StrapiCloudCommand = ({ ctx }) => { + return createCommand('cloud:deploy') + .alias('deploy') + .description('Deploy a Strapi Cloud project') + .option('-d, --debug', 'Enable debugging mode with verbose logs') + .option('-s, --silent', "Don't log anything") + .option('-f, --force', 'Skip confirmation to deploy') + .option('-e, --env ', 'Specify the environment to deploy') + .action((opts) => runAction('deploy', action)(ctx, opts)); +}; + +export default command; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/deploy-project/index.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/deploy-project/index.ts new file mode 100644 index 0000000..91df9ab --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/deploy-project/index.ts @@ -0,0 +1,12 @@ +import action from './action'; +import command from './command'; +import type { StrapiCloudCommandInfo } from '../types'; + +export { action, command }; + +export default { + name: 'deploy-project', + description: 'Deploy a Strapi Cloud project', + action, + command, +} as StrapiCloudCommandInfo; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/environment/command.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/environment/command.ts new file mode 100644 index 0000000..50b9348 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/environment/command.ts @@ -0,0 +1,12 @@ +import { Command } from 'commander'; +import { defineCloudNamespace } from '../cloud/command'; + +let environmentCmd: Command | null = null; + +export const initializeEnvironmentCommand = (command: Command, ctx: unknown): Command => { + if (!environmentCmd) { + const cloud = defineCloudNamespace(command, ctx); + environmentCmd = cloud.command('environment').description('Manage environments'); + } + return environmentCmd; +}; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/environment/link/action.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/environment/link/action.ts new file mode 100644 index 0000000..0345bb3 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/environment/link/action.ts @@ -0,0 +1,147 @@ +import chalk from 'chalk'; +import inquirer, { type Answers } from 'inquirer'; +import { EnvironmentDetails, ProjectInput } from '../../services/cli-api'; +import type { CLIContext, CloudApiService } from '../../types'; +import { cloudApiFactory, tokenServiceFactory, local } from '../../services'; +import { promptLogin } from '../../login/action'; +import { trackEvent } from '../../utils/analytics'; +import { getLocalProject } from '../../utils/get-local-config'; + +const QUIT_OPTION = 'Quit'; + +interface LinkEnvironmentAnswer extends Answers { + targetEnvironment: string; +} + +interface LinkEnvironmentInput extends Answers { + targetEnvironment: string; +} + +type EnvironmentsList = EnvironmentDetails[]; + +export default async (ctx: CLIContext) => { + const { getValidToken } = await tokenServiceFactory(ctx); + const token = await getValidToken(ctx, promptLogin); + const { logger } = ctx; + + if (!token) { + return; + } + + const project = await getLocalProject(ctx); + + if (!project) { + logger.debug(`No valid local project configuration was found.`); + return; + } + + const cloudApiService = await cloudApiFactory(ctx, token); + const environments = await getEnvironmentsList(ctx, cloudApiService, project); + + if (!environments) { + logger.debug(`Fetching environments failed.`); + return; + } + + if (environments.length === 0) { + logger.log( + `The only available environment is already linked. You can add a new one from your project settings on the Strapi Cloud dashboard.` + ); + return; + } + + const answer: LinkEnvironmentAnswer | null = await promptUserForEnvironment(ctx, environments); + + if (!answer) { + return; + } + + await trackEvent(ctx, cloudApiService, 'willLinkEnvironment', { + projectName: project.name, + environmentName: answer.targetEnvironment, + }); + + try { + await local.patch({ project: { targetEnvironment: answer.targetEnvironment } }); + } catch (e) { + await trackEvent(ctx, cloudApiService, 'didNotLinkEnvironment', { + projectName: project.name, + environmentName: answer.targetEnvironment, + }); + logger.debug('Failed to link environment', e); + logger.error( + 'Failed to link the environment. If this issue persists, try re-linking your project or contact support.' + ); + process.exit(1); + } + + logger.log( + ` You have successfully linked your project to ${chalk.cyan(answer.targetEnvironment)}, on ${chalk.cyan(project.displayName)}. You are now able to deploy your project.` + ); + await trackEvent(ctx, cloudApiService, 'didLinkEnvironment', { + projectName: project.name, + environmentName: answer.targetEnvironment, + }); +}; + +async function promptUserForEnvironment( + ctx: CLIContext, + environments: EnvironmentsList +): Promise { + const { logger } = ctx; + + try { + const answer: LinkEnvironmentInput = await inquirer.prompt([ + { + type: 'list', + name: 'targetEnvironment', + message: 'Which environment do you want to link?', + choices: [...environments, { name: chalk.grey(`(${QUIT_OPTION})`), value: null }], + }, + ]); + + if (!answer.targetEnvironment) { + return null; + } + + return answer; + } catch (e) { + logger.debug('Failed to get user input', e); + logger.error('An error occurred while trying to get your environment selection.'); + return null; + } +} + +async function getEnvironmentsList( + ctx: CLIContext, + cloudApiService: CloudApiService, + project: ProjectInput +) { + const spinner = ctx.logger.spinner('Fetching environments...\n').start(); + + try { + const { + data: { data: environmentsList }, + } = await cloudApiService.listLinkEnvironments({ name: project.name }); + + if (!Array.isArray(environmentsList) || environmentsList.length === 0) { + throw new Error('Environments not found in server response'); + } + spinner.succeed(); + return environmentsList.filter( + (environment: EnvironmentDetails) => environment.name !== project.targetEnvironment + ); + } catch (e: any) { + if (e.response && e.response.status === 404) { + spinner.succeed(); + ctx.logger.warn( + `\nThe project associated with this folder does not exist in Strapi Cloud. \nPlease link your local project to an existing Strapi Cloud project using the ${chalk.cyan( + 'link' + )} command.` + ); + } else { + spinner.fail('An error occurred while fetching environments data from Strapi Cloud.'); + ctx.logger.debug('Failed to list environments', e); + } + } +} diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/environment/link/command.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/environment/link/command.ts new file mode 100644 index 0000000..4a50b55 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/environment/link/command.ts @@ -0,0 +1,17 @@ +import { type StrapiCloudCommand } from '../../types'; +import { runAction } from '../../utils/helpers'; +import action from './action'; +import { initializeEnvironmentCommand } from '../command'; + +const command: StrapiCloudCommand = ({ command, ctx }) => { + const environmentCmd = initializeEnvironmentCommand(command, ctx); + + environmentCmd + .command('link') + .description('Link project to a specific Strapi Cloud project environment') + .option('-d, --debug', 'Enable debugging mode with verbose logs') + .option('-s, --silent', "Don't log anything") + .action(() => runAction('link', action)(ctx)); +}; + +export default command; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/environment/link/index.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/environment/link/index.ts new file mode 100644 index 0000000..69ca768 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/environment/link/index.ts @@ -0,0 +1,12 @@ +import action from './action'; +import command from './command'; +import type { StrapiCloudCommandInfo } from '../../types'; + +export { action, command }; + +export default { + name: 'link-environment', + description: 'Link Strapi Cloud environment to a local project', + action, + command, +} as StrapiCloudCommandInfo; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/environment/list/action.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/environment/list/action.ts new file mode 100644 index 0000000..27dbfa0 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/environment/list/action.ts @@ -0,0 +1,54 @@ +import chalk from 'chalk'; +import type { CLIContext } from '../../types'; +import { cloudApiFactory, tokenServiceFactory } from '../../services'; +import { promptLogin } from '../../login/action'; +import { trackEvent } from '../../utils/analytics'; +import { getLocalProject } from '../../utils/get-local-config'; + +export default async (ctx: CLIContext) => { + const { getValidToken } = await tokenServiceFactory(ctx); + const token = await getValidToken(ctx, promptLogin); + const { logger } = ctx; + + if (!token) { + return; + } + + const project = await getLocalProject(ctx); + if (!project) { + ctx.logger.debug(`No valid local project configuration was found.`); + return; + } + + const cloudApiService = await cloudApiFactory(ctx, token); + const spinner = logger.spinner('Fetching environments...').start(); + await trackEvent(ctx, cloudApiService, 'willListEnvironment', { + projectInternalName: project.name, + }); + + try { + const { + data: { data: environmentsList }, + } = await cloudApiService.listEnvironments({ name: project.name }); + spinner.succeed(); + logger.log(environmentsList); + await trackEvent(ctx, cloudApiService, 'didListEnvironment', { + projectInternalName: project.name, + }); + } catch (e: any) { + if (e.response && e.response.status === 404) { + spinner.succeed(); + logger.warn( + `\nThe project associated with this folder does not exist in Strapi Cloud. \nPlease link your local project to an existing Strapi Cloud project using the ${chalk.cyan( + 'link' + )} command` + ); + } else { + spinner.fail('An error occurred while fetching environments data from Strapi Cloud.'); + logger.debug('Failed to list environments', e); + } + await trackEvent(ctx, cloudApiService, 'didNotListEnvironment', { + projectInternalName: project.name, + }); + } +}; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/environment/list/command.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/environment/list/command.ts new file mode 100644 index 0000000..c820f68 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/environment/list/command.ts @@ -0,0 +1,17 @@ +import { type StrapiCloudCommand } from '../../types'; +import { runAction } from '../../utils/helpers'; +import action from './action'; +import { initializeEnvironmentCommand } from '../command'; + +const command: StrapiCloudCommand = ({ command, ctx }) => { + const environmentCmd = initializeEnvironmentCommand(command, ctx); + + environmentCmd + .command('list') + .description('List Strapi Cloud project environments') + .option('-d, --debug', 'Enable debugging mode with verbose logs') + .option('-s, --silent', "Don't log anything") + .action(() => runAction('list', action)(ctx)); +}; + +export default command; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/environment/list/index.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/environment/list/index.ts new file mode 100644 index 0000000..43aaecb --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/environment/list/index.ts @@ -0,0 +1,12 @@ +import action from './action'; +import command from './command'; +import type { StrapiCloudCommandInfo } from '../../types'; + +export { action, command }; + +export default { + name: 'list-environments', + description: 'List Strapi Cloud environments', + action, + command, +} as StrapiCloudCommandInfo; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/index.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/index.ts new file mode 100644 index 0000000..a3f566c --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/index.ts @@ -0,0 +1,75 @@ +import { Command } from 'commander'; +import crypto from 'crypto'; +import deployProject from './deploy-project'; +import link from './link'; +import login from './login'; +import logout from './logout'; +import createProject from './create-project'; +import { createGrowthSsoTrial } from './create-growth-sso-trial'; +import listProjects from './list-projects'; +import listEnvironments from './environment/list'; +import linkEnvironment from './environment/link'; +import { CLIContext } from './types'; +import { getLocalConfig, saveLocalConfig } from './config/local'; + +export const cli = { + deployProject, + link, + login, + logout, + createProject, + linkEnvironment, + listProjects, + listEnvironments, +}; + +export { createGrowthSsoTrial }; + +const cloudCommands = [ + deployProject, + link, + login, + logout, + linkEnvironment, + listProjects, + listEnvironments, +]; + +async function initCloudCLIConfig() { + const localConfig = await getLocalConfig(); + + if (!localConfig.installId) { + localConfig.installId = crypto.randomUUID(); + } + + await saveLocalConfig(localConfig); +} + +export async function buildStrapiCloudCommands({ + command, + ctx, + argv, +}: { + command: Command; + ctx: CLIContext; + argv: string[]; +}) { + await initCloudCLIConfig(); + // Load all commands + for (const cloudCommand of cloudCommands) { + try { + // Add this command to the Commander command object + const subCommand = await cloudCommand.command({ command, ctx, argv }); + + if (subCommand) { + command.addCommand(subCommand); + } + } catch (e) { + console.error(`Failed to load command ${cloudCommand.name}`, e); + } + } +} + +export * as services from './services'; + +export * from './types'; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/link/action.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/link/action.ts new file mode 100644 index 0000000..705449f --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/link/action.ts @@ -0,0 +1,208 @@ +import inquirer from 'inquirer'; +import chalk from 'chalk'; + +import type { Answers } from 'inquirer'; +import type { CLIContext } from '../types'; +import type { CloudApiService } from '../services/cli-api'; + +import { LocalSave } from '../services/strapi-info-save'; +import { cloudApiFactory, tokenServiceFactory, local } from '../services'; +import { promptLogin } from '../login/action'; +import { trackEvent } from '../utils/analytics'; +import { getLocalConfig } from '../utils/get-local-config'; + +const QUIT_OPTION = 'Quit'; + +interface LinkProjectValue { + name: string; + displayName: string; +} + +interface LinkProjectAnswer extends Answers { + linkProject: LinkProjectValue; +} + +interface LinkProjectInput extends Answers { + linkProject: LinkProjectValue | string; +} + +type ProjectsList = { + name: string; + value: { + name: string; + displayName: string; + }; +}[]; + +type Project = { + name: string; + displayName: string; + isMaintainer: boolean; +}; + +async function promptForRelink( + ctx: CLIContext, + cloudApiService: CloudApiService, + existingConfig: LocalSave | null +) { + if (existingConfig && existingConfig.project) { + const { shouldRelink } = await inquirer.prompt([ + { + type: 'confirm', + name: 'shouldRelink', + message: `A project named ${chalk.cyan( + existingConfig.project.displayName + ? existingConfig.project.displayName + : existingConfig.project.name + )} is already linked to this local folder. Do you want to update the link?`, + default: false, + }, + ]); + + if (!shouldRelink) { + await trackEvent(ctx, cloudApiService, 'didNotLinkProject', { + currentProjectName: existingConfig.project?.name, + }); + return false; + } + } + + return true; +} + +async function getProjectsList( + ctx: CLIContext, + cloudApiService: CloudApiService, + existingConfig: LocalSave | null +) { + const spinner = ctx.logger.spinner('Fetching your projects...\n').start(); + + try { + const { + data: { data: projectList }, + } = await cloudApiService.listLinkProjects(); + spinner.succeed(); + + if (!Array.isArray(projectList)) { + ctx.logger.log("We couldn't find any projects available for linking in Strapi Cloud."); + return null; + } + const projects: ProjectsList = (projectList as unknown as Project[]) + .filter( + (project: Project) => + !(project.isMaintainer || project.name === existingConfig?.project?.name) + ) + .map((project: Project) => { + return { + name: project.displayName, + value: { name: project.name, displayName: project.displayName }, + }; + }); + if (projects.length === 0) { + ctx.logger.log("We couldn't find any projects available for linking in Strapi Cloud."); + return null; + } + return projects; + } catch (e) { + spinner.fail('An error occurred while fetching your projects from Strapi Cloud.'); + ctx.logger.debug('Failed to list projects', e); + return null; + } +} + +async function getUserSelection( + ctx: CLIContext, + projects: ProjectsList +): Promise { + const { logger } = ctx; + try { + const answer: LinkProjectInput = await inquirer.prompt([ + { + type: 'list', + name: 'linkProject', + message: 'Which project do you want to link?', + choices: [...projects, { name: chalk.grey(`(${QUIT_OPTION})`), value: null }], + }, + ]); + + if (!answer.linkProject) { + return null; + } + + return answer as LinkProjectAnswer; + } catch (e) { + logger.debug('Failed to get user input', e); + logger.error('An error occurred while trying to get your input.'); + return null; + } +} + +export default async (ctx: CLIContext) => { + const { getValidToken } = await tokenServiceFactory(ctx); + const token = await getValidToken(ctx, promptLogin); + const { logger } = ctx; + + if (!token) { + return; + } + + const cloudApiService = await cloudApiFactory(ctx, token); + + const existingConfig: LocalSave | null = await getLocalConfig(ctx); + const shouldRelink = await promptForRelink(ctx, cloudApiService, existingConfig); + + if (!shouldRelink) { + return; + } + await trackEvent(ctx, cloudApiService, 'willLinkProject', {}); + + const projects: ProjectsList | null | undefined = await getProjectsList( + ctx, + cloudApiService, + existingConfig + ); + + if (!projects) { + return; + } + + const answer: LinkProjectAnswer | null = await getUserSelection(ctx, projects); + + if (!answer) { + return; + } + + try { + const { confirmAction } = await inquirer.prompt([ + { + type: 'confirm', + name: 'confirmAction', + message: + 'Warning: Once linked, deploying from CLI will replace the existing project and its data. Confirm to proceed:', + default: false, + }, + ]); + + if (!confirmAction) { + await trackEvent(ctx, cloudApiService, 'didNotLinkProject', { + cancelledProjectName: answer.linkProject.name, + currentProjectName: existingConfig ? existingConfig.project?.name : null, + }); + return; + } + + await local.save({ project: answer.linkProject }); + logger.log( + ` You have successfully linked your project to ${chalk.cyan(answer.linkProject.displayName)}. You are now able to deploy your project.` + ); + await trackEvent(ctx, cloudApiService, 'didLinkProject', { + projectInternalName: answer.linkProject, + }); + } catch (e) { + logger.debug('Failed to link project', e); + logger.error('An error occurred while linking the project.'); + await trackEvent(ctx, cloudApiService, 'didNotLinkProject', { + projectInternalName: answer.linkProject, + }); + } +}; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/link/command.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/link/command.ts new file mode 100644 index 0000000..6ae21f5 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/link/command.ts @@ -0,0 +1,18 @@ +import { type StrapiCloudCommand } from '../types'; +import { runAction } from '../utils/helpers'; +import action from './action'; + +/** + * `$ link local directory to project of the cloud` + */ +const command: StrapiCloudCommand = ({ command, ctx }) => { + command + .command('cloud:link') + .alias('link') + .description('Link a local directory to a Strapi Cloud project') + .option('-d, --debug', 'Enable debugging mode with verbose logs') + .option('-s, --silent', "Don't log anything") + .action(() => runAction('link', action)(ctx)); +}; + +export default command; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/link/index.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/link/index.ts new file mode 100644 index 0000000..dd77bfd --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/link/index.ts @@ -0,0 +1,12 @@ +import action from './action'; +import command from './command'; +import type { StrapiCloudCommandInfo } from '../types'; + +export { action, command }; + +export default { + name: 'link-project', + description: 'Link a local directory to a Strapi Cloud project', + action, + command, +} as StrapiCloudCommandInfo; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/list-projects/action.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/list-projects/action.ts new file mode 100644 index 0000000..d496c12 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/list-projects/action.ts @@ -0,0 +1,27 @@ +import type { CLIContext } from '../types'; +import { cloudApiFactory, tokenServiceFactory } from '../services'; +import { promptLogin } from '../login/action'; + +export default async (ctx: CLIContext) => { + const { getValidToken } = await tokenServiceFactory(ctx); + const token = await getValidToken(ctx, promptLogin); + const { logger } = ctx; + + if (!token) { + return; + } + + const cloudApiService = await cloudApiFactory(ctx, token); + const spinner = logger.spinner('Fetching your projects...').start(); + + try { + const { + data: { data: projectList }, + } = await cloudApiService.listProjects(); + spinner.succeed(); + logger.log(projectList); + } catch (e) { + ctx.logger.debug('Failed to list projects', e); + spinner.fail('An error occurred while fetching your projects from Strapi Cloud.'); + } +}; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/list-projects/command.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/list-projects/command.ts new file mode 100644 index 0000000..3c32e0c --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/list-projects/command.ts @@ -0,0 +1,18 @@ +import { type StrapiCloudCommand } from '../types'; +import { runAction } from '../utils/helpers'; +import action from './action'; + +/** + * `$ list project from the cloud` + */ +const command: StrapiCloudCommand = ({ command, ctx }) => { + command + .command('cloud:projects') + .alias('projects') + .description('List Strapi Cloud projects') + .option('-d, --debug', 'Enable debugging mode with verbose logs') + .option('-s, --silent', "Don't log anything") + .action(() => runAction('projects', action)(ctx)); +}; + +export default command; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/list-projects/index.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/list-projects/index.ts new file mode 100644 index 0000000..e1f9f5b --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/list-projects/index.ts @@ -0,0 +1,12 @@ +import action from './action'; +import command from './command'; +import type { StrapiCloudCommandInfo } from '../types'; + +export { action, command }; + +export default { + name: 'list-projects', + description: 'List Strapi Cloud projects', + action, + command, +} as StrapiCloudCommandInfo; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/login/action.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/login/action.ts new file mode 100644 index 0000000..4f688b4 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/login/action.ts @@ -0,0 +1,207 @@ +import axios, { AxiosResponse, AxiosError } from 'axios'; +import chalk from 'chalk'; +import inquirer from 'inquirer'; +import { tokenServiceFactory, cloudApiFactory } from '../services'; +import type { CloudCliConfig, CLIContext } from '../types'; +import { apiConfig } from '../config/api'; +import { trackEvent } from '../utils/analytics'; +import { setContext } from '../services/context'; + +const openModule = import('open'); + +export async function promptLogin(ctx: CLIContext) { + const response = await inquirer.prompt([ + { + type: 'confirm', + name: 'login', + message: 'Would you like to login?', + }, + ]); + + if (response.login) { + const loginSuccessful = await loginAction(ctx); + return loginSuccessful; + } + return false; +} + +export default async function loginAction( + ctx: CLIContext, + { showDashboardLink = true }: { showDashboardLink?: boolean } = {} +): Promise { + const { logger, promptExperiment } = ctx; + const tokenService = await tokenServiceFactory(ctx); + const existingToken = await tokenService.retrieveToken(); + const cloudApiService = await cloudApiFactory(ctx, existingToken || undefined); + + if (existingToken) { + const isTokenValid = await tokenService.isTokenValid(existingToken); + if (isTokenValid) { + try { + const userInfo = await cloudApiService.getUserInfo(); + const { email } = userInfo.data.data; + setContext({ ...ctx, user: userInfo.data.data }); + if (email) { + logger.log(`You are already logged into your account (${email}).`); + } else { + logger.log('You are already logged in.'); + } + if (showDashboardLink) { + logger.log( + 'To access your dashboard, please copy and paste the following URL into your web browser:' + ); + logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`)); + } + return true; + } catch (e) { + logger.debug('Failed to fetch user info', e); + } + } + } + + let cliConfig: CloudCliConfig; + try { + logger.info('🔌 Connecting...'); + const config = await cloudApiService.config(); + cliConfig = config.data; + } catch (e: unknown) { + logger.error('🥲 Oops! Something went wrong while logging you in. Please try again.'); + logger.debug(e); + return false; + } + await trackEvent(ctx, cloudApiService, 'willLoginAttempt', { + ...(promptExperiment && { promptExperiment }), + }); + + logger.debug('🔐 Creating device authentication request...', { + client_id: cliConfig.clientId, + scope: cliConfig.scope, + audience: cliConfig.audience, + }); + const deviceAuthResponse = (await axios + .post(cliConfig.deviceCodeAuthUrl, { + client_id: cliConfig.clientId, + scope: cliConfig.scope, + audience: cliConfig.audience, + }) + .catch((e: AxiosError) => { + logger.error('There was an issue with the authentication process. Please try again.'); + if (e.message) { + logger.debug(e.message, e); + } else { + logger.debug(e); + } + })) as AxiosResponse; + + openModule.then((open) => { + open.default(deviceAuthResponse.data.verification_uri_complete).catch((e: Error) => { + logger.error('We encountered an issue opening the browser. Please try again later.'); + logger.debug(e.message, e); + }); + }); + + logger.log('If a browser tab does not open automatically, please follow the next steps:'); + logger.log( + `1. Open this url in your device: ${deviceAuthResponse.data.verification_uri_complete}` + ); + logger.log( + `2. Enter the following code: ${deviceAuthResponse.data.user_code} and confirm to login.\n` + ); + + const tokenPayload = { + grant_type: 'urn:ietf:params:oauth:grant-type:device_code', + device_code: deviceAuthResponse.data.device_code, + client_id: cliConfig.clientId, + }; + + let isAuthenticated = false; + + const authenticate = async () => { + const spinner = logger.spinner('Waiting for authentication'); + spinner.start(); + const spinnerFail = () => spinner.fail('Authentication failed!'); + + while (!isAuthenticated) { + try { + const tokenResponse = await axios.post(cliConfig.tokenUrl, tokenPayload); + const authTokenData = tokenResponse.data; + + if (tokenResponse.status === 200) { + // Token validation + try { + logger.debug('🔐 Validating token...'); + await tokenService.validateToken(authTokenData.id_token, cliConfig.jwksUrl); + logger.debug('🔐 Token validation successful!'); + } catch (e: any) { + logger.debug(e); + spinnerFail(); + throw new Error('Unable to proceed: Token validation failed'); + } + + logger.debug('🔍 Fetching user information...'); + const cloudApiServiceWithToken = await cloudApiFactory(ctx, authTokenData.access_token); + // Call to get user info to create the user in DB if not exists + await cloudApiServiceWithToken.getUserInfo(); + logger.debug('🔍 User information fetched successfully!'); + + try { + logger.debug('📝 Saving login information...'); + await tokenService.saveToken(authTokenData.access_token); + logger.debug('📝 Login information saved successfully!'); + isAuthenticated = true; + } catch (e) { + logger.error( + 'There was a problem saving your login information. Please try logging in again.' + ); + logger.debug(e); + spinnerFail(); + return false; + } + } + } catch (e: any) { + if (e.message === 'Unable to proceed: Token validation failed') { + logger.error( + 'There seems to be a problem with your login information. Please try logging in again.' + ); + spinnerFail(); + await trackEvent(ctx, cloudApiService, 'didNotLogin', { + loginMethod: 'cli', + ...(promptExperiment && { promptExperiment }), + }); + return false; + } + if ( + e.response?.data.error && + !['authorization_pending', 'slow_down'].includes(e!.response.data.error) + ) { + logger.debug(e); + spinnerFail(); + await trackEvent(ctx, cloudApiService, 'didNotLogin', { + loginMethod: 'cli', + ...(promptExperiment && { promptExperiment }), + }); + return false; + } + // Await interval before retrying + await new Promise((resolve) => { + setTimeout(resolve, deviceAuthResponse.data.interval * 1000); + }); + } + } + spinner.succeed('Authentication successful!'); + if (showDashboardLink) { + logger.log('You are now logged into Strapi Cloud.'); + logger.log( + 'To access your dashboard, please copy and paste the following URL into your web browser:' + ); + logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`)); + } + await trackEvent(ctx, cloudApiService, 'didLogin', { + loginMethod: 'cli', + ...(promptExperiment && { promptExperiment }), + }); + }; + + await authenticate(); + return isAuthenticated; +} diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/login/command.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/login/command.ts new file mode 100644 index 0000000..fab1a54 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/login/command.ts @@ -0,0 +1,22 @@ +import { createCommand } from 'commander'; +import type { StrapiCloudCommand } from '../types'; +import { runAction } from '../utils/helpers'; +import action from './action'; + +/** + * `$ cloud device flow login` + */ +const command: StrapiCloudCommand = ({ ctx }) => { + return createCommand('cloud:login') + .alias('login') + .description('Strapi Cloud Login') + .addHelpText( + 'after', + '\nAfter running this command, you will be prompted to enter your authentication information.' + ) + .option('-d, --debug', 'Enable debugging mode with verbose logs') + .option('-s, --silent', "Don't log anything") + .action(() => runAction('login', action)(ctx)); +}; + +export default command; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/login/index.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/login/index.ts new file mode 100644 index 0000000..ee2c466 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/login/index.ts @@ -0,0 +1,12 @@ +import action from './action'; +import command from './command'; +import type { StrapiCloudCommandInfo } from '../types'; + +export { action, command }; + +export default { + name: 'login', + description: 'Strapi Cloud Login', + action, + command, +} as StrapiCloudCommandInfo; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/logout/action.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/logout/action.ts new file mode 100644 index 0000000..c37cbe8 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/logout/action.ts @@ -0,0 +1,45 @@ +import type { CLIContext } from '../types'; +import { tokenServiceFactory, cloudApiFactory } from '../services'; +import { trackEvent } from '../utils/analytics'; + +const openModule = import('open'); + +export default async (ctx: CLIContext) => { + const { logger } = ctx; + const { retrieveToken, eraseToken } = await tokenServiceFactory(ctx); + + const token = await retrieveToken(); + if (!token) { + logger.log("You're already logged out."); + return; + } + const cloudApiService = await cloudApiFactory(ctx, token); + const config = await cloudApiService.config(); + const cliConfig = config.data; + + try { + await eraseToken(); + + openModule.then((open) => { + open + .default( + `${cliConfig.baseUrl}/oidc/logout?client_id=${encodeURIComponent( + cliConfig.clientId + )}&logout_hint=${encodeURIComponent(token)} + ` + ) + .catch((e: Error) => { + // Failing to open the logout URL is not a critical error, so we just log it + logger.debug(e.message, e); + }); + }); + + logger.log( + '🔌 You have been logged out from the CLI. If you are on a shared computer, please make sure to log out from the Strapi Cloud Dashboard as well.' + ); + } catch (e) { + logger.error('🥲 Oops! Something went wrong while logging you out. Please try again.'); + logger.debug(e); + } + await trackEvent(ctx, cloudApiService, 'didLogout', { loginMethod: 'cli' }); +}; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/logout/command.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/logout/command.ts new file mode 100644 index 0000000..33576fc --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/logout/command.ts @@ -0,0 +1,18 @@ +import { createCommand } from 'commander'; +import type { StrapiCloudCommand } from '../types'; +import { runAction } from '../utils/helpers'; +import action from './action'; + +/** + * `$ cloud device flow logout` + */ +const command: StrapiCloudCommand = ({ ctx }) => { + return createCommand('cloud:logout') + .alias('logout') + .description('Strapi Cloud Logout') + .option('-d, --debug', 'Enable debugging mode with verbose logs') + .option('-s, --silent', "Don't log anything") + .action(() => runAction('logout', action)(ctx)); +}; + +export default command; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/logout/index.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/logout/index.ts new file mode 100644 index 0000000..7030870 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/logout/index.ts @@ -0,0 +1,11 @@ +import action from './action'; +import command from './command'; + +export { action, command }; + +export default { + name: 'logout', + description: 'Strapi Cloud Logout', + action, + command, +}; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/services/build-logs.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/services/build-logs.ts new file mode 100644 index 0000000..c465c3a --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/services/build-logs.ts @@ -0,0 +1,78 @@ +import EventSource from 'eventsource'; +import { CLIContext, type CloudCliConfig } from '../types'; + +const buildLogsServiceFactory = ({ logger }: CLIContext) => { + return async (url: string, token: string, cliConfig: CloudCliConfig) => { + const CONN_TIMEOUT = Number(cliConfig.buildLogsConnectionTimeout); + const MAX_RETRIES = Number(cliConfig.buildLogsMaxRetries); + + return new Promise((resolve, reject) => { + let timeoutId: NodeJS.Timeout | null = null; + let retries = 0; + + const connect = (url: string) => { + const logsSpinner = logger.spinner('Connecting to the server to get build logs\n').start(); + logsSpinner.indent = 1; + const es = new EventSource(`${url}`, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + + const clearExistingTimeout = () => { + if (timeoutId) { + clearTimeout(timeoutId); + } + }; + + const resetTimeout = () => { + clearExistingTimeout(); + timeoutId = setTimeout(() => { + if (logsSpinner.isSpinning) { + logsSpinner.fail( + 'We were unable to connect to the server to get build logs at this time. This could be due to a temporary issue.' + ); + } + es.close(); + reject(new Error('Connection timed out')); + }, CONN_TIMEOUT); + }; + + es.onopen = resetTimeout; + + es.addEventListener('finished', (event) => { + const data = JSON.parse(event.data); + logger.log(data.msg); + es.close(); + clearExistingTimeout(); + resolve(null); + }); + + es.addEventListener('log', (event) => { + if (logsSpinner.isSpinning) { + logsSpinner.succeed(); + } + resetTimeout(); + const data = JSON.parse(event.data); + logger.log(data.msg); + }); + + es.onerror = async () => { + retries += 1; + if (retries > MAX_RETRIES) { + logsSpinner.fail( + 'We were unable to connect to the server to get build logs at this time.' + ); + es.close(); + clearExistingTimeout(); // Important to clear the event loop from remaining timeout - avoid to wait for nothing while the timeout is running + reject(new Error('Max retries reached')); + } + }; + }; + + connect(url); + }); + }; +}; + +export { buildLogsServiceFactory }; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/services/cli-api.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/services/cli-api.ts new file mode 100644 index 0000000..6bb9dbe --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/services/cli-api.ts @@ -0,0 +1,321 @@ +import axios, { type AxiosResponse } from 'axios'; +import fse from 'fs-extra'; +import os from 'os'; +import { apiConfig } from '../config/api'; +import type { CLIContext, CloudCliConfig, TrackPayload } from '../types'; +import { getLocalConfig } from '../config/local'; + +import packageJson from '../../package.json'; +import { getContext } from './context'; + +export const VERSION = 'v3'; + +export type ProjectInfo = { + id: string; + name: string; + targetEnvironment?: string; + displayName?: string; + nodeVersion?: string; + region?: string; + plan?: string; + url?: string; +}; + +export type EnvironmentInfo = Record; + +export type EnvironmentDetails = { + name: string; + hasLiveDeployment: boolean; + hasPendingDeployment: boolean; +}; + +export type ProjectInput = Omit; + +export type DeployResponse = { + build_id: string; + image: string; +}; + +export type ListProjectsResponse = { + data: { + data: string; + }; +}; + +export type ListEnvironmentsResponse = { + data: { + data: EnvironmentInfo[] | Record; + }; +}; + +export type ListLinkProjectsResponse = { + data: { + data: ProjectInfo[] | Record; + }; +}; + +export type ListLinkEnvironmentsResponse = { + data: { + data: EnvironmentDetails[] | Record; + }; +}; + +export type GetProjectResponse = { + data: { + displayName: string; + updatedAt: string; + suspendedAt?: string; + isTrial: boolean; + environments: string[]; + environmentsDetails: EnvironmentDetails[]; + }; + metadata: { + dashboardUrls: { + project: string; + deployments: string; + }; + }; +}; + +export type CreateTrialResponse = { + licenseKey: string; +}; + +export type CreateProjectResponse = { + name: string; + environmentInternalName: string; + url?: string; +}; + +export interface CloudApiService { + deploy( + deployInput: { + filePath: string; + project: { name: string; targetEnvironment?: string }; + }, + { + onUploadProgress, + }: { + onUploadProgress: (progressEvent: { loaded: number; total?: number }) => void; + } + ): Promise>; + + createProject(createProjectInput: ProjectInput): Promise<{ + data: CreateProjectResponse; + status: number; + }>; + + getUserInfo(): Promise; + + config(): Promise>; + + listProjects(): Promise>; + + listLinkProjects(): Promise>; + + listEnvironments(project: { name: string }): Promise>; + + listLinkEnvironments(project: { + name: string; + }): Promise>; + + getProject(project: { name: string }): Promise>; + + createTrial(createTrialInput: { + strapiVersion: string; + }): Promise>; + + track(event: string, payload?: TrackPayload): Promise>; +} + +export async function cloudApiFactory( + { logger }: { logger: CLIContext['logger'] }, + token?: string +): Promise { + const localConfig = await getLocalConfig(); + const customHeaders = { + 'x-device-id': localConfig.installId, + 'x-app-version': packageJson.version, + 'x-os-name': os.type(), + 'x-os-version': os.version(), + 'x-language': Intl.DateTimeFormat().resolvedOptions().locale, + 'x-node-version': process.versions.node, + }; + const axiosCloudAPI = axios.create({ + baseURL: `${apiConfig.apiBaseUrl}/${VERSION}`, + headers: { + 'Content-Type': 'application/json', + ...customHeaders, + }, + }); + + if (token) { + axiosCloudAPI.defaults.headers.Authorization = `Bearer ${token}`; + } + + return { + deploy({ filePath, project }, { onUploadProgress }) { + return axiosCloudAPI.post( + `/deploy/${project.name}`, + { file: fse.createReadStream(filePath), targetEnvironment: project.targetEnvironment }, + { + headers: { + 'Content-Type': 'multipart/form-data', + }, + onUploadProgress, + } + ); + }, + + async createProject({ name, nodeVersion, region, plan }) { + const response = await axiosCloudAPI.post('/project', { + projectName: name, + region, + nodeVersion, + plan, + }); + + return { + data: { + id: response.data.id, + name: response.data.name, + environmentInternalName: response.data.environmentInternalName, + }, + status: response.status, + }; + }, + + getUserInfo() { + return axiosCloudAPI.get('/user'); + }, + + async config(): Promise> { + try { + const response = await axiosCloudAPI.get('/config'); + + if (response.status !== 200) { + throw new Error('Error fetching cloud CLI config from the server.'); + } + + return response; + } catch (error) { + logger.debug( + "🥲 Oops! Couldn't retrieve the cloud CLI config from the server. Please try again." + ); + + throw error; + } + }, + + async listProjects(): Promise> { + try { + const response = await axiosCloudAPI.get('/projects'); + + if (response.status !== 200) { + throw new Error('Error fetching cloud projects from the server.'); + } + + return response; + } catch (error) { + logger.debug( + "🥲 Oops! Couldn't retrieve your project's list from the server. Please try again." + ); + throw error; + } + }, + + async listLinkProjects(): Promise> { + try { + const response = await axiosCloudAPI.get('/projects-linkable'); + + if (response.status !== 200) { + throw new Error('Error fetching cloud projects from the server.'); + } + + return response; + } catch (error) { + logger.debug( + "🥲 Oops! Couldn't retrieve your project's list from the server. Please try again." + ); + throw error; + } + }, + + async listEnvironments({ name }): Promise> { + try { + const response = await axiosCloudAPI.get(`/projects/${name}/environments`); + + if (response.status !== 200) { + throw new Error('Error fetching cloud environments from the server.'); + } + + return response; + } catch (error) { + logger.debug( + "🥲 Oops! Couldn't retrieve your project's environments from the server. Please try again." + ); + throw error; + } + }, + + async listLinkEnvironments({ name }): Promise> { + try { + const response = await axiosCloudAPI.get(`/projects/${name}/environments-linkable`); + + if (response.status !== 200) { + throw new Error('Error fetching cloud environments from the server.'); + } + + return response; + } catch (error) { + logger.debug( + "🥲 Oops! Couldn't retrieve your project's environments from the server. Please try again." + ); + throw error; + } + }, + + async getProject({ name }): Promise> { + try { + const response = await axiosCloudAPI.get(`/projects/${name}`); + + if (response.status !== 200) { + throw new Error("Error fetching project's details."); + } + + return response; + } catch (error) { + logger.debug( + "🥲 Oops! There was a problem retrieving your project's details. Please try again." + ); + throw error; + } + }, + + async createTrial({ strapiVersion }): Promise> { + try { + const response = await axiosCloudAPI.post(`/cms-trial-request`, { strapiVersion }); + + if (response.status !== 200) { + throw new Error('Error creating trial.'); + } + + return response; + } catch (error) { + logger.debug('🥲 Oops! There was a problem creating your trial. Please try again.'); + throw error; + } + }, + + track(event, payload = {}) { + const ctx = getContext(); + if (ctx?.user?.id) { + axiosCloudAPI.defaults.headers['x-user-id'] = ctx.user.id; + } + return axiosCloudAPI.post('/track', { + event, + payload, + }); + }, + }; +} diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/services/context.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/services/context.ts new file mode 100644 index 0000000..42a20d7 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/services/context.ts @@ -0,0 +1,13 @@ +// This file will manage the CLI context state. + +import { CLIContext } from '../types'; + +let ctx: CLIContext; + +export function setContext(newCtx: CLIContext): void { + ctx = newCtx; +} + +export function getContext(): CLIContext { + return ctx; +} diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/services/index.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/services/index.ts new file mode 100644 index 0000000..24e9edc --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/services/index.ts @@ -0,0 +1,4 @@ +export { cloudApiFactory } from './cli-api'; +export * as local from './strapi-info-save'; +export { tokenServiceFactory } from './token'; +export { createLogger } from './logger'; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/services/logger.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/services/logger.ts new file mode 100644 index 0000000..25d459c --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/services/logger.ts @@ -0,0 +1,168 @@ +import chalk from 'chalk'; +import stringify from 'fast-safe-stringify'; + +import ora from 'ora'; +import * as cliProgress from 'cli-progress'; + +export interface LoggerOptions { + silent?: boolean; + debug?: boolean; + timestamp?: boolean; +} + +export interface Logger { + warnings: number; + errors: number; + debug: (...args: unknown[]) => void; + info: (...args: unknown[]) => void; + success: (...args: unknown[]) => void; + warn: (...args: unknown[]) => void; + error: (...args: unknown[]) => void; + log: (...args: unknown[]) => void; + spinner: (text: string) => Pick; + progressBar: ( + totalSize: number, + text: string + ) => Pick; +} + +const stringifyArg = (arg: unknown) => { + return typeof arg === 'object' ? stringify(arg) : arg; +}; + +const createLogger = (options: LoggerOptions = {}): Logger => { + const { silent = false, debug = false, timestamp = true } = options; + + const state = { errors: 0, warning: 0 }; + + return { + get warnings() { + return state.warning; + }, + + get errors() { + return state.errors; + }, + + async debug(...args) { + if (silent || !debug) { + return; + } + + console.log( + chalk.cyan(`[DEBUG]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), + ...args.map(stringifyArg) + ); + }, + + info(...args) { + if (silent) { + return; + } + + console.info( + chalk.blue(`[INFO]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), + ...args.map(stringifyArg) + ); + }, + + log(...args) { + if (silent) { + return; + } + + console.info( + chalk.blue(`${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), + ...args.map(stringifyArg) + ); + }, + + success(...args) { + if (silent) { + return; + } + + console.info( + chalk.green(`[SUCCESS]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), + ...args.map(stringifyArg) + ); + }, + + warn(...args) { + state.warning += 1; + + if (silent) { + return; + } + + console.warn( + chalk.yellow(`[WARN]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), + ...args.map(stringifyArg) + ); + }, + + error(...args) { + state.errors += 1; + + if (silent) { + return; + } + + console.error( + chalk.red(`[ERROR]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), + ...args.map(stringifyArg) + ); + }, + + // @ts-expect-error – returning a subpart of ora is fine because the types tell us what is what. + spinner(text: string) { + if (silent) { + return { + succeed() { + return this; + }, + fail() { + return this; + }, + start() { + return this; + }, + text: '', + isSpinning: false, + }; + } + + return ora(text); + }, + + progressBar(totalSize: number, text: string) { + if (silent) { + return { + start() { + return this; + }, + stop() { + return this; + }, + update() { + return this; + }, + }; + } + + const progressBar = new cliProgress.SingleBar({ + format: `${text ? `${text} |` : ''}${chalk.green('{bar}')}| {percentage}%`, + barCompleteChar: '\u2588', + barIncompleteChar: '\u2591', + hideCursor: true, + forceRedraw: true, + }); + + progressBar.start(totalSize, 0); + + return progressBar; + }, + }; +}; + +export { createLogger }; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/services/notification.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/services/notification.ts new file mode 100644 index 0000000..335531e --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/services/notification.ts @@ -0,0 +1,104 @@ +import EventSource from 'eventsource'; +import EventEmitter from 'node:events'; +import type { CLIContext, CloudCliConfig } from '../types'; + +type Event = { + type: string; + data: string; + lastEventId: string; + origin: string; +}; + +type DeploymentNotificationData = { + event: + | 'deploymentFailed' + | 'deploymentCompleted' + | 'environmentCreationFailed' + | 'environmentCreationCompleted'; + userId: string; + projectName: string; + environmentName: string; + createdAt: string; + message?: string; +}; + +export function notificationServiceFactory({ logger }: CLIContext) { + return (url: string, token: string, cliConfig: CloudCliConfig) => { + const CONN_TIMEOUT = Number(cliConfig.notificationsConnectionTimeout); + const eventEmitter = new EventEmitter(); + + const es = new EventSource(url, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + let timeoutId: NodeJS.Timeout; + + const resetTimeout = () => { + clearTimeout(timeoutId); + timeoutId = setTimeout(() => { + logger.log( + 'We were unable to connect to the server at this time. This could be due to a temporary issue. Please try again in a moment.' + ); + es.close(); + eventEmitter.emit('connectionTimedOut'); + }, CONN_TIMEOUT); // 5 minutes + }; + + es.onopen = () => { + resetTimeout(); + }; + es.onmessage = (event: Event) => { + resetTimeout(); + if (!event.data) { + return; + } + const data: DeploymentNotificationData = JSON.parse(event.data); + + if (data.message) { + logger.log(data.message); + } + + // Close connection when a specific event is received + if ( + data.event === 'deploymentCompleted' || + data.event === 'deploymentFailed' || + data.event === 'environmentCreationFailed' || + data.event === 'environmentCreationCompleted' + ) { + clearTimeout(timeoutId); + es.close(); + } + eventEmitter.emit(data.event, data); + }; + + const waitForEnvironmentCreation = (environmentName: string) => { + return new Promise((resolve, reject) => { + eventEmitter.on('environmentCreationCompleted', (data: DeploymentNotificationData) => { + if (data.environmentName !== environmentName) { + return; + } + resolve('Environment created successfully'); + eventEmitter.removeAllListeners('environmentCreationCompleted'); + }); + eventEmitter.on('environmentCreationFailed', (data: DeploymentNotificationData) => { + if (data.environmentName !== environmentName) { + return; + } + reject(new Error(`Environment creation failed`, { cause: 'EnvironmentCreationFailed' })); + eventEmitter.removeAllListeners('environmentCreationFailed'); + }); + + eventEmitter.on('connectionTimedOut', () => { + reject(new Error('Connection timed out')); + }); + }); + }; + const close = () => { + clearTimeout(timeoutId); + es.close(); + eventEmitter.removeAllListeners(); + }; + return { waitForEnvironmentCreation, close }; + }; +} diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/services/strapi-info-save.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/services/strapi-info-save.ts new file mode 100644 index 0000000..35fa78e --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/services/strapi-info-save.ts @@ -0,0 +1,61 @@ +import fse from 'fs-extra'; +import path from 'path'; +import { merge } from 'lodash'; +import type { ProjectInfo } from './cli-api'; + +export const LOCAL_SAVE_FILENAME = '.strapi-cloud.json'; + +export type LocalSave = { + project?: Omit; +}; + +// Utility type for making all properties optional recursively +type DeepPartial = { + [P in keyof T]?: T[P] extends object ? DeepPartial : T[P]; +}; + +export type LocalPatch = { + project?: DeepPartial>; +}; + +const getFilePath = (directoryPath?: string): string => + path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME); + +export async function save(data: LocalSave, { directoryPath }: { directoryPath?: string } = {}) { + const pathToFile = getFilePath(directoryPath); + // Ensure the directory exists and creates it if not + await fse.ensureDir(path.dirname(pathToFile)); + await fse.writeJson(pathToFile, data, { encoding: 'utf8' }); +} + +export async function retrieve({ + directoryPath, +}: { directoryPath?: string } = {}): Promise { + const pathToFile = getFilePath(directoryPath); + const pathExists = await fse.pathExists(pathToFile); + if (!pathExists) { + return {}; + } + return fse.readJSON(pathToFile, { encoding: 'utf8' }); +} + +export async function patch( + patchData: LocalPatch, + { directoryPath }: { directoryPath?: string } = {} +) { + const pathToFile = getFilePath(directoryPath); + const existingData = await retrieve({ directoryPath }); + if (!existingData) { + throw new Error('No configuration data found to patch.'); + } + const newData = merge(existingData, patchData); + await fse.writeJson(pathToFile, newData, { encoding: 'utf8' }); +} + +export async function deleteConfig({ directoryPath }: { directoryPath?: string } = {}) { + const pathToFile = getFilePath(directoryPath); + const pathExists = await fse.pathExists(pathToFile); + if (pathExists) { + await fse.remove(pathToFile); + } +} diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/services/token.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/services/token.ts new file mode 100644 index 0000000..6c9de60 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/services/token.ts @@ -0,0 +1,153 @@ +import jwksClient, { type JwksClient, type SigningKey } from 'jwks-rsa'; +import type { JwtHeader, VerifyErrors } from 'jsonwebtoken'; +import jwt from 'jsonwebtoken'; +import { getLocalConfig, saveLocalConfig } from '../config/local'; +import type { CloudCliConfig, CLIContext } from '../types'; +import { cloudApiFactory } from './cli-api'; + +let cliConfig: CloudCliConfig; + +interface DecodedToken { + [key: string]: any; +} + +export async function tokenServiceFactory({ logger }: { logger: CLIContext['logger'] }) { + const cloudApiService = await cloudApiFactory({ logger }); + + async function saveToken(str: string) { + const appConfig = await getLocalConfig(); + + if (!appConfig) { + logger.error('There was a problem saving your token. Please try again.'); + return; + } + + appConfig.token = str; + + try { + await saveLocalConfig(appConfig); + } catch (e: Error | unknown) { + logger.debug(e); + logger.error('There was a problem saving your token. Please try again.'); + } + } + + async function retrieveToken() { + const appConfig = await getLocalConfig(); + if (appConfig.token) { + // check if token is still valid + if (await isTokenValid(appConfig.token)) { + return appConfig.token; + } + } + return undefined; + } + + async function validateToken(idToken: string, jwksUrl: string): Promise { + const client: JwksClient = jwksClient({ + jwksUri: jwksUrl, + }); + + // Get the Key from the JWKS using the token header's Key ID (kid) + const getKey = (header: JwtHeader, callback: (e: Error | null, key?: string) => void) => { + client.getSigningKey(header.kid, (e: Error | null, key?: SigningKey) => { + if (e) { + callback(e); + } else if (key) { + const publicKey = 'publicKey' in key ? key.publicKey : key.rsaPublicKey; + callback(null, publicKey); + } else { + callback(new Error('Key not found')); + } + }); + }; + + const decodedToken = jwt.decode(idToken, { complete: true }) as DecodedToken; + if (!decodedToken) { + if (typeof idToken === 'undefined' || idToken === '') { + logger.warn('You need to be logged in to use this feature. Please log in and try again.'); + } else { + logger.error( + 'There seems to be a problem with your login information. Please try logging in again.' + ); + } + return Promise.reject(new Error('Invalid token')); + } + + // Verify the JWT token signature using the JWKS Key + return new Promise((resolve, reject) => { + jwt.verify(idToken, getKey, (err: VerifyErrors | null) => { + if (err) { + reject(err); + } + if (decodedToken.payload.exp < Math.floor(Date.now() / 1000)) { + reject(new Error('Token is expired')); + } + resolve(); + }); + }); + } + + async function isTokenValid(token: string) { + try { + const config = await cloudApiService.config(); + + cliConfig = config.data; + if (token) { + await validateToken(token, cliConfig.jwksUrl); + return true; + } + return false; + } catch (e) { + logger.debug(e); + return false; + } + } + + async function eraseToken() { + const appConfig = await getLocalConfig(); + if (!appConfig) { + return; + } + + delete appConfig.token; + + try { + await saveLocalConfig(appConfig); + } catch (e: Error | unknown) { + logger.debug(e); + logger.error( + 'There was an issue removing your login information. Please try logging out again.' + ); + throw e; + } + } + + async function getValidToken( + ctx: CLIContext, + loginAction: (ctx: CLIContext) => Promise + ) { + let token = await retrieveToken(); + + while (!token || !(await isTokenValid(token))) { + logger.log( + token + ? 'Oops! Your token seems expired or invalid. Please login again.' + : "We couldn't find a valid token. You need to be logged in to use this feature." + ); + if (!(await loginAction(ctx))) return null; + token = await retrieveToken(); + } + + return token; + } + + return { + saveToken, + retrieveToken, + validateToken, + isTokenValid, + eraseToken, + getValidToken, + }; +} diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/types.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/types.ts new file mode 100644 index 0000000..32684fd --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/types.ts @@ -0,0 +1,83 @@ +import type { Command } from 'commander'; +import type { DistinctQuestion } from 'inquirer'; +import { Logger } from './services/logger'; + +export type ProjectAnswers = { + name: string; + nodeVersion: string; + region: string; + plan: string; +}; + +type BoxedErrorMessage = { + firstLine: string; + secondLine: string; +}; + +export type CloudCliConfig = { + clientId: string; + baseUrl: string; + deviceCodeAuthUrl: string; + audience: string; + scope: string; + tokenUrl: string; + jwksUrl: string; + projectCreation: { + questions: ReadonlyArray>; + defaults: Partial; + introText: string; + userChoice?: object; + reference?: string; + errors: { + environmentCreationFailed: BoxedErrorMessage; + }; + }; + projectDeployment: { + confirmationText: string; + errors: { + environmentNotReady: BoxedErrorMessage; + }; + }; + buildLogsConnectionTimeout: string; + buildLogsMaxRetries: string; + notificationsConnectionTimeout: string; + maxProjectFileSize: string; + featureFlags: { + cloudLoginPromptEnabled: boolean; + growthSsoTrialEnabled: boolean; + asyncProjectCreationEnabled: boolean; + }; +}; + +export interface CLIContext { + cwd: string; + logger: Logger; + promptExperiment?: string; + user?: User; +} + +export type User = { + id: string; +}; + +export type StrapiCloudCommand = (params: { + command: Command; + argv: string[]; + ctx: CLIContext; +}) => void | Command | Promise; + +export type StrapiCloudNamespaceCommand = (params: { + command: Command; +}) => void | Command | Promise; + +export type StrapiCloudCommandInfo = { + name: string; + description: string; + command: StrapiCloudCommand; + action: (ctx: CLIContext, options?: Record) => Promise; +}; + +export type TrackPayload = Record; + +// eslint-disable-next-line import/no-cycle +export type * from './services/cli-api'; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/utils/__tests__/compress-files.test.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/utils/__tests__/compress-files.test.ts new file mode 100644 index 0000000..3023e72 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/utils/__tests__/compress-files.test.ts @@ -0,0 +1,37 @@ +import path from 'path'; +import os from 'os'; +import { isIgnoredFile } from '../compress-files'; + +describe('isIgnoredFile', () => { + const folderPath = os.tmpdir(); // We are using the system's directory path for simulating a real path + it('should correctly handle various ignore patterns', () => { + const allFiles = [ + path.join(folderPath, 'file1.txt'), + path.join(folderPath, 'file2.txt'), + path.join(folderPath, 'node_modules', 'file3.js'), + path.join(folderPath, '.git', 'file4.js'), + path.join(folderPath, 'dist', 'file5.js'), + path.join(folderPath, 'public', 'uploads', '.gitkeep'), + path.join(folderPath, 'src', 'secret', 'file6.js'), + path.join(folderPath, 'src', 'secret', 'keep.me'), + path.join(folderPath, 'test', 'file7.test.ts'), + ]; + const ignorePatterns = [ + '**/node_modules/**', + '**/.git/**', + '**/dist/**', + '!public/uploads/.gitkeep', + '!**/*.test.ts', + '**/src/secret/**', + '!**/src/secret/keep.me', + ]; + const result = allFiles.filter((file) => !isIgnoredFile(folderPath, file, ignorePatterns)); + expect(result).toEqual([ + path.join(folderPath, 'file1.txt'), + path.join(folderPath, 'file2.txt'), + path.join(folderPath, 'public', 'uploads', '.gitkeep'), + path.join(folderPath, 'src', 'secret', 'keep.me'), + path.join(folderPath, 'test', 'file7.test.ts'), + ]); + }); +}); diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/utils/analytics.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/utils/analytics.ts new file mode 100644 index 0000000..57f3c75 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/utils/analytics.ts @@ -0,0 +1,16 @@ +import type { CLIContext, CloudApiService, TrackPayload } from '../types'; + +const trackEvent = async ( + ctx: CLIContext, + cloudApiService: CloudApiService, + eventName: string, + eventData: TrackPayload +) => { + try { + await cloudApiService.track(eventName, eventData); + } catch (e) { + ctx.logger.debug(`Failed to track ${eventName}`, e); + } +}; + +export { trackEvent }; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/utils/compress-files.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/utils/compress-files.ts new file mode 100644 index 0000000..d4e4fd0 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/utils/compress-files.ts @@ -0,0 +1,96 @@ +import * as fse from 'fs-extra'; +import * as tar from 'tar'; +import * as path from 'path'; +import { minimatch } from 'minimatch'; + +const IGNORED_PATTERNS = [ + '**/.git/**', + '**/node_modules/**', + '**/build/**', + '**/data/uploads/**', + '**/dist/**', + '**/.cache/**', + '**/.circleci/**', + '**/.github/**', + '**/.gitignore', + '**/.gitkeep', + '**/.gitlab-ci.yml', + '**/.idea/**', + '**/public/uploads/**', + '**/.vscode/**', +]; + +const isIgnoredFile = (folderPath: string, file: string, ignorePatterns: string[]): boolean => { + ignorePatterns.push(...IGNORED_PATTERNS); + const relativeFilePath = path.join(folderPath, file); + let isIgnored = false; + for (const pattern of ignorePatterns) { + if (pattern.startsWith('!')) { + if (minimatch(relativeFilePath, pattern.slice(1), { matchBase: true, dot: true })) { + return false; + } + } else if (minimatch(relativeFilePath, pattern, { matchBase: true, dot: true })) { + if (path.basename(file) !== '.gitkeep') { + isIgnored = true; + } + } + } + return isIgnored; +}; + +const getFiles = async ( + dirPath: string, + ignorePatterns: string[] = [], + subfolder: string = '' +): Promise => { + const arrayOfFiles: string[] = []; + const entries = await fse.readdir(path.join(dirPath, subfolder)); + + for (const entry of entries) { + const entryPathFromRoot = path.join(subfolder, entry); + const entryPath = path.relative(dirPath, entryPathFromRoot); + const isIgnored = isIgnoredFile(dirPath, entryPathFromRoot, ignorePatterns); + + if (!isIgnored) { + if (fse.statSync(entryPath).isDirectory()) { + const subFiles = await getFiles(dirPath, ignorePatterns, entryPathFromRoot); + arrayOfFiles.push(...subFiles); + } else { + arrayOfFiles.push(entryPath); + } + } + } + return arrayOfFiles; +}; + +const readGitignore = async (folderPath: string): Promise => { + const gitignorePath = path.resolve(folderPath, '.gitignore'); + const pathExist = await fse.pathExists(gitignorePath); + + if (!pathExist) return []; + + const gitignoreContent = await fse.readFile(gitignorePath, 'utf8'); + + return gitignoreContent + .split(/\r?\n/) + .filter((line) => Boolean(line.trim()) && !line.startsWith('#')); +}; + +const compressFilesToTar = async ( + storagePath: string, + folderToCompress: string, + filename: string +): Promise => { + const ignorePatterns = await readGitignore(folderToCompress); + const filesToCompress = await getFiles(folderToCompress, ignorePatterns); + + return tar.c( + { + gzip: true, + file: path.resolve(storagePath, filename), + }, + filesToCompress + ); +}; + +export { compressFilesToTar, isIgnoredFile }; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/utils/error-message-factories.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/utils/error-message-factories.ts new file mode 100644 index 0000000..5087649 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/utils/error-message-factories.ts @@ -0,0 +1,32 @@ +import chalk from 'chalk'; +import boxen from 'boxen'; +import { apiConfig } from '../config/api'; + +type EnvironmentErrorMessage = { + projectName: string; + firstLine: string; + secondLine: string; +}; + +export const environmentErrorMessageFactory = ({ + projectName, + firstLine, + secondLine, +}: EnvironmentErrorMessage) => { + return [ + chalk.yellow(firstLine), + '', + chalk.cyan(secondLine), + chalk.blue(' → ') + + chalk.blue.underline(`${apiConfig.dashboardBaseUrl}/projects/${projectName}`), + ].join('\n'); +}; + +export const environmentCreationErrorFactory = (environmentErrorMessage: string) => + boxen(environmentErrorMessage, { + padding: 1, + margin: 1, + borderStyle: 'round', + borderColor: 'white', + titleAlignment: 'left', + }); diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/utils/get-local-config.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/utils/get-local-config.ts new file mode 100644 index 0000000..df28bbe --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/utils/get-local-config.ts @@ -0,0 +1,30 @@ +import chalk from 'chalk'; +import type { CLIContext } from '../types'; +import { local } from '../services'; +import { LocalSave } from '../services/strapi-info-save'; + +async function getLocalConfig(ctx: CLIContext): Promise { + try { + return await local.retrieve(); + } catch (e) { + ctx.logger.debug('Failed to get project config', e); + ctx.logger.error('An error occurred while retrieving config data from your local project.'); + return null; + } +} + +async function getLocalProject(ctx: CLIContext) { + const localConfig = await getLocalConfig(ctx); + + if (!localConfig || !localConfig.project) { + ctx.logger.warn( + `\nWe couldn't find a valid local project config.\nPlease link your local project to an existing Strapi Cloud project using the ${chalk.cyan( + 'link' + )} command.` + ); + process.exit(1); + } + return localConfig.project; +} + +export { getLocalConfig, getLocalProject }; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/utils/helpers.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/utils/helpers.ts new file mode 100644 index 0000000..2fb4042 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/utils/helpers.ts @@ -0,0 +1,45 @@ +import chalk from 'chalk'; +import { has } from 'lodash/fp'; + +// TODO: Remove duplicated code by extracting to a shared package + +const assertCwdContainsStrapiProject = (name: string) => { + const logErrorAndExit = () => { + console.log( + `You need to run ${chalk.yellow( + `strapi ${name}` + )} in a Strapi project. Make sure you are in the right directory.` + ); + process.exit(1); + }; + + try { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const pkgJSON = require(`${process.cwd()}/package.json`); + if ( + !has('dependencies.@strapi/strapi', pkgJSON) && + !has('devDependencies.@strapi/strapi', pkgJSON) + ) { + logErrorAndExit(); + } + } catch (err) { + logErrorAndExit(); + } +}; + +const runAction = + (name: string, action: (...args: any[]) => Promise) => + (...args: unknown[]) => { + assertCwdContainsStrapiProject(name); + + Promise.resolve() + .then(() => { + return action(...args); + }) + .catch((error) => { + console.error(error); + process.exit(1); + }); + }; + +export { runAction }; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/utils/pkg.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/utils/pkg.ts new file mode 100644 index 0000000..1bdddc8 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/utils/pkg.ts @@ -0,0 +1,128 @@ +import * as fse from 'fs-extra'; +import os from 'os'; +import pkgUp from 'pkg-up'; +import * as yup from 'yup'; +import chalk from 'chalk'; +import { Logger } from '../services/logger'; + +interface Export { + types?: string; + source: string; + module?: string; + import?: string; + require?: string; + default: string; +} + +const packageJsonSchema = yup.object({ + name: yup.string().required(), + exports: yup.lazy((value) => + yup + .object( + typeof value === 'object' + ? Object.entries(value).reduce( + (acc, [key, value]) => { + if (typeof value === 'object') { + acc[key] = yup + .object({ + types: yup.string().optional(), + source: yup.string().required(), + module: yup.string().optional(), + import: yup.string().required(), + require: yup.string().required(), + default: yup.string().required(), + }) + .noUnknown(true); + } else { + acc[key] = yup + .string() + .matches(/^\.\/.*\.json$/) + .required(); + } + + return acc; + }, + {} as Record | yup.SchemaOf> + ) + : undefined + ) + .optional() + ), +}); + +type PackageJson = yup.Asserts; + +/** + * @description being a task to load the package.json starting from the current working directory + * using a shallow find for the package.json and `fs` to read the file. If no package.json is found, + * the process will throw with an appropriate error message. + */ +const loadPkg = async ({ cwd, logger }: { cwd: string; logger: Logger }): Promise => { + const pkgPath = await pkgUp({ cwd }); + + if (!pkgPath) { + throw new Error('Could not find a package.json in the current directory'); + } + + const buffer = await fse.readFile(pkgPath); + + const pkg = JSON.parse(buffer.toString()); + + logger.debug('Loaded package.json:', os.EOL, pkg); + + return pkg; +}; + +/** + * @description validate the package.json against a standardised schema using `yup`. + * If the validation fails, the process will throw with an appropriate error message. + */ +const validatePkg = async ({ pkg }: { pkg: object }): Promise => { + try { + return await packageJsonSchema.validate(pkg, { + strict: true, + }); + } catch (err) { + if (err instanceof yup.ValidationError) { + switch (err.type) { + case 'required': + if (err.path) { + throw new Error( + `'${err.path}' in 'package.json' is required as type '${chalk.magenta( + yup.reach(packageJsonSchema, err.path).type + )}'` + ); + } + break; + /** + * This will only be thrown if there are keys in the export map + * that we don't expect so we can therefore make some assumptions + */ + case 'noUnknown': + if (err.path && err.params && 'unknown' in err.params) { + throw new Error( + `'${err.path}' in 'package.json' contains the unknown key ${chalk.magenta( + err.params.unknown + )}, for compatability only the following keys are allowed: ${chalk.magenta( + "['types', 'source', 'import', 'require', 'default']" + )}` + ); + } + break; + default: + if (err.path && err.params && 'type' in err.params && 'value' in err.params) { + throw new Error( + `'${err.path}' in 'package.json' must be of type '${chalk.magenta( + err.params.type + )}' (recieved '${chalk.magenta(typeof err.params.value)}')` + ); + } + } + } + + throw err; + } +}; + +export type { PackageJson, Export }; +export { loadPkg, validatePkg }; diff --git a/Dockers/strapi/strapi/packages/cli/cloud/src/utils/tests/compress-files.test.ts b/Dockers/strapi/strapi/packages/cli/cloud/src/utils/tests/compress-files.test.ts new file mode 100644 index 0000000..3023e72 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/src/utils/tests/compress-files.test.ts @@ -0,0 +1,37 @@ +import path from 'path'; +import os from 'os'; +import { isIgnoredFile } from '../compress-files'; + +describe('isIgnoredFile', () => { + const folderPath = os.tmpdir(); // We are using the system's directory path for simulating a real path + it('should correctly handle various ignore patterns', () => { + const allFiles = [ + path.join(folderPath, 'file1.txt'), + path.join(folderPath, 'file2.txt'), + path.join(folderPath, 'node_modules', 'file3.js'), + path.join(folderPath, '.git', 'file4.js'), + path.join(folderPath, 'dist', 'file5.js'), + path.join(folderPath, 'public', 'uploads', '.gitkeep'), + path.join(folderPath, 'src', 'secret', 'file6.js'), + path.join(folderPath, 'src', 'secret', 'keep.me'), + path.join(folderPath, 'test', 'file7.test.ts'), + ]; + const ignorePatterns = [ + '**/node_modules/**', + '**/.git/**', + '**/dist/**', + '!public/uploads/.gitkeep', + '!**/*.test.ts', + '**/src/secret/**', + '!**/src/secret/keep.me', + ]; + const result = allFiles.filter((file) => !isIgnoredFile(folderPath, file, ignorePatterns)); + expect(result).toEqual([ + path.join(folderPath, 'file1.txt'), + path.join(folderPath, 'file2.txt'), + path.join(folderPath, 'public', 'uploads', '.gitkeep'), + path.join(folderPath, 'src', 'secret', 'keep.me'), + path.join(folderPath, 'test', 'file7.test.ts'), + ]); + }); +}); diff --git a/Dockers/strapi/strapi/packages/cli/cloud/tsconfig.build.json b/Dockers/strapi/strapi/packages/cli/cloud/tsconfig.build.json new file mode 100644 index 0000000..cd43505 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src"], + "exclude": ["node_modules", "**/__tests__/**"] +} diff --git a/Dockers/strapi/strapi/packages/cli/cloud/tsconfig.eslint.json b/Dockers/strapi/strapi/packages/cli/cloud/tsconfig.eslint.json new file mode 100644 index 0000000..fc8520e --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/tsconfig.eslint.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.json" +} diff --git a/Dockers/strapi/strapi/packages/cli/cloud/tsconfig.json b/Dockers/strapi/strapi/packages/cli/cloud/tsconfig.json new file mode 100644 index 0000000..f9cbaa8 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/cloud/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "tsconfig/base.json", + "include": ["src"], + "exclude": ["node_modules"] +} diff --git a/Dockers/strapi/strapi/packages/cli/create-strapi-app/.eslintignore b/Dockers/strapi/strapi/packages/cli/create-strapi-app/.eslintignore new file mode 100644 index 0000000..90233bf --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/create-strapi-app/.eslintignore @@ -0,0 +1,6 @@ +node_modules/ +.eslintrc.js +dist/ +bin/ +templates/ +rollup.config.mjs diff --git a/Dockers/strapi/strapi/packages/cli/create-strapi-app/.eslintrc.js b/Dockers/strapi/strapi/packages/cli/create-strapi-app/.eslintrc.js new file mode 100644 index 0000000..a165f57 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/create-strapi-app/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom/back/typescript'], +}; diff --git a/Dockers/strapi/strapi/packages/cli/create-strapi-app/LICENSE b/Dockers/strapi/strapi/packages/cli/create-strapi-app/LICENSE new file mode 100644 index 0000000..d82875f --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/create-strapi-app/LICENSE @@ -0,0 +1,37 @@ +Copyright (c) 2015-present Strapi Solutions SAS + +Portions of the Strapi software are licensed as follows: + +* All software that resides under an "ee/" directory (the “EE Software”), if that directory exists, is licensed under the license defined below. + +Enterprise License + +If you or the company you represent has entered into a written agreement referencing the Enterprise Edition of the Strapi source code available at +https://github.com/strapi/strapi, then such agreement applies to your use of the Enterprise Edition of the Strapi Software. If you or the company you +represent is using the Enterprise Edition of the Strapi Software in connection with a subscription to our cloud offering, then the agreement you have +agreed to with respect to our cloud offering and the licenses included in such agreement apply to your use of the Enterprise Edition of the Strapi Software. +Otherwise, the Strapi Enterprise Software License Agreement (found here https://strapi.io/enterprise-terms) applies to your use of the Enterprise Edition of the Strapi Software. + +BY ACCESSING OR USING THE ENTERPRISE EDITION OF THE STRAPI SOFTWARE, YOU ARE AGREEING TO BE BOUND BY THE RELEVANT REFERENCED AGREEMENT. +IF YOU ARE NOT AUTHORIZED TO ACCEPT THESE TERMS ON BEHALF OF THE COMPANY YOU REPRESENT OR IF YOU DO NOT AGREE TO ALL OF THE RELEVANT TERMS AND CONDITIONS REFERENCED AND YOU +HAVE NOT OTHERWISE EXECUTED A WRITTEN AGREEMENT WITH STRAPI, YOU ARE NOT AUTHORIZED TO ACCESS OR USE OR ALLOW ANY USER TO ACCESS OR USE ANY PART OF +THE ENTERPRISE EDITION OF THE STRAPI SOFTWARE. YOUR ACCESS RIGHTS ARE CONDITIONAL ON YOUR CONSENT TO THE RELEVANT REFERENCED TERMS TO THE EXCLUSION OF ALL OTHER TERMS; +IF THE RELEVANT REFERENCED TERMS ARE CONSIDERED AN OFFER BY YOU, ACCEPTANCE IS EXPRESSLY LIMITED TO THE RELEVANT REFERENCED TERMS. + +* All software outside of the above-mentioned directories or restrictions above is available under the "MIT Expat" license as set forth below. + +MIT Expat License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Dockers/strapi/strapi/packages/cli/create-strapi-app/README.md b/Dockers/strapi/strapi/packages/cli/create-strapi-app/README.md new file mode 100644 index 0000000..24c85c4 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/create-strapi-app/README.md @@ -0,0 +1,35 @@ +# Create strapi app + +This package includes the `create-strapi-app` CLI to make the creation of a strapi project lighter. + +## How to use + +### Quick usage (recommended) + +Using yarn create command + +``` +yarn create strapi-app my-project +``` + +Using npx + +``` +npx create-strapi-app my-project +``` + +### Manual install + +Using yarn + +``` +yarn global add create-strapi-app +create-strapi-app my-app +``` + +Using npm + +``` +npm install -g create-strapi-app +create-strapi-app my-app +``` diff --git a/Dockers/strapi/strapi/packages/cli/create-strapi-app/bin/index.js b/Dockers/strapi/strapi/packages/cli/create-strapi-app/bin/index.js new file mode 100755 index 0000000..6ea4a7a --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/create-strapi-app/bin/index.js @@ -0,0 +1,26 @@ +#!/usr/bin/env node + +'use strict'; + +const { run } = require('../dist/index.js'); +const readline = require('readline'); + +if (process.platform === 'win32') { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }); + + rl.on('SIGINT', function sigint() { + process.emit('SIGINT'); + }); +} + +process.on('SIGINT', () => { + process.exit(1); +}); + +run(process.argv).then( + () => process.exit(0), + () => process.exit(1) +); diff --git a/Dockers/strapi/strapi/packages/cli/create-strapi-app/package.json b/Dockers/strapi/strapi/packages/cli/create-strapi-app/package.json new file mode 100644 index 0000000..c3a9d62 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/create-strapi-app/package.json @@ -0,0 +1,79 @@ +{ + "name": "create-strapi-app", + "version": "5.24.1", + "description": "Generate a new Strapi application.", + "keywords": [ + "create-strapi-app", + "create", + "new", + "generate", + "strapi" + ], + "homepage": "https://strapi.io", + "bugs": { + "url": "https://github.com/strapi/strapi/issues" + }, + "repository": { + "type": "git", + "url": "git://github.com/strapi/strapi.git" + }, + "license": "SEE LICENSE IN LICENSE", + "author": { + "name": "Strapi Solutions SAS", + "email": "hi@strapi.io", + "url": "https://strapi.io" + }, + "maintainers": [ + { + "name": "Strapi Solutions SAS", + "email": "hi@strapi.io", + "url": "https://strapi.io" + } + ], + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "source": "./src/index.ts", + "types": "./dist/src/index.d.ts", + "bin": "./bin/index.js", + "files": [ + "dist/", + "bin/", + "templates/" + ], + "scripts": { + "build": "run -T npm-run-all clean --parallel build:code build:types", + "build:code": "run -T rollup -c", + "build:types": "run -T tsc -p tsconfig.build.json --emitDeclarationOnly", + "clean": "run -T rimraf ./dist", + "lint": "run -T eslint .", + "test:ts": "run -T tsc --noEmit", + "watch": "run -T rollup -c -w" + }, + "dependencies": { + "@strapi/cloud-cli": "5.24.1", + "async-retry": "1.3.3", + "chalk": "4.1.2", + "commander": "8.3.0", + "execa": "5.1.1", + "fs-extra": "11.2.0", + "inquirer": "8.2.5", + "lodash": "4.17.21", + "node-machine-id": "^1.1.10", + "ora": "^5.4.1", + "rollup": "4.19.1", + "semver": "7.5.4", + "sort-package-json": "2.10.0", + "tar": "7.4.3" + }, + "devDependencies": { + "@types/async-retry": "^1", + "@types/fs-extra": "11.0.4", + "@types/inquirer": "8.2.5", + "eslint-config-custom": "5.24.1", + "tsconfig": "5.24.1" + }, + "engines": { + "node": ">=18.0.0 <=22.x.x", + "npm": ">=6.0.0" + } +} diff --git a/Dockers/strapi/strapi/packages/cli/create-strapi-app/rollup.config.mjs b/Dockers/strapi/strapi/packages/cli/create-strapi-app/rollup.config.mjs new file mode 100644 index 0000000..880e54d --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/create-strapi-app/rollup.config.mjs @@ -0,0 +1,6 @@ +import { baseConfig } from '../../../rollup.utils.mjs'; + +export default baseConfig({ + input: './src/index.ts', + rootDir: './dist', +}); diff --git a/Dockers/strapi/strapi/packages/cli/create-strapi-app/src/cloud.ts b/Dockers/strapi/strapi/packages/cli/create-strapi-app/src/cloud.ts new file mode 100644 index 0000000..46b3310 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/create-strapi-app/src/cloud.ts @@ -0,0 +1,89 @@ +import inquirer from 'inquirer'; +import { cli as cloudCli, services as cloudServices } from '@strapi/cloud-cli'; +import parseToChalk from './utils/parse-to-chalk'; + +interface CloudError { + response: { + status: number; + data: string | object; + }; +} + +function assertCloudError(e: unknown): asserts e is CloudError { + if ((e as CloudError).response === undefined) { + throw Error('Expected CloudError'); + } +} + +export async function handleCloudLogin(): Promise { + const logger = cloudServices.createLogger({ + silent: false, + debug: process.argv.includes('--debug'), + timestamp: false, + }); + const cloudApiService = await cloudServices.cloudApiFactory({ logger }); + const defaultErrorMessage = + 'An error occurred while trying to interact with Strapi servers. Use strapi deploy command once the project is generated.'; + + let cloudApiConfig; + try { + const { data: config } = await cloudApiService.config(); + cloudApiConfig = config; + + if (!config?.featureFlags?.cloudLoginPromptEnabled) { + return false; + } + + logger.log(parseToChalk(config.projectCreation.introText)); + } catch (e: unknown) { + logger.debug(e); + logger.error(defaultErrorMessage); + return false; + } + const { userChoice } = await inquirer.prompt<{ userChoice: string }>( + cloudApiConfig.projectCreation?.userChoice || [ + { + type: 'list', + name: 'userChoice', + message: `Please log in or sign up.`, + choices: ['Login/Sign up', 'Skip'], + }, + ] + ); + + if (!userChoice.toLowerCase().includes('skip')) { + const cliContext = { + user: { id: '' }, // This will be set later when the user logs in + logger, + cwd: process.cwd(), + ...(cloudApiConfig.projectCreation?.reference && { + promptExperiment: cloudApiConfig.projectCreation?.reference, + }), + }; + + try { + await cloudCli.login.action(cliContext, { showDashboardLink: false }); + } catch (e: Error | CloudError | unknown) { + logger.debug(e); + try { + assertCloudError(e); + if (e.response.status === 403) { + const message = + typeof e.response.data === 'string' + ? e.response.data + : 'We are sorry, but we are not able to log you into Strapi servers at the moment.'; + logger.warn(message); + return false; + } + } catch (e) { + /* empty */ + } + logger.error(defaultErrorMessage); + return false; + } + + return true; + } + + return false; +} diff --git a/Dockers/strapi/strapi/packages/cli/create-strapi-app/src/create-strapi.ts b/Dockers/strapi/strapi/packages/cli/create-strapi-app/src/create-strapi.ts new file mode 100644 index 0000000..b0762fa --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/create-strapi-app/src/create-strapi.ts @@ -0,0 +1,289 @@ +import { join } from 'node:path'; + +import chalk from 'chalk'; +import execa from 'execa'; +import fse from 'fs-extra'; + +import { createGrowthSsoTrial } from '@strapi/cloud-cli'; + +import { copyTemplate } from './utils/template'; +import { tryGitInit } from './utils/git'; +import { trackUsage } from './utils/usage'; +import { createPackageJSON } from './utils/package-json'; +import { generateDotEnv } from './utils/dot-env'; +import { isStderrError } from './types'; + +import type { Scope } from './types'; +import { logger } from './utils/logger'; +import { gitIgnore } from './utils/gitignore'; +import { getInstallArgs } from './utils/get-package-manager-args'; + +async function createStrapi(scope: Scope) { + const { rootPath } = scope; + try { + await fse.ensureDir(rootPath); + await createApp(scope); + } catch (error) { + await fse.remove(rootPath); + + throw error; + } +} + +async function createApp(scope: Scope) { + const { + rootPath, + useTypescript, + useExample, + installDependencies, + isQuickstart, + template, + packageManager, + gitInit, + runApp, + isABTestEnabled, + } = scope; + + const shouldRunSeed = useExample && installDependencies; + + await trackUsage({ event: 'willCreateProject', scope }); + + logger.title('Strapi', `Creating a new application at ${chalk.green(rootPath)}`); + + if (!isQuickstart) { + await trackUsage({ event: 'didChooseCustomDatabase', scope }); + } else { + await trackUsage({ event: 'didChooseQuickstart', scope }); + } + + if (!template) { + let templateName = useExample ? 'example' : 'vanilla'; + + if (!useTypescript) { + templateName = `${templateName}-js`; + } + + const internalTemplatePath = join(__dirname, '../templates', templateName); + if (await fse.exists(internalTemplatePath)) { + await fse.copy(internalTemplatePath, rootPath); + } + } else { + try { + logger.info(`${chalk.cyan('Installing template')} ${template}`); + + await copyTemplate(scope, rootPath); + + logger.success('Template copied successfully.'); + } catch (error) { + if (error instanceof Error) { + logger.fatal(`Template installation failed: ${error.message}`); + } + + throw error; + } + + if (!fse.existsSync(join(rootPath, 'package.json'))) { + logger.fatal(`Missing ${chalk.bold('package.json')} in template`); + } + } + + await trackUsage({ event: 'didCopyProjectFiles', scope }); + + try { + await createPackageJSON(scope); + + await trackUsage({ event: 'didWritePackageJSON', scope }); + + // ensure node_modules is created + await fse.ensureDir(join(rootPath, 'node_modules')); + + // create config/database + await fse.writeFile(join(rootPath, '.env'), generateDotEnv(scope)); + + await trackUsage({ event: 'didCopyConfigurationFiles', scope }); + } catch (err) { + await fse.remove(rootPath); + throw err; + } + + // Create and save a growth sso trial license + if (scope.shouldCreateGrowthSsoTrial) { + try { + const data = await createGrowthSsoTrial({ strapiVersion: scope.strapiVersion }); + + if (data?.license) { + fse.writeFile(join(rootPath, 'license.txt'), data.license); + logger.log('Your 30 days trial will be applied automatically to your project. Enjoy!'); + } + } catch (error) { + logger.error('Error while trying to create your trial. Please try again later.'); + } + } + + if (installDependencies) { + try { + logger.title('deps', `Installing dependencies with ${chalk.cyan(packageManager)}`); + + await trackUsage({ event: 'willInstallProjectDependencies', scope }); + + await runInstall(scope); + + await trackUsage({ event: 'didInstallProjectDependencies', scope }); + + logger.success(`Dependencies installed`); + } catch (error) { + const stderr = isStderrError(error) ? error.stderr : ''; + + await trackUsage({ + event: 'didNotInstallProjectDependencies', + scope, + error: stderr.slice(-1024), + }); + + logger.fatal([ + chalk.bold( + 'Oh, it seems that you encountered an error while installing dependencies in your project' + ), + '', + `Don't give up, your project was created correctly`, + '', + `Fix the issues mentioned in the installation errors and try to run the following command:`, + '', + `cd ${chalk.green(rootPath)} && ${chalk.cyan(packageManager)} install`, + ]); + } + } + + await trackUsage({ event: 'didCreateProject', scope }); + + // make sure a gitignore file is created regardless of the user using git or not + if (!(await fse.exists(join(rootPath, '.gitignore')))) { + await fse.writeFile(join(rootPath, '.gitignore'), gitIgnore); + } + + // Init git + if (gitInit) { + logger.title('git', 'Initializing git repository.'); + + await tryGitInit(rootPath); + + logger.success('Initialized a git repository.'); + } + + if (shouldRunSeed) { + if (await fse.exists(join(rootPath, 'scripts/seed.js'))) { + logger.title('Seed', 'Seeding your database with sample data'); + + try { + await execa(packageManager, ['run', 'seed:example'], { + stdio: 'inherit', + cwd: rootPath, + }); + logger.success('Sample data added to your database'); + } catch (error) { + logger.error('Failed to seed your database. Skipping'); + } + } + } + + const cmd = chalk.cyan(`${packageManager} run`); + + logger.title('Strapi', `Your application was created!`); + + logger.log([ + 'Available commands in your project:', + '', + 'Start Strapi in watch mode. (Changes in Strapi project files will trigger a server restart)', + `${cmd} develop`, + '', + 'Start Strapi without watch mode.', + `${cmd} start`, + '', + 'Build Strapi admin panel.', + `${cmd} build`, + '', + 'Deploy Strapi project.', + `${cmd} deploy`, + '', + ]); + + if (useExample) { + logger.log(['Seed your database with sample data.', `${cmd} seed:example`, '']); + } + + logger.log(['Display all available commands.', `${cmd} strapi\n`]); + + if (installDependencies) { + logger.log([ + 'To get started run', + '', + `${chalk.cyan('cd')} ${rootPath}`, + !shouldRunSeed && useExample ? `${cmd} seed:example && ${cmd} develop` : `${cmd} develop`, + ]); + } else { + logger.log([ + 'To get started run', + '', + `${chalk.cyan('cd')} ${rootPath}`, + `${chalk.cyan(packageManager)} install`, + !shouldRunSeed && useExample ? `${cmd} seed:example && ${cmd} develop` : `${cmd} develop`, + ]); + } + + if (runApp && installDependencies) { + logger.title('Run', 'Running your Strapi application'); + + try { + await trackUsage({ event: 'willStartServer', scope }); + + await execa(packageManager, ['run', 'develop'], { + stdio: 'inherit', + cwd: rootPath, + env: { + FORCE_COLOR: '1', + }, + }); + } catch (error) { + if (typeof error === 'string' || error instanceof Error) { + await trackUsage({ + event: 'didNotStartServer', + scope, + error, + }); + } + + logger.fatal('Failed to start your Strapi application'); + } + } + + if (isABTestEnabled) { + await trackUsage({ event: 'didEnableABTest', scope }); + } +} + +async function runInstall({ rootPath, packageManager }: Scope) { + // include same cwd and env to ensure version check returns same version we use below + const { envArgs, cmdArgs } = await getInstallArgs(packageManager, { + cwd: rootPath, + env: { + ...process.env, + NODE_ENV: 'development', + }, + }); + + const options: execa.Options = { + cwd: rootPath, + stdio: 'inherit', + env: { + ...process.env, + ...envArgs, + NODE_ENV: 'development', + }, + }; + + const proc = execa(packageManager, cmdArgs, options); + + return proc; +} + +export { createStrapi }; diff --git a/Dockers/strapi/strapi/packages/cli/create-strapi-app/src/index.ts b/Dockers/strapi/strapi/packages/cli/create-strapi-app/src/index.ts new file mode 100644 index 0000000..5e327d3 --- /dev/null +++ b/Dockers/strapi/strapi/packages/cli/create-strapi-app/src/index.ts @@ -0,0 +1,255 @@ +import { join, basename } from 'node:path'; +import os from 'node:os'; +import chalk from 'chalk'; +import commander from 'commander'; +import crypto from 'crypto'; +import fse from 'fs-extra'; + +import * as prompts from './prompts'; +import { handleCloudLogin } from './cloud'; +import { createStrapi } from './create-strapi'; +import { checkNodeRequirements } from './utils/check-requirements'; +import { checkInstallPath } from './utils/check-install-path'; +import { installID } from './utils/install-id'; +import { trackError } from './utils/usage'; +import { addDatabaseDependencies, getDatabaseInfos } from './utils/database'; + +import type { Options, Scope } from './types'; +import { logger } from './utils/logger'; + +const { version } = fse.readJSONSync(join(__dirname, '..', 'package.json')); + +const command = new commander.Command('create-strapi-app') + .version(version) + .arguments('[directory]') + .usage('[directory] [options]') + .option('--quickstart', 'Quickstart app creation (deprecated)') + .option('--no-run', 'Do not start the application after it is created.') + + // setup options + .option('--ts, --typescript', 'Initialize the project with TypeScript (default)') + .option('--js, --javascript', 'Initialize the project with Javascript') + + // Package manager options + .option('--use-npm', 'Use npm as the project package manager') + .option('--use-yarn', 'Use yarn as the project package manager') + .option('--use-pnpm', 'Use pnpm as the project package manager') + + // dependencies options + .option('--install', 'Install dependencies') + .option('--no-install', 'Do not install dependencies') + + // Cloud options + .option('--skip-cloud', 'Skip cloud login and project creation') + + // Example app + .option('--example', 'Use an example app') + .option('--no-example', 'Do not use an example app') + + // git options + .option('--git-init', 'Initialize a git repository') + .option('--no-git-init', 'Do no initialize a git repository') + + // Database options + .option('--dbclient ', 'Database client') + .option('--dbhost ', 'Database host') + .option('--dbport ', 'Database port') + .option('--dbname ', 'Database name') + .option('--dbusername ', 'Database username') + .option('--dbpassword ', 'Database password') + .option('--dbssl ', 'Database SSL') + .option('--dbfile ', 'Database file path for sqlite') + .option('--skip-db', 'Skip database configuration') + + .option('--template