diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..0ef035d
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,22 @@
+version: 2
+updates:
+ - package-ecosystem: 'npm'
+ directory: '/'
+ schedule:
+ interval: 'weekly'
+ day: 'saturday'
+ versioning-strategy: 'increase'
+ labels:
+ - 'dependencies'
+ open-pull-requests-limit: 5
+ pull-request-branch-name:
+ separator: '-'
+ commit-message:
+ # cause a release for non-dev-deps
+ prefix: fix(deps)
+ # no release for dev-deps
+ prefix-development: chore(dev-deps)
+ ignore:
+ - dependency-name: '@salesforce/dev-scripts'
+ - dependency-name: '*'
+ update-types: ['version-update:semver-major']
diff --git a/.github/workflows/automerge.yml b/.github/workflows/automerge.yml
new file mode 100644
index 0000000..796eafa
--- /dev/null
+++ b/.github/workflows/automerge.yml
@@ -0,0 +1,10 @@
+name: automerge
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '17 2,5,8,11 * * *'
+
+jobs:
+ automerge:
+ uses: oclif/github-workflows/.github/workflows/automerge.yml@main
+ secrets: inherit
diff --git a/.github/workflows/failureNotifications.yml b/.github/workflows/failureNotifications.yml
new file mode 100644
index 0000000..6b4118f
--- /dev/null
+++ b/.github/workflows/failureNotifications.yml
@@ -0,0 +1,43 @@
+name: failureNotifications
+
+on:
+ workflow_run:
+ workflows:
+ - version, tag and github release
+ - publish
+ types:
+ - completed
+
+jobs:
+ failure-notify:
+ runs-on: ubuntu-latest
+ if: ${{ github.event.workflow_run.conclusion == 'failure' }}
+ steps:
+ - name: Announce Failure
+ id: slack
+ uses: slackapi/slack-github-action@v1.21.0
+ env:
+ # for non-CLI-team-owned plugins, you can send this anywhere you like
+ SLACK_WEBHOOK_URL: ${{ secrets.CLI_ALERTS_SLACK_WEBHOOK }}
+ SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK
+ with:
+ payload: |
+ {
+ "text": "${{ github.event.workflow_run.name }} failed: ${{ github.event.workflow_run.repository.name }}",
+ "blocks": [
+ {
+ "type": "header",
+ "text": {
+ "type": "plain_text",
+ "text": ":bh-alert: ${{ github.event.workflow_run.name }} failed: ${{ github.event.workflow_run.repository.name }} :bh-alert:"
+ }
+ },
+ {
+ "type": "section",
+ "text": {
+ "type": "mrkdwn",
+ "text": "Repo: ${{ github.event.workflow_run.repository.html_url }}\nWorkflow name: `${{ github.event.workflow_run.name }}`\nJob url: ${{ github.event.workflow_run.html_url }}"
+ }
+ }
+ ]
+ }
diff --git a/.github/workflows/manualRelease.yml b/.github/workflows/manualRelease.yml
new file mode 100644
index 0000000..f3ab5fa
--- /dev/null
+++ b/.github/workflows/manualRelease.yml
@@ -0,0 +1,40 @@
+name: manual release
+
+on:
+ workflow_dispatch:
+
+defaults:
+ run:
+ working-directory: packages/cli
+
+jobs:
+ release:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ token: ${{ secrets.SVC_CLI_BOT_GITHUB_TOKEN }}
+ - name: Conventional Changelog Action
+ id: changelog
+ uses: TriPSs/conventional-changelog-action@d360fad3a42feca6462f72c97c165d60a02d4bf2
+ # overriding some of the basic behaviors to just get the changelog
+ with:
+ git-user-name: svc-cli-bot
+ git-user-email: svc_cli_bot@salesforce.com
+ github-token: ${{ secrets.SVC_CLI_BOT_GITHUB_TOKEN }}
+ output-file: false
+ # always do the release, even if there are no semantic commits
+ skip-on-empty: false
+ tag-prefix: ''
+ - uses: notiz-dev/github-action-json-property@2192e246737701f108a4571462b76c75e7376216
+ id: packageVersion
+ with:
+ path: 'packages/cli/package.json'
+ prop_path: 'version'
+ - name: Create Github Release
+ uses: actions/create-release@v1
+ env:
+ GITHUB_TOKEN: ${{ secrets.SVC_CLI_BOT_GITHUB_TOKEN }}
+ with:
+ tag_name: ${{ steps.packageVersion.outputs.prop }}
+ release_name: ${{ steps.packageVersion.outputs.prop }}
diff --git a/.github/workflows/onPushToMain.yml b/.github/workflows/onPushToMain.yml
new file mode 100644
index 0000000..2cd4353
--- /dev/null
+++ b/.github/workflows/onPushToMain.yml
@@ -0,0 +1,27 @@
+# test
+name: version, tag and github release
+
+on:
+ push:
+ branches: [main]
+ paths:
+ - 'packages/cli/**'
+ - '.github/workflows/**'
+
+defaults:
+ run:
+ working-directory: packages/cli
+
+jobs:
+ release:
+ uses: oclif/github-workflows/.github/workflows/githubRelease.yml@main
+ with:
+ working-directory: packages/cli
+ secrets: inherit
+
+ # most repos won't use this
+ # depends on previous job to avoid git collisions, not for any functionality reason
+ # docs:
+ # uses: salesforcecli/github-workflows/.github/workflows/publishTypedoc.yml@main
+ # secrets: inherit
+ # needs: release
diff --git a/.github/workflows/onRelease.yml b/.github/workflows/onRelease.yml
new file mode 100644
index 0000000..3841ba8
--- /dev/null
+++ b/.github/workflows/onRelease.yml
@@ -0,0 +1,25 @@
+name: publish
+
+on:
+ release:
+ types: [released]
+ # support manual release in case something goes wrong and needs to be repeated or tested
+ workflow_dispatch:
+ inputs:
+ tag:
+ description: tag that needs to publish
+ type: string
+ required: true
+
+defaults:
+ run:
+ working-directory: packages/cli
+
+jobs:
+ npm:
+ uses: oclif/github-workflows/.github/workflows/npmPublish.yml@main
+ with:
+ tag: latest
+ githubTag: ${{ github.event.release.tag_name || inputs.tag }}
+ working-directory: packages/cli
+ secrets: inherit
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 0000000..1c09776
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,18 @@
+name: tests
+on:
+ push:
+ branches-ignore: [main]
+ paths:
+ - 'packages/cli/**'
+ - '.github/workflows/**'
+ workflow_dispatch:
+
+defaults:
+ run:
+ working-directory: packages/cli
+
+jobs:
+ unit-tests:
+ uses: oclif/github-workflows/.github/workflows/unitTest.yml@main
+ with:
+ working-directory: packages/cli
diff --git a/README.md b/README.md
index 2f40f3b..52c06fc 100644
--- a/README.md
+++ b/README.md
@@ -1,128 +1,109 @@
-
+# Starter Templates with Directus Integration
- Directus Templates
-
+This repo provides a collection of starter templates for building web applications with Directus integration. Initially, this includes a **Simple CMS**, but upcoming templates will also include **Simple CRM** and **Simple eCommerce** solutions.
-
Community maintained Directus instance templates to help you jump start your next project. Apply and extract templates with directus-template-cli .
-
+Each template is designed to be:
-
- Introduction ·
- 🚧 Using Templates ·
- ❤️ Contributing
-
-
-
+- **Reusable**: Modular codebases that can be easily extended.
+- **Framework-Specific**: Tailored implementations for popular frameworks like Next.js, Nuxt.js, Svelte, and Astro.
+- **Scalable**: Suitable for small to medium projects and scalable to larger applications.
-# 🚀 Introduction
-
-## What is a Directus "Template"?
-A Directus template is a starter kit or boilerplate for a Directus project. But it could be a full blown application – like [AgencyOS](https://github.com/directus-community/agency-os).
-
-Templates are extracted and applied using the [`directus-template-cli`](https://github.com/directus-community/directus-template-cli) command line utility.
-
-- They're examples of what you can build with Directus
-- They're starting points for your next client project
-- They're going to save you a boatload of time
-
-## What's Included in a Template?
-
-**Schema / Data Model**
-- Schema Snapshot
-- Collections
-- Fields
-- Relations
-
-**Users and Authentication**
-- Users
-- Roles
-- Permissions
-- Presets
-
-**Flows**
-- Flows
-- Operations
-
-**Dashboards**
-- Dashboards
-- Panels
+---
-**Assets**
-- Folders
-- Files
-- Actual Files for Assets
+## **Current and Upcoming Templates**
-**Sample Content / Data**
-- Translations
-- Content
+| Template | Status | Description |
+| -------------------- | -------------- | -------------------------------------------- |
+| **Simple CMS** | 🚧 In Progress | A starter CMS template for managing content. |
+| **Simple CRM** | 🕒 Upcoming | A CRM template for managing customer data. |
+| **Simple eCommerce** | 🕒 Upcoming | A template for building eCommerce solutions. |
---
+## **Getting Started**
-# **🚧 Using Templates**
+### **Using Directus with a Cloud Instance (Recommended)**
-To load or use templates you need a Directus instance. Here's a few ways to go about that.
+1. **Create a New Project**:
-### 1a - Register for a Directus Cloud account
+ - Visit [Directus Cloud](https://directus.io/cloud/) and create a new project.
+ - During the setup process, be sure to select the appropriate template for your project (**Simple CMS**, **Simple CRM**, or **Simple eCommerce**).
+ - Once started, it will take around 90 seconds for the Cloud Project to be created.
+ - You will receive an email with your project URL, email, and password for logging in.
+ - If you used GitHub to create your account, this will be your GitHub email.
-https://directus.cloud/register
+2. **Access Your New Project**:
-This is the easy button. You don’t have to mess with Docker or working out how to deploy a Directus instance at AWS,
-Digital Ocean, or similar hosts. A couple of clicks and in less than 2 minutes you’ll have a ready to go Directus
-project.
+ - Log in to your project using the URL provided in your email or from the Directus Cloud Dashboard.
-OR
+3. **Select a Template**:
+ - Navigate to the folder for the framework you want to use in this repo.
+ - Follow the instructions in that template's README to set up your application and connect it to your cloud instance.
-### 1b - Self Host a Directus Instance
+---
-If you're prefer to self-host Directus, we highly recommend you do so with Docker. We have several guides on the [Directus docs](https://docs.directus.io/self-hosted/docker-guide.html).
+### **Using Directus Locally**
-**Important Note**: We (the Directus team) cannot provide support for
-self-hosted instances WITHOUT an Enterprise Self-Hosted license or formal support agreement.
-[Learn more and contact our team for details on Enterprise Self-Hosted](https://directus.io/pricing/self-hosted).
+For local development, follow these steps:
+1. **Install Docker**:
-[PostgreSQL](https://www.postgresql.org/) is the **tested and preferred** database vendor for templates.
+ - Ensure Docker is installed and running on your machine: [Download Docker](https://www.docker.com/products/docker-desktop).
+2. **Clone the Template You Want**:
-### 2 **- Generate a static token for the admin user**
+ - Select the template folder for your chosen framework (e.g., `simple-cms`) and clone it:
+ ```bash
+ git clone https://github.com/your-org/starters.git simple-cms
+ cd simple-cms
+ ```
-You need the static token to seed the project.
+3. **Navigate to the `directus/` Folder**:
-1. Go to the User Directory
-2. Choose the Administrative User
-3. Scroll down to the Token field
-4. Generate token and copy it
-5. Save the user (do NOT forget to save because you’ll get an error that shows Invalid token!)
+ - Inside your cloned template folder, navigate to the `directus/` folder:
+ ```bash
+ cd directus
+ ```
-### 3 **- Apply the Template**
+4. **Start Directus**:
-Open your terminal, run the following command, and simply follow the prompts.
+ - Run Docker Compose to start the Directus instance:
-`npx directus-template-cli@latest apply`
+ ```bash
+ docker-compose up -d
+ ```
-You can load apply templates from three sources.
+ - This will start Directus on [http://localhost:8055](http://localhost:8055). Use the following credentials to log in:
+ - **Admin Email**: `admin@example.com`
+ - **Admin Password**: `d1r3ctu5`
-- Official Templates (maintained in this repo)
-- Local directory (files on your local computer)
-- GitHub repository (public only)
+5. **Apply a Template**:
-You can learn more about the
-[Directus Template CLI tool here](https://github.com/directus-community/directus-template-cli).
+ - Use the [Directus Template CLI](https://github.com/directus-labs/directus-template-cli) to apply a pre-configured template for your project. Follow these steps:
-_Note_: It can take a
-few minutes for the template script to run if you’re using a remotely hosted Directus instance.
+ 1. \*\*Generate a static token for the admin user:
-# ❤️ Contributing
+ - Go to the **Users Directory**
+ - Choose the Administrative User
+ - Scroll down to the **Token** field and generate a static token.
+ - Copy the token and save it. **Do not forget to save the user**, or you will encounter an "Invalid token" error.
-This is community driven project so we'd love to have your contributions.
+ 2. **Run the Template CLI Tool**:
-You can extract your own templates using:
+ - Open your terminal, run the following command, and follow the prompts:
+ ```bash
+ npx directus-template-cli@latest apply
+ ```
-`npx directus-template-cli@latest extract`
+ 3. **Follow the Prompts**:
-Here's how you can contribute:
-- [Make a pull request](https://github.com/directus-community/directus-templates/pulls) to add your own template.
+ - Choose `Community templates`
+ - Select the template from the list to apply (**Simple Website CMS**, **Simple CRM**, or **Simple eCommerce**)
+ - Fill in your Directus URL
+ ```bash
+ http://localhost:8055
+ ```
+ - Select `Directus Access Token`
+ - Fill in the token you saved from Step 1
-## 🙏 Thanks To
-Big shout out to [Alex van der Valk (AVDV)](https://github.com/alexvdvalk) for his contributions to this project.
+---
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..3d368cb
--- /dev/null
+++ b/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "@directus-labs/templates",
+ "private": true,
+ "scripts": {},
+ "license": "MIT"
+}
diff --git a/packages/directus-template-cli/.editorconfig b/packages/directus-template-cli/.editorconfig
new file mode 100644
index 0000000..beffa30
--- /dev/null
+++ b/packages/directus-template-cli/.editorconfig
@@ -0,0 +1,11 @@
+root = true
+
+[*]
+indent_style = space
+indent_size = 2
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
diff --git a/packages/directus-template-cli/.eslintignore b/packages/directus-template-cli/.eslintignore
new file mode 100644
index 0000000..9b1c8b1
--- /dev/null
+++ b/packages/directus-template-cli/.eslintignore
@@ -0,0 +1 @@
+/dist
diff --git a/packages/directus-template-cli/.eslintrc b/packages/directus-template-cli/.eslintrc
new file mode 100644
index 0000000..373fb05
--- /dev/null
+++ b/packages/directus-template-cli/.eslintrc
@@ -0,0 +1,7 @@
+{
+ "extends": [
+ "oclif",
+ "oclif-typescript"
+ ]
+
+}
diff --git a/packages/directus-template-cli/.gitignore b/packages/directus-template-cli/.gitignore
new file mode 100644
index 0000000..7486b7b
--- /dev/null
+++ b/packages/directus-template-cli/.gitignore
@@ -0,0 +1,16 @@
+*-debug.log
+*-error.log
+/.nyc_output
+/dist
+/lib
+/package-lock.json
+/tmp
+node_modules
+oclif.manifest.json
+.DS_Store
+templates
+
+/downloads
+/**/downloads
+.env
+.directus-template-cli/logs
diff --git a/packages/directus-template-cli/.mocharc.json b/packages/directus-template-cli/.mocharc.json
new file mode 100644
index 0000000..4a09d14
--- /dev/null
+++ b/packages/directus-template-cli/.mocharc.json
@@ -0,0 +1,12 @@
+{
+ "require": [
+ "test/helpers/init.js",
+ "ts-node/register"
+ ],
+ "watch-extensions": [
+ "ts"
+ ],
+ "recursive": true,
+ "reporter": "spec",
+ "timeout": 60000
+}
diff --git a/packages/directus-template-cli/LICENSE b/packages/directus-template-cli/LICENSE
new file mode 100644
index 0000000..b76a13e
--- /dev/null
+++ b/packages/directus-template-cli/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 Directus Community
+
+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/packages/directus-template-cli/README.md b/packages/directus-template-cli/README.md
new file mode 100644
index 0000000..6d4341e
--- /dev/null
+++ b/packages/directus-template-cli/README.md
@@ -0,0 +1,218 @@
+# Directus Template CLI
+
+A streamlined CLI tool for managing Directus templates - making it easy to apply and extract template configurations across instances.
+
+⚠️ **Beta Release Notice**: This tool is currently in beta and best suited for:
+- Proof of Concept (POC) projects
+- Demo environments
+- New project setups
+
+We strongly recommend against using this tool in existing production environments or as a critical part of your CI/CD pipeline without thorough testing. Always create backups before applying templates.
+
+**Important Notes:**
+- **Primary Purpose**: Built to deploy templates created by the Directus Core Team. While community templates are supported, the unlimited possible configurations make comprehensive support challenging.
+- **Database Compatibility**: PostgreSQL and SQLite are recommended. MySQL users may encounter known issues.
+- **Performance**: Remote operations (extract/apply) are rate-limited to 10 requests/second using bottleneck. Processing time varies based on your instance size (collections, items, assets).
+- **Version Compatibility**:
+ - v0.5.0+: Compatible with Directus 11 and up
+ - v0.4.0: Use for Directus 10 compatibility (`npx directus-template-cli@0.4 extract/apply`)
+
+Using the @latest tag ensures you're receiving the latest version of the packaged templates with the CLI. You can review [the specific versions on NPM](https://www.npmjs.com/package/directus-template-cli) and use @{version} syntax to apply the templates included with that version.
+
+## Applying a Template
+
+🚧 Make backups of your project/database before applying templates.
+
+1. Create a Directus instance on [Directus Cloud](https://directus.cloud) or using self-hosted version.
+2. Login and create a Static Access Token for the admin user.
+3. Copy the static token and your Directus URL.
+4. Run the following command on the terminal and follow the prompts.
+
+```
+npx directus-template-cli@latest apply
+```
+
+You can choose from our community maintained templates or you can also choose a template from a local directory or a public GitHub repository.
+
+
+### Programmatic Mode
+
+By default, the CLI will run in interactive mode. For CI/CD pipelines or automated scripts, you can use the programmatic mode:
+
+
+Using a token:
+
+```
+npx directus-template-cli@latest apply -p --directusUrl="http://localhost:8055" --directusToken="admin-token-here" --templateLocation="./my-template" --templateType="local"
+```
+
+Using email/password:
+
+```
+npx directus-template-cli@latest apply -p --directusUrl="http://localhost:8055" --userEmail="admin@example.com" --userPassword="admin" --templateLocation="./my-template" --templateType="local"
+```
+
+Partial apply (apply only some of the parts of a template to the instance):
+
+```
+npx directus-template-cli@latest apply -p --directusUrl="http://localhost:8055" --userEmail="admin@example.com" --userPassword="your-password" --templateLocation="./my-template" --templateType="local" --partial --schema --permissions --no-content
+
+```
+
+Available flags for programmatic mode:
+
+- `--directusUrl`: URL of the Directus instance to apply the template to (required)
+- `--directusToken`: Token to use for the Directus instance (required if not using email/password)
+- `--userEmail`: Email for Directus authentication (required if not using token)
+- `--userPassword`: Password for Directus authentication (required if not using token)
+- `--templateLocation`: Location of the template to apply (required)
+- `--templateType`: Type of template to apply. Options: community, local, github. Defaults to `local`.
+- `--partial`: Enable partial template application
+- `--content`: Load Content (data)
+- `--dashboards`: Load Dashboards
+- `--extensions`: Load Extensions
+- `--files`: Load Files
+- `--flows`: Load Flows
+- `--permissions`: Load Permissions
+- `--schema`: Load Schema
+- `--settings`: Load Settings
+- `--users`: Load Users
+
+When using `--partial`, you can also use `--no` flags to exclude specific components from being applied. For example:
+
+```
+npx directus-template-cli@latest apply -p --directusUrl="http://localhost:8055" --userEmail="admin@example.com" --userPassword="your-password" --templateLocation="./my-template" --templateType="local" --partial --no-content --no-users
+```
+
+This command will apply the template but exclude content and users. Available `--no` flags include:
+
+- `--no-content`: Skip loading Content (data)
+- `--no-dashboards`: Skip loading Dashboards
+- `--no-extensions`: Skip loading Extensions
+- `--no-files`: Skip loading Files
+- `--no-flows`: Skip loading Flows
+- `--no-permissions`: Skip loading PermissionsI
+- `--no-schema`: Skip loading Schema
+- `--no-settings`: Skip loading Settings
+- `--no-users`: Skip loading Users
+
+
+#### Template Component Dependencies
+
+When applying templates, certain components have dependencies on others. Here are the key relationships to be aware of:
+
+- `--users`: Depends on `--permissions`. If you include users, permissions will automatically be included.
+- `--permissions`: Depends on `--schema`. If you include permissions, the schema will automatically be included.
+- `--content`: Depends on `--schema`. If you include content, the schema will automatically be included.
+- `--files`: No direct dependencies, but often related to content. Consider including `--content` if you're including files.
+- `--flows`: No direct dependencies, but may interact with other components. Consider your specific use case.
+- `--dashboards`: No direct dependencies, but often rely on data from other components.
+- `--extensions`: No direct dependencies, but may interact with other components.
+- `--settings`: No direct dependencies, but affects the overall system configuration.
+
+When using the `--partial` flag, keep these dependencies in mind. For example:
+
+```
+npx directus-template-cli@latest apply -p --directusUrl="http://localhost:8055" --directusToken="admin-token-here" --templateLocation="./my-template" --templateType="local" --partial --users
+```
+
+This command will automatically include `--permissions` and `--schema` along with `--users`, even if not explicitly specified.
+
+If you use `--no-` flags, be cautious about excluding dependencies. For instance, using `--no-schema` while including `--content` may lead to errors or incomplete application of the template.
+
+#### Using Environment Variables
+
+You can also pass flags as environment variables. This can be useful for CI/CD pipelines or when you want to avoid exposing sensitive information in command-line arguments. Here are the available environment variables:
+
+- `TARGET_DIRECTUS_URL`: Equivalent to `--directusUrl`
+- `TARGET_DIRECTUS_TOKEN`: Equivalent to `--directusToken`
+- `TARGET_DIRECTUS_EMAIL`: Equivalent to `--userEmail`
+- `TARGET_DIRECTUS_PASSWORD`: Equivalent to `--userPassword`
+- `TEMPLATE_LOCATION`: Equivalent to `--templateLocation`
+- `TEMPLATE_TYPE`: Equivalent to `--templateType`
+-
+
+### Existing Data
+
+You can apply a template to an existing Directus instance. This is nice because you can have smaller templates that you can "compose" for various use cases. The CLI tries to be smart about existing items in the target Directus instance. But mileage may vary depending on the size and complexity of the template and the existing instance.
+
+**System Collections**
+
+In most of the system collections (collections,roles, permissions, etc.), if an item with the same identifier already exists, it will be typically be SKIPPED vs overwritten.
+
+Exceptions:
+
+- directus_settings: The CLI attempts to merge the template's project settings with the existing settings in the target instance. Using the existing settings as a base and updating them with the values from the template. This should prevent overwriting branding, themes, and other customizations.
+
+**Your Collections:**
+
+For data in your own user-created collections, if an item has the same primary key, the data will be overwritten with the incoming data from the template.
+
+---
+
+## Extracting a Template
+
+The CLI can also extract a template from a Directus instance so that it can be applied to other instances.
+
+Note: We do not currently support partial extraction. The entire template will be extracted. We thought it better to have the data and not need it, than need it and not have it.
+
+1. Make sure you remove any sensitive data from the Directus instance you don't want to include in the template.
+2. Login and create a Static Access Token for the admin user.
+3. Copy the static token and your Directus URL.
+4. Run the following command on the terminal and follow the prompts.
+
+```
+npx directus-template-cli@latest extract
+```
+
+### Programmatic Mode
+
+By default, the CLI will run in interactive mode. For CI/CD pipelines or automated scripts, you can use the programmatic mode:
+
+Using a token:
+
+```
+npx directus-template-cli@latest extract -p --templateName="My Template" --templateLocation="./my-template" --directusToken="admin-token-here" --directusUrl="http://localhost:8055"
+```
+
+Using email/password:
+
+```
+npx directus-template-cli@latest extract -p --templateName="My Template" --templateLocation="./my-template" --userEmail="admin@example.com" --userPassword="admin" --directusUrl="http://localhost:8055"
+```
+
+Available flags for programmatic mode:
+
+- `--directusUrl`: URL of the Directus instance to extract the template from (required)
+- `--directusToken`: Token to use for the Directus instance (required if not using email/password)
+- `--userEmail`: Email for Directus authentication (required if not using token)
+- `--userPassword`: Password for Directus authentication (required if not using token)
+- `--templateLocation`: Directory to extract the template to (required)
+- `--templateName`: Name of the template (required)
+
+#### Using Environment Variables
+
+Similar to the Apply command, you can use environment variables for the Extract command as well:
+
+- `SOURCE_DIRECTUS_URL`: Equivalent to `--directusUrl`
+- `SOURCE_DIRECTUS_TOKEN`: Equivalent to `--directusToken`
+- `SOURCE_DIRECTUS_EMAIL`: Equivalent to `--userEmail`
+- `SOURCE_DIRECTUS_PASSWORD`: Equivalent to `--userPassword`
+- `TEMPLATE_LOCATION`: Equivalent to `--templateLocation`
+
+## Logs
+
+The Directus Template CLI logs information to a file in the `.directus-template-cli/logs` directory.
+
+Logs are automatically generated for each run of the CLI. Here's how the logging system works:
+ - A new log file is created for each CLI run.
+ - Log files are stored in the `.directus-template-cli/logs` directory within your current working directory.
+ - Each log file is named `run-[timestamp].log`, where `[timestamp]` is the ISO timestamp of when the CLI was initiated.
+
+The logger automatically sanitizes sensitive information such as passwords, tokens, and keys before writing to the log file. But it may not catch everything. Just be aware of this and make sure to remove the log files when they are no longer needed.
+
+Note: If you encounter any issues with the CLI, providing these log files can greatly assist in diagnosing and resolving the problem.
+
+## License
+
+This tool is licensed under the [MIT License](https://opensource.org/licenses/MIT).
diff --git a/packages/directus-template-cli/bin/dev b/packages/directus-template-cli/bin/dev
new file mode 100755
index 0000000..bbc3f51
--- /dev/null
+++ b/packages/directus-template-cli/bin/dev
@@ -0,0 +1,17 @@
+#!/usr/bin/env node
+
+const oclif = require('@oclif/core')
+
+const path = require('path')
+const project = path.join(__dirname, '..', 'tsconfig.json')
+
+// In dev mode -> use ts-node and dev plugins
+process.env.NODE_ENV = 'development'
+
+require('ts-node').register({project})
+
+// In dev mode, always show stack traces
+oclif.settings.debug = true;
+
+// Start the CLI
+oclif.run().then(oclif.flush).catch(oclif.Errors.handle)
diff --git a/packages/directus-template-cli/bin/dev.cmd b/packages/directus-template-cli/bin/dev.cmd
new file mode 100644
index 0000000..077b57a
--- /dev/null
+++ b/packages/directus-template-cli/bin/dev.cmd
@@ -0,0 +1,3 @@
+@echo off
+
+node "%~dp0\dev" %*
\ No newline at end of file
diff --git a/packages/directus-template-cli/bin/run b/packages/directus-template-cli/bin/run
new file mode 100755
index 0000000..a7635de
--- /dev/null
+++ b/packages/directus-template-cli/bin/run
@@ -0,0 +1,5 @@
+#!/usr/bin/env node
+
+const oclif = require('@oclif/core')
+
+oclif.run().then(require('@oclif/core/flush')).catch(require('@oclif/core/handle'))
diff --git a/packages/directus-template-cli/bin/run.cmd b/packages/directus-template-cli/bin/run.cmd
new file mode 100644
index 0000000..968fc30
--- /dev/null
+++ b/packages/directus-template-cli/bin/run.cmd
@@ -0,0 +1,3 @@
+@echo off
+
+node "%~dp0\run" %*
diff --git a/packages/directus-template-cli/package.json b/packages/directus-template-cli/package.json
new file mode 100644
index 0000000..6df648a
--- /dev/null
+++ b/packages/directus-template-cli/package.json
@@ -0,0 +1,81 @@
+{
+ "name": "directus-template-cli",
+ "version": "0.5.1",
+ "description": "CLI Utility for applying templates to a Directus instance.",
+ "author": "bryantgillespie @bryantgillespie",
+ "bin": {
+ "directus-template-cli": "./bin/run"
+ },
+ "homepage": "https://github.com/directus-community/directus-template-cli",
+ "license": "MIT",
+ "main": "dist/index.js",
+ "repository": "directus-community/directus-template-cli",
+ "files": [
+ "/bin",
+ "/dist",
+ "/npm-shrinkwrap.json",
+ "/oclif.manifest.json"
+ ],
+ "dependencies": {
+ "@directus/sdk": "^17.0.1",
+ "@oclif/core": "^3.18.1",
+ "@oclif/plugin-help": "^6.0.12",
+ "@oclif/plugin-plugins": "^4.1.22",
+ "bottleneck": "^2.19.5",
+ "defu": "^6.1.4",
+ "dotenv": "^16.4.1",
+ "formdata-node": "^6.0.3",
+ "giget": "^1.2.1",
+ "inquirer": "^8.2.5",
+ "slugify": "^1.6.6"
+ },
+ "devDependencies": {
+ "@directus/types": "^12.0.1",
+ "@oclif/test": "^3.1.13",
+ "@types/chai": "^4.3.11",
+ "@types/mocha": "^10.0.6",
+ "@types/node": "^20.11.10",
+ "chai": "^5.0.3",
+ "eslint": "^8.56.0",
+ "eslint-config-oclif": "^5.0.0",
+ "eslint-config-oclif-typescript": "^3.0.41",
+ "mocha": "^10.2.0",
+ "oclif": "^4.4.2",
+ "shx": "^0.3.3",
+ "ts-node": "^10.9.2",
+ "tslib": "^2.6.2",
+ "typescript": "^5.3.3"
+ },
+ "oclif": {
+ "bin": "directus-template-cli",
+ "dirname": "directus-template-cli",
+ "commands": "./dist/commands",
+ "plugins": [
+ "@oclif/plugin-help",
+ "@oclif/plugin-plugins"
+ ],
+ "topicSeparator": " ",
+ "topics": {}
+ },
+ "scripts": {
+ "build": "shx rm -rf dist && tsc -b",
+ "lint": "eslint . --ext .ts --config .eslintrc",
+ "postpack": "shx rm -f oclif.manifest.json",
+ "posttest": "npm run lint",
+ "prepack": "npm run build && oclif manifest && oclif readme",
+ "test": "mocha --forbid-only \"test/**/*.test.ts\"",
+ "version": "oclif readme && git add README.md"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "bugs": "https://github.com/directus-community/directus-template-cli/issues",
+ "keywords": [
+ "directus",
+ "templates",
+ "headless cms",
+ "directus cms",
+ "directus cli"
+ ],
+ "types": "dist/index.d.ts"
+}
diff --git a/packages/directus-template-cli/pnpm-lock.yaml b/packages/directus-template-cli/pnpm-lock.yaml
new file mode 100644
index 0000000..aed95f4
--- /dev/null
+++ b/packages/directus-template-cli/pnpm-lock.yaml
@@ -0,0 +1,8731 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ '@directus/sdk':
+ specifier: ^17.0.1
+ version: 17.0.1
+ '@directus/types':
+ specifier: ^12.0.1
+ version: 12.0.1(knex@3.1.0)(vue@3.5.3(typescript@5.3.3))
+ '@oclif/core':
+ specifier: ^3.18.1
+ version: 3.18.1
+ '@oclif/plugin-help':
+ specifier: ^6.0.12
+ version: 6.0.12
+ '@oclif/plugin-plugins':
+ specifier: ^4.1.22
+ version: 4.1.22
+ bottleneck:
+ specifier: ^2.19.5
+ version: 2.19.5
+ defu:
+ specifier: ^6.1.4
+ version: 6.1.4
+ dotenv:
+ specifier: ^16.4.1
+ version: 16.4.1
+ formdata-node:
+ specifier: ^6.0.3
+ version: 6.0.3
+ giget:
+ specifier: ^1.2.1
+ version: 1.2.1
+ inquirer:
+ specifier: ^8.2.5
+ version: 8.2.6
+ slugify:
+ specifier: ^1.6.6
+ version: 1.6.6
+ devDependencies:
+ '@oclif/test':
+ specifier: ^3.1.13
+ version: 3.1.13
+ '@types/chai':
+ specifier: ^4.3.11
+ version: 4.3.11
+ '@types/mocha':
+ specifier: ^10.0.6
+ version: 10.0.6
+ '@types/node':
+ specifier: ^20.11.10
+ version: 20.11.10
+ chai:
+ specifier: ^5.0.3
+ version: 5.0.3
+ eslint:
+ specifier: ^8.56.0
+ version: 8.56.0
+ eslint-config-oclif:
+ specifier: ^5.0.0
+ version: 5.0.0(eslint@8.56.0)
+ eslint-config-oclif-typescript:
+ specifier: ^3.0.41
+ version: 3.0.41(eslint@8.56.0)(typescript@5.3.3)
+ mocha:
+ specifier: ^10.2.0
+ version: 10.2.0
+ oclif:
+ specifier: ^4.4.2
+ version: 4.4.2(encoding@0.1.13)(eslint@8.56.0)(mem-fs@2.3.0)(typescript@5.3.3)
+ shx:
+ specifier: ^0.3.3
+ version: 0.3.4
+ ts-node:
+ specifier: ^10.9.2
+ version: 10.9.2(@types/node@20.11.10)(typescript@5.3.3)
+ tslib:
+ specifier: ^2.6.2
+ version: 2.6.2
+ typescript:
+ specifier: ^5.3.3
+ version: 5.3.3
+
+packages:
+
+ '@aashutoshrathi/word-wrap@1.2.6':
+ resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
+ engines: {node: '>=0.10.0'}
+
+ '@aws-crypto/crc32@3.0.0':
+ resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==}
+
+ '@aws-crypto/crc32c@3.0.0':
+ resolution: {integrity: sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==}
+
+ '@aws-crypto/ie11-detection@3.0.0':
+ resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==}
+
+ '@aws-crypto/sha1-browser@3.0.0':
+ resolution: {integrity: sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==}
+
+ '@aws-crypto/sha256-browser@3.0.0':
+ resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==}
+
+ '@aws-crypto/sha256-js@3.0.0':
+ resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==}
+
+ '@aws-crypto/supports-web-crypto@3.0.0':
+ resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==}
+
+ '@aws-crypto/util@3.0.0':
+ resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==}
+
+ '@aws-sdk/client-cloudfront@3.502.0':
+ resolution: {integrity: sha512-/xx5MjJyQPPPPAew5Y2uJ24Qpxv9XeAax/qKiAVA44gJZRwOciT+C9+d9gVumqjHNZa3pMJI3Erf0CSON92r2g==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/client-s3@3.502.0':
+ resolution: {integrity: sha512-/xanrBWjDnvz1tVtTWhNcp68N8+3jrVc1RFdvbZqLs6uweCQM56xRCmUEel/rA6oBhKBiuGn51MdjHXs+gGhUA==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/client-sso-oidc@3.502.0':
+ resolution: {integrity: sha512-Yc9tZqTOMWtdgpkrdjKShgWb9oKNsFQrItfoiN1xWDllaFFRPi2KTiZiR0AbSTrNasJy13d210DOxrIdte+kWQ==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ '@aws-sdk/credential-provider-node': '*'
+
+ '@aws-sdk/client-sso@3.502.0':
+ resolution: {integrity: sha512-OZAYal1+PQgUUtWiHhRayDtX0OD+XpXHKAhjYgEIPbyhQaCMp3/Bq1xDX151piWXvXqXLJHFKb8DUEqzwGO9QA==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/client-sts@3.502.0':
+ resolution: {integrity: sha512-0q08gsvn6nuRqjK+i/e30PT/t7vvYwmGJS0PhJikZWv5yRDNSUxSYG0uDwKSbLDzmc2UX5+mLeyjPHlL4hbGlA==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ '@aws-sdk/credential-provider-node': '*'
+
+ '@aws-sdk/core@3.496.0':
+ resolution: {integrity: sha512-yT+ug7Cw/3eJi7x2es0+46x12+cIJm5Xv+GPWsrTFD1TKgqO/VPEgfDtHFagDNbFmjNQA65Ygc/kEdIX9ICX/A==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/credential-provider-env@3.502.0':
+ resolution: {integrity: sha512-KIB8Ae1Z7domMU/jU4KiIgK4tmYgvuXlhR54ehwlVHxnEoFPoPuGHFZU7oFn79jhhSLUFQ1lRYMxP0cEwb7XeQ==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/credential-provider-ini@3.502.0':
+ resolution: {integrity: sha512-1wB/escbspUY6uRDEMp9AMMyypUSyuQ0AMO1yQNtXviV8cPf+CuRbqP/UVnimHO1RuX0n5BmjDVVjUIEU6kuGA==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/credential-provider-node@3.502.0':
+ resolution: {integrity: sha512-qg71UpYeFrjhu5hD+vdRqZ+EYFB11BeszsbfEJGaHhOMHmmTHNBaDAexW+bUnJSXcJL0a8vniCvca+rElbcAHQ==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/credential-provider-process@3.502.0':
+ resolution: {integrity: sha512-fJJowOjQ4infYQX0E1J3xFVlmuwEYJAFk0Mo1qwafWmEthsBJs+6BR2RiWDELHKrSK35u4Pf3fu3RkYuCtmQFw==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/credential-provider-sso@3.502.0':
+ resolution: {integrity: sha512-/2Nyvo+cWQpH283lmZBimTJ9JDhES9FzQUkhUXZgxQo3Ez4sguLVi2V9xoFFyG0cMff5fuNivdKHfj4FeMGjZw==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/credential-provider-web-identity@3.502.0':
+ resolution: {integrity: sha512-veBAjDqjMMgA2Qxxf9ywDfHYLeJpaeHWLWCQ9XCHwJJ6ZIGWmAZPTq3he/UMr5JIQXooIccqqyqXMDIXPenXpA==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/middleware-bucket-endpoint@3.502.0':
+ resolution: {integrity: sha512-mUSP2DUcjhO5zM2b21CvZ9AqwI8DaAeZA6NYHOxWGTV9BUxHcdGWXEjDkcVj9CQ0gvNwTtw6B5L/q52rVAnZbw==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/middleware-expect-continue@3.502.0':
+ resolution: {integrity: sha512-DxfAuBVuPSt8as9xP57o8ks6ySVSjwO2NNNAdpLwk4KhEAPYEpHlf2yWYorYLrS+dDmwfYgOhRNoguuBdCu6ow==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/middleware-flexible-checksums@3.502.0':
+ resolution: {integrity: sha512-kCt2zQDFumz/LnJJJOSd2GW4dr8oT8YMJKgxC/pph3aRXoSHXRwhrMbFnQ8swEE9vjywxtcED8sym0b0tNhhoA==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/middleware-host-header@3.502.0':
+ resolution: {integrity: sha512-EjnG0GTYXT/wJBmm5/mTjDcAkzU8L7wQjOzd3FTXuTCNNyvAvwrszbOj5FlarEw5XJBbQiZtBs+I5u9+zy560w==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/middleware-location-constraint@3.502.0':
+ resolution: {integrity: sha512-fLRwPuTZvEWQkPjys03m3D6tYN4kf7zU6+c8mJxwvEg+yfBuv2RBsbd+Vn2bTisUjXvIg1kyBzONlpHoIyFneg==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/middleware-logger@3.502.0':
+ resolution: {integrity: sha512-FDyv6K4nCoHxbjLGS2H8ex8I0KDIiu4FJgVRPs140ZJy6gE5Pwxzv6YTzZGLMrnqcIs9gh065Lf6DjwMelZqaw==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/middleware-recursion-detection@3.502.0':
+ resolution: {integrity: sha512-hvbyGJbxeuezxOu8VfFmcV4ql1hKXLxHTe5FNYfEBat2KaZXVhc1Hg+4TvB06/53p+E8J99Afmumkqbxs2esUA==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/middleware-sdk-s3@3.502.0':
+ resolution: {integrity: sha512-GbGugrfyL5bNA/zw8iQll92yXBONfWSC8Ns00DtkOU1saPXp4/7WHtyyZGYdvPa73T1IsuZy9egpoYRBmRcd5Q==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/middleware-signing@3.502.0':
+ resolution: {integrity: sha512-4hF08vSzJ7L6sB+393gOFj3s2N6nLusYS0XrMW6wYNFU10IDdbf8Z3TZ7gysDJJHEGQPmTAesPEDBsasGWcMxg==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/middleware-ssec@3.502.0':
+ resolution: {integrity: sha512-1nidVTIba6/aVjjzD/WNqWdzSyTrXOHO3Ddz2MGD8S1yGSrYz4iYaq4Bm/uosfdr8B1L0Ws0pjdRXrNfzSw/DQ==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/middleware-user-agent@3.502.0':
+ resolution: {integrity: sha512-TxbBZbRiXPH0AUxegqiNd9aM9zNSbfjtBs5MEfcBsweeT/B2O7K1EjP9+CkB8Xmk/5FLKhAKLr19b1TNoE27rw==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/region-config-resolver@3.502.0':
+ resolution: {integrity: sha512-mxmsX2AGgnSM+Sah7mcQCIneOsJQNiLX0COwEttuf8eO+6cLMAZvVudH3BnWTfea4/A9nuri9DLCqBvEmPrilg==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/signature-v4-multi-region@3.502.0':
+ resolution: {integrity: sha512-NpOXtUXH0ZAgnyI3Y3s2fPrgwbsWoNMwdoXdFZvH0eDzzX80tim7Yuy6dzVA5zrxSzOYs1xjcOhM+4CmM0QZiw==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/token-providers@3.502.0':
+ resolution: {integrity: sha512-RQgMgIXYlSf0xGl6EUeD+pqIPBlb7e29dbqHOBFc66hJVYUC2ULZX7Y+jLvcGIEaMiIaTPyvntZRFip+U+9hag==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/types@3.502.0':
+ resolution: {integrity: sha512-M0DSPYe/gXhwD2QHgoukaZv5oDxhW3FfvYIrJptyqUq3OnPJBcDbihHjrE0PBtfh/9kgMZT60/fQ2NVFANfa2g==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/util-arn-parser@3.495.0':
+ resolution: {integrity: sha512-hwdA3XAippSEUxs7jpznwD63YYFR+LtQvlEcebPTgWR9oQgG9TfS+39PUfbnEeje1ICuOrN3lrFqFbmP9uzbMg==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/util-endpoints@3.502.0':
+ resolution: {integrity: sha512-6LKFlJPp2J24r1Kpfoz5ESQn+1v5fEjDB3mtUKRdpwarhm3syu7HbKlHCF3KbcCOyahobvLvhoedT78rJFEeeg==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/util-locate-window@3.495.0':
+ resolution: {integrity: sha512-MfaPXT0kLX2tQaR90saBT9fWQq2DHqSSJRzW+MZWsmF+y5LGCOhO22ac/2o6TKSQm7h0HRc2GaADqYYYor62yg==}
+ engines: {node: '>=14.0.0'}
+
+ '@aws-sdk/util-user-agent-browser@3.502.0':
+ resolution: {integrity: sha512-v8gKyCs2obXoIkLETAeEQ3AM+QmhHhst9xbM1cJtKUGsRlVIak/XyyD+kVE6kmMm1cjfudHpHKABWk9apQcIZQ==}
+
+ '@aws-sdk/util-user-agent-node@3.502.0':
+ resolution: {integrity: sha512-9RjxpkGZKbTdl96tIJvAo+vZoz4P/cQh36SBUt9xfRfW0BtsaLyvSrvlR5wyUYhvRcC12Axqh/8JtnAPq//+Vw==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ aws-crt: '>=1.0.0'
+ peerDependenciesMeta:
+ aws-crt:
+ optional: true
+
+ '@aws-sdk/util-utf8-browser@3.259.0':
+ resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==}
+
+ '@aws-sdk/xml-builder@3.496.0':
+ resolution: {integrity: sha512-GvEjh537IIeOw1ZkZuB37sV12u+ipS5Z1dwjEC/HAvhl5ac23ULtTr1/n+U1gLNN+BAKSWjKiQ2ksj8DiUzeyw==}
+ engines: {node: '>=14.0.0'}
+
+ '@babel/code-frame@7.23.5':
+ resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.24.8':
+ resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.22.20':
+ resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.24.7':
+ resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/highlight@7.23.4':
+ resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.25.6':
+ resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/types@7.25.6':
+ resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==}
+ engines: {node: '>=6.9.0'}
+
+ '@cspotcode/source-map-support@0.8.1':
+ resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
+ engines: {node: '>=12'}
+
+ '@directus/constants@12.0.0':
+ resolution: {integrity: sha512-mzVUldDJJ4WbfFnWHSGtZKrofSAyuKli3KRZ/9spGhyhJuzCory+QKEtYrWyhxFUeV3ZwODxD5RHKHP5l3ya5Q==}
+
+ '@directus/schema@12.1.0':
+ resolution: {integrity: sha512-56qIDmw6yHR8UFIfwUOEyHJ169uxdl4Sa4YncnQyaANOvuKmpXwxmZ5nf0zQmSx8S7TJZ8kc1NhpyKMMpr80NA==}
+
+ '@directus/sdk@17.0.1':
+ resolution: {integrity: sha512-6TorT8am/8q2YmhLhGY1yZks2rFr31my5WqbXUPZs+4hPWYkTNThns2lfhZQ8w2KBh9DZ7v5SaghZNSIswUOwA==}
+ engines: {node: '>=18.0.0'}
+
+ '@directus/types@12.0.1':
+ resolution: {integrity: sha512-U+51RHJPRgb1Z4oyh/hn5sT9IOaDbskH83pfnGmhlOdmS2bPqyxg7zImfE2pyFxpKRWX8rEzarmyOGv2HNO+ug==}
+ peerDependencies:
+ knex: '3'
+ vue: ^3.4
+ peerDependenciesMeta:
+ knex:
+ optional: true
+ vue:
+ optional: true
+
+ '@eslint-community/eslint-utils@4.4.0':
+ resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+ '@eslint-community/regexpp@4.10.0':
+ resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/eslintrc@2.1.4':
+ resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ '@eslint/js@8.56.0':
+ resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ '@gar/promisify@1.1.3':
+ resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==}
+
+ '@humanwhocodes/config-array@0.11.14':
+ resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
+ engines: {node: '>=10.10.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/object-schema@2.0.2':
+ resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==}
+
+ '@isaacs/cliui@8.0.2':
+ resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+ engines: {node: '>=12'}
+
+ '@isaacs/string-locale-compare@1.1.0':
+ resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==}
+
+ '@jridgewell/resolve-uri@3.1.1':
+ resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/sourcemap-codec@1.4.15':
+ resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+
+ '@jridgewell/sourcemap-codec@1.5.0':
+ resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
+ '@jridgewell/trace-mapping@0.3.9':
+ resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@npmcli/arborist@4.3.1':
+ resolution: {integrity: sha512-yMRgZVDpwWjplorzt9SFSaakWx6QIK248Nw4ZFgkrAy/GvJaFRaSZzE6nD7JBK5r8g/+PTxFq5Wj/sfciE7x+A==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16}
+ hasBin: true
+
+ '@npmcli/fs@1.1.1':
+ resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==}
+
+ '@npmcli/fs@2.1.2':
+ resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ '@npmcli/fs@3.1.0':
+ resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ '@npmcli/git@2.1.0':
+ resolution: {integrity: sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==}
+
+ '@npmcli/git@4.1.0':
+ resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ '@npmcli/installed-package-contents@1.0.7':
+ resolution: {integrity: sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==}
+ engines: {node: '>= 10'}
+ hasBin: true
+
+ '@npmcli/installed-package-contents@2.0.2':
+ resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ hasBin: true
+
+ '@npmcli/map-workspaces@2.0.4':
+ resolution: {integrity: sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ '@npmcli/metavuln-calculator@2.0.0':
+ resolution: {integrity: sha512-VVW+JhWCKRwCTE+0xvD6p3uV4WpqocNYYtzyvenqL/u1Q3Xx6fGTJ+6UoIoii07fbuEO9U3IIyuGY0CYHDv1sg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16}
+
+ '@npmcli/move-file@1.1.2':
+ resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==}
+ engines: {node: '>=10'}
+ deprecated: This functionality has been moved to @npmcli/fs
+
+ '@npmcli/move-file@2.0.1':
+ resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+ deprecated: This functionality has been moved to @npmcli/fs
+
+ '@npmcli/name-from-folder@1.0.1':
+ resolution: {integrity: sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==}
+
+ '@npmcli/node-gyp@1.0.3':
+ resolution: {integrity: sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==}
+
+ '@npmcli/node-gyp@3.0.0':
+ resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ '@npmcli/package-json@1.0.1':
+ resolution: {integrity: sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==}
+
+ '@npmcli/promise-spawn@1.3.2':
+ resolution: {integrity: sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==}
+
+ '@npmcli/promise-spawn@6.0.2':
+ resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ '@npmcli/run-script@2.0.0':
+ resolution: {integrity: sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==}
+
+ '@npmcli/run-script@6.0.2':
+ resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ '@oclif/core@3.18.1':
+ resolution: {integrity: sha512-l0LsjzGcqjbUEdeSBX6bdZieVmEv82Q0W3StiyaDMEnPZ9KLH28HrLpcZg6d50mCYW9CUZNzmRo6qrCHWrgLKw==}
+ engines: {node: '>=18.0.0'}
+
+ '@oclif/plugin-help@6.0.12':
+ resolution: {integrity: sha512-KMxQ5Oli1tkWiWNSdrjNtiFIFZvX0+IsvuuGcDwJIn1Jm+SzEQF90vkK6WzIjFACmyKIwXbGMmimcFaLrslJPQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@oclif/plugin-not-found@3.0.9':
+ resolution: {integrity: sha512-t/Cq8o6ENmMG0nPxeLDjtRsu4ZLKGCkNfev8XQ28Z+P1ntnP6uKpmKpvmmgatmqtX0IHuNrpv9scU3G4iAGp2w==}
+ engines: {node: '>=18.0.0'}
+
+ '@oclif/plugin-plugins@4.1.22':
+ resolution: {integrity: sha512-TKshx/QGSsLTZRA1Gplf/AV7VIF9L8mRVZsOC1r4voBkFBYZ9XJRy1PDcOMOu0WEbi7QvvXPtbDYXMw0I8WhlQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@oclif/plugin-warn-if-update-available@3.0.9':
+ resolution: {integrity: sha512-6XjYNJWWu6B4LyW73hzuM9Ihb23WamrABZhwYVJTVMBHdU30pRa1i3rvHCPfmn5c4iv8ZXudS/0zCNuhR121ng==}
+ engines: {node: '>=18.0.0'}
+
+ '@oclif/test@3.1.13':
+ resolution: {integrity: sha512-ztjXyoN4D2qUIhRPiWp8fdaSCZ8e3tZ0hGGXUPRk0tWzGVfii3R5tjaJpn804HEzRJjbuRDmSscvU7iMVUro1A==}
+ engines: {node: '>=18.0.0'}
+
+ '@octokit/auth-token@2.5.0':
+ resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==}
+
+ '@octokit/core@3.6.0':
+ resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==}
+
+ '@octokit/endpoint@6.0.12':
+ resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==}
+
+ '@octokit/graphql@4.8.0':
+ resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==}
+
+ '@octokit/openapi-types@12.11.0':
+ resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==}
+
+ '@octokit/plugin-paginate-rest@2.21.3':
+ resolution: {integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==}
+ peerDependencies:
+ '@octokit/core': '>=2'
+
+ '@octokit/plugin-request-log@1.0.4':
+ resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==}
+ peerDependencies:
+ '@octokit/core': '>=3'
+
+ '@octokit/plugin-rest-endpoint-methods@5.16.2':
+ resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==}
+ peerDependencies:
+ '@octokit/core': '>=3'
+
+ '@octokit/request-error@2.1.0':
+ resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==}
+
+ '@octokit/request@5.6.3':
+ resolution: {integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==}
+
+ '@octokit/rest@18.12.0':
+ resolution: {integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==}
+
+ '@octokit/types@6.41.0':
+ resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==}
+
+ '@pkgjs/parseargs@0.11.0':
+ resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+ engines: {node: '>=14'}
+
+ '@sigstore/bundle@1.1.0':
+ resolution: {integrity: sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ '@sigstore/protobuf-specs@0.2.1':
+ resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ '@sigstore/sign@1.0.0':
+ resolution: {integrity: sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ '@sigstore/tuf@1.0.3':
+ resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ '@sindresorhus/is@4.6.0':
+ resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
+ engines: {node: '>=10'}
+
+ '@sinonjs/commons@2.0.0':
+ resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==}
+
+ '@sinonjs/commons@3.0.1':
+ resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==}
+
+ '@sinonjs/fake-timers@10.3.0':
+ resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==}
+
+ '@sinonjs/fake-timers@11.2.2':
+ resolution: {integrity: sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==}
+
+ '@sinonjs/samsam@8.0.0':
+ resolution: {integrity: sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==}
+
+ '@sinonjs/text-encoding@0.7.2':
+ resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==}
+
+ '@smithy/abort-controller@2.1.1':
+ resolution: {integrity: sha512-1+qdrUqLhaALYL0iOcN43EP6yAXXQ2wWZ6taf4S2pNGowmOc5gx+iMQv+E42JizNJjB0+gEadOXeV1Bf7JWL1Q==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/chunked-blob-reader-native@2.1.1':
+ resolution: {integrity: sha512-zNW+43dltfNMUrBEYLMWgI8lQr0uhtTcUyxkgC9EP4j17WREzgSFMPUFVrVV6Rc2+QtWERYjb4tzZnQGa7R9fQ==}
+
+ '@smithy/chunked-blob-reader@2.1.1':
+ resolution: {integrity: sha512-NjNFCKxC4jVvn+lUr3Yo4/PmUJj3tbyqH6GNHueyTGS5Q27vlEJ1MkNhUDV8QGxJI7Bodnc2pD18lU2zRfhHlQ==}
+
+ '@smithy/config-resolver@2.1.1':
+ resolution: {integrity: sha512-lxfLDpZm+AWAHPFZps5JfDoO9Ux1764fOgvRUBpHIO8HWHcSN1dkgsago1qLRVgm1BZ8RCm8cgv99QvtaOWIhw==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/core@1.3.1':
+ resolution: {integrity: sha512-tf+NIu9FkOh312b6M9G4D68is4Xr7qptzaZGZUREELF8ysE1yLKphqt7nsomjKZVwW7WE5pDDex9idowNGRQ/Q==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/credential-provider-imds@2.2.1':
+ resolution: {integrity: sha512-7XHjZUxmZYnONheVQL7j5zvZXga+EWNgwEAP6OPZTi7l8J4JTeNh9aIOfE5fKHZ/ee2IeNOh54ZrSna+Vc6TFA==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/eventstream-codec@2.1.1':
+ resolution: {integrity: sha512-E8KYBxBIuU4c+zrpR22VsVrOPoEDzk35bQR3E+xm4k6Pa6JqzkDOdMyf9Atac5GPNKHJBdVaQ4JtjdWX2rl/nw==}
+
+ '@smithy/eventstream-serde-browser@2.1.1':
+ resolution: {integrity: sha512-JvEdCmGlZUay5VtlT8/kdR6FlvqTDUiJecMjXsBb0+k1H/qc9ME5n2XKPo8q/MZwEIA1GmGgYMokKGjVvMiDow==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/eventstream-serde-config-resolver@2.1.1':
+ resolution: {integrity: sha512-EqNqXYp3+dk//NmW3NAgQr9bEQ7fsu/CcxQmTiq07JlaIcne/CBWpMZETyXm9w5LXkhduBsdXdlMscfDUDn2fA==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/eventstream-serde-node@2.1.1':
+ resolution: {integrity: sha512-LF882q/aFidFNDX7uROAGxq3H0B7rjyPkV6QDn6/KDQ+CG7AFkRccjxRf1xqajq/Pe4bMGGr+VKAaoF6lELIQw==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/eventstream-serde-universal@2.1.1':
+ resolution: {integrity: sha512-LR0mMT+XIYTxk4k2fIxEA1BPtW3685QlqufUEUAX1AJcfFfxNDKEvuCRZbO8ntJb10DrIFVJR9vb0MhDCi0sAQ==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/fetch-http-handler@2.4.1':
+ resolution: {integrity: sha512-VYGLinPsFqH68lxfRhjQaSkjXM7JysUOJDTNjHBuN/ykyRb2f1gyavN9+VhhPTWCy32L4yZ2fdhpCs/nStEicg==}
+
+ '@smithy/hash-blob-browser@2.1.1':
+ resolution: {integrity: sha512-jizu1+2PAUjiGIfRtlPEU8Yo6zn+d78ti/ZHDesdf1SUn2BuZW433JlPoCOLH3dBoEEvTgLvQ8tUGSoTTALA+A==}
+
+ '@smithy/hash-node@2.1.1':
+ resolution: {integrity: sha512-Qhoq0N8f2OtCnvUpCf+g1vSyhYQrZjhSwvJ9qvR8BUGOtTXiyv2x1OD2e6jVGmlpC4E4ax1USHoyGfV9JFsACg==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/hash-stream-node@2.1.1':
+ resolution: {integrity: sha512-VgDaKcfCy0iHcmtAZgZ3Yw9g37Gkn2JsQiMtFQXUh8Wmo3GfNgDwLOtdhJ272pOT7DStzpe9cNr+eV5Au8KfQA==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/invalid-dependency@2.1.1':
+ resolution: {integrity: sha512-7WTgnKw+VPg8fxu2v9AlNOQ5yaz6RA54zOVB4f6vQuR0xFKd+RzlCpt0WidYTsye7F+FYDIaS/RnJW4pxjNInw==}
+
+ '@smithy/is-array-buffer@2.1.1':
+ resolution: {integrity: sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/md5-js@2.1.1':
+ resolution: {integrity: sha512-L3MbIYBIdLlT+MWTYrdVSv/dow1+6iZ1Ad7xS0OHxTTs17d753ZcpOV4Ro7M7tRAVWML/sg2IAp/zzCb6aAttg==}
+
+ '@smithy/middleware-content-length@2.1.1':
+ resolution: {integrity: sha512-rSr9ezUl9qMgiJR0UVtVOGEZElMdGFyl8FzWEF5iEKTlcWxGr2wTqGfDwtH3LAB7h+FPkxqv4ZU4cpuCN9Kf/g==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/middleware-endpoint@2.4.1':
+ resolution: {integrity: sha512-XPZTb1E2Oav60Ven3n2PFx+rX9EDsU/jSTA8VDamt7FXks67ekjPY/XrmmPDQaFJOTUHJNKjd8+kZxVO5Ael4Q==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/middleware-retry@2.1.1':
+ resolution: {integrity: sha512-eMIHOBTXro6JZ+WWzZWd/8fS8ht5nS5KDQjzhNMHNRcG5FkNTqcKpYhw7TETMYzbLfhO5FYghHy1vqDWM4FLDA==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/middleware-serde@2.1.1':
+ resolution: {integrity: sha512-D8Gq0aQBeE1pxf3cjWVkRr2W54t+cdM2zx78tNrVhqrDykRA7asq8yVJij1u5NDtKzKqzBSPYh7iW0svUKg76g==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/middleware-stack@2.1.1':
+ resolution: {integrity: sha512-KPJhRlhsl8CjgGXK/DoDcrFGfAqoqvuwlbxy+uOO4g2Azn1dhH+GVfC3RAp+6PoL5PWPb+vt6Z23FP+Mr6qeCw==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/node-config-provider@2.2.1':
+ resolution: {integrity: sha512-epzK3x1xNxA9oJgHQ5nz+2j6DsJKdHfieb+YgJ7ATWxzNcB7Hc+Uya2TUck5MicOPhDV8HZImND7ZOecVr+OWg==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/node-http-handler@2.3.1':
+ resolution: {integrity: sha512-gLA8qK2nL9J0Rk/WEZSvgin4AppvuCYRYg61dcUo/uKxvMZsMInL5I5ZdJTogOvdfVug3N2dgI5ffcUfS4S9PA==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/property-provider@2.1.1':
+ resolution: {integrity: sha512-FX7JhhD/o5HwSwg6GLK9zxrMUrGnb3PzNBrcthqHKBc3dH0UfgEAU24xnJ8F0uow5mj17UeBEOI6o3CF2k7Mhw==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/protocol-http@3.1.1':
+ resolution: {integrity: sha512-6ZRTSsaXuSL9++qEwH851hJjUA0OgXdQFCs+VDw4tGH256jQ3TjYY/i34N4vd24RV3nrjNsgd1yhb57uMoKbzQ==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/querystring-builder@2.1.1':
+ resolution: {integrity: sha512-C/ko/CeEa8jdYE4gt6nHO5XDrlSJ3vdCG0ZAc6nD5ZIE7LBp0jCx4qoqp7eoutBu7VrGMXERSRoPqwi1WjCPbg==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/querystring-parser@2.1.1':
+ resolution: {integrity: sha512-H4+6jKGVhG1W4CIxfBaSsbm98lOO88tpDWmZLgkJpt8Zkk/+uG0FmmqMuCAc3HNM2ZDV+JbErxr0l5BcuIf/XQ==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/service-error-classification@2.1.1':
+ resolution: {integrity: sha512-txEdZxPUgM1PwGvDvHzqhXisrc5LlRWYCf2yyHfvITWioAKat7srQvpjMAvgzf0t6t7j8yHrryXU9xt7RZqFpw==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/shared-ini-file-loader@2.3.1':
+ resolution: {integrity: sha512-2E2kh24igmIznHLB6H05Na4OgIEilRu0oQpYXo3LCNRrawHAcfDKq9004zJs+sAMt2X5AbY87CUCJ7IpqpSgdw==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/signature-v4@2.1.1':
+ resolution: {integrity: sha512-Hb7xub0NHuvvQD3YwDSdanBmYukoEkhqBjqoxo+bSdC0ryV9cTfgmNjuAQhTPYB6yeU7hTR+sPRiFMlxqv6kmg==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/smithy-client@2.3.1':
+ resolution: {integrity: sha512-YsTdU8xVD64r2pLEwmltrNvZV6XIAC50LN6ivDopdt+YiF/jGH6PY9zUOu0CXD/d8GMB8gbhnpPsdrjAXHS9QA==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/types@2.9.1':
+ resolution: {integrity: sha512-vjXlKNXyprDYDuJ7UW5iobdmyDm6g8dDG+BFUncAg/3XJaN45Gy5RWWWUVgrzIK7S4R1KWgIX5LeJcfvSI24bw==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/url-parser@2.1.1':
+ resolution: {integrity: sha512-qC9Bv8f/vvFIEkHsiNrUKYNl8uKQnn4BdhXl7VzQRP774AwIjiSMMwkbT+L7Fk8W8rzYVifzJNYxv1HwvfBo3Q==}
+
+ '@smithy/util-base64@2.1.1':
+ resolution: {integrity: sha512-UfHVpY7qfF/MrgndI5PexSKVTxSZIdz9InghTFa49QOvuu9I52zLPLUHXvHpNuMb1iD2vmc6R+zbv/bdMipR/g==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/util-body-length-browser@2.1.1':
+ resolution: {integrity: sha512-ekOGBLvs1VS2d1zM2ER4JEeBWAvIOUKeaFch29UjjJsxmZ/f0L3K3x0dEETgh3Q9bkZNHgT+rkdl/J/VUqSRag==}
+
+ '@smithy/util-body-length-node@2.2.1':
+ resolution: {integrity: sha512-/ggJG+ta3IDtpNVq4ktmEUtOkH1LW64RHB5B0hcr5ZaWBmo96UX2cIOVbjCqqDickTXqBWZ4ZO0APuaPrD7Abg==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/util-buffer-from@2.1.1':
+ resolution: {integrity: sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/util-config-provider@2.2.1':
+ resolution: {integrity: sha512-50VL/tx9oYYcjJn/qKqNy7sCtpD0+s8XEBamIFo4mFFTclKMNp+rsnymD796uybjiIquB7VCB/DeafduL0y2kw==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/util-defaults-mode-browser@2.1.1':
+ resolution: {integrity: sha512-lqLz/9aWRO6mosnXkArtRuQqqZBhNpgI65YDpww4rVQBuUT7qzKbDLG5AmnQTCiU4rOquaZO/Kt0J7q9Uic7MA==}
+ engines: {node: '>= 10.0.0'}
+
+ '@smithy/util-defaults-mode-node@2.1.1':
+ resolution: {integrity: sha512-tYVrc+w+jSBfBd267KDnvSGOh4NMz+wVH7v4CClDbkdPfnjvImBZsOURncT5jsFwR9KCuDyPoSZq4Pa6+eCUrA==}
+ engines: {node: '>= 10.0.0'}
+
+ '@smithy/util-endpoints@1.1.1':
+ resolution: {integrity: sha512-sI4d9rjoaekSGEtq3xSb2nMjHMx8QXcz2cexnVyRWsy4yQ9z3kbDpX+7fN0jnbdOp0b3KSTZJZ2Yb92JWSanLw==}
+ engines: {node: '>= 14.0.0'}
+
+ '@smithy/util-hex-encoding@2.1.1':
+ resolution: {integrity: sha512-3UNdP2pkYUUBGEXzQI9ODTDK+Tcu1BlCyDBaRHwyxhA+8xLP8agEKQq4MGmpjqb4VQAjq9TwlCQX0kP6XDKYLg==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/util-middleware@2.1.1':
+ resolution: {integrity: sha512-mKNrk8oz5zqkNcbcgAAepeJbmfUW6ogrT2Z2gDbIUzVzNAHKJQTYmH9jcy0jbWb+m7ubrvXKb6uMjkSgAqqsFA==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/util-retry@2.1.1':
+ resolution: {integrity: sha512-Mg+xxWPTeSPrthpC5WAamJ6PW4Kbo01Fm7lWM1jmGRvmrRdsd3192Gz2fBXAMURyXpaNxyZf6Hr/nQ4q70oVEA==}
+ engines: {node: '>= 14.0.0'}
+
+ '@smithy/util-stream@2.1.1':
+ resolution: {integrity: sha512-J7SMIpUYvU4DQN55KmBtvaMc7NM3CZ2iWICdcgaovtLzseVhAqFRYqloT3mh0esrFw+3VEK6nQFteFsTqZSECQ==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/util-uri-escape@2.1.1':
+ resolution: {integrity: sha512-saVzI1h6iRBUVSqtnlOnc9ssU09ypo7n+shdQ8hBTZno/9rZ3AuRYvoHInV57VF7Qn7B+pFJG7qTzFiHxWlWBw==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/util-utf8@2.1.1':
+ resolution: {integrity: sha512-BqTpzYEcUMDwAKr7/mVRUtHDhs6ZoXDi9NypMvMfOr/+u1NW7JgqodPDECiiLboEm6bobcPcECxzjtQh865e9A==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/util-waiter@2.1.1':
+ resolution: {integrity: sha512-kYy6BLJJNif+uqNENtJqWdXcpqo1LS+nj1AfXcDhOpqpSHJSAkVySLyZV9fkmuVO21lzGoxjvd1imGGJHph/IA==}
+ engines: {node: '>=14.0.0'}
+
+ '@szmarczak/http-timer@4.0.6':
+ resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
+ engines: {node: '>=10'}
+
+ '@tootallnate/once@1.1.2':
+ resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==}
+ engines: {node: '>= 6'}
+
+ '@tootallnate/once@2.0.0':
+ resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
+ engines: {node: '>= 10'}
+
+ '@tsconfig/node10@1.0.9':
+ resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==}
+
+ '@tsconfig/node12@1.0.11':
+ resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
+
+ '@tsconfig/node14@1.0.3':
+ resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
+
+ '@tsconfig/node16@1.0.4':
+ resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
+
+ '@tufjs/canonical-json@1.0.0':
+ resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ '@tufjs/models@1.0.4':
+ resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ '@types/cacheable-request@6.0.3':
+ resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==}
+
+ '@types/chai@4.3.11':
+ resolution: {integrity: sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==}
+
+ '@types/cli-progress@3.11.5':
+ resolution: {integrity: sha512-D4PbNRbviKyppS5ivBGyFO29POlySLmA2HyUFE4p5QGazAMM3CwkKWcvTl8gvElSuxRh6FPKL8XmidX873ou4g==}
+
+ '@types/expect@1.20.4':
+ resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==}
+
+ '@types/geojson@7946.0.14':
+ resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==}
+
+ '@types/http-cache-semantics@4.0.4':
+ resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/json5@0.0.29':
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+
+ '@types/keyv@3.1.4':
+ resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
+
+ '@types/lodash@4.14.202':
+ resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==}
+
+ '@types/minimatch@3.0.5':
+ resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==}
+
+ '@types/mocha@10.0.6':
+ resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==}
+
+ '@types/node@15.14.9':
+ resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==}
+
+ '@types/node@20.11.10':
+ resolution: {integrity: sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg==}
+
+ '@types/normalize-package-data@2.4.4':
+ resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
+
+ '@types/responselike@1.0.3':
+ resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==}
+
+ '@types/semver@7.5.6':
+ resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==}
+
+ '@types/sinon@17.0.3':
+ resolution: {integrity: sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==}
+
+ '@types/sinonjs__fake-timers@8.1.5':
+ resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==}
+
+ '@types/vinyl@2.0.11':
+ resolution: {integrity: sha512-vPXzCLmRp74e9LsP8oltnWKTH+jBwt86WgRUb4Pc9Lf3pkMVGyvIo2gm9bODeGfCay2DBB/hAWDuvf07JcK4rw==}
+
+ '@typescript-eslint/eslint-plugin@6.20.0':
+ resolution: {integrity: sha512-fTwGQUnjhoYHeSF6m5pWNkzmDDdsKELYrOBxhjMrofPqCkoC2k3B2wvGHFxa1CTIqkEn88nlW1HVMztjo2K8Hg==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
+ eslint: ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/parser@6.20.0':
+ resolution: {integrity: sha512-bYerPDF/H5v6V76MdMYhjwmwgMA+jlPVqjSDq2cRqMi8bP5sR3Z+RLOiOMad3nsnmDVmn2gAFCyNgh/dIrfP/w==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ peerDependencies:
+ eslint: ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/scope-manager@6.20.0':
+ resolution: {integrity: sha512-p4rvHQRDTI1tGGMDFQm+GtxP1ZHyAh64WANVoyEcNMpaTFn3ox/3CcgtIlELnRfKzSs/DwYlDccJEtr3O6qBvA==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+
+ '@typescript-eslint/type-utils@6.20.0':
+ resolution: {integrity: sha512-qnSobiJQb1F5JjN0YDRPHruQTrX7ICsmltXhkV536mp4idGAYrIyr47zF/JmkJtEcAVnIz4gUYJ7gOZa6SmN4g==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ peerDependencies:
+ eslint: ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/types@6.20.0':
+ resolution: {integrity: sha512-MM9mfZMAhiN4cOEcUOEx+0HmuaW3WBfukBZPCfwSqFnQy0grXYtngKCqpQN339X3RrwtzspWJrpbrupKYUSBXQ==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+
+ '@typescript-eslint/typescript-estree@6.20.0':
+ resolution: {integrity: sha512-RnRya9q5m6YYSpBN7IzKu9FmLcYtErkDkc8/dKv81I9QiLLtVBHrjz+Ev/crAqgMNW2FCsoZF4g2QUylMnJz+g==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/utils@6.20.0':
+ resolution: {integrity: sha512-/EKuw+kRu2vAqCoDwDCBtDRU6CTKbUmwwI7SH7AashZ+W+7o8eiyy6V2cdOqN49KsTcASWsC5QeghYuRDTyOOg==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ peerDependencies:
+ eslint: ^7.0.0 || ^8.0.0
+
+ '@typescript-eslint/visitor-keys@6.20.0':
+ resolution: {integrity: sha512-E8Cp98kRe4gKHjJD4NExXKz/zOJ1A2hhZc+IMVD6i7w4yjIvh6VyuRI0gRtxAsXtoC35uGMaQ9rjI2zJaXDEAw==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+
+ '@ungap/structured-clone@1.2.0':
+ resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
+
+ '@vue/compiler-core@3.5.3':
+ resolution: {integrity: sha512-adAfy9boPkP233NTyvLbGEqVuIfK/R0ZsBsIOW4BZNfb4BRpRW41Do1u+ozJpsb+mdoy80O20IzAsHaihRb5qA==}
+
+ '@vue/compiler-dom@3.5.3':
+ resolution: {integrity: sha512-wnzFArg9zpvk/811CDOZOadJRugf1Bgl/TQ3RfV4nKfSPok4hi0w10ziYUQR6LnnBAUlEXYLUfZ71Oj9ds/+QA==}
+
+ '@vue/compiler-sfc@3.5.3':
+ resolution: {integrity: sha512-P3uATLny2tfyvMB04OQFe7Sczteno7SLFxwrOA/dw01pBWQHB5HL15a8PosoNX2aG/EAMGqnXTu+1LnmzFhpTQ==}
+
+ '@vue/compiler-ssr@3.5.3':
+ resolution: {integrity: sha512-F/5f+r2WzL/2YAPl7UlKcJWHrvoZN8XwEBLnT7S4BXwncH25iDOabhO2M2DWioyTguJAGavDOawejkFXj8EM1w==}
+
+ '@vue/reactivity@3.5.3':
+ resolution: {integrity: sha512-2w61UnRWTP7+rj1H/j6FH706gRBHdFVpIqEkSDAyIpafBXYH8xt4gttstbbCWdU3OlcSWO8/3mbKl/93/HSMpw==}
+
+ '@vue/runtime-core@3.5.3':
+ resolution: {integrity: sha512-5b2AQw5OZlmCzSsSBWYoZOsy75N4UdMWenTfDdI5bAzXnuVR7iR8Q4AOzQm2OGoA41xjk53VQKrqQhOz2ktWaw==}
+
+ '@vue/runtime-dom@3.5.3':
+ resolution: {integrity: sha512-wPR1DEGc3XnQ7yHbmkTt3GoY0cEnVGQnARRdAkDzZ8MbUKEs26gogCQo6AOvvgahfjIcnvWJzkZArQ1fmWjcSg==}
+
+ '@vue/server-renderer@3.5.3':
+ resolution: {integrity: sha512-28volmaZVG2PGO3V3+gBPKoSHvLlE8FGfG/GKXKkjjfxLuj/50B/0OQGakM/g6ehQeqCrZYM4eHC4Ks48eig1Q==}
+ peerDependencies:
+ vue: 3.5.3
+
+ '@vue/shared@3.5.3':
+ resolution: {integrity: sha512-Jp2v8nylKBT+PlOUjun2Wp/f++TfJVFjshLzNtJDdmFJabJa7noGMncqXRM1vXGX+Yo2V7WykQFNxusSim8SCA==}
+
+ abbrev@1.1.1:
+ resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
+
+ abort-controller@3.0.0:
+ resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
+ engines: {node: '>=6.5'}
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn-walk@8.3.2:
+ resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==}
+ engines: {node: '>=0.4.0'}
+
+ acorn@8.11.3:
+ resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ agent-base@6.0.2:
+ resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
+ engines: {node: '>= 6.0.0'}
+
+ agentkeepalive@4.5.0:
+ resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==}
+ engines: {node: '>= 8.0.0'}
+
+ aggregate-error@3.1.0:
+ resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
+ engines: {node: '>=8'}
+
+ ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+
+ ansi-colors@4.1.1:
+ resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==}
+ engines: {node: '>=6'}
+
+ ansi-escapes@4.3.2:
+ resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@6.0.1:
+ resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
+ engines: {node: '>=12'}
+
+ ansi-styles@3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ ansi-styles@6.2.1:
+ resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+ engines: {node: '>=12'}
+
+ ansicolors@0.3.2:
+ resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==}
+
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
+ aproba@2.0.0:
+ resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==}
+
+ are-we-there-yet@2.0.0:
+ resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==}
+ engines: {node: '>=10'}
+
+ are-we-there-yet@3.0.1:
+ resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ arg@4.1.3:
+ resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
+
+ argparse@1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ array-buffer-byte-length@1.0.0:
+ resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
+
+ array-differ@3.0.0:
+ resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==}
+ engines: {node: '>=8'}
+
+ array-includes@3.1.7:
+ resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==}
+ engines: {node: '>= 0.4'}
+
+ array-union@2.1.0:
+ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+ engines: {node: '>=8'}
+
+ array.prototype.findlastindex@1.2.3:
+ resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.flat@1.3.2:
+ resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.flatmap@1.3.2:
+ resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==}
+ engines: {node: '>= 0.4'}
+
+ arraybuffer.prototype.slice@1.0.2:
+ resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==}
+ engines: {node: '>= 0.4'}
+
+ arrify@2.0.1:
+ resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==}
+ engines: {node: '>=8'}
+
+ asap@2.0.6:
+ resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
+
+ assertion-error@1.1.0:
+ resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
+
+ assertion-error@2.0.1:
+ resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
+ engines: {node: '>=12'}
+
+ astral-regex@2.0.0:
+ resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
+ engines: {node: '>=8'}
+
+ async-retry@1.3.3:
+ resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==}
+
+ async@3.2.5:
+ resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==}
+
+ available-typed-arrays@1.0.5:
+ resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
+ engines: {node: '>= 0.4'}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ before-after-hook@2.2.3:
+ resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==}
+
+ bin-links@3.0.3:
+ resolution: {integrity: sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ binary-extensions@2.2.0:
+ resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
+ engines: {node: '>=8'}
+
+ binaryextensions@4.19.0:
+ resolution: {integrity: sha512-DRxnVbOi/1OgA5pA9EDiRT8gvVYeqfuN7TmPfLyt6cyho3KbHCi3EtDQf39TTmGDrR5dZ9CspdXhPkL/j/WGbg==}
+ engines: {node: '>=0.8'}
+
+ bl@4.1.0:
+ resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+
+ bottleneck@2.19.5:
+ resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==}
+
+ bowser@2.11.0:
+ resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==}
+
+ brace-expansion@1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+
+ brace-expansion@2.0.1:
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+
+ braces@3.0.2:
+ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+ engines: {node: '>=8'}
+
+ browser-stdout@1.3.1:
+ resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==}
+
+ buffer@5.7.1:
+ resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+
+ buffer@6.0.3:
+ resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+
+ builtin-modules@3.3.0:
+ resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
+ engines: {node: '>=6'}
+
+ builtins@1.0.3:
+ resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==}
+
+ builtins@5.0.1:
+ resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==}
+
+ cacache@15.3.0:
+ resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==}
+ engines: {node: '>= 10'}
+
+ cacache@16.1.3:
+ resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ cacache@17.1.4:
+ resolution: {integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ cacheable-lookup@5.0.4:
+ resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==}
+ engines: {node: '>=10.6.0'}
+
+ cacheable-request@7.0.4:
+ resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==}
+ engines: {node: '>=8'}
+
+ call-bind@1.0.5:
+ resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ camel-case@4.1.2:
+ resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
+
+ camelcase@6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+
+ capital-case@1.0.4:
+ resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==}
+
+ cardinal@2.1.1:
+ resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==}
+ hasBin: true
+
+ chai@4.4.1:
+ resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==}
+ engines: {node: '>=4'}
+
+ chai@5.0.3:
+ resolution: {integrity: sha512-wKGCtYv2kVY5WEjKqQ3fSIZWtTFveZCtzinhTZbx3/trVkxefiwovhpU9kRVCwxvKKCEjTWXPdM1/T7zPoDgow==}
+ engines: {node: '>=12'}
+
+ chalk@2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ chalk@5.3.0:
+ resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+ change-case@4.1.2:
+ resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==}
+
+ chardet@0.7.0:
+ resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
+
+ check-error@1.0.3:
+ resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
+
+ check-error@2.0.0:
+ resolution: {integrity: sha512-tjLAOBHKVxtPoHe/SA7kNOMvhCRdCJ3vETdeY0RuAc9popf+hyaSV6ZEg9hr4cpWF7jmo/JSWEnLDrnijS9Tog==}
+ engines: {node: '>= 16'}
+
+ chokidar@3.5.3:
+ resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
+ engines: {node: '>= 8.10.0'}
+
+ chownr@2.0.0:
+ resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
+ engines: {node: '>=10'}
+
+ ci-info@3.9.0:
+ resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
+ engines: {node: '>=8'}
+
+ citty@0.1.5:
+ resolution: {integrity: sha512-AS7n5NSc0OQVMV9v6wt3ByujNIrne0/cTjiC2MYqhvao57VNfiuVksTSr2p17nVOhEr2KtqiAkGwHcgMC/qUuQ==}
+
+ clean-regexp@1.0.0:
+ resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==}
+ engines: {node: '>=4'}
+
+ clean-stack@2.2.0:
+ resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
+ engines: {node: '>=6'}
+
+ clean-stack@3.0.1:
+ resolution: {integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==}
+ engines: {node: '>=10'}
+
+ cli-cursor@3.1.0:
+ resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+ engines: {node: '>=8'}
+
+ cli-progress@3.12.0:
+ resolution: {integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==}
+ engines: {node: '>=4'}
+
+ cli-spinners@2.9.2:
+ resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+ engines: {node: '>=6'}
+
+ cli-table@0.3.11:
+ resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==}
+ engines: {node: '>= 0.2.0'}
+
+ cli-width@3.0.0:
+ resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==}
+ engines: {node: '>= 10'}
+
+ cliui@7.0.4:
+ resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
+
+ clone-buffer@1.0.0:
+ resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==}
+ engines: {node: '>= 0.10'}
+
+ clone-response@1.0.3:
+ resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==}
+
+ clone-stats@1.0.0:
+ resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==}
+
+ clone@1.0.4:
+ resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+ engines: {node: '>=0.8'}
+
+ clone@2.1.2:
+ resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
+ engines: {node: '>=0.8'}
+
+ cloneable-readable@1.1.3:
+ resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==}
+
+ cmd-shim@5.0.0:
+ resolution: {integrity: sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ color-convert@1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ color-string@1.9.1:
+ resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+
+ color-support@1.1.3:
+ resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==}
+ hasBin: true
+
+ color@4.2.3:
+ resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
+ engines: {node: '>=12.5.0'}
+
+ colorette@2.0.19:
+ resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==}
+
+ colors@1.0.3:
+ resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==}
+ engines: {node: '>=0.1.90'}
+
+ commander@10.0.1:
+ resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
+ engines: {node: '>=14'}
+
+ commander@7.1.0:
+ resolution: {integrity: sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==}
+ engines: {node: '>= 10'}
+
+ common-ancestor-path@1.0.1:
+ resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==}
+
+ commondir@1.0.1:
+ resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ confusing-browser-globals@1.0.11:
+ resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==}
+
+ consola@3.2.3:
+ resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==}
+ engines: {node: ^14.18.0 || >=16.10.0}
+
+ console-control-strings@1.1.0:
+ resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==}
+
+ constant-case@3.0.4:
+ resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==}
+
+ content-type@1.0.5:
+ resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+ engines: {node: '>= 0.6'}
+
+ core-util-is@1.0.3:
+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+
+ create-require@1.1.1:
+ resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
+
+ cross-spawn@7.0.3:
+ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+ engines: {node: '>= 8'}
+
+ csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ dargs@7.0.0:
+ resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==}
+ engines: {node: '>=8'}
+
+ dateformat@4.6.3:
+ resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==}
+
+ debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.3.4:
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.3.7:
+ resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debuglog@1.0.1:
+ resolution: {integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==}
+ deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
+
+ decamelize@4.0.0:
+ resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==}
+ engines: {node: '>=10'}
+
+ decompress-response@6.0.0:
+ resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
+ engines: {node: '>=10'}
+
+ deep-eql@4.1.3:
+ resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==}
+ engines: {node: '>=6'}
+
+ deep-eql@5.0.1:
+ resolution: {integrity: sha512-nwQCf6ne2gez3o1MxWifqkciwt0zhl0LO1/UwVu4uMBuPmflWM4oQ70XMqHqnBJA+nhzncaqL9HVL6KkHJ28lw==}
+ engines: {node: '>=6'}
+
+ deep-extend@0.6.0:
+ resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
+ engines: {node: '>=4.0.0'}
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+ defaults@1.0.4:
+ resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+
+ defer-to-connect@2.0.1:
+ resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==}
+ engines: {node: '>=10'}
+
+ define-data-property@1.1.1:
+ resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==}
+ engines: {node: '>= 0.4'}
+
+ define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+ engines: {node: '>= 0.4'}
+
+ defu@6.1.4:
+ resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
+
+ delegates@1.0.0:
+ resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==}
+
+ deprecation@2.3.1:
+ resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==}
+
+ dezalgo@1.0.4:
+ resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==}
+
+ diff@4.0.2:
+ resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
+ engines: {node: '>=0.3.1'}
+
+ diff@5.0.0:
+ resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==}
+ engines: {node: '>=0.3.1'}
+
+ diff@5.1.0:
+ resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==}
+ engines: {node: '>=0.3.1'}
+
+ dir-glob@3.0.1:
+ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+ engines: {node: '>=8'}
+
+ doctrine@2.1.0:
+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+ engines: {node: '>=0.10.0'}
+
+ doctrine@3.0.0:
+ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+ engines: {node: '>=6.0.0'}
+
+ dot-case@3.0.4:
+ resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+
+ dotenv@16.4.1:
+ resolution: {integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==}
+ engines: {node: '>=12'}
+
+ eastasianwidth@0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+ ejs@3.1.9:
+ resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==}
+ engines: {node: '>=0.10.0'}
+ hasBin: true
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+ encoding@0.1.13:
+ resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==}
+
+ end-of-stream@1.4.4:
+ resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+
+ enhanced-resolve@5.15.0:
+ resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==}
+ engines: {node: '>=10.13.0'}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ env-paths@2.2.1:
+ resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
+ engines: {node: '>=6'}
+
+ err-code@2.0.3:
+ resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==}
+
+ error-ex@1.3.2:
+ resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+
+ error@10.4.0:
+ resolution: {integrity: sha512-YxIFEJuhgcICugOUvRx5th0UM+ActZ9sjY0QJmeVwsQdvosZ7kYzc9QqS0Da3R5iUmgU5meGIxh0xBeZpMVeLw==}
+
+ es-abstract@1.22.3:
+ resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==}
+ engines: {node: '>= 0.4'}
+
+ es-set-tostringtag@2.0.2:
+ resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==}
+ engines: {node: '>= 0.4'}
+
+ es-shim-unscopables@1.0.2:
+ resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==}
+
+ es-to-primitive@1.2.1:
+ resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
+ engines: {node: '>= 0.4'}
+
+ escalade@3.1.1:
+ resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
+ engines: {node: '>=6'}
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ eslint-config-oclif-typescript@3.0.41:
+ resolution: {integrity: sha512-Uob8wLoJ7d7m156WEia65lk+hQUAOZkXWDO6QVP3pqYoB+CO+MVTWZvprsdWv7mxFSG9OVaOOLycQatjYy0Lmg==}
+ engines: {node: '>=18.0.0'}
+
+ eslint-config-oclif@5.0.0:
+ resolution: {integrity: sha512-yPxtUzU6eFL+WoW8DbRf7uoHxgiu0B/uY7k7rgHwFHij66WoI3qhBNhKI5R5FS5JeTuBOXKrNqQVDsSH0D/JvA==}
+ engines: {node: '>=18.0.0'}
+
+ eslint-config-xo-space@0.34.0:
+ resolution: {integrity: sha512-8ZI0Ta/loUIL1Wk/ouWvk2ZWN8X6Un49MqnBf2b6uMjC9c5Pcfr1OivEOrvd3niD6BKgMNH2Q9nG0CcCWC+iVA==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ eslint: '>=8.27.0'
+
+ eslint-config-xo@0.43.1:
+ resolution: {integrity: sha512-azv1L2PysRA0NkZOgbndUpN+581L7wPqkgJOgxxw3hxwXAbJgD6Hqb/SjHRiACifXt/AvxCzE/jIKFAlI7XjvQ==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ eslint: '>=8.27.0'
+
+ eslint-import-resolver-node@0.3.9:
+ resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
+
+ eslint-import-resolver-typescript@3.6.1:
+ resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ eslint-plugin-import: '*'
+
+ eslint-module-utils@2.8.0:
+ resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: '*'
+ eslint-import-resolver-node: '*'
+ eslint-import-resolver-typescript: '*'
+ eslint-import-resolver-webpack: '*'
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ eslint:
+ optional: true
+ eslint-import-resolver-node:
+ optional: true
+ eslint-import-resolver-typescript:
+ optional: true
+ eslint-import-resolver-webpack:
+ optional: true
+
+ eslint-plugin-es@3.0.1:
+ resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==}
+ engines: {node: '>=8.10.0'}
+ peerDependencies:
+ eslint: '>=4.19.1'
+
+ eslint-plugin-import@2.29.1:
+ resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+
+ eslint-plugin-mocha@10.2.0:
+ resolution: {integrity: sha512-ZhdxzSZnd1P9LqDPF0DBcFLpRIGdh1zkF2JHnQklKQOvrQtT73kdP5K9V2mzvbLR+cCAO9OI48NXK/Ax9/ciCQ==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ eslint: '>=7.0.0'
+
+ eslint-plugin-node@11.1.0:
+ resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==}
+ engines: {node: '>=8.10.0'}
+ peerDependencies:
+ eslint: '>=5.16.0'
+
+ eslint-plugin-perfectionist@2.5.0:
+ resolution: {integrity: sha512-F6XXcq4mKKUe/SREoMGQqzgw6cgCgf3pFzkFfQVIGtqD1yXVpQjnhTepzhBeZfxZwgMzR9HO4yH4CUhIQ2WBcQ==}
+ peerDependencies:
+ astro-eslint-parser: ^0.16.0
+ eslint: '>=8.0.0'
+ svelte: '>=3.0.0'
+ svelte-eslint-parser: ^0.33.0
+ vue-eslint-parser: '>=9.0.0'
+ peerDependenciesMeta:
+ astro-eslint-parser:
+ optional: true
+ svelte:
+ optional: true
+ svelte-eslint-parser:
+ optional: true
+ vue-eslint-parser:
+ optional: true
+
+ eslint-plugin-unicorn@48.0.1:
+ resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ eslint: '>=8.44.0'
+
+ eslint-scope@7.2.2:
+ resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-utils@2.1.0:
+ resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==}
+ engines: {node: '>=6'}
+
+ eslint-utils@3.0.0:
+ resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
+ engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
+ peerDependencies:
+ eslint: '>=5'
+
+ eslint-visitor-keys@1.3.0:
+ resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==}
+ engines: {node: '>=4'}
+
+ eslint-visitor-keys@2.1.0:
+ resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
+ engines: {node: '>=10'}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint@8.56.0:
+ resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ hasBin: true
+
+ esm@3.2.25:
+ resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==}
+ engines: {node: '>=6'}
+
+ espree@9.6.1:
+ resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ esquery@1.5.0:
+ resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ event-target-shim@5.0.1:
+ resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
+ engines: {node: '>=6'}
+
+ eventemitter3@4.0.7:
+ resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
+
+ events@3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+
+ execa@5.1.1:
+ resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+ engines: {node: '>=10'}
+
+ execa@8.0.1:
+ resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
+ engines: {node: '>=16.17'}
+
+ exponential-backoff@3.1.1:
+ resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==}
+
+ external-editor@3.1.0:
+ resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
+ engines: {node: '>=4'}
+
+ fancy-test@3.0.9:
+ resolution: {integrity: sha512-9sDjNM5oRLpIQfpjSSmp8J0bYCg1Hb9GWofdv+Dl5f/Phjp2XJZM7L2qsSulpMTsahz0EPsS6T6/QH0ldzfgqw==}
+ engines: {node: '>=18.0.0'}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-glob@3.3.2:
+ resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
+ engines: {node: '>=8.6.0'}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fast-levenshtein@3.0.0:
+ resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==}
+
+ fast-xml-parser@4.2.5:
+ resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==}
+ hasBin: true
+
+ fastest-levenshtein@1.0.16:
+ resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==}
+ engines: {node: '>= 4.9.1'}
+
+ fastq@1.17.0:
+ resolution: {integrity: sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==}
+
+ figures@3.2.0:
+ resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
+ engines: {node: '>=8'}
+
+ file-entry-cache@6.0.1:
+ resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+
+ filelist@1.0.4:
+ resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
+
+ fill-range@7.0.1:
+ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+ engines: {node: '>=8'}
+
+ find-up@4.1.0:
+ resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+ engines: {node: '>=8'}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ find-yarn-workspace-root2@1.2.16:
+ resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==}
+
+ find-yarn-workspace-root@2.0.0:
+ resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==}
+
+ first-chunk-stream@2.0.0:
+ resolution: {integrity: sha512-X8Z+b/0L4lToKYq+lwnKqi9X/Zek0NibLpsJgVsSxpoYq7JtiCtRb5HqKVEjEw/qAb/4AKKRLOwwKHlWNpm2Eg==}
+ engines: {node: '>=0.10.0'}
+
+ flat-cache@3.2.0:
+ resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+
+ flat@5.0.2:
+ resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
+ hasBin: true
+
+ flatted@3.2.9:
+ resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==}
+
+ for-each@0.3.3:
+ resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+
+ foreground-child@3.1.1:
+ resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==}
+ engines: {node: '>=14'}
+
+ formdata-node@6.0.3:
+ resolution: {integrity: sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==}
+ engines: {node: '>= 18'}
+
+ fs-extra@8.1.0:
+ resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==}
+ engines: {node: '>=6 <7 || >=8'}
+
+ fs-minipass@2.1.0:
+ resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
+ engines: {node: '>= 8'}
+
+ fs-minipass@3.0.3:
+ resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ function.prototype.name@1.1.6:
+ resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
+ engines: {node: '>= 0.4'}
+
+ functions-have-names@1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+ gauge@3.0.2:
+ resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==}
+ engines: {node: '>=10'}
+
+ gauge@4.0.4:
+ resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
+ get-func-name@2.0.2:
+ resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
+
+ get-intrinsic@1.2.2:
+ resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==}
+
+ get-package-type@0.1.0:
+ resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
+ engines: {node: '>=8.0.0'}
+
+ get-stream@5.2.0:
+ resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
+ engines: {node: '>=8'}
+
+ get-stream@6.0.1:
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ engines: {node: '>=10'}
+
+ get-stream@8.0.1:
+ resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
+ engines: {node: '>=16'}
+
+ get-symbol-description@1.0.0:
+ resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
+ engines: {node: '>= 0.4'}
+
+ get-tsconfig@4.7.2:
+ resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==}
+
+ getopts@2.3.0:
+ resolution: {integrity: sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==}
+
+ giget@1.2.1:
+ resolution: {integrity: sha512-4VG22mopWtIeHwogGSy1FViXVo0YT+m6BrqZfz0JJFwbSsePsCdOzdLIIli5BtMp7Xe8f/o2OmBpQX2NBOC24g==}
+ hasBin: true
+
+ github-slugger@1.5.0:
+ resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==}
+
+ github-username@6.0.0:
+ resolution: {integrity: sha512-7TTrRjxblSI5l6adk9zd+cV5d6i1OrJSo3Vr9xdGqFLBQo0mz5P9eIfKCDJ7eekVGGFLbce0qbPSnktXV2BjDQ==}
+ engines: {node: '>=10'}
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ glob@10.3.10:
+ resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ hasBin: true
+
+ glob@7.2.0:
+ resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==}
+
+ glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+
+ glob@8.1.0:
+ resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
+ engines: {node: '>=12'}
+
+ globals@13.24.0:
+ resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
+ engines: {node: '>=8'}
+
+ globalthis@1.0.3:
+ resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==}
+ engines: {node: '>= 0.4'}
+
+ globby@11.1.0:
+ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+ engines: {node: '>=10'}
+
+ gopd@1.0.1:
+ resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
+
+ got@11.8.6:
+ resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==}
+ engines: {node: '>=10.19.0'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+
+ grouped-queue@2.0.0:
+ resolution: {integrity: sha512-/PiFUa7WIsl48dUeCvhIHnwNmAAzlI/eHoJl0vu3nsFA366JleY7Ff8EVTplZu5kO0MIdZjKTTnzItL61ahbnw==}
+ engines: {node: '>=8.0.0'}
+
+ has-bigints@1.0.2:
+ resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
+
+ has-flag@3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ has-property-descriptors@1.0.1:
+ resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==}
+
+ has-proto@1.0.1:
+ resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
+ engines: {node: '>= 0.4'}
+
+ has-symbols@1.0.3:
+ resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
+ engines: {node: '>= 0.4'}
+
+ has-tostringtag@1.0.0:
+ resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
+ engines: {node: '>= 0.4'}
+
+ has-unicode@2.0.1:
+ resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==}
+
+ hasown@2.0.0:
+ resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==}
+ engines: {node: '>= 0.4'}
+
+ he@1.2.0:
+ resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+ hasBin: true
+
+ header-case@2.0.4:
+ resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==}
+
+ hosted-git-info@2.8.9:
+ resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
+
+ hosted-git-info@4.1.0:
+ resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==}
+ engines: {node: '>=10'}
+
+ hosted-git-info@6.1.1:
+ resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ http-cache-semantics@4.1.1:
+ resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
+
+ http-call@5.3.0:
+ resolution: {integrity: sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==}
+ engines: {node: '>=8.0.0'}
+
+ http-proxy-agent@4.0.1:
+ resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==}
+ engines: {node: '>= 6'}
+
+ http-proxy-agent@5.0.0:
+ resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
+ engines: {node: '>= 6'}
+
+ http2-wrapper@1.0.3:
+ resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==}
+ engines: {node: '>=10.19.0'}
+
+ https-proxy-agent@5.0.1:
+ resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
+ engines: {node: '>= 6'}
+
+ human-signals@2.1.0:
+ resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+ engines: {node: '>=10.17.0'}
+
+ human-signals@5.0.0:
+ resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
+ engines: {node: '>=16.17.0'}
+
+ humanize-ms@1.2.1:
+ resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
+
+ hyperlinker@1.0.0:
+ resolution: {integrity: sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==}
+ engines: {node: '>=4'}
+
+ iconv-lite@0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+
+ iconv-lite@0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+
+ ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+ ignore-walk@4.0.1:
+ resolution: {integrity: sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==}
+ engines: {node: '>=10'}
+
+ ignore-walk@6.0.4:
+ resolution: {integrity: sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ ignore@5.3.0:
+ resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==}
+ engines: {node: '>= 4'}
+
+ import-fresh@3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ indent-string@4.0.0:
+ resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
+ engines: {node: '>=8'}
+
+ infer-owner@1.0.4:
+ resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==}
+
+ inflight@1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ inquirer@8.2.6:
+ resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==}
+ engines: {node: '>=12.0.0'}
+
+ internal-slot@1.0.6:
+ resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==}
+ engines: {node: '>= 0.4'}
+
+ interpret@1.4.0:
+ resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==}
+ engines: {node: '>= 0.10'}
+
+ interpret@2.2.0:
+ resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==}
+ engines: {node: '>= 0.10'}
+
+ ip@2.0.0:
+ resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==}
+
+ is-array-buffer@3.0.2:
+ resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==}
+
+ is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ is-arrayish@0.3.2:
+ resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
+
+ is-bigint@1.0.4:
+ resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
+
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
+ is-boolean-object@1.1.2:
+ resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
+ engines: {node: '>= 0.4'}
+
+ is-builtin-module@3.2.1:
+ resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
+ engines: {node: '>=6'}
+
+ is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+
+ is-core-module@2.13.1:
+ resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
+
+ is-date-object@1.0.5:
+ resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
+ engines: {node: '>= 0.4'}
+
+ is-docker@2.2.1:
+ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-interactive@1.0.0:
+ resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+ engines: {node: '>=8'}
+
+ is-lambda@1.0.1:
+ resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==}
+
+ is-negative-zero@2.0.2:
+ resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
+ engines: {node: '>= 0.4'}
+
+ is-number-object@1.0.7:
+ resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
+ engines: {node: '>= 0.4'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ is-path-inside@3.0.3:
+ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+ engines: {node: '>=8'}
+
+ is-plain-obj@2.1.0:
+ resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==}
+ engines: {node: '>=8'}
+
+ is-plain-object@5.0.0:
+ resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
+ engines: {node: '>=0.10.0'}
+
+ is-regex@1.1.4:
+ resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
+ engines: {node: '>= 0.4'}
+
+ is-retry-allowed@1.2.0:
+ resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==}
+ engines: {node: '>=0.10.0'}
+
+ is-scoped@2.1.0:
+ resolution: {integrity: sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==}
+ engines: {node: '>=8'}
+
+ is-shared-array-buffer@1.0.2:
+ resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
+
+ is-stream@2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+
+ is-stream@3.0.0:
+ resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ is-string@1.0.7:
+ resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
+ engines: {node: '>= 0.4'}
+
+ is-symbol@1.0.4:
+ resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
+ engines: {node: '>= 0.4'}
+
+ is-typed-array@1.1.12:
+ resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==}
+ engines: {node: '>= 0.4'}
+
+ is-unicode-supported@0.1.0:
+ resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+ engines: {node: '>=10'}
+
+ is-utf8@0.2.1:
+ resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==}
+
+ is-weakref@1.0.2:
+ resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+
+ is-wsl@2.2.0:
+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+ engines: {node: '>=8'}
+
+ isarray@1.0.0:
+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+
+ isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+ isbinaryfile@4.0.10:
+ resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==}
+ engines: {node: '>= 8.0.0'}
+
+ isbinaryfile@5.0.0:
+ resolution: {integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==}
+ engines: {node: '>= 14.0.0'}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ jackspeak@2.3.6:
+ resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
+ engines: {node: '>=14'}
+
+ jake@10.8.7:
+ resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-yaml@3.14.1:
+ resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
+ hasBin: true
+
+ js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+
+ jsesc@0.5.0:
+ resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
+ hasBin: true
+
+ jsesc@3.0.2:
+ resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-parse-better-errors@1.0.2:
+ resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==}
+
+ json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ json-parse-even-better-errors@3.0.1:
+ resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ json-stringify-nice@1.1.4:
+ resolution: {integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==}
+
+ json-stringify-safe@5.0.1:
+ resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
+
+ json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ hasBin: true
+
+ jsonfile@4.0.0:
+ resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
+
+ jsonparse@1.3.1:
+ resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
+ engines: {'0': node >= 0.2.0}
+
+ just-diff-apply@5.5.0:
+ resolution: {integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==}
+
+ just-diff@5.2.0:
+ resolution: {integrity: sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw==}
+
+ just-extend@6.2.0:
+ resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==}
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ knex@3.1.0:
+ resolution: {integrity: sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==}
+ engines: {node: '>=16'}
+ hasBin: true
+ peerDependencies:
+ better-sqlite3: '*'
+ mysql: '*'
+ mysql2: '*'
+ pg: '*'
+ pg-native: '*'
+ sqlite3: '*'
+ tedious: '*'
+ peerDependenciesMeta:
+ better-sqlite3:
+ optional: true
+ mysql:
+ optional: true
+ mysql2:
+ optional: true
+ pg:
+ optional: true
+ pg-native:
+ optional: true
+ sqlite3:
+ optional: true
+ tedious:
+ optional: true
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ load-yaml-file@0.2.0:
+ resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==}
+ engines: {node: '>=6'}
+
+ locate-path@5.0.0:
+ resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+ engines: {node: '>=8'}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ lodash._reinterpolate@3.0.0:
+ resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==}
+
+ lodash.get@4.4.2:
+ resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ lodash.template@4.5.0:
+ resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==}
+
+ lodash.templatesettings@4.2.0:
+ resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==}
+
+ lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ log-symbols@4.1.0:
+ resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+ engines: {node: '>=10'}
+
+ loupe@2.3.7:
+ resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
+
+ loupe@3.1.0:
+ resolution: {integrity: sha512-qKl+FrLXUhFuHUoDJG7f8P8gEMHq9NFS0c6ghXG1J0rldmZFQZoNVv/vyirE9qwCIhWZDsvEFd1sbFu3GvRQFg==}
+
+ lower-case@2.0.2:
+ resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+
+ lowercase-keys@2.0.0:
+ resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
+ engines: {node: '>=8'}
+
+ lru-cache@10.2.0:
+ resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==}
+ engines: {node: 14 || >=16.14}
+
+ lru-cache@6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+
+ lru-cache@7.18.3:
+ resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==}
+ engines: {node: '>=12'}
+
+ magic-string@0.30.11:
+ resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==}
+
+ make-error@1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+
+ make-fetch-happen@10.2.1:
+ resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ make-fetch-happen@11.1.1:
+ resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ make-fetch-happen@9.1.0:
+ resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==}
+ engines: {node: '>= 10'}
+
+ mem-fs-editor@9.7.0:
+ resolution: {integrity: sha512-ReB3YD24GNykmu4WeUL/FDIQtkoyGB6zfJv60yfCo3QjKeimNcTqv2FT83bP0ccs6uu+sm5zyoBlspAzigmsdg==}
+ engines: {node: '>=12.10.0'}
+ peerDependencies:
+ mem-fs: ^2.1.0
+ peerDependenciesMeta:
+ mem-fs:
+ optional: true
+
+ mem-fs@2.3.0:
+ resolution: {integrity: sha512-GftCCBs6EN8sz3BoWO1bCj8t7YBtT713d8bUgbhg9Iel5kFSqnSvCK06TYIDJAtJ51cSiWkM/YemlT0dfoFycw==}
+ engines: {node: '>=12'}
+
+ merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ micromatch@4.0.5:
+ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+ engines: {node: '>=8.6'}
+
+ mimic-fn@2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+
+ mimic-fn@4.0.0:
+ resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+ engines: {node: '>=12'}
+
+ mimic-response@1.0.1:
+ resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
+ engines: {node: '>=4'}
+
+ mimic-response@3.1.0:
+ resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
+ engines: {node: '>=10'}
+
+ min-indent@1.0.1:
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+ engines: {node: '>=4'}
+
+ minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+ minimatch@5.0.1:
+ resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==}
+ engines: {node: '>=10'}
+
+ minimatch@5.1.6:
+ resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
+ engines: {node: '>=10'}
+
+ minimatch@7.4.6:
+ resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==}
+ engines: {node: '>=10'}
+
+ minimatch@9.0.3:
+ resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ minipass-collect@1.0.2:
+ resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==}
+ engines: {node: '>= 8'}
+
+ minipass-fetch@1.4.1:
+ resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==}
+ engines: {node: '>=8'}
+
+ minipass-fetch@2.1.2:
+ resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ minipass-fetch@3.0.4:
+ resolution: {integrity: sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ minipass-flush@1.0.5:
+ resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==}
+ engines: {node: '>= 8'}
+
+ minipass-json-stream@1.0.1:
+ resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==}
+
+ minipass-pipeline@1.2.4:
+ resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==}
+ engines: {node: '>=8'}
+
+ minipass-sized@1.0.3:
+ resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==}
+ engines: {node: '>=8'}
+
+ minipass@3.3.6:
+ resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
+ engines: {node: '>=8'}
+
+ minipass@5.0.0:
+ resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
+ engines: {node: '>=8'}
+
+ minipass@7.0.4:
+ resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minizlib@2.1.2:
+ resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
+ engines: {node: '>= 8'}
+
+ mkdirp-infer-owner@2.0.0:
+ resolution: {integrity: sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==}
+ engines: {node: '>=10'}
+
+ mkdirp@1.0.4:
+ resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ mocha@10.2.0:
+ resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==}
+ engines: {node: '>= 14.0.0'}
+ hasBin: true
+
+ mock-stdin@1.0.0:
+ resolution: {integrity: sha512-tukRdb9Beu27t6dN+XztSRHq9J0B/CoAOySGzHfn8UTfmqipA5yNT/sDUEyYdAV3Hpka6Wx6kOMxuObdOex60Q==}
+
+ ms@2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ multimatch@5.0.0:
+ resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==}
+ engines: {node: '>=10'}
+
+ mute-stream@0.0.8:
+ resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
+
+ nanoid@3.3.3:
+ resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ nanoid@3.3.7:
+ resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ natural-compare-lite@1.4.0:
+ resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==}
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ natural-orderby@2.0.3:
+ resolution: {integrity: sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==}
+
+ negotiator@0.6.3:
+ resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+ engines: {node: '>= 0.6'}
+
+ nise@5.1.7:
+ resolution: {integrity: sha512-wWtNUhkT7k58uvWTB/Gy26eA/EJKtPZFVAhEilN5UYVmmGRYOURbejRUyKm0Uu9XVEW7K5nBOZfR8VMB4QR2RQ==}
+
+ no-case@3.0.4:
+ resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+
+ nock@13.5.1:
+ resolution: {integrity: sha512-+s7b73fzj5KnxbKH4Oaqz07tQ8degcMilU4rrmnKvI//b0JMBU4wEXFQ8zqr+3+L4eWSfU3H/UoIVGUV0tue1Q==}
+ engines: {node: '>= 10.13'}
+
+ node-fetch-native@1.6.1:
+ resolution: {integrity: sha512-bW9T/uJDPAJB2YNYEpWzE54U5O3MQidXsOyTfnbKYtTtFexRvGzb1waphBN4ZwP6EcIvYYEOwW0b72BpAqydTw==}
+
+ node-fetch@2.7.0:
+ resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+
+ node-gyp@8.4.1:
+ resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==}
+ engines: {node: '>= 10.12.0'}
+ hasBin: true
+
+ node-gyp@9.4.1:
+ resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==}
+ engines: {node: ^12.13 || ^14.13 || >=16}
+ hasBin: true
+
+ nopt@5.0.0:
+ resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ nopt@6.0.0:
+ resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+ hasBin: true
+
+ normalize-package-data@2.5.0:
+ resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
+
+ normalize-package-data@3.0.3:
+ resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==}
+ engines: {node: '>=10'}
+
+ normalize-package-data@5.0.0:
+ resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ normalize-url@6.1.0:
+ resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
+ engines: {node: '>=10'}
+
+ npm-bundled@1.1.2:
+ resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==}
+
+ npm-bundled@3.0.0:
+ resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ npm-install-checks@4.0.0:
+ resolution: {integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==}
+ engines: {node: '>=10'}
+
+ npm-install-checks@6.3.0:
+ resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ npm-normalize-package-bin@1.0.1:
+ resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==}
+
+ npm-normalize-package-bin@2.0.0:
+ resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ npm-normalize-package-bin@3.0.1:
+ resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ npm-package-arg@10.1.0:
+ resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ npm-package-arg@8.1.5:
+ resolution: {integrity: sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==}
+ engines: {node: '>=10'}
+
+ npm-packlist@3.0.0:
+ resolution: {integrity: sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ npm-packlist@7.0.4:
+ resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ npm-pick-manifest@6.1.1:
+ resolution: {integrity: sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==}
+
+ npm-pick-manifest@8.0.2:
+ resolution: {integrity: sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ npm-registry-fetch@12.0.2:
+ resolution: {integrity: sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16}
+
+ npm-registry-fetch@14.0.5:
+ resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ npm-run-path@4.0.1:
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ engines: {node: '>=8'}
+
+ npm-run-path@5.2.0:
+ resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ npm@10.4.0:
+ resolution: {integrity: sha512-RS7Mx0OVfXlOcQLRePuDIYdFCVBPCNapWHplDK+mh7GDdP/Tvor4ocuybRRPSvfcRb2vjRJt1fHCqw3cr8qACQ==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+ hasBin: true
+ bundledDependencies:
+ - '@isaacs/string-locale-compare'
+ - '@npmcli/arborist'
+ - '@npmcli/config'
+ - '@npmcli/fs'
+ - '@npmcli/map-workspaces'
+ - '@npmcli/package-json'
+ - '@npmcli/promise-spawn'
+ - '@npmcli/run-script'
+ - '@sigstore/tuf'
+ - abbrev
+ - archy
+ - cacache
+ - chalk
+ - ci-info
+ - cli-columns
+ - cli-table3
+ - columnify
+ - fastest-levenshtein
+ - fs-minipass
+ - glob
+ - graceful-fs
+ - hosted-git-info
+ - ini
+ - init-package-json
+ - is-cidr
+ - json-parse-even-better-errors
+ - libnpmaccess
+ - libnpmdiff
+ - libnpmexec
+ - libnpmfund
+ - libnpmhook
+ - libnpmorg
+ - libnpmpack
+ - libnpmpublish
+ - libnpmsearch
+ - libnpmteam
+ - libnpmversion
+ - make-fetch-happen
+ - minimatch
+ - minipass
+ - minipass-pipeline
+ - ms
+ - node-gyp
+ - nopt
+ - normalize-package-data
+ - npm-audit-report
+ - npm-install-checks
+ - npm-package-arg
+ - npm-pick-manifest
+ - npm-profile
+ - npm-registry-fetch
+ - npm-user-validate
+ - npmlog
+ - p-map
+ - pacote
+ - parse-conflict-json
+ - proc-log
+ - qrcode-terminal
+ - read
+ - semver
+ - spdx-expression-parse
+ - ssri
+ - supports-color
+ - tar
+ - text-table
+ - tiny-relative-date
+ - treeverse
+ - validate-npm-package-name
+ - which
+ - write-file-atomic
+
+ npmlog@5.0.1:
+ resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==}
+
+ npmlog@6.0.2:
+ resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ nypm@0.3.6:
+ resolution: {integrity: sha512-2CATJh3pd6CyNfU5VZM7qSwFu0ieyabkEdnogE30Obn1czrmOYiZ8DOZLe1yBdLKWoyD3Mcy2maUs+0MR3yVjQ==}
+ engines: {node: ^14.16.0 || >=16.10.0}
+ hasBin: true
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ object-inspect@1.13.1:
+ resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==}
+
+ object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+
+ object-treeify@1.1.33:
+ resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==}
+ engines: {node: '>= 10'}
+
+ object.assign@4.1.5:
+ resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
+ engines: {node: '>= 0.4'}
+
+ object.fromentries@2.0.7:
+ resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==}
+ engines: {node: '>= 0.4'}
+
+ object.groupby@1.0.1:
+ resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==}
+
+ object.values@1.1.7:
+ resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==}
+ engines: {node: '>= 0.4'}
+
+ oclif@4.4.2:
+ resolution: {integrity: sha512-8JRA+ICMwmD3PxbJVUXg4yzSk+W1aLeDuNl1+C8+1YKDjUFVEpSuGVvww4o6FgmwAx53zCjmwTcmmvi1YZaqxA==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
+ ohash@1.1.3:
+ resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ onetime@5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+
+ onetime@6.0.0:
+ resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+ engines: {node: '>=12'}
+
+ optionator@0.9.3:
+ resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
+ engines: {node: '>= 0.8.0'}
+
+ ora@5.4.1:
+ resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
+ engines: {node: '>=10'}
+
+ os-tmpdir@1.0.2:
+ resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+ engines: {node: '>=0.10.0'}
+
+ p-cancelable@2.1.1:
+ resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==}
+ engines: {node: '>=8'}
+
+ p-finally@1.0.0:
+ resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==}
+ engines: {node: '>=4'}
+
+ p-limit@2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-locate@4.1.0:
+ resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+ engines: {node: '>=8'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ p-map@4.0.0:
+ resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
+ engines: {node: '>=10'}
+
+ p-queue@6.6.2:
+ resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==}
+ engines: {node: '>=8'}
+
+ p-timeout@3.2.0:
+ resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==}
+ engines: {node: '>=8'}
+
+ p-transform@1.3.0:
+ resolution: {integrity: sha512-UJKdSzgd3KOnXXAtqN5+/eeHcvTn1hBkesEmElVgvO/NAYcxAvmjzIGmnNd3Tb/gRAvMBdNRFD4qAWdHxY6QXg==}
+ engines: {node: '>=12.10.0'}
+
+ p-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+
+ pacote@12.0.3:
+ resolution: {integrity: sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16}
+ hasBin: true
+
+ pacote@15.2.0:
+ resolution: {integrity: sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ hasBin: true
+
+ param-case@3.0.4:
+ resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ parse-conflict-json@2.0.2:
+ resolution: {integrity: sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ parse-json@4.0.0:
+ resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==}
+ engines: {node: '>=4'}
+
+ parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+
+ pascal-case@3.1.2:
+ resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
+
+ password-prompt@1.1.3:
+ resolution: {integrity: sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==}
+
+ path-case@3.0.4:
+ resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-key@4.0.0:
+ resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+ engines: {node: '>=12'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ path-scurry@1.10.1:
+ resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ path-to-regexp@6.2.1:
+ resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==}
+
+ path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+
+ pathe@1.1.2:
+ resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+
+ pathval@1.1.1:
+ resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
+
+ pathval@2.0.0:
+ resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
+ engines: {node: '>= 14.16'}
+
+ pg-connection-string@2.6.2:
+ resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==}
+
+ picocolors@1.1.0:
+ resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==}
+
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ pify@2.3.0:
+ resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+ engines: {node: '>=0.10.0'}
+
+ pify@4.0.1:
+ resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
+ engines: {node: '>=6'}
+
+ pkg-dir@4.2.0:
+ resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
+ engines: {node: '>=8'}
+
+ pluralize@8.0.0:
+ resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
+ engines: {node: '>=4'}
+
+ postcss@8.4.45:
+ resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ preferred-pm@3.1.2:
+ resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==}
+ engines: {node: '>=10'}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ pretty-bytes@5.6.0:
+ resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
+ engines: {node: '>=6'}
+
+ proc-log@1.0.0:
+ resolution: {integrity: sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==}
+
+ proc-log@3.0.0:
+ resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ process-nextick-args@2.0.1:
+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+
+ process@0.11.10:
+ resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
+ engines: {node: '>= 0.6.0'}
+
+ promise-all-reject-late@1.0.1:
+ resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==}
+
+ promise-call-limit@1.0.2:
+ resolution: {integrity: sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==}
+
+ promise-inflight@1.0.1:
+ resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==}
+ peerDependencies:
+ bluebird: '*'
+ peerDependenciesMeta:
+ bluebird:
+ optional: true
+
+ promise-retry@2.0.1:
+ resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==}
+ engines: {node: '>=10'}
+
+ propagate@2.0.1:
+ resolution: {integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==}
+ engines: {node: '>= 8'}
+
+ pump@3.0.0:
+ resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ quick-lru@5.1.1:
+ resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
+ engines: {node: '>=10'}
+
+ rambda@7.5.0:
+ resolution: {integrity: sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==}
+
+ randombytes@2.1.0:
+ resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+
+ read-cmd-shim@3.0.1:
+ resolution: {integrity: sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ read-package-json-fast@2.0.3:
+ resolution: {integrity: sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==}
+ engines: {node: '>=10'}
+
+ read-package-json-fast@3.0.2:
+ resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ read-package-json@6.0.4:
+ resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ read-pkg-up@7.0.1:
+ resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
+ engines: {node: '>=8'}
+
+ read-pkg@5.2.0:
+ resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==}
+ engines: {node: '>=8'}
+
+ readable-stream@2.3.8:
+ resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ readable-stream@4.5.2:
+ resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ readdir-scoped-modules@1.1.0:
+ resolution: {integrity: sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==}
+ deprecated: This functionality has been moved to @npmcli/fs
+
+ readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+
+ rechoir@0.6.2:
+ resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==}
+ engines: {node: '>= 0.10'}
+
+ rechoir@0.8.0:
+ resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==}
+ engines: {node: '>= 10.13.0'}
+
+ redeyed@2.1.1:
+ resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==}
+
+ regexp-tree@0.1.27:
+ resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==}
+ hasBin: true
+
+ regexp.prototype.flags@1.5.1:
+ resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==}
+ engines: {node: '>= 0.4'}
+
+ regexpp@3.2.0:
+ resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
+ engines: {node: '>=8'}
+
+ regjsparser@0.10.0:
+ resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==}
+ hasBin: true
+
+ remove-trailing-separator@1.1.0:
+ resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==}
+
+ replace-ext@1.0.1:
+ resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==}
+ engines: {node: '>= 0.10'}
+
+ require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+
+ resolve-alpn@1.2.1:
+ resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ resolve-from@5.0.0:
+ resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
+ engines: {node: '>=8'}
+
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ resolve@1.22.8:
+ resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
+ hasBin: true
+
+ responselike@2.0.1:
+ resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==}
+
+ restore-cursor@3.1.0:
+ resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+ engines: {node: '>=8'}
+
+ retry@0.12.0:
+ resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
+ engines: {node: '>= 4'}
+
+ retry@0.13.1:
+ resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
+ engines: {node: '>= 4'}
+
+ reusify@1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ rimraf@3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ hasBin: true
+
+ run-async@2.4.1:
+ resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
+ engines: {node: '>=0.12.0'}
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ rxjs@7.8.1:
+ resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+
+ safe-array-concat@1.1.0:
+ resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==}
+ engines: {node: '>=0.4'}
+
+ safe-buffer@5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safe-regex-test@1.0.2:
+ resolution: {integrity: sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==}
+ engines: {node: '>= 0.4'}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ scoped-regex@2.1.0:
+ resolution: {integrity: sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==}
+ engines: {node: '>=8'}
+
+ semver@5.7.2:
+ resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
+ hasBin: true
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ semver@7.5.4:
+ resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ sentence-case@3.0.4:
+ resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==}
+
+ serialize-javascript@6.0.0:
+ resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==}
+
+ set-blocking@2.0.0:
+ resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
+
+ set-function-length@1.2.0:
+ resolution: {integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==}
+ engines: {node: '>= 0.4'}
+
+ set-function-name@2.0.1:
+ resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==}
+ engines: {node: '>= 0.4'}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ shelljs@0.8.5:
+ resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ shx@0.3.4:
+ resolution: {integrity: sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ side-channel@1.0.4:
+ resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
+
+ signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+ signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
+
+ sigstore@1.9.0:
+ resolution: {integrity: sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ hasBin: true
+
+ simple-swizzle@0.2.2:
+ resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
+
+ sinon@16.1.3:
+ resolution: {integrity: sha512-mjnWWeyxcAf9nC0bXcPmiDut+oE8HYridTNzBbF98AYVLmWwGRp2ISEpyhYflG1ifILT+eNn3BmKUJPxjXUPlA==}
+
+ slash@3.0.0:
+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+ engines: {node: '>=8'}
+
+ slice-ansi@4.0.0:
+ resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==}
+ engines: {node: '>=10'}
+
+ slugify@1.6.6:
+ resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==}
+ engines: {node: '>=8.0.0'}
+
+ smart-buffer@4.2.0:
+ resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
+ engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
+
+ snake-case@3.0.4:
+ resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
+
+ socks-proxy-agent@6.2.1:
+ resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==}
+ engines: {node: '>= 10'}
+
+ socks-proxy-agent@7.0.0:
+ resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==}
+ engines: {node: '>= 10'}
+
+ socks@2.7.1:
+ resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==}
+ engines: {node: '>= 10.13.0', npm: '>= 3.0.0'}
+
+ sort-keys@4.2.0:
+ resolution: {integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==}
+ engines: {node: '>=8'}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ spdx-correct@3.2.0:
+ resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
+
+ spdx-exceptions@2.4.0:
+ resolution: {integrity: sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==}
+
+ spdx-expression-parse@3.0.1:
+ resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+
+ spdx-license-ids@3.0.16:
+ resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==}
+
+ sprintf-js@1.0.3:
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+
+ ssri@10.0.5:
+ resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ ssri@8.0.1:
+ resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==}
+ engines: {node: '>= 8'}
+
+ ssri@9.0.1:
+ resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ stdout-stderr@0.1.13:
+ resolution: {integrity: sha512-Xnt9/HHHYfjZ7NeQLvuQDyL1LnbsbddgMFKCuaQKwGCdJm8LnstZIXop+uOY36UR1UXXoHXfMbC1KlVdVd2JLA==}
+ engines: {node: '>=8.0.0'}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string-width@5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+
+ string.prototype.trim@1.2.8:
+ resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimend@1.0.7:
+ resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==}
+
+ string.prototype.trimstart@1.0.7:
+ resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==}
+
+ string_decoder@1.1.1:
+ resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-ansi@7.1.0:
+ resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+ engines: {node: '>=12'}
+
+ strip-bom-buf@1.0.0:
+ resolution: {integrity: sha512-1sUIL1jck0T1mhOLP2c696BIznzT525Lkub+n4jjMHjhjhoAQA6Ye659DxdlZBr0aLDMQoTxKIpnlqxgtwjsuQ==}
+ engines: {node: '>=4'}
+
+ strip-bom-stream@2.0.0:
+ resolution: {integrity: sha512-yH0+mD8oahBZWnY43vxs4pSinn8SMKAdml/EOGBewoe1Y0Eitd0h2Mg3ZRiXruUW6L4P+lvZiEgbh0NgUGia1w==}
+ engines: {node: '>=0.10.0'}
+
+ strip-bom@2.0.0:
+ resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==}
+ engines: {node: '>=0.10.0'}
+
+ strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+
+ strip-final-newline@2.0.0:
+ resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+ engines: {node: '>=6'}
+
+ strip-final-newline@3.0.0:
+ resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+ engines: {node: '>=12'}
+
+ strip-indent@3.0.0:
+ resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+ engines: {node: '>=8'}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ strnum@1.0.5:
+ resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==}
+
+ supports-color@5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-color@8.1.1:
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+ engines: {node: '>=10'}
+
+ supports-hyperlinks@2.3.0:
+ resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==}
+ engines: {node: '>=8'}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ tapable@2.2.1:
+ resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
+ engines: {node: '>=6'}
+
+ tar@6.2.0:
+ resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==}
+ engines: {node: '>=10'}
+
+ tarn@3.0.2:
+ resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==}
+ engines: {node: '>=8.0.0'}
+
+ text-table@0.2.0:
+ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+
+ textextensions@5.16.0:
+ resolution: {integrity: sha512-7D/r3s6uPZyU//MCYrX6I14nzauDwJ5CxazouuRGNuvSCihW87ufN6VLoROLCrHg6FblLuJrT6N2BVaPVzqElw==}
+ engines: {node: '>=0.8'}
+
+ through@2.3.8:
+ resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+
+ tildify@2.0.0:
+ resolution: {integrity: sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==}
+ engines: {node: '>=8'}
+
+ tmp@0.0.33:
+ resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
+ engines: {node: '>=0.6.0'}
+
+ to-fast-properties@2.0.0:
+ resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+ engines: {node: '>=4'}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+
+ treeverse@1.0.4:
+ resolution: {integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==}
+
+ ts-api-utils@1.0.3:
+ resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==}
+ engines: {node: '>=16.13.0'}
+ peerDependencies:
+ typescript: '>=4.2.0'
+
+ ts-node@10.9.2:
+ resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
+ hasBin: true
+ peerDependencies:
+ '@swc/core': '>=1.2.50'
+ '@swc/wasm': '>=1.2.50'
+ '@types/node': '*'
+ typescript: '>=2.7'
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ '@swc/wasm':
+ optional: true
+
+ tsconfig-paths@3.15.0:
+ resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+
+ tslib@1.14.1:
+ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+
+ tslib@2.6.2:
+ resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
+
+ tuf-js@1.1.7:
+ resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ tunnel-agent@0.6.0:
+ resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ type-detect@4.0.8:
+ resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
+ engines: {node: '>=4'}
+
+ type-fest@0.20.2:
+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+ engines: {node: '>=10'}
+
+ type-fest@0.21.3:
+ resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+ engines: {node: '>=10'}
+
+ type-fest@0.6.0:
+ resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
+ engines: {node: '>=8'}
+
+ type-fest@0.8.1:
+ resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
+ engines: {node: '>=8'}
+
+ typed-array-buffer@1.0.0:
+ resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-length@1.0.0:
+ resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-offset@1.0.0:
+ resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-length@1.0.4:
+ resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
+
+ typescript@5.3.3:
+ resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ ufo@1.3.2:
+ resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==}
+
+ unbox-primitive@1.0.2:
+ resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
+
+ undici-types@5.26.5:
+ resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+
+ unique-filename@1.1.1:
+ resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==}
+
+ unique-filename@2.0.1:
+ resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ unique-filename@3.0.0:
+ resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ unique-slug@2.0.2:
+ resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==}
+
+ unique-slug@3.0.0:
+ resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ unique-slug@4.0.0:
+ resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ universal-user-agent@6.0.1:
+ resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==}
+
+ universalify@0.1.2:
+ resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
+ engines: {node: '>= 4.0.0'}
+
+ untildify@4.0.0:
+ resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
+ engines: {node: '>=8'}
+
+ upper-case-first@2.0.2:
+ resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==}
+
+ upper-case@2.0.2:
+ resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==}
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ uuid@8.3.2:
+ resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+ hasBin: true
+
+ v8-compile-cache-lib@3.0.1:
+ resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+
+ validate-npm-package-license@3.0.4:
+ resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+
+ validate-npm-package-name@3.0.0:
+ resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==}
+
+ validate-npm-package-name@5.0.0:
+ resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ vinyl-file@3.0.0:
+ resolution: {integrity: sha512-BoJDj+ca3D9xOuPEM6RWVtWQtvEPQiQYn82LvdxhLWplfQsBzBqtgK0yhCP0s1BNTi6dH9BO+dzybvyQIacifg==}
+ engines: {node: '>=4'}
+
+ vinyl@2.2.1:
+ resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==}
+ engines: {node: '>= 0.10'}
+
+ vue@3.5.3:
+ resolution: {integrity: sha512-xvRbd0HpuLovYbOHXRHlSBsSvmUJbo0pzbkKTApWnQGf3/cu5Z39mQeA5cZdLRVIoNf3zI6MSoOgHUT5i2jO+Q==}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ walk-up-path@1.0.0:
+ resolution: {integrity: sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==}
+
+ wcwidth@1.0.1:
+ resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+
+ webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+
+ whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+
+ which-boxed-primitive@1.0.2:
+ resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+
+ which-pm@2.0.0:
+ resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==}
+ engines: {node: '>=8.15'}
+
+ which-typed-array@1.1.13:
+ resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==}
+ engines: {node: '>= 0.4'}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ which@3.0.1:
+ resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ hasBin: true
+
+ wide-align@1.1.5:
+ resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==}
+
+ widest-line@3.1.0:
+ resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==}
+ engines: {node: '>=8'}
+
+ wordwrap@1.0.0:
+ resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==}
+
+ workerpool@6.2.1:
+ resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==}
+
+ wrap-ansi@6.2.0:
+ resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+ engines: {node: '>=8'}
+
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+
+ wrap-ansi@8.1.0:
+ resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+ engines: {node: '>=12'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ write-file-atomic@4.0.2:
+ resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+
+ yallist@4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+
+ yargs-parser@20.2.4:
+ resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==}
+ engines: {node: '>=10'}
+
+ yargs-unparser@2.0.0:
+ resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==}
+ engines: {node: '>=10'}
+
+ yargs@16.2.0:
+ resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
+ engines: {node: '>=10'}
+
+ yarn@1.22.21:
+ resolution: {integrity: sha512-ynXaJsADJ9JiZ84zU25XkPGOvVMmZ5b7tmTSpKURYwgELdjucAOydqIOrOfTxVYcNXe91xvLZwcRh68SR3liCg==}
+ engines: {node: '>=4.0.0'}
+ hasBin: true
+
+ yeoman-environment@3.19.3:
+ resolution: {integrity: sha512-/+ODrTUHtlDPRH9qIC0JREH8+7nsRcjDl3Bxn2Xo/rvAaVvixH5275jHwg0C85g4QsF4P6M2ojfScPPAl+pLAg==}
+ engines: {node: '>=12.10.0'}
+ hasBin: true
+
+ yeoman-generator@5.10.0:
+ resolution: {integrity: sha512-iDUKykV7L4nDNzeYSedRmSeJ5eMYFucnKDi6KN1WNASXErgPepKqsQw55TgXPHnmpcyOh2Dd/LAZkyc+f0qaAw==}
+ engines: {node: '>=12.10.0'}
+ peerDependencies:
+ yeoman-environment: ^3.2.0
+ peerDependenciesMeta:
+ yeoman-environment:
+ optional: true
+
+ yn@3.1.1:
+ resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
+ engines: {node: '>=6'}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+snapshots:
+
+ '@aashutoshrathi/word-wrap@1.2.6': {}
+
+ '@aws-crypto/crc32@3.0.0':
+ dependencies:
+ '@aws-crypto/util': 3.0.0
+ '@aws-sdk/types': 3.502.0
+ tslib: 1.14.1
+
+ '@aws-crypto/crc32c@3.0.0':
+ dependencies:
+ '@aws-crypto/util': 3.0.0
+ '@aws-sdk/types': 3.502.0
+ tslib: 1.14.1
+
+ '@aws-crypto/ie11-detection@3.0.0':
+ dependencies:
+ tslib: 1.14.1
+
+ '@aws-crypto/sha1-browser@3.0.0':
+ dependencies:
+ '@aws-crypto/ie11-detection': 3.0.0
+ '@aws-crypto/supports-web-crypto': 3.0.0
+ '@aws-crypto/util': 3.0.0
+ '@aws-sdk/types': 3.502.0
+ '@aws-sdk/util-locate-window': 3.495.0
+ '@aws-sdk/util-utf8-browser': 3.259.0
+ tslib: 1.14.1
+
+ '@aws-crypto/sha256-browser@3.0.0':
+ dependencies:
+ '@aws-crypto/ie11-detection': 3.0.0
+ '@aws-crypto/sha256-js': 3.0.0
+ '@aws-crypto/supports-web-crypto': 3.0.0
+ '@aws-crypto/util': 3.0.0
+ '@aws-sdk/types': 3.502.0
+ '@aws-sdk/util-locate-window': 3.495.0
+ '@aws-sdk/util-utf8-browser': 3.259.0
+ tslib: 1.14.1
+
+ '@aws-crypto/sha256-js@3.0.0':
+ dependencies:
+ '@aws-crypto/util': 3.0.0
+ '@aws-sdk/types': 3.502.0
+ tslib: 1.14.1
+
+ '@aws-crypto/supports-web-crypto@3.0.0':
+ dependencies:
+ tslib: 1.14.1
+
+ '@aws-crypto/util@3.0.0':
+ dependencies:
+ '@aws-sdk/types': 3.502.0
+ '@aws-sdk/util-utf8-browser': 3.259.0
+ tslib: 1.14.1
+
+ '@aws-sdk/client-cloudfront@3.502.0':
+ dependencies:
+ '@aws-crypto/sha256-browser': 3.0.0
+ '@aws-crypto/sha256-js': 3.0.0
+ '@aws-sdk/client-sts': 3.502.0(@aws-sdk/credential-provider-node@3.502.0)
+ '@aws-sdk/core': 3.496.0
+ '@aws-sdk/credential-provider-node': 3.502.0
+ '@aws-sdk/middleware-host-header': 3.502.0
+ '@aws-sdk/middleware-logger': 3.502.0
+ '@aws-sdk/middleware-recursion-detection': 3.502.0
+ '@aws-sdk/middleware-signing': 3.502.0
+ '@aws-sdk/middleware-user-agent': 3.502.0
+ '@aws-sdk/region-config-resolver': 3.502.0
+ '@aws-sdk/types': 3.502.0
+ '@aws-sdk/util-endpoints': 3.502.0
+ '@aws-sdk/util-user-agent-browser': 3.502.0
+ '@aws-sdk/util-user-agent-node': 3.502.0
+ '@aws-sdk/xml-builder': 3.496.0
+ '@smithy/config-resolver': 2.1.1
+ '@smithy/core': 1.3.1
+ '@smithy/fetch-http-handler': 2.4.1
+ '@smithy/hash-node': 2.1.1
+ '@smithy/invalid-dependency': 2.1.1
+ '@smithy/middleware-content-length': 2.1.1
+ '@smithy/middleware-endpoint': 2.4.1
+ '@smithy/middleware-retry': 2.1.1
+ '@smithy/middleware-serde': 2.1.1
+ '@smithy/middleware-stack': 2.1.1
+ '@smithy/node-config-provider': 2.2.1
+ '@smithy/node-http-handler': 2.3.1
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/smithy-client': 2.3.1
+ '@smithy/types': 2.9.1
+ '@smithy/url-parser': 2.1.1
+ '@smithy/util-base64': 2.1.1
+ '@smithy/util-body-length-browser': 2.1.1
+ '@smithy/util-body-length-node': 2.2.1
+ '@smithy/util-defaults-mode-browser': 2.1.1
+ '@smithy/util-defaults-mode-node': 2.1.1
+ '@smithy/util-endpoints': 1.1.1
+ '@smithy/util-retry': 2.1.1
+ '@smithy/util-stream': 2.1.1
+ '@smithy/util-utf8': 2.1.1
+ '@smithy/util-waiter': 2.1.1
+ fast-xml-parser: 4.2.5
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/client-s3@3.502.0':
+ dependencies:
+ '@aws-crypto/sha1-browser': 3.0.0
+ '@aws-crypto/sha256-browser': 3.0.0
+ '@aws-crypto/sha256-js': 3.0.0
+ '@aws-sdk/client-sts': 3.502.0(@aws-sdk/credential-provider-node@3.502.0)
+ '@aws-sdk/core': 3.496.0
+ '@aws-sdk/credential-provider-node': 3.502.0
+ '@aws-sdk/middleware-bucket-endpoint': 3.502.0
+ '@aws-sdk/middleware-expect-continue': 3.502.0
+ '@aws-sdk/middleware-flexible-checksums': 3.502.0
+ '@aws-sdk/middleware-host-header': 3.502.0
+ '@aws-sdk/middleware-location-constraint': 3.502.0
+ '@aws-sdk/middleware-logger': 3.502.0
+ '@aws-sdk/middleware-recursion-detection': 3.502.0
+ '@aws-sdk/middleware-sdk-s3': 3.502.0
+ '@aws-sdk/middleware-signing': 3.502.0
+ '@aws-sdk/middleware-ssec': 3.502.0
+ '@aws-sdk/middleware-user-agent': 3.502.0
+ '@aws-sdk/region-config-resolver': 3.502.0
+ '@aws-sdk/signature-v4-multi-region': 3.502.0
+ '@aws-sdk/types': 3.502.0
+ '@aws-sdk/util-endpoints': 3.502.0
+ '@aws-sdk/util-user-agent-browser': 3.502.0
+ '@aws-sdk/util-user-agent-node': 3.502.0
+ '@aws-sdk/xml-builder': 3.496.0
+ '@smithy/config-resolver': 2.1.1
+ '@smithy/core': 1.3.1
+ '@smithy/eventstream-serde-browser': 2.1.1
+ '@smithy/eventstream-serde-config-resolver': 2.1.1
+ '@smithy/eventstream-serde-node': 2.1.1
+ '@smithy/fetch-http-handler': 2.4.1
+ '@smithy/hash-blob-browser': 2.1.1
+ '@smithy/hash-node': 2.1.1
+ '@smithy/hash-stream-node': 2.1.1
+ '@smithy/invalid-dependency': 2.1.1
+ '@smithy/md5-js': 2.1.1
+ '@smithy/middleware-content-length': 2.1.1
+ '@smithy/middleware-endpoint': 2.4.1
+ '@smithy/middleware-retry': 2.1.1
+ '@smithy/middleware-serde': 2.1.1
+ '@smithy/middleware-stack': 2.1.1
+ '@smithy/node-config-provider': 2.2.1
+ '@smithy/node-http-handler': 2.3.1
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/smithy-client': 2.3.1
+ '@smithy/types': 2.9.1
+ '@smithy/url-parser': 2.1.1
+ '@smithy/util-base64': 2.1.1
+ '@smithy/util-body-length-browser': 2.1.1
+ '@smithy/util-body-length-node': 2.2.1
+ '@smithy/util-defaults-mode-browser': 2.1.1
+ '@smithy/util-defaults-mode-node': 2.1.1
+ '@smithy/util-endpoints': 1.1.1
+ '@smithy/util-retry': 2.1.1
+ '@smithy/util-stream': 2.1.1
+ '@smithy/util-utf8': 2.1.1
+ '@smithy/util-waiter': 2.1.1
+ fast-xml-parser: 4.2.5
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/client-sso-oidc@3.502.0(@aws-sdk/credential-provider-node@3.502.0)':
+ dependencies:
+ '@aws-crypto/sha256-browser': 3.0.0
+ '@aws-crypto/sha256-js': 3.0.0
+ '@aws-sdk/client-sts': 3.502.0(@aws-sdk/credential-provider-node@3.502.0)
+ '@aws-sdk/core': 3.496.0
+ '@aws-sdk/credential-provider-node': 3.502.0
+ '@aws-sdk/middleware-host-header': 3.502.0
+ '@aws-sdk/middleware-logger': 3.502.0
+ '@aws-sdk/middleware-recursion-detection': 3.502.0
+ '@aws-sdk/middleware-signing': 3.502.0
+ '@aws-sdk/middleware-user-agent': 3.502.0
+ '@aws-sdk/region-config-resolver': 3.502.0
+ '@aws-sdk/types': 3.502.0
+ '@aws-sdk/util-endpoints': 3.502.0
+ '@aws-sdk/util-user-agent-browser': 3.502.0
+ '@aws-sdk/util-user-agent-node': 3.502.0
+ '@smithy/config-resolver': 2.1.1
+ '@smithy/core': 1.3.1
+ '@smithy/fetch-http-handler': 2.4.1
+ '@smithy/hash-node': 2.1.1
+ '@smithy/invalid-dependency': 2.1.1
+ '@smithy/middleware-content-length': 2.1.1
+ '@smithy/middleware-endpoint': 2.4.1
+ '@smithy/middleware-retry': 2.1.1
+ '@smithy/middleware-serde': 2.1.1
+ '@smithy/middleware-stack': 2.1.1
+ '@smithy/node-config-provider': 2.2.1
+ '@smithy/node-http-handler': 2.3.1
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/smithy-client': 2.3.1
+ '@smithy/types': 2.9.1
+ '@smithy/url-parser': 2.1.1
+ '@smithy/util-base64': 2.1.1
+ '@smithy/util-body-length-browser': 2.1.1
+ '@smithy/util-body-length-node': 2.2.1
+ '@smithy/util-defaults-mode-browser': 2.1.1
+ '@smithy/util-defaults-mode-node': 2.1.1
+ '@smithy/util-endpoints': 1.1.1
+ '@smithy/util-retry': 2.1.1
+ '@smithy/util-utf8': 2.1.1
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/client-sso@3.502.0':
+ dependencies:
+ '@aws-crypto/sha256-browser': 3.0.0
+ '@aws-crypto/sha256-js': 3.0.0
+ '@aws-sdk/core': 3.496.0
+ '@aws-sdk/middleware-host-header': 3.502.0
+ '@aws-sdk/middleware-logger': 3.502.0
+ '@aws-sdk/middleware-recursion-detection': 3.502.0
+ '@aws-sdk/middleware-user-agent': 3.502.0
+ '@aws-sdk/region-config-resolver': 3.502.0
+ '@aws-sdk/types': 3.502.0
+ '@aws-sdk/util-endpoints': 3.502.0
+ '@aws-sdk/util-user-agent-browser': 3.502.0
+ '@aws-sdk/util-user-agent-node': 3.502.0
+ '@smithy/config-resolver': 2.1.1
+ '@smithy/core': 1.3.1
+ '@smithy/fetch-http-handler': 2.4.1
+ '@smithy/hash-node': 2.1.1
+ '@smithy/invalid-dependency': 2.1.1
+ '@smithy/middleware-content-length': 2.1.1
+ '@smithy/middleware-endpoint': 2.4.1
+ '@smithy/middleware-retry': 2.1.1
+ '@smithy/middleware-serde': 2.1.1
+ '@smithy/middleware-stack': 2.1.1
+ '@smithy/node-config-provider': 2.2.1
+ '@smithy/node-http-handler': 2.3.1
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/smithy-client': 2.3.1
+ '@smithy/types': 2.9.1
+ '@smithy/url-parser': 2.1.1
+ '@smithy/util-base64': 2.1.1
+ '@smithy/util-body-length-browser': 2.1.1
+ '@smithy/util-body-length-node': 2.2.1
+ '@smithy/util-defaults-mode-browser': 2.1.1
+ '@smithy/util-defaults-mode-node': 2.1.1
+ '@smithy/util-endpoints': 1.1.1
+ '@smithy/util-retry': 2.1.1
+ '@smithy/util-utf8': 2.1.1
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/client-sts@3.502.0(@aws-sdk/credential-provider-node@3.502.0)':
+ dependencies:
+ '@aws-crypto/sha256-browser': 3.0.0
+ '@aws-crypto/sha256-js': 3.0.0
+ '@aws-sdk/core': 3.496.0
+ '@aws-sdk/credential-provider-node': 3.502.0
+ '@aws-sdk/middleware-host-header': 3.502.0
+ '@aws-sdk/middleware-logger': 3.502.0
+ '@aws-sdk/middleware-recursion-detection': 3.502.0
+ '@aws-sdk/middleware-user-agent': 3.502.0
+ '@aws-sdk/region-config-resolver': 3.502.0
+ '@aws-sdk/types': 3.502.0
+ '@aws-sdk/util-endpoints': 3.502.0
+ '@aws-sdk/util-user-agent-browser': 3.502.0
+ '@aws-sdk/util-user-agent-node': 3.502.0
+ '@smithy/config-resolver': 2.1.1
+ '@smithy/core': 1.3.1
+ '@smithy/fetch-http-handler': 2.4.1
+ '@smithy/hash-node': 2.1.1
+ '@smithy/invalid-dependency': 2.1.1
+ '@smithy/middleware-content-length': 2.1.1
+ '@smithy/middleware-endpoint': 2.4.1
+ '@smithy/middleware-retry': 2.1.1
+ '@smithy/middleware-serde': 2.1.1
+ '@smithy/middleware-stack': 2.1.1
+ '@smithy/node-config-provider': 2.2.1
+ '@smithy/node-http-handler': 2.3.1
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/smithy-client': 2.3.1
+ '@smithy/types': 2.9.1
+ '@smithy/url-parser': 2.1.1
+ '@smithy/util-base64': 2.1.1
+ '@smithy/util-body-length-browser': 2.1.1
+ '@smithy/util-body-length-node': 2.2.1
+ '@smithy/util-defaults-mode-browser': 2.1.1
+ '@smithy/util-defaults-mode-node': 2.1.1
+ '@smithy/util-endpoints': 1.1.1
+ '@smithy/util-middleware': 2.1.1
+ '@smithy/util-retry': 2.1.1
+ '@smithy/util-utf8': 2.1.1
+ fast-xml-parser: 4.2.5
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/core@3.496.0':
+ dependencies:
+ '@smithy/core': 1.3.1
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/signature-v4': 2.1.1
+ '@smithy/smithy-client': 2.3.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@aws-sdk/credential-provider-env@3.502.0':
+ dependencies:
+ '@aws-sdk/types': 3.502.0
+ '@smithy/property-provider': 2.1.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@aws-sdk/credential-provider-ini@3.502.0(@aws-sdk/credential-provider-node@3.502.0)':
+ dependencies:
+ '@aws-sdk/client-sts': 3.502.0(@aws-sdk/credential-provider-node@3.502.0)
+ '@aws-sdk/credential-provider-env': 3.502.0
+ '@aws-sdk/credential-provider-process': 3.502.0
+ '@aws-sdk/credential-provider-sso': 3.502.0(@aws-sdk/credential-provider-node@3.502.0)
+ '@aws-sdk/credential-provider-web-identity': 3.502.0(@aws-sdk/credential-provider-node@3.502.0)
+ '@aws-sdk/types': 3.502.0
+ '@smithy/credential-provider-imds': 2.2.1
+ '@smithy/property-provider': 2.1.1
+ '@smithy/shared-ini-file-loader': 2.3.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - '@aws-sdk/credential-provider-node'
+ - aws-crt
+
+ '@aws-sdk/credential-provider-node@3.502.0':
+ dependencies:
+ '@aws-sdk/credential-provider-env': 3.502.0
+ '@aws-sdk/credential-provider-ini': 3.502.0(@aws-sdk/credential-provider-node@3.502.0)
+ '@aws-sdk/credential-provider-process': 3.502.0
+ '@aws-sdk/credential-provider-sso': 3.502.0(@aws-sdk/credential-provider-node@3.502.0)
+ '@aws-sdk/credential-provider-web-identity': 3.502.0(@aws-sdk/credential-provider-node@3.502.0)
+ '@aws-sdk/types': 3.502.0
+ '@smithy/credential-provider-imds': 2.2.1
+ '@smithy/property-provider': 2.1.1
+ '@smithy/shared-ini-file-loader': 2.3.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/credential-provider-process@3.502.0':
+ dependencies:
+ '@aws-sdk/types': 3.502.0
+ '@smithy/property-provider': 2.1.1
+ '@smithy/shared-ini-file-loader': 2.3.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@aws-sdk/credential-provider-sso@3.502.0(@aws-sdk/credential-provider-node@3.502.0)':
+ dependencies:
+ '@aws-sdk/client-sso': 3.502.0
+ '@aws-sdk/token-providers': 3.502.0(@aws-sdk/credential-provider-node@3.502.0)
+ '@aws-sdk/types': 3.502.0
+ '@smithy/property-provider': 2.1.1
+ '@smithy/shared-ini-file-loader': 2.3.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - '@aws-sdk/credential-provider-node'
+ - aws-crt
+
+ '@aws-sdk/credential-provider-web-identity@3.502.0(@aws-sdk/credential-provider-node@3.502.0)':
+ dependencies:
+ '@aws-sdk/client-sts': 3.502.0(@aws-sdk/credential-provider-node@3.502.0)
+ '@aws-sdk/types': 3.502.0
+ '@smithy/property-provider': 2.1.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - '@aws-sdk/credential-provider-node'
+ - aws-crt
+
+ '@aws-sdk/middleware-bucket-endpoint@3.502.0':
+ dependencies:
+ '@aws-sdk/types': 3.502.0
+ '@aws-sdk/util-arn-parser': 3.495.0
+ '@smithy/node-config-provider': 2.2.1
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/types': 2.9.1
+ '@smithy/util-config-provider': 2.2.1
+ tslib: 2.6.2
+
+ '@aws-sdk/middleware-expect-continue@3.502.0':
+ dependencies:
+ '@aws-sdk/types': 3.502.0
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@aws-sdk/middleware-flexible-checksums@3.502.0':
+ dependencies:
+ '@aws-crypto/crc32': 3.0.0
+ '@aws-crypto/crc32c': 3.0.0
+ '@aws-sdk/types': 3.502.0
+ '@smithy/is-array-buffer': 2.1.1
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/types': 2.9.1
+ '@smithy/util-utf8': 2.1.1
+ tslib: 2.6.2
+
+ '@aws-sdk/middleware-host-header@3.502.0':
+ dependencies:
+ '@aws-sdk/types': 3.502.0
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@aws-sdk/middleware-location-constraint@3.502.0':
+ dependencies:
+ '@aws-sdk/types': 3.502.0
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@aws-sdk/middleware-logger@3.502.0':
+ dependencies:
+ '@aws-sdk/types': 3.502.0
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@aws-sdk/middleware-recursion-detection@3.502.0':
+ dependencies:
+ '@aws-sdk/types': 3.502.0
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@aws-sdk/middleware-sdk-s3@3.502.0':
+ dependencies:
+ '@aws-sdk/types': 3.502.0
+ '@aws-sdk/util-arn-parser': 3.495.0
+ '@smithy/node-config-provider': 2.2.1
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/signature-v4': 2.1.1
+ '@smithy/smithy-client': 2.3.1
+ '@smithy/types': 2.9.1
+ '@smithy/util-config-provider': 2.2.1
+ tslib: 2.6.2
+
+ '@aws-sdk/middleware-signing@3.502.0':
+ dependencies:
+ '@aws-sdk/types': 3.502.0
+ '@smithy/property-provider': 2.1.1
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/signature-v4': 2.1.1
+ '@smithy/types': 2.9.1
+ '@smithy/util-middleware': 2.1.1
+ tslib: 2.6.2
+
+ '@aws-sdk/middleware-ssec@3.502.0':
+ dependencies:
+ '@aws-sdk/types': 3.502.0
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@aws-sdk/middleware-user-agent@3.502.0':
+ dependencies:
+ '@aws-sdk/types': 3.502.0
+ '@aws-sdk/util-endpoints': 3.502.0
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@aws-sdk/region-config-resolver@3.502.0':
+ dependencies:
+ '@aws-sdk/types': 3.502.0
+ '@smithy/node-config-provider': 2.2.1
+ '@smithy/types': 2.9.1
+ '@smithy/util-config-provider': 2.2.1
+ '@smithy/util-middleware': 2.1.1
+ tslib: 2.6.2
+
+ '@aws-sdk/signature-v4-multi-region@3.502.0':
+ dependencies:
+ '@aws-sdk/middleware-sdk-s3': 3.502.0
+ '@aws-sdk/types': 3.502.0
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/signature-v4': 2.1.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@aws-sdk/token-providers@3.502.0(@aws-sdk/credential-provider-node@3.502.0)':
+ dependencies:
+ '@aws-sdk/client-sso-oidc': 3.502.0(@aws-sdk/credential-provider-node@3.502.0)
+ '@aws-sdk/types': 3.502.0
+ '@smithy/property-provider': 2.1.1
+ '@smithy/shared-ini-file-loader': 2.3.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - '@aws-sdk/credential-provider-node'
+ - aws-crt
+
+ '@aws-sdk/types@3.502.0':
+ dependencies:
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@aws-sdk/util-arn-parser@3.495.0':
+ dependencies:
+ tslib: 2.6.2
+
+ '@aws-sdk/util-endpoints@3.502.0':
+ dependencies:
+ '@aws-sdk/types': 3.502.0
+ '@smithy/types': 2.9.1
+ '@smithy/util-endpoints': 1.1.1
+ tslib: 2.6.2
+
+ '@aws-sdk/util-locate-window@3.495.0':
+ dependencies:
+ tslib: 2.6.2
+
+ '@aws-sdk/util-user-agent-browser@3.502.0':
+ dependencies:
+ '@aws-sdk/types': 3.502.0
+ '@smithy/types': 2.9.1
+ bowser: 2.11.0
+ tslib: 2.6.2
+
+ '@aws-sdk/util-user-agent-node@3.502.0':
+ dependencies:
+ '@aws-sdk/types': 3.502.0
+ '@smithy/node-config-provider': 2.2.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@aws-sdk/util-utf8-browser@3.259.0':
+ dependencies:
+ tslib: 2.6.2
+
+ '@aws-sdk/xml-builder@3.496.0':
+ dependencies:
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@babel/code-frame@7.23.5':
+ dependencies:
+ '@babel/highlight': 7.23.4
+ chalk: 2.4.2
+
+ '@babel/helper-string-parser@7.24.8':
+ optional: true
+
+ '@babel/helper-validator-identifier@7.22.20': {}
+
+ '@babel/helper-validator-identifier@7.24.7':
+ optional: true
+
+ '@babel/highlight@7.23.4':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.22.20
+ chalk: 2.4.2
+ js-tokens: 4.0.0
+
+ '@babel/parser@7.25.6':
+ dependencies:
+ '@babel/types': 7.25.6
+ optional: true
+
+ '@babel/types@7.25.6':
+ dependencies:
+ '@babel/helper-string-parser': 7.24.8
+ '@babel/helper-validator-identifier': 7.24.7
+ to-fast-properties: 2.0.0
+ optional: true
+
+ '@cspotcode/source-map-support@0.8.1':
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.9
+
+ '@directus/constants@12.0.0': {}
+
+ '@directus/schema@12.1.0':
+ dependencies:
+ knex: 3.1.0
+ transitivePeerDependencies:
+ - better-sqlite3
+ - mysql
+ - mysql2
+ - pg
+ - pg-native
+ - sqlite3
+ - supports-color
+ - tedious
+
+ '@directus/sdk@17.0.1': {}
+
+ '@directus/types@12.0.1(knex@3.1.0)(vue@3.5.3(typescript@5.3.3))':
+ dependencies:
+ '@directus/constants': 12.0.0
+ '@directus/schema': 12.1.0
+ '@types/geojson': 7946.0.14
+ optionalDependencies:
+ knex: 3.1.0
+ vue: 3.5.3(typescript@5.3.3)
+ transitivePeerDependencies:
+ - better-sqlite3
+ - mysql
+ - mysql2
+ - pg
+ - pg-native
+ - sqlite3
+ - supports-color
+ - tedious
+
+ '@eslint-community/eslint-utils@4.4.0(eslint@8.56.0)':
+ dependencies:
+ eslint: 8.56.0
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.10.0': {}
+
+ '@eslint/eslintrc@2.1.4':
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.3.4(supports-color@8.1.1)
+ espree: 9.6.1
+ globals: 13.24.0
+ ignore: 5.3.0
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/js@8.56.0': {}
+
+ '@gar/promisify@1.1.3': {}
+
+ '@humanwhocodes/config-array@0.11.14':
+ dependencies:
+ '@humanwhocodes/object-schema': 2.0.2
+ debug: 4.3.4(supports-color@8.1.1)
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/object-schema@2.0.2': {}
+
+ '@isaacs/cliui@8.0.2':
+ dependencies:
+ string-width: 5.1.2
+ string-width-cjs: string-width@4.2.3
+ strip-ansi: 7.1.0
+ strip-ansi-cjs: strip-ansi@6.0.1
+ wrap-ansi: 8.1.0
+ wrap-ansi-cjs: wrap-ansi@7.0.0
+
+ '@isaacs/string-locale-compare@1.1.0': {}
+
+ '@jridgewell/resolve-uri@3.1.1': {}
+
+ '@jridgewell/sourcemap-codec@1.4.15': {}
+
+ '@jridgewell/sourcemap-codec@1.5.0':
+ optional: true
+
+ '@jridgewell/trace-mapping@0.3.9':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.1
+ '@jridgewell/sourcemap-codec': 1.4.15
+
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.17.0
+
+ '@npmcli/arborist@4.3.1':
+ dependencies:
+ '@isaacs/string-locale-compare': 1.1.0
+ '@npmcli/installed-package-contents': 1.0.7
+ '@npmcli/map-workspaces': 2.0.4
+ '@npmcli/metavuln-calculator': 2.0.0
+ '@npmcli/move-file': 1.1.2
+ '@npmcli/name-from-folder': 1.0.1
+ '@npmcli/node-gyp': 1.0.3
+ '@npmcli/package-json': 1.0.1
+ '@npmcli/run-script': 2.0.0
+ bin-links: 3.0.3
+ cacache: 15.3.0
+ common-ancestor-path: 1.0.1
+ json-parse-even-better-errors: 2.3.1
+ json-stringify-nice: 1.1.4
+ mkdirp: 1.0.4
+ mkdirp-infer-owner: 2.0.0
+ npm-install-checks: 4.0.0
+ npm-package-arg: 8.1.5
+ npm-pick-manifest: 6.1.1
+ npm-registry-fetch: 12.0.2
+ pacote: 12.0.3
+ parse-conflict-json: 2.0.2
+ proc-log: 1.0.0
+ promise-all-reject-late: 1.0.1
+ promise-call-limit: 1.0.2
+ read-package-json-fast: 2.0.3
+ readdir-scoped-modules: 1.1.0
+ rimraf: 3.0.2
+ semver: 7.5.4
+ ssri: 8.0.1
+ treeverse: 1.0.4
+ walk-up-path: 1.0.0
+ transitivePeerDependencies:
+ - bluebird
+ - supports-color
+
+ '@npmcli/fs@1.1.1':
+ dependencies:
+ '@gar/promisify': 1.1.3
+ semver: 7.5.4
+
+ '@npmcli/fs@2.1.2':
+ dependencies:
+ '@gar/promisify': 1.1.3
+ semver: 7.5.4
+
+ '@npmcli/fs@3.1.0':
+ dependencies:
+ semver: 7.5.4
+
+ '@npmcli/git@2.1.0':
+ dependencies:
+ '@npmcli/promise-spawn': 1.3.2
+ lru-cache: 6.0.0
+ mkdirp: 1.0.4
+ npm-pick-manifest: 6.1.1
+ promise-inflight: 1.0.1
+ promise-retry: 2.0.1
+ semver: 7.5.4
+ which: 2.0.2
+ transitivePeerDependencies:
+ - bluebird
+
+ '@npmcli/git@4.1.0':
+ dependencies:
+ '@npmcli/promise-spawn': 6.0.2
+ lru-cache: 7.18.3
+ npm-pick-manifest: 8.0.2
+ proc-log: 3.0.0
+ promise-inflight: 1.0.1
+ promise-retry: 2.0.1
+ semver: 7.5.4
+ which: 3.0.1
+ transitivePeerDependencies:
+ - bluebird
+
+ '@npmcli/installed-package-contents@1.0.7':
+ dependencies:
+ npm-bundled: 1.1.2
+ npm-normalize-package-bin: 1.0.1
+
+ '@npmcli/installed-package-contents@2.0.2':
+ dependencies:
+ npm-bundled: 3.0.0
+ npm-normalize-package-bin: 3.0.1
+
+ '@npmcli/map-workspaces@2.0.4':
+ dependencies:
+ '@npmcli/name-from-folder': 1.0.1
+ glob: 8.1.0
+ minimatch: 5.1.6
+ read-package-json-fast: 2.0.3
+
+ '@npmcli/metavuln-calculator@2.0.0':
+ dependencies:
+ cacache: 15.3.0
+ json-parse-even-better-errors: 2.3.1
+ pacote: 12.0.3
+ semver: 7.5.4
+ transitivePeerDependencies:
+ - bluebird
+ - supports-color
+
+ '@npmcli/move-file@1.1.2':
+ dependencies:
+ mkdirp: 1.0.4
+ rimraf: 3.0.2
+
+ '@npmcli/move-file@2.0.1':
+ dependencies:
+ mkdirp: 1.0.4
+ rimraf: 3.0.2
+
+ '@npmcli/name-from-folder@1.0.1': {}
+
+ '@npmcli/node-gyp@1.0.3': {}
+
+ '@npmcli/node-gyp@3.0.0': {}
+
+ '@npmcli/package-json@1.0.1':
+ dependencies:
+ json-parse-even-better-errors: 2.3.1
+
+ '@npmcli/promise-spawn@1.3.2':
+ dependencies:
+ infer-owner: 1.0.4
+
+ '@npmcli/promise-spawn@6.0.2':
+ dependencies:
+ which: 3.0.1
+
+ '@npmcli/run-script@2.0.0':
+ dependencies:
+ '@npmcli/node-gyp': 1.0.3
+ '@npmcli/promise-spawn': 1.3.2
+ node-gyp: 8.4.1
+ read-package-json-fast: 2.0.3
+ transitivePeerDependencies:
+ - bluebird
+ - supports-color
+
+ '@npmcli/run-script@6.0.2':
+ dependencies:
+ '@npmcli/node-gyp': 3.0.0
+ '@npmcli/promise-spawn': 6.0.2
+ node-gyp: 9.4.1
+ read-package-json-fast: 3.0.2
+ which: 3.0.1
+ transitivePeerDependencies:
+ - bluebird
+ - supports-color
+
+ '@oclif/core@3.18.1':
+ dependencies:
+ '@types/cli-progress': 3.11.5
+ ansi-escapes: 4.3.2
+ ansi-styles: 4.3.0
+ cardinal: 2.1.1
+ chalk: 4.1.2
+ clean-stack: 3.0.1
+ cli-progress: 3.12.0
+ color: 4.2.3
+ debug: 4.3.4(supports-color@8.1.1)
+ ejs: 3.1.9
+ get-package-type: 0.1.0
+ globby: 11.1.0
+ hyperlinker: 1.0.0
+ indent-string: 4.0.0
+ is-wsl: 2.2.0
+ js-yaml: 3.14.1
+ natural-orderby: 2.0.3
+ object-treeify: 1.1.33
+ password-prompt: 1.1.3
+ slice-ansi: 4.0.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ supports-color: 8.1.1
+ supports-hyperlinks: 2.3.0
+ widest-line: 3.1.0
+ wordwrap: 1.0.0
+ wrap-ansi: 7.0.0
+
+ '@oclif/plugin-help@6.0.12':
+ dependencies:
+ '@oclif/core': 3.18.1
+
+ '@oclif/plugin-not-found@3.0.9':
+ dependencies:
+ '@oclif/core': 3.18.1
+ chalk: 5.3.0
+ fast-levenshtein: 3.0.0
+
+ '@oclif/plugin-plugins@4.1.22':
+ dependencies:
+ '@oclif/core': 3.18.1
+ chalk: 5.3.0
+ debug: 4.3.4(supports-color@8.1.1)
+ npm: 10.4.0
+ npm-run-path: 4.0.1
+ semver: 7.5.4
+ shelljs: 0.8.5
+ validate-npm-package-name: 5.0.0
+ yarn: 1.22.21
+ transitivePeerDependencies:
+ - supports-color
+
+ '@oclif/plugin-warn-if-update-available@3.0.9':
+ dependencies:
+ '@oclif/core': 3.18.1
+ chalk: 5.3.0
+ debug: 4.3.4(supports-color@8.1.1)
+ http-call: 5.3.0
+ lodash.template: 4.5.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@oclif/test@3.1.13':
+ dependencies:
+ '@oclif/core': 3.18.1
+ chai: 4.4.1
+ fancy-test: 3.0.9
+ transitivePeerDependencies:
+ - supports-color
+
+ '@octokit/auth-token@2.5.0':
+ dependencies:
+ '@octokit/types': 6.41.0
+
+ '@octokit/core@3.6.0(encoding@0.1.13)':
+ dependencies:
+ '@octokit/auth-token': 2.5.0
+ '@octokit/graphql': 4.8.0(encoding@0.1.13)
+ '@octokit/request': 5.6.3(encoding@0.1.13)
+ '@octokit/request-error': 2.1.0
+ '@octokit/types': 6.41.0
+ before-after-hook: 2.2.3
+ universal-user-agent: 6.0.1
+ transitivePeerDependencies:
+ - encoding
+
+ '@octokit/endpoint@6.0.12':
+ dependencies:
+ '@octokit/types': 6.41.0
+ is-plain-object: 5.0.0
+ universal-user-agent: 6.0.1
+
+ '@octokit/graphql@4.8.0(encoding@0.1.13)':
+ dependencies:
+ '@octokit/request': 5.6.3(encoding@0.1.13)
+ '@octokit/types': 6.41.0
+ universal-user-agent: 6.0.1
+ transitivePeerDependencies:
+ - encoding
+
+ '@octokit/openapi-types@12.11.0': {}
+
+ '@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0(encoding@0.1.13))':
+ dependencies:
+ '@octokit/core': 3.6.0(encoding@0.1.13)
+ '@octokit/types': 6.41.0
+
+ '@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0(encoding@0.1.13))':
+ dependencies:
+ '@octokit/core': 3.6.0(encoding@0.1.13)
+
+ '@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0(encoding@0.1.13))':
+ dependencies:
+ '@octokit/core': 3.6.0(encoding@0.1.13)
+ '@octokit/types': 6.41.0
+ deprecation: 2.3.1
+
+ '@octokit/request-error@2.1.0':
+ dependencies:
+ '@octokit/types': 6.41.0
+ deprecation: 2.3.1
+ once: 1.4.0
+
+ '@octokit/request@5.6.3(encoding@0.1.13)':
+ dependencies:
+ '@octokit/endpoint': 6.0.12
+ '@octokit/request-error': 2.1.0
+ '@octokit/types': 6.41.0
+ is-plain-object: 5.0.0
+ node-fetch: 2.7.0(encoding@0.1.13)
+ universal-user-agent: 6.0.1
+ transitivePeerDependencies:
+ - encoding
+
+ '@octokit/rest@18.12.0(encoding@0.1.13)':
+ dependencies:
+ '@octokit/core': 3.6.0(encoding@0.1.13)
+ '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0(encoding@0.1.13))
+ '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0(encoding@0.1.13))
+ '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0(encoding@0.1.13))
+ transitivePeerDependencies:
+ - encoding
+
+ '@octokit/types@6.41.0':
+ dependencies:
+ '@octokit/openapi-types': 12.11.0
+
+ '@pkgjs/parseargs@0.11.0':
+ optional: true
+
+ '@sigstore/bundle@1.1.0':
+ dependencies:
+ '@sigstore/protobuf-specs': 0.2.1
+
+ '@sigstore/protobuf-specs@0.2.1': {}
+
+ '@sigstore/sign@1.0.0':
+ dependencies:
+ '@sigstore/bundle': 1.1.0
+ '@sigstore/protobuf-specs': 0.2.1
+ make-fetch-happen: 11.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@sigstore/tuf@1.0.3':
+ dependencies:
+ '@sigstore/protobuf-specs': 0.2.1
+ tuf-js: 1.1.7
+ transitivePeerDependencies:
+ - supports-color
+
+ '@sindresorhus/is@4.6.0': {}
+
+ '@sinonjs/commons@2.0.0':
+ dependencies:
+ type-detect: 4.0.8
+
+ '@sinonjs/commons@3.0.1':
+ dependencies:
+ type-detect: 4.0.8
+
+ '@sinonjs/fake-timers@10.3.0':
+ dependencies:
+ '@sinonjs/commons': 3.0.1
+
+ '@sinonjs/fake-timers@11.2.2':
+ dependencies:
+ '@sinonjs/commons': 3.0.1
+
+ '@sinonjs/samsam@8.0.0':
+ dependencies:
+ '@sinonjs/commons': 2.0.0
+ lodash.get: 4.4.2
+ type-detect: 4.0.8
+
+ '@sinonjs/text-encoding@0.7.2': {}
+
+ '@smithy/abort-controller@2.1.1':
+ dependencies:
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/chunked-blob-reader-native@2.1.1':
+ dependencies:
+ '@smithy/util-base64': 2.1.1
+ tslib: 2.6.2
+
+ '@smithy/chunked-blob-reader@2.1.1':
+ dependencies:
+ tslib: 2.6.2
+
+ '@smithy/config-resolver@2.1.1':
+ dependencies:
+ '@smithy/node-config-provider': 2.2.1
+ '@smithy/types': 2.9.1
+ '@smithy/util-config-provider': 2.2.1
+ '@smithy/util-middleware': 2.1.1
+ tslib: 2.6.2
+
+ '@smithy/core@1.3.1':
+ dependencies:
+ '@smithy/middleware-endpoint': 2.4.1
+ '@smithy/middleware-retry': 2.1.1
+ '@smithy/middleware-serde': 2.1.1
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/smithy-client': 2.3.1
+ '@smithy/types': 2.9.1
+ '@smithy/util-middleware': 2.1.1
+ tslib: 2.6.2
+
+ '@smithy/credential-provider-imds@2.2.1':
+ dependencies:
+ '@smithy/node-config-provider': 2.2.1
+ '@smithy/property-provider': 2.1.1
+ '@smithy/types': 2.9.1
+ '@smithy/url-parser': 2.1.1
+ tslib: 2.6.2
+
+ '@smithy/eventstream-codec@2.1.1':
+ dependencies:
+ '@aws-crypto/crc32': 3.0.0
+ '@smithy/types': 2.9.1
+ '@smithy/util-hex-encoding': 2.1.1
+ tslib: 2.6.2
+
+ '@smithy/eventstream-serde-browser@2.1.1':
+ dependencies:
+ '@smithy/eventstream-serde-universal': 2.1.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/eventstream-serde-config-resolver@2.1.1':
+ dependencies:
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/eventstream-serde-node@2.1.1':
+ dependencies:
+ '@smithy/eventstream-serde-universal': 2.1.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/eventstream-serde-universal@2.1.1':
+ dependencies:
+ '@smithy/eventstream-codec': 2.1.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/fetch-http-handler@2.4.1':
+ dependencies:
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/querystring-builder': 2.1.1
+ '@smithy/types': 2.9.1
+ '@smithy/util-base64': 2.1.1
+ tslib: 2.6.2
+
+ '@smithy/hash-blob-browser@2.1.1':
+ dependencies:
+ '@smithy/chunked-blob-reader': 2.1.1
+ '@smithy/chunked-blob-reader-native': 2.1.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/hash-node@2.1.1':
+ dependencies:
+ '@smithy/types': 2.9.1
+ '@smithy/util-buffer-from': 2.1.1
+ '@smithy/util-utf8': 2.1.1
+ tslib: 2.6.2
+
+ '@smithy/hash-stream-node@2.1.1':
+ dependencies:
+ '@smithy/types': 2.9.1
+ '@smithy/util-utf8': 2.1.1
+ tslib: 2.6.2
+
+ '@smithy/invalid-dependency@2.1.1':
+ dependencies:
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/is-array-buffer@2.1.1':
+ dependencies:
+ tslib: 2.6.2
+
+ '@smithy/md5-js@2.1.1':
+ dependencies:
+ '@smithy/types': 2.9.1
+ '@smithy/util-utf8': 2.1.1
+ tslib: 2.6.2
+
+ '@smithy/middleware-content-length@2.1.1':
+ dependencies:
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/middleware-endpoint@2.4.1':
+ dependencies:
+ '@smithy/middleware-serde': 2.1.1
+ '@smithy/node-config-provider': 2.2.1
+ '@smithy/shared-ini-file-loader': 2.3.1
+ '@smithy/types': 2.9.1
+ '@smithy/url-parser': 2.1.1
+ '@smithy/util-middleware': 2.1.1
+ tslib: 2.6.2
+
+ '@smithy/middleware-retry@2.1.1':
+ dependencies:
+ '@smithy/node-config-provider': 2.2.1
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/service-error-classification': 2.1.1
+ '@smithy/smithy-client': 2.3.1
+ '@smithy/types': 2.9.1
+ '@smithy/util-middleware': 2.1.1
+ '@smithy/util-retry': 2.1.1
+ tslib: 2.6.2
+ uuid: 8.3.2
+
+ '@smithy/middleware-serde@2.1.1':
+ dependencies:
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/middleware-stack@2.1.1':
+ dependencies:
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/node-config-provider@2.2.1':
+ dependencies:
+ '@smithy/property-provider': 2.1.1
+ '@smithy/shared-ini-file-loader': 2.3.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/node-http-handler@2.3.1':
+ dependencies:
+ '@smithy/abort-controller': 2.1.1
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/querystring-builder': 2.1.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/property-provider@2.1.1':
+ dependencies:
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/protocol-http@3.1.1':
+ dependencies:
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/querystring-builder@2.1.1':
+ dependencies:
+ '@smithy/types': 2.9.1
+ '@smithy/util-uri-escape': 2.1.1
+ tslib: 2.6.2
+
+ '@smithy/querystring-parser@2.1.1':
+ dependencies:
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/service-error-classification@2.1.1':
+ dependencies:
+ '@smithy/types': 2.9.1
+
+ '@smithy/shared-ini-file-loader@2.3.1':
+ dependencies:
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/signature-v4@2.1.1':
+ dependencies:
+ '@smithy/eventstream-codec': 2.1.1
+ '@smithy/is-array-buffer': 2.1.1
+ '@smithy/types': 2.9.1
+ '@smithy/util-hex-encoding': 2.1.1
+ '@smithy/util-middleware': 2.1.1
+ '@smithy/util-uri-escape': 2.1.1
+ '@smithy/util-utf8': 2.1.1
+ tslib: 2.6.2
+
+ '@smithy/smithy-client@2.3.1':
+ dependencies:
+ '@smithy/middleware-endpoint': 2.4.1
+ '@smithy/middleware-stack': 2.1.1
+ '@smithy/protocol-http': 3.1.1
+ '@smithy/types': 2.9.1
+ '@smithy/util-stream': 2.1.1
+ tslib: 2.6.2
+
+ '@smithy/types@2.9.1':
+ dependencies:
+ tslib: 2.6.2
+
+ '@smithy/url-parser@2.1.1':
+ dependencies:
+ '@smithy/querystring-parser': 2.1.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/util-base64@2.1.1':
+ dependencies:
+ '@smithy/util-buffer-from': 2.1.1
+ tslib: 2.6.2
+
+ '@smithy/util-body-length-browser@2.1.1':
+ dependencies:
+ tslib: 2.6.2
+
+ '@smithy/util-body-length-node@2.2.1':
+ dependencies:
+ tslib: 2.6.2
+
+ '@smithy/util-buffer-from@2.1.1':
+ dependencies:
+ '@smithy/is-array-buffer': 2.1.1
+ tslib: 2.6.2
+
+ '@smithy/util-config-provider@2.2.1':
+ dependencies:
+ tslib: 2.6.2
+
+ '@smithy/util-defaults-mode-browser@2.1.1':
+ dependencies:
+ '@smithy/property-provider': 2.1.1
+ '@smithy/smithy-client': 2.3.1
+ '@smithy/types': 2.9.1
+ bowser: 2.11.0
+ tslib: 2.6.2
+
+ '@smithy/util-defaults-mode-node@2.1.1':
+ dependencies:
+ '@smithy/config-resolver': 2.1.1
+ '@smithy/credential-provider-imds': 2.2.1
+ '@smithy/node-config-provider': 2.2.1
+ '@smithy/property-provider': 2.1.1
+ '@smithy/smithy-client': 2.3.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/util-endpoints@1.1.1':
+ dependencies:
+ '@smithy/node-config-provider': 2.2.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/util-hex-encoding@2.1.1':
+ dependencies:
+ tslib: 2.6.2
+
+ '@smithy/util-middleware@2.1.1':
+ dependencies:
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/util-retry@2.1.1':
+ dependencies:
+ '@smithy/service-error-classification': 2.1.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@smithy/util-stream@2.1.1':
+ dependencies:
+ '@smithy/fetch-http-handler': 2.4.1
+ '@smithy/node-http-handler': 2.3.1
+ '@smithy/types': 2.9.1
+ '@smithy/util-base64': 2.1.1
+ '@smithy/util-buffer-from': 2.1.1
+ '@smithy/util-hex-encoding': 2.1.1
+ '@smithy/util-utf8': 2.1.1
+ tslib: 2.6.2
+
+ '@smithy/util-uri-escape@2.1.1':
+ dependencies:
+ tslib: 2.6.2
+
+ '@smithy/util-utf8@2.1.1':
+ dependencies:
+ '@smithy/util-buffer-from': 2.1.1
+ tslib: 2.6.2
+
+ '@smithy/util-waiter@2.1.1':
+ dependencies:
+ '@smithy/abort-controller': 2.1.1
+ '@smithy/types': 2.9.1
+ tslib: 2.6.2
+
+ '@szmarczak/http-timer@4.0.6':
+ dependencies:
+ defer-to-connect: 2.0.1
+
+ '@tootallnate/once@1.1.2': {}
+
+ '@tootallnate/once@2.0.0': {}
+
+ '@tsconfig/node10@1.0.9': {}
+
+ '@tsconfig/node12@1.0.11': {}
+
+ '@tsconfig/node14@1.0.3': {}
+
+ '@tsconfig/node16@1.0.4': {}
+
+ '@tufjs/canonical-json@1.0.0': {}
+
+ '@tufjs/models@1.0.4':
+ dependencies:
+ '@tufjs/canonical-json': 1.0.0
+ minimatch: 9.0.3
+
+ '@types/cacheable-request@6.0.3':
+ dependencies:
+ '@types/http-cache-semantics': 4.0.4
+ '@types/keyv': 3.1.4
+ '@types/node': 20.11.10
+ '@types/responselike': 1.0.3
+
+ '@types/chai@4.3.11': {}
+
+ '@types/cli-progress@3.11.5':
+ dependencies:
+ '@types/node': 20.11.10
+
+ '@types/expect@1.20.4': {}
+
+ '@types/geojson@7946.0.14': {}
+
+ '@types/http-cache-semantics@4.0.4': {}
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/json5@0.0.29': {}
+
+ '@types/keyv@3.1.4':
+ dependencies:
+ '@types/node': 20.11.10
+
+ '@types/lodash@4.14.202': {}
+
+ '@types/minimatch@3.0.5': {}
+
+ '@types/mocha@10.0.6': {}
+
+ '@types/node@15.14.9': {}
+
+ '@types/node@20.11.10':
+ dependencies:
+ undici-types: 5.26.5
+
+ '@types/normalize-package-data@2.4.4': {}
+
+ '@types/responselike@1.0.3':
+ dependencies:
+ '@types/node': 20.11.10
+
+ '@types/semver@7.5.6': {}
+
+ '@types/sinon@17.0.3':
+ dependencies:
+ '@types/sinonjs__fake-timers': 8.1.5
+
+ '@types/sinonjs__fake-timers@8.1.5': {}
+
+ '@types/vinyl@2.0.11':
+ dependencies:
+ '@types/expect': 1.20.4
+ '@types/node': 20.11.10
+
+ '@typescript-eslint/eslint-plugin@6.20.0(@typescript-eslint/parser@6.20.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.10.0
+ '@typescript-eslint/parser': 6.20.0(eslint@8.56.0)(typescript@5.3.3)
+ '@typescript-eslint/scope-manager': 6.20.0
+ '@typescript-eslint/type-utils': 6.20.0(eslint@8.56.0)(typescript@5.3.3)
+ '@typescript-eslint/utils': 6.20.0(eslint@8.56.0)(typescript@5.3.3)
+ '@typescript-eslint/visitor-keys': 6.20.0
+ debug: 4.3.4(supports-color@8.1.1)
+ eslint: 8.56.0
+ graphemer: 1.4.0
+ ignore: 5.3.0
+ natural-compare: 1.4.0
+ semver: 7.5.4
+ ts-api-utils: 1.0.3(typescript@5.3.3)
+ optionalDependencies:
+ typescript: 5.3.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@6.20.0(eslint@8.56.0)(typescript@5.3.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 6.20.0
+ '@typescript-eslint/types': 6.20.0
+ '@typescript-eslint/typescript-estree': 6.20.0(typescript@5.3.3)
+ '@typescript-eslint/visitor-keys': 6.20.0
+ debug: 4.3.4(supports-color@8.1.1)
+ eslint: 8.56.0
+ optionalDependencies:
+ typescript: 5.3.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@6.20.0':
+ dependencies:
+ '@typescript-eslint/types': 6.20.0
+ '@typescript-eslint/visitor-keys': 6.20.0
+
+ '@typescript-eslint/type-utils@6.20.0(eslint@8.56.0)(typescript@5.3.3)':
+ dependencies:
+ '@typescript-eslint/typescript-estree': 6.20.0(typescript@5.3.3)
+ '@typescript-eslint/utils': 6.20.0(eslint@8.56.0)(typescript@5.3.3)
+ debug: 4.3.4(supports-color@8.1.1)
+ eslint: 8.56.0
+ ts-api-utils: 1.0.3(typescript@5.3.3)
+ optionalDependencies:
+ typescript: 5.3.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/types@6.20.0': {}
+
+ '@typescript-eslint/typescript-estree@6.20.0(typescript@5.3.3)':
+ dependencies:
+ '@typescript-eslint/types': 6.20.0
+ '@typescript-eslint/visitor-keys': 6.20.0
+ debug: 4.3.4(supports-color@8.1.1)
+ globby: 11.1.0
+ is-glob: 4.0.3
+ minimatch: 9.0.3
+ semver: 7.5.4
+ ts-api-utils: 1.0.3(typescript@5.3.3)
+ optionalDependencies:
+ typescript: 5.3.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@6.20.0(eslint@8.56.0)(typescript@5.3.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
+ '@types/json-schema': 7.0.15
+ '@types/semver': 7.5.6
+ '@typescript-eslint/scope-manager': 6.20.0
+ '@typescript-eslint/types': 6.20.0
+ '@typescript-eslint/typescript-estree': 6.20.0(typescript@5.3.3)
+ eslint: 8.56.0
+ semver: 7.5.4
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ '@typescript-eslint/visitor-keys@6.20.0':
+ dependencies:
+ '@typescript-eslint/types': 6.20.0
+ eslint-visitor-keys: 3.4.3
+
+ '@ungap/structured-clone@1.2.0': {}
+
+ '@vue/compiler-core@3.5.3':
+ dependencies:
+ '@babel/parser': 7.25.6
+ '@vue/shared': 3.5.3
+ entities: 4.5.0
+ estree-walker: 2.0.2
+ source-map-js: 1.2.1
+ optional: true
+
+ '@vue/compiler-dom@3.5.3':
+ dependencies:
+ '@vue/compiler-core': 3.5.3
+ '@vue/shared': 3.5.3
+ optional: true
+
+ '@vue/compiler-sfc@3.5.3':
+ dependencies:
+ '@babel/parser': 7.25.6
+ '@vue/compiler-core': 3.5.3
+ '@vue/compiler-dom': 3.5.3
+ '@vue/compiler-ssr': 3.5.3
+ '@vue/shared': 3.5.3
+ estree-walker: 2.0.2
+ magic-string: 0.30.11
+ postcss: 8.4.45
+ source-map-js: 1.2.1
+ optional: true
+
+ '@vue/compiler-ssr@3.5.3':
+ dependencies:
+ '@vue/compiler-dom': 3.5.3
+ '@vue/shared': 3.5.3
+ optional: true
+
+ '@vue/reactivity@3.5.3':
+ dependencies:
+ '@vue/shared': 3.5.3
+ optional: true
+
+ '@vue/runtime-core@3.5.3':
+ dependencies:
+ '@vue/reactivity': 3.5.3
+ '@vue/shared': 3.5.3
+ optional: true
+
+ '@vue/runtime-dom@3.5.3':
+ dependencies:
+ '@vue/reactivity': 3.5.3
+ '@vue/runtime-core': 3.5.3
+ '@vue/shared': 3.5.3
+ csstype: 3.1.3
+ optional: true
+
+ '@vue/server-renderer@3.5.3(vue@3.5.3(typescript@5.3.3))':
+ dependencies:
+ '@vue/compiler-ssr': 3.5.3
+ '@vue/shared': 3.5.3
+ vue: 3.5.3(typescript@5.3.3)
+ optional: true
+
+ '@vue/shared@3.5.3':
+ optional: true
+
+ abbrev@1.1.1: {}
+
+ abort-controller@3.0.0:
+ dependencies:
+ event-target-shim: 5.0.1
+
+ acorn-jsx@5.3.2(acorn@8.11.3):
+ dependencies:
+ acorn: 8.11.3
+
+ acorn-walk@8.3.2: {}
+
+ acorn@8.11.3: {}
+
+ agent-base@6.0.2:
+ dependencies:
+ debug: 4.3.4(supports-color@8.1.1)
+ transitivePeerDependencies:
+ - supports-color
+
+ agentkeepalive@4.5.0:
+ dependencies:
+ humanize-ms: 1.2.1
+
+ aggregate-error@3.1.0:
+ dependencies:
+ clean-stack: 2.2.0
+ indent-string: 4.0.0
+
+ ajv@6.12.6:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
+ ansi-colors@4.1.1: {}
+
+ ansi-escapes@4.3.2:
+ dependencies:
+ type-fest: 0.21.3
+
+ ansi-regex@5.0.1: {}
+
+ ansi-regex@6.0.1: {}
+
+ ansi-styles@3.2.1:
+ dependencies:
+ color-convert: 1.9.3
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ ansi-styles@6.2.1: {}
+
+ ansicolors@0.3.2: {}
+
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+
+ aproba@2.0.0: {}
+
+ are-we-there-yet@2.0.0:
+ dependencies:
+ delegates: 1.0.0
+ readable-stream: 3.6.2
+
+ are-we-there-yet@3.0.1:
+ dependencies:
+ delegates: 1.0.0
+ readable-stream: 3.6.2
+
+ arg@4.1.3: {}
+
+ argparse@1.0.10:
+ dependencies:
+ sprintf-js: 1.0.3
+
+ argparse@2.0.1: {}
+
+ array-buffer-byte-length@1.0.0:
+ dependencies:
+ call-bind: 1.0.5
+ is-array-buffer: 3.0.2
+
+ array-differ@3.0.0: {}
+
+ array-includes@3.1.7:
+ dependencies:
+ call-bind: 1.0.5
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+ get-intrinsic: 1.2.2
+ is-string: 1.0.7
+
+ array-union@2.1.0: {}
+
+ array.prototype.findlastindex@1.2.3:
+ dependencies:
+ call-bind: 1.0.5
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+ es-shim-unscopables: 1.0.2
+ get-intrinsic: 1.2.2
+
+ array.prototype.flat@1.3.2:
+ dependencies:
+ call-bind: 1.0.5
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+ es-shim-unscopables: 1.0.2
+
+ array.prototype.flatmap@1.3.2:
+ dependencies:
+ call-bind: 1.0.5
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+ es-shim-unscopables: 1.0.2
+
+ arraybuffer.prototype.slice@1.0.2:
+ dependencies:
+ array-buffer-byte-length: 1.0.0
+ call-bind: 1.0.5
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+ get-intrinsic: 1.2.2
+ is-array-buffer: 3.0.2
+ is-shared-array-buffer: 1.0.2
+
+ arrify@2.0.1: {}
+
+ asap@2.0.6: {}
+
+ assertion-error@1.1.0: {}
+
+ assertion-error@2.0.1: {}
+
+ astral-regex@2.0.0: {}
+
+ async-retry@1.3.3:
+ dependencies:
+ retry: 0.13.1
+
+ async@3.2.5: {}
+
+ available-typed-arrays@1.0.5: {}
+
+ balanced-match@1.0.2: {}
+
+ base64-js@1.5.1: {}
+
+ before-after-hook@2.2.3: {}
+
+ bin-links@3.0.3:
+ dependencies:
+ cmd-shim: 5.0.0
+ mkdirp-infer-owner: 2.0.0
+ npm-normalize-package-bin: 2.0.0
+ read-cmd-shim: 3.0.1
+ rimraf: 3.0.2
+ write-file-atomic: 4.0.2
+
+ binary-extensions@2.2.0: {}
+
+ binaryextensions@4.19.0: {}
+
+ bl@4.1.0:
+ dependencies:
+ buffer: 5.7.1
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
+ bottleneck@2.19.5: {}
+
+ bowser@2.11.0: {}
+
+ brace-expansion@1.1.11:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@2.0.1:
+ dependencies:
+ balanced-match: 1.0.2
+
+ braces@3.0.2:
+ dependencies:
+ fill-range: 7.0.1
+
+ browser-stdout@1.3.1: {}
+
+ buffer@5.7.1:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ buffer@6.0.3:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ builtin-modules@3.3.0: {}
+
+ builtins@1.0.3: {}
+
+ builtins@5.0.1:
+ dependencies:
+ semver: 7.5.4
+
+ cacache@15.3.0:
+ dependencies:
+ '@npmcli/fs': 1.1.1
+ '@npmcli/move-file': 1.1.2
+ chownr: 2.0.0
+ fs-minipass: 2.1.0
+ glob: 7.2.3
+ infer-owner: 1.0.4
+ lru-cache: 6.0.0
+ minipass: 3.3.6
+ minipass-collect: 1.0.2
+ minipass-flush: 1.0.5
+ minipass-pipeline: 1.2.4
+ mkdirp: 1.0.4
+ p-map: 4.0.0
+ promise-inflight: 1.0.1
+ rimraf: 3.0.2
+ ssri: 8.0.1
+ tar: 6.2.0
+ unique-filename: 1.1.1
+ transitivePeerDependencies:
+ - bluebird
+
+ cacache@16.1.3:
+ dependencies:
+ '@npmcli/fs': 2.1.2
+ '@npmcli/move-file': 2.0.1
+ chownr: 2.0.0
+ fs-minipass: 2.1.0
+ glob: 8.1.0
+ infer-owner: 1.0.4
+ lru-cache: 7.18.3
+ minipass: 3.3.6
+ minipass-collect: 1.0.2
+ minipass-flush: 1.0.5
+ minipass-pipeline: 1.2.4
+ mkdirp: 1.0.4
+ p-map: 4.0.0
+ promise-inflight: 1.0.1
+ rimraf: 3.0.2
+ ssri: 9.0.1
+ tar: 6.2.0
+ unique-filename: 2.0.1
+ transitivePeerDependencies:
+ - bluebird
+
+ cacache@17.1.4:
+ dependencies:
+ '@npmcli/fs': 3.1.0
+ fs-minipass: 3.0.3
+ glob: 10.3.10
+ lru-cache: 7.18.3
+ minipass: 7.0.4
+ minipass-collect: 1.0.2
+ minipass-flush: 1.0.5
+ minipass-pipeline: 1.2.4
+ p-map: 4.0.0
+ ssri: 10.0.5
+ tar: 6.2.0
+ unique-filename: 3.0.0
+
+ cacheable-lookup@5.0.4: {}
+
+ cacheable-request@7.0.4:
+ dependencies:
+ clone-response: 1.0.3
+ get-stream: 5.2.0
+ http-cache-semantics: 4.1.1
+ keyv: 4.5.4
+ lowercase-keys: 2.0.0
+ normalize-url: 6.1.0
+ responselike: 2.0.1
+
+ call-bind@1.0.5:
+ dependencies:
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.2
+ set-function-length: 1.2.0
+
+ callsites@3.1.0: {}
+
+ camel-case@4.1.2:
+ dependencies:
+ pascal-case: 3.1.2
+ tslib: 2.6.2
+
+ camelcase@6.3.0: {}
+
+ capital-case@1.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.6.2
+ upper-case-first: 2.0.2
+
+ cardinal@2.1.1:
+ dependencies:
+ ansicolors: 0.3.2
+ redeyed: 2.1.1
+
+ chai@4.4.1:
+ dependencies:
+ assertion-error: 1.1.0
+ check-error: 1.0.3
+ deep-eql: 4.1.3
+ get-func-name: 2.0.2
+ loupe: 2.3.7
+ pathval: 1.1.1
+ type-detect: 4.0.8
+
+ chai@5.0.3:
+ dependencies:
+ assertion-error: 2.0.1
+ check-error: 2.0.0
+ deep-eql: 5.0.1
+ loupe: 3.1.0
+ pathval: 2.0.0
+
+ chalk@2.4.2:
+ dependencies:
+ ansi-styles: 3.2.1
+ escape-string-regexp: 1.0.5
+ supports-color: 5.5.0
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ chalk@5.3.0: {}
+
+ change-case@4.1.2:
+ 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.6.2
+
+ chardet@0.7.0: {}
+
+ check-error@1.0.3:
+ dependencies:
+ get-func-name: 2.0.2
+
+ check-error@2.0.0: {}
+
+ chokidar@3.5.3:
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.2
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ chownr@2.0.0: {}
+
+ ci-info@3.9.0: {}
+
+ citty@0.1.5:
+ dependencies:
+ consola: 3.2.3
+
+ clean-regexp@1.0.0:
+ dependencies:
+ escape-string-regexp: 1.0.5
+
+ clean-stack@2.2.0: {}
+
+ clean-stack@3.0.1:
+ dependencies:
+ escape-string-regexp: 4.0.0
+
+ cli-cursor@3.1.0:
+ dependencies:
+ restore-cursor: 3.1.0
+
+ cli-progress@3.12.0:
+ dependencies:
+ string-width: 4.2.3
+
+ cli-spinners@2.9.2: {}
+
+ cli-table@0.3.11:
+ dependencies:
+ colors: 1.0.3
+
+ cli-width@3.0.0: {}
+
+ cliui@7.0.4:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+
+ clone-buffer@1.0.0: {}
+
+ clone-response@1.0.3:
+ dependencies:
+ mimic-response: 1.0.1
+
+ clone-stats@1.0.0: {}
+
+ clone@1.0.4: {}
+
+ clone@2.1.2: {}
+
+ cloneable-readable@1.1.3:
+ dependencies:
+ inherits: 2.0.4
+ process-nextick-args: 2.0.1
+ readable-stream: 2.3.8
+
+ cmd-shim@5.0.0:
+ dependencies:
+ mkdirp-infer-owner: 2.0.0
+
+ color-convert@1.9.3:
+ dependencies:
+ color-name: 1.1.3
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.3: {}
+
+ color-name@1.1.4: {}
+
+ color-string@1.9.1:
+ dependencies:
+ color-name: 1.1.4
+ simple-swizzle: 0.2.2
+
+ color-support@1.1.3: {}
+
+ color@4.2.3:
+ dependencies:
+ color-convert: 2.0.1
+ color-string: 1.9.1
+
+ colorette@2.0.19: {}
+
+ colors@1.0.3: {}
+
+ commander@10.0.1: {}
+
+ commander@7.1.0: {}
+
+ common-ancestor-path@1.0.1: {}
+
+ commondir@1.0.1: {}
+
+ concat-map@0.0.1: {}
+
+ confusing-browser-globals@1.0.11: {}
+
+ consola@3.2.3: {}
+
+ console-control-strings@1.1.0: {}
+
+ constant-case@3.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.6.2
+ upper-case: 2.0.2
+
+ content-type@1.0.5: {}
+
+ core-util-is@1.0.3: {}
+
+ create-require@1.1.1: {}
+
+ cross-spawn@7.0.3:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ csstype@3.1.3:
+ optional: true
+
+ dargs@7.0.0: {}
+
+ dateformat@4.6.3: {}
+
+ debug@3.2.7:
+ dependencies:
+ ms: 2.1.3
+
+ debug@4.3.4(supports-color@8.1.1):
+ dependencies:
+ ms: 2.1.2
+ optionalDependencies:
+ supports-color: 8.1.1
+
+ debug@4.3.7:
+ dependencies:
+ ms: 2.1.3
+
+ debuglog@1.0.1: {}
+
+ decamelize@4.0.0: {}
+
+ decompress-response@6.0.0:
+ dependencies:
+ mimic-response: 3.1.0
+
+ deep-eql@4.1.3:
+ dependencies:
+ type-detect: 4.0.8
+
+ deep-eql@5.0.1: {}
+
+ deep-extend@0.6.0: {}
+
+ deep-is@0.1.4: {}
+
+ defaults@1.0.4:
+ dependencies:
+ clone: 1.0.4
+
+ defer-to-connect@2.0.1: {}
+
+ define-data-property@1.1.1:
+ dependencies:
+ get-intrinsic: 1.2.2
+ gopd: 1.0.1
+ has-property-descriptors: 1.0.1
+
+ define-properties@1.2.1:
+ dependencies:
+ define-data-property: 1.1.1
+ has-property-descriptors: 1.0.1
+ object-keys: 1.1.1
+
+ defu@6.1.4: {}
+
+ delegates@1.0.0: {}
+
+ deprecation@2.3.1: {}
+
+ dezalgo@1.0.4:
+ dependencies:
+ asap: 2.0.6
+ wrappy: 1.0.2
+
+ diff@4.0.2: {}
+
+ diff@5.0.0: {}
+
+ diff@5.1.0: {}
+
+ dir-glob@3.0.1:
+ dependencies:
+ path-type: 4.0.0
+
+ doctrine@2.1.0:
+ dependencies:
+ esutils: 2.0.3
+
+ doctrine@3.0.0:
+ dependencies:
+ esutils: 2.0.3
+
+ dot-case@3.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.6.2
+
+ dotenv@16.4.1: {}
+
+ eastasianwidth@0.2.0: {}
+
+ ejs@3.1.9:
+ dependencies:
+ jake: 10.8.7
+
+ emoji-regex@8.0.0: {}
+
+ emoji-regex@9.2.2: {}
+
+ encoding@0.1.13:
+ dependencies:
+ iconv-lite: 0.6.3
+ optional: true
+
+ end-of-stream@1.4.4:
+ dependencies:
+ once: 1.4.0
+
+ enhanced-resolve@5.15.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.2.1
+
+ entities@4.5.0:
+ optional: true
+
+ env-paths@2.2.1: {}
+
+ err-code@2.0.3: {}
+
+ error-ex@1.3.2:
+ dependencies:
+ is-arrayish: 0.2.1
+
+ error@10.4.0: {}
+
+ es-abstract@1.22.3:
+ dependencies:
+ array-buffer-byte-length: 1.0.0
+ arraybuffer.prototype.slice: 1.0.2
+ available-typed-arrays: 1.0.5
+ call-bind: 1.0.5
+ es-set-tostringtag: 2.0.2
+ es-to-primitive: 1.2.1
+ function.prototype.name: 1.1.6
+ get-intrinsic: 1.2.2
+ get-symbol-description: 1.0.0
+ globalthis: 1.0.3
+ gopd: 1.0.1
+ has-property-descriptors: 1.0.1
+ has-proto: 1.0.1
+ has-symbols: 1.0.3
+ hasown: 2.0.0
+ internal-slot: 1.0.6
+ is-array-buffer: 3.0.2
+ is-callable: 1.2.7
+ is-negative-zero: 2.0.2
+ is-regex: 1.1.4
+ is-shared-array-buffer: 1.0.2
+ is-string: 1.0.7
+ is-typed-array: 1.1.12
+ is-weakref: 1.0.2
+ object-inspect: 1.13.1
+ object-keys: 1.1.1
+ object.assign: 4.1.5
+ regexp.prototype.flags: 1.5.1
+ safe-array-concat: 1.1.0
+ safe-regex-test: 1.0.2
+ string.prototype.trim: 1.2.8
+ string.prototype.trimend: 1.0.7
+ string.prototype.trimstart: 1.0.7
+ typed-array-buffer: 1.0.0
+ typed-array-byte-length: 1.0.0
+ typed-array-byte-offset: 1.0.0
+ typed-array-length: 1.0.4
+ unbox-primitive: 1.0.2
+ which-typed-array: 1.1.13
+
+ es-set-tostringtag@2.0.2:
+ dependencies:
+ get-intrinsic: 1.2.2
+ has-tostringtag: 1.0.0
+ hasown: 2.0.0
+
+ es-shim-unscopables@1.0.2:
+ dependencies:
+ hasown: 2.0.0
+
+ es-to-primitive@1.2.1:
+ dependencies:
+ is-callable: 1.2.7
+ is-date-object: 1.0.5
+ is-symbol: 1.0.4
+
+ escalade@3.1.1: {}
+
+ escalade@3.2.0: {}
+
+ escape-string-regexp@1.0.5: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ eslint-config-oclif-typescript@3.0.41(eslint@8.56.0)(typescript@5.3.3):
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 6.20.0(@typescript-eslint/parser@6.20.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3)
+ '@typescript-eslint/parser': 6.20.0(eslint@8.56.0)(typescript@5.3.3)
+ eslint-config-xo-space: 0.34.0(eslint@8.56.0)
+ eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.20.0(eslint@8.56.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.56.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.20.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0)
+ eslint-plugin-mocha: 10.2.0(eslint@8.56.0)
+ eslint-plugin-node: 11.1.0(eslint@8.56.0)
+ eslint-plugin-perfectionist: 2.5.0(eslint@8.56.0)(typescript@5.3.3)
+ transitivePeerDependencies:
+ - astro-eslint-parser
+ - eslint
+ - eslint-import-resolver-node
+ - eslint-import-resolver-webpack
+ - supports-color
+ - svelte
+ - svelte-eslint-parser
+ - typescript
+ - vue-eslint-parser
+
+ eslint-config-oclif@5.0.0(eslint@8.56.0):
+ dependencies:
+ eslint-config-xo-space: 0.34.0(eslint@8.56.0)
+ eslint-plugin-mocha: 10.2.0(eslint@8.56.0)
+ eslint-plugin-node: 11.1.0(eslint@8.56.0)
+ eslint-plugin-unicorn: 48.0.1(eslint@8.56.0)
+ transitivePeerDependencies:
+ - eslint
+
+ eslint-config-xo-space@0.34.0(eslint@8.56.0):
+ dependencies:
+ eslint: 8.56.0
+ eslint-config-xo: 0.43.1(eslint@8.56.0)
+
+ eslint-config-xo@0.43.1(eslint@8.56.0):
+ dependencies:
+ confusing-browser-globals: 1.0.11
+ eslint: 8.56.0
+
+ eslint-import-resolver-node@0.3.9:
+ dependencies:
+ debug: 3.2.7
+ is-core-module: 2.13.1
+ resolve: 1.22.8
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.20.0(eslint@8.56.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.56.0):
+ dependencies:
+ debug: 4.3.4(supports-color@8.1.1)
+ enhanced-resolve: 5.15.0
+ eslint: 8.56.0
+ eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.20.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.20.0(eslint@8.56.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.56.0))(eslint@8.56.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.20.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0)
+ fast-glob: 3.3.2
+ get-tsconfig: 4.7.2
+ is-core-module: 2.13.1
+ is-glob: 4.0.3
+ transitivePeerDependencies:
+ - '@typescript-eslint/parser'
+ - eslint-import-resolver-node
+ - eslint-import-resolver-webpack
+ - supports-color
+
+ eslint-module-utils@2.8.0(@typescript-eslint/parser@6.20.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.20.0(eslint@8.56.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.56.0))(eslint@8.56.0):
+ dependencies:
+ debug: 3.2.7
+ optionalDependencies:
+ '@typescript-eslint/parser': 6.20.0(eslint@8.56.0)(typescript@5.3.3)
+ eslint: 8.56.0
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.20.0(eslint@8.56.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.56.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-es@3.0.1(eslint@8.56.0):
+ dependencies:
+ eslint: 8.56.0
+ eslint-utils: 2.1.0
+ regexpp: 3.2.0
+
+ eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.20.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0):
+ dependencies:
+ array-includes: 3.1.7
+ array.prototype.findlastindex: 1.2.3
+ array.prototype.flat: 1.3.2
+ array.prototype.flatmap: 1.3.2
+ debug: 3.2.7
+ doctrine: 2.1.0
+ eslint: 8.56.0
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.20.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.20.0(eslint@8.56.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.56.0))(eslint@8.56.0)
+ hasown: 2.0.0
+ is-core-module: 2.13.1
+ is-glob: 4.0.3
+ minimatch: 3.1.2
+ object.fromentries: 2.0.7
+ object.groupby: 1.0.1
+ object.values: 1.1.7
+ semver: 6.3.1
+ tsconfig-paths: 3.15.0
+ optionalDependencies:
+ '@typescript-eslint/parser': 6.20.0(eslint@8.56.0)(typescript@5.3.3)
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+
+ eslint-plugin-mocha@10.2.0(eslint@8.56.0):
+ dependencies:
+ eslint: 8.56.0
+ eslint-utils: 3.0.0(eslint@8.56.0)
+ rambda: 7.5.0
+
+ eslint-plugin-node@11.1.0(eslint@8.56.0):
+ dependencies:
+ eslint: 8.56.0
+ eslint-plugin-es: 3.0.1(eslint@8.56.0)
+ eslint-utils: 2.1.0
+ ignore: 5.3.0
+ minimatch: 3.1.2
+ resolve: 1.22.8
+ semver: 6.3.1
+
+ eslint-plugin-perfectionist@2.5.0(eslint@8.56.0)(typescript@5.3.3):
+ dependencies:
+ '@typescript-eslint/utils': 6.20.0(eslint@8.56.0)(typescript@5.3.3)
+ eslint: 8.56.0
+ minimatch: 9.0.3
+ natural-compare-lite: 1.4.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ eslint-plugin-unicorn@48.0.1(eslint@8.56.0):
+ dependencies:
+ '@babel/helper-validator-identifier': 7.22.20
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
+ ci-info: 3.9.0
+ clean-regexp: 1.0.0
+ eslint: 8.56.0
+ esquery: 1.5.0
+ indent-string: 4.0.0
+ is-builtin-module: 3.2.1
+ jsesc: 3.0.2
+ lodash: 4.17.21
+ pluralize: 8.0.0
+ read-pkg-up: 7.0.1
+ regexp-tree: 0.1.27
+ regjsparser: 0.10.0
+ semver: 7.5.4
+ strip-indent: 3.0.0
+
+ eslint-scope@7.2.2:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-utils@2.1.0:
+ dependencies:
+ eslint-visitor-keys: 1.3.0
+
+ eslint-utils@3.0.0(eslint@8.56.0):
+ dependencies:
+ eslint: 8.56.0
+ eslint-visitor-keys: 2.1.0
+
+ eslint-visitor-keys@1.3.0: {}
+
+ eslint-visitor-keys@2.1.0: {}
+
+ eslint-visitor-keys@3.4.3: {}
+
+ eslint@8.56.0:
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
+ '@eslint-community/regexpp': 4.10.0
+ '@eslint/eslintrc': 2.1.4
+ '@eslint/js': 8.56.0
+ '@humanwhocodes/config-array': 0.11.14
+ '@humanwhocodes/module-importer': 1.0.1
+ '@nodelib/fs.walk': 1.2.8
+ '@ungap/structured-clone': 1.2.0
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.3
+ debug: 4.3.4(supports-color@8.1.1)
+ doctrine: 3.0.0
+ escape-string-regexp: 4.0.0
+ eslint-scope: 7.2.2
+ eslint-visitor-keys: 3.4.3
+ espree: 9.6.1
+ esquery: 1.5.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 6.0.1
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ globals: 13.24.0
+ graphemer: 1.4.0
+ ignore: 5.3.0
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ is-path-inside: 3.0.3
+ js-yaml: 4.1.0
+ json-stable-stringify-without-jsonify: 1.0.1
+ levn: 0.4.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.2
+ natural-compare: 1.4.0
+ optionator: 0.9.3
+ strip-ansi: 6.0.1
+ text-table: 0.2.0
+ transitivePeerDependencies:
+ - supports-color
+
+ esm@3.2.25: {}
+
+ espree@9.6.1:
+ dependencies:
+ acorn: 8.11.3
+ acorn-jsx: 5.3.2(acorn@8.11.3)
+ eslint-visitor-keys: 3.4.3
+
+ esprima@4.0.1: {}
+
+ esquery@1.5.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@5.3.0: {}
+
+ estree-walker@2.0.2:
+ optional: true
+
+ esutils@2.0.3: {}
+
+ event-target-shim@5.0.1: {}
+
+ eventemitter3@4.0.7: {}
+
+ events@3.3.0: {}
+
+ execa@5.1.1:
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 6.0.1
+ human-signals: 2.1.0
+ is-stream: 2.0.1
+ merge-stream: 2.0.0
+ npm-run-path: 4.0.1
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ strip-final-newline: 2.0.0
+
+ execa@8.0.1:
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 8.0.1
+ human-signals: 5.0.0
+ is-stream: 3.0.0
+ merge-stream: 2.0.0
+ npm-run-path: 5.2.0
+ onetime: 6.0.0
+ signal-exit: 4.1.0
+ strip-final-newline: 3.0.0
+
+ exponential-backoff@3.1.1: {}
+
+ external-editor@3.1.0:
+ dependencies:
+ chardet: 0.7.0
+ iconv-lite: 0.4.24
+ tmp: 0.0.33
+
+ fancy-test@3.0.9:
+ dependencies:
+ '@types/chai': 4.3.11
+ '@types/lodash': 4.14.202
+ '@types/node': 20.11.10
+ '@types/sinon': 17.0.3
+ lodash: 4.17.21
+ mock-stdin: 1.0.0
+ nock: 13.5.1
+ sinon: 16.1.3
+ stdout-stderr: 0.1.13
+ transitivePeerDependencies:
+ - supports-color
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-glob@3.3.2:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.5
+
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-levenshtein@2.0.6: {}
+
+ fast-levenshtein@3.0.0:
+ dependencies:
+ fastest-levenshtein: 1.0.16
+
+ fast-xml-parser@4.2.5:
+ dependencies:
+ strnum: 1.0.5
+
+ fastest-levenshtein@1.0.16: {}
+
+ fastq@1.17.0:
+ dependencies:
+ reusify: 1.0.4
+
+ figures@3.2.0:
+ dependencies:
+ escape-string-regexp: 1.0.5
+
+ file-entry-cache@6.0.1:
+ dependencies:
+ flat-cache: 3.2.0
+
+ filelist@1.0.4:
+ dependencies:
+ minimatch: 5.1.6
+
+ fill-range@7.0.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
+ find-up@4.1.0:
+ dependencies:
+ locate-path: 5.0.0
+ path-exists: 4.0.0
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ find-yarn-workspace-root2@1.2.16:
+ dependencies:
+ micromatch: 4.0.5
+ pkg-dir: 4.2.0
+
+ find-yarn-workspace-root@2.0.0:
+ dependencies:
+ micromatch: 4.0.5
+
+ first-chunk-stream@2.0.0:
+ dependencies:
+ readable-stream: 2.3.8
+
+ flat-cache@3.2.0:
+ dependencies:
+ flatted: 3.2.9
+ keyv: 4.5.4
+ rimraf: 3.0.2
+
+ flat@5.0.2: {}
+
+ flatted@3.2.9: {}
+
+ for-each@0.3.3:
+ dependencies:
+ is-callable: 1.2.7
+
+ foreground-child@3.1.1:
+ dependencies:
+ cross-spawn: 7.0.3
+ signal-exit: 4.1.0
+
+ formdata-node@6.0.3: {}
+
+ fs-extra@8.1.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 4.0.0
+ universalify: 0.1.2
+
+ fs-minipass@2.1.0:
+ dependencies:
+ minipass: 3.3.6
+
+ fs-minipass@3.0.3:
+ dependencies:
+ minipass: 7.0.4
+
+ fs.realpath@1.0.0: {}
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ function.prototype.name@1.1.6:
+ dependencies:
+ call-bind: 1.0.5
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+ functions-have-names: 1.2.3
+
+ functions-have-names@1.2.3: {}
+
+ gauge@3.0.2:
+ dependencies:
+ aproba: 2.0.0
+ color-support: 1.1.3
+ console-control-strings: 1.1.0
+ has-unicode: 2.0.1
+ object-assign: 4.1.1
+ signal-exit: 3.0.7
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wide-align: 1.1.5
+
+ gauge@4.0.4:
+ dependencies:
+ aproba: 2.0.0
+ color-support: 1.1.3
+ console-control-strings: 1.1.0
+ has-unicode: 2.0.1
+ signal-exit: 3.0.7
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wide-align: 1.1.5
+
+ get-caller-file@2.0.5: {}
+
+ get-func-name@2.0.2: {}
+
+ get-intrinsic@1.2.2:
+ dependencies:
+ function-bind: 1.1.2
+ has-proto: 1.0.1
+ has-symbols: 1.0.3
+ hasown: 2.0.0
+
+ get-package-type@0.1.0: {}
+
+ get-stream@5.2.0:
+ dependencies:
+ pump: 3.0.0
+
+ get-stream@6.0.1: {}
+
+ get-stream@8.0.1: {}
+
+ get-symbol-description@1.0.0:
+ dependencies:
+ call-bind: 1.0.5
+ get-intrinsic: 1.2.2
+
+ get-tsconfig@4.7.2:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ getopts@2.3.0: {}
+
+ giget@1.2.1:
+ dependencies:
+ citty: 0.1.5
+ consola: 3.2.3
+ defu: 6.1.4
+ node-fetch-native: 1.6.1
+ nypm: 0.3.6
+ ohash: 1.1.3
+ pathe: 1.1.2
+ tar: 6.2.0
+
+ github-slugger@1.5.0: {}
+
+ github-username@6.0.0(encoding@0.1.13):
+ dependencies:
+ '@octokit/rest': 18.12.0(encoding@0.1.13)
+ transitivePeerDependencies:
+ - encoding
+
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob@10.3.10:
+ dependencies:
+ foreground-child: 3.1.1
+ jackspeak: 2.3.6
+ minimatch: 9.0.3
+ minipass: 7.0.4
+ path-scurry: 1.10.1
+
+ glob@7.2.0:
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
+ glob@7.2.3:
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
+ glob@8.1.0:
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 5.1.6
+ once: 1.4.0
+
+ globals@13.24.0:
+ dependencies:
+ type-fest: 0.20.2
+
+ globalthis@1.0.3:
+ dependencies:
+ define-properties: 1.2.1
+
+ globby@11.1.0:
+ dependencies:
+ array-union: 2.1.0
+ dir-glob: 3.0.1
+ fast-glob: 3.3.2
+ ignore: 5.3.0
+ merge2: 1.4.1
+ slash: 3.0.0
+
+ gopd@1.0.1:
+ dependencies:
+ get-intrinsic: 1.2.2
+
+ got@11.8.6:
+ dependencies:
+ '@sindresorhus/is': 4.6.0
+ '@szmarczak/http-timer': 4.0.6
+ '@types/cacheable-request': 6.0.3
+ '@types/responselike': 1.0.3
+ cacheable-lookup: 5.0.4
+ cacheable-request: 7.0.4
+ decompress-response: 6.0.0
+ http2-wrapper: 1.0.3
+ lowercase-keys: 2.0.0
+ p-cancelable: 2.1.1
+ responselike: 2.0.1
+
+ graceful-fs@4.2.11: {}
+
+ graphemer@1.4.0: {}
+
+ grouped-queue@2.0.0: {}
+
+ has-bigints@1.0.2: {}
+
+ has-flag@3.0.0: {}
+
+ has-flag@4.0.0: {}
+
+ has-property-descriptors@1.0.1:
+ dependencies:
+ get-intrinsic: 1.2.2
+
+ has-proto@1.0.1: {}
+
+ has-symbols@1.0.3: {}
+
+ has-tostringtag@1.0.0:
+ dependencies:
+ has-symbols: 1.0.3
+
+ has-unicode@2.0.1: {}
+
+ hasown@2.0.0:
+ dependencies:
+ function-bind: 1.1.2
+
+ he@1.2.0: {}
+
+ header-case@2.0.4:
+ dependencies:
+ capital-case: 1.0.4
+ tslib: 2.6.2
+
+ hosted-git-info@2.8.9: {}
+
+ hosted-git-info@4.1.0:
+ dependencies:
+ lru-cache: 6.0.0
+
+ hosted-git-info@6.1.1:
+ dependencies:
+ lru-cache: 7.18.3
+
+ http-cache-semantics@4.1.1: {}
+
+ http-call@5.3.0:
+ dependencies:
+ content-type: 1.0.5
+ debug: 4.3.4(supports-color@8.1.1)
+ is-retry-allowed: 1.2.0
+ is-stream: 2.0.1
+ parse-json: 4.0.0
+ tunnel-agent: 0.6.0
+ transitivePeerDependencies:
+ - supports-color
+
+ http-proxy-agent@4.0.1:
+ dependencies:
+ '@tootallnate/once': 1.1.2
+ agent-base: 6.0.2
+ debug: 4.3.4(supports-color@8.1.1)
+ transitivePeerDependencies:
+ - supports-color
+
+ http-proxy-agent@5.0.0:
+ dependencies:
+ '@tootallnate/once': 2.0.0
+ agent-base: 6.0.2
+ debug: 4.3.4(supports-color@8.1.1)
+ transitivePeerDependencies:
+ - supports-color
+
+ http2-wrapper@1.0.3:
+ dependencies:
+ quick-lru: 5.1.1
+ resolve-alpn: 1.2.1
+
+ https-proxy-agent@5.0.1:
+ dependencies:
+ agent-base: 6.0.2
+ debug: 4.3.4(supports-color@8.1.1)
+ transitivePeerDependencies:
+ - supports-color
+
+ human-signals@2.1.0: {}
+
+ human-signals@5.0.0: {}
+
+ humanize-ms@1.2.1:
+ dependencies:
+ ms: 2.1.3
+
+ hyperlinker@1.0.0: {}
+
+ iconv-lite@0.4.24:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ iconv-lite@0.6.3:
+ dependencies:
+ safer-buffer: 2.1.2
+ optional: true
+
+ ieee754@1.2.1: {}
+
+ ignore-walk@4.0.1:
+ dependencies:
+ minimatch: 3.1.2
+
+ ignore-walk@6.0.4:
+ dependencies:
+ minimatch: 9.0.3
+
+ ignore@5.3.0: {}
+
+ import-fresh@3.3.0:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ imurmurhash@0.1.4: {}
+
+ indent-string@4.0.0: {}
+
+ infer-owner@1.0.4: {}
+
+ inflight@1.0.6:
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+
+ inherits@2.0.4: {}
+
+ inquirer@8.2.6:
+ dependencies:
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-width: 3.0.0
+ external-editor: 3.1.0
+ figures: 3.2.0
+ lodash: 4.17.21
+ mute-stream: 0.0.8
+ ora: 5.4.1
+ run-async: 2.4.1
+ rxjs: 7.8.1
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ through: 2.3.8
+ wrap-ansi: 6.2.0
+
+ internal-slot@1.0.6:
+ dependencies:
+ get-intrinsic: 1.2.2
+ hasown: 2.0.0
+ side-channel: 1.0.4
+
+ interpret@1.4.0: {}
+
+ interpret@2.2.0: {}
+
+ ip@2.0.0: {}
+
+ is-array-buffer@3.0.2:
+ dependencies:
+ call-bind: 1.0.5
+ get-intrinsic: 1.2.2
+ is-typed-array: 1.1.12
+
+ is-arrayish@0.2.1: {}
+
+ is-arrayish@0.3.2: {}
+
+ is-bigint@1.0.4:
+ dependencies:
+ has-bigints: 1.0.2
+
+ is-binary-path@2.1.0:
+ dependencies:
+ binary-extensions: 2.2.0
+
+ is-boolean-object@1.1.2:
+ dependencies:
+ call-bind: 1.0.5
+ has-tostringtag: 1.0.0
+
+ is-builtin-module@3.2.1:
+ dependencies:
+ builtin-modules: 3.3.0
+
+ is-callable@1.2.7: {}
+
+ is-core-module@2.13.1:
+ dependencies:
+ hasown: 2.0.0
+
+ is-date-object@1.0.5:
+ dependencies:
+ has-tostringtag: 1.0.0
+
+ is-docker@2.2.1: {}
+
+ is-extglob@2.1.1: {}
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-interactive@1.0.0: {}
+
+ is-lambda@1.0.1: {}
+
+ is-negative-zero@2.0.2: {}
+
+ is-number-object@1.0.7:
+ dependencies:
+ has-tostringtag: 1.0.0
+
+ is-number@7.0.0: {}
+
+ is-path-inside@3.0.3: {}
+
+ is-plain-obj@2.1.0: {}
+
+ is-plain-object@5.0.0: {}
+
+ is-regex@1.1.4:
+ dependencies:
+ call-bind: 1.0.5
+ has-tostringtag: 1.0.0
+
+ is-retry-allowed@1.2.0: {}
+
+ is-scoped@2.1.0:
+ dependencies:
+ scoped-regex: 2.1.0
+
+ is-shared-array-buffer@1.0.2:
+ dependencies:
+ call-bind: 1.0.5
+
+ is-stream@2.0.1: {}
+
+ is-stream@3.0.0: {}
+
+ is-string@1.0.7:
+ dependencies:
+ has-tostringtag: 1.0.0
+
+ is-symbol@1.0.4:
+ dependencies:
+ has-symbols: 1.0.3
+
+ is-typed-array@1.1.12:
+ dependencies:
+ which-typed-array: 1.1.13
+
+ is-unicode-supported@0.1.0: {}
+
+ is-utf8@0.2.1: {}
+
+ is-weakref@1.0.2:
+ dependencies:
+ call-bind: 1.0.5
+
+ is-wsl@2.2.0:
+ dependencies:
+ is-docker: 2.2.1
+
+ isarray@1.0.0: {}
+
+ isarray@2.0.5: {}
+
+ isbinaryfile@4.0.10: {}
+
+ isbinaryfile@5.0.0: {}
+
+ isexe@2.0.0: {}
+
+ jackspeak@2.3.6:
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
+
+ jake@10.8.7:
+ dependencies:
+ async: 3.2.5
+ chalk: 4.1.2
+ filelist: 1.0.4
+ minimatch: 3.1.2
+
+ js-tokens@4.0.0: {}
+
+ js-yaml@3.14.1:
+ dependencies:
+ argparse: 1.0.10
+ esprima: 4.0.1
+
+ js-yaml@4.1.0:
+ dependencies:
+ argparse: 2.0.1
+
+ jsesc@0.5.0: {}
+
+ jsesc@3.0.2: {}
+
+ json-buffer@3.0.1: {}
+
+ json-parse-better-errors@1.0.2: {}
+
+ json-parse-even-better-errors@2.3.1: {}
+
+ json-parse-even-better-errors@3.0.1: {}
+
+ json-schema-traverse@0.4.1: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ json-stringify-nice@1.1.4: {}
+
+ json-stringify-safe@5.0.1: {}
+
+ json5@1.0.2:
+ dependencies:
+ minimist: 1.2.8
+
+ jsonfile@4.0.0:
+ optionalDependencies:
+ graceful-fs: 4.2.11
+
+ jsonparse@1.3.1: {}
+
+ just-diff-apply@5.5.0: {}
+
+ just-diff@5.2.0: {}
+
+ just-extend@6.2.0: {}
+
+ keyv@4.5.4:
+ dependencies:
+ json-buffer: 3.0.1
+
+ knex@3.1.0:
+ dependencies:
+ colorette: 2.0.19
+ commander: 10.0.1
+ debug: 4.3.4(supports-color@8.1.1)
+ escalade: 3.2.0
+ 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.2
+ rechoir: 0.8.0
+ resolve-from: 5.0.0
+ tarn: 3.0.2
+ tildify: 2.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
+ lines-and-columns@1.2.4: {}
+
+ load-yaml-file@0.2.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ js-yaml: 3.14.1
+ pify: 4.0.1
+ strip-bom: 3.0.0
+
+ locate-path@5.0.0:
+ dependencies:
+ p-locate: 4.1.0
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ lodash._reinterpolate@3.0.0: {}
+
+ lodash.get@4.4.2: {}
+
+ lodash.merge@4.6.2: {}
+
+ lodash.template@4.5.0:
+ dependencies:
+ lodash._reinterpolate: 3.0.0
+ lodash.templatesettings: 4.2.0
+
+ lodash.templatesettings@4.2.0:
+ dependencies:
+ lodash._reinterpolate: 3.0.0
+
+ lodash@4.17.21: {}
+
+ log-symbols@4.1.0:
+ dependencies:
+ chalk: 4.1.2
+ is-unicode-supported: 0.1.0
+
+ loupe@2.3.7:
+ dependencies:
+ get-func-name: 2.0.2
+
+ loupe@3.1.0:
+ dependencies:
+ get-func-name: 2.0.2
+
+ lower-case@2.0.2:
+ dependencies:
+ tslib: 2.6.2
+
+ lowercase-keys@2.0.0: {}
+
+ lru-cache@10.2.0: {}
+
+ lru-cache@6.0.0:
+ dependencies:
+ yallist: 4.0.0
+
+ lru-cache@7.18.3: {}
+
+ magic-string@0.30.11:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.0
+ optional: true
+
+ make-error@1.3.6: {}
+
+ make-fetch-happen@10.2.1:
+ dependencies:
+ agentkeepalive: 4.5.0
+ cacache: 16.1.3
+ http-cache-semantics: 4.1.1
+ http-proxy-agent: 5.0.0
+ https-proxy-agent: 5.0.1
+ is-lambda: 1.0.1
+ lru-cache: 7.18.3
+ minipass: 3.3.6
+ minipass-collect: 1.0.2
+ minipass-fetch: 2.1.2
+ minipass-flush: 1.0.5
+ minipass-pipeline: 1.2.4
+ negotiator: 0.6.3
+ promise-retry: 2.0.1
+ socks-proxy-agent: 7.0.0
+ ssri: 9.0.1
+ transitivePeerDependencies:
+ - bluebird
+ - supports-color
+
+ make-fetch-happen@11.1.1:
+ dependencies:
+ agentkeepalive: 4.5.0
+ cacache: 17.1.4
+ http-cache-semantics: 4.1.1
+ http-proxy-agent: 5.0.0
+ https-proxy-agent: 5.0.1
+ is-lambda: 1.0.1
+ lru-cache: 7.18.3
+ minipass: 5.0.0
+ minipass-fetch: 3.0.4
+ minipass-flush: 1.0.5
+ minipass-pipeline: 1.2.4
+ negotiator: 0.6.3
+ promise-retry: 2.0.1
+ socks-proxy-agent: 7.0.0
+ ssri: 10.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ make-fetch-happen@9.1.0:
+ dependencies:
+ agentkeepalive: 4.5.0
+ cacache: 15.3.0
+ http-cache-semantics: 4.1.1
+ http-proxy-agent: 4.0.1
+ https-proxy-agent: 5.0.1
+ is-lambda: 1.0.1
+ lru-cache: 6.0.0
+ minipass: 3.3.6
+ minipass-collect: 1.0.2
+ minipass-fetch: 1.4.1
+ minipass-flush: 1.0.5
+ minipass-pipeline: 1.2.4
+ negotiator: 0.6.3
+ promise-retry: 2.0.1
+ socks-proxy-agent: 6.2.1
+ ssri: 8.0.1
+ transitivePeerDependencies:
+ - bluebird
+ - supports-color
+
+ mem-fs-editor@9.7.0(mem-fs@2.3.0):
+ dependencies:
+ binaryextensions: 4.19.0
+ commondir: 1.0.1
+ deep-extend: 0.6.0
+ ejs: 3.1.9
+ globby: 11.1.0
+ isbinaryfile: 5.0.0
+ minimatch: 7.4.6
+ multimatch: 5.0.0
+ normalize-path: 3.0.0
+ textextensions: 5.16.0
+ optionalDependencies:
+ mem-fs: 2.3.0
+
+ mem-fs@2.3.0:
+ dependencies:
+ '@types/node': 15.14.9
+ '@types/vinyl': 2.0.11
+ vinyl: 2.2.1
+ vinyl-file: 3.0.0
+
+ merge-stream@2.0.0: {}
+
+ merge2@1.4.1: {}
+
+ micromatch@4.0.5:
+ dependencies:
+ braces: 3.0.2
+ picomatch: 2.3.1
+
+ mimic-fn@2.1.0: {}
+
+ mimic-fn@4.0.0: {}
+
+ mimic-response@1.0.1: {}
+
+ mimic-response@3.1.0: {}
+
+ min-indent@1.0.1: {}
+
+ minimatch@3.1.2:
+ dependencies:
+ brace-expansion: 1.1.11
+
+ minimatch@5.0.1:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minimatch@5.1.6:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minimatch@7.4.6:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minimatch@9.0.3:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minimist@1.2.8: {}
+
+ minipass-collect@1.0.2:
+ dependencies:
+ minipass: 3.3.6
+
+ minipass-fetch@1.4.1:
+ dependencies:
+ minipass: 3.3.6
+ minipass-sized: 1.0.3
+ minizlib: 2.1.2
+ optionalDependencies:
+ encoding: 0.1.13
+
+ minipass-fetch@2.1.2:
+ dependencies:
+ minipass: 3.3.6
+ minipass-sized: 1.0.3
+ minizlib: 2.1.2
+ optionalDependencies:
+ encoding: 0.1.13
+
+ minipass-fetch@3.0.4:
+ dependencies:
+ minipass: 7.0.4
+ minipass-sized: 1.0.3
+ minizlib: 2.1.2
+ optionalDependencies:
+ encoding: 0.1.13
+
+ minipass-flush@1.0.5:
+ dependencies:
+ minipass: 3.3.6
+
+ minipass-json-stream@1.0.1:
+ dependencies:
+ jsonparse: 1.3.1
+ minipass: 3.3.6
+
+ minipass-pipeline@1.2.4:
+ dependencies:
+ minipass: 3.3.6
+
+ minipass-sized@1.0.3:
+ dependencies:
+ minipass: 3.3.6
+
+ minipass@3.3.6:
+ dependencies:
+ yallist: 4.0.0
+
+ minipass@5.0.0: {}
+
+ minipass@7.0.4: {}
+
+ minizlib@2.1.2:
+ dependencies:
+ minipass: 3.3.6
+ yallist: 4.0.0
+
+ mkdirp-infer-owner@2.0.0:
+ dependencies:
+ chownr: 2.0.0
+ infer-owner: 1.0.4
+ mkdirp: 1.0.4
+
+ mkdirp@1.0.4: {}
+
+ mocha@10.2.0:
+ dependencies:
+ ansi-colors: 4.1.1
+ browser-stdout: 1.3.1
+ chokidar: 3.5.3
+ debug: 4.3.4(supports-color@8.1.1)
+ diff: 5.0.0
+ escape-string-regexp: 4.0.0
+ find-up: 5.0.0
+ glob: 7.2.0
+ he: 1.2.0
+ js-yaml: 4.1.0
+ log-symbols: 4.1.0
+ minimatch: 5.0.1
+ ms: 2.1.3
+ nanoid: 3.3.3
+ serialize-javascript: 6.0.0
+ strip-json-comments: 3.1.1
+ supports-color: 8.1.1
+ workerpool: 6.2.1
+ yargs: 16.2.0
+ yargs-parser: 20.2.4
+ yargs-unparser: 2.0.0
+
+ mock-stdin@1.0.0: {}
+
+ ms@2.1.2: {}
+
+ ms@2.1.3: {}
+
+ multimatch@5.0.0:
+ dependencies:
+ '@types/minimatch': 3.0.5
+ array-differ: 3.0.0
+ array-union: 2.1.0
+ arrify: 2.0.1
+ minimatch: 3.1.2
+
+ mute-stream@0.0.8: {}
+
+ nanoid@3.3.3: {}
+
+ nanoid@3.3.7:
+ optional: true
+
+ natural-compare-lite@1.4.0: {}
+
+ natural-compare@1.4.0: {}
+
+ natural-orderby@2.0.3: {}
+
+ negotiator@0.6.3: {}
+
+ nise@5.1.7:
+ dependencies:
+ '@sinonjs/commons': 3.0.1
+ '@sinonjs/fake-timers': 11.2.2
+ '@sinonjs/text-encoding': 0.7.2
+ just-extend: 6.2.0
+ path-to-regexp: 6.2.1
+
+ no-case@3.0.4:
+ dependencies:
+ lower-case: 2.0.2
+ tslib: 2.6.2
+
+ nock@13.5.1:
+ dependencies:
+ debug: 4.3.7
+ json-stringify-safe: 5.0.1
+ propagate: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ node-fetch-native@1.6.1: {}
+
+ node-fetch@2.7.0(encoding@0.1.13):
+ dependencies:
+ whatwg-url: 5.0.0
+ optionalDependencies:
+ encoding: 0.1.13
+
+ node-gyp@8.4.1:
+ dependencies:
+ env-paths: 2.2.1
+ glob: 7.2.3
+ graceful-fs: 4.2.11
+ make-fetch-happen: 9.1.0
+ nopt: 5.0.0
+ npmlog: 6.0.2
+ rimraf: 3.0.2
+ semver: 7.5.4
+ tar: 6.2.0
+ which: 2.0.2
+ transitivePeerDependencies:
+ - bluebird
+ - supports-color
+
+ node-gyp@9.4.1:
+ dependencies:
+ env-paths: 2.2.1
+ exponential-backoff: 3.1.1
+ glob: 7.2.3
+ graceful-fs: 4.2.11
+ make-fetch-happen: 10.2.1
+ nopt: 6.0.0
+ npmlog: 6.0.2
+ rimraf: 3.0.2
+ semver: 7.5.4
+ tar: 6.2.0
+ which: 2.0.2
+ transitivePeerDependencies:
+ - bluebird
+ - supports-color
+
+ nopt@5.0.0:
+ dependencies:
+ abbrev: 1.1.1
+
+ nopt@6.0.0:
+ dependencies:
+ abbrev: 1.1.1
+
+ normalize-package-data@2.5.0:
+ dependencies:
+ hosted-git-info: 2.8.9
+ resolve: 1.22.8
+ semver: 5.7.2
+ validate-npm-package-license: 3.0.4
+
+ normalize-package-data@3.0.3:
+ dependencies:
+ hosted-git-info: 4.1.0
+ is-core-module: 2.13.1
+ semver: 7.5.4
+ validate-npm-package-license: 3.0.4
+
+ normalize-package-data@5.0.0:
+ dependencies:
+ hosted-git-info: 6.1.1
+ is-core-module: 2.13.1
+ semver: 7.5.4
+ validate-npm-package-license: 3.0.4
+
+ normalize-path@3.0.0: {}
+
+ normalize-url@6.1.0: {}
+
+ npm-bundled@1.1.2:
+ dependencies:
+ npm-normalize-package-bin: 1.0.1
+
+ npm-bundled@3.0.0:
+ dependencies:
+ npm-normalize-package-bin: 3.0.1
+
+ npm-install-checks@4.0.0:
+ dependencies:
+ semver: 7.5.4
+
+ npm-install-checks@6.3.0:
+ dependencies:
+ semver: 7.5.4
+
+ npm-normalize-package-bin@1.0.1: {}
+
+ npm-normalize-package-bin@2.0.0: {}
+
+ npm-normalize-package-bin@3.0.1: {}
+
+ npm-package-arg@10.1.0:
+ dependencies:
+ hosted-git-info: 6.1.1
+ proc-log: 3.0.0
+ semver: 7.5.4
+ validate-npm-package-name: 5.0.0
+
+ npm-package-arg@8.1.5:
+ dependencies:
+ hosted-git-info: 4.1.0
+ semver: 7.5.4
+ validate-npm-package-name: 3.0.0
+
+ npm-packlist@3.0.0:
+ dependencies:
+ glob: 7.2.3
+ ignore-walk: 4.0.1
+ npm-bundled: 1.1.2
+ npm-normalize-package-bin: 1.0.1
+
+ npm-packlist@7.0.4:
+ dependencies:
+ ignore-walk: 6.0.4
+
+ npm-pick-manifest@6.1.1:
+ dependencies:
+ npm-install-checks: 4.0.0
+ npm-normalize-package-bin: 1.0.1
+ npm-package-arg: 8.1.5
+ semver: 7.5.4
+
+ npm-pick-manifest@8.0.2:
+ dependencies:
+ npm-install-checks: 6.3.0
+ npm-normalize-package-bin: 3.0.1
+ npm-package-arg: 10.1.0
+ semver: 7.5.4
+
+ npm-registry-fetch@12.0.2:
+ dependencies:
+ make-fetch-happen: 10.2.1
+ minipass: 3.3.6
+ minipass-fetch: 1.4.1
+ minipass-json-stream: 1.0.1
+ minizlib: 2.1.2
+ npm-package-arg: 8.1.5
+ transitivePeerDependencies:
+ - bluebird
+ - supports-color
+
+ npm-registry-fetch@14.0.5:
+ dependencies:
+ make-fetch-happen: 11.1.1
+ minipass: 5.0.0
+ minipass-fetch: 3.0.4
+ minipass-json-stream: 1.0.1
+ minizlib: 2.1.2
+ npm-package-arg: 10.1.0
+ proc-log: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ npm-run-path@4.0.1:
+ dependencies:
+ path-key: 3.1.1
+
+ npm-run-path@5.2.0:
+ dependencies:
+ path-key: 4.0.0
+
+ npm@10.4.0: {}
+
+ npmlog@5.0.1:
+ dependencies:
+ are-we-there-yet: 2.0.0
+ console-control-strings: 1.1.0
+ gauge: 3.0.2
+ set-blocking: 2.0.0
+
+ npmlog@6.0.2:
+ dependencies:
+ are-we-there-yet: 3.0.1
+ console-control-strings: 1.1.0
+ gauge: 4.0.4
+ set-blocking: 2.0.0
+
+ nypm@0.3.6:
+ dependencies:
+ citty: 0.1.5
+ execa: 8.0.1
+ pathe: 1.1.2
+ ufo: 1.3.2
+
+ object-assign@4.1.1: {}
+
+ object-inspect@1.13.1: {}
+
+ object-keys@1.1.1: {}
+
+ object-treeify@1.1.33: {}
+
+ object.assign@4.1.5:
+ dependencies:
+ call-bind: 1.0.5
+ define-properties: 1.2.1
+ has-symbols: 1.0.3
+ object-keys: 1.1.1
+
+ object.fromentries@2.0.7:
+ dependencies:
+ call-bind: 1.0.5
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+
+ object.groupby@1.0.1:
+ dependencies:
+ call-bind: 1.0.5
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+ get-intrinsic: 1.2.2
+
+ object.values@1.1.7:
+ dependencies:
+ call-bind: 1.0.5
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+
+ oclif@4.4.2(encoding@0.1.13)(eslint@8.56.0)(mem-fs@2.3.0)(typescript@5.3.3):
+ dependencies:
+ '@aws-sdk/client-cloudfront': 3.502.0
+ '@aws-sdk/client-s3': 3.502.0
+ '@oclif/core': 3.18.1
+ '@oclif/plugin-help': 6.0.12
+ '@oclif/plugin-not-found': 3.0.9
+ '@oclif/plugin-warn-if-update-available': 3.0.9
+ async-retry: 1.3.3
+ change-case: 4.1.2
+ debug: 4.3.4(supports-color@8.1.1)
+ eslint-plugin-perfectionist: 2.5.0(eslint@8.56.0)(typescript@5.3.3)
+ find-yarn-workspace-root: 2.0.0
+ fs-extra: 8.1.0
+ github-slugger: 1.5.0
+ got: 11.8.6
+ lodash.template: 4.5.0
+ normalize-package-data: 3.0.3
+ semver: 7.5.4
+ yeoman-environment: 3.19.3
+ yeoman-generator: 5.10.0(encoding@0.1.13)(mem-fs@2.3.0)(yeoman-environment@3.19.3)
+ transitivePeerDependencies:
+ - astro-eslint-parser
+ - aws-crt
+ - bluebird
+ - encoding
+ - eslint
+ - mem-fs
+ - supports-color
+ - svelte
+ - svelte-eslint-parser
+ - typescript
+ - vue-eslint-parser
+
+ ohash@1.1.3: {}
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ onetime@5.1.2:
+ dependencies:
+ mimic-fn: 2.1.0
+
+ onetime@6.0.0:
+ dependencies:
+ mimic-fn: 4.0.0
+
+ optionator@0.9.3:
+ dependencies:
+ '@aashutoshrathi/word-wrap': 1.2.6
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
+ ora@5.4.1:
+ dependencies:
+ bl: 4.1.0
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-spinners: 2.9.2
+ is-interactive: 1.0.0
+ is-unicode-supported: 0.1.0
+ log-symbols: 4.1.0
+ strip-ansi: 6.0.1
+ wcwidth: 1.0.1
+
+ os-tmpdir@1.0.2: {}
+
+ p-cancelable@2.1.1: {}
+
+ p-finally@1.0.0: {}
+
+ p-limit@2.3.0:
+ dependencies:
+ p-try: 2.2.0
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-locate@4.1.0:
+ dependencies:
+ p-limit: 2.3.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ p-map@4.0.0:
+ dependencies:
+ aggregate-error: 3.1.0
+
+ p-queue@6.6.2:
+ dependencies:
+ eventemitter3: 4.0.7
+ p-timeout: 3.2.0
+
+ p-timeout@3.2.0:
+ dependencies:
+ p-finally: 1.0.0
+
+ p-transform@1.3.0:
+ dependencies:
+ debug: 4.3.4(supports-color@8.1.1)
+ p-queue: 6.6.2
+ transitivePeerDependencies:
+ - supports-color
+
+ p-try@2.2.0: {}
+
+ pacote@12.0.3:
+ dependencies:
+ '@npmcli/git': 2.1.0
+ '@npmcli/installed-package-contents': 1.0.7
+ '@npmcli/promise-spawn': 1.3.2
+ '@npmcli/run-script': 2.0.0
+ cacache: 15.3.0
+ chownr: 2.0.0
+ fs-minipass: 2.1.0
+ infer-owner: 1.0.4
+ minipass: 3.3.6
+ mkdirp: 1.0.4
+ npm-package-arg: 8.1.5
+ npm-packlist: 3.0.0
+ npm-pick-manifest: 6.1.1
+ npm-registry-fetch: 12.0.2
+ promise-retry: 2.0.1
+ read-package-json-fast: 2.0.3
+ rimraf: 3.0.2
+ ssri: 8.0.1
+ tar: 6.2.0
+ transitivePeerDependencies:
+ - bluebird
+ - supports-color
+
+ pacote@15.2.0:
+ dependencies:
+ '@npmcli/git': 4.1.0
+ '@npmcli/installed-package-contents': 2.0.2
+ '@npmcli/promise-spawn': 6.0.2
+ '@npmcli/run-script': 6.0.2
+ cacache: 17.1.4
+ fs-minipass: 3.0.3
+ minipass: 5.0.0
+ npm-package-arg: 10.1.0
+ npm-packlist: 7.0.4
+ npm-pick-manifest: 8.0.2
+ npm-registry-fetch: 14.0.5
+ proc-log: 3.0.0
+ promise-retry: 2.0.1
+ read-package-json: 6.0.4
+ read-package-json-fast: 3.0.2
+ sigstore: 1.9.0
+ ssri: 10.0.5
+ tar: 6.2.0
+ transitivePeerDependencies:
+ - bluebird
+ - supports-color
+
+ param-case@3.0.4:
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.6.2
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parse-conflict-json@2.0.2:
+ dependencies:
+ json-parse-even-better-errors: 2.3.1
+ just-diff: 5.2.0
+ just-diff-apply: 5.5.0
+
+ parse-json@4.0.0:
+ dependencies:
+ error-ex: 1.3.2
+ json-parse-better-errors: 1.0.2
+
+ parse-json@5.2.0:
+ dependencies:
+ '@babel/code-frame': 7.23.5
+ error-ex: 1.3.2
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ pascal-case@3.1.2:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.6.2
+
+ password-prompt@1.1.3:
+ dependencies:
+ ansi-escapes: 4.3.2
+ cross-spawn: 7.0.3
+
+ path-case@3.0.4:
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.6.2
+
+ path-exists@4.0.0: {}
+
+ path-is-absolute@1.0.1: {}
+
+ path-key@3.1.1: {}
+
+ path-key@4.0.0: {}
+
+ path-parse@1.0.7: {}
+
+ path-scurry@1.10.1:
+ dependencies:
+ lru-cache: 10.2.0
+ minipass: 7.0.4
+
+ path-to-regexp@6.2.1: {}
+
+ path-type@4.0.0: {}
+
+ pathe@1.1.2: {}
+
+ pathval@1.1.1: {}
+
+ pathval@2.0.0: {}
+
+ pg-connection-string@2.6.2: {}
+
+ picocolors@1.1.0:
+ optional: true
+
+ picomatch@2.3.1: {}
+
+ pify@2.3.0: {}
+
+ pify@4.0.1: {}
+
+ pkg-dir@4.2.0:
+ dependencies:
+ find-up: 4.1.0
+
+ pluralize@8.0.0: {}
+
+ postcss@8.4.45:
+ dependencies:
+ nanoid: 3.3.7
+ picocolors: 1.1.0
+ source-map-js: 1.2.1
+ optional: true
+
+ preferred-pm@3.1.2:
+ dependencies:
+ find-up: 5.0.0
+ find-yarn-workspace-root2: 1.2.16
+ path-exists: 4.0.0
+ which-pm: 2.0.0
+
+ prelude-ls@1.2.1: {}
+
+ pretty-bytes@5.6.0: {}
+
+ proc-log@1.0.0: {}
+
+ proc-log@3.0.0: {}
+
+ process-nextick-args@2.0.1: {}
+
+ process@0.11.10: {}
+
+ promise-all-reject-late@1.0.1: {}
+
+ promise-call-limit@1.0.2: {}
+
+ promise-inflight@1.0.1: {}
+
+ promise-retry@2.0.1:
+ dependencies:
+ err-code: 2.0.3
+ retry: 0.12.0
+
+ propagate@2.0.1: {}
+
+ pump@3.0.0:
+ dependencies:
+ end-of-stream: 1.4.4
+ once: 1.4.0
+
+ punycode@2.3.1: {}
+
+ queue-microtask@1.2.3: {}
+
+ quick-lru@5.1.1: {}
+
+ rambda@7.5.0: {}
+
+ randombytes@2.1.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ read-cmd-shim@3.0.1: {}
+
+ read-package-json-fast@2.0.3:
+ dependencies:
+ json-parse-even-better-errors: 2.3.1
+ npm-normalize-package-bin: 1.0.1
+
+ read-package-json-fast@3.0.2:
+ dependencies:
+ json-parse-even-better-errors: 3.0.1
+ npm-normalize-package-bin: 3.0.1
+
+ read-package-json@6.0.4:
+ dependencies:
+ glob: 10.3.10
+ json-parse-even-better-errors: 3.0.1
+ normalize-package-data: 5.0.0
+ npm-normalize-package-bin: 3.0.1
+
+ read-pkg-up@7.0.1:
+ dependencies:
+ find-up: 4.1.0
+ read-pkg: 5.2.0
+ type-fest: 0.8.1
+
+ read-pkg@5.2.0:
+ dependencies:
+ '@types/normalize-package-data': 2.4.4
+ normalize-package-data: 2.5.0
+ parse-json: 5.2.0
+ type-fest: 0.6.0
+
+ readable-stream@2.3.8:
+ dependencies:
+ core-util-is: 1.0.3
+ inherits: 2.0.4
+ isarray: 1.0.0
+ process-nextick-args: 2.0.1
+ safe-buffer: 5.1.2
+ string_decoder: 1.1.1
+ util-deprecate: 1.0.2
+
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ readable-stream@4.5.2:
+ dependencies:
+ abort-controller: 3.0.0
+ buffer: 6.0.3
+ events: 3.3.0
+ process: 0.11.10
+ string_decoder: 1.3.0
+
+ readdir-scoped-modules@1.1.0:
+ dependencies:
+ debuglog: 1.0.1
+ dezalgo: 1.0.4
+ graceful-fs: 4.2.11
+ once: 1.4.0
+
+ readdirp@3.6.0:
+ dependencies:
+ picomatch: 2.3.1
+
+ rechoir@0.6.2:
+ dependencies:
+ resolve: 1.22.8
+
+ rechoir@0.8.0:
+ dependencies:
+ resolve: 1.22.8
+
+ redeyed@2.1.1:
+ dependencies:
+ esprima: 4.0.1
+
+ regexp-tree@0.1.27: {}
+
+ regexp.prototype.flags@1.5.1:
+ dependencies:
+ call-bind: 1.0.5
+ define-properties: 1.2.1
+ set-function-name: 2.0.1
+
+ regexpp@3.2.0: {}
+
+ regjsparser@0.10.0:
+ dependencies:
+ jsesc: 0.5.0
+
+ remove-trailing-separator@1.1.0: {}
+
+ replace-ext@1.0.1: {}
+
+ require-directory@2.1.1: {}
+
+ resolve-alpn@1.2.1: {}
+
+ resolve-from@4.0.0: {}
+
+ resolve-from@5.0.0: {}
+
+ resolve-pkg-maps@1.0.0: {}
+
+ resolve@1.22.8:
+ dependencies:
+ is-core-module: 2.13.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ responselike@2.0.1:
+ dependencies:
+ lowercase-keys: 2.0.0
+
+ restore-cursor@3.1.0:
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+
+ retry@0.12.0: {}
+
+ retry@0.13.1: {}
+
+ reusify@1.0.4: {}
+
+ rimraf@3.0.2:
+ dependencies:
+ glob: 7.2.3
+
+ run-async@2.4.1: {}
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ rxjs@7.8.1:
+ dependencies:
+ tslib: 2.6.2
+
+ safe-array-concat@1.1.0:
+ dependencies:
+ call-bind: 1.0.5
+ get-intrinsic: 1.2.2
+ has-symbols: 1.0.3
+ isarray: 2.0.5
+
+ safe-buffer@5.1.2: {}
+
+ safe-buffer@5.2.1: {}
+
+ safe-regex-test@1.0.2:
+ dependencies:
+ call-bind: 1.0.5
+ get-intrinsic: 1.2.2
+ is-regex: 1.1.4
+
+ safer-buffer@2.1.2: {}
+
+ scoped-regex@2.1.0: {}
+
+ semver@5.7.2: {}
+
+ semver@6.3.1: {}
+
+ semver@7.5.4:
+ dependencies:
+ lru-cache: 6.0.0
+
+ sentence-case@3.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.6.2
+ upper-case-first: 2.0.2
+
+ serialize-javascript@6.0.0:
+ dependencies:
+ randombytes: 2.1.0
+
+ set-blocking@2.0.0: {}
+
+ set-function-length@1.2.0:
+ dependencies:
+ define-data-property: 1.1.1
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.2
+ gopd: 1.0.1
+ has-property-descriptors: 1.0.1
+
+ set-function-name@2.0.1:
+ dependencies:
+ define-data-property: 1.1.1
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.1
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ shelljs@0.8.5:
+ dependencies:
+ glob: 7.2.3
+ interpret: 1.4.0
+ rechoir: 0.6.2
+
+ shx@0.3.4:
+ dependencies:
+ minimist: 1.2.8
+ shelljs: 0.8.5
+
+ side-channel@1.0.4:
+ dependencies:
+ call-bind: 1.0.5
+ get-intrinsic: 1.2.2
+ object-inspect: 1.13.1
+
+ signal-exit@3.0.7: {}
+
+ signal-exit@4.1.0: {}
+
+ sigstore@1.9.0:
+ dependencies:
+ '@sigstore/bundle': 1.1.0
+ '@sigstore/protobuf-specs': 0.2.1
+ '@sigstore/sign': 1.0.0
+ '@sigstore/tuf': 1.0.3
+ make-fetch-happen: 11.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ simple-swizzle@0.2.2:
+ dependencies:
+ is-arrayish: 0.3.2
+
+ sinon@16.1.3:
+ dependencies:
+ '@sinonjs/commons': 3.0.1
+ '@sinonjs/fake-timers': 10.3.0
+ '@sinonjs/samsam': 8.0.0
+ diff: 5.1.0
+ nise: 5.1.7
+ supports-color: 7.2.0
+
+ slash@3.0.0: {}
+
+ slice-ansi@4.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ astral-regex: 2.0.0
+ is-fullwidth-code-point: 3.0.0
+
+ slugify@1.6.6: {}
+
+ smart-buffer@4.2.0: {}
+
+ snake-case@3.0.4:
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.6.2
+
+ socks-proxy-agent@6.2.1:
+ dependencies:
+ agent-base: 6.0.2
+ debug: 4.3.4(supports-color@8.1.1)
+ socks: 2.7.1
+ transitivePeerDependencies:
+ - supports-color
+
+ socks-proxy-agent@7.0.0:
+ dependencies:
+ agent-base: 6.0.2
+ debug: 4.3.4(supports-color@8.1.1)
+ socks: 2.7.1
+ transitivePeerDependencies:
+ - supports-color
+
+ socks@2.7.1:
+ dependencies:
+ ip: 2.0.0
+ smart-buffer: 4.2.0
+
+ sort-keys@4.2.0:
+ dependencies:
+ is-plain-obj: 2.1.0
+
+ source-map-js@1.2.1:
+ optional: true
+
+ spdx-correct@3.2.0:
+ dependencies:
+ spdx-expression-parse: 3.0.1
+ spdx-license-ids: 3.0.16
+
+ spdx-exceptions@2.4.0: {}
+
+ spdx-expression-parse@3.0.1:
+ dependencies:
+ spdx-exceptions: 2.4.0
+ spdx-license-ids: 3.0.16
+
+ spdx-license-ids@3.0.16: {}
+
+ sprintf-js@1.0.3: {}
+
+ ssri@10.0.5:
+ dependencies:
+ minipass: 7.0.4
+
+ ssri@8.0.1:
+ dependencies:
+ minipass: 3.3.6
+
+ ssri@9.0.1:
+ dependencies:
+ minipass: 3.3.6
+
+ stdout-stderr@0.1.13:
+ dependencies:
+ debug: 4.3.7
+ strip-ansi: 6.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ string-width@4.2.3:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ string-width@5.1.2:
+ dependencies:
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.1.0
+
+ string.prototype.trim@1.2.8:
+ dependencies:
+ call-bind: 1.0.5
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+
+ string.prototype.trimend@1.0.7:
+ dependencies:
+ call-bind: 1.0.5
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+
+ string.prototype.trimstart@1.0.7:
+ dependencies:
+ call-bind: 1.0.5
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+
+ string_decoder@1.1.1:
+ dependencies:
+ safe-buffer: 5.1.2
+
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-ansi@7.1.0:
+ dependencies:
+ ansi-regex: 6.0.1
+
+ strip-bom-buf@1.0.0:
+ dependencies:
+ is-utf8: 0.2.1
+
+ strip-bom-stream@2.0.0:
+ dependencies:
+ first-chunk-stream: 2.0.0
+ strip-bom: 2.0.0
+
+ strip-bom@2.0.0:
+ dependencies:
+ is-utf8: 0.2.1
+
+ strip-bom@3.0.0: {}
+
+ strip-final-newline@2.0.0: {}
+
+ strip-final-newline@3.0.0: {}
+
+ strip-indent@3.0.0:
+ dependencies:
+ min-indent: 1.0.1
+
+ strip-json-comments@3.1.1: {}
+
+ strnum@1.0.5: {}
+
+ supports-color@5.5.0:
+ dependencies:
+ has-flag: 3.0.0
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-color@8.1.1:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-hyperlinks@2.3.0:
+ dependencies:
+ has-flag: 4.0.0
+ supports-color: 7.2.0
+
+ supports-preserve-symlinks-flag@1.0.0: {}
+
+ tapable@2.2.1: {}
+
+ tar@6.2.0:
+ dependencies:
+ chownr: 2.0.0
+ fs-minipass: 2.1.0
+ minipass: 5.0.0
+ minizlib: 2.1.2
+ mkdirp: 1.0.4
+ yallist: 4.0.0
+
+ tarn@3.0.2: {}
+
+ text-table@0.2.0: {}
+
+ textextensions@5.16.0: {}
+
+ through@2.3.8: {}
+
+ tildify@2.0.0: {}
+
+ tmp@0.0.33:
+ dependencies:
+ os-tmpdir: 1.0.2
+
+ to-fast-properties@2.0.0:
+ optional: true
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ tr46@0.0.3: {}
+
+ treeverse@1.0.4: {}
+
+ ts-api-utils@1.0.3(typescript@5.3.3):
+ dependencies:
+ typescript: 5.3.3
+
+ ts-node@10.9.2(@types/node@20.11.10)(typescript@5.3.3):
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ '@tsconfig/node10': 1.0.9
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.4
+ '@types/node': 20.11.10
+ acorn: 8.11.3
+ acorn-walk: 8.3.2
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ typescript: 5.3.3
+ v8-compile-cache-lib: 3.0.1
+ yn: 3.1.1
+
+ tsconfig-paths@3.15.0:
+ dependencies:
+ '@types/json5': 0.0.29
+ json5: 1.0.2
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+
+ tslib@1.14.1: {}
+
+ tslib@2.6.2: {}
+
+ tuf-js@1.1.7:
+ dependencies:
+ '@tufjs/models': 1.0.4
+ debug: 4.3.4(supports-color@8.1.1)
+ make-fetch-happen: 11.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ tunnel-agent@0.6.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ type-check@0.4.0:
+ dependencies:
+ prelude-ls: 1.2.1
+
+ type-detect@4.0.8: {}
+
+ type-fest@0.20.2: {}
+
+ type-fest@0.21.3: {}
+
+ type-fest@0.6.0: {}
+
+ type-fest@0.8.1: {}
+
+ typed-array-buffer@1.0.0:
+ dependencies:
+ call-bind: 1.0.5
+ get-intrinsic: 1.2.2
+ is-typed-array: 1.1.12
+
+ typed-array-byte-length@1.0.0:
+ dependencies:
+ call-bind: 1.0.5
+ for-each: 0.3.3
+ has-proto: 1.0.1
+ is-typed-array: 1.1.12
+
+ typed-array-byte-offset@1.0.0:
+ dependencies:
+ available-typed-arrays: 1.0.5
+ call-bind: 1.0.5
+ for-each: 0.3.3
+ has-proto: 1.0.1
+ is-typed-array: 1.1.12
+
+ typed-array-length@1.0.4:
+ dependencies:
+ call-bind: 1.0.5
+ for-each: 0.3.3
+ is-typed-array: 1.1.12
+
+ typescript@5.3.3: {}
+
+ ufo@1.3.2: {}
+
+ unbox-primitive@1.0.2:
+ dependencies:
+ call-bind: 1.0.5
+ has-bigints: 1.0.2
+ has-symbols: 1.0.3
+ which-boxed-primitive: 1.0.2
+
+ undici-types@5.26.5: {}
+
+ unique-filename@1.1.1:
+ dependencies:
+ unique-slug: 2.0.2
+
+ unique-filename@2.0.1:
+ dependencies:
+ unique-slug: 3.0.0
+
+ unique-filename@3.0.0:
+ dependencies:
+ unique-slug: 4.0.0
+
+ unique-slug@2.0.2:
+ dependencies:
+ imurmurhash: 0.1.4
+
+ unique-slug@3.0.0:
+ dependencies:
+ imurmurhash: 0.1.4
+
+ unique-slug@4.0.0:
+ dependencies:
+ imurmurhash: 0.1.4
+
+ universal-user-agent@6.0.1: {}
+
+ universalify@0.1.2: {}
+
+ untildify@4.0.0: {}
+
+ upper-case-first@2.0.2:
+ dependencies:
+ tslib: 2.6.2
+
+ upper-case@2.0.2:
+ dependencies:
+ tslib: 2.6.2
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ util-deprecate@1.0.2: {}
+
+ uuid@8.3.2: {}
+
+ v8-compile-cache-lib@3.0.1: {}
+
+ validate-npm-package-license@3.0.4:
+ dependencies:
+ spdx-correct: 3.2.0
+ spdx-expression-parse: 3.0.1
+
+ validate-npm-package-name@3.0.0:
+ dependencies:
+ builtins: 1.0.3
+
+ validate-npm-package-name@5.0.0:
+ dependencies:
+ builtins: 5.0.1
+
+ vinyl-file@3.0.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ pify: 2.3.0
+ strip-bom-buf: 1.0.0
+ strip-bom-stream: 2.0.0
+ vinyl: 2.2.1
+
+ vinyl@2.2.1:
+ dependencies:
+ clone: 2.1.2
+ clone-buffer: 1.0.0
+ clone-stats: 1.0.0
+ cloneable-readable: 1.1.3
+ remove-trailing-separator: 1.1.0
+ replace-ext: 1.0.1
+
+ vue@3.5.3(typescript@5.3.3):
+ dependencies:
+ '@vue/compiler-dom': 3.5.3
+ '@vue/compiler-sfc': 3.5.3
+ '@vue/runtime-dom': 3.5.3
+ '@vue/server-renderer': 3.5.3(vue@3.5.3(typescript@5.3.3))
+ '@vue/shared': 3.5.3
+ optionalDependencies:
+ typescript: 5.3.3
+ optional: true
+
+ walk-up-path@1.0.0: {}
+
+ wcwidth@1.0.1:
+ dependencies:
+ defaults: 1.0.4
+
+ webidl-conversions@3.0.1: {}
+
+ whatwg-url@5.0.0:
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+
+ which-boxed-primitive@1.0.2:
+ dependencies:
+ is-bigint: 1.0.4
+ is-boolean-object: 1.1.2
+ is-number-object: 1.0.7
+ is-string: 1.0.7
+ is-symbol: 1.0.4
+
+ which-pm@2.0.0:
+ dependencies:
+ load-yaml-file: 0.2.0
+ path-exists: 4.0.0
+
+ which-typed-array@1.1.13:
+ dependencies:
+ available-typed-arrays: 1.0.5
+ call-bind: 1.0.5
+ for-each: 0.3.3
+ gopd: 1.0.1
+ has-tostringtag: 1.0.0
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ which@3.0.1:
+ dependencies:
+ isexe: 2.0.0
+
+ wide-align@1.1.5:
+ dependencies:
+ string-width: 4.2.3
+
+ widest-line@3.1.0:
+ dependencies:
+ string-width: 4.2.3
+
+ wordwrap@1.0.0: {}
+
+ workerpool@6.2.1: {}
+
+ wrap-ansi@6.2.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ wrap-ansi@7.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ wrap-ansi@8.1.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 5.1.2
+ strip-ansi: 7.1.0
+
+ wrappy@1.0.2: {}
+
+ write-file-atomic@4.0.2:
+ dependencies:
+ imurmurhash: 0.1.4
+ signal-exit: 3.0.7
+
+ y18n@5.0.8: {}
+
+ yallist@4.0.0: {}
+
+ yargs-parser@20.2.4: {}
+
+ yargs-unparser@2.0.0:
+ dependencies:
+ camelcase: 6.3.0
+ decamelize: 4.0.0
+ flat: 5.0.2
+ is-plain-obj: 2.1.0
+
+ yargs@16.2.0:
+ dependencies:
+ cliui: 7.0.4
+ escalade: 3.1.1
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 20.2.4
+
+ yarn@1.22.21: {}
+
+ yeoman-environment@3.19.3:
+ dependencies:
+ '@npmcli/arborist': 4.3.1
+ are-we-there-yet: 2.0.0
+ arrify: 2.0.1
+ binaryextensions: 4.19.0
+ chalk: 4.1.2
+ cli-table: 0.3.11
+ commander: 7.1.0
+ dateformat: 4.6.3
+ debug: 4.3.4(supports-color@8.1.1)
+ diff: 5.1.0
+ error: 10.4.0
+ escape-string-regexp: 4.0.0
+ execa: 5.1.1
+ find-up: 5.0.0
+ globby: 11.1.0
+ grouped-queue: 2.0.0
+ inquirer: 8.2.6
+ is-scoped: 2.1.0
+ isbinaryfile: 4.0.10
+ lodash: 4.17.21
+ log-symbols: 4.1.0
+ mem-fs: 2.3.0
+ mem-fs-editor: 9.7.0(mem-fs@2.3.0)
+ minimatch: 3.1.2
+ npmlog: 5.0.1
+ p-queue: 6.6.2
+ p-transform: 1.3.0
+ pacote: 12.0.3
+ preferred-pm: 3.1.2
+ pretty-bytes: 5.6.0
+ readable-stream: 4.5.2
+ semver: 7.5.4
+ slash: 3.0.0
+ strip-ansi: 6.0.1
+ text-table: 0.2.0
+ textextensions: 5.16.0
+ untildify: 4.0.0
+ transitivePeerDependencies:
+ - bluebird
+ - supports-color
+
+ yeoman-generator@5.10.0(encoding@0.1.13)(mem-fs@2.3.0)(yeoman-environment@3.19.3):
+ dependencies:
+ chalk: 4.1.2
+ dargs: 7.0.0
+ debug: 4.3.4(supports-color@8.1.1)
+ execa: 5.1.1
+ github-username: 6.0.0(encoding@0.1.13)
+ lodash: 4.17.21
+ mem-fs-editor: 9.7.0(mem-fs@2.3.0)
+ minimist: 1.2.8
+ pacote: 15.2.0
+ read-pkg-up: 7.0.1
+ run-async: 2.4.1
+ semver: 7.5.4
+ shelljs: 0.8.5
+ sort-keys: 4.2.0
+ text-table: 0.2.0
+ optionalDependencies:
+ yeoman-environment: 3.19.3
+ transitivePeerDependencies:
+ - bluebird
+ - encoding
+ - mem-fs
+ - supports-color
+
+ yn@3.1.1: {}
+
+ yocto-queue@0.1.0: {}
diff --git a/packages/directus-template-cli/src/.DS_Store b/packages/directus-template-cli/src/.DS_Store
new file mode 100644
index 0000000..a2b4a10
Binary files /dev/null and b/packages/directus-template-cli/src/.DS_Store differ
diff --git a/packages/directus-template-cli/src/commands/apply.ts b/packages/directus-template-cli/src/commands/apply.ts
new file mode 100644
index 0000000..c3baed1
--- /dev/null
+++ b/packages/directus-template-cli/src/commands/apply.ts
@@ -0,0 +1,297 @@
+import {Command, Flags, ux} from '@oclif/core'
+import * as inquirer from 'inquirer'
+import * as path from 'node:path'
+
+import * as customFlags from '../flags/common'
+import {DIRECTUS_PINK, DIRECTUS_PURPLE, SEPARATOR} from '../lib/constants'
+import {ApplyFlags, validateInteractiveFlags, validateProgrammaticFlags} from '../lib/load/apply-flags'
+import apply from '../lib/load/index.js'
+import {getDirectusToken, getDirectusUrl, initializeDirectusApi} from '../lib/utils/auth'
+import catchError from '../lib/utils/catch-error'
+import {getCommunityTemplates, getGithubTemplate, getInteractiveLocalTemplate, getLocalTemplate} from '../lib/utils/get-template'
+import {logger} from '../lib/utils/logger'
+import openUrl from '../lib/utils/open-url'
+
+interface Template {
+ directoryPath: string
+ templateName: string
+}
+
+export default class ApplyCommand extends Command {
+ static description = 'Apply a template to a blank Directus instance.'
+
+ static examples = [
+ '$ directus-template-cli apply',
+ '$ directus-template-cli apply -p --directusUrl="http://localhost:8055" --directusToken="admin-token-here" --templateLocation="./my-template" --templateType="local"',
+ '$ directus-template-cli@beta apply -p --directusUrl="http://localhost:8055" --directusToken="admin-token-here" --templateLocation="./my-template" --templateType="local" --partial --no-content --no-users',
+ ]
+
+ static flags = {
+ content: Flags.boolean({
+ allowNo: true,
+ default: undefined,
+ description: 'Load Content (data)',
+ }),
+ dashboards: Flags.boolean({
+ allowNo: true,
+ default: undefined,
+ description: 'Load Dashboards (dashboards, panels)',
+ }),
+ directusToken: customFlags.directusToken,
+ directusUrl: customFlags.directusUrl,
+ extensions: Flags.boolean({
+ allowNo: true,
+ default: undefined,
+ description: 'Load Extensions',
+ }),
+ files: Flags.boolean({
+ allowNo: true,
+ default: undefined,
+ description: 'Load Files (files, folders)',
+ }),
+ flows: Flags.boolean({
+ allowNo: true,
+ default: undefined,
+ description: 'Load Flows (operations, flows)',
+ }),
+ partial: Flags.boolean({
+ dependsOn: ['programmatic'],
+ description: 'Enable partial template application (all components enabled by default)',
+ summary: 'Enable partial template application',
+ }),
+ permissions: Flags.boolean({
+ allowNo: true,
+ default: undefined,
+ description: 'Loads permissions data. Collections include: directus_roles, directus_policies, directus_access, directus_permissions.',
+ summary: 'Load permissions (roles, policies, access, permissions)',
+ }),
+ programmatic: customFlags.programmatic,
+ schema: Flags.boolean({
+ allowNo: true,
+ default: undefined,
+ description: 'Load schema (collections, relations)',
+ }),
+ settings: Flags.boolean({
+ allowNo: true,
+ default: undefined,
+ description: 'Load settings (project settings, translations, presets)',
+ }),
+ templateLocation: customFlags.templateLocation,
+ templateType: Flags.string({
+ default: 'local',
+ dependsOn: ['programmatic'],
+ description: 'Type of template to apply. You can apply templates from our community repo, local directories, or public repositories from Github. Defaults to local. ',
+ env: 'TEMPLATE_TYPE',
+ options: ['community', 'local', 'github'],
+ summary: 'Type of template to apply. Options: community, local, github.',
+ }),
+ userEmail: customFlags.userEmail,
+ userPassword: customFlags.userPassword,
+ users: Flags.boolean({
+ allowNo: true,
+ default: undefined,
+ description: 'Load users',
+ }),
+ }
+
+ /**
+ * MAIN
+ * Run the command
+ * @returns {Promise} - Returns nothing
+ */
+ public async run(): Promise {
+ const {flags} = await this.parse(ApplyCommand)
+ const typedFlags = flags as unknown as ApplyFlags
+
+ await (typedFlags.programmatic ? this.runProgrammatic(typedFlags) : this.runInteractive(typedFlags))
+ }
+
+ /**
+ * INTERACTIVE
+ * Run the command in interactive mode
+ * @param flags - The ApplyFlags
+ * @returns {Promise} - Returns nothing
+ */
+ private async runInteractive(flags: ApplyFlags): Promise {
+ const validatedFlags = validateInteractiveFlags(flags)
+
+ ux.styledHeader(ux.colorize(DIRECTUS_PURPLE, 'Directus Template CLI - Apply'))
+
+ const templateType = await inquirer.prompt([
+ {
+ choices: [
+ {name: 'Community templates', value: 'community'},
+ {name: 'From a local directory', value: 'local'},
+ {name: 'From a public GitHub repository', value: 'github'},
+ {name: 'Get premium templates', value: 'directus-plus'},
+ ],
+ message: 'What type of template would you like to apply?',
+ name: 'templateType',
+ type: 'list',
+ },
+ ])
+
+ let template: Template
+
+ switch (templateType.templateType) {
+ case 'community': {
+ const templates = await getCommunityTemplates()
+ const {selectedTemplate} = await inquirer.prompt([
+ {
+ choices: templates.map(t => ({name: t.templateName, value: t})),
+ message: 'Select a template.',
+ name: 'selectedTemplate',
+ type: 'list',
+ },
+ ])
+ template = selectedTemplate
+ break
+ }
+
+ case 'local': {
+ const localTemplateDir = await ux.prompt('What is the local template directory?')
+ template = await this.selectLocalTemplate(localTemplateDir)
+ break
+ }
+
+ case 'github': {
+ const ghTemplateUrl = await ux.prompt('What is the public GitHub repository URL?')
+ template = await getGithubTemplate(ghTemplateUrl)
+ break
+ }
+
+ case 'directus-plus': {
+ openUrl('https://directus.io/plus?utm_source=directus-template-cli&utm_content=apply-command')
+ ux.log('Redirecting to Directus website.')
+ ux.exit(0)
+ }
+ }
+
+ ux.log(`You selected ${ux.colorize(DIRECTUS_PINK, template.templateName)}`)
+ ux.log(SEPARATOR)
+
+ // Get Directus URL
+ const directusUrl = await getDirectusUrl()
+ validatedFlags.directusUrl = directusUrl
+
+ // Prompt for login method
+ const loginMethod = await inquirer.prompt([
+ {
+ choices: [
+ {name: 'Directus Access Token', value: 'token'},
+ {name: 'Email and Password', value: 'email'},
+ ],
+ default: 'token',
+ message: 'How do you want to log in?',
+ name: 'loginMethod',
+ type: 'list',
+ },
+ ])
+
+ if (loginMethod.loginMethod === 'token') {
+ const directusToken = await getDirectusToken(directusUrl)
+ validatedFlags.directusToken = directusToken
+ } else {
+ const userEmail = await ux.prompt('What is your email?')
+ validatedFlags.userEmail = userEmail
+ const userPassword = await ux.prompt('What is your password?', {type: 'hide'})
+ validatedFlags.userPassword = userPassword
+ }
+
+ await initializeDirectusApi(validatedFlags)
+
+ if (template) {
+ ux.styledHeader(ux.colorize(DIRECTUS_PURPLE, `Applying template - ${template.templateName} to ${directusUrl}`))
+ await apply(template.directoryPath, validatedFlags)
+
+ ux.action.stop()
+ ux.log(SEPARATOR)
+ ux.info('Template applied successfully.')
+ ux.exit(0)
+ }
+ }
+
+ /**
+ * PROGRAMMATIC
+ * Run the command in programmatic mode
+ * @param flags - The ApplyFlags
+ * @returns {Promise} - Returns nothing
+ */
+ private async runProgrammatic(flags: ApplyFlags): Promise {
+ const validatedFlags = validateProgrammaticFlags(flags)
+
+ let template: Template
+
+ switch (validatedFlags.templateType) {
+ case 'community': {
+ const templates = await getCommunityTemplates()
+ template = templates.find(t => t.templateName === validatedFlags.templateLocation) || templates[0]
+ break
+ }
+
+ case 'local': {
+ template = await getLocalTemplate(validatedFlags.templateLocation)
+ break
+ }
+
+ case 'github': {
+ template = await getGithubTemplate(validatedFlags.templateLocation)
+ break
+ }
+
+ default: {
+ catchError('Invalid template type. Please check your template type.', {
+ fatal: true,
+ })
+ }
+ }
+
+ await initializeDirectusApi(validatedFlags)
+
+ const logMessage = `Applying template - ${template.templateName} to ${validatedFlags.directusUrl}`
+ ux.styledHeader(logMessage)
+ logger.log('info', logMessage)
+
+ await apply(template.directoryPath, validatedFlags)
+
+ ux.action.stop()
+ ux.log(SEPARATOR)
+ ux.info('Template applied successfully.')
+ ux.exit(0)
+ }
+
+ /**
+ * INTERACTIVE
+ * Select a local template from the given directory
+ * @param localTemplateDir - The local template directory path
+ * @returns {Promise} - Returns the selected template
+ */
+ private async selectLocalTemplate(localTemplateDir: string): Promise {
+ try {
+ const templates = await getInteractiveLocalTemplate(localTemplateDir)
+
+ if (templates.length === 1) {
+ return templates[0]
+ }
+
+ const {selectedTemplate} = await inquirer.prompt([
+ {
+ choices: templates.map(t => ({
+ name: `${t.templateName} (${path.basename(t.directoryPath)})`,
+ value: t,
+ })),
+ message: 'Multiple templates found. Please select one:',
+ name: 'selectedTemplate',
+ type: 'list',
+ },
+ ])
+ return selectedTemplate
+ } catch (error) {
+ if (error instanceof Error) {
+ ux.error(error.message)
+ } else {
+ ux.error('An unknown error occurred while getting the local template.')
+ }
+ }
+ }
+}
diff --git a/packages/directus-template-cli/src/commands/extract.ts b/packages/directus-template-cli/src/commands/extract.ts
new file mode 100644
index 0000000..bc7f1ac
--- /dev/null
+++ b/packages/directus-template-cli/src/commands/extract.ts
@@ -0,0 +1,181 @@
+import {Command, ux} from '@oclif/core'
+import inquirer from 'inquirer'
+import fs from 'node:fs'
+import path from 'node:path'
+import slugify from 'slugify'
+
+import * as customFlags from '../flags/common'
+import {DIRECTUS_PINK, DIRECTUS_PURPLE, SEPARATOR} from '../lib/constants'
+import extract from '../lib/extract/'
+import {getDirectusToken, getDirectusUrl, initializeDirectusApi, validateAuthFlags} from '../lib/utils/auth'
+import catchError from '../lib/utils/catch-error'
+import {
+ generatePackageJsonContent,
+ generateReadmeContent,
+} from '../lib/utils/template-defaults'
+
+interface ExtractFlags {
+ directusToken: string;
+ directusUrl: string;
+ programmatic: boolean;
+ templateLocation: string;
+ templateName: string;
+ userEmail: string;
+ userPassword: string;
+}
+
+export default class ExtractCommand extends Command {
+ static description = 'Extract a template from a Directus instance.'
+
+ static examples = [
+ '$ directus-template-cli extract',
+ '$ directus-template-cli extract -p --templateName="My Template" --templateLocation="./my-template" --directusToken="admin-token-here" --directusUrl="http://localhost:8055"',
+ ]
+
+ static flags = {
+ directusToken: customFlags.directusToken,
+ directusUrl: customFlags.directusUrl,
+ programmatic: customFlags.programmatic,
+ templateLocation: customFlags.templateLocation,
+ templateName: customFlags.templateName,
+ userEmail: customFlags.userEmail,
+ userPassword: customFlags.userPassword,
+ }
+
+ /**
+ * Main run method for the ExtractCommand
+ * @returns {Promise} - Returns nothing
+ */
+ public async run(): Promise {
+ const {flags} = await this.parse(ExtractCommand)
+ const typedFlags = flags as unknown as ExtractFlags
+
+ await (typedFlags.programmatic ? this.runProgrammatic(typedFlags) : this.runInteractive(typedFlags))
+ }
+
+ /**
+ * Extracts the template to the specified directory
+ * @param {string} templateName - The name of the template to extract
+ * @param {string} directory - The directory to extract the template to
+ * @param {ExtractFlags} flags - The command flags
+ * @returns {Promise} - Returns nothing
+ */
+ private async extractTemplate(templateName: string, directory: string, flags: ExtractFlags): Promise {
+ try {
+ if (!fs.existsSync(directory)) {
+ fs.mkdirSync(directory, {recursive: true})
+ }
+
+ const packageJSONContent = generatePackageJsonContent(templateName)
+ const readmeContent = generateReadmeContent(templateName)
+
+ const packageJSONPath = path.join(directory, 'package.json')
+ const readmePath = path.join(directory, 'README.md')
+
+ fs.writeFileSync(packageJSONPath, packageJSONContent)
+ fs.writeFileSync(readmePath, readmeContent)
+ } catch (error) {
+ catchError(error, {
+ context: {function: 'extractTemplate'},
+ fatal: true,
+ logToFile: true,
+ })
+ }
+
+ ux.log(SEPARATOR)
+
+ ux.action.start(`Extracting template - ${ux.colorize(DIRECTUS_PINK, templateName)} from ${ux.colorize(DIRECTUS_PINK, flags.directusUrl)} to ${ux.colorize(DIRECTUS_PINK, directory)}`)
+
+ await extract(directory)
+
+ ux.action.stop()
+
+ ux.log(SEPARATOR)
+ ux.log('Template extracted successfully.')
+ this.exit(0)
+ }
+
+ /**
+ * Runs the interactive mode for template extraction
+ * @param {ExtractFlags} flags - The command flags
+ * @returns {Promise} - Returns nothing
+ */
+ private async runInteractive(flags: ExtractFlags): Promise {
+ ux.styledHeader(ux.colorize(DIRECTUS_PURPLE, 'Directus Template CLI - Extract'))
+
+ const templateName = await ux.prompt('What is the name of the template you would like to extract?')
+ const directory = await ux.prompt(
+ "What directory would you like to extract the template to? If it doesn't exist, it will be created.",
+ {default: `templates/${slugify(templateName, {lower: true, strict: true})}`},
+ )
+
+ ux.log(`You selected ${ux.colorize(DIRECTUS_PINK, directory)}`)
+
+ ux.log(SEPARATOR)
+
+ // Get Directus URL
+ const directusUrl = await getDirectusUrl()
+ flags.directusUrl = directusUrl
+
+ // Prompt for login method
+ const loginMethod = await inquirer.prompt([
+ {
+ choices: [
+ {name: 'Directus Access Token', value: 'token'},
+ {name: 'Email and Password', value: 'email'},
+ ],
+ default: 'token',
+ message: 'How do you want to log in?',
+ name: 'loginMethod',
+ type: 'list',
+ },
+ ])
+
+ if (loginMethod.loginMethod === 'token') {
+ const directusToken = await getDirectusToken(directusUrl)
+ flags.directusToken = directusToken
+ } else {
+ flags.userEmail = await ux.prompt('What is your email?')
+ flags.userPassword = await ux.prompt('What is your password?', {type: 'hide'})
+ }
+
+ ux.log(SEPARATOR)
+
+ await initializeDirectusApi(flags)
+
+ await this.extractTemplate(templateName, directory, flags)
+ }
+
+ /**
+ * Runs the programmatic mode for template extraction
+ * @param {ExtractFlags} flags - The command flags
+ * @returns {Promise} - Returns nothing
+ */
+ private async runProgrammatic(flags: ExtractFlags): Promise {
+ this.validateProgrammaticFlags(flags)
+
+ const {templateLocation, templateName} = flags
+
+ await initializeDirectusApi(flags)
+
+ await this.extractTemplate(templateName, templateLocation, flags)
+ }
+
+ /**
+ * Validates the flags for programmatic mode
+ * @param {ExtractFlags} flags - The command flags to validate
+ * @throws {Error} If required flags are missing
+ * @returns {void}
+ */
+ private validateProgrammaticFlags(flags: ExtractFlags): void {
+ validateAuthFlags(flags)
+
+ if (!flags.templateLocation) {
+ ux.error('Template location is required for programmatic mode.')
+ }
+
+ if (!flags.templateName) {
+ ux.error('Template name is required for programmatic mode.')
+ }
+ }
+}
diff --git a/packages/directus-template-cli/src/flags/common.ts b/packages/directus-template-cli/src/flags/common.ts
new file mode 100644
index 0000000..da6c2b4
--- /dev/null
+++ b/packages/directus-template-cli/src/flags/common.ts
@@ -0,0 +1,45 @@
+import {Flags} from '@oclif/core'
+
+export const directusToken = Flags.string({
+ description: 'Token to use for the Directus instance',
+ env: 'DIRECTUS_TOKEN',
+ exclusive: ['userEmail', 'userPassword'],
+})
+
+export const directusUrl = Flags.string({
+ description: 'URL of the Directus instance',
+ env: 'DIRECTUS_URL',
+})
+
+export const userEmail = Flags.string({
+ dependsOn: ['userPassword'],
+ description: 'Email for Directus authentication',
+ env: 'DIRECTUS_EMAIL',
+ exclusive: ['directusToken'],
+})
+
+export const userPassword = Flags.string({
+ dependsOn: ['userEmail'],
+ description: 'Password for Directus authentication',
+ env: 'DIRECTUS_PASSWORD',
+ exclusive: ['directusToken'],
+})
+
+export const programmatic = Flags.boolean({
+ char: 'p',
+ default: false,
+ description: 'Run in programmatic mode (non-interactive) for use cases such as CI/CD pipelines.',
+ summary: 'Run in programmatic mode',
+})
+
+export const templateLocation = Flags.string({
+ dependsOn: ['programmatic'],
+ description: 'Location of the template',
+ env: 'TEMPLATE_LOCATION',
+})
+
+export const templateName = Flags.string({
+ dependsOn: ['programmatic'],
+ description: 'Name of the template',
+ env: 'TEMPLATE_NAME',
+})
diff --git a/packages/directus-template-cli/src/index.ts b/packages/directus-template-cli/src/index.ts
new file mode 100644
index 0000000..e32b0b2
--- /dev/null
+++ b/packages/directus-template-cli/src/index.ts
@@ -0,0 +1 @@
+export {run} from '@oclif/core'
diff --git a/packages/directus-template-cli/src/lib/constants.ts b/packages/directus-template-cli/src/lib/constants.ts
new file mode 100644
index 0000000..b2d3bee
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/constants.ts
@@ -0,0 +1,3 @@
+export const DIRECTUS_PURPLE = '#6644ff'
+export const DIRECTUS_PINK = '#FF99DD'
+export const SEPARATOR = '------------------'
diff --git a/packages/directus-template-cli/src/lib/extract/extract-access.ts b/packages/directus-template-cli/src/lib/extract/extract-access.ts
new file mode 100644
index 0000000..84b50ea
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/extract-access.ts
@@ -0,0 +1,35 @@
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import writeToFile from '../utils/write-to-file'
+
+interface Access {
+ id: string;
+ policy: string;
+ role: null | string;
+ sort: null | number;
+ user: null | string;
+}
+
+export default async function extractAccess(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting access'))
+ try {
+ const response = await api.client.request(() => ({
+ method: 'GET',
+ path: '/access?limit=-1',
+ }))
+
+ // Delete the id field from the permissions so we don't have to reset the autoincrement on the db
+ // for (const access of response) {
+ // delete access.id
+ // }
+
+ await writeToFile('access', response, dir)
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/extract/extract-assets.ts b/packages/directus-template-cli/src/lib/extract/extract-assets.ts
new file mode 100644
index 0000000..20fc65f
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/extract-assets.ts
@@ -0,0 +1,46 @@
+import {readFiles} from '@directus/sdk'
+import {ux} from '@oclif/core'
+import fs from 'node:fs'
+import path from 'node:path'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+
+async function getAssetList() {
+ return api.client.request(readFiles({limit: -1}))
+}
+
+async function downloadFile(file: any, dir: string) {
+ const response: Response | string = await api.client.request(() => ({
+ method: 'GET',
+ path: `/assets/${file.id}`,
+ }))
+ const fullPath = path.join(dir, 'assets', file.filename_disk)
+
+ if (typeof response === 'string') {
+ fs.writeFileSync(fullPath, response)
+ } else {
+ const data = await response.arrayBuffer()
+ fs.writeFileSync(fullPath, Buffer.from(data))
+ }
+}
+
+export async function downloadAllFiles(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Downloading assets'))
+ try {
+ const fullPath = path.join(dir, 'assets')
+ if (path && !fs.existsSync(fullPath)) {
+ fs.mkdirSync(fullPath, {recursive: true})
+ }
+
+ const fileList = await getAssetList()
+ await Promise.all(fileList.map(file => downloadFile(file, dir).catch(error => {
+ catchError(`Error downloading ${file.filename_disk}: ${error.message}`)
+ })))
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/extract/extract-collections.ts b/packages/directus-template-cli/src/lib/extract/extract-collections.ts
new file mode 100644
index 0000000..b822710
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/extract-collections.ts
@@ -0,0 +1,26 @@
+import {readCollections} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import writeToFile from '../utils/write-to-file'
+
+/**
+ * Extract collections from the Directus instance
+ */
+
+export default async function extractCollections(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting collections'))
+ try {
+ const response = await api.client.request(readCollections())
+ const collections = response.filter(
+ collection => !collection.collection.startsWith('directus_'),
+ )
+ await writeToFile('collections', collections, dir)
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/extract/extract-content.ts b/packages/directus-template-cli/src/lib/extract/extract-content.ts
new file mode 100644
index 0000000..a2eb864
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/extract-content.ts
@@ -0,0 +1,36 @@
+import {readCollections, readItems} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import writeToFile from '../utils/write-to-file'
+
+async function getCollections() {
+ const response = await api.client.request(readCollections())
+ return response
+ .filter(item => !item.collection.startsWith('directus_', 0))
+ .filter(item => item.schema != null)
+ .map(i => i.collection)
+}
+
+async function getDataFromCollection(collection: string, dir: string) {
+ try {
+ const response = await api.client.request(readItems(collection as never, {limit: -1}))
+ await writeToFile(`${collection}`, response, `${dir}/content/`)
+ } catch (error) {
+ catchError(error)
+ }
+}
+
+export async function extractContent(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting content'))
+ try {
+ const collections = await getCollections()
+ await Promise.all(collections.map(collection => getDataFromCollection(collection, dir)))
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/extract/extract-dashboards.ts b/packages/directus-template-cli/src/lib/extract/extract-dashboards.ts
new file mode 100644
index 0000000..d5cac3a
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/extract-dashboards.ts
@@ -0,0 +1,43 @@
+import {readDashboards, readPanels} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import filterFields from '../utils/filter-fields'
+import {directusDashboardFields, directusPanelFields} from '../utils/system-fields'
+import writeToFile from '../utils/write-to-file'
+
+/**
+ * Extract dashboards from the Directus instance
+ */
+
+export async function extractDashboards(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting dashboards'))
+ try {
+ const response = await api.client.request(readDashboards({limit: -1}))
+ const dashboards = filterFields(response, directusDashboardFields)
+ await writeToFile('dashboards', dashboards, dir)
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
+
+/**
+ * Extract panels from the Directus instance
+ */
+
+export async function extractPanels(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting panels'))
+ try {
+ const response = await api.client.request(readPanels({limit: -1}))
+ const panels = filterFields(response, directusPanelFields)
+ await writeToFile('panels', panels, dir)
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/extract/extract-extensions.ts b/packages/directus-template-cli/src/lib/extract/extract-extensions.ts
new file mode 100644
index 0000000..760f18e
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/extract-extensions.ts
@@ -0,0 +1,23 @@
+import {readExtensions} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import writeToFile from '../utils/write-to-file'
+
+/**
+ * Extract extensions from the API
+ */
+
+export default async function extractExtensions(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting extensions'))
+ try {
+ const response = await api.client.request(readExtensions())
+ await writeToFile('extensions', response, dir)
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/extract/extract-fields.ts b/packages/directus-template-cli/src/lib/extract/extract-fields.ts
new file mode 100644
index 0000000..2a72af1
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/extract-fields.ts
@@ -0,0 +1,41 @@
+import {readFields} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import writeToFile from '../utils/write-to-file'
+
+/**
+ * Extract fields from the Directus instance
+ */
+
+export default async function extractFields(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting fields'))
+ try {
+ const response = await api.client.request(readFields())
+
+ if (!Array.isArray(response)) {
+ throw new TypeError('Unexpected response format')
+ }
+
+ const fields = response
+ .filter(
+ // @ts-ignore
+ (i: { collection: string; meta?: { system?: boolean } }) => i.meta && !i.meta.system,
+ )
+ .map(i => {
+ if (i.meta) {
+ delete i.meta.id
+ }
+
+ return i
+ })
+
+ await writeToFile('fields', fields, dir)
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/extract/extract-files.ts b/packages/directus-template-cli/src/lib/extract/extract-files.ts
new file mode 100644
index 0000000..1974791
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/extract-files.ts
@@ -0,0 +1,26 @@
+import {readFiles} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import filterFields from '../utils/filter-fields'
+import {directusFileFields} from '../utils/system-fields'
+import writeToFile from '../utils/write-to-file'
+
+/**
+ * Extract files from the API
+ */
+
+export default async function extractFiles(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting files'))
+ try {
+ const response = await api.client.request(readFiles({limit: -1}))
+ const files = filterFields(response, directusFileFields)
+ await writeToFile('files', files, dir)
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/extract/extract-flows.ts b/packages/directus-template-cli/src/lib/extract/extract-flows.ts
new file mode 100644
index 0000000..4043dd8
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/extract-flows.ts
@@ -0,0 +1,43 @@
+import {readFlows, readOperations} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import filterFields from '../utils/filter-fields'
+import {directusFlowFields, directusOperationFields} from '../utils/system-fields'
+import writeToFile from '../utils/write-to-file'
+
+/**
+ * Extract flows from the Directus instance
+ */
+
+export async function extractFlows(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting flows'))
+ try {
+ const response = await api.client.request(readFlows({limit: -1}))
+ const flows = filterFields(response, directusFlowFields)
+ await writeToFile('flows', flows, dir)
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
+
+/**
+ * Extract operations from the Directus instance
+ */
+
+export async function extractOperations(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting operations'))
+ try {
+ const response = await api.client.request(readOperations({limit: -1}))
+ const operations = filterFields(response, directusOperationFields)
+ await writeToFile('operations', operations, dir)
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/extract/extract-folders.ts b/packages/directus-template-cli/src/lib/extract/extract-folders.ts
new file mode 100644
index 0000000..87cd2dc
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/extract-folders.ts
@@ -0,0 +1,26 @@
+import {readFolders} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import filterFields from '../utils/filter-fields'
+import {directusFolderFields} from '../utils/system-fields'
+import writeToFile from '../utils/write-to-file'
+
+/**
+ * Extract folders from the Directus instance
+ */
+
+export default async function extractFolders(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting folders'))
+ try {
+ const response = await api.client.request(readFolders({limit: -1}))
+ const folders = filterFields(response, directusFolderFields)
+ await writeToFile('folders', folders, dir)
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/extract/extract-permissions.ts b/packages/directus-template-cli/src/lib/extract/extract-permissions.ts
new file mode 100644
index 0000000..a6d6b58
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/extract-permissions.ts
@@ -0,0 +1,34 @@
+import {readPermissions} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import writeToFile from '../utils/write-to-file'
+
+/**
+ * Extract Permissions from the API
+ */
+
+export default async function extractPermissions(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting permissions'))
+ try {
+ let response = await api.client.request(readPermissions({
+ limit: -1,
+ }))
+
+ // Delete the id field from the permissions so we don't have to reset the autoincrement on the db
+ // Permissions API returns some items without a linked Policy, and are not stored in the DB
+ response = response
+ .filter(i => i.policy !== null)
+ .map(i => {
+ delete i.id
+ return i
+ })
+ await writeToFile('permissions', response, dir)
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/extract/extract-policies.ts b/packages/directus-template-cli/src/lib/extract/extract-policies.ts
new file mode 100644
index 0000000..fc34a9a
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/extract-policies.ts
@@ -0,0 +1,31 @@
+import {readPolicies} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import writeToFile from '../utils/write-to-file'
+
+/**
+ * Extract policies from the API
+ */
+
+export default async function extractPolicies(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting policies'))
+ try {
+ const response = await api.client.request(readPolicies({limit: -1}))
+
+ // Delete the id field from the permissions so we don't have to reset the autoincrement on the db
+ for (const policies of response) {
+ delete policies.users // Alias Field
+ delete policies.roles // Alias Field
+ delete policies.permissions // Alias Field
+ }
+
+ await writeToFile('policies', response, dir)
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/extract/extract-presets.ts b/packages/directus-template-cli/src/lib/extract/extract-presets.ts
new file mode 100644
index 0000000..dc1d3b0
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/extract-presets.ts
@@ -0,0 +1,37 @@
+import {readPresets} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import writeToFile from '../utils/write-to-file'
+
+/**
+ * Extract Presets from the API
+ */
+
+export default async function extractPresets(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting presets'))
+ try {
+ const response = await api.client.request(readPresets(
+ {
+ // Only get the global presets
+ filter: {user: {
+ _null: true,
+ }},
+ limit: -1,
+ },
+ ))
+
+ // Remove the id field from the presets so we don't have to reset the autoincrement on the db
+ const presets = response.map(preset => {
+ delete preset.id
+ return preset
+ })
+ await writeToFile('presets', presets, dir)
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/extract/extract-relations.ts b/packages/directus-template-cli/src/lib/extract/extract-relations.ts
new file mode 100644
index 0000000..976160f
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/extract-relations.ts
@@ -0,0 +1,47 @@
+import {readFields, readRelations} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import writeToFile from '../utils/write-to-file'
+
+/**
+ * Extract relations from the Directus instance
+ */
+
+export default async function extractRelations(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting relations'))
+ try {
+ const response = await api.client.request(readRelations())
+
+ // Fetching fields to filter out system fields while retaining custom fields on system collections
+ const fields = await api.client.request(readFields())
+
+ const customFields = fields.filter(
+ (i: any) => !i.meta?.system,
+ )
+
+ const relations = response
+
+ // Filter out relations where the collection starts with 'directus_' && the field is not within the customFields array
+ .filter(
+ (i: any) =>
+ !i.collection.startsWith('directus_', 0)
+ || customFields.some(
+ (f: { collection: string; field: string }) =>
+ f.collection === i.collection && f.field === i.field,
+ ),
+ )
+ .map(i => {
+ delete i.meta.id
+ return i
+ })
+
+ await writeToFile('relations', relations, dir)
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/extract/extract-roles.ts b/packages/directus-template-cli/src/lib/extract/extract-roles.ts
new file mode 100644
index 0000000..4caefe3
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/extract-roles.ts
@@ -0,0 +1,26 @@
+import {readRoles} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import filterFields from '../utils/filter-fields'
+import {directusRoleFields} from '../utils/system-fields'
+import writeToFile from '../utils/write-to-file'
+
+/**
+ * Extract roles from the API
+ */
+
+export default async function extractRoles(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting roles'))
+ try {
+ const response = await api.client.request(readRoles({limit: -1}))
+ const roles = filterFields(response, directusRoleFields)
+ await writeToFile('roles', roles, dir)
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/extract/extract-schema.ts b/packages/directus-template-cli/src/lib/extract/extract-schema.ts
new file mode 100644
index 0000000..0ca7213
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/extract-schema.ts
@@ -0,0 +1,26 @@
+import {schemaSnapshot} from '@directus/sdk'
+import {ux} from '@oclif/core'
+import fs from 'node:fs'
+import path from 'node:path'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import writeToFile from '../utils/write-to-file'
+
+export default async function extractSchema(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting schema snapshot'))
+ try {
+ const schemaDir = path.join(dir, 'schema')
+ if (!fs.existsSync(schemaDir)) {
+ fs.mkdirSync(schemaDir, {recursive: true})
+ }
+
+ const schema = await api.client.request(schemaSnapshot())
+ await writeToFile('schema/snapshot', schema, dir)
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/extract/extract-settings.ts b/packages/directus-template-cli/src/lib/extract/extract-settings.ts
new file mode 100644
index 0000000..c2856ff
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/extract-settings.ts
@@ -0,0 +1,23 @@
+import {readSettings} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import writeToFile from '../utils/write-to-file'
+
+/**
+ * Extract settings from the Directus instance
+ */
+
+export default async function extractSettings(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting settings'))
+ try {
+ const settings = await api.client.request(readSettings({limit: -1}))
+ await writeToFile('settings', settings, dir)
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/extract/extract-translations.ts b/packages/directus-template-cli/src/lib/extract/extract-translations.ts
new file mode 100644
index 0000000..cbed667
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/extract-translations.ts
@@ -0,0 +1,23 @@
+import {readTranslations} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import writeToFile from '../utils/write-to-file'
+
+/**
+ * Extract translations from the Directus instance
+ */
+
+export default async function extractTranslations(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting translations'))
+ try {
+ const translations = await api.client.request(readTranslations({limit: -1}))
+ await writeToFile('translations', translations, dir)
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/extract/extract-users.ts b/packages/directus-template-cli/src/lib/extract/extract-users.ts
new file mode 100644
index 0000000..cd3e30f
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/extract-users.ts
@@ -0,0 +1,26 @@
+import {readUsers} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import filterFields from '../utils/filter-fields'
+import {directusUserFields} from '../utils/system-fields'
+import writeToFile from '../utils/write-to-file'
+
+/**
+ * Extract users from the Directus instance
+ */
+
+export default async function extractUsers(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting users'))
+ try {
+ const response = await api.client.request(readUsers({limit: -1}))
+ const users = filterFields(response, directusUserFields)
+ await writeToFile('users', users, dir)
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/extract/index.ts b/packages/directus-template-cli/src/lib/extract/index.ts
new file mode 100644
index 0000000..9cc785b
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/extract/index.ts
@@ -0,0 +1,67 @@
+import {ux} from '@oclif/core'
+import fs from 'node:fs'
+
+import extractAccess from './extract-access'
+import {downloadAllFiles} from './extract-assets'
+import extractCollections from './extract-collections'
+import {extractContent} from './extract-content'
+import {extractDashboards, extractPanels} from './extract-dashboards'
+import extractExtensions from './extract-extensions'
+import extractFields from './extract-fields'
+import extractFiles from './extract-files'
+import {extractFlows, extractOperations} from './extract-flows'
+import extractFolders from './extract-folders'
+import extractPermissions from './extract-permissions'
+import extractPolicies from './extract-policies'
+import extractPresets from './extract-presets'
+import extractRelations from './extract-relations'
+import extractRoles from './extract-roles'
+import extractSchema from './extract-schema'
+import extractSettings from './extract-settings'
+import extractTranslations from './extract-translations'
+import extractUsers from './extract-users'
+
+export default async function extract(dir: string) {
+ // Get the destination directory for the actual files
+ const destination = dir + '/src'
+
+ // Check if directory exists, if not, then create it.
+ if (!fs.existsSync(destination)) {
+ ux.log(`Attempting to create directory at: ${destination}`)
+ fs.mkdirSync(destination, {recursive: true})
+ }
+
+ await extractSchema(destination)
+
+ await extractCollections(destination)
+ await extractFields(destination)
+ await extractRelations(destination)
+
+ await extractFolders(destination)
+ await extractFiles(destination)
+
+ await extractUsers(destination)
+ await extractRoles(destination)
+ await extractPermissions(destination)
+ await extractPolicies(destination)
+ await extractAccess(destination)
+
+ await extractPresets(destination)
+
+ await extractTranslations(destination)
+
+ await extractFlows(destination)
+ await extractOperations(destination)
+
+ await extractDashboards(destination)
+ await extractPanels(destination)
+
+ await extractSettings(destination)
+ await extractExtensions(destination)
+
+ await extractContent(destination)
+
+ await downloadAllFiles(destination)
+
+ return {}
+}
diff --git a/packages/directus-template-cli/src/lib/load/apply-flags.ts b/packages/directus-template-cli/src/lib/load/apply-flags.ts
new file mode 100644
index 0000000..d17b2f3
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/load/apply-flags.ts
@@ -0,0 +1,87 @@
+import {ux} from '@oclif/core'
+
+import catchError from '../utils/catch-error'
+
+export interface ApplyFlags {
+ content: boolean;
+ dashboards: boolean;
+ directusToken: string;
+ directusUrl: string;
+ extensions: boolean;
+ files: boolean;
+ flows: boolean;
+ partial: boolean;
+ permissions: boolean;
+ programmatic: boolean;
+ schema: boolean;
+ settings: boolean;
+ templateLocation: string;
+ templateType: 'community' | 'github' | 'local';
+ userEmail: string;
+ userPassword: string;
+ users: boolean;
+}
+
+export const loadFlags = [
+ 'content',
+ 'dashboards',
+ 'extensions',
+ 'files',
+ 'flows',
+ 'permissions',
+ 'schema',
+ 'settings',
+ 'users',
+] as const
+
+export function validateProgrammaticFlags(flags: ApplyFlags): ApplyFlags {
+ const {directusToken, directusUrl, templateLocation, userEmail, userPassword} = flags
+
+ if (!directusUrl) ux.error('Directus URL is required for programmatic mode.')
+ if (!directusToken && (!userEmail || !userPassword)) ux.error('Either Directus token or email and password are required for programmatic mode.')
+ if (!templateLocation) ux.error('Template location is required for programmatic mode.')
+
+ return flags.partial ? handlePartialFlags(flags) : setAllFlagsTrue(flags)
+}
+
+export function validateInteractiveFlags(flags: ApplyFlags): ApplyFlags {
+ return flags.partial ? handlePartialFlags(flags) : setAllFlagsTrue(flags)
+}
+
+function handlePartialFlags(flags: ApplyFlags): ApplyFlags {
+ const enabledFlags = loadFlags.filter(flag => flags[flag] === true)
+ const disabledFlags = loadFlags.filter(flag => flags[flag] === false)
+
+ if (enabledFlags.length > 0) {
+ for (const flag of loadFlags) flags[flag] = enabledFlags.includes(flag)
+ } else if (disabledFlags.length > 0) {
+ for (const flag of loadFlags) flags[flag] = !disabledFlags.includes(flag)
+ } else {
+ setAllFlagsTrue(flags)
+ }
+
+ handleDependencies(flags)
+
+ if (!loadFlags.some(flag => flags[flag])) {
+ catchError(new Error('When using --partial, at least one component must be loaded.'), {fatal: true})
+ }
+
+ return flags
+}
+
+function handleDependencies(flags: ApplyFlags): void {
+ if (flags.content && (!flags.schema || !flags.files)) {
+ flags.schema = flags.files = true
+ ux.warn('Content loading requires schema and files. Enabling schema and files flags.')
+ }
+
+ if (flags.users && !flags.permissions) {
+ flags.permissions = true
+ ux.warn('User loading requires permissions. Enabling permissions flag.')
+ }
+}
+
+function setAllFlagsTrue(flags: ApplyFlags): ApplyFlags {
+ for (const flag of loadFlags) flags[flag] = true
+ return flags
+}
diff --git a/packages/directus-template-cli/src/lib/load/index.ts b/packages/directus-template-cli/src/lib/load/index.ts
new file mode 100644
index 0000000..1be67d9
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/load/index.ts
@@ -0,0 +1,90 @@
+import {ux} from '@oclif/core'
+
+import checkTemplate from '../utils/check-template'
+import loadAccess from './load-access'
+import loadCollections from './load-collections'
+import loadDashboards from './load-dashboards'
+import loadData from './load-data'
+import loadExtensions from './load-extensions'
+import loadFiles from './load-files'
+import loadFlows from './load-flows'
+import loadFolders from './load-folders'
+import loadPermissions from './load-permissions'
+import loadPolicies from './load-policies'
+import loadPresets from './load-presets'
+import loadRelations from './load-relations'
+import loadRoles from './load-roles'
+import loadSettings from './load-settings'
+import loadTranslations from './load-translations'
+import loadUsers from './load-users'
+import updateRequiredFields from './update-required-fields'
+
+interface ApplyFlags {
+ content: boolean;
+ dashboards: boolean;
+ extensions: boolean;
+ files: boolean;
+ flows: boolean;
+ permissions: boolean;
+ schema: boolean;
+ settings: boolean;
+ users: boolean;
+}
+
+export default async function apply(dir: string, flags: ApplyFlags) {
+ const source = dir + '/src'
+ const isTemplateOk = await checkTemplate(source)
+ if (!isTemplateOk) {
+ ux.error('The template is missing the collections, fields, or relations files. Older templates are not supported in v0.4 of directus-template-cli. Try using v0.3 to load older templates npx directus-template-cli@0.3 apply or extract the template using latest version before applying. Exiting...')
+ }
+
+ if (flags.schema) {
+ await loadCollections(source)
+ await loadRelations(source)
+ }
+
+ if (flags.permissions || flags.users) {
+ await loadRoles(source)
+ await loadPolicies(source)
+ await loadPermissions(source)
+
+ if (flags.users) {
+ await loadUsers(source)
+ }
+
+ await loadAccess(source)
+ }
+
+ if (flags.files) {
+ await loadFolders(source)
+ await loadFiles(source)
+ }
+
+ if (flags.content) {
+ await loadData(source)
+ }
+
+ if (flags.schema) {
+ await updateRequiredFields(source)
+ }
+
+ if (flags.dashboards) {
+ await loadDashboards(source)
+ }
+
+ if (flags.flows) {
+ await loadFlows(source)
+ }
+
+ if (flags.settings) {
+ await loadSettings(source)
+ await loadTranslations(source)
+ await loadPresets(source)
+ }
+
+ if (flags.extensions) {
+ await loadExtensions(source)
+ }
+
+ return {}
+}
diff --git a/packages/directus-template-cli/src/lib/load/load-access.ts b/packages/directus-template-cli/src/lib/load/load-access.ts
new file mode 100644
index 0000000..f73d202
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/load/load-access.ts
@@ -0,0 +1,84 @@
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import getRoleIds from '../utils/get-role-ids'
+import readFile from '../utils/read-file'
+
+interface Access {
+ id: string;
+ policy: string;
+ role: null | string;
+ sort: null | number;
+ user: null | string;
+}
+
+export default async function loadAccess(dir: string) {
+ const access = readFile('access', dir) as Access[]
+ ux.action.start(ux.colorize(DIRECTUS_PINK, `Loading ${access.length} accesses`))
+
+ if (access && access.length > 0) {
+ // Fetch existing accesses
+
+ const existingAccesses = await api.client.request(() => ({
+ method: 'GET',
+ params: {
+ limit: -1,
+ },
+ path: '/access',
+ })) as Access[]
+
+ const {legacyAdminRoleId, newAdminRoleId} = await getRoleIds(dir)
+
+ const existingAccessById = new Map(existingAccesses.map(acc => [acc.id, acc]))
+ const existingAccessByCompositeKey = new Map(existingAccesses.map(acc => [getCompositeKey(acc), acc]))
+
+ for await (const acc of access) {
+ try {
+ if (existingAccessById.has(acc.id)) {
+ continue
+ }
+
+ const compositeKey = getCompositeKey(acc)
+ if (existingAccessByCompositeKey.has(compositeKey)) {
+ continue
+ }
+
+ // If the role is null, delete the role key to avoid errors
+ if (acc.role === null) {
+ delete acc.role
+ }
+
+ // If the role is the legacy admin role, update it to the new admin role
+ if (acc.role === legacyAdminRoleId) {
+ acc.role = newAdminRoleId
+ }
+
+ await api.client.request(() => ({
+ body: JSON.stringify(acc),
+ method: 'POST',
+ path: '/access',
+ }))
+
+ // Add the new access to our maps
+ existingAccessById.set(acc.id, acc)
+ existingAccessByCompositeKey.set(compositeKey, acc)
+ } catch (error) {
+ catchError(error, {
+ context: {
+ access: acc,
+ operation: 'createAccess',
+ },
+ })
+ }
+ }
+ }
+
+ ux.action.stop()
+}
+
+// Helper function to generate a composite key for each access
+function getCompositeKey(acc: Access): string {
+ return `${acc.role ?? 'null'}-${acc.user ?? 'null'}-${acc.policy}`
+}
diff --git a/packages/directus-template-cli/src/lib/load/load-collections.ts b/packages/directus-template-cli/src/lib/load/load-collections.ts
new file mode 100644
index 0000000..93dd523
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/load/load-collections.ts
@@ -0,0 +1,130 @@
+import {
+ createCollection, createField, readCollections, readFields, updateCollection,
+} from '@directus/sdk'
+import {Collection, CollectionMeta, Field} from '@directus/types'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import readFile from '../utils/read-file'
+
+/**
+ * Load collections into the Directus instance
+ */
+
+export default async function loadCollections(dir: string) {
+ const collectionsToAdd = readFile('collections', dir)
+ const fieldsToAdd = readFile('fields', dir)
+
+ ux.action.start(ux.colorize(DIRECTUS_PINK, `Loading ${collectionsToAdd.length} collections and ${fieldsToAdd.length} fields`))
+
+ await processCollections(collectionsToAdd, fieldsToAdd)
+ await updateCollections(collectionsToAdd)
+ await addCustomFieldsOnSystemCollections(fieldsToAdd)
+
+ ux.action.stop()
+}
+
+async function processCollections(collectionsToAdd: any[], fieldsToAdd: any[]) {
+ const existingCollections = await api.client.request(readCollections())
+ const existingFields = await api.client.request(readFields())
+
+ for await (const collection of collectionsToAdd) {
+ try {
+ const existingCollection = existingCollections.find((c: any) => c.collection === collection.collection)
+
+ await (existingCollection ? addNewFieldsToExistingCollection(collection.collection, fieldsToAdd, existingFields) : addNewCollectionWithFields(collection, fieldsToAdd))
+ } catch (error) {
+ catchError(error)
+ }
+ }
+}
+
+const removeRequiredorIsNullable = (field:Field) => {
+ if (field.meta?.required === true) {
+ field.meta.required = false
+ }
+
+ if (field.schema?.is_nullable === false) {
+ // eslint-disable-next-line camelcase
+ field.schema.is_nullable = true
+ }
+
+ if (field.schema?.is_unique === true) {
+ // eslint-disable-next-line camelcase
+ field.schema.is_unique = false
+ }
+
+ return field
+}
+
+async function addNewCollectionWithFields(collection: any, allFields: Field[]) {
+ const collectionFields = allFields.filter(field => field.collection === collection.collection)
+ .map(field => removeRequiredorIsNullable(field))
+ const collectionWithoutGroup = {
+ ...collection,
+ fields: collectionFields,
+ meta: {...collection.meta},
+ }
+ delete collectionWithoutGroup.meta.group
+ await api.client.request(createCollection(collectionWithoutGroup))
+}
+
+async function addNewFieldsToExistingCollection(collectionName: string, fieldsToAdd: Field[], existingFields: any[]) {
+ const collectionFieldsToAdd = fieldsToAdd.filter(field => field.collection === collectionName)
+ .map(field => removeRequiredorIsNullable(field))
+
+ const existingCollectionFields = existingFields.filter((field: any) => field.collection === collectionName)
+
+ for await (const field of collectionFieldsToAdd) {
+ if (!existingCollectionFields.some((existingField: any) => existingField.field === field.field)) {
+ try {
+ // @ts-ignore
+ await api.client.request(createField(collectionName, field))
+ } catch (error) {
+ catchError(error)
+ }
+ }
+ }
+}
+
+async function updateCollections(collections: any[]) {
+ for await (const collection of collections) {
+ try {
+ if (collection.meta.group) {
+ const pl = {
+ meta: {
+ group: collection.meta.group,
+ },
+ }
+ await api.client.request(updateCollection(collection.collection, pl))
+ }
+ } catch (error) {
+ catchError(error)
+ }
+ }
+}
+
+async function addCustomFieldsOnSystemCollections(fields: any[]) {
+ const customFields = fields.filter(
+ (field: any) => field.collection.startsWith('directus_'),
+ )
+
+ const existingFields = await api.client.request(readFields())
+
+ for await (const field of customFields) {
+ try {
+ const fieldExists = existingFields.some((existingField: any) =>
+ existingField.collection === field.collection && existingField.field === field.field,
+ )
+
+ if (!fieldExists) {
+ // @ts-expect-error string
+ await api.client.request(createField(field.collection, field))
+ }
+ } catch (error) {
+ catchError(error)
+ }
+ }
+}
diff --git a/packages/directus-template-cli/src/lib/load/load-dashboards.ts b/packages/directus-template-cli/src/lib/load/load-dashboards.ts
new file mode 100644
index 0000000..49a1e44
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/load/load-dashboards.ts
@@ -0,0 +1,70 @@
+import {createDashboard, createPanel, readDashboards, readPanels} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import readFile from '../utils/read-file'
+
+export default async function loadDashboards(dir: string) {
+ const dashboards = readFile('dashboards', dir)
+ ux.action.start(ux.colorize(DIRECTUS_PINK, `Loading ${dashboards.length} dashboards`))
+
+ if (dashboards && dashboards.length > 0) {
+ // Fetch existing dashboards
+ const existingDashboards = await api.client.request(readDashboards({
+ limit: -1,
+ }))
+ const existingDashboardIds = new Set(existingDashboards.map(dashboard => dashboard.id))
+
+ const filteredDashboards = dashboards.filter(dashboard => {
+ if (existingDashboardIds.has(dashboard.id)) {
+ return false
+ }
+
+ return true
+ }).map(dash => {
+ const newDash = {...dash}
+ delete newDash.panels
+ return newDash
+ })
+
+ await Promise.all(filteredDashboards.map(async dashboard => {
+ try {
+ await api.client.request(createDashboard(dashboard))
+ } catch (error) {
+ catchError(error)
+ }
+ }))
+
+ await loadPanels(dir)
+
+ ux.action.stop()
+ }
+}
+
+export async function loadPanels(dir: string) {
+ const panels = readFile('panels', dir)
+ ux.action.status = `Loading ${panels.length} panels`
+ // Fetch existing panels
+ const existingPanels = await api.client.request(readPanels({
+ limit: -1,
+ }))
+ const existingPanelIds = new Set(existingPanels.map(panel => panel.id))
+
+ const filteredPanels = panels.filter(panel => {
+ if (existingPanelIds.has(panel.id)) {
+ return false
+ }
+
+ return true
+ })
+
+ await Promise.all(filteredPanels.map(async panel => {
+ try {
+ await api.client.request(createPanel(panel))
+ } catch (error) {
+ catchError(error)
+ }
+ }))
+}
diff --git a/packages/directus-template-cli/src/lib/load/load-data.ts b/packages/directus-template-cli/src/lib/load/load-data.ts
new file mode 100644
index 0000000..b2598a6
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/load/load-data.ts
@@ -0,0 +1,162 @@
+import {createItems, readItems, updateItemsBatch, updateSingleton} from '@directus/sdk'
+import {ux} from '@oclif/core'
+import path from 'node:path'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import {chunkArray} from '../utils/chunk-array'
+import readFile from '../utils/read-file'
+
+const BATCH_SIZE = 50
+
+export default async function loadData(dir:string) {
+ const collections = readFile('collections', dir)
+ ux.action.start(ux.colorize(DIRECTUS_PINK, `Loading data for ${collections.length} collections`))
+
+ await loadSkeletonRecords(dir)
+ await loadFullData(dir)
+ await loadSingletons(dir)
+
+ ux.action.stop()
+}
+
+async function loadSkeletonRecords(dir: string) {
+ ux.action.status = 'Loading skeleton records'
+ const collections = readFile('collections', dir)
+ const primaryKeyMap = await getCollectionPrimaryKeys(dir)
+ const userCollections = collections
+ .filter(item => !item.collection.startsWith('directus_', 0))
+ .filter(item => item.schema !== null)
+ .filter(item => !item.meta.singleton)
+
+ await Promise.all(userCollections.map(async collection => {
+ const name = collection.collection
+ const primaryKeyField = getPrimaryKey(primaryKeyMap, name)
+ const sourceDir = path.resolve(dir, 'content')
+ const data = readFile(name, sourceDir)
+
+ // Fetch existing primary keys
+ const existingPrimaryKeys = await getExistingPrimaryKeys(name, primaryKeyField)
+
+ // Filter out existing records
+ const newData = data.filter(entry => !existingPrimaryKeys.has(entry[primaryKeyField]))
+
+ if (newData.length === 0) {
+ // ux.log(`${ux.colorize('dim', '--')} Skipping ${name}: No new records to add`)
+ return
+ }
+
+ const batches = chunkArray(newData, BATCH_SIZE).map(batch =>
+ batch.map(entry => ({[primaryKeyField]: entry[primaryKeyField]})),
+ )
+
+ await Promise.all(batches.map(batch => uploadBatch(name, batch, createItems)))
+ // ux.log(`${ux.colorize('dim', '--')} Added ${newData.length} new skeleton records to ${name}`)
+ }))
+
+ ux.action.status = 'Loaded skeleton records'
+}
+
+async function getExistingPrimaryKeys(collection: string, primaryKeyField: string): Promise> {
+ const existingKeys = new Set()
+ let page = 1
+ const limit = 1000 // Adjust based on your needs and API limits
+
+ while (true) {
+ try {
+ // @ts-expect-error string
+ const response = await api.client.request(readItems(collection, {
+ fields: [primaryKeyField],
+ limit,
+ page,
+ }))
+
+ if (response.length === 0) break
+
+ for (const item of response) existingKeys.add(item[primaryKeyField])
+
+ if (response.length < limit) break
+ page++
+ } catch (error) {
+ catchError(error)
+ break
+ }
+ }
+
+ return existingKeys
+}
+
+async function uploadBatch(collection: string, batch: any[], method: Function) {
+ try {
+ await api.client.request(method(collection, batch))
+ } catch (error) {
+ catchError(error)
+ }
+}
+
+async function loadFullData(dir:string) {
+ ux.action.status = 'Updating records with full data'
+ const collections = readFile('collections', dir)
+ const userCollections = collections
+ .filter(item => !item.collection.startsWith('directus_', 0))
+ .filter(item => item.schema !== null)
+ .filter(item => !item.meta.singleton)
+
+ await Promise.all(userCollections.map(async collection => {
+ const name = collection.collection
+ const sourceDir = path.resolve(dir, 'content')
+ const data = readFile(name, sourceDir)
+
+ const batches = chunkArray(data, BATCH_SIZE).map(batch =>
+ batch.map(({user_created, user_updated, ...cleanedRow}) => cleanedRow),
+ )
+
+ await Promise.all(batches.map(batch => uploadBatch(name, batch, updateItemsBatch)))
+ }))
+
+ ux.action.status = 'Updated records with full data'
+}
+
+async function loadSingletons(dir:string) {
+ ux.action.status = 'Loading data for singleton collections'
+ const collections = readFile('collections', dir)
+ const singletonCollections = collections
+ .filter(item => !item.collection.startsWith('directus_', 0))
+ .filter(item => item.meta.singleton)
+
+ await Promise.all(singletonCollections.map(async collection => {
+ const name = collection.collection
+ const sourceDir = path.resolve(dir, 'content')
+ const data = readFile(name, sourceDir)
+ try {
+ const {user_created, user_updated, ...cleanedData} = data as any
+ // @ts-expect-error
+ await api.client.request(updateSingleton(name, cleanedData))
+ } catch (error) {
+ catchError(error)
+ }
+ }))
+
+ ux.action.status = 'Loaded data for singleton collections'
+}
+
+async function getCollectionPrimaryKeys(dir: string) {
+ const fields = readFile('fields', dir)
+ const primaryKeys = {}
+ for (const field of fields) {
+ if (field.schema && field.schema?.is_primary_key) {
+ primaryKeys[field.collection] = field.field
+ }
+ }
+
+ return primaryKeys
+}
+
+function getPrimaryKey(collectionsMap: any, collection: string) {
+ if (!collectionsMap[collection]) {
+ catchError(`Collection ${collection} not found in collections map`)
+ }
+
+ return collectionsMap[collection]
+}
diff --git a/packages/directus-template-cli/src/lib/load/load-extensions.ts b/packages/directus-template-cli/src/lib/load/load-extensions.ts
new file mode 100644
index 0000000..4c87982
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/load/load-extensions.ts
@@ -0,0 +1,81 @@
+import {customEndpoint, readExtensions} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import {Extension} from '../types/extension'
+import catchError from '../utils/catch-error'
+import readFile from '../utils/read-file'
+
+async function installExtension(extension: any): Promise {
+ await api.client.request(customEndpoint({
+ body: JSON.stringify({
+ extension: extension.id,
+ version: extension.version,
+ }),
+ method: 'POST',
+ path: '/extensions/registry/install',
+ }))
+}
+
+export default async function loadExtensions(dir: string): Promise {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Loading extensions'))
+
+ try {
+ const extensions: Extension[] = readFile('extensions', dir)
+
+ if (extensions && extensions.length > 0) {
+ const installedExtensions = await api.client.request(readExtensions())
+
+ const registryExtensions = extensions.filter(ext => ext.meta?.source === 'registry' && !ext.bundle)
+ const bundles = [...new Set(extensions.filter(ext => ext.bundle).map(ext => ext.bundle))]
+ const localExtensions = extensions.filter(ext => ext.meta?.source === 'local')
+
+ const extensionsToInstall = extensions.filter(ext =>
+ ext.meta?.source === 'registry'
+ && !ext.bundle
+ // @ts-expect-error
+ && !installedExtensions.some(installed => installed.id === ext.id),
+ )
+
+ ux.log(`Found ${extensions.length} extensions total: ${registryExtensions.length} registry extensions (including ${bundles.length} bundles), and ${localExtensions.length} local extensions`)
+
+ if (extensionsToInstall.length > 0) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, `Installing ${extensionsToInstall.length} extensions`))
+ const results = await Promise.allSettled(extensionsToInstall.map(async ext => {
+ try {
+ await installExtension({
+ id: ext.id,
+ // The extension version UUID is the folder name
+ version: ext.meta?.folder,
+ })
+ return `-- Installed ${ext.schema?.name}`
+ } catch (error) {
+ catchError(error)
+ return `-- Failed to install ${ext.schema?.name}`
+ }
+ }))
+
+ for (const result of results) {
+ if (result.status === 'fulfilled') {
+ ux.log(result.value)
+ }
+ }
+
+ ux.action.stop()
+ ux.log('Finished installing extensions')
+ } else {
+ // All extensions are already installed
+ ux.log('All extensions are already installed')
+ }
+
+ if (localExtensions.length > 0) {
+ ux.log(`Note: ${localExtensions.length} local extensions need to be installed manually.`)
+ }
+ }
+ } catch {
+ ux.log(`${ux.colorize('dim', '--')} No extensions found or extensions file is empty. Skipping extension installation.`)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/load/load-files.ts b/packages/directus-template-cli/src/lib/load/load-files.ts
new file mode 100644
index 0000000..2304aef
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/load/load-files.ts
@@ -0,0 +1,65 @@
+import {readFiles, uploadFiles} from '@directus/sdk'
+import {ux} from '@oclif/core'
+import {FormData} from 'formdata-node'
+import {readFileSync} from 'node:fs'
+import path from 'node:path'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import readFile from '../utils/read-file'
+
+export default async function loadFiles(dir: string) {
+ const files = readFile('files', dir)
+ ux.action.start(ux.colorize(DIRECTUS_PINK, `Loading ${files.length} files`))
+
+ if (files && files.length > 0) {
+ try {
+ // Fetch only the files we're interested in
+ const existingFiles = await api.client.request(readFiles({
+ fields: ['id', 'filename_disk'],
+ limit: -1,
+ }))
+
+ const existingFileIds = new Set(existingFiles.map(file => file.id))
+ const existingFileNames = new Set(existingFiles.map(file => file.filename_disk))
+
+ const filesToUpload = files.filter(file => {
+ if (existingFileIds.has(file.id)) {
+ return false
+ }
+
+ if (existingFileNames.has(file.filename_disk)) {
+ return false
+ }
+
+ return true
+ })
+
+ await Promise.all(filesToUpload.map(async asset => {
+ const fileName = asset.filename_disk
+ const assetPath = path.resolve(dir, 'assets', fileName)
+ const fileStream = new Blob([readFileSync(assetPath)], {type: asset.type})
+
+ const form = new FormData()
+ form.append('id', asset.id)
+
+ if (asset.title) form.append('title', asset.title)
+ if (asset.description) form.append('description', asset.description)
+ if (asset.folder) form.append('folder', asset.folder)
+
+ form.append('file', fileStream, fileName)
+
+ try {
+ await api.client.request(uploadFiles(form))
+ } catch (error) {
+ catchError(error)
+ }
+ }))
+ } catch (error) {
+ catchError(error)
+ }
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/load/load-flows.ts b/packages/directus-template-cli/src/lib/load/load-flows.ts
new file mode 100644
index 0000000..0aa8c7b
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/load/load-flows.ts
@@ -0,0 +1,77 @@
+import {createFlow, createOperations, readFlows, updateOperation} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import readFile from '../utils/read-file'
+
+export default async function loadFlows(dir: string) {
+ const flows = readFile('flows', dir)
+ const allOperations = readFile('operations', dir)
+ ux.action.start(ux.colorize(DIRECTUS_PINK, `Loading ${flows.length} flows`))
+
+ if (flows && flows.length > 0) {
+ try {
+ // Fetch existing flows
+ const existingFlows = await api.client.request(readFlows({
+ limit: -1,
+ }))
+ const existingFlowIds = new Set(existingFlows.map(flow => flow.id))
+
+ const newFlows = flows.filter(flow => !existingFlowIds.has(flow.id))
+
+ const results = await Promise.allSettled(newFlows.map(flow =>
+ api.client.request(createFlow(flow)),
+ ))
+
+ const createdFlowIds = new Set()
+ for (const [index, result] of results.entries()) {
+ if (result.status === 'fulfilled') {
+ createdFlowIds.add(newFlows[index].id)
+ } else {
+ catchError(result.reason)
+ }
+ }
+
+ // Filter operations for newly created flows
+ const newOperations = allOperations.filter(operation => createdFlowIds.has(operation.flow))
+
+ await loadOperations(newOperations)
+ } catch (error) {
+ catchError(error)
+ } finally {
+ ux.action.stop()
+ }
+ }
+}
+
+export async function loadOperations(operations: any[]) {
+ ux.action.status = `Loading ${operations.length} operations`
+
+ try {
+ const opsIds = operations.map(operation => {
+ const opCopy = {...operation}
+ delete opCopy.reject
+ delete opCopy.resolve
+ return opCopy
+ })
+
+ await api.client.request(createOperations(opsIds))
+
+ const results = await Promise.allSettled(operations.map(operation =>
+ api.client.request(updateOperation(operation.id, {
+ reject: operation.reject,
+ resolve: operation.resolve,
+ })),
+ ))
+
+ for (const [index, result] of results.entries()) {
+ if (result.status === 'rejected') {
+ catchError(result.reason)
+ }
+ }
+ } catch (error) {
+ catchError(error)
+ }
+}
diff --git a/packages/directus-template-cli/src/lib/load/load-folders.ts b/packages/directus-template-cli/src/lib/load/load-folders.ts
new file mode 100644
index 0000000..2778769
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/load/load-folders.ts
@@ -0,0 +1,53 @@
+import {createFolders, readFolders, updateFolder} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import readFile from '../utils/read-file'
+
+export default async function loadFolders(dir: string) {
+ const folders = readFile('folders', dir)
+ ux.action.start(ux.colorize(DIRECTUS_PINK, `Loading ${folders.length} folders`))
+
+ if (folders && folders.length > 0) {
+ try {
+ // Fetch existing folders
+ const existingFolders = await api.client.request(readFolders({
+ limit: -1,
+ }))
+ const existingFolderIds = new Set(existingFolders.map(folder => folder.id))
+
+ const foldersToAdd = folders.filter(folder => {
+ if (existingFolderIds.has(folder.id)) {
+ return false
+ }
+
+ return true
+ })
+
+ if (foldersToAdd.length > 0) {
+ const folderSkeleton = foldersToAdd.map(folder => ({id: folder.id, name: folder.name}))
+
+ // Create the folders
+ await api.client.request(createFolders(folderSkeleton))
+
+ // Update the folders with relationships concurrently
+ await Promise.all(foldersToAdd.map(async folder => {
+ const {id, ...rest} = folder
+ try {
+ await api.client.request(updateFolder(id, rest))
+ } catch (error) {
+ catchError(error)
+ }
+ }))
+ } else {
+ // ux.info('-- No new folders to create')
+ }
+ } catch (error) {
+ catchError(error)
+ }
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/load/load-permissions.ts b/packages/directus-template-cli/src/lib/load/load-permissions.ts
new file mode 100644
index 0000000..aa947c4
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/load/load-permissions.ts
@@ -0,0 +1,38 @@
+import {createPermissions, readPermissions} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import readFile from '../utils/read-file'
+
+export default async function loadPermissions(
+ dir: string) {
+ const permissions = readFile('permissions', dir)
+ ux.action.start(ux.colorize(DIRECTUS_PINK, `Loading ${permissions.length} permissions`))
+
+ if (permissions && permissions.length > 0) {
+ try {
+ const existingPermissions = await api.client.request(readPermissions({
+ limit: -1,
+ }))
+
+ const existingPermissionKeys = new Set(
+ existingPermissions.map(p => `${p.collection}:${p.action}:${p.policy}`),
+ )
+
+ // Filter out duplicates
+ const newPermissions = permissions.filter(newPerm =>
+ !existingPermissionKeys.has(`${newPerm.collection}:${newPerm.action}:${newPerm.policy}`),
+ )
+
+ if (newPermissions.length > 0) {
+ await api.client.request(createPermissions(newPermissions))
+ }
+ } catch (error) {
+ catchError(error)
+ }
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/load/load-policies.ts b/packages/directus-template-cli/src/lib/load/load-policies.ts
new file mode 100644
index 0000000..6ce4e39
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/load/load-policies.ts
@@ -0,0 +1,41 @@
+import {createPolicy, readPolicies} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import readFile from '../utils/read-file'
+export default async function loadPolicies(dir: string) {
+ const policies = readFile('policies', dir)
+ ux.action.start(ux.colorize(DIRECTUS_PINK, `Loading ${policies.length} policies`))
+
+ if (policies && policies.length > 0) {
+ // Fetch existing policies
+ const existingPolicies = await api.client.request(readPolicies({
+ limit: -1,
+ }))
+ const existingPolicyIds = new Set(existingPolicies.map(policy => policy.id))
+
+ const PUBLIC_POLICY_ID = 'abf8a154-5b1c-4a46-ac9c-7300570f4f17'
+ const policiesWithoutPublic = policies.filter(policy => policy.id !== PUBLIC_POLICY_ID)
+
+ for await (const policy of policiesWithoutPublic) {
+ try {
+ if (existingPolicyIds.has(policy.id)) {
+ ux.action.status = `Skipping existing policy: ${policy.name}`
+ continue
+ }
+
+ // Create new policy
+ await api.client.request(createPolicy(policy))
+
+ // Add the new policy ID to our set of existing policies
+ existingPolicyIds.add(policy.id)
+ } catch (error) {
+ catchError(error)
+ }
+ }
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/load/load-presets.ts b/packages/directus-template-cli/src/lib/load/load-presets.ts
new file mode 100644
index 0000000..bee4a46
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/load/load-presets.ts
@@ -0,0 +1,44 @@
+import {createPresets, readPresets} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import readFile from '../utils/read-file'
+
+export default async function loadPresets(dir: string) {
+ const presets = readFile('presets', dir)
+ ux.action.start(ux.colorize(DIRECTUS_PINK, `Loading ${presets.length} presets`))
+
+ if (presets && presets.length > 0) {
+ // Fetch existing presets
+ const existingPresets = await api.client.request(readPresets({
+ limit: -1,
+ }))
+ const existingPresetIds = new Set(existingPresets.map(preset => preset.id))
+
+ const presetsToAdd = presets.filter(preset => {
+ if (existingPresetIds.has(preset.id)) {
+ return false
+ }
+
+ return true
+ }).map(preset => {
+ const cleanPreset = {...preset}
+ cleanPreset.user = null
+ return cleanPreset
+ })
+
+ if (presetsToAdd.length > 0) {
+ try {
+ await api.client.request(createPresets(presetsToAdd))
+ } catch (error) {
+ catchError(error)
+ }
+ } else {
+ // ux.info('-- No new presets to create')
+ }
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/load/load-relations.ts b/packages/directus-template-cli/src/lib/load/load-relations.ts
new file mode 100644
index 0000000..bb0a3c6
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/load/load-relations.ts
@@ -0,0 +1,51 @@
+import {createRelation, readRelations} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import readFile from '../utils/read-file'
+
+/**
+ * Load relationships into the Directus instance
+ */
+
+export default async function loadRelations(dir: string) {
+ const relations = readFile('relations', dir)
+ ux.action.start(ux.colorize(DIRECTUS_PINK, `Loading ${relations.length} relations`))
+
+ if (relations && relations.length > 0) {
+ // Fetch existing relations
+ const existingRelations = await api.client.request(readRelations())
+ const existingRelationKeys = new Set(existingRelations.map(relation =>
+ `${relation.collection}:${relation.field}:${relation.related_collection}`,
+ ))
+
+ const relationsToAdd = relations.filter(relation => {
+ const key = `${relation.collection}:${relation.field}:${relation.related_collection}`
+ if (existingRelationKeys.has(key)) {
+ return false
+ }
+
+ return true
+ }).map(relation => {
+ const cleanRelation = {...relation}
+ delete cleanRelation.meta.id
+ return cleanRelation
+ })
+
+ await addRelations(relationsToAdd)
+ }
+
+ ux.action.stop()
+}
+
+async function addRelations(relations: any[]) {
+ for await (const relation of relations) {
+ try {
+ await api.client.request(createRelation(relation))
+ } catch (error) {
+ catchError(error)
+ }
+ }
+}
diff --git a/packages/directus-template-cli/src/lib/load/load-roles.ts b/packages/directus-template-cli/src/lib/load/load-roles.ts
new file mode 100644
index 0000000..6bdee96
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/load/load-roles.ts
@@ -0,0 +1,68 @@
+import {createRole, readRoles, updateRole} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import getRoleIds from '../utils/get-role-ids'
+import readFile from '../utils/read-file'
+
+export default async function loadRoles(dir: string) {
+ const roles = readFile('roles', dir)
+ ux.action.start(ux.colorize(DIRECTUS_PINK, `Loading ${roles.length} roles`))
+
+ if (roles && roles.length > 0) {
+ const {legacyAdminRoleId, newAdminRoleId} = await getRoleIds(dir)
+
+ // Fetch existing roles
+ const existingRoles = await api.client.request(readRoles({
+ limit: -1,
+ }))
+ const existingRoleIds = new Set(existingRoles.map(role => role.id))
+ const existingRoleNames = new Set(existingRoles.map(role => role.name.toLowerCase()))
+
+ const cleanedUpRoles = roles
+ .filter(role => role.name !== 'Administrator') // Don't load legacy admin role
+ .filter(role => !existingRoleNames.has(role.name.toLowerCase())) // Filter out roles with existing names
+ .map(role => {
+ const r = {...role}
+ delete r.users // Alias field. User roles will be applied when the users are loaded.
+ delete r.parent // We need to load all roles first
+ return r
+ })
+
+ for await (const role of cleanedUpRoles) {
+ try {
+ if (existingRoleIds.has(role.id)) {
+ continue
+ }
+
+ // Create new role
+ await api.client.request(createRole(role))
+ // Add the new role ID and name to our sets of existing roles
+ existingRoleIds.add(role.id)
+ existingRoleNames.add(role.name.toLowerCase())
+ } catch (error) {
+ catchError(error)
+ }
+ }
+
+ // Now add in any parent fields
+ const rolesWithParents = roles.filter(role => role.parent !== null)
+ for await (const role of rolesWithParents) {
+ try {
+ // Remap any roles where the parent ID is the default admin role
+ if (role.parent === legacyAdminRoleId) {
+ role.parent = newAdminRoleId
+ }
+
+ const simplifiedRole = {parent: role.parent}
+ await api.client.request(updateRole(role.id, simplifiedRole))
+ } catch (error) {
+ catchError(error)
+ }
+ }
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/load/load-settings.ts b/packages/directus-template-cli/src/lib/load/load-settings.ts
new file mode 100644
index 0000000..07428c8
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/load/load-settings.ts
@@ -0,0 +1,67 @@
+
+import type {DirectusSettings} from '@directus/sdk'
+
+import {readSettings, updateSettings} from '@directus/sdk'
+import {ux} from '@oclif/core'
+import {createDefu} from 'defu'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import readFile from '../utils/read-file'
+
+const customDefu = createDefu((obj, key, value) => {
+ if (Array.isArray(obj[key]) && Array.isArray(value)) {
+ // @ts-expect-error
+ obj[key] = mergeArrays(key, obj[key], value)
+ return true
+ }
+
+ if (typeof obj[key] === 'string' && typeof value === 'string') {
+ // @ts-expect-error
+ obj[key] = mergeJsonStrings(obj[key], value)
+ return true
+ }
+})
+
+function mergeArrays(key: string, current: any[], incoming: any[]): any[] {
+ const mergeKeys = {
+ /* eslint-disable camelcase */
+ basemaps: ['key'],
+ custom_aspect_ratios: ['key'],
+ module_bar: ['id', 'type'],
+ storage_asset_presets: ['key'],
+ /* eslint-enable camelcase */
+ }
+
+ const keys = mergeKeys[key as keyof typeof mergeKeys]
+ if (!keys) return [...new Set([...current, ...incoming])]
+
+ return current.concat(
+ incoming.filter(item => !current.some(
+ currentItem => keys.every(k => currentItem[k] === item[k]),
+ )),
+ )
+}
+
+function mergeJsonStrings(current: string, incoming: string): string {
+ try {
+ return JSON.stringify(customDefu(JSON.parse(current), JSON.parse(incoming)))
+ } catch {
+ return incoming // If not valid JSON, return the incoming value
+ }
+}
+
+export default async function loadSettings(dir: string) {
+ ux.action.start(ux.colorize(DIRECTUS_PINK, 'Loading settings'))
+ const settings = readFile('settings', dir)
+ try {
+ const currentSettings = await api.client.request(readSettings())
+ const mergedSettings = customDefu(currentSettings, settings) as DirectusSettings
+ await api.client.request(updateSettings(mergedSettings))
+ } catch (error) {
+ catchError(error)
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/load/load-translations.ts b/packages/directus-template-cli/src/lib/load/load-translations.ts
new file mode 100644
index 0000000..88dc742
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/load/load-translations.ts
@@ -0,0 +1,41 @@
+import {createTranslations, readTranslations} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import readFile from '../utils/read-file'
+
+export default async function loadTranslations(dir: string) {
+ const translations = readFile('translations', dir)
+ ux.action.start(ux.colorize(DIRECTUS_PINK, `Loading ${translations.length} translations`))
+
+ if (translations && translations.length > 0) {
+ // Fetch existing translations
+ const existingTranslations = await api.client.request(readTranslations({
+ limit: -1,
+ }))
+ const existingTranslationKeys = new Set(existingTranslations.map(t => `${t.language}_${t.key}`))
+
+ const newTranslations = translations.filter(t => {
+ const key = `${t.language}_${t.key}`
+ if (existingTranslationKeys.has(key)) {
+ return false
+ }
+
+ return true
+ })
+
+ if (newTranslations.length > 0) {
+ try {
+ await api.client.request(createTranslations(newTranslations))
+ } catch (error) {
+ catchError(error)
+ }
+ } else {
+ // ux.info('-- No new translations to create')
+ }
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/load/load-users.ts b/packages/directus-template-cli/src/lib/load/load-users.ts
new file mode 100644
index 0000000..f35238a
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/load/load-users.ts
@@ -0,0 +1,70 @@
+import {createUser, readUsers} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import getRoleIds from '../utils/get-role-ids'
+import readFile from '../utils/read-file'
+
+export default async function loadUsers(
+ dir: string,
+) {
+ const users = readFile('users', dir)
+ ux.action.start(ux.colorize(DIRECTUS_PINK, `Loading ${users.length} users`))
+
+ if (users && users.length > 0) {
+ const {legacyAdminRoleId, newAdminRoleId} = await getRoleIds(dir)
+ const existingUsers = await api.client.request(readUsers({
+ limit: -1,
+ }))
+
+ const filteredUsers = users.map(user => {
+ // If the user is an admin, we need to change their role to the new admin role
+ const isAdmin = user.role === legacyAdminRoleId
+ user.role = isAdmin ? newAdminRoleId : user.role
+
+ // Delete the unneeded fields
+ delete user.last_page
+ delete user.token
+ delete user.policies
+ // Delete passwords to prevent setting to *******
+ delete user.password
+
+ return user
+ })
+
+ for await (const user of filteredUsers) {
+ const existingUserWithSameId = existingUsers && Array.isArray(existingUsers)
+ ? existingUsers.find(existing => existing.id === user.id)
+ : undefined
+
+ const existingUserWithSameEmail = existingUsers && Array.isArray(existingUsers)
+ ? existingUsers.find(existing => existing.email === user.email)
+ : undefined
+
+ if (existingUserWithSameId) {
+ // Skip if there's an existing user with the same id
+ continue
+ }
+
+ if (existingUserWithSameEmail) {
+ // Delete email if there's an existing user with the same email but different id
+ delete user.email
+ }
+
+ if (user.email === null) {
+ // Delete email if it's null
+ delete user.email
+ }
+
+ try {
+ await api.client.request(createUser(user))
+ } catch (error) {
+ catchError(error)
+ }
+ }
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/load/update-required-fields.ts b/packages/directus-template-cli/src/lib/load/update-required-fields.ts
new file mode 100644
index 0000000..508c601
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/load/update-required-fields.ts
@@ -0,0 +1,25 @@
+
+import {updateField} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {DIRECTUS_PINK} from '../constants'
+import {api} from '../sdk'
+import catchError from '../utils/catch-error'
+import readFile from '../utils/read-file'
+
+export default async function updateRequiredFields(dir: string) {
+ const fieldsToUpdate = readFile('fields', dir)
+ .filter(field => field.meta.required === true || field.schema?.is_nullable === false || field.schema?.is_unique === true)
+
+ ux.action.start(ux.colorize(DIRECTUS_PINK, `Updating ${fieldsToUpdate.length} fields to required`))
+
+ for await (const field of fieldsToUpdate) {
+ try {
+ await api.client.request(updateField(field.collection, field.field, {meta: {...field.meta}, schema: {...field.schema}}))
+ } catch (error) {
+ catchError(error)
+ }
+ }
+
+ ux.action.stop()
+}
diff --git a/packages/directus-template-cli/src/lib/sdk.ts b/packages/directus-template-cli/src/lib/sdk.ts
new file mode 100644
index 0000000..44587cb
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/sdk.ts
@@ -0,0 +1,183 @@
+import type {AuthenticationClient, AuthenticationData, RestClient} from '@directus/sdk'
+
+import {authentication, createDirectus, rest} from '@directus/sdk'
+import {ux} from '@oclif/core'
+import Bottleneck from 'bottleneck'
+
+export interface Schema {
+
+}
+
+export class DirectusError extends Error {
+ errors: Array<{ extensions?: Record; message: string }>
+ headers: Headers
+ message: string
+ response: Response
+ status: number
+ constructor(response: Response) {
+ super(response.statusText)
+ this.name = 'DirectusError'
+ this.headers = response.headers
+ this.status = response.status
+ this.response = response
+ this.errors = []
+ this.message = response.statusText
+ }
+
+ formatError(): string {
+ if (this.errors.length === 0) {
+ return `Directus Error: ${this.message} (Status: ${this.status})`
+ }
+
+ const {extensions, message} = this.errors[0]
+ let formattedError = `Directus Error: ${message.trim()} (Status: ${this.status})`
+
+ if (extensions) {
+ formattedError += ` ${JSON.stringify(extensions)}`
+ }
+
+ return formattedError
+ }
+
+ async parseErrors(): Promise {
+ try {
+ const data = await this.response.json()
+ if (data && Array.isArray(data.errors)) {
+ this.errors = data.errors
+ this.message = this.formatError()
+ }
+ } catch {
+ // If parsing fails, keep the errors array empty
+ }
+ }
+}
+
+class Api {
+ public client: (RestClient & AuthenticationClient) | undefined
+ private authData: AuthenticationData | null = null
+ private limiter: Bottleneck
+
+ constructor() {
+ this.limiter = new Bottleneck({
+ maxConcurrent: 10,
+ minTime: 100, // Ensure at least 100ms between requests
+ reservoir: 50, // Reservoir to handle the default rate limiter of 50 requests per second
+ reservoirRefreshAmount: 50,
+ reservoirRefreshInterval: 1000, // Refill 50 requests every 1 second
+ retryCount: 3, // Retry a maximum of 3 times
+ })
+
+ this.limiter.on('failed', async (error, jobInfo) => {
+ if (error instanceof DirectusError) {
+ const retryAfter = error.headers?.get('Retry-After')
+ const statusCode = error.status
+
+ if (statusCode === 429) {
+ const delay = retryAfter ? Number.parseInt(retryAfter, 10) * 1000 : 60_000
+ ux.log(`${ux.colorize('dim', '--')} Rate limited. Retrying after ${delay}ms`)
+ return delay
+ }
+
+ if (statusCode === 503) {
+ const delay = retryAfter ? Number.parseInt(retryAfter, 10) * 1000 : 5000
+ ux.log(`${ux.colorize('dim', '--')} Server under pressure. Retrying after ${delay}ms`)
+ return delay
+ }
+
+ // If the status code is 400 or 401, we don't want to retry
+ if (statusCode === 400 || statusCode === 401) {
+ return
+ }
+ }
+
+ // For other errors, use exponential backoff, but only if we haven't exceeded retryCount
+ if (jobInfo.retryCount < 3) {
+ const delay = Math.min(1000 * 2 ** jobInfo.retryCount, 30_000)
+ ux.log(`${ux.colorize('dim', '--')} Request failed. Retrying after ${delay}ms`)
+ return delay
+ }
+
+ ux.log(`${ux.colorize('dim', '--')} Max retries reached, not retrying further`)
+ })
+
+ this.limiter.on('retry', (error, jobInfo) => {
+ ux.log(`${ux.colorize('dim', '--')} Retrying job (attempt ${jobInfo.retryCount + 1})`)
+ })
+
+ this.limiter.on('depleted', empty => {
+ if (empty) {
+ ux.log(`${ux.colorize('dim', '--')} Rate limit quota depleted. Requests will be queued.`)
+ }
+ })
+ }
+
+ public getToken(): null | string {
+ return this.authData?.access_token ?? null
+ }
+
+ public initialize(url: string): void {
+ this.client = createDirectus(url, {
+ globals: {
+ fetch: this.limiter.wrap(this.enhancedFetch),
+ },
+ })
+ .with(rest())
+ .with(authentication('json', {
+ autoRefresh: true,
+ storage: {
+ get: () => this.authData,
+ set: data => {
+ this.authData = data
+ },
+ },
+ }))
+ }
+
+ public async login(email: string, password: string): Promise {
+ if (!this.client) {
+ throw new Error('API client is not initialized. Call initialize() first.')
+ }
+
+ await this.client.login(email, password)
+ }
+
+ public async loginWithToken(token: string): Promise {
+ if (!this.client) {
+ throw new Error('API client is not initialized. Call initialize() first.')
+ }
+
+ await this.client.setToken(token)
+ }
+
+ public async logout(): Promise {
+ if (!this.client) {
+ throw new Error('API client is not initialized. Call initialize() first.')
+ }
+
+ await this.client.logout()
+ this.authData = null
+ }
+
+ public async refreshToken(): Promise {
+ if (!this.client) {
+ throw new Error('API client is not initialized. Call initialize() first.')
+ }
+
+ await this.client.refresh()
+ }
+
+ private async enhancedFetch(...args: Parameters): Promise {
+ const response = await fetch(...args)
+
+ if (!response.ok) {
+ const error = new DirectusError(response)
+ await error.parseErrors()
+ throw error
+ }
+
+ return response
+ }
+}
+
+const api = new Api()
+export {api}
diff --git a/packages/directus-template-cli/src/lib/types/extension.ts b/packages/directus-template-cli/src/lib/types/extension.ts
new file mode 100644
index 0000000..a2cdde7
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/types/extension.ts
@@ -0,0 +1,45 @@
+type ExtensionType = 'bundle' | 'interface' | 'module' | 'operation' | 'panel';
+
+export interface ExtensionMeta {
+ bundle: null | string;
+ enabled: boolean;
+ folder: string;
+ id: string;
+ source: 'local' | 'registry';
+}
+
+export interface ExtensionSchema {
+ entries?: Array<{
+ name: string;
+ type: ExtensionType;
+ }>;
+ entrypoint: {
+ api: string;
+ app: string;
+ } | string;
+ host: string;
+ local: boolean;
+ name: string;
+ path: string;
+ sandbox?: {
+ enabled: boolean;
+ requestedScopes: {
+ log: Record;
+ request?: {
+ methods: string[];
+ urls: string[];
+ };
+ };
+ };
+ type: ExtensionType;
+ version: string;
+}
+
+export interface Extension {
+ bundle: null | string;
+ id: string;
+ meta: ExtensionMeta;
+ schema: ExtensionSchema;
+}
+
+export type Extensions = Extension[];
diff --git a/packages/directus-template-cli/src/lib/utils/auth.ts b/packages/directus-template-cli/src/lib/utils/auth.ts
new file mode 100644
index 0000000..fa2b688
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/utils/auth.ts
@@ -0,0 +1,97 @@
+import {readMe} from '@directus/sdk'
+import {ux} from '@oclif/core'
+
+import {api} from '../sdk'
+import catchError from './catch-error'
+import validateUrl from './validate-url'
+
+interface AuthFlags {
+ directusToken?: string;
+ directusUrl: string;
+ userEmail?: string;
+ userPassword?: string;
+}
+
+/**
+ * Get the Directus URL from the user
+ * @returns The Directus URL
+ */
+
+export async function getDirectusUrl() {
+ const directusUrl = await ux.prompt('What is your Directus URL?', {default: 'http://localhost:8055'})
+
+ // Validate URL
+ if (!validateUrl(directusUrl)) {
+ ux.warn('Invalid URL')
+ return getDirectusUrl()
+ }
+
+ api.initialize(directusUrl)
+
+ return directusUrl
+}
+
+/**
+ * Get the Directus token from the user
+ * @param directusUrl - The Directus URL
+ * @returns The Directus token
+ */
+
+export async function getDirectusToken(directusUrl: string) {
+ const directusToken = await ux.prompt('What is your Directus Admin Token?')
+
+ // Validate token by fetching the user
+ try {
+ await api.loginWithToken(directusToken)
+ const response = await api.client.request(readMe())
+ return directusToken
+ } catch (error) {
+ catchError(error, {
+ context: {
+ directusUrl,
+ message: 'Invalid token. Please try again.',
+ operation: 'getDirectusToken',
+ },
+ })
+ return getDirectusToken(directusUrl)
+ }
+}
+
+/**
+ * Initialize the Directus API with the provided flags
+ * @param flags - The validated ApplyFlags
+ */
+
+export async function initializeDirectusApi(flags: AuthFlags): Promise {
+ api.initialize(flags.directusUrl)
+
+ try {
+ if (flags.directusToken) {
+ await api.loginWithToken(flags.directusToken)
+ } else if (flags.userEmail && flags.userPassword) {
+ await api.login(flags.userEmail, flags.userPassword)
+ }
+
+ const response = await api.client.request(readMe())
+ ux.log(`-- Logged in as ${response.first_name} ${response.last_name}`)
+ } catch {
+ catchError('-- Unable to authenticate with the provided credentials. Please check your credentials.', {
+ fatal: true,
+ })
+ }
+}
+
+/**
+ * Validate the authentication flags
+ * @param flags - The AuthFlags
+ */
+
+export function validateAuthFlags(flags: AuthFlags): void {
+ if (!flags.directusUrl) {
+ ux.error('Directus URL is required.')
+ }
+
+ if (!flags.directusToken && (!flags.userEmail || !flags.userPassword)) {
+ ux.error('Either Directus token or email and password are required.')
+ }
+}
diff --git a/packages/directus-template-cli/src/lib/utils/catch-error.ts b/packages/directus-template-cli/src/lib/utils/catch-error.ts
new file mode 100644
index 0000000..2022cc9
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/utils/catch-error.ts
@@ -0,0 +1,54 @@
+import {ux} from '@oclif/core'
+
+import {DirectusError} from '../sdk'
+import {logger} from '../utils/logger'
+
+/**
+ * Options for configuring the error handler behavior.
+ */
+interface ErrorHandlerOptions {
+ /** Additional context to be included in the error log. */
+ context?: Record
+ /** If true, the error will be treated as fatal and the process will exit. */
+ fatal?: boolean
+ /** If true, the error will be logged to a file. */
+ logToFile?: boolean
+}
+
+/**
+ * Handles errors by formatting them and optionally logging to console and file.
+ * @param error - The error to be handled.
+ * @param options - Configuration options for error handling.
+ * @returns void
+ */
+export default function catchError(error: unknown, options: ErrorHandlerOptions = {}): void {
+ const {context = {}, fatal = false, logToFile = true} = options
+
+ let errorMessage: string
+
+ if (error instanceof DirectusError) {
+ errorMessage = error.message
+ } else if (error instanceof Error) {
+ errorMessage = `Error: ${error.message}`
+ } else {
+ errorMessage = `Unknown error: ${JSON.stringify(error)}`
+ }
+
+ // Format the error message with context if provided
+ const formattedMessage = [
+ errorMessage,
+ Object.keys(context).length > 0 && `Context: ${JSON.stringify(context)}`,
+ ].filter(Boolean).join('\n')
+
+ // Log the error message to the console with the appropriate color
+ if (fatal) {
+ // ux.error exits the process with a non-zero code
+ ux.error(formattedMessage)
+ } else {
+ ux.warn(formattedMessage)
+ }
+
+ if (logToFile) {
+ logger.log('error', errorMessage, context)
+ }
+}
diff --git a/packages/directus-template-cli/src/lib/utils/check-template.ts b/packages/directus-template-cli/src/lib/utils/check-template.ts
new file mode 100644
index 0000000..07c493e
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/utils/check-template.ts
@@ -0,0 +1,16 @@
+import path from 'node:path'
+
+import readFile from '../utils/read-file'
+
+export default async function checkTemplate(dir: string) {
+ // Check for the collections,fields, and relations files
+ try {
+ const collections = readFile('collections', dir)
+ const fields = readFile('fields', dir)
+
+ const isCollectionsOk = collections.length > 0 && fields.length > 0
+ return isCollectionsOk
+ } catch (error) {
+ console.error(error)
+ }
+}
diff --git a/packages/directus-template-cli/src/lib/utils/chunk-array.ts b/packages/directus-template-cli/src/lib/utils/chunk-array.ts
new file mode 100644
index 0000000..15cb5a0
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/utils/chunk-array.ts
@@ -0,0 +1,5 @@
+export function chunkArray(array: T[], size: number): T[][] {
+ return Array.from({length: Math.ceil(array.length / size)}, (_, index) =>
+ array.slice(index * size, (index + 1) * size),
+ )
+}
diff --git a/packages/directus-template-cli/src/lib/utils/filter-fields.ts b/packages/directus-template-cli/src/lib/utils/filter-fields.ts
new file mode 100644
index 0000000..bfd6bb1
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/utils/filter-fields.ts
@@ -0,0 +1,23 @@
+// Utility function to remove relationship data (arrays of integers or UUIDs) from system collection data. Used for when custom fields are added to system collections. The relational data should be populated when the actual data is loaded.
+export default function filterFields(dataArray, systemFields) {
+ return dataArray.map(item => {
+ for (const key of Object.keys(item)) {
+ if (!systemFields.includes(key)) {
+ const value = item[key]
+ if (Array.isArray(value)) {
+ const isArrayOfIntegers = value.every(v => Number.isInteger(v))
+ const isArrayOfUUIDs = value.every(
+ v =>
+ typeof v === 'string'
+ && /[\dA-Fa-f]{8}(?:-[\dA-Fa-f]{4}){3}-[\dA-Fa-f]{12}/.test(v),
+ )
+ if (isArrayOfIntegers || isArrayOfUUIDs) {
+ item[key] = null // or item[key] = [];
+ }
+ }
+ }
+ }
+
+ return item
+ })
+}
diff --git a/packages/directus-template-cli/src/lib/utils/get-role-ids.ts b/packages/directus-template-cli/src/lib/utils/get-role-ids.ts
new file mode 100644
index 0000000..24cfcd6
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/utils/get-role-ids.ts
@@ -0,0 +1,19 @@
+import type {Role} from '@directus/types'
+
+import {readMe} from '@directus/sdk'
+
+import {api} from '../sdk'
+import readFile from './read-file'
+
+export default async function getRoleIds(dir: string) {
+ const roles = readFile('roles', dir) as Role[]
+
+ // Legacy admin role may be undefined if the admin role was renamed in the source Directus project.
+ const legacyAdminRoleId: string | undefined = roles.find(role => role.name === 'Administrator')?.id
+
+ const currentUser = await api.client.request(readMe())
+
+ const newAdminRoleId = currentUser.role as string
+
+ return {email: currentUser.email, legacyAdminRoleId, newAdminRoleId}
+}
diff --git a/packages/directus-template-cli/src/lib/utils/get-template.ts b/packages/directus-template-cli/src/lib/utils/get-template.ts
new file mode 100644
index 0000000..af6c242
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/utils/get-template.ts
@@ -0,0 +1,118 @@
+import {downloadTemplate} from 'giget'
+import fs from 'node:fs'
+import path from 'node:path'
+
+import resolvePathAndCheckExistence from './path'
+import {readAllTemplates, readTemplate} from './read-templates'
+import {transformGitHubUrl} from './transform-github-url'
+
+interface Template {
+ directoryPath: string;
+ templateName: string;
+}
+
+export async function getCommunityTemplates(): Promise {
+ const downloadDir = resolvePathAndCheckExistence(path.join(__dirname, '..', 'downloads', 'official'), false)
+
+ if (!downloadDir) {
+ throw new Error(`Invalid download directory: ${path.join(__dirname, '..', 'downloads', 'official')}`)
+ }
+
+ try {
+ const {dir} = await downloadTemplate('github:directus-labs/directus-templates', {
+ dir: downloadDir,
+ force: true,
+ })
+
+ return await readAllTemplates(dir)
+ } catch (error) {
+ throw new Error(`Failed to download community templates: ${error}`)
+ }
+}
+
+export async function getLocalTemplate(localTemplateDir: string): Promise {
+ const resolvedDir = resolvePathAndCheckExistence(localTemplateDir)
+
+ if (!resolvedDir) {
+ throw new Error('Directory does not exist.')
+ }
+
+ return readTemplate(resolvedDir)
+}
+
+export async function getInteractiveLocalTemplate(localTemplateDir: string): Promise {
+ const resolvedDir = resolvePathAndCheckExistence(localTemplateDir)
+
+ if (!resolvedDir) {
+ throw new Error('Directory does not exist.')
+ }
+
+ const directTemplate = await readTemplate(resolvedDir)
+ if (directTemplate) {
+ return [directTemplate]
+ }
+
+ const templates = await readAllTemplates(resolvedDir)
+
+ if (templates.length === 0) {
+ // If no templates found, search nested directories
+ const nestedTemplates = await findNestedTemplates(resolvedDir, 2)
+
+ if (nestedTemplates.length === 0) {
+ throw new Error('No valid templates found in the specified directory or its subdirectories.')
+ }
+
+ return nestedTemplates
+ }
+
+ return templates
+}
+
+async function findNestedTemplates(dir: string, depth: number): Promise {
+ if (depth === 0) return []
+
+ const templates: Template[] = []
+ const entries = await fs.promises.readdir(dir, {withFileTypes: true})
+
+ for (const entry of entries) {
+ if (entry.isDirectory()) {
+ const fullPath = path.join(dir, entry.name)
+ const dirTemplates = await readAllTemplates(fullPath)
+ templates.push(...dirTemplates)
+
+ if (dirTemplates.length === 0 && depth > 1) {
+ // If no templates found and we can go deeper, search subdirectories
+ const nestedTemplates = await findNestedTemplates(fullPath, depth - 1)
+ templates.push(...nestedTemplates)
+ }
+ }
+ }
+
+ return templates
+}
+
+export async function getGithubTemplate(ghTemplateUrl: string): Promise {
+ try {
+ const ghString = await transformGitHubUrl(ghTemplateUrl)
+ const downloadDir = resolvePathAndCheckExistence(path.join(__dirname, '..', 'downloads', 'github'), false)
+
+ if (!downloadDir) {
+ throw new Error(`Invalid download directory: ${path.join(__dirname, '..', 'downloads', 'github')}`)
+ }
+
+ const {dir} = await downloadTemplate(ghString, {
+ dir: downloadDir,
+ force: true,
+ forceClean: true,
+ })
+
+ const resolvedDir = resolvePathAndCheckExistence(dir)
+ if (!resolvedDir) {
+ throw new Error(`Downloaded template directory does not exist: ${dir}`)
+ }
+
+ return readTemplate(resolvedDir)
+ } catch (error) {
+ throw new Error(`Failed to download GitHub template: ${error}`)
+ }
+}
diff --git a/packages/directus-template-cli/src/lib/utils/logger.ts b/packages/directus-template-cli/src/lib/utils/logger.ts
new file mode 100644
index 0000000..3e3ac22
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/utils/logger.ts
@@ -0,0 +1,68 @@
+import fs from 'node:fs'
+import path from 'node:path'
+
+class Logger {
+ private static instance: Logger
+ private logFilePath: string
+
+ private constructor() {
+ this.initializeLogFile()
+ }
+
+ public static getInstance(): Logger {
+ if (!Logger.instance) {
+ Logger.instance = new Logger()
+ }
+
+ return Logger.instance
+ }
+
+ public log(level: 'error' | 'info' | 'warn', message: string, context?: Record): void {
+ const timestamp = new Date().toISOString()
+ const contextString = context ? JSON.stringify(this.sanitize(context)) : ''
+ const logEntry = `${timestamp} - ${level.toUpperCase()}: ${message}${contextString ? ` Context: ${contextString}` : ''}\n`
+
+ this.writeToFile(logEntry)
+ }
+
+ private initializeLogFile(): void {
+ // @ts-ignore
+ const timestamp = new Date().toISOString().replaceAll(/[.:]/g, '-')
+ const logDir = path.join(process.cwd(), '.directus-template-cli', 'logs')
+ if (!fs.existsSync(logDir)) {
+ fs.mkdirSync(logDir, {recursive: true})
+ }
+
+ this.logFilePath = path.join(logDir, `run-${timestamp}.log`)
+
+ // Write initial timestamp to the log file
+ this.writeToFile(`Log started at ${timestamp}\n`)
+ }
+
+ private sanitize(obj: Record): Record {
+ const sensitiveFields = new Set(['password', 'token', 'secret', 'key', 'authorization', 'email', 'access_token', 'refresh_token'])
+ return Object.fromEntries(
+ Object.entries(obj).map(([key, value]) => {
+ if (sensitiveFields.has(key.toLowerCase())) {
+ return [key, '********']
+ }
+
+ if (typeof value === 'object' && value !== null) {
+ return [key, this.sanitize(value)]
+ }
+
+ return [key, value]
+ }),
+ )
+ }
+
+ private writeToFile(message: string): void {
+ try {
+ fs.appendFileSync(this.logFilePath, message)
+ } catch (error) {
+ console.error('Error writing to log file:', error)
+ }
+ }
+}
+
+export const logger = Logger.getInstance()
diff --git a/packages/directus-template-cli/src/lib/utils/open-url.ts b/packages/directus-template-cli/src/lib/utils/open-url.ts
new file mode 100644
index 0000000..6e38b34
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/utils/open-url.ts
@@ -0,0 +1,19 @@
+import {exec} from 'node:child_process'
+
+export default function openUrl(url: string): void {
+ switch (process.platform) {
+ case 'darwin': {
+ exec(`open ${url}`)
+ break
+ }
+
+ case 'win32': {
+ exec(`start ${url}`)
+ break
+ }
+
+ default: {
+ exec(`xdg-open ${url}`)
+ }
+ }
+}
diff --git a/packages/directus-template-cli/src/lib/utils/path.ts b/packages/directus-template-cli/src/lib/utils/path.ts
new file mode 100644
index 0000000..9649e31
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/utils/path.ts
@@ -0,0 +1,19 @@
+import fs from 'node:fs'
+import path from 'node:path'
+import {cwd} from 'node:process'
+
+/**
+ * Resolves a given path to an absolute path and checks if it exists.
+ * @param inputPath The path to resolve.
+ * @param checkExistence Whether to check if the resolved path exists.
+ * @returns The resolved absolute path if it exists, or null if it doesn't.
+ */
+export default function resolvePathAndCheckExistence(inputPath: string, checkExistence: boolean = true): null | string {
+ const resolvedPath = path.isAbsolute(inputPath) ? inputPath : path.resolve(cwd(), inputPath)
+
+ if (!checkExistence || fs.existsSync(resolvedPath)) {
+ return resolvedPath
+ }
+
+ return null
+}
diff --git a/packages/directus-template-cli/src/lib/utils/protected-domains.ts b/packages/directus-template-cli/src/lib/utils/protected-domains.ts
new file mode 100644
index 0000000..56b5dfa
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/utils/protected-domains.ts
@@ -0,0 +1,3 @@
+export const protectedDomains = [
+ 'directus.pizza',
+]
diff --git a/packages/directus-template-cli/src/lib/utils/read-file.ts b/packages/directus-template-cli/src/lib/utils/read-file.ts
new file mode 100644
index 0000000..103ff0e
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/utils/read-file.ts
@@ -0,0 +1,15 @@
+import fs from 'node:fs'
+import path from 'node:path'
+
+import catchError from './catch-error'
+
+export default function readFile(file: string, dir: string): any[] {
+ const filePath = path.join(dir, `${file}.json`) // Use path.join for proper path resolution
+ if (!fs.existsSync(filePath)) {
+ catchError(`File not found: ${filePath}`)
+ }
+
+ const fileContents = fs.readFileSync(filePath, 'utf8')
+ const obj = JSON.parse(fileContents)
+ return obj
+}
diff --git a/packages/directus-template-cli/src/lib/utils/read-templates.ts b/packages/directus-template-cli/src/lib/utils/read-templates.ts
new file mode 100644
index 0000000..0629cba
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/utils/read-templates.ts
@@ -0,0 +1,54 @@
+import fs from 'node:fs'
+import path from 'node:path'
+
+interface Template {
+ directoryPath: string;
+ templateName: string;
+}
+
+export async function readTemplate(
+ directoryPath: string,
+): Promise {
+ const packageFilePath = path.join(directoryPath, 'package.json')
+
+ try {
+ const packageData = await fs.promises.readFile(packageFilePath, 'utf8')
+ const packageJson: { templateName?: string } = JSON.parse(packageData)
+
+ if (packageJson.templateName) {
+ return {
+ directoryPath,
+ templateName: packageJson.templateName,
+ }
+ }
+
+ return null
+ } catch {
+ // console.error(
+ // `Failed to read package.json file in directory ${directoryPath}: ${error}`,
+ // )
+ return null
+ }
+}
+
+export async function readAllTemplates(
+ directoryPath: string,
+): Promise {
+ const templates: Template[] = []
+
+ const files = await fs.promises.readdir(directoryPath)
+
+ for (const file of files) {
+ const filePath = path.join(directoryPath, file)
+ const stats = await fs.promises.stat(filePath)
+
+ if (stats.isDirectory()) {
+ const template = await readTemplate(filePath)
+ if (template) {
+ templates.push(template)
+ }
+ }
+ }
+
+ return templates
+}
diff --git a/packages/directus-template-cli/src/lib/utils/system-fields.ts b/packages/directus-template-cli/src/lib/utils/system-fields.ts
new file mode 100644
index 0000000..bbd5409
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/utils/system-fields.ts
@@ -0,0 +1,165 @@
+export const directusUserFields = [
+ 'id',
+ 'status',
+ 'first_name',
+ 'last_name',
+ 'email',
+ 'password',
+ 'token',
+ 'last_access',
+ 'last_page',
+ 'external_identifier',
+ 'tfa_secret',
+ 'auth_data',
+ 'provider',
+ 'theme',
+ 'role',
+ 'language',
+ 'avatar',
+ 'title',
+ 'description',
+ 'location',
+ 'tags',
+ 'email_notifications',
+]
+
+export const directusRoleFields = [
+ 'id',
+ 'name',
+ 'description',
+ 'icon',
+ 'enforce_tfa',
+ 'external_id',
+ 'ip_whitelist',
+ 'app_access',
+ 'admin_access',
+]
+
+export const directusFileFields = [
+ 'id',
+ 'storage',
+ 'filename_disk',
+ 'filename_download',
+ 'title',
+ 'type',
+ 'folder',
+ 'uploaded_by',
+ 'uploaded_on',
+ 'modified_by',
+ 'modified_on',
+ 'charset',
+ 'filesize',
+ 'width',
+ 'height',
+ 'duration',
+ 'embed',
+ 'description',
+ 'location',
+ 'tags',
+ 'metadata',
+]
+
+export const directusFolderFields = [
+ 'id',
+ 'name',
+ 'parent',
+]
+
+export const directusFlowFields = [
+ 'id',
+ 'name',
+ 'icon',
+ 'color',
+ 'description',
+ 'status',
+ 'trigger',
+ 'accountability',
+ 'options',
+ 'operation',
+ 'date_created',
+ 'user_created',
+]
+
+export const directusOperationFields = [
+ 'id',
+ 'name',
+ 'key',
+ 'type',
+ 'position_x',
+ 'position_y',
+ 'options',
+ 'resolve',
+ 'reject',
+ 'flow',
+ 'date_created',
+ 'user_created',
+]
+
+export const directusDashboardFields = [
+ 'id',
+ 'name',
+ 'icon',
+ 'note',
+ 'date_created',
+ 'user_created',
+ 'color',
+]
+
+export const directusPanelFields = [
+ 'id',
+ 'dashboard',
+ 'name',
+ 'icon',
+ 'color',
+ 'show_header',
+ 'note',
+ 'type',
+ 'position_x',
+ 'position_y',
+ 'width',
+ 'height',
+ 'options',
+ 'date_created',
+ 'user_created',
+]
+
+export const directusSettingsFields = [
+ 'id',
+ 'project_name',
+ 'project_url',
+ 'project_color',
+ 'project_logo',
+ 'public_foreground',
+ 'public_background',
+ 'public_note',
+ 'auth_login_attempts',
+ 'auth_password_policy',
+ 'storage_asset_transform',
+ 'storage_asset_presets',
+ 'custom_css',
+ 'storage_default_folder',
+ 'basemaps',
+ 'mapbox_key',
+ 'module_bar',
+ 'project_descriptor',
+ 'default_language',
+ 'custom_aspect_ratios',
+ 'public_favicon',
+ 'default_appearance',
+ 'default_theme_light',
+ 'theme_light_overrides',
+ 'default_theme_dark',
+ 'theme_dark_overrides',
+]
+
+export const systemFields = {
+ directus_dashboards: directusDashboardFields,
+ directus_files: directusFileFields,
+ directus_flows: directusFlowFields,
+ directus_folders: directusFolderFields,
+ directus_operations: directusOperationFields,
+ directus_panels: directusPanelFields,
+ directus_roles: directusRoleFields,
+ directus_settings: directusSettingsFields,
+ directus_users: directusUserFields,
+}
diff --git a/packages/directus-template-cli/src/lib/utils/template-defaults.ts b/packages/directus-template-cli/src/lib/utils/template-defaults.ts
new file mode 100644
index 0000000..24f9f37
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/utils/template-defaults.ts
@@ -0,0 +1,36 @@
+import slugify from 'slugify'
+
+export const generatePackageJsonContent = (templateName: string) => {
+ const slugifiedName = slugify(templateName, {
+ lower: true, // Convert to lowercase
+ strict: true, // Remove special characters
+ })
+
+ const packageName = `directus-template-${slugifiedName}`
+
+ return JSON.stringify(
+ {
+ author: '',
+ description: '',
+ directusTemplate: true,
+ files: ['src'],
+ name: packageName,
+ templateName,
+ version: '1.0.0',
+ },
+ null,
+ 2,
+ )
+}
+
+export const generateReadmeContent = (templateName: string) => `# ${templateName} Template
+
+This is a template for [Directus](https://directus.io/) - an open-source headless CMS and API. Use the template-cli to load / apply this template to a blank instance.
+
+## Why
+
+## What
+
+## License
+
+`
diff --git a/packages/directus-template-cli/src/lib/utils/transform-github-url.ts b/packages/directus-template-cli/src/lib/utils/transform-github-url.ts
new file mode 100644
index 0000000..afc7cc3
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/utils/transform-github-url.ts
@@ -0,0 +1,13 @@
+export function transformGitHubUrl(url: string): string {
+ // Regular expression to capture the repository name and any subsequent path after the 'tree'
+ const regex = /github\.com\/([^/]+\/[^/]+)(?:\/tree\/[^/]+\/(.*))?$/
+ const match = url.match(regex)
+
+ if (match) {
+ const repo = match[1]
+ const subpath = match[2] ? match[2] : ''
+ return `github:${repo}/${subpath}`
+ }
+
+ return 'Invalid URL'
+}
diff --git a/packages/directus-template-cli/src/lib/utils/validate-url.ts b/packages/directus-template-cli/src/lib/utils/validate-url.ts
new file mode 100644
index 0000000..a566a1e
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/utils/validate-url.ts
@@ -0,0 +1,10 @@
+import {protectedDomains} from './protected-domains'
+
+export default function validateUrl(url: string): boolean {
+ try {
+ const parsedUrl = new URL(url)
+ return !protectedDomains.includes(parsedUrl.hostname)
+ } catch {
+ return false
+ }
+}
diff --git a/packages/directus-template-cli/src/lib/utils/write-to-file.ts b/packages/directus-template-cli/src/lib/utils/write-to-file.ts
new file mode 100644
index 0000000..57087b0
--- /dev/null
+++ b/packages/directus-template-cli/src/lib/utils/write-to-file.ts
@@ -0,0 +1,27 @@
+import fs from 'node:fs'
+import path from 'node:path'
+
+export default async (fileName: string, data: any, dir: string) => {
+ const folders = fileName.split('/')
+ const endFileName = folders.pop()
+ const folderPath = folders.join('/')
+
+ // Generate the full path where you want to write the file
+ const fullPath = path.join(dir, folderPath)
+
+ // Check if the directory exists. Create if it doesn't.
+ if (!fs.existsSync(fullPath)) {
+ fs.mkdirSync(fullPath, {recursive: true})
+ }
+
+ // Construct the full file path
+ const fullFilePath = path.join(fullPath, `${endFileName}.json`)
+
+ try {
+ // Write the file
+ await fs.promises.writeFile(fullFilePath, JSON.stringify(data, null, 2))
+ // console.log(`Wrote ${fullFilePath}`);
+ } catch (error) {
+ console.log('Error writing to file', error.data.errors)
+ }
+}
diff --git a/packages/directus-template-cli/test/commands/apply.test.ts b/packages/directus-template-cli/test/commands/apply.test.ts
new file mode 100644
index 0000000..2f5f457
--- /dev/null
+++ b/packages/directus-template-cli/test/commands/apply.test.ts
@@ -0,0 +1,17 @@
+import {expect, test} from '@oclif/test'
+
+describe('apply', () => {
+ // test
+ // .stdout()
+ // .command(['apply'])
+ // .it('runs hello', ctx => {
+ // expect(ctx.stdout).to.contain('hello world')
+ // })
+
+ // test
+ // .stdout()
+ // .command(['apply', '--name', 'jeff'])
+ // .it('runs hello --name jeff', ctx => {
+ // expect(ctx.stdout).to.contain('hello jeff')
+ // })
+})
diff --git a/packages/directus-template-cli/test/helpers/init.js b/packages/directus-template-cli/test/helpers/init.js
new file mode 100644
index 0000000..338e715
--- /dev/null
+++ b/packages/directus-template-cli/test/helpers/init.js
@@ -0,0 +1,6 @@
+const path = require('path')
+process.env.TS_NODE_PROJECT = path.resolve('test/tsconfig.json')
+process.env.NODE_ENV = 'development'
+
+global.oclif = global.oclif || {}
+global.oclif.columns = 80
diff --git a/packages/directus-template-cli/test/tsconfig.json b/packages/directus-template-cli/test/tsconfig.json
new file mode 100644
index 0000000..95898fc
--- /dev/null
+++ b/packages/directus-template-cli/test/tsconfig.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../tsconfig",
+ "compilerOptions": {
+ "noEmit": true
+ },
+ "references": [
+ {"path": ".."}
+ ]
+}
diff --git a/packages/directus-template-cli/tsconfig.json b/packages/directus-template-cli/tsconfig.json
new file mode 100644
index 0000000..c247f1a
--- /dev/null
+++ b/packages/directus-template-cli/tsconfig.json
@@ -0,0 +1,17 @@
+{
+ "compilerOptions": {
+ "declaration": true,
+ "importHelpers": true,
+ "module": "commonjs",
+ "outDir": "dist",
+ "rootDir": "src",
+ "strict": false,
+ "target": "es2019",
+ "esModuleInterop": true,
+ "moduleResolution": "node",
+ "allowSyntheticDefaultImports": true
+
+ },
+ "include": [
+ "src/**/*" ]
+}
diff --git a/.gitignore b/templates/.gitignore
similarity index 76%
rename from .gitignore
rename to templates/.gitignore
index 441553a..d7a1b2f 100644
--- a/.gitignore
+++ b/templates/.gitignore
@@ -1,4 +1,3 @@
node_modules
*.log*
.DS_Store
-directus
diff --git a/templates/README.md b/templates/README.md
new file mode 100644
index 0000000..2f40f3b
--- /dev/null
+++ b/templates/README.md
@@ -0,0 +1,128 @@
+
+
+ Directus Templates
+
+
+Community maintained Directus instance templates to help you jump start your next project. Apply and extract templates with directus-template-cli .
+
+
+
+ Introduction ·
+ 🚧 Using Templates ·
+ ❤️ Contributing
+
+
+
+
+# 🚀 Introduction
+
+## What is a Directus "Template"?
+A Directus template is a starter kit or boilerplate for a Directus project. But it could be a full blown application – like [AgencyOS](https://github.com/directus-community/agency-os).
+
+Templates are extracted and applied using the [`directus-template-cli`](https://github.com/directus-community/directus-template-cli) command line utility.
+
+- They're examples of what you can build with Directus
+- They're starting points for your next client project
+- They're going to save you a boatload of time
+
+## What's Included in a Template?
+
+**Schema / Data Model**
+- Schema Snapshot
+- Collections
+- Fields
+- Relations
+
+**Users and Authentication**
+- Users
+- Roles
+- Permissions
+- Presets
+
+**Flows**
+- Flows
+- Operations
+
+**Dashboards**
+- Dashboards
+- Panels
+
+**Assets**
+- Folders
+- Files
+- Actual Files for Assets
+
+**Sample Content / Data**
+- Translations
+- Content
+
+---
+
+
+# **🚧 Using Templates**
+
+To load or use templates you need a Directus instance. Here's a few ways to go about that.
+
+### 1a - Register for a Directus Cloud account
+
+https://directus.cloud/register
+
+This is the easy button. You don’t have to mess with Docker or working out how to deploy a Directus instance at AWS,
+Digital Ocean, or similar hosts. A couple of clicks and in less than 2 minutes you’ll have a ready to go Directus
+project.
+
+OR
+
+### 1b - Self Host a Directus Instance
+
+If you're prefer to self-host Directus, we highly recommend you do so with Docker. We have several guides on the [Directus docs](https://docs.directus.io/self-hosted/docker-guide.html).
+
+**Important Note**: We (the Directus team) cannot provide support for
+self-hosted instances WITHOUT an Enterprise Self-Hosted license or formal support agreement.
+[Learn more and contact our team for details on Enterprise Self-Hosted](https://directus.io/pricing/self-hosted).
+
+
+[PostgreSQL](https://www.postgresql.org/) is the **tested and preferred** database vendor for templates.
+
+
+### 2 **- Generate a static token for the admin user**
+
+You need the static token to seed the project.
+
+1. Go to the User Directory
+2. Choose the Administrative User
+3. Scroll down to the Token field
+4. Generate token and copy it
+5. Save the user (do NOT forget to save because you’ll get an error that shows Invalid token!)
+
+### 3 **- Apply the Template**
+
+Open your terminal, run the following command, and simply follow the prompts.
+
+`npx directus-template-cli@latest apply`
+
+You can load apply templates from three sources.
+
+- Official Templates (maintained in this repo)
+- Local directory (files on your local computer)
+- GitHub repository (public only)
+
+You can learn more about the
+[Directus Template CLI tool here](https://github.com/directus-community/directus-template-cli).
+
+_Note_: It can take a
+few minutes for the template script to run if you’re using a remotely hosted Directus instance.
+
+# ❤️ Contributing
+
+This is community driven project so we'd love to have your contributions.
+
+You can extract your own templates using:
+
+`npx directus-template-cli@latest extract`
+
+Here's how you can contribute:
+- [Make a pull request](https://github.com/directus-community/directus-templates/pulls) to add your own template.
+
+## 🙏 Thanks To
+Big shout out to [Alex van der Valk (AVDV)](https://github.com/alexvdvalk) for his contributions to this project.
diff --git a/agencyos/README.md b/templates/agencyos/directus/template/README.md
similarity index 100%
rename from agencyos/README.md
rename to templates/agencyos/directus/template/README.md
diff --git a/agencyos/package.json b/templates/agencyos/directus/template/package.json
similarity index 100%
rename from agencyos/package.json
rename to templates/agencyos/directus/template/package.json
diff --git a/agencyos/src/access.json b/templates/agencyos/directus/template/src/access.json
similarity index 100%
rename from agencyos/src/access.json
rename to templates/agencyos/directus/template/src/access.json
diff --git a/agencyos/src/assets/08177527-b867-47e9-b5d5-eab146b3cdba.jpg b/templates/agencyos/directus/template/src/assets/08177527-b867-47e9-b5d5-eab146b3cdba.jpg
similarity index 100%
rename from agencyos/src/assets/08177527-b867-47e9-b5d5-eab146b3cdba.jpg
rename to templates/agencyos/directus/template/src/assets/08177527-b867-47e9-b5d5-eab146b3cdba.jpg
diff --git a/agencyos/src/assets/08242513-ca8f-471f-b69b-82703a19d1e5.svg b/templates/agencyos/directus/template/src/assets/08242513-ca8f-471f-b69b-82703a19d1e5.svg
similarity index 100%
rename from agencyos/src/assets/08242513-ca8f-471f-b69b-82703a19d1e5.svg
rename to templates/agencyos/directus/template/src/assets/08242513-ca8f-471f-b69b-82703a19d1e5.svg
diff --git a/agencyos/src/assets/0dfe66dd-ceba-4dca-8907-03b2dda49443.svg b/templates/agencyos/directus/template/src/assets/0dfe66dd-ceba-4dca-8907-03b2dda49443.svg
similarity index 100%
rename from agencyos/src/assets/0dfe66dd-ceba-4dca-8907-03b2dda49443.svg
rename to templates/agencyos/directus/template/src/assets/0dfe66dd-ceba-4dca-8907-03b2dda49443.svg
diff --git a/agencyos/src/assets/12e02b82-b4a4-4aaf-8ca4-e73c20a41c26.jpeg b/templates/agencyos/directus/template/src/assets/12e02b82-b4a4-4aaf-8ca4-e73c20a41c26.jpeg
similarity index 100%
rename from agencyos/src/assets/12e02b82-b4a4-4aaf-8ca4-e73c20a41c26.jpeg
rename to templates/agencyos/directus/template/src/assets/12e02b82-b4a4-4aaf-8ca4-e73c20a41c26.jpeg
diff --git a/agencyos/src/assets/1f19dd72-a433-481d-9b51-e3cc8e4f33d3.svg b/templates/agencyos/directus/template/src/assets/1f19dd72-a433-481d-9b51-e3cc8e4f33d3.svg
similarity index 100%
rename from agencyos/src/assets/1f19dd72-a433-481d-9b51-e3cc8e4f33d3.svg
rename to templates/agencyos/directus/template/src/assets/1f19dd72-a433-481d-9b51-e3cc8e4f33d3.svg
diff --git a/agencyos/src/assets/1f69c0b8-19b7-49d7-b420-bedad577a079.png b/templates/agencyos/directus/template/src/assets/1f69c0b8-19b7-49d7-b420-bedad577a079.png
similarity index 100%
rename from agencyos/src/assets/1f69c0b8-19b7-49d7-b420-bedad577a079.png
rename to templates/agencyos/directus/template/src/assets/1f69c0b8-19b7-49d7-b420-bedad577a079.png
diff --git a/agencyos/src/assets/21e179ab-72c3-4350-b46a-fadd16f5652e.svg b/templates/agencyos/directus/template/src/assets/21e179ab-72c3-4350-b46a-fadd16f5652e.svg
similarity index 100%
rename from agencyos/src/assets/21e179ab-72c3-4350-b46a-fadd16f5652e.svg
rename to templates/agencyos/directus/template/src/assets/21e179ab-72c3-4350-b46a-fadd16f5652e.svg
diff --git a/agencyos/src/assets/270fa8d1-45a3-4fcb-87d2-27a0248f1daf.jpg b/templates/agencyos/directus/template/src/assets/270fa8d1-45a3-4fcb-87d2-27a0248f1daf.jpg
similarity index 100%
rename from agencyos/src/assets/270fa8d1-45a3-4fcb-87d2-27a0248f1daf.jpg
rename to templates/agencyos/directus/template/src/assets/270fa8d1-45a3-4fcb-87d2-27a0248f1daf.jpg
diff --git a/agencyos/src/assets/27f55be1-7ef5-47c4-87ba-ab9a060ab270.jpeg b/templates/agencyos/directus/template/src/assets/27f55be1-7ef5-47c4-87ba-ab9a060ab270.jpeg
similarity index 100%
rename from agencyos/src/assets/27f55be1-7ef5-47c4-87ba-ab9a060ab270.jpeg
rename to templates/agencyos/directus/template/src/assets/27f55be1-7ef5-47c4-87ba-ab9a060ab270.jpeg
diff --git a/agencyos/src/assets/2b4a0ba0-52c7-4e10-b191-c803d8da6a36.png b/templates/agencyos/directus/template/src/assets/2b4a0ba0-52c7-4e10-b191-c803d8da6a36.png
similarity index 100%
rename from agencyos/src/assets/2b4a0ba0-52c7-4e10-b191-c803d8da6a36.png
rename to templates/agencyos/directus/template/src/assets/2b4a0ba0-52c7-4e10-b191-c803d8da6a36.png
diff --git a/agencyos/src/assets/35a67f1b-d401-4300-a503-b8e583186f2a.svg b/templates/agencyos/directus/template/src/assets/35a67f1b-d401-4300-a503-b8e583186f2a.svg
similarity index 100%
rename from agencyos/src/assets/35a67f1b-d401-4300-a503-b8e583186f2a.svg
rename to templates/agencyos/directus/template/src/assets/35a67f1b-d401-4300-a503-b8e583186f2a.svg
diff --git a/agencyos/src/assets/3eff7dc2-445a-47c5-9503-3f600ecdb5c6.jpeg b/templates/agencyos/directus/template/src/assets/3eff7dc2-445a-47c5-9503-3f600ecdb5c6.jpeg
similarity index 100%
rename from agencyos/src/assets/3eff7dc2-445a-47c5-9503-3f600ecdb5c6.jpeg
rename to templates/agencyos/directus/template/src/assets/3eff7dc2-445a-47c5-9503-3f600ecdb5c6.jpeg
diff --git a/agencyos/src/assets/44a4e780-d59b-4fa5-9b26-1c4b447474d2.jpg b/templates/agencyos/directus/template/src/assets/44a4e780-d59b-4fa5-9b26-1c4b447474d2.jpg
similarity index 100%
rename from agencyos/src/assets/44a4e780-d59b-4fa5-9b26-1c4b447474d2.jpg
rename to templates/agencyos/directus/template/src/assets/44a4e780-d59b-4fa5-9b26-1c4b447474d2.jpg
diff --git a/agencyos/src/assets/4b31c98e-ec03-4b91-bb18-ef55dd199638.jpg b/templates/agencyos/directus/template/src/assets/4b31c98e-ec03-4b91-bb18-ef55dd199638.jpg
similarity index 100%
rename from agencyos/src/assets/4b31c98e-ec03-4b91-bb18-ef55dd199638.jpg
rename to templates/agencyos/directus/template/src/assets/4b31c98e-ec03-4b91-bb18-ef55dd199638.jpg
diff --git a/agencyos/src/assets/5419bf05-9ab2-484b-a69d-d09b18602cf1.svg b/templates/agencyos/directus/template/src/assets/5419bf05-9ab2-484b-a69d-d09b18602cf1.svg
similarity index 100%
rename from agencyos/src/assets/5419bf05-9ab2-484b-a69d-d09b18602cf1.svg
rename to templates/agencyos/directus/template/src/assets/5419bf05-9ab2-484b-a69d-d09b18602cf1.svg
diff --git a/agencyos/src/assets/5a6dfe1e-7e5b-4a5f-9f6c-983777a67c05.svg b/templates/agencyos/directus/template/src/assets/5a6dfe1e-7e5b-4a5f-9f6c-983777a67c05.svg
similarity index 100%
rename from agencyos/src/assets/5a6dfe1e-7e5b-4a5f-9f6c-983777a67c05.svg
rename to templates/agencyos/directus/template/src/assets/5a6dfe1e-7e5b-4a5f-9f6c-983777a67c05.svg
diff --git a/agencyos/src/assets/643faffb-d41d-48ad-9050-881cf495cbb6.jpg b/templates/agencyos/directus/template/src/assets/643faffb-d41d-48ad-9050-881cf495cbb6.jpg
similarity index 100%
rename from agencyos/src/assets/643faffb-d41d-48ad-9050-881cf495cbb6.jpg
rename to templates/agencyos/directus/template/src/assets/643faffb-d41d-48ad-9050-881cf495cbb6.jpg
diff --git a/agencyos/src/assets/6464e61f-455a-4b47-b623-bb12e5251dfe.jpeg b/templates/agencyos/directus/template/src/assets/6464e61f-455a-4b47-b623-bb12e5251dfe.jpeg
similarity index 100%
rename from agencyos/src/assets/6464e61f-455a-4b47-b623-bb12e5251dfe.jpeg
rename to templates/agencyos/directus/template/src/assets/6464e61f-455a-4b47-b623-bb12e5251dfe.jpeg
diff --git a/agencyos/src/assets/6789bc72-ab83-40bf-8152-d6f2bafbc2a8.png b/templates/agencyos/directus/template/src/assets/6789bc72-ab83-40bf-8152-d6f2bafbc2a8.png
similarity index 100%
rename from agencyos/src/assets/6789bc72-ab83-40bf-8152-d6f2bafbc2a8.png
rename to templates/agencyos/directus/template/src/assets/6789bc72-ab83-40bf-8152-d6f2bafbc2a8.png
diff --git a/agencyos/src/assets/68103296-6634-4d66-918a-04b09afe6621.jpeg b/templates/agencyos/directus/template/src/assets/68103296-6634-4d66-918a-04b09afe6621.jpeg
similarity index 100%
rename from agencyos/src/assets/68103296-6634-4d66-918a-04b09afe6621.jpeg
rename to templates/agencyos/directus/template/src/assets/68103296-6634-4d66-918a-04b09afe6621.jpeg
diff --git a/agencyos/src/assets/690c2042-e3ad-46f4-9cd8-095a7b3a1df7.svg b/templates/agencyos/directus/template/src/assets/690c2042-e3ad-46f4-9cd8-095a7b3a1df7.svg
similarity index 100%
rename from agencyos/src/assets/690c2042-e3ad-46f4-9cd8-095a7b3a1df7.svg
rename to templates/agencyos/directus/template/src/assets/690c2042-e3ad-46f4-9cd8-095a7b3a1df7.svg
diff --git a/agencyos/src/assets/6a1ca349-d7ab-4f43-9284-c61671e145f2.svg b/templates/agencyos/directus/template/src/assets/6a1ca349-d7ab-4f43-9284-c61671e145f2.svg
similarity index 100%
rename from agencyos/src/assets/6a1ca349-d7ab-4f43-9284-c61671e145f2.svg
rename to templates/agencyos/directus/template/src/assets/6a1ca349-d7ab-4f43-9284-c61671e145f2.svg
diff --git a/agencyos/src/assets/6dad2008-3af5-407e-827e-da5744223181.svg b/templates/agencyos/directus/template/src/assets/6dad2008-3af5-407e-827e-da5744223181.svg
similarity index 100%
rename from agencyos/src/assets/6dad2008-3af5-407e-827e-da5744223181.svg
rename to templates/agencyos/directus/template/src/assets/6dad2008-3af5-407e-827e-da5744223181.svg
diff --git a/agencyos/src/assets/6ff389c5-3ecb-4219-8f72-f10326aab421.jpg b/templates/agencyos/directus/template/src/assets/6ff389c5-3ecb-4219-8f72-f10326aab421.jpg
similarity index 100%
rename from agencyos/src/assets/6ff389c5-3ecb-4219-8f72-f10326aab421.jpg
rename to templates/agencyos/directus/template/src/assets/6ff389c5-3ecb-4219-8f72-f10326aab421.jpg
diff --git a/agencyos/src/assets/7647f4c2-9880-433a-bb8e-69b0c30ae31e.svg b/templates/agencyos/directus/template/src/assets/7647f4c2-9880-433a-bb8e-69b0c30ae31e.svg
similarity index 100%
rename from agencyos/src/assets/7647f4c2-9880-433a-bb8e-69b0c30ae31e.svg
rename to templates/agencyos/directus/template/src/assets/7647f4c2-9880-433a-bb8e-69b0c30ae31e.svg
diff --git a/agencyos/src/assets/7775c53a-6c2c-453d-8c22-8b5445121d10.jpeg b/templates/agencyos/directus/template/src/assets/7775c53a-6c2c-453d-8c22-8b5445121d10.jpeg
similarity index 100%
rename from agencyos/src/assets/7775c53a-6c2c-453d-8c22-8b5445121d10.jpeg
rename to templates/agencyos/directus/template/src/assets/7775c53a-6c2c-453d-8c22-8b5445121d10.jpeg
diff --git a/agencyos/src/assets/793e9bf7-c646-4588-8865-fe22556070ff.svg b/templates/agencyos/directus/template/src/assets/793e9bf7-c646-4588-8865-fe22556070ff.svg
similarity index 100%
rename from agencyos/src/assets/793e9bf7-c646-4588-8865-fe22556070ff.svg
rename to templates/agencyos/directus/template/src/assets/793e9bf7-c646-4588-8865-fe22556070ff.svg
diff --git a/agencyos/src/assets/87fc0e81-45e4-4c05-8e9a-8e5c759d7aae.png b/templates/agencyos/directus/template/src/assets/87fc0e81-45e4-4c05-8e9a-8e5c759d7aae.png
similarity index 100%
rename from agencyos/src/assets/87fc0e81-45e4-4c05-8e9a-8e5c759d7aae.png
rename to templates/agencyos/directus/template/src/assets/87fc0e81-45e4-4c05-8e9a-8e5c759d7aae.png
diff --git a/agencyos/src/assets/88b95737-7ff4-4a09-8523-362d42caa9f9.jpg b/templates/agencyos/directus/template/src/assets/88b95737-7ff4-4a09-8523-362d42caa9f9.jpg
similarity index 100%
rename from agencyos/src/assets/88b95737-7ff4-4a09-8523-362d42caa9f9.jpg
rename to templates/agencyos/directus/template/src/assets/88b95737-7ff4-4a09-8523-362d42caa9f9.jpg
diff --git a/agencyos/src/assets/8f748634-d77b-4985-b27e-7e1f3559881a.jpeg b/templates/agencyos/directus/template/src/assets/8f748634-d77b-4985-b27e-7e1f3559881a.jpeg
similarity index 100%
rename from agencyos/src/assets/8f748634-d77b-4985-b27e-7e1f3559881a.jpeg
rename to templates/agencyos/directus/template/src/assets/8f748634-d77b-4985-b27e-7e1f3559881a.jpeg
diff --git a/agencyos/src/assets/a104c031-6ad2-4148-ace6-052e28cfda0b.svg b/templates/agencyos/directus/template/src/assets/a104c031-6ad2-4148-ace6-052e28cfda0b.svg
similarity index 100%
rename from agencyos/src/assets/a104c031-6ad2-4148-ace6-052e28cfda0b.svg
rename to templates/agencyos/directus/template/src/assets/a104c031-6ad2-4148-ace6-052e28cfda0b.svg
diff --git a/agencyos/src/assets/ac905071-0643-4337-8f53-48ed45b1ccf2.jpg b/templates/agencyos/directus/template/src/assets/ac905071-0643-4337-8f53-48ed45b1ccf2.jpg
similarity index 100%
rename from agencyos/src/assets/ac905071-0643-4337-8f53-48ed45b1ccf2.jpg
rename to templates/agencyos/directus/template/src/assets/ac905071-0643-4337-8f53-48ed45b1ccf2.jpg
diff --git a/agencyos/src/assets/b1a3fd77-8e62-4678-9d44-333a30eec13b.jpg b/templates/agencyos/directus/template/src/assets/b1a3fd77-8e62-4678-9d44-333a30eec13b.jpg
similarity index 100%
rename from agencyos/src/assets/b1a3fd77-8e62-4678-9d44-333a30eec13b.jpg
rename to templates/agencyos/directus/template/src/assets/b1a3fd77-8e62-4678-9d44-333a30eec13b.jpg
diff --git a/agencyos/src/assets/b210ecec-860f-4057-bab9-18c044b6e129.jpg b/templates/agencyos/directus/template/src/assets/b210ecec-860f-4057-bab9-18c044b6e129.jpg
similarity index 100%
rename from agencyos/src/assets/b210ecec-860f-4057-bab9-18c044b6e129.jpg
rename to templates/agencyos/directus/template/src/assets/b210ecec-860f-4057-bab9-18c044b6e129.jpg
diff --git a/agencyos/src/assets/b9db00d9-535f-4e24-8a46-5f7e5fc65bf2.jpg b/templates/agencyos/directus/template/src/assets/b9db00d9-535f-4e24-8a46-5f7e5fc65bf2.jpg
similarity index 100%
rename from agencyos/src/assets/b9db00d9-535f-4e24-8a46-5f7e5fc65bf2.jpg
rename to templates/agencyos/directus/template/src/assets/b9db00d9-535f-4e24-8a46-5f7e5fc65bf2.jpg
diff --git a/agencyos/src/assets/c0253924-38cd-4ca0-9989-9c0a57ec076a.png b/templates/agencyos/directus/template/src/assets/c0253924-38cd-4ca0-9989-9c0a57ec076a.png
similarity index 100%
rename from agencyos/src/assets/c0253924-38cd-4ca0-9989-9c0a57ec076a.png
rename to templates/agencyos/directus/template/src/assets/c0253924-38cd-4ca0-9989-9c0a57ec076a.png
diff --git a/agencyos/src/assets/ce0b845f-f8d8-4856-b0af-1df4e3a838cc.jpg b/templates/agencyos/directus/template/src/assets/ce0b845f-f8d8-4856-b0af-1df4e3a838cc.jpg
similarity index 100%
rename from agencyos/src/assets/ce0b845f-f8d8-4856-b0af-1df4e3a838cc.jpg
rename to templates/agencyos/directus/template/src/assets/ce0b845f-f8d8-4856-b0af-1df4e3a838cc.jpg
diff --git a/agencyos/src/assets/d0130348-9ead-49d0-b8e7-871cd43921a0.svg b/templates/agencyos/directus/template/src/assets/d0130348-9ead-49d0-b8e7-871cd43921a0.svg
similarity index 100%
rename from agencyos/src/assets/d0130348-9ead-49d0-b8e7-871cd43921a0.svg
rename to templates/agencyos/directus/template/src/assets/d0130348-9ead-49d0-b8e7-871cd43921a0.svg
diff --git a/agencyos/src/assets/d4fd6edc-4cc5-48c1-8bc7-e646924bbdca.jpeg b/templates/agencyos/directus/template/src/assets/d4fd6edc-4cc5-48c1-8bc7-e646924bbdca.jpeg
similarity index 100%
rename from agencyos/src/assets/d4fd6edc-4cc5-48c1-8bc7-e646924bbdca.jpeg
rename to templates/agencyos/directus/template/src/assets/d4fd6edc-4cc5-48c1-8bc7-e646924bbdca.jpeg
diff --git a/agencyos/src/assets/d598a4c0-4e9a-44a3-a72e-49564e34a432.jpg b/templates/agencyos/directus/template/src/assets/d598a4c0-4e9a-44a3-a72e-49564e34a432.jpg
similarity index 100%
rename from agencyos/src/assets/d598a4c0-4e9a-44a3-a72e-49564e34a432.jpg
rename to templates/agencyos/directus/template/src/assets/d598a4c0-4e9a-44a3-a72e-49564e34a432.jpg
diff --git a/agencyos/src/assets/d94c9355-d89e-4229-941a-62b8525fd69a.png b/templates/agencyos/directus/template/src/assets/d94c9355-d89e-4229-941a-62b8525fd69a.png
similarity index 100%
rename from agencyos/src/assets/d94c9355-d89e-4229-941a-62b8525fd69a.png
rename to templates/agencyos/directus/template/src/assets/d94c9355-d89e-4229-941a-62b8525fd69a.png
diff --git a/agencyos/src/assets/df0745c2-b6e3-4b37-b64d-55a4eb0033ab.avif b/templates/agencyos/directus/template/src/assets/df0745c2-b6e3-4b37-b64d-55a4eb0033ab.avif
similarity index 100%
rename from agencyos/src/assets/df0745c2-b6e3-4b37-b64d-55a4eb0033ab.avif
rename to templates/agencyos/directus/template/src/assets/df0745c2-b6e3-4b37-b64d-55a4eb0033ab.avif
diff --git a/agencyos/src/assets/df979753-946b-4d93-954e-e24367388d2c.svg b/templates/agencyos/directus/template/src/assets/df979753-946b-4d93-954e-e24367388d2c.svg
similarity index 100%
rename from agencyos/src/assets/df979753-946b-4d93-954e-e24367388d2c.svg
rename to templates/agencyos/directus/template/src/assets/df979753-946b-4d93-954e-e24367388d2c.svg
diff --git a/agencyos/src/assets/dfa90758-9700-49e4-8fa2-b6cd074811b7.png b/templates/agencyos/directus/template/src/assets/dfa90758-9700-49e4-8fa2-b6cd074811b7.png
similarity index 100%
rename from agencyos/src/assets/dfa90758-9700-49e4-8fa2-b6cd074811b7.png
rename to templates/agencyos/directus/template/src/assets/dfa90758-9700-49e4-8fa2-b6cd074811b7.png
diff --git a/agencyos/src/assets/e15ca910-1567-4f15-b5a0-b802da67f228.jpg b/templates/agencyos/directus/template/src/assets/e15ca910-1567-4f15-b5a0-b802da67f228.jpg
similarity index 100%
rename from agencyos/src/assets/e15ca910-1567-4f15-b5a0-b802da67f228.jpg
rename to templates/agencyos/directus/template/src/assets/e15ca910-1567-4f15-b5a0-b802da67f228.jpg
diff --git a/agencyos/src/assets/eef7d7b1-3bf9-4647-90c1-a16c24161335.svg b/templates/agencyos/directus/template/src/assets/eef7d7b1-3bf9-4647-90c1-a16c24161335.svg
similarity index 100%
rename from agencyos/src/assets/eef7d7b1-3bf9-4647-90c1-a16c24161335.svg
rename to templates/agencyos/directus/template/src/assets/eef7d7b1-3bf9-4647-90c1-a16c24161335.svg
diff --git a/agencyos/src/assets/f1693c44-52e4-4fae-a7d2-b3153a34eb72.jpg b/templates/agencyos/directus/template/src/assets/f1693c44-52e4-4fae-a7d2-b3153a34eb72.jpg
similarity index 100%
rename from agencyos/src/assets/f1693c44-52e4-4fae-a7d2-b3153a34eb72.jpg
rename to templates/agencyos/directus/template/src/assets/f1693c44-52e4-4fae-a7d2-b3153a34eb72.jpg
diff --git a/agencyos/src/assets/f81e1a85-5a9c-41ef-9ef3-6a9349722daa.jpg b/templates/agencyos/directus/template/src/assets/f81e1a85-5a9c-41ef-9ef3-6a9349722daa.jpg
similarity index 100%
rename from agencyos/src/assets/f81e1a85-5a9c-41ef-9ef3-6a9349722daa.jpg
rename to templates/agencyos/directus/template/src/assets/f81e1a85-5a9c-41ef-9ef3-6a9349722daa.jpg
diff --git a/agencyos/src/assets/fbae19f3-8739-4048-a20f-89ebbf59b032.jpg b/templates/agencyos/directus/template/src/assets/fbae19f3-8739-4048-a20f-89ebbf59b032.jpg
similarity index 100%
rename from agencyos/src/assets/fbae19f3-8739-4048-a20f-89ebbf59b032.jpg
rename to templates/agencyos/directus/template/src/assets/fbae19f3-8739-4048-a20f-89ebbf59b032.jpg
diff --git a/agencyos/src/collections.json b/templates/agencyos/directus/template/src/collections.json
similarity index 100%
rename from agencyos/src/collections.json
rename to templates/agencyos/directus/template/src/collections.json
diff --git a/agencyos/src/content/block_button.json b/templates/agencyos/directus/template/src/content/block_button.json
similarity index 100%
rename from agencyos/src/content/block_button.json
rename to templates/agencyos/directus/template/src/content/block_button.json
diff --git a/agencyos/src/content/block_button_group.json b/templates/agencyos/directus/template/src/content/block_button_group.json
similarity index 100%
rename from agencyos/src/content/block_button_group.json
rename to templates/agencyos/directus/template/src/content/block_button_group.json
diff --git a/agencyos/src/content/block_columns.json b/templates/agencyos/directus/template/src/content/block_columns.json
similarity index 100%
rename from agencyos/src/content/block_columns.json
rename to templates/agencyos/directus/template/src/content/block_columns.json
diff --git a/agencyos/src/content/block_columns_rows.json b/templates/agencyos/directus/template/src/content/block_columns_rows.json
similarity index 100%
rename from agencyos/src/content/block_columns_rows.json
rename to templates/agencyos/directus/template/src/content/block_columns_rows.json
diff --git a/agencyos/src/content/block_cta.json b/templates/agencyos/directus/template/src/content/block_cta.json
similarity index 100%
rename from agencyos/src/content/block_cta.json
rename to templates/agencyos/directus/template/src/content/block_cta.json
diff --git a/agencyos/src/content/block_divider.json b/templates/agencyos/directus/template/src/content/block_divider.json
similarity index 100%
rename from agencyos/src/content/block_divider.json
rename to templates/agencyos/directus/template/src/content/block_divider.json
diff --git a/agencyos/src/content/block_faqs.json b/templates/agencyos/directus/template/src/content/block_faqs.json
similarity index 100%
rename from agencyos/src/content/block_faqs.json
rename to templates/agencyos/directus/template/src/content/block_faqs.json
diff --git a/agencyos/src/content/block_form.json b/templates/agencyos/directus/template/src/content/block_form.json
similarity index 100%
rename from agencyos/src/content/block_form.json
rename to templates/agencyos/directus/template/src/content/block_form.json
diff --git a/agencyos/src/content/block_gallery.json b/templates/agencyos/directus/template/src/content/block_gallery.json
similarity index 100%
rename from agencyos/src/content/block_gallery.json
rename to templates/agencyos/directus/template/src/content/block_gallery.json
diff --git a/agencyos/src/content/block_gallery_files.json b/templates/agencyos/directus/template/src/content/block_gallery_files.json
similarity index 100%
rename from agencyos/src/content/block_gallery_files.json
rename to templates/agencyos/directus/template/src/content/block_gallery_files.json
diff --git a/agencyos/src/content/block_hero.json b/templates/agencyos/directus/template/src/content/block_hero.json
similarity index 100%
rename from agencyos/src/content/block_hero.json
rename to templates/agencyos/directus/template/src/content/block_hero.json
diff --git a/agencyos/src/content/block_html.json b/templates/agencyos/directus/template/src/content/block_html.json
similarity index 100%
rename from agencyos/src/content/block_html.json
rename to templates/agencyos/directus/template/src/content/block_html.json
diff --git a/agencyos/src/content/block_logocloud.json b/templates/agencyos/directus/template/src/content/block_logocloud.json
similarity index 100%
rename from agencyos/src/content/block_logocloud.json
rename to templates/agencyos/directus/template/src/content/block_logocloud.json
diff --git a/agencyos/src/content/block_logocloud_logos.json b/templates/agencyos/directus/template/src/content/block_logocloud_logos.json
similarity index 100%
rename from agencyos/src/content/block_logocloud_logos.json
rename to templates/agencyos/directus/template/src/content/block_logocloud_logos.json
diff --git a/agencyos/src/content/block_quote.json b/templates/agencyos/directus/template/src/content/block_quote.json
similarity index 100%
rename from agencyos/src/content/block_quote.json
rename to templates/agencyos/directus/template/src/content/block_quote.json
diff --git a/agencyos/src/content/block_richtext.json b/templates/agencyos/directus/template/src/content/block_richtext.json
similarity index 100%
rename from agencyos/src/content/block_richtext.json
rename to templates/agencyos/directus/template/src/content/block_richtext.json
diff --git a/agencyos/src/content/block_step_items.json b/templates/agencyos/directus/template/src/content/block_step_items.json
similarity index 100%
rename from agencyos/src/content/block_step_items.json
rename to templates/agencyos/directus/template/src/content/block_step_items.json
diff --git a/agencyos/src/content/block_steps.json b/templates/agencyos/directus/template/src/content/block_steps.json
similarity index 100%
rename from agencyos/src/content/block_steps.json
rename to templates/agencyos/directus/template/src/content/block_steps.json
diff --git a/agencyos/src/content/block_team.json b/templates/agencyos/directus/template/src/content/block_team.json
similarity index 100%
rename from agencyos/src/content/block_team.json
rename to templates/agencyos/directus/template/src/content/block_team.json
diff --git a/agencyos/src/content/block_testimonial_slider_items.json b/templates/agencyos/directus/template/src/content/block_testimonial_slider_items.json
similarity index 100%
rename from agencyos/src/content/block_testimonial_slider_items.json
rename to templates/agencyos/directus/template/src/content/block_testimonial_slider_items.json
diff --git a/agencyos/src/content/block_testimonials.json b/templates/agencyos/directus/template/src/content/block_testimonials.json
similarity index 100%
rename from agencyos/src/content/block_testimonials.json
rename to templates/agencyos/directus/template/src/content/block_testimonials.json
diff --git a/agencyos/src/content/block_video.json b/templates/agencyos/directus/template/src/content/block_video.json
similarity index 100%
rename from agencyos/src/content/block_video.json
rename to templates/agencyos/directus/template/src/content/block_video.json
diff --git a/agencyos/src/content/categories.json b/templates/agencyos/directus/template/src/content/categories.json
similarity index 100%
rename from agencyos/src/content/categories.json
rename to templates/agencyos/directus/template/src/content/categories.json
diff --git a/agencyos/src/content/contacts.json b/templates/agencyos/directus/template/src/content/contacts.json
similarity index 100%
rename from agencyos/src/content/contacts.json
rename to templates/agencyos/directus/template/src/content/contacts.json
diff --git a/agencyos/src/content/conversations.json b/templates/agencyos/directus/template/src/content/conversations.json
similarity index 100%
rename from agencyos/src/content/conversations.json
rename to templates/agencyos/directus/template/src/content/conversations.json
diff --git a/agencyos/src/content/forms.json b/templates/agencyos/directus/template/src/content/forms.json
similarity index 100%
rename from agencyos/src/content/forms.json
rename to templates/agencyos/directus/template/src/content/forms.json
diff --git a/agencyos/src/content/globals.json b/templates/agencyos/directus/template/src/content/globals.json
similarity index 100%
rename from agencyos/src/content/globals.json
rename to templates/agencyos/directus/template/src/content/globals.json
diff --git a/agencyos/src/content/help_articles.json b/templates/agencyos/directus/template/src/content/help_articles.json
similarity index 100%
rename from agencyos/src/content/help_articles.json
rename to templates/agencyos/directus/template/src/content/help_articles.json
diff --git a/agencyos/src/content/help_collections.json b/templates/agencyos/directus/template/src/content/help_collections.json
similarity index 100%
rename from agencyos/src/content/help_collections.json
rename to templates/agencyos/directus/template/src/content/help_collections.json
diff --git a/agencyos/src/content/help_feedback.json b/templates/agencyos/directus/template/src/content/help_feedback.json
similarity index 100%
rename from agencyos/src/content/help_feedback.json
rename to templates/agencyos/directus/template/src/content/help_feedback.json
diff --git a/agencyos/src/content/inbox.json b/templates/agencyos/directus/template/src/content/inbox.json
similarity index 100%
rename from agencyos/src/content/inbox.json
rename to templates/agencyos/directus/template/src/content/inbox.json
diff --git a/agencyos/src/content/messages.json b/templates/agencyos/directus/template/src/content/messages.json
similarity index 100%
rename from agencyos/src/content/messages.json
rename to templates/agencyos/directus/template/src/content/messages.json
diff --git a/agencyos/src/content/navigation.json b/templates/agencyos/directus/template/src/content/navigation.json
similarity index 100%
rename from agencyos/src/content/navigation.json
rename to templates/agencyos/directus/template/src/content/navigation.json
diff --git a/agencyos/src/content/navigation_items.json b/templates/agencyos/directus/template/src/content/navigation_items.json
similarity index 100%
rename from agencyos/src/content/navigation_items.json
rename to templates/agencyos/directus/template/src/content/navigation_items.json
diff --git a/agencyos/src/content/organization_addresses.json b/templates/agencyos/directus/template/src/content/organization_addresses.json
similarity index 100%
rename from agencyos/src/content/organization_addresses.json
rename to templates/agencyos/directus/template/src/content/organization_addresses.json
diff --git a/agencyos/src/content/organizations.json b/templates/agencyos/directus/template/src/content/organizations.json
similarity index 100%
rename from agencyos/src/content/organizations.json
rename to templates/agencyos/directus/template/src/content/organizations.json
diff --git a/agencyos/src/content/organizations_contacts.json b/templates/agencyos/directus/template/src/content/organizations_contacts.json
similarity index 100%
rename from agencyos/src/content/organizations_contacts.json
rename to templates/agencyos/directus/template/src/content/organizations_contacts.json
diff --git a/agencyos/src/content/os_activities.json b/templates/agencyos/directus/template/src/content/os_activities.json
similarity index 100%
rename from agencyos/src/content/os_activities.json
rename to templates/agencyos/directus/template/src/content/os_activities.json
diff --git a/agencyos/src/content/os_activity_contacts.json b/templates/agencyos/directus/template/src/content/os_activity_contacts.json
similarity index 100%
rename from agencyos/src/content/os_activity_contacts.json
rename to templates/agencyos/directus/template/src/content/os_activity_contacts.json
diff --git a/agencyos/src/content/os_deal_contacts.json b/templates/agencyos/directus/template/src/content/os_deal_contacts.json
similarity index 100%
rename from agencyos/src/content/os_deal_contacts.json
rename to templates/agencyos/directus/template/src/content/os_deal_contacts.json
diff --git a/agencyos/src/content/os_deal_stages.json b/templates/agencyos/directus/template/src/content/os_deal_stages.json
similarity index 100%
rename from agencyos/src/content/os_deal_stages.json
rename to templates/agencyos/directus/template/src/content/os_deal_stages.json
diff --git a/agencyos/src/content/os_deals.json b/templates/agencyos/directus/template/src/content/os_deals.json
similarity index 100%
rename from agencyos/src/content/os_deals.json
rename to templates/agencyos/directus/template/src/content/os_deals.json
diff --git a/agencyos/src/content/os_email_templates.json b/templates/agencyos/directus/template/src/content/os_email_templates.json
similarity index 100%
rename from agencyos/src/content/os_email_templates.json
rename to templates/agencyos/directus/template/src/content/os_email_templates.json
diff --git a/agencyos/src/content/os_expenses.json b/templates/agencyos/directus/template/src/content/os_expenses.json
similarity index 100%
rename from agencyos/src/content/os_expenses.json
rename to templates/agencyos/directus/template/src/content/os_expenses.json
diff --git a/agencyos/src/content/os_invoice_items.json b/templates/agencyos/directus/template/src/content/os_invoice_items.json
similarity index 100%
rename from agencyos/src/content/os_invoice_items.json
rename to templates/agencyos/directus/template/src/content/os_invoice_items.json
diff --git a/agencyos/src/content/os_invoices.json b/templates/agencyos/directus/template/src/content/os_invoices.json
similarity index 100%
rename from agencyos/src/content/os_invoices.json
rename to templates/agencyos/directus/template/src/content/os_invoices.json
diff --git a/agencyos/src/content/os_items.json b/templates/agencyos/directus/template/src/content/os_items.json
similarity index 100%
rename from agencyos/src/content/os_items.json
rename to templates/agencyos/directus/template/src/content/os_items.json
diff --git a/agencyos/src/content/os_payment_terms.json b/templates/agencyos/directus/template/src/content/os_payment_terms.json
similarity index 100%
rename from agencyos/src/content/os_payment_terms.json
rename to templates/agencyos/directus/template/src/content/os_payment_terms.json
diff --git a/agencyos/src/content/os_payments.json b/templates/agencyos/directus/template/src/content/os_payments.json
similarity index 100%
rename from agencyos/src/content/os_payments.json
rename to templates/agencyos/directus/template/src/content/os_payments.json
diff --git a/agencyos/src/content/os_project_contacts.json b/templates/agencyos/directus/template/src/content/os_project_contacts.json
similarity index 100%
rename from agencyos/src/content/os_project_contacts.json
rename to templates/agencyos/directus/template/src/content/os_project_contacts.json
diff --git a/agencyos/src/content/os_project_files.json b/templates/agencyos/directus/template/src/content/os_project_files.json
similarity index 100%
rename from agencyos/src/content/os_project_files.json
rename to templates/agencyos/directus/template/src/content/os_project_files.json
diff --git a/agencyos/src/content/os_project_templates.json b/templates/agencyos/directus/template/src/content/os_project_templates.json
similarity index 100%
rename from agencyos/src/content/os_project_templates.json
rename to templates/agencyos/directus/template/src/content/os_project_templates.json
diff --git a/agencyos/src/content/os_project_updates.json b/templates/agencyos/directus/template/src/content/os_project_updates.json
similarity index 100%
rename from agencyos/src/content/os_project_updates.json
rename to templates/agencyos/directus/template/src/content/os_project_updates.json
diff --git a/agencyos/src/content/os_projects.json b/templates/agencyos/directus/template/src/content/os_projects.json
similarity index 100%
rename from agencyos/src/content/os_projects.json
rename to templates/agencyos/directus/template/src/content/os_projects.json
diff --git a/agencyos/src/content/os_proposal_approvals.json b/templates/agencyos/directus/template/src/content/os_proposal_approvals.json
similarity index 100%
rename from agencyos/src/content/os_proposal_approvals.json
rename to templates/agencyos/directus/template/src/content/os_proposal_approvals.json
diff --git a/agencyos/src/content/os_proposal_blocks.json b/templates/agencyos/directus/template/src/content/os_proposal_blocks.json
similarity index 100%
rename from agencyos/src/content/os_proposal_blocks.json
rename to templates/agencyos/directus/template/src/content/os_proposal_blocks.json
diff --git a/agencyos/src/content/os_proposal_contacts.json b/templates/agencyos/directus/template/src/content/os_proposal_contacts.json
similarity index 100%
rename from agencyos/src/content/os_proposal_contacts.json
rename to templates/agencyos/directus/template/src/content/os_proposal_contacts.json
diff --git a/agencyos/src/content/os_proposals.json b/templates/agencyos/directus/template/src/content/os_proposals.json
similarity index 100%
rename from agencyos/src/content/os_proposals.json
rename to templates/agencyos/directus/template/src/content/os_proposals.json
diff --git a/agencyos/src/content/os_settings.json b/templates/agencyos/directus/template/src/content/os_settings.json
similarity index 100%
rename from agencyos/src/content/os_settings.json
rename to templates/agencyos/directus/template/src/content/os_settings.json
diff --git a/agencyos/src/content/os_task_files.json b/templates/agencyos/directus/template/src/content/os_task_files.json
similarity index 100%
rename from agencyos/src/content/os_task_files.json
rename to templates/agencyos/directus/template/src/content/os_task_files.json
diff --git a/agencyos/src/content/os_tasks.json b/templates/agencyos/directus/template/src/content/os_tasks.json
similarity index 100%
rename from agencyos/src/content/os_tasks.json
rename to templates/agencyos/directus/template/src/content/os_tasks.json
diff --git a/agencyos/src/content/os_tax_rates.json b/templates/agencyos/directus/template/src/content/os_tax_rates.json
similarity index 100%
rename from agencyos/src/content/os_tax_rates.json
rename to templates/agencyos/directus/template/src/content/os_tax_rates.json
diff --git a/agencyos/src/content/page_blocks.json b/templates/agencyos/directus/template/src/content/page_blocks.json
similarity index 100%
rename from agencyos/src/content/page_blocks.json
rename to templates/agencyos/directus/template/src/content/page_blocks.json
diff --git a/agencyos/src/content/pages.json b/templates/agencyos/directus/template/src/content/pages.json
similarity index 100%
rename from agencyos/src/content/pages.json
rename to templates/agencyos/directus/template/src/content/pages.json
diff --git a/agencyos/src/content/pages_blog.json b/templates/agencyos/directus/template/src/content/pages_blog.json
similarity index 100%
rename from agencyos/src/content/pages_blog.json
rename to templates/agencyos/directus/template/src/content/pages_blog.json
diff --git a/agencyos/src/content/pages_projects.json b/templates/agencyos/directus/template/src/content/pages_projects.json
similarity index 100%
rename from agencyos/src/content/pages_projects.json
rename to templates/agencyos/directus/template/src/content/pages_projects.json
diff --git a/agencyos/src/content/post_gallery_items.json b/templates/agencyos/directus/template/src/content/post_gallery_items.json
similarity index 100%
rename from agencyos/src/content/post_gallery_items.json
rename to templates/agencyos/directus/template/src/content/post_gallery_items.json
diff --git a/agencyos/src/content/posts.json b/templates/agencyos/directus/template/src/content/posts.json
similarity index 100%
rename from agencyos/src/content/posts.json
rename to templates/agencyos/directus/template/src/content/posts.json
diff --git a/agencyos/src/content/redirects.json b/templates/agencyos/directus/template/src/content/redirects.json
similarity index 100%
rename from agencyos/src/content/redirects.json
rename to templates/agencyos/directus/template/src/content/redirects.json
diff --git a/agencyos/src/content/seo.json b/templates/agencyos/directus/template/src/content/seo.json
similarity index 100%
rename from agencyos/src/content/seo.json
rename to templates/agencyos/directus/template/src/content/seo.json
diff --git a/agencyos/src/content/team.json b/templates/agencyos/directus/template/src/content/team.json
similarity index 100%
rename from agencyos/src/content/team.json
rename to templates/agencyos/directus/template/src/content/team.json
diff --git a/agencyos/src/content/testimonials.json b/templates/agencyos/directus/template/src/content/testimonials.json
similarity index 100%
rename from agencyos/src/content/testimonials.json
rename to templates/agencyos/directus/template/src/content/testimonials.json
diff --git a/agencyos/src/dashboards.json b/templates/agencyos/directus/template/src/dashboards.json
similarity index 100%
rename from agencyos/src/dashboards.json
rename to templates/agencyos/directus/template/src/dashboards.json
diff --git a/agencyos/src/extensions.json b/templates/agencyos/directus/template/src/extensions.json
similarity index 100%
rename from agencyos/src/extensions.json
rename to templates/agencyos/directus/template/src/extensions.json
diff --git a/agencyos/src/fields.json b/templates/agencyos/directus/template/src/fields.json
similarity index 100%
rename from agencyos/src/fields.json
rename to templates/agencyos/directus/template/src/fields.json
diff --git a/agencyos/src/files.json b/templates/agencyos/directus/template/src/files.json
similarity index 100%
rename from agencyos/src/files.json
rename to templates/agencyos/directus/template/src/files.json
diff --git a/agencyos/src/flows.json b/templates/agencyos/directus/template/src/flows.json
similarity index 100%
rename from agencyos/src/flows.json
rename to templates/agencyos/directus/template/src/flows.json
diff --git a/agencyos/src/folders.json b/templates/agencyos/directus/template/src/folders.json
similarity index 100%
rename from agencyos/src/folders.json
rename to templates/agencyos/directus/template/src/folders.json
diff --git a/agencyos/src/operations.json b/templates/agencyos/directus/template/src/operations.json
similarity index 100%
rename from agencyos/src/operations.json
rename to templates/agencyos/directus/template/src/operations.json
diff --git a/agencyos/src/panels.json b/templates/agencyos/directus/template/src/panels.json
similarity index 100%
rename from agencyos/src/panels.json
rename to templates/agencyos/directus/template/src/panels.json
diff --git a/agencyos/src/permissions.json b/templates/agencyos/directus/template/src/permissions.json
similarity index 100%
rename from agencyos/src/permissions.json
rename to templates/agencyos/directus/template/src/permissions.json
diff --git a/agencyos/src/policies.json b/templates/agencyos/directus/template/src/policies.json
similarity index 100%
rename from agencyos/src/policies.json
rename to templates/agencyos/directus/template/src/policies.json
diff --git a/agencyos/src/presets.json b/templates/agencyos/directus/template/src/presets.json
similarity index 100%
rename from agencyos/src/presets.json
rename to templates/agencyos/directus/template/src/presets.json
diff --git a/agencyos/src/public-permissions.json b/templates/agencyos/directus/template/src/public-permissions.json
similarity index 100%
rename from agencyos/src/public-permissions.json
rename to templates/agencyos/directus/template/src/public-permissions.json
diff --git a/agencyos/src/relations.json b/templates/agencyos/directus/template/src/relations.json
similarity index 100%
rename from agencyos/src/relations.json
rename to templates/agencyos/directus/template/src/relations.json
diff --git a/agencyos/src/roles.json b/templates/agencyos/directus/template/src/roles.json
similarity index 100%
rename from agencyos/src/roles.json
rename to templates/agencyos/directus/template/src/roles.json
diff --git a/agencyos/src/schema/snapshot.json b/templates/agencyos/directus/template/src/schema/snapshot.json
similarity index 100%
rename from agencyos/src/schema/snapshot.json
rename to templates/agencyos/directus/template/src/schema/snapshot.json
diff --git a/agencyos/src/settings.json b/templates/agencyos/directus/template/src/settings.json
similarity index 100%
rename from agencyos/src/settings.json
rename to templates/agencyos/directus/template/src/settings.json
diff --git a/agencyos/src/translations.json b/templates/agencyos/directus/template/src/translations.json
similarity index 100%
rename from agencyos/src/translations.json
rename to templates/agencyos/directus/template/src/translations.json
diff --git a/agencyos/src/users.json b/templates/agencyos/directus/template/src/users.json
similarity index 100%
rename from agencyos/src/users.json
rename to templates/agencyos/directus/template/src/users.json
diff --git a/templates/cms/.gitignore b/templates/cms/.gitignore
new file mode 100644
index 0000000..32fe2ae
--- /dev/null
+++ b/templates/cms/.gitignore
@@ -0,0 +1,4 @@
+data/
+extensions/
+uploads/
+logs/
\ No newline at end of file
diff --git a/templates/cms/README.md b/templates/cms/README.md
new file mode 100644
index 0000000..3309c70
--- /dev/null
+++ b/templates/cms/README.md
@@ -0,0 +1,19 @@
+# Simple CMS Starter Templates
+
+Welcome to the **Simple CMS Starter Templates**! This repository contains front-end templates for building a simple CMS in different frameworks and libraries. Each subfolder represents a specific framework, offering reusable, scalable, and easy-to-implement CMS solutions.
+
+## **Templates**
+
+| Framework/Library | Status | Description |
+| ----------------- | -------------- | --------------------------------------------- |
+| **Next.js** | 🚧 In Progress | A CMS built using Next.js and its App Router. |
+| **Nuxt.js** | 🕒 Upcoming | A CMS template leveraging Nuxt.js features. |
+| **Svelte** | 🕒 Upcoming | A CMS template using the Svelte framework. |
+| **Astro** | 🕒 Upcoming | A CMS optimized for performance with Astro. |
+
+## **Folder Structure**
+
+Each subfolder contains:
+
+- **Source Code**: Framework-specific implementation of the CMS.
+- **Documentation**: Instructions on how to set up, customize, and use the template.
diff --git a/templates/cms/directus/docker-compose.yaml b/templates/cms/directus/docker-compose.yaml
new file mode 100644
index 0000000..94b63bf
--- /dev/null
+++ b/templates/cms/directus/docker-compose.yaml
@@ -0,0 +1,58 @@
+services:
+ database:
+ image: postgis/postgis:13-master
+ # Required when running on platform other than amd64, like Apple M1/M2:
+ # platform: linux/amd64
+ ports:
+ - 5432:5432
+ volumes:
+ - ./data/database:/var/lib/postgresql/data
+ environment:
+ POSTGRES_USER: "directus"
+ POSTGRES_PASSWORD: "directus"
+ POSTGRES_DB: "directus"
+
+ cache:
+ image: redis:6
+
+ directus:
+ image: directus/directus:11.3.5
+ ports:
+ - 8055:8055
+ volumes:
+ - ./uploads:/directus/uploads
+ # If you want to load extensions from the host
+ - ./extensions:/directus/extensions
+ depends_on:
+ - cache
+ - database
+ environment:
+ KEY: "255d861b-5ea1-5996-9aa3-922530ec40b1"
+ SECRET: "6116487b-cda1-52c2-b5b5-c8022c45e263"
+
+ DB_CLIENT: "pg"
+ DB_HOST: "database"
+ DB_PORT: "5432"
+ DB_DATABASE: "directus"
+ DB_USER: "directus"
+ DB_PASSWORD: "directus"
+
+ CACHE_ENABLED: "false"
+ CACHE_STORE: "redis"
+ REDIS: "redis://cache:6379"
+
+ ADMIN_EMAIL: "admin@example.com"
+ ADMIN_PASSWORD: "d1r3ctu5"
+
+ WEBSOCKETS_ENABLED: "true"
+
+ # These is helpful for local developement but should probably be removed in production
+ CORS_ENABLED: "true"
+ EXTENSIONS_AUTO_RELOAD: "true"
+ CONTENT_SECURITY_POLICY_DIRECTIVES__FRAME_SRC: '"self" https://*.youtube.com https://*.vimeo.com https://*.wistia.net https://*.loom.com'
+
+ # The default config prevents importing files from 0.0.0.0. See https://docs.directus.io/self-hosted/config-options.html#security . This can be removed in production but in local development it is recommended to keep it so you can import logos from Organization > website.
+ IMPORT_IP_DENY_LIST: ""
+ # Make sure to set this in production
+ # (see https://docs.directus.io/self-hosted/config-options#general)
+ # PUBLIC_URL: 'https://directus.example.com'
diff --git a/simple-website-cms/README.md b/templates/cms/directus/template/README.md
similarity index 100%
rename from simple-website-cms/README.md
rename to templates/cms/directus/template/README.md
diff --git a/simple-website-cms/package.json b/templates/cms/directus/template/package.json
similarity index 100%
rename from simple-website-cms/package.json
rename to templates/cms/directus/template/package.json
diff --git a/simple-website-cms/src/access.json b/templates/cms/directus/template/src/access.json
similarity index 100%
rename from simple-website-cms/src/access.json
rename to templates/cms/directus/template/src/access.json
diff --git a/simple-website-cms/src/assets/03a7d1c7-81e2-432f-9561-9df2691189c8.png b/templates/cms/directus/template/src/assets/03a7d1c7-81e2-432f-9561-9df2691189c8.png
similarity index 100%
rename from simple-website-cms/src/assets/03a7d1c7-81e2-432f-9561-9df2691189c8.png
rename to templates/cms/directus/template/src/assets/03a7d1c7-81e2-432f-9561-9df2691189c8.png
diff --git a/simple-website-cms/src/assets/12e02b82-b4a4-4aaf-8ca4-e73c20a41c26.jpeg b/templates/cms/directus/template/src/assets/12e02b82-b4a4-4aaf-8ca4-e73c20a41c26.jpeg
similarity index 100%
rename from simple-website-cms/src/assets/12e02b82-b4a4-4aaf-8ca4-e73c20a41c26.jpeg
rename to templates/cms/directus/template/src/assets/12e02b82-b4a4-4aaf-8ca4-e73c20a41c26.jpeg
diff --git a/simple-website-cms/src/assets/1d3d2bd3-ff59-4626-bef5-9d5eef6510b3.png b/templates/cms/directus/template/src/assets/1d3d2bd3-ff59-4626-bef5-9d5eef6510b3.png
similarity index 100%
rename from simple-website-cms/src/assets/1d3d2bd3-ff59-4626-bef5-9d5eef6510b3.png
rename to templates/cms/directus/template/src/assets/1d3d2bd3-ff59-4626-bef5-9d5eef6510b3.png
diff --git a/simple-website-cms/src/assets/2b4a0ba0-52c7-4e10-b191-c803d8da6a36.png b/templates/cms/directus/template/src/assets/2b4a0ba0-52c7-4e10-b191-c803d8da6a36.png
similarity index 100%
rename from simple-website-cms/src/assets/2b4a0ba0-52c7-4e10-b191-c803d8da6a36.png
rename to templates/cms/directus/template/src/assets/2b4a0ba0-52c7-4e10-b191-c803d8da6a36.png
diff --git a/simple-website-cms/src/assets/35a67f1b-d401-4300-a503-b8e583186f2a.svg b/templates/cms/directus/template/src/assets/35a67f1b-d401-4300-a503-b8e583186f2a.svg
similarity index 100%
rename from simple-website-cms/src/assets/35a67f1b-d401-4300-a503-b8e583186f2a.svg
rename to templates/cms/directus/template/src/assets/35a67f1b-d401-4300-a503-b8e583186f2a.svg
diff --git a/simple-website-cms/src/assets/3eff7dc2-445a-47c5-9503-3f600ecdb5c6.jpeg b/templates/cms/directus/template/src/assets/3eff7dc2-445a-47c5-9503-3f600ecdb5c6.jpeg
similarity index 100%
rename from simple-website-cms/src/assets/3eff7dc2-445a-47c5-9503-3f600ecdb5c6.jpeg
rename to templates/cms/directus/template/src/assets/3eff7dc2-445a-47c5-9503-3f600ecdb5c6.jpeg
diff --git a/simple-website-cms/src/assets/43ddd7b8-9b2f-4aa1-b63c-933b4ae81ca2.svg b/templates/cms/directus/template/src/assets/43ddd7b8-9b2f-4aa1-b63c-933b4ae81ca2.svg
similarity index 100%
rename from simple-website-cms/src/assets/43ddd7b8-9b2f-4aa1-b63c-933b4ae81ca2.svg
rename to templates/cms/directus/template/src/assets/43ddd7b8-9b2f-4aa1-b63c-933b4ae81ca2.svg
diff --git a/simple-website-cms/src/assets/440df429-4715-42a0-afcd-569f5cdfb145.svg b/templates/cms/directus/template/src/assets/440df429-4715-42a0-afcd-569f5cdfb145.svg
similarity index 100%
rename from simple-website-cms/src/assets/440df429-4715-42a0-afcd-569f5cdfb145.svg
rename to templates/cms/directus/template/src/assets/440df429-4715-42a0-afcd-569f5cdfb145.svg
diff --git a/simple-website-cms/src/assets/44a4e780-d59b-4fa5-9b26-1c4b447474d2.jpg b/templates/cms/directus/template/src/assets/44a4e780-d59b-4fa5-9b26-1c4b447474d2.jpg
similarity index 100%
rename from simple-website-cms/src/assets/44a4e780-d59b-4fa5-9b26-1c4b447474d2.jpg
rename to templates/cms/directus/template/src/assets/44a4e780-d59b-4fa5-9b26-1c4b447474d2.jpg
diff --git a/simple-website-cms/src/assets/50570a31-a990-453c-bdfc-0ad7175dd8bf.png b/templates/cms/directus/template/src/assets/50570a31-a990-453c-bdfc-0ad7175dd8bf.png
similarity index 100%
rename from simple-website-cms/src/assets/50570a31-a990-453c-bdfc-0ad7175dd8bf.png
rename to templates/cms/directus/template/src/assets/50570a31-a990-453c-bdfc-0ad7175dd8bf.png
diff --git a/simple-website-cms/src/assets/535f1284-dbc4-4e4e-9e50-b44a1df130bd.webp b/templates/cms/directus/template/src/assets/535f1284-dbc4-4e4e-9e50-b44a1df130bd.webp
similarity index 100%
rename from simple-website-cms/src/assets/535f1284-dbc4-4e4e-9e50-b44a1df130bd.webp
rename to templates/cms/directus/template/src/assets/535f1284-dbc4-4e4e-9e50-b44a1df130bd.webp
diff --git a/simple-website-cms/src/assets/5e93050a-6f17-4314-a7e5-f78bda425fea.png b/templates/cms/directus/template/src/assets/5e93050a-6f17-4314-a7e5-f78bda425fea.png
similarity index 100%
rename from simple-website-cms/src/assets/5e93050a-6f17-4314-a7e5-f78bda425fea.png
rename to templates/cms/directus/template/src/assets/5e93050a-6f17-4314-a7e5-f78bda425fea.png
diff --git a/simple-website-cms/src/assets/6464e61f-455a-4b47-b623-bb12e5251dfe.jpeg b/templates/cms/directus/template/src/assets/6464e61f-455a-4b47-b623-bb12e5251dfe.jpeg
similarity index 100%
rename from simple-website-cms/src/assets/6464e61f-455a-4b47-b623-bb12e5251dfe.jpeg
rename to templates/cms/directus/template/src/assets/6464e61f-455a-4b47-b623-bb12e5251dfe.jpeg
diff --git a/simple-website-cms/src/assets/68103296-6634-4d66-918a-04b09afe6621.jpeg b/templates/cms/directus/template/src/assets/68103296-6634-4d66-918a-04b09afe6621.jpeg
similarity index 100%
rename from simple-website-cms/src/assets/68103296-6634-4d66-918a-04b09afe6621.jpeg
rename to templates/cms/directus/template/src/assets/68103296-6634-4d66-918a-04b09afe6621.jpeg
diff --git a/simple-website-cms/src/assets/6964d750-1c00-4b9c-81e4-0c81cfa82bbb.png b/templates/cms/directus/template/src/assets/6964d750-1c00-4b9c-81e4-0c81cfa82bbb.png
similarity index 100%
rename from simple-website-cms/src/assets/6964d750-1c00-4b9c-81e4-0c81cfa82bbb.png
rename to templates/cms/directus/template/src/assets/6964d750-1c00-4b9c-81e4-0c81cfa82bbb.png
diff --git a/simple-website-cms/src/assets/7775c53a-6c2c-453d-8c22-8b5445121d10.jpeg b/templates/cms/directus/template/src/assets/7775c53a-6c2c-453d-8c22-8b5445121d10.jpeg
similarity index 100%
rename from simple-website-cms/src/assets/7775c53a-6c2c-453d-8c22-8b5445121d10.jpeg
rename to templates/cms/directus/template/src/assets/7775c53a-6c2c-453d-8c22-8b5445121d10.jpeg
diff --git a/simple-website-cms/src/assets/8a652e52-a275-4dde-9fc5-edf2188afe56.jpg b/templates/cms/directus/template/src/assets/8a652e52-a275-4dde-9fc5-edf2188afe56.jpg
similarity index 100%
rename from simple-website-cms/src/assets/8a652e52-a275-4dde-9fc5-edf2188afe56.jpg
rename to templates/cms/directus/template/src/assets/8a652e52-a275-4dde-9fc5-edf2188afe56.jpg
diff --git a/simple-website-cms/src/assets/8f748634-d77b-4985-b27e-7e1f3559881a.jpeg b/templates/cms/directus/template/src/assets/8f748634-d77b-4985-b27e-7e1f3559881a.jpeg
similarity index 100%
rename from simple-website-cms/src/assets/8f748634-d77b-4985-b27e-7e1f3559881a.jpeg
rename to templates/cms/directus/template/src/assets/8f748634-d77b-4985-b27e-7e1f3559881a.jpeg
diff --git a/simple-website-cms/src/assets/9a52e835-e131-4290-81bb-5a512599f93e.png b/templates/cms/directus/template/src/assets/9a52e835-e131-4290-81bb-5a512599f93e.png
similarity index 100%
rename from simple-website-cms/src/assets/9a52e835-e131-4290-81bb-5a512599f93e.png
rename to templates/cms/directus/template/src/assets/9a52e835-e131-4290-81bb-5a512599f93e.png
diff --git a/simple-website-cms/src/assets/a051ea01-07a5-45cb-bcc6-411af9560be5.png b/templates/cms/directus/template/src/assets/a051ea01-07a5-45cb-bcc6-411af9560be5.png
similarity index 100%
rename from simple-website-cms/src/assets/a051ea01-07a5-45cb-bcc6-411af9560be5.png
rename to templates/cms/directus/template/src/assets/a051ea01-07a5-45cb-bcc6-411af9560be5.png
diff --git a/simple-website-cms/src/assets/ac905071-0643-4337-8f53-48ed45b1ccf2.jpg b/templates/cms/directus/template/src/assets/ac905071-0643-4337-8f53-48ed45b1ccf2.jpg
similarity index 100%
rename from simple-website-cms/src/assets/ac905071-0643-4337-8f53-48ed45b1ccf2.jpg
rename to templates/cms/directus/template/src/assets/ac905071-0643-4337-8f53-48ed45b1ccf2.jpg
diff --git a/simple-website-cms/src/assets/ae390ba1-fcff-4b99-a445-5f19257095d1.svg b/templates/cms/directus/template/src/assets/ae390ba1-fcff-4b99-a445-5f19257095d1.svg
similarity index 100%
rename from simple-website-cms/src/assets/ae390ba1-fcff-4b99-a445-5f19257095d1.svg
rename to templates/cms/directus/template/src/assets/ae390ba1-fcff-4b99-a445-5f19257095d1.svg
diff --git a/simple-website-cms/src/assets/b9db00d9-535f-4e24-8a46-5f7e5fc65bf2.jpg b/templates/cms/directus/template/src/assets/b9db00d9-535f-4e24-8a46-5f7e5fc65bf2.jpg
similarity index 100%
rename from simple-website-cms/src/assets/b9db00d9-535f-4e24-8a46-5f7e5fc65bf2.jpg
rename to templates/cms/directus/template/src/assets/b9db00d9-535f-4e24-8a46-5f7e5fc65bf2.jpg
diff --git a/simple-website-cms/src/assets/c2a301bd-74ed-4a50-9b85-3cb1f40f8dee.png b/templates/cms/directus/template/src/assets/c2a301bd-74ed-4a50-9b85-3cb1f40f8dee.png
similarity index 100%
rename from simple-website-cms/src/assets/c2a301bd-74ed-4a50-9b85-3cb1f40f8dee.png
rename to templates/cms/directus/template/src/assets/c2a301bd-74ed-4a50-9b85-3cb1f40f8dee.png
diff --git a/simple-website-cms/src/assets/d4fd6edc-4cc5-48c1-8bc7-e646924bbdca.jpeg b/templates/cms/directus/template/src/assets/d4fd6edc-4cc5-48c1-8bc7-e646924bbdca.jpeg
similarity index 100%
rename from simple-website-cms/src/assets/d4fd6edc-4cc5-48c1-8bc7-e646924bbdca.jpeg
rename to templates/cms/directus/template/src/assets/d4fd6edc-4cc5-48c1-8bc7-e646924bbdca.jpeg
diff --git a/simple-website-cms/src/assets/d5a1290f-8819-4e7c-b292-bffe5b1c8274.jpg b/templates/cms/directus/template/src/assets/d5a1290f-8819-4e7c-b292-bffe5b1c8274.jpg
similarity index 100%
rename from simple-website-cms/src/assets/d5a1290f-8819-4e7c-b292-bffe5b1c8274.jpg
rename to templates/cms/directus/template/src/assets/d5a1290f-8819-4e7c-b292-bffe5b1c8274.jpg
diff --git a/simple-website-cms/src/assets/dc258f02-d1a3-47f4-9f3e-2a71a0010c56.png b/templates/cms/directus/template/src/assets/dc258f02-d1a3-47f4-9f3e-2a71a0010c56.png
similarity index 100%
rename from simple-website-cms/src/assets/dc258f02-d1a3-47f4-9f3e-2a71a0010c56.png
rename to templates/cms/directus/template/src/assets/dc258f02-d1a3-47f4-9f3e-2a71a0010c56.png
diff --git a/simple-website-cms/src/assets/dea64c65-de50-4d86-abea-6dee3d5256b2.webp b/templates/cms/directus/template/src/assets/dea64c65-de50-4d86-abea-6dee3d5256b2.webp
similarity index 100%
rename from simple-website-cms/src/assets/dea64c65-de50-4d86-abea-6dee3d5256b2.webp
rename to templates/cms/directus/template/src/assets/dea64c65-de50-4d86-abea-6dee3d5256b2.webp
diff --git a/simple-website-cms/src/assets/df0745c2-b6e3-4b37-b64d-55a4eb0033ab.avif b/templates/cms/directus/template/src/assets/df0745c2-b6e3-4b37-b64d-55a4eb0033ab.avif
similarity index 100%
rename from simple-website-cms/src/assets/df0745c2-b6e3-4b37-b64d-55a4eb0033ab.avif
rename to templates/cms/directus/template/src/assets/df0745c2-b6e3-4b37-b64d-55a4eb0033ab.avif
diff --git a/simple-website-cms/src/assets/ea743e20-e6e9-4be8-a949-3771cd182810.png b/templates/cms/directus/template/src/assets/ea743e20-e6e9-4be8-a949-3771cd182810.png
similarity index 100%
rename from simple-website-cms/src/assets/ea743e20-e6e9-4be8-a949-3771cd182810.png
rename to templates/cms/directus/template/src/assets/ea743e20-e6e9-4be8-a949-3771cd182810.png
diff --git a/simple-website-cms/src/assets/fd6440c2-dd48-4792-9d08-3124cd99b40f.png b/templates/cms/directus/template/src/assets/fd6440c2-dd48-4792-9d08-3124cd99b40f.png
similarity index 100%
rename from simple-website-cms/src/assets/fd6440c2-dd48-4792-9d08-3124cd99b40f.png
rename to templates/cms/directus/template/src/assets/fd6440c2-dd48-4792-9d08-3124cd99b40f.png
diff --git a/simple-website-cms/src/assets/fe7c7e04-5aac-4370-8bbd-6fd578d26ea1.jpg b/templates/cms/directus/template/src/assets/fe7c7e04-5aac-4370-8bbd-6fd578d26ea1.jpg
similarity index 100%
rename from simple-website-cms/src/assets/fe7c7e04-5aac-4370-8bbd-6fd578d26ea1.jpg
rename to templates/cms/directus/template/src/assets/fe7c7e04-5aac-4370-8bbd-6fd578d26ea1.jpg
diff --git a/simple-website-cms/src/collections.json b/templates/cms/directus/template/src/collections.json
similarity index 100%
rename from simple-website-cms/src/collections.json
rename to templates/cms/directus/template/src/collections.json
diff --git a/simple-website-cms/src/content/block_button.json b/templates/cms/directus/template/src/content/block_button.json
similarity index 100%
rename from simple-website-cms/src/content/block_button.json
rename to templates/cms/directus/template/src/content/block_button.json
diff --git a/simple-website-cms/src/content/block_button_group.json b/templates/cms/directus/template/src/content/block_button_group.json
similarity index 100%
rename from simple-website-cms/src/content/block_button_group.json
rename to templates/cms/directus/template/src/content/block_button_group.json
diff --git a/simple-website-cms/src/content/block_form.json b/templates/cms/directus/template/src/content/block_form.json
similarity index 100%
rename from simple-website-cms/src/content/block_form.json
rename to templates/cms/directus/template/src/content/block_form.json
diff --git a/simple-website-cms/src/content/block_gallery.json b/templates/cms/directus/template/src/content/block_gallery.json
similarity index 100%
rename from simple-website-cms/src/content/block_gallery.json
rename to templates/cms/directus/template/src/content/block_gallery.json
diff --git a/simple-website-cms/src/content/block_gallery_items.json b/templates/cms/directus/template/src/content/block_gallery_items.json
similarity index 100%
rename from simple-website-cms/src/content/block_gallery_items.json
rename to templates/cms/directus/template/src/content/block_gallery_items.json
diff --git a/simple-website-cms/src/content/block_hero.json b/templates/cms/directus/template/src/content/block_hero.json
similarity index 100%
rename from simple-website-cms/src/content/block_hero.json
rename to templates/cms/directus/template/src/content/block_hero.json
diff --git a/simple-website-cms/src/content/block_posts.json b/templates/cms/directus/template/src/content/block_posts.json
similarity index 100%
rename from simple-website-cms/src/content/block_posts.json
rename to templates/cms/directus/template/src/content/block_posts.json
diff --git a/simple-website-cms/src/content/block_pricing.json b/templates/cms/directus/template/src/content/block_pricing.json
similarity index 100%
rename from simple-website-cms/src/content/block_pricing.json
rename to templates/cms/directus/template/src/content/block_pricing.json
diff --git a/simple-website-cms/src/content/block_pricing_cards.json b/templates/cms/directus/template/src/content/block_pricing_cards.json
similarity index 100%
rename from simple-website-cms/src/content/block_pricing_cards.json
rename to templates/cms/directus/template/src/content/block_pricing_cards.json
diff --git a/simple-website-cms/src/content/block_richtext.json b/templates/cms/directus/template/src/content/block_richtext.json
similarity index 100%
rename from simple-website-cms/src/content/block_richtext.json
rename to templates/cms/directus/template/src/content/block_richtext.json
diff --git a/simple-website-cms/src/content/form_fields.json b/templates/cms/directus/template/src/content/form_fields.json
similarity index 100%
rename from simple-website-cms/src/content/form_fields.json
rename to templates/cms/directus/template/src/content/form_fields.json
diff --git a/simple-website-cms/src/content/form_submission_values.json b/templates/cms/directus/template/src/content/form_submission_values.json
similarity index 100%
rename from simple-website-cms/src/content/form_submission_values.json
rename to templates/cms/directus/template/src/content/form_submission_values.json
diff --git a/simple-website-cms/src/content/form_submissions.json b/templates/cms/directus/template/src/content/form_submissions.json
similarity index 100%
rename from simple-website-cms/src/content/form_submissions.json
rename to templates/cms/directus/template/src/content/form_submissions.json
diff --git a/simple-website-cms/src/content/forms.json b/templates/cms/directus/template/src/content/forms.json
similarity index 100%
rename from simple-website-cms/src/content/forms.json
rename to templates/cms/directus/template/src/content/forms.json
diff --git a/simple-website-cms/src/content/globals.json b/templates/cms/directus/template/src/content/globals.json
similarity index 100%
rename from simple-website-cms/src/content/globals.json
rename to templates/cms/directus/template/src/content/globals.json
diff --git a/simple-website-cms/src/content/navigation.json b/templates/cms/directus/template/src/content/navigation.json
similarity index 100%
rename from simple-website-cms/src/content/navigation.json
rename to templates/cms/directus/template/src/content/navigation.json
diff --git a/simple-website-cms/src/content/navigation_items.json b/templates/cms/directus/template/src/content/navigation_items.json
similarity index 100%
rename from simple-website-cms/src/content/navigation_items.json
rename to templates/cms/directus/template/src/content/navigation_items.json
diff --git a/simple-website-cms/src/content/page_blocks.json b/templates/cms/directus/template/src/content/page_blocks.json
similarity index 100%
rename from simple-website-cms/src/content/page_blocks.json
rename to templates/cms/directus/template/src/content/page_blocks.json
diff --git a/simple-website-cms/src/content/pages.json b/templates/cms/directus/template/src/content/pages.json
similarity index 100%
rename from simple-website-cms/src/content/pages.json
rename to templates/cms/directus/template/src/content/pages.json
diff --git a/simple-website-cms/src/content/posts.json b/templates/cms/directus/template/src/content/posts.json
similarity index 100%
rename from simple-website-cms/src/content/posts.json
rename to templates/cms/directus/template/src/content/posts.json
diff --git a/simple-website-cms/src/dashboards.json b/templates/cms/directus/template/src/dashboards.json
similarity index 100%
rename from simple-website-cms/src/dashboards.json
rename to templates/cms/directus/template/src/dashboards.json
diff --git a/simple-website-cms/src/extensions.json b/templates/cms/directus/template/src/extensions.json
similarity index 100%
rename from simple-website-cms/src/extensions.json
rename to templates/cms/directus/template/src/extensions.json
diff --git a/simple-website-cms/src/fields.json b/templates/cms/directus/template/src/fields.json
similarity index 100%
rename from simple-website-cms/src/fields.json
rename to templates/cms/directus/template/src/fields.json
diff --git a/simple-website-cms/src/files.json b/templates/cms/directus/template/src/files.json
similarity index 100%
rename from simple-website-cms/src/files.json
rename to templates/cms/directus/template/src/files.json
diff --git a/simple-website-cms/src/flows.json b/templates/cms/directus/template/src/flows.json
similarity index 100%
rename from simple-website-cms/src/flows.json
rename to templates/cms/directus/template/src/flows.json
diff --git a/simple-website-cms/src/folders.json b/templates/cms/directus/template/src/folders.json
similarity index 100%
rename from simple-website-cms/src/folders.json
rename to templates/cms/directus/template/src/folders.json
diff --git a/simple-website-cms/src/operations.json b/templates/cms/directus/template/src/operations.json
similarity index 100%
rename from simple-website-cms/src/operations.json
rename to templates/cms/directus/template/src/operations.json
diff --git a/simple-website-cms/src/panels.json b/templates/cms/directus/template/src/panels.json
similarity index 100%
rename from simple-website-cms/src/panels.json
rename to templates/cms/directus/template/src/panels.json
diff --git a/simple-website-cms/src/permissions.json b/templates/cms/directus/template/src/permissions.json
similarity index 100%
rename from simple-website-cms/src/permissions.json
rename to templates/cms/directus/template/src/permissions.json
diff --git a/simple-website-cms/src/policies.json b/templates/cms/directus/template/src/policies.json
similarity index 100%
rename from simple-website-cms/src/policies.json
rename to templates/cms/directus/template/src/policies.json
diff --git a/simple-website-cms/src/presets.json b/templates/cms/directus/template/src/presets.json
similarity index 100%
rename from simple-website-cms/src/presets.json
rename to templates/cms/directus/template/src/presets.json
diff --git a/simple-website-cms/src/relations.json b/templates/cms/directus/template/src/relations.json
similarity index 100%
rename from simple-website-cms/src/relations.json
rename to templates/cms/directus/template/src/relations.json
diff --git a/simple-website-cms/src/roles.json b/templates/cms/directus/template/src/roles.json
similarity index 100%
rename from simple-website-cms/src/roles.json
rename to templates/cms/directus/template/src/roles.json
diff --git a/simple-website-cms/src/schema/snapshot.json b/templates/cms/directus/template/src/schema/snapshot.json
similarity index 100%
rename from simple-website-cms/src/schema/snapshot.json
rename to templates/cms/directus/template/src/schema/snapshot.json
diff --git a/simple-website-cms/src/settings.json b/templates/cms/directus/template/src/settings.json
similarity index 100%
rename from simple-website-cms/src/settings.json
rename to templates/cms/directus/template/src/settings.json
diff --git a/simple-website-cms/src/translations.json b/templates/cms/directus/template/src/translations.json
similarity index 100%
rename from simple-website-cms/src/translations.json
rename to templates/cms/directus/template/src/translations.json
diff --git a/simple-website-cms/src/users.json b/templates/cms/directus/template/src/users.json
similarity index 100%
rename from simple-website-cms/src/users.json
rename to templates/cms/directus/template/src/users.json
diff --git a/templates/cms/nextjs/.editorconfig b/templates/cms/nextjs/.editorconfig
new file mode 100644
index 0000000..dc354d6
--- /dev/null
+++ b/templates/cms/nextjs/.editorconfig
@@ -0,0 +1,11 @@
+root=true
+
+[*]
+end_of_line = lf
+insert_final_newline = true
+charset = utf-8
+indent_style = tab
+trim_trailing_whitespace = true
+
+[*.{yml,yaml}]
+indent_style = space
\ No newline at end of file
diff --git a/templates/cms/nextjs/.env.example b/templates/cms/nextjs/.env.example
new file mode 100644
index 0000000..7471acb
--- /dev/null
+++ b/templates/cms/nextjs/.env.example
@@ -0,0 +1,5 @@
+NEXT_PUBLIC_DIRECTUS_URL=http://localhost:8055 # Or your cloud instance URL
+DIRECTUS_PUBLIC_TOKEN=your-public-token # Token for public content
+DIRECTUS_FORM_TOKEN=your-form-token # Token for forms
+NEXT_PUBLIC_SITE_URL=http://localhost:3000 # Application URL
+DRAFT_MODE_SECRET=your-draft-mode-secret # Secret for preview mode
diff --git a/templates/cms/nextjs/.gitignore b/templates/cms/nextjs/.gitignore
new file mode 100644
index 0000000..07a18c0
--- /dev/null
+++ b/templates/cms/nextjs/.gitignore
@@ -0,0 +1,32 @@
+# Node.js
+node_modules/
+
+# Logs
+npm-debug.log*
+pnpm-debug.log*
+yarn-debug.log*
+*.log
+
+# Next.js build output
+.next/
+out/
+
+# Environment variables
+.env
+.env.*.local
+
+# System files
+.DS_Store
+Thumbs.db
+
+# IDE/Editor Configs
+.idea/
+.vscode/
+
+# Test Coverage
+coverage/
+
+# Tailwind CSS Cache
+.stylelintcache
+
+certificates
\ No newline at end of file
diff --git a/templates/cms/nextjs/.prettierignore b/templates/cms/nextjs/.prettierignore
new file mode 100644
index 0000000..dd6c136
--- /dev/null
+++ b/templates/cms/nextjs/.prettierignore
@@ -0,0 +1,4 @@
+dist
+coverage
+node_modules
+pnpm-lock.yaml
diff --git a/templates/cms/nextjs/.prettierrc.js b/templates/cms/nextjs/.prettierrc.js
new file mode 100644
index 0000000..37b8c2c
--- /dev/null
+++ b/templates/cms/nextjs/.prettierrc.js
@@ -0,0 +1,6 @@
+module.exports = {
+ htmlWhitespaceSensitivity: "ignore",
+ printWidth: 120,
+ singleQuote: true,
+ proseWrap: "always",
+};
diff --git a/templates/cms/nextjs/Dockerfile b/templates/cms/nextjs/Dockerfile
new file mode 100644
index 0000000..ed1adc9
--- /dev/null
+++ b/templates/cms/nextjs/Dockerfile
@@ -0,0 +1,70 @@
+FROM node:20.18.0-alpine AS base
+
+# Install dependencies only when needed
+FROM base AS deps
+# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
+# RUN set -x && apk update && apk upgrade && apk add --no-cache libc6-compat && npm i -g npm@latest
+WORKDIR /app
+
+# Install dependencies based on the preferred package manager
+COPY --link package.json yarn.lock* package-lock.json* pnpm-lock.yaml* bun.lockb* ./
+RUN \
+ if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
+ elif [ -f package-lock.json ]; then npm ci --legacy-peer-deps; \
+ elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \
+ elif [ -f bun.lockb ]; then bun install --frozen-lockfile; \
+ else echo "Lockfile not found." && exit 1; \
+ fi
+
+# Rebuild the source code only when needed
+FROM base AS builder
+WORKDIR /app
+ENV NODE_ENV=production
+COPY --from=deps --link /app/node_modules ./node_modules
+COPY . .
+
+# Next.js collects completely anonymous telemetry data about general usage.
+# Learn more here: https://nextjs.org/telemetry
+# Uncomment the following line in case you want to disable telemetry during the build.
+# ENV NEXT_TELEMETRY_DISABLED=1
+
+RUN \
+ if [ -f yarn.lock ]; then yarn run build; \
+ elif [ -f package-lock.json ]; then npm run build; \
+ elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \
+ elif [ -f bun.lockb ]; then bun run build; \
+ else echo "Lockfile not found." && exit 1; \
+ fi
+
+# Production image, copy all the files and run next
+FROM base AS runner
+WORKDIR /app
+
+ENV NODE_ENV=production
+# Uncomment the following line in case you want to disable telemetry during runtime.
+# ENV NEXT_TELEMETRY_DISABLED=1
+
+RUN addgroup --system --gid 1001 nodejs
+RUN adduser --system --uid 1001 nextjs
+
+COPY --from=builder /app/public ./public
+
+# Set the correct permission for prerender cache
+RUN mkdir .next
+RUN chown nextjs:nodejs .next
+
+# Automatically leverage output traces to reduce image size
+# https://nextjs.org/docs/advanced-features/output-file-tracing
+COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
+COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
+
+USER nextjs
+
+EXPOSE 3000
+
+ENV PORT=3000
+
+# server.js is created by next build from the standalone output
+# https://nextjs.org/docs/pages/api-reference/next-config-js/output
+ENV HOSTNAME="0.0.0.0"
+CMD ["node", "server.js"]
diff --git a/templates/cms/nextjs/README.md b/templates/cms/nextjs/README.md
new file mode 100644
index 0000000..10a703a
--- /dev/null
+++ b/templates/cms/nextjs/README.md
@@ -0,0 +1,167 @@
+# Next.js Simple CMS Template with Directus Integration
+
+This is a **Next.js-based Simple CMS Template** that is fully integrated with [Directus](https://directus.io/), offering
+a headless CMS solution for managing and delivering content seamlessly. The template leverages modern technologies like
+the **Next.js App Router**, **Tailwind CSS**, and **Shadcn components**, providing a complete and scalable starting
+point for building CMS-powered web applications.
+
+## **Features**
+
+- **Next.js App Router**: Uses the latest Next.js routing architecture for layouts and dynamic routes.
+- **Full Directus Integration**: Directus API integration for fetching and managing relational data.
+- **Tailwind CSS**: Fully integrated for rapid UI styling.
+- **TypeScript**: Ensures type safety and reliable code quality.
+- **Shadcn Components**: Pre-built, customizable UI components for modern design systems.
+- **ESLint & Prettier**: Enforces consistent code quality and formatting.
+- **Dynamic Page Builder**: A page builder interface for creating and customizing CMS-driven pages.
+- **Preview Mode**: Built-in draft/live preview for editing unpublished content.
+- **Optimized Dependency Management**: Project is set up with **pnpm** for faster and more efficient package management.
+
+---
+
+## **Why pnpm?**
+
+This project uses `pnpm` for managing dependencies due to its speed and efficiency. If you’re familiar with `npm`,
+you’ll find `pnpm` very similar in usage. You can still use `npm` if you prefer by replacing `pnpm` commands with their
+`npm` equivalents.
+
+---
+
+## **Draft Mode in Directus and Live Preview**
+
+### **Draft Mode Overview**
+
+Directus allows you to work on unpublished content using **Draft Mode**. This Next.js template is configured to support
+Directus Draft Mode out of the box, enabling live previews of unpublished or draft content as you make changes.
+
+### **Live Preview Setup**
+
+[Directus Live Preview](https://docs.directus.io/guides/headless-cms/live-preview/nextjs.html)
+
+- The live preview feature works seamlessly on deployed environments.
+- To preview content on **localhost**, use your browser’s preview mode or deploy your application to a staging
+ environment.
+- **Important Note**: Directus employs Content Security Policies (CSPs) that block live previews on `localhost` for
+ security reasons. For a smooth preview experience, deploy the application to a cloud environment and use the
+ deployment URL for Directus previews.
+
+---
+
+## **Getting Started**
+
+### Prerequisites
+
+To set up this template, ensure you have the following:
+
+- **Node.js** (16.x or newer)
+- **npm** or **pnpm**
+- Access to a **Directus** instance ([cloud or self-hosted](../../README.md))
+
+## ⚠️ Directus Setup Instructions
+
+For instructions on setting up Directus, choose one of the following:
+
+- [Setting up Directus Cloud](https://github.com/directus-labs/starters?tab=readme-ov-file#using-directus-with-a-cloud-instance-recommended)
+- [Setting up Directus Self-Hosted](https://github.com/directus-labs/starters?tab=readme-ov-file#using-directus-locally)
+
+### **Environment Variables**
+
+To get started, you need to configure environment variables. Follow these steps:
+
+1. **Copy the example environment file:**
+
+ ```bash
+ cp .env.example .env
+ ```
+
+2. **Update the following variables in your `.env` file:**
+
+ - **`NEXT_PUBLIC_DIRECTUS_URL`**: URL of your Directus instance.
+ - **`DIRECTUS_PUBLIC_TOKEN`**: Public token for accessing public resources in Directus. Use the token from the
+ **Webmaster** account.
+ - **`DIRECTUS_FORM_TOKEN`**: Token from the **Frontend Bot User** account in Directus for handling form submissions.
+ - **`NEXT_PUBLIC_SITE_URL`**: The public URL of your site. This is used for SEO metadata and blog post routing.
+ - **`DRAFT_MODE_SECRET`**: The secret you generate for live preview. This is used to view draft posts in directus and
+ live edits.
+
+## **Running the Application**
+
+### Local Development
+
+1. Install dependencies:
+
+ ```bash
+ pnpm install
+ ```
+
+ _(You can also use `npm install` if you prefer.)_
+
+2. Start the development server:
+
+ ```bash
+ pnpm run dev
+ ```
+
+3. Visit [http://localhost:3000](http://localhost:3000).
+
+## Generate Directus Types
+
+This repository includes a [utility](https://www.npmjs.com/package/directus-sdk-typegen) to generate TypeScript types
+for your Directus schema.
+
+#### Usage
+
+1. Ensure your `.env` file is configured as described above.
+2. Run the following command:
+ ```bash
+ pnpm run generate:types
+ ```
+
+## Folder Structure
+
+```
+src/
+├── app/ # Next.js App Router and APIs
+│ ├── blog/ # Blog-related routes
+│ │ ├── [slug]/ # Dynamic blog post route
+│ │ │ └── page.tsx
+│ ├── [permalink]/ # Dynamic page route
+│ │ └── page.tsx
+│ ├── api/ # API routes for draft/live preview and search
+│ │ ├── draft/ # Routes for draft previews
+│ │ │ └── route.ts
+│ │ ├── search/ # Routes for search functionality
+│ │ │ └── route.ts
+│ ├── layout.tsx # Shared layout for all routes
+├── components/ # Reusable components
+│ ├── blocks/ # CMS blocks (Hero, Gallery, etc.)
+│ │ └── ...
+│ ├── forms/ # Form components
+│ │ ├── DynamicForm.tsx # Renders dynamic forms with validation
+│ │ ├── FormBuilder.tsx # Manages form lifecycles and submission
+│ │ ├── FormField.tsx # Renders individual form fields dynamically
+│ │ └── fields/ # Form fields components
+│ │ └── ...
+│ ├── layout/ # Layout components
+│ │ ├── Footer.tsx
+│ │ ├── NavigationBar.tsx
+│ │ └── PageBuilder.tsx # Assembles blocks into pages
+│ ├── shared/ # Shared utilities
+│ │ └── DirectusImage.tsx # Renders images from Directus
+│ ├── ui/ # Shadcn and other base UI components
+│ │ └── ...
+├── lib/ # Utility and global logic
+│ ├── directus/ # Directus utilities
+│ │ ├── directus.ts # Directus client setup
+│ │ ├── fetchers.ts # API fetchers
+│ │ ├── forms.ts # Directus form handling
+│ │ ├── generateDirectusTypes.ts # Generates Directus types
+│ │ └── directus-utils.ts # General Directus helpers
+│ ├── zodSchemaBuilder.ts # Zod validation schemas
+├── styles/ # Global styles
+│ └── ...
+├── types/ # TypeScript types
+│ └── directus-schema.ts # Directus-generated types
+```
+
+---
diff --git a/templates/cms/nextjs/components.json b/templates/cms/nextjs/components.json
new file mode 100644
index 0000000..c7c10b8
--- /dev/null
+++ b/templates/cms/nextjs/components.json
@@ -0,0 +1,20 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "default",
+ "rsc": true,
+ "tsx": true,
+ "tailwind": {
+ "config": "tailwind.config.ts",
+ "css": "src/app/globals.css",
+ "baseColor": "neutral",
+ "cssVariables": true,
+ "prefix": ""
+ },
+ "aliases": {
+ "components": "@/components",
+ "utils": "@/lib/utils",
+ "ui": "@/components/ui",
+ "lib": "@/lib",
+ "hooks": "@/hooks"
+ }
+}
diff --git a/templates/cms/nextjs/eslint.config.mjs b/templates/cms/nextjs/eslint.config.mjs
new file mode 100644
index 0000000..ede2abe
--- /dev/null
+++ b/templates/cms/nextjs/eslint.config.mjs
@@ -0,0 +1,88 @@
+import pluginJs from "@eslint/js";
+import nextPlugin from "@next/eslint-plugin-next";
+
+import eslintConfigPrettier from "eslint-config-prettier";
+import importPlugin from "eslint-plugin-import";
+import pluginPromise from "eslint-plugin-promise";
+import pluginReact from "eslint-plugin-react";
+import tailwind from "eslint-plugin-tailwindcss";
+import globals from "globals";
+import tseslint from "typescript-eslint";
+
+export default [
+ {
+ files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"],
+ },
+ {
+ languageOptions: {
+ ecmaVersion: "latest",
+ globals: { ...globals.browser, ...globals.node },
+ parserOptions: {
+ ecmaFeatures: {
+ jsx: true,
+ },
+ },
+ },
+ },
+ {
+ settings: {
+ react: {
+ version: "detect",
+ },
+ },
+ },
+ pluginJs.configs.recommended, // Core ESLint recommendations
+ importPlugin.flatConfigs.recommended, // Import plugin recommendations
+ ...tseslint.configs.recommended, // TypeScript ESLint recommendations
+ pluginPromise.configs["flat/recommended"], // Promise plugin recommendations
+ pluginReact.configs.flat.recommended, // React plugin recommendations
+ pluginReact.configs.flat["jsx-runtime"], // Use React's new JSX runtime
+ eslintConfigPrettier, // Prettier integration
+ ...tailwind.configs["flat/recommended"], // TailwindCSS plugin recommendations
+ {
+ rules: {
+ "no-unused-vars": "off",
+ "react/react-in-jsx-scope": "off",
+ "react-hooks/exhaustive-deps": "off",
+ "react/display-name": "off",
+ "react/prop-types": "off",
+ "newline-before-return": "error",
+ "@typescript-eslint/no-unused-vars": "off",
+ "@typescript-eslint/no-unused-expressions": "off",
+ "tailwindcss/no-custom-classname": "off",
+ "tailwindcss/migration-from-tailwind-2": "off",
+ "import/no-unresolved": "off",
+ "import/no-named-as-default": "off",
+ // ! TO COMPILE SHADCN EXAMPLES, PLEASE REMOVE AS NEEDED
+ "@typescript-eslint/no-explicit-any": "off",
+ "@typescript-eslint/no-empty-object-type": "off",
+ "@typescript-eslint/ban-ts-comment": "off",
+ "react/no-unescaped-entities": "off",
+ "react/no-unknown-property": "off",
+ "tailwindcss/no-unnecessary-arbitrary-value": "off",
+ "tailwindcss/classnames-order": "off",
+ "import/named": "off",
+ "import/no-named-as-default-member": "off",
+ },
+ },
+ // ! ===================== DISCLAIMER =====================
+ // ! There is no official solution available for new ESLint 9 flat config structure for NextJS
+ // ! The solution is taken from the community and may not be the best practice, use it at your own risk
+ // ? Ref: https://github.com/vercel/next.js/discussions/49337?sort=top#discussioncomment-5998603
+ // ! ======================================================
+ {
+ plugins: {
+ "@next/next": nextPlugin,
+ },
+ rules: {
+ ...nextPlugin.configs.recommended.rules,
+ ...nextPlugin.configs["core-web-vitals"].rules,
+ "@next/next/no-img-element": "off",
+ // ! TO COMPILE SHADCN EXAMPLES, PLEASE REMOVE AS NEEDED
+ "@next/next/no-html-link-for-pages": "off",
+ },
+ },
+ {
+ ignores: [".next/*"],
+ },
+];
diff --git a/templates/cms/nextjs/next-env.d.ts b/templates/cms/nextjs/next-env.d.ts
new file mode 100644
index 0000000..1b3be08
--- /dev/null
+++ b/templates/cms/nextjs/next-env.d.ts
@@ -0,0 +1,5 @@
+///
+///
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/templates/cms/nextjs/next.config.ts b/templates/cms/nextjs/next.config.ts
new file mode 100644
index 0000000..ee90c8b
--- /dev/null
+++ b/templates/cms/nextjs/next.config.ts
@@ -0,0 +1,62 @@
+import type { NextConfig } from 'next';
+import initializeBundleAnalyzer from '@next/bundle-analyzer';
+
+const withBundleAnalyzer = initializeBundleAnalyzer({
+ enabled: process.env.BUNDLE_ANALYZER_ENABLED === 'true',
+});
+
+const ContentSecurityPolicy = `
+ default-src 'self';
+ script-src 'self' 'unsafe-eval' 'unsafe-inline';
+ frame-src *;
+ style-src 'self' 'unsafe-inline';
+ img-src * blob: data:;
+ media-src *;
+ connect-src *;
+ font-src 'self' data:;
+ frame-ancestors 'self' http://localhost:3000 ${process.env.NEXT_PUBLIC_DIRECTUS_URL};
+`;
+
+const nextConfig: NextConfig = {
+ webpack: (config) => {
+ config.cache = false;
+
+ return config;
+ },
+ images: {
+ dangerouslyAllowSVG: true,
+ remotePatterns: [
+ {
+ protocol: 'https',
+ hostname: process.env.NEXT_PUBLIC_DIRECTUS_URL?.split('//')[1] || '',
+ pathname: '/assets/**',
+ },
+ {
+ protocol: 'http',
+ hostname: 'localhost',
+ port: '8055',
+ pathname: '/assets/**',
+ },
+ ],
+ },
+ env: {
+ DIRECTUS_PUBLIC_TOKEN: process.env.DIRECTUS_PUBLIC_TOKEN,
+ DIRECTUS_FORM_TOKEN: process.env.DIRECTUS_FORM_TOKEN,
+ DRAFT_MODE_SECRET: process.env.DRAFT_MODE_SECRET,
+ },
+ async headers() {
+ return [
+ {
+ source: '/:path*',
+ headers: [
+ {
+ key: 'Content-Security-Policy',
+ value: ContentSecurityPolicy.replace(/\n/g, '').trim(),
+ },
+ ],
+ },
+ ];
+ },
+};
+
+export default withBundleAnalyzer(nextConfig);
diff --git a/templates/cms/nextjs/package.json b/templates/cms/nextjs/package.json
new file mode 100644
index 0000000..8c5f357
--- /dev/null
+++ b/templates/cms/nextjs/package.json
@@ -0,0 +1,72 @@
+{
+ "name": "nextjs-15-starter-shadcn",
+ "version": "1.0.0",
+ "private": true,
+ "website": "https://nextjs-15-starter-shadcn.vercel.app/",
+ "license": "MIT",
+ "scripts": {
+ "dev": "next dev --turbopack",
+ "build": "next build",
+ "start": "next start",
+ "generate:types": "tsx ./src/lib/directus/generateDirectusTypes.ts",
+ "lint": "next lint",
+ "lint:fix": "eslint --fix \"src/**/*.{js,jsx,ts,tsx}\"",
+ "format": "prettier --write \"src/**/*.{js,jsx,ts,tsx}\""
+ },
+ "dependencies": {
+ "@directus/sdk": "^18.0.3",
+ "@hookform/resolvers": "^3.10.0",
+ "@radix-ui/react-checkbox": "^1.1.3",
+ "@radix-ui/react-collapsible": "^1.1.2",
+ "@radix-ui/react-dialog": "^1.1.4",
+ "@radix-ui/react-dropdown-menu": "^2.1.4",
+ "@radix-ui/react-label": "^2.1.1",
+ "@radix-ui/react-navigation-menu": "^1.2.3",
+ "@radix-ui/react-radio-group": "^1.2.2",
+ "@radix-ui/react-select": "^2.1.4",
+ "@radix-ui/react-separator": "^1.1.1",
+ "@radix-ui/react-slot": "^1.1.1",
+ "@radix-ui/react-tooltip": "^1.1.6",
+ "@tailwindcss/typography": "^0.5.16",
+ "@types/react": "^19.0.7",
+ "@types/react-dom": "^19.0.3",
+ "class-variance-authority": "^0.7.1",
+ "clsx": "^2.1.1",
+ "cmdk": "1.0.4",
+ "dotenv": "^16.4.7",
+ "lucide-react": "^0.471.1",
+ "next": "15.1.4",
+ "next-themes": "^0.4.4",
+ "p-queue": "^8.0.1",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "react-hook-form": "^7.54.2",
+ "shadcn": "^2.1.8",
+ "tailwind-merge": "^2.6.0",
+ "zod": "^3.24.1"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.18.0",
+ "@next/bundle-analyzer": "15.1.4",
+ "@next/eslint-plugin-next": "15.1.4",
+ "@trivago/prettier-plugin-sort-imports": "^5.2.1",
+ "@types/node": "^22.10.6",
+ "directus-sdk-typegen": "^0.1.9",
+ "eslint": "^9.18.0",
+ "eslint-config-next": "15.1.4",
+ "eslint-config-prettier": "^10.0.1",
+ "eslint-plugin-import": "^2.31.0",
+ "eslint-plugin-promise": "^7.2.1",
+ "eslint-plugin-react": "^7.37.4",
+ "eslint-plugin-tailwindcss": "^3.17.5",
+ "globals": "^15.14.0",
+ "postcss": "^8.5.1",
+ "prettier": "^3.4.2",
+ "prettier-plugin-tailwindcss": "^0.6.9",
+ "tailwindcss": "^3.4.17",
+ "tailwindcss-animate": "^1.0.7",
+ "tsx": "^4.19.2",
+ "typescript": "^5.7.3",
+ "typescript-eslint": "^8.20.0"
+ }
+}
diff --git a/templates/cms/nextjs/pnpm-lock.yaml b/templates/cms/nextjs/pnpm-lock.yaml
new file mode 100644
index 0000000..559777e
--- /dev/null
+++ b/templates/cms/nextjs/pnpm-lock.yaml
@@ -0,0 +1,6333 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ '@directus/sdk':
+ specifier: ^18.0.3
+ version: 18.0.3
+ '@hookform/resolvers':
+ specifier: ^3.10.0
+ version: 3.10.0(react-hook-form@7.54.2(react@19.0.0))
+ '@radix-ui/react-checkbox':
+ specifier: ^1.1.3
+ version: 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-collapsible':
+ specifier: ^1.1.2
+ version: 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-dialog':
+ specifier: ^1.1.4
+ version: 1.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-dropdown-menu':
+ specifier: ^2.1.4
+ version: 2.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-label':
+ specifier: ^2.1.1
+ version: 2.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-navigation-menu':
+ specifier: ^1.2.3
+ version: 1.2.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-radio-group':
+ specifier: ^1.2.2
+ version: 1.2.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-select':
+ specifier: ^2.1.4
+ version: 2.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-separator':
+ specifier: ^1.1.1
+ version: 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-slot':
+ specifier: ^1.1.1
+ version: 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-tooltip':
+ specifier: ^1.1.6
+ version: 1.1.6(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@tailwindcss/typography':
+ specifier: ^0.5.16
+ version: 0.5.16(tailwindcss@3.4.17)
+ '@types/react':
+ specifier: ^19.0.7
+ version: 19.0.7
+ '@types/react-dom':
+ specifier: ^19.0.3
+ version: 19.0.3(@types/react@19.0.7)
+ class-variance-authority:
+ specifier: ^0.7.1
+ version: 0.7.1
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
+ cmdk:
+ specifier: 1.0.4
+ version: 1.0.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ dotenv:
+ specifier: ^16.4.7
+ version: 16.4.7
+ lucide-react:
+ specifier: ^0.471.1
+ version: 0.471.1(react@19.0.0)
+ next:
+ specifier: 15.1.4
+ version: 15.1.4(@babel/core@7.26.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ next-themes:
+ specifier: ^0.4.4
+ version: 0.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ p-queue:
+ specifier: ^8.0.1
+ version: 8.0.1
+ react:
+ specifier: ^19.0.0
+ version: 19.0.0
+ react-dom:
+ specifier: ^19.0.0
+ version: 19.0.0(react@19.0.0)
+ react-hook-form:
+ specifier: ^7.54.2
+ version: 7.54.2(react@19.0.0)
+ shadcn:
+ specifier: ^2.1.8
+ version: 2.1.8(typescript@5.7.3)
+ tailwind-merge:
+ specifier: ^2.6.0
+ version: 2.6.0
+ zod:
+ specifier: ^3.24.1
+ version: 3.24.1
+ devDependencies:
+ '@eslint/js':
+ specifier: ^9.18.0
+ version: 9.18.0
+ '@next/bundle-analyzer':
+ specifier: 15.1.4
+ version: 15.1.4
+ '@next/eslint-plugin-next':
+ specifier: 15.1.4
+ version: 15.1.4
+ '@trivago/prettier-plugin-sort-imports':
+ specifier: ^5.2.1
+ version: 5.2.1(prettier@3.4.2)
+ '@types/node':
+ specifier: ^22.10.6
+ version: 22.10.6
+ directus-sdk-typegen:
+ specifier: ^0.1.9
+ version: 0.1.9
+ eslint:
+ specifier: ^9.18.0
+ version: 9.18.0(jiti@1.21.7)
+ eslint-config-next:
+ specifier: 15.1.4
+ version: 15.1.4(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)
+ eslint-config-prettier:
+ specifier: ^10.0.1
+ version: 10.0.1(eslint@9.18.0(jiti@1.21.7))
+ eslint-plugin-import:
+ specifier: ^2.31.0
+ version: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7)))(eslint@9.18.0(jiti@1.21.7)))(eslint@9.18.0(jiti@1.21.7))
+ eslint-plugin-promise:
+ specifier: ^7.2.1
+ version: 7.2.1(eslint@9.18.0(jiti@1.21.7))
+ eslint-plugin-react:
+ specifier: ^7.37.4
+ version: 7.37.4(eslint@9.18.0(jiti@1.21.7))
+ eslint-plugin-tailwindcss:
+ specifier: ^3.17.5
+ version: 3.17.5(tailwindcss@3.4.17)
+ globals:
+ specifier: ^15.14.0
+ version: 15.14.0
+ postcss:
+ specifier: ^8.5.1
+ version: 8.5.1
+ prettier:
+ specifier: ^3.4.2
+ version: 3.4.2
+ prettier-plugin-tailwindcss:
+ specifier: ^0.6.9
+ version: 0.6.9(@trivago/prettier-plugin-sort-imports@5.2.1(prettier@3.4.2))(prettier@3.4.2)
+ tailwindcss:
+ specifier: ^3.4.17
+ version: 3.4.17
+ tailwindcss-animate:
+ specifier: ^1.0.7
+ version: 1.0.7(tailwindcss@3.4.17)
+ tsx:
+ specifier: ^4.19.2
+ version: 4.19.2
+ typescript:
+ specifier: ^5.7.3
+ version: 5.7.3
+ typescript-eslint:
+ specifier: ^8.20.0
+ version: 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)
+
+packages:
+
+ '@alloc/quick-lru@5.2.0':
+ resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
+ engines: {node: '>=10'}
+
+ '@ampproject/remapping@2.3.0':
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+ engines: {node: '>=6.0.0'}
+
+ '@antfu/ni@0.21.12':
+ resolution: {integrity: sha512-2aDL3WUv8hMJb2L3r/PIQWsTLyq7RQr3v9xD16fiz6O8ys1xEyLhhTOv8gxtZvJiTzjTF5pHoArvRdesGL1DMQ==}
+ hasBin: true
+
+ '@babel/code-frame@7.26.2':
+ resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.26.5':
+ resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.26.0':
+ resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.26.5':
+ resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-annotate-as-pure@7.25.9':
+ resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.26.5':
+ resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-create-class-features-plugin@7.25.9':
+ resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-member-expression-to-functions@7.25.9':
+ resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.25.9':
+ resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.26.0':
+ resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-optimise-call-expression@7.25.9':
+ resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-plugin-utils@7.26.5':
+ resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-replace-supers@7.26.5':
+ resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-skip-transparent-expression-wrappers@7.25.9':
+ resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.25.9':
+ resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.25.9':
+ resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.25.9':
+ resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.26.0':
+ resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.26.5':
+ resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-syntax-typescript@7.25.9':
+ resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-typescript@7.26.5':
+ resolution: {integrity: sha512-GJhPO0y8SD5EYVCy2Zr+9dSZcEgaSmq5BLR0Oc25TOEhC+ba49vUAGZFjy8v79z9E1mdldq4x9d1xgh4L1d5dQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/template@7.25.9':
+ resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.26.5':
+ resolution: {integrity: sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.26.5':
+ resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==}
+ engines: {node: '>=6.9.0'}
+
+ '@directus/sdk@18.0.3':
+ resolution: {integrity: sha512-PnEDRDqr2x/DG3HZ3qxU7nFp2nW6zqJqswjii57NhriXgTz4TBUI8NmSdzQvnyHuTL9J0nedYfQGfW4v8odS1A==}
+ engines: {node: '>=18.0.0'}
+
+ '@discoveryjs/json-ext@0.5.7':
+ resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==}
+ engines: {node: '>=10.0.0'}
+
+ '@emnapi/runtime@1.3.1':
+ resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==}
+
+ '@esbuild/aix-ppc64@0.23.1':
+ resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.23.1':
+ resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.23.1':
+ resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.23.1':
+ resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.23.1':
+ resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.23.1':
+ resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.23.1':
+ resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.23.1':
+ resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.23.1':
+ resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.23.1':
+ resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.23.1':
+ resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.23.1':
+ resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.23.1':
+ resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.23.1':
+ resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.23.1':
+ resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.23.1':
+ resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.23.1':
+ resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-x64@0.23.1':
+ resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.23.1':
+ resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.23.1':
+ resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/sunos-x64@0.23.1':
+ resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.23.1':
+ resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.23.1':
+ resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.23.1':
+ resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@eslint-community/eslint-utils@4.4.1':
+ resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+ '@eslint-community/regexpp@4.12.1':
+ resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/config-array@0.19.1':
+ resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/core@0.10.0':
+ resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/eslintrc@3.2.0':
+ resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/js@9.18.0':
+ resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/object-schema@2.1.5':
+ resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/plugin-kit@0.2.5':
+ resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@floating-ui/core@1.6.9':
+ resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==}
+
+ '@floating-ui/dom@1.6.13':
+ resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==}
+
+ '@floating-ui/react-dom@2.1.2':
+ resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@floating-ui/utils@0.2.9':
+ resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
+
+ '@hookform/resolvers@3.10.0':
+ resolution: {integrity: sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==}
+ peerDependencies:
+ react-hook-form: ^7.0.0
+
+ '@humanfs/core@0.19.1':
+ resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.6':
+ resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/retry@0.3.1':
+ resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
+ engines: {node: '>=18.18'}
+
+ '@humanwhocodes/retry@0.4.1':
+ resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==}
+ engines: {node: '>=18.18'}
+
+ '@img/sharp-darwin-arm64@0.33.5':
+ resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-darwin-x64@0.33.5':
+ resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-arm64@1.0.4':
+ resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-x64@1.0.4':
+ resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-linux-arm64@1.0.4':
+ resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-arm@1.0.5':
+ resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==}
+ cpu: [arm]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-s390x@1.0.4':
+ resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-x64@1.0.4':
+ resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.0.4':
+ resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-x64@1.0.4':
+ resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linux-arm64@0.33.5':
+ resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linux-arm@0.33.5':
+ resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@img/sharp-linux-s390x@0.33.5':
+ resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-linux-x64@0.33.5':
+ resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-arm64@0.33.5':
+ resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-x64@0.33.5':
+ resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-wasm32@0.33.5':
+ resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [wasm32]
+
+ '@img/sharp-win32-ia32@0.33.5':
+ resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ia32]
+ os: [win32]
+
+ '@img/sharp-win32-x64@0.33.5':
+ resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@isaacs/cliui@8.0.2':
+ resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+ engines: {node: '>=12'}
+
+ '@jridgewell/gen-mapping@0.3.8':
+ resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/set-array@1.2.1':
+ resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/sourcemap-codec@1.5.0':
+ resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
+ '@jridgewell/trace-mapping@0.3.25':
+ resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+
+ '@next/bundle-analyzer@15.1.4':
+ resolution: {integrity: sha512-W8X96jOW0U5VjLVAkFr1P37kH2f/Ma9zzwgX2o3Omft92pI0XHpFG8Xa9YUT3NlhRJCe4ZKznr1VxhSrFNA+BA==}
+
+ '@next/env@15.1.4':
+ resolution: {integrity: sha512-2fZ5YZjedi5AGaeoaC0B20zGntEHRhi2SdWcu61i48BllODcAmmtj8n7YarSPt4DaTsJaBFdxQAVEVzgmx2Zpw==}
+
+ '@next/eslint-plugin-next@15.1.4':
+ resolution: {integrity: sha512-HwlEXwCK3sr6zmVGEvWBjW9tBFs1Oe6hTmTLoFQtpm4As5HCdu8jfSE0XJOp7uhfEGLniIx8yrGxEWwNnY0fmQ==}
+
+ '@next/swc-darwin-arm64@15.1.4':
+ resolution: {integrity: sha512-wBEMBs+np+R5ozN1F8Y8d/Dycns2COhRnkxRc+rvnbXke5uZBHkUGFgWxfTXn5rx7OLijuUhyfB+gC/ap58dDw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@next/swc-darwin-x64@15.1.4':
+ resolution: {integrity: sha512-7sgf5rM7Z81V9w48F02Zz6DgEJulavC0jadab4ZsJ+K2sxMNK0/BtF8J8J3CxnsJN3DGcIdC260wEKssKTukUw==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@next/swc-linux-arm64-gnu@15.1.4':
+ resolution: {integrity: sha512-JaZlIMNaJenfd55kjaLWMfok+vWBlcRxqnRoZrhFQrhM1uAehP3R0+Aoe+bZOogqlZvAz53nY/k3ZyuKDtT2zQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@next/swc-linux-arm64-musl@15.1.4':
+ resolution: {integrity: sha512-7EBBjNoyTO2ipMDgCiORpwwOf5tIueFntKjcN3NK+GAQD7OzFJe84p7a2eQUeWdpzZvhVXuAtIen8QcH71ZCOQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@next/swc-linux-x64-gnu@15.1.4':
+ resolution: {integrity: sha512-9TGEgOycqZFuADyFqwmK/9g6S0FYZ3tphR4ebcmCwhL8Y12FW8pIBKJvSwV+UBjMkokstGNH+9F8F031JZKpHw==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@next/swc-linux-x64-musl@15.1.4':
+ resolution: {integrity: sha512-0578bLRVDJOh+LdIoKvgNDz77+Bd85c5JrFgnlbI1SM3WmEQvsjxTA8ATu9Z9FCiIS/AliVAW2DV/BDwpXbtiQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@next/swc-win32-arm64-msvc@15.1.4':
+ resolution: {integrity: sha512-JgFCiV4libQavwII+kncMCl30st0JVxpPOtzWcAI2jtum4HjYaclobKhj+JsRu5tFqMtA5CJIa0MvYyuu9xjjQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@next/swc-win32-x64-msvc@15.1.4':
+ resolution: {integrity: sha512-xxsJy9wzq7FR5SqPCUqdgSXiNXrMuidgckBa8nH9HtjjxsilgcN6VgXF6tZ3uEWuVEadotQJI8/9EQ6guTC4Yw==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@nolyfill/is-core-module@1.0.39':
+ resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==}
+ engines: {node: '>=12.4.0'}
+
+ '@pkgjs/parseargs@0.11.0':
+ resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+ engines: {node: '>=14'}
+
+ '@polka/url@1.0.0-next.28':
+ resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
+
+ '@radix-ui/number@1.1.0':
+ resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==}
+
+ '@radix-ui/primitive@1.1.1':
+ resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==}
+
+ '@radix-ui/react-arrow@1.1.1':
+ resolution: {integrity: sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-checkbox@1.1.3':
+ resolution: {integrity: sha512-HD7/ocp8f1B3e6OHygH0n7ZKjONkhciy1Nh0yuBgObqThc3oyx+vuMfFHKAknXRHHWVE9XvXStxJFyjUmB8PIw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-collapsible@1.1.2':
+ resolution: {integrity: sha512-PliMB63vxz7vggcyq0IxNYk8vGDrLXVWw4+W4B8YnwI1s18x7YZYqlG9PLX7XxAJUi0g2DxP4XKJMFHh/iVh9A==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-collection@1.1.1':
+ resolution: {integrity: sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-compose-refs@1.1.1':
+ resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-context@1.1.1':
+ resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-dialog@1.1.4':
+ resolution: {integrity: sha512-Ur7EV1IwQGCyaAuyDRiOLA5JIUZxELJljF+MbM/2NC0BYwfuRrbpS30BiQBJrVruscgUkieKkqXYDOoByaxIoA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-direction@1.1.0':
+ resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-dismissable-layer@1.1.3':
+ resolution: {integrity: sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-dropdown-menu@2.1.4':
+ resolution: {integrity: sha512-iXU1Ab5ecM+yEepGAWK8ZhMyKX4ubFdCNtol4sT9D0OVErG9PNElfx3TQhjw7n7BC5nFVz68/5//clWy+8TXzA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-focus-guards@1.1.1':
+ resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-focus-scope@1.1.1':
+ resolution: {integrity: sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-id@1.1.0':
+ resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-label@2.1.1':
+ resolution: {integrity: sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-menu@2.1.4':
+ resolution: {integrity: sha512-BnOgVoL6YYdHAG6DtXONaR29Eq4nvbi8rutrV/xlr3RQCMMb3yqP85Qiw/3NReozrSW+4dfLkK+rc1hb4wPU/A==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-navigation-menu@1.2.3':
+ resolution: {integrity: sha512-IQWAsQ7dsLIYDrn0WqPU+cdM7MONTv9nqrLVYoie3BPiabSfUVDe6Fr+oEt0Cofsr9ONDcDe9xhmJbL1Uq1yKg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-popper@1.2.1':
+ resolution: {integrity: sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-portal@1.1.3':
+ resolution: {integrity: sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-presence@1.1.2':
+ resolution: {integrity: sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-primitive@2.0.1':
+ resolution: {integrity: sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-radio-group@1.2.2':
+ resolution: {integrity: sha512-E0MLLGfOP0l8P/NxgVzfXJ8w3Ch8cdO6UDzJfDChu4EJDy+/WdO5LqpdY8PYnCErkmZH3gZhDL1K7kQ41fAHuQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-roving-focus@1.1.1':
+ resolution: {integrity: sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-select@2.1.4':
+ resolution: {integrity: sha512-pOkb2u8KgO47j/h7AylCj7dJsm69BXcjkrvTqMptFqsE2i0p8lHkfgneXKjAgPzBMivnoMyt8o4KiV4wYzDdyQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-separator@1.1.1':
+ resolution: {integrity: sha512-RRiNRSrD8iUiXriq/Y5n4/3iE8HzqgLHsusUSg5jVpU2+3tqcUFPJXHDymwEypunc2sWxDUS3UC+rkZRlHedsw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-slot@1.1.1':
+ resolution: {integrity: sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-tooltip@1.1.6':
+ resolution: {integrity: sha512-TLB5D8QLExS1uDn7+wH/bjEmRurNMTzNrtq7IjaS4kjion9NtzsTGkvR5+i7yc9q01Pi2KMM2cN3f8UG4IvvXA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-use-callback-ref@1.1.0':
+ resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-controllable-state@1.1.0':
+ resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-escape-keydown@1.1.0':
+ resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-layout-effect@1.1.0':
+ resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-previous@1.1.0':
+ resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-rect@1.1.0':
+ resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-size@1.1.0':
+ resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-visually-hidden@1.1.1':
+ resolution: {integrity: sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/rect@1.1.0':
+ resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==}
+
+ '@rtsao/scc@1.1.0':
+ resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
+
+ '@rushstack/eslint-patch@1.10.5':
+ resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==}
+
+ '@swc/counter@0.1.3':
+ resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
+
+ '@swc/helpers@0.5.15':
+ resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
+
+ '@tailwindcss/typography@0.5.16':
+ resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1'
+
+ '@trivago/prettier-plugin-sort-imports@5.2.1':
+ resolution: {integrity: sha512-NDZndt0fmVThIx/8cExuJHLZagUVzfGCoVrwH9x6aZvwfBdkrDFTYujecek6X2WpG4uUFsVaPg5+aNQPSyjcmw==}
+ engines: {node: '>18.12'}
+ peerDependencies:
+ '@vue/compiler-sfc': 3.x
+ prettier: 2.x - 3.x
+ prettier-plugin-svelte: 3.x
+ svelte: 4.x || 5.x
+ peerDependenciesMeta:
+ '@vue/compiler-sfc':
+ optional: true
+ prettier-plugin-svelte:
+ optional: true
+ svelte:
+ optional: true
+
+ '@ts-morph/common@0.19.0':
+ resolution: {integrity: sha512-Unz/WHmd4pGax91rdIKWi51wnVUW11QttMEPpBiBgIewnc9UQIX7UDLxr5vRlqeByXCwhkF6VabSsI0raWcyAQ==}
+
+ '@types/estree@1.0.6':
+ resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/json5@0.0.29':
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+
+ '@types/node@22.10.6':
+ resolution: {integrity: sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==}
+
+ '@types/react-dom@19.0.3':
+ resolution: {integrity: sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==}
+ peerDependencies:
+ '@types/react': ^19.0.0
+
+ '@types/react@19.0.7':
+ resolution: {integrity: sha512-MoFsEJKkAtZCrC1r6CM8U22GzhG7u2Wir8ons/aCKH6MBdD1ibV24zOSSkdZVUKqN5i396zG5VKLYZ3yaUZdLA==}
+
+ '@typescript-eslint/eslint-plugin@8.20.0':
+ resolution: {integrity: sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/parser@8.20.0':
+ resolution: {integrity: sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/scope-manager@8.20.0':
+ resolution: {integrity: sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/type-utils@8.20.0':
+ resolution: {integrity: sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/types@8.20.0':
+ resolution: {integrity: sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@8.20.0':
+ resolution: {integrity: sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/utils@8.20.0':
+ resolution: {integrity: sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/visitor-keys@8.20.0':
+ resolution: {integrity: sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn-walk@8.3.4:
+ resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
+ engines: {node: '>=0.4.0'}
+
+ acorn@8.14.0:
+ resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ agent-base@7.1.3:
+ resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==}
+ engines: {node: '>= 14'}
+
+ ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@6.1.0:
+ resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
+ engines: {node: '>=12'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ ansi-styles@6.2.1:
+ resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+ engines: {node: '>=12'}
+
+ any-promise@1.3.0:
+ resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
+ arg@5.0.2:
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ aria-hidden@1.2.4:
+ resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
+ engines: {node: '>=10'}
+
+ aria-query@5.3.2:
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ engines: {node: '>= 0.4'}
+
+ array-buffer-byte-length@1.0.2:
+ resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
+ engines: {node: '>= 0.4'}
+
+ array-includes@3.1.8:
+ resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.findlast@1.2.5:
+ resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.findlastindex@1.2.5:
+ resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.flat@1.3.3:
+ resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.flatmap@1.3.3:
+ resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.tosorted@1.1.4:
+ resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==}
+ engines: {node: '>= 0.4'}
+
+ arraybuffer.prototype.slice@1.0.4:
+ resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
+ engines: {node: '>= 0.4'}
+
+ ast-types-flow@0.0.8:
+ resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
+
+ ast-types@0.16.1:
+ resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==}
+ engines: {node: '>=4'}
+
+ available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+ engines: {node: '>= 0.4'}
+
+ axe-core@4.10.2:
+ resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==}
+ engines: {node: '>=4'}
+
+ axobject-query@4.1.0:
+ resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
+ engines: {node: '>= 0.4'}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
+ bl@5.1.0:
+ resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==}
+
+ brace-expansion@1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+
+ brace-expansion@2.0.1:
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ browserslist@4.24.4:
+ resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ buffer@6.0.3:
+ resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+
+ busboy@1.6.0:
+ resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
+ engines: {node: '>=10.16.0'}
+
+ call-bind-apply-helpers@1.0.1:
+ resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==}
+ engines: {node: '>= 0.4'}
+
+ call-bind@1.0.8:
+ resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
+ engines: {node: '>= 0.4'}
+
+ call-bound@1.0.3:
+ resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==}
+ engines: {node: '>= 0.4'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ camelcase-css@2.0.1:
+ resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
+ engines: {node: '>= 6'}
+
+ caniuse-lite@1.0.30001692:
+ resolution: {integrity: sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ chalk@5.4.1:
+ resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+ chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+
+ class-variance-authority@0.7.1:
+ resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
+
+ cli-cursor@4.0.0:
+ resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ cli-spinners@2.9.2:
+ resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+ engines: {node: '>=6'}
+
+ client-only@0.0.1:
+ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
+
+ clone@1.0.4:
+ resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+ engines: {node: '>=0.8'}
+
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
+ cmdk@1.0.4:
+ resolution: {integrity: sha512-AnsjfHyHpQ/EFeAnG216WY7A5LiYCoZzCSygiLvfXC3H3LFGCprErteUcszaVluGOhuOTbJS3jWHrSDYPBBygg==}
+ peerDependencies:
+ react: ^18 || ^19 || ^19.0.0-rc
+ react-dom: ^18 || ^19 || ^19.0.0-rc
+
+ code-block-writer@12.0.0:
+ resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ color-string@1.9.1:
+ resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+
+ color@4.2.3:
+ resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
+ engines: {node: '>=12.5.0'}
+
+ commander@10.0.1:
+ resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
+ engines: {node: '>=14'}
+
+ commander@4.1.1:
+ resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
+ engines: {node: '>= 6'}
+
+ commander@7.2.0:
+ resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+ engines: {node: '>= 10'}
+
+ commander@8.3.0:
+ resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
+ engines: {node: '>= 12'}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ cosmiconfig@8.3.6:
+ resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ damerau-levenshtein@1.0.8:
+ resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
+
+ data-uri-to-buffer@4.0.1:
+ resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
+ engines: {node: '>= 12'}
+
+ data-view-buffer@1.0.2:
+ resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-length@1.0.2:
+ resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-offset@1.0.1:
+ resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
+ engines: {node: '>= 0.4'}
+
+ debounce@1.2.1:
+ resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==}
+
+ debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.4.0:
+ resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+ deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+
+ defaults@1.0.4:
+ resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+
+ define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+ engines: {node: '>= 0.4'}
+
+ define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+ engines: {node: '>= 0.4'}
+
+ detect-libc@2.0.3:
+ resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
+ engines: {node: '>=8'}
+
+ detect-node-es@1.1.0:
+ resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
+
+ didyoumean@1.2.2:
+ resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
+
+ diff@5.2.0:
+ resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==}
+ engines: {node: '>=0.3.1'}
+
+ directus-sdk-typegen@0.1.9:
+ resolution: {integrity: sha512-7VXKNFKFlE8J7wSWGnNxcNAqS77YXqASrebWOvgU8hVCch3iobj3nJqYHsSqZKtrFhCZviJW8L+njcXiDtcDhQ==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
+ dlv@1.1.3:
+ resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+
+ doctrine@2.1.0:
+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+ engines: {node: '>=0.10.0'}
+
+ dotenv@16.4.7:
+ resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==}
+ engines: {node: '>=12'}
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ duplexer@0.1.2:
+ resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
+
+ eastasianwidth@0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+ electron-to-chromium@1.5.82:
+ resolution: {integrity: sha512-Zq16uk1hfQhyGx5GpwPAYDwddJuSGhtRhgOA2mCxANYaDT79nAeGnaXogMGng4KqLaJUVnOnuL0+TDop9nLOiA==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+ enhanced-resolve@5.18.0:
+ resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==}
+ engines: {node: '>=10.13.0'}
+
+ error-ex@1.3.2:
+ resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+
+ es-abstract@1.23.9:
+ resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==}
+ engines: {node: '>= 0.4'}
+
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-iterator-helpers@1.2.1:
+ resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==}
+ engines: {node: '>= 0.4'}
+
+ es-object-atoms@1.1.0:
+ resolution: {integrity: sha512-Ujz8Al/KfOVR7fkaghAB1WvnLsdYxHDWmfoi2vlA2jZWRg31XhIC1a4B+/I24muD8iSbHxJ1JkrfqmWb65P/Mw==}
+ engines: {node: '>= 0.4'}
+
+ es-set-tostringtag@2.1.0:
+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+ engines: {node: '>= 0.4'}
+
+ es-shim-unscopables@1.0.2:
+ resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==}
+
+ es-to-primitive@1.3.0:
+ resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
+ engines: {node: '>= 0.4'}
+
+ esbuild@0.23.1:
+ resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ eslint-config-next@15.1.4:
+ resolution: {integrity: sha512-u9+7lFmfhKNgGjhQ9tBeyCFsPJyq0SvGioMJBngPC7HXUpR0U+ckEwQR48s7TrRNHra1REm6evGL2ie38agALg==}
+ peerDependencies:
+ eslint: ^7.23.0 || ^8.0.0 || ^9.0.0
+ typescript: '>=3.3.1'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ eslint-config-prettier@10.0.1:
+ resolution: {integrity: sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==}
+ hasBin: true
+ peerDependencies:
+ eslint: '>=7.0.0'
+
+ eslint-import-resolver-node@0.3.9:
+ resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
+
+ eslint-import-resolver-typescript@3.7.0:
+ resolution: {integrity: sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ eslint-plugin-import: '*'
+ eslint-plugin-import-x: '*'
+ peerDependenciesMeta:
+ eslint-plugin-import:
+ optional: true
+ eslint-plugin-import-x:
+ optional: true
+
+ eslint-module-utils@2.12.0:
+ resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: '*'
+ eslint-import-resolver-node: '*'
+ eslint-import-resolver-typescript: '*'
+ eslint-import-resolver-webpack: '*'
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ eslint:
+ optional: true
+ eslint-import-resolver-node:
+ optional: true
+ eslint-import-resolver-typescript:
+ optional: true
+ eslint-import-resolver-webpack:
+ optional: true
+
+ eslint-plugin-import@2.31.0:
+ resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+
+ eslint-plugin-jsx-a11y@6.10.2:
+ resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9
+
+ eslint-plugin-promise@7.2.1:
+ resolution: {integrity: sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
+
+ eslint-plugin-react-hooks@5.1.0:
+ resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0
+
+ eslint-plugin-react@7.37.4:
+ resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
+
+ eslint-plugin-tailwindcss@3.17.5:
+ resolution: {integrity: sha512-8Mi7p7dm+mO1dHgRHHFdPu4RDTBk69Cn4P0B40vRQR+MrguUpwmKwhZy1kqYe3Km8/4nb+cyrCF+5SodOEmaow==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ tailwindcss: ^3.4.0
+
+ eslint-scope@8.2.0:
+ resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-visitor-keys@4.2.0:
+ resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint@9.18.0:
+ resolution: {integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+
+ espree@10.3.0:
+ resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ esquery@1.6.0:
+ resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ eventemitter3@5.0.1:
+ resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+
+ execa@7.2.0:
+ resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==}
+ engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-glob@3.3.1:
+ resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==}
+ engines: {node: '>=8.6.0'}
+
+ fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+ engines: {node: '>=8.6.0'}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fastq@1.18.0:
+ resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==}
+
+ fetch-blob@3.2.0:
+ resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
+ engines: {node: ^12.20 || >= 14.13}
+
+ file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ flat-cache@4.0.1:
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+ engines: {node: '>=16'}
+
+ flatted@3.3.2:
+ resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==}
+
+ for-each@0.3.3:
+ resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+
+ foreground-child@3.3.0:
+ resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
+ engines: {node: '>=14'}
+
+ formdata-polyfill@4.0.10:
+ resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
+ engines: {node: '>=12.20.0'}
+
+ fs-extra@11.2.0:
+ resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
+ engines: {node: '>=14.14'}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ function.prototype.name@1.1.8:
+ resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
+ engines: {node: '>= 0.4'}
+
+ functions-have-names@1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ get-intrinsic@1.2.7:
+ resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==}
+ engines: {node: '>= 0.4'}
+
+ get-nonce@1.0.1:
+ resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
+ engines: {node: '>=6'}
+
+ get-own-enumerable-keys@1.0.0:
+ resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==}
+ engines: {node: '>=14.16'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ get-stream@6.0.1:
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ engines: {node: '>=10'}
+
+ get-symbol-description@1.1.0:
+ resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
+ engines: {node: '>= 0.4'}
+
+ get-tsconfig@4.8.1:
+ resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==}
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ glob@10.4.5:
+ resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
+ hasBin: true
+
+ globals@11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+
+ globals@14.0.0:
+ resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+ engines: {node: '>=18'}
+
+ globals@15.14.0:
+ resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==}
+ engines: {node: '>=18'}
+
+ globalthis@1.0.4:
+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+ engines: {node: '>= 0.4'}
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+
+ gzip-size@6.0.0:
+ resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==}
+ engines: {node: '>=10'}
+
+ has-bigints@1.1.0:
+ resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
+ engines: {node: '>= 0.4'}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ has-property-descriptors@1.0.2:
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+
+ has-proto@1.2.0:
+ resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
+ engines: {node: '>= 0.4'}
+
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
+ has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+
+ hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+
+ html-escaper@2.0.2:
+ resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+
+ https-proxy-agent@6.2.1:
+ resolution: {integrity: sha512-ONsE3+yfZF2caH5+bJlcddtWqNI3Gvs5A38+ngvljxaBiRXRswym2c7yf8UAeFpRFKjFNHIFEHqR/OLAWJzyiA==}
+ engines: {node: '>= 14'}
+
+ human-signals@4.3.1:
+ resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==}
+ engines: {node: '>=14.18.0'}
+
+ ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ import-fresh@3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ internal-slot@1.1.0:
+ resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
+ engines: {node: '>= 0.4'}
+
+ is-array-buffer@3.0.5:
+ resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
+ engines: {node: '>= 0.4'}
+
+ is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ is-arrayish@0.3.2:
+ resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
+
+ is-async-function@2.1.0:
+ resolution: {integrity: sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==}
+ engines: {node: '>= 0.4'}
+
+ is-bigint@1.1.0:
+ resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
+ engines: {node: '>= 0.4'}
+
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
+ is-boolean-object@1.2.1:
+ resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==}
+ engines: {node: '>= 0.4'}
+
+ is-bun-module@1.3.0:
+ resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==}
+
+ is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+
+ is-core-module@2.16.1:
+ resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
+ engines: {node: '>= 0.4'}
+
+ is-data-view@1.0.2:
+ resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
+ engines: {node: '>= 0.4'}
+
+ is-date-object@1.1.0:
+ resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
+ engines: {node: '>= 0.4'}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-finalizationregistry@1.1.1:
+ resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
+ engines: {node: '>= 0.4'}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-generator-function@1.1.0:
+ resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==}
+ engines: {node: '>= 0.4'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-interactive@2.0.0:
+ resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==}
+ engines: {node: '>=12'}
+
+ is-map@2.0.3:
+ resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+ engines: {node: '>= 0.4'}
+
+ is-number-object@1.1.1:
+ resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
+ engines: {node: '>= 0.4'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ is-obj@3.0.0:
+ resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==}
+ engines: {node: '>=12'}
+
+ is-plain-object@5.0.0:
+ resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
+ engines: {node: '>=0.10.0'}
+
+ is-regex@1.2.1:
+ resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
+ engines: {node: '>= 0.4'}
+
+ is-regexp@3.1.0:
+ resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==}
+ engines: {node: '>=12'}
+
+ is-set@2.0.3:
+ resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+ engines: {node: '>= 0.4'}
+
+ is-shared-array-buffer@1.0.4:
+ resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
+ engines: {node: '>= 0.4'}
+
+ is-stream@3.0.0:
+ resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ is-string@1.1.1:
+ resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
+ engines: {node: '>= 0.4'}
+
+ is-symbol@1.1.1:
+ resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
+ engines: {node: '>= 0.4'}
+
+ is-typed-array@1.1.15:
+ resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
+ engines: {node: '>= 0.4'}
+
+ is-unicode-supported@1.3.0:
+ resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==}
+ engines: {node: '>=12'}
+
+ is-weakmap@2.0.2:
+ resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+ engines: {node: '>= 0.4'}
+
+ is-weakref@1.1.0:
+ resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==}
+ engines: {node: '>= 0.4'}
+
+ is-weakset@2.0.4:
+ resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
+ engines: {node: '>= 0.4'}
+
+ isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ iterator.prototype@1.1.5:
+ resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==}
+ engines: {node: '>= 0.4'}
+
+ jackspeak@3.4.3:
+ resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+
+ javascript-natural-sort@0.7.1:
+ resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==}
+
+ jiti@1.21.7:
+ resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
+ hasBin: true
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ hasBin: true
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsonfile@6.1.0:
+ resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+
+ jsx-ast-utils@3.3.5:
+ resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
+ engines: {node: '>=4.0'}
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ kleur@3.0.3:
+ resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
+ engines: {node: '>=6'}
+
+ kleur@4.1.5:
+ resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
+ engines: {node: '>=6'}
+
+ language-subtag-registry@0.3.23:
+ resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==}
+
+ language-tags@1.0.9:
+ resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==}
+ engines: {node: '>=0.10'}
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ lilconfig@3.1.3:
+ resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
+ engines: {node: '>=14'}
+
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ lodash._reinterpolate@3.0.0:
+ resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==}
+
+ lodash.castarray@4.4.0:
+ resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==}
+
+ lodash.isplainobject@4.0.6:
+ resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ lodash.template@4.5.0:
+ resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==}
+
+ lodash.templatesettings@4.2.0:
+ resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==}
+
+ lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ log-symbols@5.1.0:
+ resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==}
+ engines: {node: '>=12'}
+
+ loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+
+ lru-cache@10.4.3:
+ resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ lucide-react@0.471.1:
+ resolution: {integrity: sha512-syOxwPhf62gg2YOsz72HRn+CIpeudFy67AeKnSR8Hn/fIIF4ubhNbRF+pQ2CaJrl+X9Os4PL87z2DXQi3DVeDA==}
+ peerDependencies:
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
+ mimic-fn@2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+
+ mimic-fn@4.0.0:
+ resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+ engines: {node: '>=12'}
+
+ minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+ minimatch@7.4.6:
+ resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==}
+ engines: {node: '>=10'}
+
+ minimatch@9.0.5:
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ minipass@7.1.2:
+ resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ mkdirp@2.1.6:
+ resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ mrmime@2.0.0:
+ resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
+ engines: {node: '>=10'}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ mz@2.7.0:
+ resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
+
+ nanoid@3.3.8:
+ resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ next-themes@0.4.4:
+ resolution: {integrity: sha512-LDQ2qIOJF0VnuVrrMSMLrWGjRMkq+0mpgl6e0juCLqdJ+oo8Q84JRWT6Wh11VDQKkMMe+dVzDKLWs5n87T+PkQ==}
+ peerDependencies:
+ react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
+
+ next@15.1.4:
+ resolution: {integrity: sha512-mTaq9dwaSuwwOrcu3ebjDYObekkxRnXpuVL21zotM8qE2W0HBOdVIdg2Li9QjMEZrj73LN96LcWcz62V19FjAg==}
+ engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@opentelemetry/api': ^1.1.0
+ '@playwright/test': ^1.41.2
+ babel-plugin-react-compiler: '*'
+ react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ sass: ^1.3.0
+ peerDependenciesMeta:
+ '@opentelemetry/api':
+ optional: true
+ '@playwright/test':
+ optional: true
+ babel-plugin-react-compiler:
+ optional: true
+ sass:
+ optional: true
+
+ node-domexception@1.0.0:
+ resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
+ engines: {node: '>=10.5.0'}
+
+ node-fetch@3.3.2:
+ resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ node-releases@2.0.19:
+ resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ npm-run-path@5.3.0:
+ resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ object-hash@3.0.0:
+ resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
+ engines: {node: '>= 6'}
+
+ object-inspect@1.13.3:
+ resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==}
+ engines: {node: '>= 0.4'}
+
+ object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+
+ object.assign@4.1.7:
+ resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
+ engines: {node: '>= 0.4'}
+
+ object.entries@1.1.8:
+ resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==}
+ engines: {node: '>= 0.4'}
+
+ object.fromentries@2.0.8:
+ resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
+ engines: {node: '>= 0.4'}
+
+ object.groupby@1.0.3:
+ resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
+ engines: {node: '>= 0.4'}
+
+ object.values@1.2.1:
+ resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
+ engines: {node: '>= 0.4'}
+
+ onetime@5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+
+ onetime@6.0.0:
+ resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+ engines: {node: '>=12'}
+
+ opener@1.5.2:
+ resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==}
+ hasBin: true
+
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ ora@6.3.1:
+ resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ own-keys@1.0.1:
+ resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
+ engines: {node: '>= 0.4'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ p-queue@8.0.1:
+ resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==}
+ engines: {node: '>=18'}
+
+ p-timeout@6.1.4:
+ resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==}
+ engines: {node: '>=14.16'}
+
+ package-json-from-dist@1.0.1:
+ resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+
+ path-browserify@1.0.1:
+ resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-key@4.0.0:
+ resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+ engines: {node: '>=12'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ path-scurry@1.11.1:
+ resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+ engines: {node: '>=16 || 14 >=14.18'}
+
+ path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ pify@2.3.0:
+ resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+ engines: {node: '>=0.10.0'}
+
+ pirates@4.0.6:
+ resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
+ engines: {node: '>= 6'}
+
+ possible-typed-array-names@1.0.0:
+ resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
+ engines: {node: '>= 0.4'}
+
+ postcss-import@15.1.0:
+ resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ postcss: ^8.0.0
+
+ postcss-js@4.0.1:
+ resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
+ engines: {node: ^12 || ^14 || >= 16}
+ peerDependencies:
+ postcss: ^8.4.21
+
+ postcss-load-config@4.0.2:
+ resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
+ engines: {node: '>= 14'}
+ peerDependencies:
+ postcss: '>=8.0.9'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+ ts-node:
+ optional: true
+
+ postcss-nested@6.2.0:
+ resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.2.14
+
+ postcss-selector-parser@6.0.10:
+ resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
+ engines: {node: '>=4'}
+
+ postcss-selector-parser@6.1.2:
+ resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
+ engines: {node: '>=4'}
+
+ postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
+ postcss@8.4.31:
+ resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ postcss@8.5.1:
+ resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ prettier-plugin-tailwindcss@0.6.9:
+ resolution: {integrity: sha512-r0i3uhaZAXYP0At5xGfJH876W3HHGHDp+LCRUJrs57PBeQ6mYHMwr25KH8NPX44F2yGTvdnH7OqCshlQx183Eg==}
+ engines: {node: '>=14.21.3'}
+ peerDependencies:
+ '@ianvs/prettier-plugin-sort-imports': '*'
+ '@prettier/plugin-pug': '*'
+ '@shopify/prettier-plugin-liquid': '*'
+ '@trivago/prettier-plugin-sort-imports': '*'
+ '@zackad/prettier-plugin-twig-melody': '*'
+ prettier: ^3.0
+ prettier-plugin-astro: '*'
+ prettier-plugin-css-order: '*'
+ prettier-plugin-import-sort: '*'
+ prettier-plugin-jsdoc: '*'
+ prettier-plugin-marko: '*'
+ prettier-plugin-multiline-arrays: '*'
+ prettier-plugin-organize-attributes: '*'
+ prettier-plugin-organize-imports: '*'
+ prettier-plugin-sort-imports: '*'
+ prettier-plugin-style-order: '*'
+ prettier-plugin-svelte: '*'
+ peerDependenciesMeta:
+ '@ianvs/prettier-plugin-sort-imports':
+ optional: true
+ '@prettier/plugin-pug':
+ optional: true
+ '@shopify/prettier-plugin-liquid':
+ optional: true
+ '@trivago/prettier-plugin-sort-imports':
+ optional: true
+ '@zackad/prettier-plugin-twig-melody':
+ optional: true
+ prettier-plugin-astro:
+ optional: true
+ prettier-plugin-css-order:
+ optional: true
+ prettier-plugin-import-sort:
+ optional: true
+ prettier-plugin-jsdoc:
+ optional: true
+ prettier-plugin-marko:
+ optional: true
+ prettier-plugin-multiline-arrays:
+ optional: true
+ prettier-plugin-organize-attributes:
+ optional: true
+ prettier-plugin-organize-imports:
+ optional: true
+ prettier-plugin-sort-imports:
+ optional: true
+ prettier-plugin-style-order:
+ optional: true
+ prettier-plugin-svelte:
+ optional: true
+
+ prettier@3.4.2:
+ resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ prompts@2.4.2:
+ resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+ engines: {node: '>= 6'}
+
+ prop-types@15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ react-dom@19.0.0:
+ resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==}
+ peerDependencies:
+ react: ^19.0.0
+
+ react-hook-form@7.54.2:
+ resolution: {integrity: sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ react: ^16.8.0 || ^17 || ^18 || ^19
+
+ react-is@16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+
+ react-remove-scroll-bar@2.3.8:
+ resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react-remove-scroll@2.6.2:
+ resolution: {integrity: sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw==}
+ 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
+
+ react-style-singleton@2.2.3:
+ resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==}
+ 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
+
+ react@19.0.0:
+ resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==}
+ engines: {node: '>=0.10.0'}
+
+ read-cache@1.0.0:
+ resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+
+ recast@0.23.9:
+ resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==}
+ engines: {node: '>= 4'}
+
+ reflect.getprototypeof@1.0.10:
+ resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
+ engines: {node: '>= 0.4'}
+
+ regexp.prototype.flags@1.5.4:
+ resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
+ engines: {node: '>= 0.4'}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ resolve@1.22.10:
+ resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
+ resolve@2.0.0-next.5:
+ resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==}
+ hasBin: true
+
+ restore-cursor@4.0.0:
+ resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ reusify@1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ safe-array-concat@1.1.3:
+ resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
+ engines: {node: '>=0.4'}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safe-push-apply@1.0.0:
+ resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
+ engines: {node: '>= 0.4'}
+
+ safe-regex-test@1.1.0:
+ resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
+ engines: {node: '>= 0.4'}
+
+ scheduler@0.25.0:
+ resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==}
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ semver@7.6.3:
+ resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+ engines: {node: '>= 0.4'}
+
+ set-function-name@2.0.2:
+ resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+ engines: {node: '>= 0.4'}
+
+ set-proto@1.0.0:
+ resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
+ engines: {node: '>= 0.4'}
+
+ shadcn@2.1.8:
+ resolution: {integrity: sha512-UxNK1O/3otO5joqc113+tVZuSFHvVNaDjVakqCjhW89RpRSObRMBaSaaC6jvG70DhR8dJ35l907w1keUrGmWAw==}
+ hasBin: true
+
+ sharp@0.33.5:
+ resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ side-channel-list@1.0.0:
+ resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+
+ side-channel@1.1.0:
+ resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+ engines: {node: '>= 0.4'}
+
+ signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+ signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
+
+ simple-swizzle@0.2.2:
+ resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
+
+ sirv@2.0.4:
+ resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==}
+ engines: {node: '>= 10'}
+
+ sisteransi@1.0.5:
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ stable-hash@0.0.4:
+ resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==}
+
+ stdin-discarder@0.1.0:
+ resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ streamsearch@1.1.0:
+ resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
+ engines: {node: '>=10.0.0'}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string-width@5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+
+ string.prototype.includes@2.0.1:
+ resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.matchall@4.0.12:
+ resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.repeat@1.0.0:
+ resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==}
+
+ string.prototype.trim@1.2.10:
+ resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimend@1.0.9:
+ resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimstart@1.0.8:
+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+ engines: {node: '>= 0.4'}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ stringify-object@5.0.0:
+ resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==}
+ engines: {node: '>=14.16'}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-ansi@7.1.0:
+ resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+ engines: {node: '>=12'}
+
+ strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+
+ strip-final-newline@3.0.0:
+ resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+ engines: {node: '>=12'}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ styled-jsx@5.1.6:
+ resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
+ engines: {node: '>= 12.0.0'}
+ peerDependencies:
+ '@babel/core': '*'
+ babel-plugin-macros: '*'
+ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ babel-plugin-macros:
+ optional: true
+
+ sucrase@3.35.0:
+ resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ hasBin: true
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ tailwind-merge@2.6.0:
+ resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==}
+
+ tailwindcss-animate@1.0.7:
+ resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || insiders'
+
+ tailwindcss@3.4.17:
+ resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+
+ tapable@2.2.1:
+ resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
+ engines: {node: '>=6'}
+
+ thenify-all@1.6.0:
+ resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
+ engines: {node: '>=0.8'}
+
+ thenify@3.3.1:
+ resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+
+ tiny-invariant@1.3.3:
+ resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ totalist@3.0.1:
+ resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
+ engines: {node: '>=6'}
+
+ ts-api-utils@2.0.0:
+ resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==}
+ engines: {node: '>=18.12'}
+ peerDependencies:
+ typescript: '>=4.8.4'
+
+ ts-interface-checker@0.1.13:
+ resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
+
+ ts-morph@18.0.0:
+ resolution: {integrity: sha512-Kg5u0mk19PIIe4islUI/HWRvm9bC1lHejK4S0oh1zaZ77TMZAEmQC0sHQYiu2RgCQFZKXz1fMVi/7nOOeirznA==}
+
+ tsconfig-paths@3.15.0:
+ resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+
+ tsconfig-paths@4.2.0:
+ resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==}
+ engines: {node: '>=6'}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ tsx@4.19.2:
+ resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ typed-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-length@1.0.3:
+ resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-offset@1.0.4:
+ resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-length@1.0.7:
+ resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
+ engines: {node: '>= 0.4'}
+
+ typescript-eslint@8.20.0:
+ resolution: {integrity: sha512-Kxz2QRFsgbWj6Xcftlw3Dd154b3cEPFqQC+qMZrMypSijPd4UanKKvoKDrJ4o8AIfZFKAF+7sMaEIR8mTElozA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ typescript@5.7.3:
+ resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ unbox-primitive@1.1.0:
+ resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
+ engines: {node: '>= 0.4'}
+
+ undici-types@6.20.0:
+ resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
+
+ universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+
+ update-browserslist-db@1.1.2:
+ resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ use-callback-ref@1.3.3:
+ resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==}
+ 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
+
+ use-sidecar@1.1.3:
+ resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==}
+ 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
+
+ use-sync-external-store@1.4.0:
+ resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ wcwidth@1.0.1:
+ resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+
+ web-streams-polyfill@3.3.3:
+ resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
+ engines: {node: '>= 8'}
+
+ webpack-bundle-analyzer@4.10.1:
+ resolution: {integrity: sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==}
+ engines: {node: '>= 10.13.0'}
+ hasBin: true
+
+ which-boxed-primitive@1.1.1:
+ resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
+ engines: {node: '>= 0.4'}
+
+ which-builtin-type@1.2.1:
+ resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
+ engines: {node: '>= 0.4'}
+
+ which-collection@1.0.2:
+ resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+ engines: {node: '>= 0.4'}
+
+ which-typed-array@1.1.18:
+ resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==}
+ engines: {node: '>= 0.4'}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+
+ wrap-ansi@8.1.0:
+ resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+ engines: {node: '>=12'}
+
+ ws@7.5.10:
+ resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==}
+ 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
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yaml@2.7.0:
+ resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==}
+ engines: {node: '>= 14'}
+ hasBin: true
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+ zod@3.24.1:
+ resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==}
+
+snapshots:
+
+ '@alloc/quick-lru@5.2.0': {}
+
+ '@ampproject/remapping@2.3.0':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.8
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@antfu/ni@0.21.12': {}
+
+ '@babel/code-frame@7.26.2':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.25.9
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/compat-data@7.26.5': {}
+
+ '@babel/core@7.26.0':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.26.2
+ '@babel/generator': 7.26.5
+ '@babel/helper-compilation-targets': 7.26.5
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helpers': 7.26.0
+ '@babel/parser': 7.26.5
+ '@babel/template': 7.25.9
+ '@babel/traverse': 7.26.5
+ '@babel/types': 7.26.5
+ convert-source-map: 2.0.0
+ debug: 4.4.0
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.26.5':
+ dependencies:
+ '@babel/parser': 7.26.5
+ '@babel/types': 7.26.5
+ '@jridgewell/gen-mapping': 0.3.8
+ '@jridgewell/trace-mapping': 0.3.25
+ jsesc: 3.1.0
+
+ '@babel/helper-annotate-as-pure@7.25.9':
+ dependencies:
+ '@babel/types': 7.26.5
+
+ '@babel/helper-compilation-targets@7.26.5':
+ dependencies:
+ '@babel/compat-data': 7.26.5
+ '@babel/helper-validator-option': 7.25.9
+ browserslist: 4.24.4
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-member-expression-to-functions': 7.25.9
+ '@babel/helper-optimise-call-expression': 7.25.9
+ '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.0)
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+ '@babel/traverse': 7.26.5
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-member-expression-to-functions@7.25.9':
+ dependencies:
+ '@babel/traverse': 7.26.5
+ '@babel/types': 7.26.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-imports@7.25.9':
+ dependencies:
+ '@babel/traverse': 7.26.5
+ '@babel/types': 7.26.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+ '@babel/traverse': 7.26.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-optimise-call-expression@7.25.9':
+ dependencies:
+ '@babel/types': 7.26.5
+
+ '@babel/helper-plugin-utils@7.26.5': {}
+
+ '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-member-expression-to-functions': 7.25.9
+ '@babel/helper-optimise-call-expression': 7.25.9
+ '@babel/traverse': 7.26.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-skip-transparent-expression-wrappers@7.25.9':
+ dependencies:
+ '@babel/traverse': 7.26.5
+ '@babel/types': 7.26.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-string-parser@7.25.9': {}
+
+ '@babel/helper-validator-identifier@7.25.9': {}
+
+ '@babel/helper-validator-option@7.25.9': {}
+
+ '@babel/helpers@7.26.0':
+ dependencies:
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.5
+
+ '@babel/parser@7.26.5':
+ dependencies:
+ '@babel/types': 7.26.5
+
+ '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-transform-typescript@7.26.5(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.26.5
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+ '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/template@7.25.9':
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@babel/parser': 7.26.5
+ '@babel/types': 7.26.5
+
+ '@babel/traverse@7.26.5':
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@babel/generator': 7.26.5
+ '@babel/parser': 7.26.5
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.5
+ debug: 4.4.0
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.26.5':
+ dependencies:
+ '@babel/helper-string-parser': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+
+ '@directus/sdk@18.0.3': {}
+
+ '@discoveryjs/json-ext@0.5.7': {}
+
+ '@emnapi/runtime@1.3.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@esbuild/aix-ppc64@0.23.1':
+ optional: true
+
+ '@esbuild/android-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/android-arm@0.23.1':
+ optional: true
+
+ '@esbuild/android-x64@0.23.1':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/darwin-x64@0.23.1':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-arm@0.23.1':
+ optional: true
+
+ '@esbuild/linux-ia32@0.23.1':
+ optional: true
+
+ '@esbuild/linux-loong64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.23.1':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-s390x@0.23.1':
+ optional: true
+
+ '@esbuild/linux-x64@0.23.1':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.23.1':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.23.1':
+ optional: true
+
+ '@esbuild/sunos-x64@0.23.1':
+ optional: true
+
+ '@esbuild/win32-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/win32-ia32@0.23.1':
+ optional: true
+
+ '@esbuild/win32-x64@0.23.1':
+ optional: true
+
+ '@eslint-community/eslint-utils@4.4.1(eslint@9.18.0(jiti@1.21.7))':
+ dependencies:
+ eslint: 9.18.0(jiti@1.21.7)
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.1': {}
+
+ '@eslint/config-array@0.19.1':
+ dependencies:
+ '@eslint/object-schema': 2.1.5
+ debug: 4.4.0
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/core@0.10.0':
+ dependencies:
+ '@types/json-schema': 7.0.15
+
+ '@eslint/eslintrc@3.2.0':
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.4.0
+ espree: 10.3.0
+ globals: 14.0.0
+ ignore: 5.3.2
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/js@9.18.0': {}
+
+ '@eslint/object-schema@2.1.5': {}
+
+ '@eslint/plugin-kit@0.2.5':
+ dependencies:
+ '@eslint/core': 0.10.0
+ levn: 0.4.1
+
+ '@floating-ui/core@1.6.9':
+ dependencies:
+ '@floating-ui/utils': 0.2.9
+
+ '@floating-ui/dom@1.6.13':
+ dependencies:
+ '@floating-ui/core': 1.6.9
+ '@floating-ui/utils': 0.2.9
+
+ '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@floating-ui/dom': 1.6.13
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+
+ '@floating-ui/utils@0.2.9': {}
+
+ '@hookform/resolvers@3.10.0(react-hook-form@7.54.2(react@19.0.0))':
+ dependencies:
+ react-hook-form: 7.54.2(react@19.0.0)
+
+ '@humanfs/core@0.19.1': {}
+
+ '@humanfs/node@0.16.6':
+ dependencies:
+ '@humanfs/core': 0.19.1
+ '@humanwhocodes/retry': 0.3.1
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/retry@0.3.1': {}
+
+ '@humanwhocodes/retry@0.4.1': {}
+
+ '@img/sharp-darwin-arm64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.0.4
+ optional: true
+
+ '@img/sharp-darwin-x64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.0.4
+ optional: true
+
+ '@img/sharp-libvips-darwin-arm64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-darwin-x64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm@1.0.5':
+ optional: true
+
+ '@img/sharp-libvips-linux-s390x@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-x64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-x64@1.0.4':
+ optional: true
+
+ '@img/sharp-linux-arm64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.0.4
+ optional: true
+
+ '@img/sharp-linux-arm@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.0.5
+ optional: true
+
+ '@img/sharp-linux-s390x@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.0.4
+ optional: true
+
+ '@img/sharp-linux-x64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.0.4
+ optional: true
+
+ '@img/sharp-linuxmusl-arm64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.0.4
+ optional: true
+
+ '@img/sharp-linuxmusl-x64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.0.4
+ optional: true
+
+ '@img/sharp-wasm32@0.33.5':
+ dependencies:
+ '@emnapi/runtime': 1.3.1
+ optional: true
+
+ '@img/sharp-win32-ia32@0.33.5':
+ optional: true
+
+ '@img/sharp-win32-x64@0.33.5':
+ optional: true
+
+ '@isaacs/cliui@8.0.2':
+ dependencies:
+ string-width: 5.1.2
+ string-width-cjs: string-width@4.2.3
+ strip-ansi: 7.1.0
+ strip-ansi-cjs: strip-ansi@6.0.1
+ wrap-ansi: 8.1.0
+ wrap-ansi-cjs: wrap-ansi@7.0.0
+
+ '@jridgewell/gen-mapping@0.3.8':
+ dependencies:
+ '@jridgewell/set-array': 1.2.1
+ '@jridgewell/sourcemap-codec': 1.5.0
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/set-array@1.2.1': {}
+
+ '@jridgewell/sourcemap-codec@1.5.0': {}
+
+ '@jridgewell/trace-mapping@0.3.25':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ '@next/bundle-analyzer@15.1.4':
+ dependencies:
+ webpack-bundle-analyzer: 4.10.1
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
+ '@next/env@15.1.4': {}
+
+ '@next/eslint-plugin-next@15.1.4':
+ dependencies:
+ fast-glob: 3.3.1
+
+ '@next/swc-darwin-arm64@15.1.4':
+ optional: true
+
+ '@next/swc-darwin-x64@15.1.4':
+ optional: true
+
+ '@next/swc-linux-arm64-gnu@15.1.4':
+ optional: true
+
+ '@next/swc-linux-arm64-musl@15.1.4':
+ optional: true
+
+ '@next/swc-linux-x64-gnu@15.1.4':
+ optional: true
+
+ '@next/swc-linux-x64-musl@15.1.4':
+ optional: true
+
+ '@next/swc-win32-arm64-msvc@15.1.4':
+ optional: true
+
+ '@next/swc-win32-x64-msvc@15.1.4':
+ optional: true
+
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.18.0
+
+ '@nolyfill/is-core-module@1.0.39': {}
+
+ '@pkgjs/parseargs@0.11.0':
+ optional: true
+
+ '@polka/url@1.0.0-next.28': {}
+
+ '@radix-ui/number@1.1.0': {}
+
+ '@radix-ui/primitive@1.1.1': {}
+
+ '@radix-ui/react-arrow@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-checkbox@1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.1
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-collapsible@1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.1
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-collection@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-slot': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-compose-refs@1.1.1(@types/react@19.0.7)(react@19.0.0)':
+ dependencies:
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.7
+
+ '@radix-ui/react-context@1.1.1(@types/react@19.0.7)(react@19.0.0)':
+ dependencies:
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.7
+
+ '@radix-ui/react-dialog@1.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.1
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-slot': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ aria-hidden: 1.2.4
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ react-remove-scroll: 2.6.2(@types/react@19.0.7)(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-direction@1.1.0(@types/react@19.0.7)(react@19.0.0)':
+ dependencies:
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.7
+
+ '@radix-ui/react-dismissable-layer@1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.1
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-dropdown-menu@2.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.1
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-menu': 2.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-focus-guards@1.1.1(@types/react@19.0.7)(react@19.0.0)':
+ dependencies:
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.7
+
+ '@radix-ui/react-focus-scope@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-id@1.1.0(@types/react@19.0.7)(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.7
+
+ '@radix-ui/react-label@2.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-menu@2.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.1
+ '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-direction': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-roving-focus': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-slot': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ aria-hidden: 1.2.4
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ react-remove-scroll: 2.6.2(@types/react@19.0.7)(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-navigation-menu@1.2.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.1
+ '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-direction': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-popper@1.2.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-arrow': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-rect': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/rect': 1.1.0
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-portal@1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-presence@1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-primitive@2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-slot': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-radio-group@1.2.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.1
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-direction': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-roving-focus': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-roving-focus@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.1
+ '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-direction': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-select@2.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/number': 1.1.0
+ '@radix-ui/primitive': 1.1.1
+ '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-direction': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-slot': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ aria-hidden: 1.2.4
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ react-remove-scroll: 2.6.2(@types/react@19.0.7)(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-separator@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-slot@1.1.1(@types/react@19.0.7)(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.7
+
+ '@radix-ui/react-tooltip@1.1.6(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.1
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-slot': 1.1.1(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.0.7)(react@19.0.0)':
+ dependencies:
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.7
+
+ '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.0.7)(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.7
+
+ '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.0.7)(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.7
+
+ '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.0.7)(react@19.0.0)':
+ dependencies:
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.7
+
+ '@radix-ui/react-use-previous@1.1.0(@types/react@19.0.7)(react@19.0.0)':
+ dependencies:
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.7
+
+ '@radix-ui/react-use-rect@1.1.0(@types/react@19.0.7)(react@19.0.0)':
+ dependencies:
+ '@radix-ui/rect': 1.1.0
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.7
+
+ '@radix-ui/react-use-size@1.1.0(@types/react@19.0.7)(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.7
+
+ '@radix-ui/react-visually-hidden@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+ '@types/react-dom': 19.0.3(@types/react@19.0.7)
+
+ '@radix-ui/rect@1.1.0': {}
+
+ '@rtsao/scc@1.1.0': {}
+
+ '@rushstack/eslint-patch@1.10.5': {}
+
+ '@swc/counter@0.1.3': {}
+
+ '@swc/helpers@0.5.15':
+ dependencies:
+ tslib: 2.8.1
+
+ '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17)':
+ dependencies:
+ lodash.castarray: 4.4.0
+ lodash.isplainobject: 4.0.6
+ lodash.merge: 4.6.2
+ postcss-selector-parser: 6.0.10
+ tailwindcss: 3.4.17
+
+ '@trivago/prettier-plugin-sort-imports@5.2.1(prettier@3.4.2)':
+ dependencies:
+ '@babel/generator': 7.26.5
+ '@babel/parser': 7.26.5
+ '@babel/traverse': 7.26.5
+ '@babel/types': 7.26.5
+ javascript-natural-sort: 0.7.1
+ lodash: 4.17.21
+ prettier: 3.4.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@ts-morph/common@0.19.0':
+ dependencies:
+ fast-glob: 3.3.3
+ minimatch: 7.4.6
+ mkdirp: 2.1.6
+ path-browserify: 1.0.1
+
+ '@types/estree@1.0.6': {}
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/json5@0.0.29': {}
+
+ '@types/node@22.10.6':
+ dependencies:
+ undici-types: 6.20.0
+
+ '@types/react-dom@19.0.3(@types/react@19.0.7)':
+ dependencies:
+ '@types/react': 19.0.7
+
+ '@types/react@19.0.7':
+ dependencies:
+ csstype: 3.1.3
+
+ '@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.1
+ '@typescript-eslint/parser': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)
+ '@typescript-eslint/scope-manager': 8.20.0
+ '@typescript-eslint/type-utils': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)
+ '@typescript-eslint/utils': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)
+ '@typescript-eslint/visitor-keys': 8.20.0
+ eslint: 9.18.0(jiti@1.21.7)
+ graphemer: 1.4.0
+ ignore: 5.3.2
+ natural-compare: 1.4.0
+ ts-api-utils: 2.0.0(typescript@5.7.3)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.20.0
+ '@typescript-eslint/types': 8.20.0
+ '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3)
+ '@typescript-eslint/visitor-keys': 8.20.0
+ debug: 4.4.0
+ eslint: 9.18.0(jiti@1.21.7)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@8.20.0':
+ dependencies:
+ '@typescript-eslint/types': 8.20.0
+ '@typescript-eslint/visitor-keys': 8.20.0
+
+ '@typescript-eslint/type-utils@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)':
+ dependencies:
+ '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3)
+ '@typescript-eslint/utils': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)
+ debug: 4.4.0
+ eslint: 9.18.0(jiti@1.21.7)
+ ts-api-utils: 2.0.0(typescript@5.7.3)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/types@8.20.0': {}
+
+ '@typescript-eslint/typescript-estree@8.20.0(typescript@5.7.3)':
+ dependencies:
+ '@typescript-eslint/types': 8.20.0
+ '@typescript-eslint/visitor-keys': 8.20.0
+ debug: 4.4.0
+ fast-glob: 3.3.3
+ is-glob: 4.0.3
+ minimatch: 9.0.5
+ semver: 7.6.3
+ ts-api-utils: 2.0.0(typescript@5.7.3)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.7))
+ '@typescript-eslint/scope-manager': 8.20.0
+ '@typescript-eslint/types': 8.20.0
+ '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3)
+ eslint: 9.18.0(jiti@1.21.7)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/visitor-keys@8.20.0':
+ dependencies:
+ '@typescript-eslint/types': 8.20.0
+ eslint-visitor-keys: 4.2.0
+
+ acorn-jsx@5.3.2(acorn@8.14.0):
+ dependencies:
+ acorn: 8.14.0
+
+ acorn-walk@8.3.4:
+ dependencies:
+ acorn: 8.14.0
+
+ acorn@8.14.0: {}
+
+ agent-base@7.1.3: {}
+
+ ajv@6.12.6:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
+ ansi-regex@5.0.1: {}
+
+ ansi-regex@6.1.0: {}
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ ansi-styles@6.2.1: {}
+
+ any-promise@1.3.0: {}
+
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+
+ arg@5.0.2: {}
+
+ argparse@2.0.1: {}
+
+ aria-hidden@1.2.4:
+ dependencies:
+ tslib: 2.8.1
+
+ aria-query@5.3.2: {}
+
+ array-buffer-byte-length@1.0.2:
+ dependencies:
+ call-bound: 1.0.3
+ is-array-buffer: 3.0.5
+
+ array-includes@3.1.8:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.23.9
+ es-object-atoms: 1.1.0
+ get-intrinsic: 1.2.7
+ is-string: 1.1.1
+
+ array.prototype.findlast@1.2.5:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.23.9
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.0
+ es-shim-unscopables: 1.0.2
+
+ array.prototype.findlastindex@1.2.5:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.23.9
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.0
+ es-shim-unscopables: 1.0.2
+
+ array.prototype.flat@1.3.3:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.23.9
+ es-shim-unscopables: 1.0.2
+
+ array.prototype.flatmap@1.3.3:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.23.9
+ es-shim-unscopables: 1.0.2
+
+ array.prototype.tosorted@1.1.4:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.23.9
+ es-errors: 1.3.0
+ es-shim-unscopables: 1.0.2
+
+ arraybuffer.prototype.slice@1.0.4:
+ dependencies:
+ array-buffer-byte-length: 1.0.2
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.23.9
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.7
+ is-array-buffer: 3.0.5
+
+ ast-types-flow@0.0.8: {}
+
+ ast-types@0.16.1:
+ dependencies:
+ tslib: 2.8.1
+
+ available-typed-arrays@1.0.7:
+ dependencies:
+ possible-typed-array-names: 1.0.0
+
+ axe-core@4.10.2: {}
+
+ axobject-query@4.1.0: {}
+
+ balanced-match@1.0.2: {}
+
+ base64-js@1.5.1: {}
+
+ binary-extensions@2.3.0: {}
+
+ bl@5.1.0:
+ dependencies:
+ buffer: 6.0.3
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
+ brace-expansion@1.1.11:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@2.0.1:
+ dependencies:
+ balanced-match: 1.0.2
+
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ browserslist@4.24.4:
+ dependencies:
+ caniuse-lite: 1.0.30001692
+ electron-to-chromium: 1.5.82
+ node-releases: 2.0.19
+ update-browserslist-db: 1.1.2(browserslist@4.24.4)
+
+ buffer@6.0.3:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ busboy@1.6.0:
+ dependencies:
+ streamsearch: 1.1.0
+
+ call-bind-apply-helpers@1.0.1:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ call-bind@1.0.8:
+ dependencies:
+ call-bind-apply-helpers: 1.0.1
+ es-define-property: 1.0.1
+ get-intrinsic: 1.2.7
+ set-function-length: 1.2.2
+
+ call-bound@1.0.3:
+ dependencies:
+ call-bind-apply-helpers: 1.0.1
+ get-intrinsic: 1.2.7
+
+ callsites@3.1.0: {}
+
+ camelcase-css@2.0.1: {}
+
+ caniuse-lite@1.0.30001692: {}
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ chalk@5.4.1: {}
+
+ chokidar@3.6.0:
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.3
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ class-variance-authority@0.7.1:
+ dependencies:
+ clsx: 2.1.1
+
+ cli-cursor@4.0.0:
+ dependencies:
+ restore-cursor: 4.0.0
+
+ cli-spinners@2.9.2: {}
+
+ client-only@0.0.1: {}
+
+ clone@1.0.4: {}
+
+ clsx@2.1.1: {}
+
+ cmdk@1.0.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
+ dependencies:
+ '@radix-ui/react-dialog': 1.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ use-sync-external-store: 1.4.0(react@19.0.0)
+ transitivePeerDependencies:
+ - '@types/react'
+ - '@types/react-dom'
+
+ code-block-writer@12.0.0: {}
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.4: {}
+
+ color-string@1.9.1:
+ dependencies:
+ color-name: 1.1.4
+ simple-swizzle: 0.2.2
+ optional: true
+
+ color@4.2.3:
+ dependencies:
+ color-convert: 2.0.1
+ color-string: 1.9.1
+ optional: true
+
+ commander@10.0.1: {}
+
+ commander@4.1.1: {}
+
+ commander@7.2.0: {}
+
+ commander@8.3.0: {}
+
+ concat-map@0.0.1: {}
+
+ convert-source-map@2.0.0: {}
+
+ cosmiconfig@8.3.6(typescript@5.7.3):
+ dependencies:
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ optionalDependencies:
+ typescript: 5.7.3
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ cssesc@3.0.0: {}
+
+ csstype@3.1.3: {}
+
+ damerau-levenshtein@1.0.8: {}
+
+ data-uri-to-buffer@4.0.1: {}
+
+ data-view-buffer@1.0.2:
+ dependencies:
+ call-bound: 1.0.3
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ data-view-byte-length@1.0.2:
+ dependencies:
+ call-bound: 1.0.3
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ data-view-byte-offset@1.0.1:
+ dependencies:
+ call-bound: 1.0.3
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ debounce@1.2.1: {}
+
+ debug@3.2.7:
+ dependencies:
+ ms: 2.1.3
+
+ debug@4.4.0:
+ dependencies:
+ ms: 2.1.3
+
+ deep-is@0.1.4: {}
+
+ deepmerge@4.3.1: {}
+
+ defaults@1.0.4:
+ dependencies:
+ clone: 1.0.4
+
+ define-data-property@1.1.4:
+ dependencies:
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ define-properties@1.2.1:
+ dependencies:
+ define-data-property: 1.1.4
+ has-property-descriptors: 1.0.2
+ object-keys: 1.1.1
+
+ detect-libc@2.0.3:
+ optional: true
+
+ detect-node-es@1.1.0: {}
+
+ didyoumean@1.2.2: {}
+
+ diff@5.2.0: {}
+
+ directus-sdk-typegen@0.1.9:
+ dependencies:
+ commander: 8.3.0
+
+ dlv@1.1.3: {}
+
+ doctrine@2.1.0:
+ dependencies:
+ esutils: 2.0.3
+
+ dotenv@16.4.7: {}
+
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.1
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ duplexer@0.1.2: {}
+
+ eastasianwidth@0.2.0: {}
+
+ electron-to-chromium@1.5.82: {}
+
+ emoji-regex@8.0.0: {}
+
+ emoji-regex@9.2.2: {}
+
+ enhanced-resolve@5.18.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.2.1
+
+ error-ex@1.3.2:
+ dependencies:
+ is-arrayish: 0.2.1
+
+ es-abstract@1.23.9:
+ dependencies:
+ array-buffer-byte-length: 1.0.2
+ arraybuffer.prototype.slice: 1.0.4
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ call-bound: 1.0.3
+ data-view-buffer: 1.0.2
+ data-view-byte-length: 1.0.2
+ data-view-byte-offset: 1.0.1
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.0
+ es-set-tostringtag: 2.1.0
+ es-to-primitive: 1.3.0
+ function.prototype.name: 1.1.8
+ get-intrinsic: 1.2.7
+ get-proto: 1.0.1
+ get-symbol-description: 1.1.0
+ globalthis: 1.0.4
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ has-proto: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ internal-slot: 1.1.0
+ is-array-buffer: 3.0.5
+ is-callable: 1.2.7
+ is-data-view: 1.0.2
+ is-regex: 1.2.1
+ is-shared-array-buffer: 1.0.4
+ is-string: 1.1.1
+ is-typed-array: 1.1.15
+ is-weakref: 1.1.0
+ math-intrinsics: 1.1.0
+ object-inspect: 1.13.3
+ object-keys: 1.1.1
+ object.assign: 4.1.7
+ own-keys: 1.0.1
+ regexp.prototype.flags: 1.5.4
+ safe-array-concat: 1.1.3
+ safe-push-apply: 1.0.0
+ safe-regex-test: 1.1.0
+ set-proto: 1.0.0
+ string.prototype.trim: 1.2.10
+ string.prototype.trimend: 1.0.9
+ string.prototype.trimstart: 1.0.8
+ typed-array-buffer: 1.0.3
+ typed-array-byte-length: 1.0.3
+ typed-array-byte-offset: 1.0.4
+ typed-array-length: 1.0.7
+ unbox-primitive: 1.1.0
+ which-typed-array: 1.1.18
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
+ es-iterator-helpers@1.2.1:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.3
+ define-properties: 1.2.1
+ es-abstract: 1.23.9
+ es-errors: 1.3.0
+ es-set-tostringtag: 2.1.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.7
+ globalthis: 1.0.4
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ has-proto: 1.2.0
+ has-symbols: 1.1.0
+ internal-slot: 1.1.0
+ iterator.prototype: 1.1.5
+ safe-array-concat: 1.1.3
+
+ es-object-atoms@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+
+ es-set-tostringtag@2.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.7
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
+ es-shim-unscopables@1.0.2:
+ dependencies:
+ hasown: 2.0.2
+
+ es-to-primitive@1.3.0:
+ dependencies:
+ is-callable: 1.2.7
+ is-date-object: 1.1.0
+ is-symbol: 1.1.1
+
+ esbuild@0.23.1:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.23.1
+ '@esbuild/android-arm': 0.23.1
+ '@esbuild/android-arm64': 0.23.1
+ '@esbuild/android-x64': 0.23.1
+ '@esbuild/darwin-arm64': 0.23.1
+ '@esbuild/darwin-x64': 0.23.1
+ '@esbuild/freebsd-arm64': 0.23.1
+ '@esbuild/freebsd-x64': 0.23.1
+ '@esbuild/linux-arm': 0.23.1
+ '@esbuild/linux-arm64': 0.23.1
+ '@esbuild/linux-ia32': 0.23.1
+ '@esbuild/linux-loong64': 0.23.1
+ '@esbuild/linux-mips64el': 0.23.1
+ '@esbuild/linux-ppc64': 0.23.1
+ '@esbuild/linux-riscv64': 0.23.1
+ '@esbuild/linux-s390x': 0.23.1
+ '@esbuild/linux-x64': 0.23.1
+ '@esbuild/netbsd-x64': 0.23.1
+ '@esbuild/openbsd-arm64': 0.23.1
+ '@esbuild/openbsd-x64': 0.23.1
+ '@esbuild/sunos-x64': 0.23.1
+ '@esbuild/win32-arm64': 0.23.1
+ '@esbuild/win32-ia32': 0.23.1
+ '@esbuild/win32-x64': 0.23.1
+
+ escalade@3.2.0: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ eslint-config-next@15.1.4(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3):
+ dependencies:
+ '@next/eslint-plugin-next': 15.1.4
+ '@rushstack/eslint-patch': 1.10.5
+ '@typescript-eslint/eslint-plugin': 8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)
+ '@typescript-eslint/parser': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)
+ eslint: 9.18.0(jiti@1.21.7)
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7)))(eslint@9.18.0(jiti@1.21.7))
+ eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7)))(eslint@9.18.0(jiti@1.21.7)))(eslint@9.18.0(jiti@1.21.7))
+ eslint-plugin-jsx-a11y: 6.10.2(eslint@9.18.0(jiti@1.21.7))
+ eslint-plugin-react: 7.37.4(eslint@9.18.0(jiti@1.21.7))
+ eslint-plugin-react-hooks: 5.1.0(eslint@9.18.0(jiti@1.21.7))
+ optionalDependencies:
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - eslint-import-resolver-webpack
+ - eslint-plugin-import-x
+ - supports-color
+
+ eslint-config-prettier@10.0.1(eslint@9.18.0(jiti@1.21.7)):
+ dependencies:
+ eslint: 9.18.0(jiti@1.21.7)
+
+ eslint-import-resolver-node@0.3.9:
+ dependencies:
+ debug: 3.2.7
+ is-core-module: 2.16.1
+ resolve: 1.22.10
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7)))(eslint@9.18.0(jiti@1.21.7)):
+ dependencies:
+ '@nolyfill/is-core-module': 1.0.39
+ debug: 4.4.0
+ enhanced-resolve: 5.18.0
+ eslint: 9.18.0(jiti@1.21.7)
+ fast-glob: 3.3.3
+ get-tsconfig: 4.8.1
+ is-bun-module: 1.3.0
+ is-glob: 4.0.3
+ stable-hash: 0.0.4
+ optionalDependencies:
+ eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7)))(eslint@9.18.0(jiti@1.21.7)))(eslint@9.18.0(jiti@1.21.7))
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-module-utils@2.12.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7)))(eslint@9.18.0(jiti@1.21.7)))(eslint@9.18.0(jiti@1.21.7)):
+ dependencies:
+ debug: 3.2.7
+ optionalDependencies:
+ '@typescript-eslint/parser': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)
+ eslint: 9.18.0(jiti@1.21.7)
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7)))(eslint@9.18.0(jiti@1.21.7))
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7)))(eslint@9.18.0(jiti@1.21.7)))(eslint@9.18.0(jiti@1.21.7)):
+ dependencies:
+ '@rtsao/scc': 1.1.0
+ array-includes: 3.1.8
+ array.prototype.findlastindex: 1.2.5
+ array.prototype.flat: 1.3.3
+ array.prototype.flatmap: 1.3.3
+ debug: 3.2.7
+ doctrine: 2.1.0
+ eslint: 9.18.0(jiti@1.21.7)
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7)))(eslint@9.18.0(jiti@1.21.7)))(eslint@9.18.0(jiti@1.21.7))
+ hasown: 2.0.2
+ is-core-module: 2.16.1
+ is-glob: 4.0.3
+ minimatch: 3.1.2
+ object.fromentries: 2.0.8
+ object.groupby: 1.0.3
+ object.values: 1.2.1
+ semver: 6.3.1
+ string.prototype.trimend: 1.0.9
+ tsconfig-paths: 3.15.0
+ optionalDependencies:
+ '@typescript-eslint/parser': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+
+ eslint-plugin-jsx-a11y@6.10.2(eslint@9.18.0(jiti@1.21.7)):
+ dependencies:
+ aria-query: 5.3.2
+ array-includes: 3.1.8
+ array.prototype.flatmap: 1.3.3
+ ast-types-flow: 0.0.8
+ axe-core: 4.10.2
+ axobject-query: 4.1.0
+ damerau-levenshtein: 1.0.8
+ emoji-regex: 9.2.2
+ eslint: 9.18.0(jiti@1.21.7)
+ hasown: 2.0.2
+ jsx-ast-utils: 3.3.5
+ language-tags: 1.0.9
+ minimatch: 3.1.2
+ object.fromentries: 2.0.8
+ safe-regex-test: 1.1.0
+ string.prototype.includes: 2.0.1
+
+ eslint-plugin-promise@7.2.1(eslint@9.18.0(jiti@1.21.7)):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.7))
+ eslint: 9.18.0(jiti@1.21.7)
+
+ eslint-plugin-react-hooks@5.1.0(eslint@9.18.0(jiti@1.21.7)):
+ dependencies:
+ eslint: 9.18.0(jiti@1.21.7)
+
+ eslint-plugin-react@7.37.4(eslint@9.18.0(jiti@1.21.7)):
+ dependencies:
+ array-includes: 3.1.8
+ array.prototype.findlast: 1.2.5
+ array.prototype.flatmap: 1.3.3
+ array.prototype.tosorted: 1.1.4
+ doctrine: 2.1.0
+ es-iterator-helpers: 1.2.1
+ eslint: 9.18.0(jiti@1.21.7)
+ estraverse: 5.3.0
+ hasown: 2.0.2
+ jsx-ast-utils: 3.3.5
+ minimatch: 3.1.2
+ object.entries: 1.1.8
+ object.fromentries: 2.0.8
+ object.values: 1.2.1
+ prop-types: 15.8.1
+ resolve: 2.0.0-next.5
+ semver: 6.3.1
+ string.prototype.matchall: 4.0.12
+ string.prototype.repeat: 1.0.0
+
+ eslint-plugin-tailwindcss@3.17.5(tailwindcss@3.4.17):
+ dependencies:
+ fast-glob: 3.3.3
+ postcss: 8.5.1
+ tailwindcss: 3.4.17
+
+ eslint-scope@8.2.0:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-visitor-keys@3.4.3: {}
+
+ eslint-visitor-keys@4.2.0: {}
+
+ eslint@9.18.0(jiti@1.21.7):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.7))
+ '@eslint-community/regexpp': 4.12.1
+ '@eslint/config-array': 0.19.1
+ '@eslint/core': 0.10.0
+ '@eslint/eslintrc': 3.2.0
+ '@eslint/js': 9.18.0
+ '@eslint/plugin-kit': 0.2.5
+ '@humanfs/node': 0.16.6
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.4.1
+ '@types/estree': 1.0.6
+ '@types/json-schema': 7.0.15
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.6
+ debug: 4.4.0
+ escape-string-regexp: 4.0.0
+ eslint-scope: 8.2.0
+ eslint-visitor-keys: 4.2.0
+ espree: 10.3.0
+ esquery: 1.6.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 8.0.0
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ json-stable-stringify-without-jsonify: 1.0.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.2
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ optionalDependencies:
+ jiti: 1.21.7
+ transitivePeerDependencies:
+ - supports-color
+
+ espree@10.3.0:
+ dependencies:
+ acorn: 8.14.0
+ acorn-jsx: 5.3.2(acorn@8.14.0)
+ eslint-visitor-keys: 4.2.0
+
+ esprima@4.0.1: {}
+
+ esquery@1.6.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@5.3.0: {}
+
+ esutils@2.0.3: {}
+
+ eventemitter3@5.0.1: {}
+
+ execa@7.2.0:
+ dependencies:
+ cross-spawn: 7.0.6
+ get-stream: 6.0.1
+ human-signals: 4.3.1
+ is-stream: 3.0.0
+ merge-stream: 2.0.0
+ npm-run-path: 5.3.0
+ onetime: 6.0.0
+ signal-exit: 3.0.7
+ strip-final-newline: 3.0.0
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-glob@3.3.1:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fast-glob@3.3.3:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-levenshtein@2.0.6: {}
+
+ fastq@1.18.0:
+ dependencies:
+ reusify: 1.0.4
+
+ fetch-blob@3.2.0:
+ dependencies:
+ node-domexception: 1.0.0
+ web-streams-polyfill: 3.3.3
+
+ file-entry-cache@8.0.0:
+ dependencies:
+ flat-cache: 4.0.1
+
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ flat-cache@4.0.1:
+ dependencies:
+ flatted: 3.3.2
+ keyv: 4.5.4
+
+ flatted@3.3.2: {}
+
+ for-each@0.3.3:
+ dependencies:
+ is-callable: 1.2.7
+
+ foreground-child@3.3.0:
+ dependencies:
+ cross-spawn: 7.0.6
+ signal-exit: 4.1.0
+
+ formdata-polyfill@4.0.10:
+ dependencies:
+ fetch-blob: 3.2.0
+
+ fs-extra@11.2.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.1
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ function.prototype.name@1.1.8:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.3
+ define-properties: 1.2.1
+ functions-have-names: 1.2.3
+ hasown: 2.0.2
+ is-callable: 1.2.7
+
+ functions-have-names@1.2.3: {}
+
+ gensync@1.0.0-beta.2: {}
+
+ get-intrinsic@1.2.7:
+ dependencies:
+ call-bind-apply-helpers: 1.0.1
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.0
+ 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
+
+ get-nonce@1.0.1: {}
+
+ get-own-enumerable-keys@1.0.0: {}
+
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.0
+
+ get-stream@6.0.1: {}
+
+ get-symbol-description@1.1.0:
+ dependencies:
+ call-bound: 1.0.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.7
+
+ get-tsconfig@4.8.1:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob@10.4.5:
+ dependencies:
+ foreground-child: 3.3.0
+ jackspeak: 3.4.3
+ minimatch: 9.0.5
+ minipass: 7.1.2
+ package-json-from-dist: 1.0.1
+ path-scurry: 1.11.1
+
+ globals@11.12.0: {}
+
+ globals@14.0.0: {}
+
+ globals@15.14.0: {}
+
+ globalthis@1.0.4:
+ dependencies:
+ define-properties: 1.2.1
+ gopd: 1.2.0
+
+ gopd@1.2.0: {}
+
+ graceful-fs@4.2.11: {}
+
+ graphemer@1.4.0: {}
+
+ gzip-size@6.0.0:
+ dependencies:
+ duplexer: 0.1.2
+
+ has-bigints@1.1.0: {}
+
+ has-flag@4.0.0: {}
+
+ has-property-descriptors@1.0.2:
+ dependencies:
+ es-define-property: 1.0.1
+
+ has-proto@1.2.0:
+ dependencies:
+ dunder-proto: 1.0.1
+
+ has-symbols@1.1.0: {}
+
+ has-tostringtag@1.0.2:
+ dependencies:
+ has-symbols: 1.1.0
+
+ hasown@2.0.2:
+ dependencies:
+ function-bind: 1.1.2
+
+ html-escaper@2.0.2: {}
+
+ https-proxy-agent@6.2.1:
+ dependencies:
+ agent-base: 7.1.3
+ debug: 4.4.0
+ transitivePeerDependencies:
+ - supports-color
+
+ human-signals@4.3.1: {}
+
+ ieee754@1.2.1: {}
+
+ ignore@5.3.2: {}
+
+ import-fresh@3.3.0:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ imurmurhash@0.1.4: {}
+
+ inherits@2.0.4: {}
+
+ internal-slot@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ hasown: 2.0.2
+ side-channel: 1.1.0
+
+ is-array-buffer@3.0.5:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.3
+ get-intrinsic: 1.2.7
+
+ is-arrayish@0.2.1: {}
+
+ is-arrayish@0.3.2:
+ optional: true
+
+ is-async-function@2.1.0:
+ dependencies:
+ call-bound: 1.0.3
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
+
+ is-bigint@1.1.0:
+ dependencies:
+ has-bigints: 1.1.0
+
+ is-binary-path@2.1.0:
+ dependencies:
+ binary-extensions: 2.3.0
+
+ is-boolean-object@1.2.1:
+ dependencies:
+ call-bound: 1.0.3
+ has-tostringtag: 1.0.2
+
+ is-bun-module@1.3.0:
+ dependencies:
+ semver: 7.6.3
+
+ is-callable@1.2.7: {}
+
+ is-core-module@2.16.1:
+ dependencies:
+ hasown: 2.0.2
+
+ is-data-view@1.0.2:
+ dependencies:
+ call-bound: 1.0.3
+ get-intrinsic: 1.2.7
+ is-typed-array: 1.1.15
+
+ is-date-object@1.1.0:
+ dependencies:
+ call-bound: 1.0.3
+ has-tostringtag: 1.0.2
+
+ is-extglob@2.1.1: {}
+
+ is-finalizationregistry@1.1.1:
+ dependencies:
+ call-bound: 1.0.3
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-generator-function@1.1.0:
+ dependencies:
+ call-bound: 1.0.3
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-interactive@2.0.0: {}
+
+ is-map@2.0.3: {}
+
+ is-number-object@1.1.1:
+ dependencies:
+ call-bound: 1.0.3
+ has-tostringtag: 1.0.2
+
+ is-number@7.0.0: {}
+
+ is-obj@3.0.0: {}
+
+ is-plain-object@5.0.0: {}
+
+ is-regex@1.2.1:
+ dependencies:
+ call-bound: 1.0.3
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
+ is-regexp@3.1.0: {}
+
+ is-set@2.0.3: {}
+
+ is-shared-array-buffer@1.0.4:
+ dependencies:
+ call-bound: 1.0.3
+
+ is-stream@3.0.0: {}
+
+ is-string@1.1.1:
+ dependencies:
+ call-bound: 1.0.3
+ has-tostringtag: 1.0.2
+
+ is-symbol@1.1.1:
+ dependencies:
+ call-bound: 1.0.3
+ has-symbols: 1.1.0
+ safe-regex-test: 1.1.0
+
+ is-typed-array@1.1.15:
+ dependencies:
+ which-typed-array: 1.1.18
+
+ is-unicode-supported@1.3.0: {}
+
+ is-weakmap@2.0.2: {}
+
+ is-weakref@1.1.0:
+ dependencies:
+ call-bound: 1.0.3
+
+ is-weakset@2.0.4:
+ dependencies:
+ call-bound: 1.0.3
+ get-intrinsic: 1.2.7
+
+ isarray@2.0.5: {}
+
+ isexe@2.0.0: {}
+
+ iterator.prototype@1.1.5:
+ dependencies:
+ define-data-property: 1.1.4
+ es-object-atoms: 1.1.0
+ get-intrinsic: 1.2.7
+ get-proto: 1.0.1
+ has-symbols: 1.1.0
+ set-function-name: 2.0.2
+
+ jackspeak@3.4.3:
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
+
+ javascript-natural-sort@0.7.1: {}
+
+ jiti@1.21.7: {}
+
+ js-tokens@4.0.0: {}
+
+ js-yaml@4.1.0:
+ dependencies:
+ argparse: 2.0.1
+
+ jsesc@3.1.0: {}
+
+ json-buffer@3.0.1: {}
+
+ json-parse-even-better-errors@2.3.1: {}
+
+ json-schema-traverse@0.4.1: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ json5@1.0.2:
+ dependencies:
+ minimist: 1.2.8
+
+ json5@2.2.3: {}
+
+ jsonfile@6.1.0:
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
+
+ jsx-ast-utils@3.3.5:
+ dependencies:
+ array-includes: 3.1.8
+ array.prototype.flat: 1.3.3
+ object.assign: 4.1.7
+ object.values: 1.2.1
+
+ keyv@4.5.4:
+ dependencies:
+ json-buffer: 3.0.1
+
+ kleur@3.0.3: {}
+
+ kleur@4.1.5: {}
+
+ language-subtag-registry@0.3.23: {}
+
+ language-tags@1.0.9:
+ dependencies:
+ language-subtag-registry: 0.3.23
+
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
+ lilconfig@3.1.3: {}
+
+ lines-and-columns@1.2.4: {}
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ lodash._reinterpolate@3.0.0: {}
+
+ lodash.castarray@4.4.0: {}
+
+ lodash.isplainobject@4.0.6: {}
+
+ lodash.merge@4.6.2: {}
+
+ lodash.template@4.5.0:
+ dependencies:
+ lodash._reinterpolate: 3.0.0
+ lodash.templatesettings: 4.2.0
+
+ lodash.templatesettings@4.2.0:
+ dependencies:
+ lodash._reinterpolate: 3.0.0
+
+ lodash@4.17.21: {}
+
+ log-symbols@5.1.0:
+ dependencies:
+ chalk: 5.4.1
+ is-unicode-supported: 1.3.0
+
+ loose-envify@1.4.0:
+ dependencies:
+ js-tokens: 4.0.0
+
+ lru-cache@10.4.3: {}
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ lucide-react@0.471.1(react@19.0.0):
+ dependencies:
+ react: 19.0.0
+
+ math-intrinsics@1.1.0: {}
+
+ merge-stream@2.0.0: {}
+
+ merge2@1.4.1: {}
+
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+
+ mimic-fn@2.1.0: {}
+
+ mimic-fn@4.0.0: {}
+
+ minimatch@3.1.2:
+ dependencies:
+ brace-expansion: 1.1.11
+
+ minimatch@7.4.6:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minimatch@9.0.5:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minimist@1.2.8: {}
+
+ minipass@7.1.2: {}
+
+ mkdirp@2.1.6: {}
+
+ mrmime@2.0.0: {}
+
+ ms@2.1.3: {}
+
+ mz@2.7.0:
+ dependencies:
+ any-promise: 1.3.0
+ object-assign: 4.1.1
+ thenify-all: 1.6.0
+
+ nanoid@3.3.8: {}
+
+ natural-compare@1.4.0: {}
+
+ next-themes@0.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
+ dependencies:
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+
+ next@15.1.4(@babel/core@7.26.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
+ dependencies:
+ '@next/env': 15.1.4
+ '@swc/counter': 0.1.3
+ '@swc/helpers': 0.5.15
+ busboy: 1.6.0
+ caniuse-lite: 1.0.30001692
+ postcss: 8.4.31
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ styled-jsx: 5.1.6(@babel/core@7.26.0)(react@19.0.0)
+ optionalDependencies:
+ '@next/swc-darwin-arm64': 15.1.4
+ '@next/swc-darwin-x64': 15.1.4
+ '@next/swc-linux-arm64-gnu': 15.1.4
+ '@next/swc-linux-arm64-musl': 15.1.4
+ '@next/swc-linux-x64-gnu': 15.1.4
+ '@next/swc-linux-x64-musl': 15.1.4
+ '@next/swc-win32-arm64-msvc': 15.1.4
+ '@next/swc-win32-x64-msvc': 15.1.4
+ sharp: 0.33.5
+ transitivePeerDependencies:
+ - '@babel/core'
+ - babel-plugin-macros
+
+ node-domexception@1.0.0: {}
+
+ node-fetch@3.3.2:
+ dependencies:
+ data-uri-to-buffer: 4.0.1
+ fetch-blob: 3.2.0
+ formdata-polyfill: 4.0.10
+
+ node-releases@2.0.19: {}
+
+ normalize-path@3.0.0: {}
+
+ npm-run-path@5.3.0:
+ dependencies:
+ path-key: 4.0.0
+
+ object-assign@4.1.1: {}
+
+ object-hash@3.0.0: {}
+
+ object-inspect@1.13.3: {}
+
+ object-keys@1.1.1: {}
+
+ object.assign@4.1.7:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.3
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.0
+ has-symbols: 1.1.0
+ object-keys: 1.1.1
+
+ object.entries@1.1.8:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.0
+
+ object.fromentries@2.0.8:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.23.9
+ es-object-atoms: 1.1.0
+
+ object.groupby@1.0.3:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.23.9
+
+ object.values@1.2.1:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.3
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.0
+
+ onetime@5.1.2:
+ dependencies:
+ mimic-fn: 2.1.0
+
+ onetime@6.0.0:
+ dependencies:
+ mimic-fn: 4.0.0
+
+ opener@1.5.2: {}
+
+ optionator@0.9.4:
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+
+ ora@6.3.1:
+ dependencies:
+ chalk: 5.4.1
+ cli-cursor: 4.0.0
+ cli-spinners: 2.9.2
+ is-interactive: 2.0.0
+ is-unicode-supported: 1.3.0
+ log-symbols: 5.1.0
+ stdin-discarder: 0.1.0
+ strip-ansi: 7.1.0
+ wcwidth: 1.0.1
+
+ own-keys@1.0.1:
+ dependencies:
+ get-intrinsic: 1.2.7
+ object-keys: 1.1.1
+ safe-push-apply: 1.0.0
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ p-queue@8.0.1:
+ dependencies:
+ eventemitter3: 5.0.1
+ p-timeout: 6.1.4
+
+ p-timeout@6.1.4: {}
+
+ package-json-from-dist@1.0.1: {}
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parse-json@5.2.0:
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ error-ex: 1.3.2
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ path-browserify@1.0.1: {}
+
+ path-exists@4.0.0: {}
+
+ path-key@3.1.1: {}
+
+ path-key@4.0.0: {}
+
+ path-parse@1.0.7: {}
+
+ path-scurry@1.11.1:
+ dependencies:
+ lru-cache: 10.4.3
+ minipass: 7.1.2
+
+ path-type@4.0.0: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.1: {}
+
+ pify@2.3.0: {}
+
+ pirates@4.0.6: {}
+
+ possible-typed-array-names@1.0.0: {}
+
+ postcss-import@15.1.0(postcss@8.5.1):
+ dependencies:
+ postcss: 8.5.1
+ postcss-value-parser: 4.2.0
+ read-cache: 1.0.0
+ resolve: 1.22.10
+
+ postcss-js@4.0.1(postcss@8.5.1):
+ dependencies:
+ camelcase-css: 2.0.1
+ postcss: 8.5.1
+
+ postcss-load-config@4.0.2(postcss@8.5.1):
+ dependencies:
+ lilconfig: 3.1.3
+ yaml: 2.7.0
+ optionalDependencies:
+ postcss: 8.5.1
+
+ postcss-nested@6.2.0(postcss@8.5.1):
+ dependencies:
+ postcss: 8.5.1
+ postcss-selector-parser: 6.1.2
+
+ postcss-selector-parser@6.0.10:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss-selector-parser@6.1.2:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss-value-parser@4.2.0: {}
+
+ postcss@8.4.31:
+ dependencies:
+ nanoid: 3.3.8
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ postcss@8.5.1:
+ dependencies:
+ nanoid: 3.3.8
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ prelude-ls@1.2.1: {}
+
+ prettier-plugin-tailwindcss@0.6.9(@trivago/prettier-plugin-sort-imports@5.2.1(prettier@3.4.2))(prettier@3.4.2):
+ dependencies:
+ prettier: 3.4.2
+ optionalDependencies:
+ '@trivago/prettier-plugin-sort-imports': 5.2.1(prettier@3.4.2)
+
+ prettier@3.4.2: {}
+
+ prompts@2.4.2:
+ dependencies:
+ kleur: 3.0.3
+ sisteransi: 1.0.5
+
+ prop-types@15.8.1:
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
+
+ punycode@2.3.1: {}
+
+ queue-microtask@1.2.3: {}
+
+ react-dom@19.0.0(react@19.0.0):
+ dependencies:
+ react: 19.0.0
+ scheduler: 0.25.0
+
+ react-hook-form@7.54.2(react@19.0.0):
+ dependencies:
+ react: 19.0.0
+
+ react-is@16.13.1: {}
+
+ react-remove-scroll-bar@2.3.8(@types/react@19.0.7)(react@19.0.0):
+ dependencies:
+ react: 19.0.0
+ react-style-singleton: 2.2.3(@types/react@19.0.7)(react@19.0.0)
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.0.7
+
+ react-remove-scroll@2.6.2(@types/react@19.0.7)(react@19.0.0):
+ dependencies:
+ react: 19.0.0
+ react-remove-scroll-bar: 2.3.8(@types/react@19.0.7)(react@19.0.0)
+ react-style-singleton: 2.2.3(@types/react@19.0.7)(react@19.0.0)
+ tslib: 2.8.1
+ use-callback-ref: 1.3.3(@types/react@19.0.7)(react@19.0.0)
+ use-sidecar: 1.1.3(@types/react@19.0.7)(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.7
+
+ react-style-singleton@2.2.3(@types/react@19.0.7)(react@19.0.0):
+ dependencies:
+ get-nonce: 1.0.1
+ react: 19.0.0
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.0.7
+
+ react@19.0.0: {}
+
+ read-cache@1.0.0:
+ dependencies:
+ pify: 2.3.0
+
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ readdirp@3.6.0:
+ dependencies:
+ picomatch: 2.3.1
+
+ recast@0.23.9:
+ dependencies:
+ ast-types: 0.16.1
+ esprima: 4.0.1
+ source-map: 0.6.1
+ tiny-invariant: 1.3.3
+ tslib: 2.8.1
+
+ reflect.getprototypeof@1.0.10:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.23.9
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.0
+ get-intrinsic: 1.2.7
+ get-proto: 1.0.1
+ which-builtin-type: 1.2.1
+
+ regexp.prototype.flags@1.5.4:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-errors: 1.3.0
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ set-function-name: 2.0.2
+
+ resolve-from@4.0.0: {}
+
+ resolve-pkg-maps@1.0.0: {}
+
+ resolve@1.22.10:
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ resolve@2.0.0-next.5:
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ restore-cursor@4.0.0:
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+
+ reusify@1.0.4: {}
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ safe-array-concat@1.1.3:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.3
+ get-intrinsic: 1.2.7
+ has-symbols: 1.1.0
+ isarray: 2.0.5
+
+ safe-buffer@5.2.1: {}
+
+ safe-push-apply@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ isarray: 2.0.5
+
+ safe-regex-test@1.1.0:
+ dependencies:
+ call-bound: 1.0.3
+ es-errors: 1.3.0
+ is-regex: 1.2.1
+
+ scheduler@0.25.0: {}
+
+ semver@6.3.1: {}
+
+ semver@7.6.3: {}
+
+ set-function-length@1.2.2:
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.7
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+
+ set-function-name@2.0.2:
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.2
+
+ set-proto@1.0.0:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.0
+
+ shadcn@2.1.8(typescript@5.7.3):
+ dependencies:
+ '@antfu/ni': 0.21.12
+ '@babel/core': 7.26.0
+ '@babel/parser': 7.26.5
+ '@babel/plugin-transform-typescript': 7.26.5(@babel/core@7.26.0)
+ commander: 10.0.1
+ cosmiconfig: 8.3.6(typescript@5.7.3)
+ deepmerge: 4.3.1
+ diff: 5.2.0
+ execa: 7.2.0
+ fast-glob: 3.3.3
+ fs-extra: 11.2.0
+ https-proxy-agent: 6.2.1
+ kleur: 4.1.5
+ lodash.template: 4.5.0
+ node-fetch: 3.3.2
+ ora: 6.3.1
+ postcss: 8.5.1
+ prompts: 2.4.2
+ recast: 0.23.9
+ stringify-object: 5.0.0
+ ts-morph: 18.0.0
+ tsconfig-paths: 4.2.0
+ zod: 3.24.1
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ sharp@0.33.5:
+ dependencies:
+ color: 4.2.3
+ detect-libc: 2.0.3
+ semver: 7.6.3
+ 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
+ optional: true
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ side-channel-list@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.3
+
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.7
+ object-inspect: 1.13.3
+
+ side-channel-weakmap@1.0.2:
+ dependencies:
+ call-bound: 1.0.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.7
+ object-inspect: 1.13.3
+ side-channel-map: 1.0.1
+
+ side-channel@1.1.0:
+ 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
+
+ signal-exit@3.0.7: {}
+
+ signal-exit@4.1.0: {}
+
+ simple-swizzle@0.2.2:
+ dependencies:
+ is-arrayish: 0.3.2
+ optional: true
+
+ sirv@2.0.4:
+ dependencies:
+ '@polka/url': 1.0.0-next.28
+ mrmime: 2.0.0
+ totalist: 3.0.1
+
+ sisteransi@1.0.5: {}
+
+ source-map-js@1.2.1: {}
+
+ source-map@0.6.1: {}
+
+ stable-hash@0.0.4: {}
+
+ stdin-discarder@0.1.0:
+ dependencies:
+ bl: 5.1.0
+
+ streamsearch@1.1.0: {}
+
+ string-width@4.2.3:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ string-width@5.1.2:
+ dependencies:
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.1.0
+
+ string.prototype.includes@2.0.1:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.23.9
+
+ string.prototype.matchall@4.0.12:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.3
+ define-properties: 1.2.1
+ es-abstract: 1.23.9
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.0
+ get-intrinsic: 1.2.7
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ internal-slot: 1.1.0
+ regexp.prototype.flags: 1.5.4
+ set-function-name: 2.0.2
+ side-channel: 1.1.0
+
+ string.prototype.repeat@1.0.0:
+ dependencies:
+ define-properties: 1.2.1
+ es-abstract: 1.23.9
+
+ string.prototype.trim@1.2.10:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.3
+ define-data-property: 1.1.4
+ define-properties: 1.2.1
+ es-abstract: 1.23.9
+ es-object-atoms: 1.1.0
+ has-property-descriptors: 1.0.2
+
+ string.prototype.trimend@1.0.9:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.3
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.0
+
+ string.prototype.trimstart@1.0.8:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.0
+
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ stringify-object@5.0.0:
+ dependencies:
+ get-own-enumerable-keys: 1.0.0
+ is-obj: 3.0.0
+ is-regexp: 3.1.0
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-ansi@7.1.0:
+ dependencies:
+ ansi-regex: 6.1.0
+
+ strip-bom@3.0.0: {}
+
+ strip-final-newline@3.0.0: {}
+
+ strip-json-comments@3.1.1: {}
+
+ styled-jsx@5.1.6(@babel/core@7.26.0)(react@19.0.0):
+ dependencies:
+ client-only: 0.0.1
+ react: 19.0.0
+ optionalDependencies:
+ '@babel/core': 7.26.0
+
+ sucrase@3.35.0:
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.8
+ commander: 4.1.1
+ glob: 10.4.5
+ lines-and-columns: 1.2.4
+ mz: 2.7.0
+ pirates: 4.0.6
+ ts-interface-checker: 0.1.13
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-preserve-symlinks-flag@1.0.0: {}
+
+ tailwind-merge@2.6.0: {}
+
+ tailwindcss-animate@1.0.7(tailwindcss@3.4.17):
+ dependencies:
+ tailwindcss: 3.4.17
+
+ tailwindcss@3.4.17:
+ dependencies:
+ '@alloc/quick-lru': 5.2.0
+ arg: 5.0.2
+ chokidar: 3.6.0
+ didyoumean: 1.2.2
+ dlv: 1.1.3
+ fast-glob: 3.3.3
+ glob-parent: 6.0.2
+ is-glob: 4.0.3
+ jiti: 1.21.7
+ lilconfig: 3.1.3
+ micromatch: 4.0.8
+ normalize-path: 3.0.0
+ object-hash: 3.0.0
+ picocolors: 1.1.1
+ postcss: 8.5.1
+ postcss-import: 15.1.0(postcss@8.5.1)
+ postcss-js: 4.0.1(postcss@8.5.1)
+ postcss-load-config: 4.0.2(postcss@8.5.1)
+ postcss-nested: 6.2.0(postcss@8.5.1)
+ postcss-selector-parser: 6.1.2
+ resolve: 1.22.10
+ sucrase: 3.35.0
+ transitivePeerDependencies:
+ - ts-node
+
+ tapable@2.2.1: {}
+
+ thenify-all@1.6.0:
+ dependencies:
+ thenify: 3.3.1
+
+ thenify@3.3.1:
+ dependencies:
+ any-promise: 1.3.0
+
+ tiny-invariant@1.3.3: {}
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ totalist@3.0.1: {}
+
+ ts-api-utils@2.0.0(typescript@5.7.3):
+ dependencies:
+ typescript: 5.7.3
+
+ ts-interface-checker@0.1.13: {}
+
+ ts-morph@18.0.0:
+ dependencies:
+ '@ts-morph/common': 0.19.0
+ code-block-writer: 12.0.0
+
+ tsconfig-paths@3.15.0:
+ dependencies:
+ '@types/json5': 0.0.29
+ json5: 1.0.2
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+
+ tsconfig-paths@4.2.0:
+ dependencies:
+ json5: 2.2.3
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+
+ tslib@2.8.1: {}
+
+ tsx@4.19.2:
+ dependencies:
+ esbuild: 0.23.1
+ get-tsconfig: 4.8.1
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ type-check@0.4.0:
+ dependencies:
+ prelude-ls: 1.2.1
+
+ typed-array-buffer@1.0.3:
+ dependencies:
+ call-bound: 1.0.3
+ es-errors: 1.3.0
+ is-typed-array: 1.1.15
+
+ typed-array-byte-length@1.0.3:
+ dependencies:
+ call-bind: 1.0.8
+ for-each: 0.3.3
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+
+ typed-array-byte-offset@1.0.4:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ for-each: 0.3.3
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+ reflect.getprototypeof: 1.0.10
+
+ typed-array-length@1.0.7:
+ dependencies:
+ call-bind: 1.0.8
+ for-each: 0.3.3
+ gopd: 1.2.0
+ is-typed-array: 1.1.15
+ possible-typed-array-names: 1.0.0
+ reflect.getprototypeof: 1.0.10
+
+ typescript-eslint@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3):
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)
+ '@typescript-eslint/parser': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)
+ '@typescript-eslint/utils': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)
+ eslint: 9.18.0(jiti@1.21.7)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ typescript@5.7.3: {}
+
+ unbox-primitive@1.1.0:
+ dependencies:
+ call-bound: 1.0.3
+ has-bigints: 1.1.0
+ has-symbols: 1.1.0
+ which-boxed-primitive: 1.1.1
+
+ undici-types@6.20.0: {}
+
+ universalify@2.0.1: {}
+
+ update-browserslist-db@1.1.2(browserslist@4.24.4):
+ dependencies:
+ browserslist: 4.24.4
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ use-callback-ref@1.3.3(@types/react@19.0.7)(react@19.0.0):
+ dependencies:
+ react: 19.0.0
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.0.7
+
+ use-sidecar@1.1.3(@types/react@19.0.7)(react@19.0.0):
+ dependencies:
+ detect-node-es: 1.1.0
+ react: 19.0.0
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.0.7
+
+ use-sync-external-store@1.4.0(react@19.0.0):
+ dependencies:
+ react: 19.0.0
+
+ util-deprecate@1.0.2: {}
+
+ wcwidth@1.0.1:
+ dependencies:
+ defaults: 1.0.4
+
+ web-streams-polyfill@3.3.3: {}
+
+ webpack-bundle-analyzer@4.10.1:
+ dependencies:
+ '@discoveryjs/json-ext': 0.5.7
+ acorn: 8.14.0
+ acorn-walk: 8.3.4
+ commander: 7.2.0
+ debounce: 1.2.1
+ escape-string-regexp: 4.0.0
+ gzip-size: 6.0.0
+ html-escaper: 2.0.2
+ is-plain-object: 5.0.0
+ opener: 1.5.2
+ picocolors: 1.1.1
+ sirv: 2.0.4
+ ws: 7.5.10
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
+ which-boxed-primitive@1.1.1:
+ dependencies:
+ is-bigint: 1.1.0
+ is-boolean-object: 1.2.1
+ is-number-object: 1.1.1
+ is-string: 1.1.1
+ is-symbol: 1.1.1
+
+ which-builtin-type@1.2.1:
+ dependencies:
+ call-bound: 1.0.3
+ function.prototype.name: 1.1.8
+ has-tostringtag: 1.0.2
+ is-async-function: 2.1.0
+ is-date-object: 1.1.0
+ is-finalizationregistry: 1.1.1
+ is-generator-function: 1.1.0
+ is-regex: 1.2.1
+ is-weakref: 1.1.0
+ isarray: 2.0.5
+ which-boxed-primitive: 1.1.1
+ which-collection: 1.0.2
+ which-typed-array: 1.1.18
+
+ which-collection@1.0.2:
+ dependencies:
+ is-map: 2.0.3
+ is-set: 2.0.3
+ is-weakmap: 2.0.2
+ is-weakset: 2.0.4
+
+ which-typed-array@1.1.18:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ call-bound: 1.0.3
+ for-each: 0.3.3
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ word-wrap@1.2.5: {}
+
+ wrap-ansi@7.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ wrap-ansi@8.1.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 5.1.2
+ strip-ansi: 7.1.0
+
+ ws@7.5.10: {}
+
+ yallist@3.1.1: {}
+
+ yaml@2.7.0: {}
+
+ yocto-queue@0.1.0: {}
+
+ zod@3.24.1: {}
diff --git a/templates/cms/nextjs/postcss.config.mjs b/templates/cms/nextjs/postcss.config.mjs
new file mode 100644
index 0000000..1a69fd2
--- /dev/null
+++ b/templates/cms/nextjs/postcss.config.mjs
@@ -0,0 +1,8 @@
+/** @type {import('postcss-load-config').Config} */
+const config = {
+ plugins: {
+ tailwindcss: {},
+ },
+};
+
+export default config;
diff --git a/templates/cms/nextjs/public/favicon.ico b/templates/cms/nextjs/public/favicon.ico
new file mode 100644
index 0000000..d7a7ccf
Binary files /dev/null and b/templates/cms/nextjs/public/favicon.ico differ
diff --git a/templates/cms/nextjs/public/fonts/inter-italic.woff2 b/templates/cms/nextjs/public/fonts/inter-italic.woff2
new file mode 100644
index 0000000..e0a0685
Binary files /dev/null and b/templates/cms/nextjs/public/fonts/inter-italic.woff2 differ
diff --git a/templates/cms/nextjs/public/fonts/inter.woff2 b/templates/cms/nextjs/public/fonts/inter.woff2
new file mode 100644
index 0000000..3bf3c79
Binary files /dev/null and b/templates/cms/nextjs/public/fonts/inter.woff2 differ
diff --git a/templates/cms/nextjs/public/fonts/poppins-300.woff2 b/templates/cms/nextjs/public/fonts/poppins-300.woff2
new file mode 100644
index 0000000..962b734
Binary files /dev/null and b/templates/cms/nextjs/public/fonts/poppins-300.woff2 differ
diff --git a/templates/cms/nextjs/public/fonts/poppins-400.woff2 b/templates/cms/nextjs/public/fonts/poppins-400.woff2
new file mode 100644
index 0000000..b69e009
Binary files /dev/null and b/templates/cms/nextjs/public/fonts/poppins-400.woff2 differ
diff --git a/templates/cms/nextjs/public/fonts/poppins-600.woff2 b/templates/cms/nextjs/public/fonts/poppins-600.woff2
new file mode 100644
index 0000000..921e962
Binary files /dev/null and b/templates/cms/nextjs/public/fonts/poppins-600.woff2 differ
diff --git a/templates/cms/nextjs/public/fonts/poppins-700.woff2 b/templates/cms/nextjs/public/fonts/poppins-700.woff2
new file mode 100644
index 0000000..bf022fc
Binary files /dev/null and b/templates/cms/nextjs/public/fonts/poppins-700.woff2 differ
diff --git a/templates/cms/nextjs/public/icons/social/discord.svg b/templates/cms/nextjs/public/icons/social/discord.svg
new file mode 100644
index 0000000..9d7796b
--- /dev/null
+++ b/templates/cms/nextjs/public/icons/social/discord.svg
@@ -0,0 +1 @@
+Discord
\ No newline at end of file
diff --git a/templates/cms/nextjs/public/icons/social/facebook.svg b/templates/cms/nextjs/public/icons/social/facebook.svg
new file mode 100644
index 0000000..f66767e
--- /dev/null
+++ b/templates/cms/nextjs/public/icons/social/facebook.svg
@@ -0,0 +1 @@
+Facebook
\ No newline at end of file
diff --git a/templates/cms/nextjs/public/icons/social/github.svg b/templates/cms/nextjs/public/icons/social/github.svg
new file mode 100644
index 0000000..538ec5b
--- /dev/null
+++ b/templates/cms/nextjs/public/icons/social/github.svg
@@ -0,0 +1 @@
+GitHub
\ No newline at end of file
diff --git a/templates/cms/nextjs/public/icons/social/instagram.svg b/templates/cms/nextjs/public/icons/social/instagram.svg
new file mode 100644
index 0000000..c0e86b0
--- /dev/null
+++ b/templates/cms/nextjs/public/icons/social/instagram.svg
@@ -0,0 +1 @@
+Instagram
\ No newline at end of file
diff --git a/templates/cms/nextjs/public/icons/social/linkedin.svg b/templates/cms/nextjs/public/icons/social/linkedin.svg
new file mode 100644
index 0000000..85bb2af
--- /dev/null
+++ b/templates/cms/nextjs/public/icons/social/linkedin.svg
@@ -0,0 +1 @@
+LinkedIn
diff --git a/templates/cms/nextjs/public/icons/social/reddit.svg b/templates/cms/nextjs/public/icons/social/reddit.svg
new file mode 100644
index 0000000..aff3d1a
--- /dev/null
+++ b/templates/cms/nextjs/public/icons/social/reddit.svg
@@ -0,0 +1 @@
+Reddit
diff --git a/templates/cms/nextjs/public/icons/social/twitter.svg b/templates/cms/nextjs/public/icons/social/twitter.svg
new file mode 100644
index 0000000..36df2cf
--- /dev/null
+++ b/templates/cms/nextjs/public/icons/social/twitter.svg
@@ -0,0 +1 @@
+X
diff --git a/templates/cms/nextjs/public/icons/social/youtube.svg b/templates/cms/nextjs/public/icons/social/youtube.svg
new file mode 100644
index 0000000..4ed25db
--- /dev/null
+++ b/templates/cms/nextjs/public/icons/social/youtube.svg
@@ -0,0 +1 @@
+YouTube
diff --git a/templates/cms/nextjs/public/images/logo.svg b/templates/cms/nextjs/public/images/logo.svg
new file mode 100644
index 0000000..a4725f8
--- /dev/null
+++ b/templates/cms/nextjs/public/images/logo.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/templates/cms/nextjs/src/app/[[...permalink]]/page.tsx b/templates/cms/nextjs/src/app/[[...permalink]]/page.tsx
new file mode 100644
index 0000000..3dc63a8
--- /dev/null
+++ b/templates/cms/nextjs/src/app/[[...permalink]]/page.tsx
@@ -0,0 +1,56 @@
+import { fetchPageData } from '@/lib/directus/fetchers';
+import PageBuilder from '@/components/layout/PageBuilder';
+import { PageBlock } from '@/types/directus-schema';
+
+export async function generateMetadata({ params }: { params: Promise<{ permalink?: string[] }> }) {
+ const { permalink } = await params;
+ const permalinkSegments = permalink || [];
+ const resolvedPermalink = `/${permalinkSegments.join('/')}`.replace(/\/$/, '') || '/';
+
+ try {
+ const page = await fetchPageData(resolvedPermalink);
+
+ if (!page) {
+ return;
+ }
+
+ return {
+ title: page.title,
+ description: page.description,
+ openGraph: {
+ title: page.title,
+ description: page.description,
+ url: `${process.env.NEXT_PUBLIC_SITE_URL}${resolvedPermalink}`,
+ type: 'website',
+ },
+ };
+ } catch (error) {
+ console.error('Error loading page metadata:', error);
+
+ return;
+ }
+}
+
+export default async function Page({ params }: { params: Promise<{ permalink?: string[] }> }) {
+ const { permalink } = await params;
+
+ const permalinkSegments = permalink || [];
+ const resolvedPermalink = `/${permalinkSegments.join('/')}`.replace(/\/$/, '') || '/';
+
+ let page;
+ try {
+ page = await fetchPageData(resolvedPermalink);
+ } catch (error) {
+ console.error('Error loading page:', error);
+ }
+
+ if (!page || !page.blocks) {
+ return 404 - Page Not Found
;
+ }
+
+ const blocks: PageBlock[] = page.blocks.filter(
+ (block: any): block is PageBlock => typeof block === 'object' && block.collection,
+ );
+
+ return ;
+}
diff --git a/templates/cms/nextjs/src/app/api/draft/route.ts b/templates/cms/nextjs/src/app/api/draft/route.ts
new file mode 100644
index 0000000..002b3b3
--- /dev/null
+++ b/templates/cms/nextjs/src/app/api/draft/route.ts
@@ -0,0 +1,25 @@
+import { draftMode } from 'next/headers';
+
+export async function GET(request: Request) {
+ const { searchParams } = new URL(request.url);
+ const secret = searchParams.get('secret');
+ const slug = searchParams.get('slug');
+
+ if (secret !== process.env.DRAFT_MODE_SECRET) {
+ return new Response('Invalid token', { status: 401 });
+ }
+
+ if (!slug) {
+ return new Response('Missing slug', { status: 401 });
+ }
+
+ const draft = await draftMode();
+ draft.enable();
+
+ return new Response(null, {
+ status: 307,
+ headers: {
+ Location: `/blog/${slug}`,
+ },
+ });
+}
diff --git a/templates/cms/nextjs/src/app/api/search/route.ts b/templates/cms/nextjs/src/app/api/search/route.ts
new file mode 100644
index 0000000..8cdc2ce
--- /dev/null
+++ b/templates/cms/nextjs/src/app/api/search/route.ts
@@ -0,0 +1,73 @@
+import { useDirectus } from '@/lib/directus/directus';
+import { NextResponse } from 'next/server';
+
+export async function GET(request: Request) {
+ const { searchParams } = new URL(request.url);
+ const search = searchParams.get('search');
+
+ if (!search || search.length < 3) {
+ return NextResponse.json({ error: 'Query must be at least 3 characters.' }, { status: 400 });
+ }
+
+ const { directus, readItems } = useDirectus();
+
+ try {
+ const [pages, posts] = await Promise.all([
+ directus.request(
+ readItems('pages', {
+ filter: {
+ _or: [
+ { title: { _contains: search } },
+ { description: { _contains: search } },
+ { permalink: { _contains: search } },
+ ],
+ },
+ fields: ['id', 'title', 'description', 'permalink'],
+ }),
+ ),
+
+ directus.request(
+ readItems('posts', {
+ filter: {
+ _and: [
+ { status: { _eq: 'published' } },
+ {
+ _or: [
+ { title: { _contains: search } },
+ { description: { _contains: search } },
+ { slug: { _contains: search } },
+ { content: { _contains: search } },
+ ],
+ },
+ ],
+ },
+ fields: ['id', 'title', 'description', 'slug', 'content', 'status'],
+ }),
+ ),
+ ]);
+
+ const results = [
+ ...pages.map((page: any) => ({
+ id: page.id,
+ title: page.title,
+ description: page.description,
+ type: 'Page',
+ link: `/${page.permalink.replace(/^\/+/, '')}`,
+ })),
+
+ ...posts.map((post: any) => ({
+ id: post.id,
+ title: post.title,
+ description: post.description,
+ type: 'Post',
+ link: `/blog/${post.slug}`,
+ })),
+ ];
+
+ return NextResponse.json(results);
+ } catch (error) {
+ console.error('Error fetching search results:', error);
+
+ return NextResponse.json({ error: 'Failed to fetch search results.' }, { status: 500 });
+ }
+}
diff --git a/templates/cms/nextjs/src/app/blog/[slug]/page.tsx b/templates/cms/nextjs/src/app/blog/[slug]/page.tsx
new file mode 100644
index 0000000..30adcf6
--- /dev/null
+++ b/templates/cms/nextjs/src/app/blog/[slug]/page.tsx
@@ -0,0 +1,144 @@
+import { fetchPostBySlug, fetchRelatedPosts, fetchAuthorById } from '@/lib/directus/fetchers';
+import { draftMode } from 'next/headers';
+import DirectusImage from '@/components/shared/DirectusImage';
+import BaseText from '@/components/ui/Text';
+import { Separator } from '@/components/ui/separator';
+import ShareDialog from '@/components/ui/ShareDialog';
+import Link from 'next/link';
+import Headline from '@/components/ui/Headline';
+import Container from '@/components/ui/container';
+
+import { getDirectusAssetURL } from '@/lib/directus/directus-utils';
+
+export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }) {
+ const { slug } = await params;
+
+ try {
+ const post = await fetchPostBySlug(slug);
+
+ if (!post) {
+ return;
+ }
+
+ const ogImage = post.image ? getDirectusAssetURL(post.image) : null;
+
+ return {
+ title: post.title,
+ description: post.description,
+ openGraph: {
+ title: post.title,
+ description: post.description,
+ url: `${process.env.NEXT_PUBLIC_SITE_URL}/blog/${slug}`,
+ type: 'article',
+ images: ogImage ? [{ url: ogImage }] : undefined,
+ },
+ };
+ } catch (error) {
+ console.error('Error loading post metadata:', error);
+
+ return;
+ }
+}
+
+export default async function BlogPost({ params }: { params: Promise<{ slug: string }> }) {
+ const { isEnabled } = await draftMode();
+ const { slug } = await params;
+
+ let post;
+ try {
+ post = await fetchPostBySlug(slug);
+ } catch (error) {
+ console.error('Error loading post:', error);
+
+ return;
+ }
+
+ if (!post) {
+ return 404 - Post Not Found
;
+ }
+ const relatedPosts = await fetchRelatedPosts(post.id);
+ const author = post.author ? await fetchAuthorById(post.author as string) : null;
+
+ const authorName = [author?.first_name, author?.last_name].filter(Boolean).join(' ');
+ const postUrl = `${process.env.NEXT_PUBLIC_SITE_URL}/blog/${slug}`;
+
+ return (
+ <>
+ {isEnabled && (Draft Mode)
}
+
+ {post.image && (
+
+ )}
+
+
+
+
+
+
+
+
+
+
+ {author && (
+
+ {author.avatar && (
+
+ )}
+
{authorName &&
{authorName}
}
+
+ )}
+
+ {post.description && {post.description}
}
+
+
+
+
+
+
+
+
Related Posts
+
+ {relatedPosts.map((relatedPost) => (
+
+ {relatedPost.image && (
+
+
+
+ )}
+
{relatedPost.title}
+
+ ))}
+
+
+
+
+
+ >
+ );
+}
diff --git a/templates/cms/nextjs/src/app/layout.tsx b/templates/cms/nextjs/src/app/layout.tsx
new file mode 100644
index 0000000..537cfca
--- /dev/null
+++ b/templates/cms/nextjs/src/app/layout.tsx
@@ -0,0 +1,47 @@
+import '@/styles/globals.css';
+import '@/styles/fonts.css';
+import { ReactNode } from 'react';
+import { Metadata } from 'next';
+
+import NavigationBar from '@/components/layout/NavigationBar';
+import Footer from '@/components/layout/Footer';
+import { ThemeProvider } from '@/components/ui/ThemeProvider';
+import { fetchSiteData } from '@/lib/directus/fetchers';
+import { getDirectusAssetURL } from '@/lib/directus/directus-utils';
+
+export async function generateMetadata(): Promise {
+ const { globals } = await fetchSiteData();
+
+ const siteTitle = globals?.title || 'Simple CMS';
+ const siteDescription = globals?.description || 'A starter CMS template powered by Next.js and Directus.';
+ const faviconURL = globals?.favicon ? getDirectusAssetURL(globals.favicon) : '/favicon.ico';
+
+ return {
+ title: {
+ default: siteTitle,
+ template: `%s | ${siteTitle}`,
+ },
+ description: siteDescription,
+ icons: {
+ icon: faviconURL,
+ },
+ };
+}
+
+export default async function RootLayout({ children }: { children: ReactNode }) {
+ const { globals, headerNavigation, footerNavigation } = await fetchSiteData();
+
+ const accentColor = globals?.accent_color || '#6644ff';
+
+ return (
+
+
+
+
+ {children}
+
+
+
+
+ );
+}
diff --git a/templates/cms/nextjs/src/app/sitemap.ts b/templates/cms/nextjs/src/app/sitemap.ts
new file mode 100644
index 0000000..2fb92c7
--- /dev/null
+++ b/templates/cms/nextjs/src/app/sitemap.ts
@@ -0,0 +1,50 @@
+import { useDirectus } from '@/lib/directus/directus';
+import type { MetadataRoute } from 'next';
+
+export default async function sitemap(): Promise {
+ const siteUrl = process.env.NEXT_PUBLIC_SITE_URL;
+ if (!siteUrl) {
+ throw new Error('Environment variable NEXT_PUBLIC_SITE_URL is not set');
+ }
+
+ const { directus, readItems } = useDirectus();
+
+ try {
+ const pagesPromise = directus.request(
+ readItems('pages', {
+ filter: { status: { _eq: 'published' } },
+ fields: ['permalink', 'published_at'],
+ limit: -1,
+ }),
+ );
+
+ const postsPromise = directus.request(
+ readItems('posts', {
+ filter: { status: { _eq: 'published' } },
+ fields: ['slug', 'published_at'],
+ limit: -1,
+ }),
+ );
+
+ const [pages, posts] = await Promise.all([pagesPromise, postsPromise]);
+
+ const pageUrls = pages
+ .filter((page: { permalink: string; published_at: string | null | undefined }) => page.permalink)
+ .map((page: { permalink: string; published_at: string | null | undefined }) => ({
+ url: `${process.env.NEXT_PUBLIC_SITE_URL}${page.permalink}`,
+ lastModified: page.published_at || new Date().toISOString(),
+ }));
+
+ const postUrls = posts
+ .filter((post: { slug: string | null | undefined; published_at: string | null | undefined }) => post.slug)
+ .map((post: { slug: string | null | undefined; published_at: string | null | undefined }) => ({
+ url: `${process.env.NEXT_PUBLIC_SITE_URL}/blog/${post.slug}`,
+ lastModified: post.published_at || new Date().toISOString(),
+ }));
+
+ return [...pageUrls, ...postUrls];
+ } catch (error) {
+ console.error('Error generating sitemap:', error);
+ throw new Error('Failed to generate sitemap');
+ }
+}
diff --git a/templates/cms/nextjs/src/components/blocks/BaseBlock.tsx b/templates/cms/nextjs/src/components/blocks/BaseBlock.tsx
new file mode 100644
index 0000000..7cf698c
--- /dev/null
+++ b/templates/cms/nextjs/src/components/blocks/BaseBlock.tsx
@@ -0,0 +1,35 @@
+import RichText from '@/components/blocks/RichText';
+import Hero from '@/components/blocks/Hero';
+import Gallery from '@/components/blocks/Gallery';
+import Pricing from '@/components/blocks/Pricing';
+import Posts from '@/components/blocks/Posts';
+import Form from '@/components/blocks/Form';
+
+interface BaseBlockProps {
+ block: {
+ collection: string;
+ item: any;
+ id: string;
+ };
+}
+
+const BaseBlock = ({ block }: BaseBlockProps) => {
+ const components: Record = {
+ block_hero: Hero,
+ block_richtext: RichText,
+ block_gallery: Gallery,
+ block_pricing: Pricing,
+ block_posts: Posts,
+ block_form: Form,
+ };
+
+ const Component = components[block.collection];
+
+ if (!Component) {
+ return null;
+ }
+
+ return ;
+};
+
+export default BaseBlock;
diff --git a/templates/cms/nextjs/src/components/blocks/Button.tsx b/templates/cms/nextjs/src/components/blocks/Button.tsx
new file mode 100644
index 0000000..f97a50b
--- /dev/null
+++ b/templates/cms/nextjs/src/components/blocks/Button.tsx
@@ -0,0 +1,90 @@
+import { Button as ShadcnButton, buttonVariants } from '@/components/ui/button';
+import { LucideIcon, ArrowRight, Plus } from 'lucide-react';
+import Link from 'next/link';
+import { cn } from '@/lib/utils';
+
+export interface ButtonProps {
+ id: string;
+ label?: string | null;
+ variant?: string | null;
+ url?: string | null;
+ type?: 'page' | 'post' | 'url' | 'submit' | null;
+ page?: { permalink: string | null };
+ post?: { slug: string | null };
+ size?: 'default' | 'sm' | 'lg' | 'icon';
+ icon?: 'arrow' | 'plus';
+ customIcon?: LucideIcon;
+ iconPosition?: 'left' | 'right';
+ className?: string;
+ onClick?: () => void;
+ disabled?: boolean;
+ block?: boolean;
+}
+
+const Button = ({
+ label,
+ variant,
+ url,
+ type,
+ page,
+ post,
+ size = 'default',
+ icon,
+ customIcon,
+ iconPosition = 'left',
+ className,
+ onClick,
+ disabled = false,
+ block = false,
+}: ButtonProps) => {
+ const icons: Record = {
+ arrow: ArrowRight,
+ plus: Plus,
+ };
+
+ const Icon = customIcon || (icon ? icons[icon] : null);
+
+ const href = (() => {
+ if (type === 'page' && page?.permalink) return page.permalink;
+ if (type === 'post' && post?.slug) return `/blog/${post.slug}`;
+
+ return url || undefined;
+ })();
+
+ const buttonClasses = cn(
+ buttonVariants({ variant: variant as any, size }),
+ className,
+ disabled && 'opacity-50 cursor-not-allowed',
+ block && 'w-full',
+ );
+
+ const content = (
+
+ {icon && iconPosition === 'left' && Icon && }
+ {label && {label} }
+ {icon && iconPosition === 'right' && Icon && }
+
+ );
+
+ if (href) {
+ return (
+
+ {href.startsWith('/') ? (
+ {content}
+ ) : (
+
+ {content}
+
+ )}
+
+ );
+ }
+
+ return (
+
+ {content}
+
+ );
+};
+
+export default Button;
diff --git a/templates/cms/nextjs/src/components/blocks/ButtonGroup.tsx b/templates/cms/nextjs/src/components/blocks/ButtonGroup.tsx
new file mode 100644
index 0000000..ddc6ebd
--- /dev/null
+++ b/templates/cms/nextjs/src/components/blocks/ButtonGroup.tsx
@@ -0,0 +1,23 @@
+import Button, { ButtonProps } from './Button';
+import { cn } from '@/lib/utils';
+
+export interface ButtonGroupProps {
+ buttons: Array;
+ className?: string;
+}
+
+const ButtonGroup = ({ buttons, className }: ButtonGroupProps) => {
+ if (!buttons || !buttons.length) return null;
+
+ const containerClasses = cn('flex gap-4', className);
+
+ return (
+
+ {buttons.map((button, index) => (
+
+ ))}
+
+ );
+};
+
+export default ButtonGroup;
diff --git a/templates/cms/nextjs/src/components/blocks/Form.tsx b/templates/cms/nextjs/src/components/blocks/Form.tsx
new file mode 100644
index 0000000..dbce88e
--- /dev/null
+++ b/templates/cms/nextjs/src/components/blocks/Form.tsx
@@ -0,0 +1,43 @@
+'use client';
+
+import { FormField } from '@/types/directus-schema';
+import Tagline from '../ui/Tagline';
+import FormBuilder from '../forms/FormBuilder';
+import Headline from '../ui/Headline';
+
+interface FormBlockProps {
+ data: {
+ id: string;
+ tagline: string | null;
+ headline: string | null;
+ form: {
+ id: string;
+ on_success?: 'redirect' | 'message' | null;
+ sort?: number | null;
+ submit_label?: string;
+ success_message?: string | null;
+ title?: string | null;
+ success_redirect_url?: string | null;
+ is_active?: boolean | null;
+ fields: FormField[];
+ };
+ };
+}
+
+const FormBlock = ({ data }: FormBlockProps) => {
+ const { tagline, headline, form } = data;
+
+ if (!form) {
+ return null;
+ }
+
+ return (
+
+ {tagline && }
+ {headline && }
+
+
+ );
+};
+
+export default FormBlock;
diff --git a/templates/cms/nextjs/src/components/blocks/Gallery.tsx b/templates/cms/nextjs/src/components/blocks/Gallery.tsx
new file mode 100644
index 0000000..d8287db
--- /dev/null
+++ b/templates/cms/nextjs/src/components/blocks/Gallery.tsx
@@ -0,0 +1,154 @@
+'use client';
+
+import { useEffect, useState } from 'react';
+import DirectusImage from '@/components/shared/DirectusImage';
+import Tagline from '../ui/Tagline';
+import Headline from '@/components/ui/Headline';
+import { Dialog, DialogContent, DialogDescription, DialogTitle, DialogClose } from '@/components/ui/dialog';
+import { ArrowLeft, ArrowRight, ZoomIn, X } from 'lucide-react';
+
+interface GalleryProps {
+ data: {
+ tagline?: string;
+ headline?: string;
+ items: Array<{
+ id: string;
+ directus_file: string;
+ sort?: number;
+ }>;
+ };
+}
+
+const Gallery = ({ data }: GalleryProps) => {
+ const { tagline, headline, items = [] } = data;
+ const [isLightboxOpen, setLightboxOpen] = useState(false);
+ const [currentIndex, setCurrentIndex] = useState(0);
+
+ const sortedItems = [...items].sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0));
+
+ const isValidIndex = sortedItems.length > 0 && currentIndex >= 0 && currentIndex < sortedItems.length;
+
+ const handleOpenLightbox = (index: number) => {
+ setCurrentIndex(index);
+ setLightboxOpen(true);
+ };
+
+ const handlePrev = () => {
+ setCurrentIndex((prevIndex) => (prevIndex > 0 ? prevIndex - 1 : sortedItems.length - 1));
+ };
+
+ const handleNext = () => {
+ setCurrentIndex((prevIndex) => (prevIndex < sortedItems.length - 1 ? prevIndex + 1 : 0));
+ };
+
+ const handleKeyDown = (e: KeyboardEvent) => {
+ if (isLightboxOpen) {
+ e.stopPropagation();
+ switch (e.key) {
+ case 'ArrowLeft':
+ e.preventDefault();
+ handlePrev();
+ break;
+ case 'ArrowRight':
+ e.preventDefault();
+ handleNext();
+ break;
+ case 'Escape':
+ e.preventDefault();
+ setLightboxOpen(false);
+ break;
+ default:
+ break;
+ }
+ }
+ };
+
+ useEffect(() => {
+ window.addEventListener('keydown', handleKeyDown);
+
+ return () => window.removeEventListener('keydown', handleKeyDown);
+ }, [isLightboxOpen]);
+
+ return (
+
+ {tagline && }
+ {headline && }
+
+ {sortedItems.length > 0 && (
+
+ {sortedItems.map((item, index) => (
+
handleOpenLightbox(index)}
+ aria-label={`Gallery item ${item.id}`}
+ >
+
+
+
+
+
+ ))}
+
+ )}
+
+ {isLightboxOpen && isValidIndex && (
+
+
+ Gallery Image
+
+ Viewing image {currentIndex + 1} of {sortedItems.length}.
+
+
+
+
+
+
+
+
+ Prev
+
+
+ Next
+
+
+
+
+
+
+
+
+
+
+ )}
+
+ );
+};
+
+export default Gallery;
diff --git a/templates/cms/nextjs/src/components/blocks/Hero.tsx b/templates/cms/nextjs/src/components/blocks/Hero.tsx
new file mode 100644
index 0000000..0a9c03e
--- /dev/null
+++ b/templates/cms/nextjs/src/components/blocks/Hero.tsx
@@ -0,0 +1,75 @@
+import Tagline from '../ui/Tagline';
+import Headline from '@/components/ui/Headline';
+import BaseText from '@/components/ui/Text';
+import DirectusImage from '@/components/shared/DirectusImage';
+import ButtonGroup from '@/components/blocks/ButtonGroup';
+import { cn } from '@/lib/utils';
+
+interface HeroProps {
+ data: {
+ tagline: string;
+ headline: string;
+ description: string;
+ layout: 'left' | 'center' | 'right';
+ image: string;
+ button_group?: {
+ buttons: Array<{
+ id: string;
+ label: string | null;
+ variant: string | null;
+ url: string | null;
+ type: 'url' | 'page' | 'post';
+ pagePermalink?: string | null;
+ postSlug?: string | null;
+ }>;
+ };
+ };
+}
+
+const Hero = ({ data }: HeroProps) => {
+ const { layout, tagline, headline, description, image, button_group } = data;
+
+ return (
+
+
+
+
+ {description &&
}
+ {button_group && button_group.buttons.length > 0 && (
+
+
+
+ )}
+
+ {image && (
+
+
+
+ )}
+
+ );
+};
+
+export default Hero;
diff --git a/templates/cms/nextjs/src/components/blocks/Posts.tsx b/templates/cms/nextjs/src/components/blocks/Posts.tsx
new file mode 100644
index 0000000..9c151fe
--- /dev/null
+++ b/templates/cms/nextjs/src/components/blocks/Posts.tsx
@@ -0,0 +1,225 @@
+'use client';
+
+import { useState, useEffect } from 'react';
+import { useRouter, useSearchParams } from 'next/navigation';
+import { ChevronFirst, ChevronLast } from 'lucide-react';
+import Tagline from '../ui/Tagline';
+import Headline from '@/components/ui/Headline';
+import DirectusImage from '@/components/shared/DirectusImage';
+import Link from 'next/link';
+import {
+ Pagination,
+ PaginationContent,
+ PaginationEllipsis,
+ PaginationItem,
+ PaginationLink,
+ PaginationNext,
+ PaginationPrevious,
+} from '../ui/pagination';
+import { Post } from '@/types/directus-schema';
+import { fetchPaginatedPosts, fetchTotalPostCount } from '@/lib/directus/fetchers';
+
+interface PostsProps {
+ data: {
+ tagline?: string;
+ headline?: string;
+ posts: Post[];
+ limit: number;
+ };
+}
+
+const Posts = ({ data }: PostsProps) => {
+ const { tagline, headline, posts, limit } = data;
+ const router = useRouter();
+ const searchParams = useSearchParams();
+ const visiblePages = 5;
+ const initialPage = Number(searchParams.get('page')) || 1;
+ const perPage = limit || 6;
+
+ const [currentPage, setCurrentPage] = useState(initialPage);
+ const [paginatedPosts, setPaginatedPosts] = useState(currentPage === 1 ? posts : []);
+ const [totalPages, setTotalPages] = useState(0);
+
+ useEffect(() => {
+ const fetchTotalPages = async () => {
+ try {
+ const totalCount = await fetchTotalPostCount();
+ setTotalPages(Math.ceil(totalCount / perPage));
+ } catch (error) {
+ console.error('Error fetching total post count:', error);
+ }
+ };
+
+ fetchTotalPages();
+ }, [perPage]);
+
+ useEffect(() => {
+ const fetchPosts = async () => {
+ try {
+ if (currentPage === 1) {
+ setPaginatedPosts(posts);
+
+ return;
+ }
+
+ const response = await fetchPaginatedPosts(perPage, currentPage);
+ setPaginatedPosts(response);
+ } catch (error) {
+ console.error('Error fetching paginated posts:', error);
+ }
+ };
+
+ fetchPosts();
+ }, [currentPage, perPage]);
+
+ const handlePageChange = (page: number) => {
+ if (page >= 1 && page <= totalPages) {
+ setCurrentPage(page);
+ router.replace(`?page=${page}`, { scroll: false });
+ }
+ };
+
+ const generatePagination = () => {
+ const pages: (number | string)[] = [];
+ if (totalPages <= visiblePages) {
+ for (let i = 1; i <= totalPages; i++) {
+ pages.push(i);
+ }
+ } else {
+ const rangeStart = Math.max(1, currentPage - 2);
+ const rangeEnd = Math.min(totalPages, currentPage + 2);
+
+ if (rangeStart > 1) {
+ pages.push('ellipsis-start');
+ }
+
+ for (let i = rangeStart; i <= rangeEnd; i++) {
+ pages.push(i);
+ }
+
+ if (rangeEnd < totalPages) {
+ pages.push('ellipsis-end');
+ }
+ }
+
+ return pages;
+ };
+
+ const paginationLinks = generatePagination();
+
+ return (
+
+ {tagline &&
}
+ {headline &&
}
+
+
+ {paginatedPosts.length > 0 ? (
+ paginatedPosts.map((post) => (
+
+
+ {post.image && (
+
+ )}
+
+
+
+ {post.title}
+
+ {post.description &&
{post.description}
}
+
+
+ ))
+ ) : (
+
No posts available.
+ )}
+
+
+ {totalPages > 1 && (
+
+
+ {totalPages > visiblePages && currentPage > 1 && (
+
+ {
+ e.preventDefault();
+ handlePageChange(1);
+ }}
+ >
+
+
+
+ )}
+
+ {totalPages > visiblePages && currentPage > 1 && (
+
+ {
+ e.preventDefault();
+ handlePageChange(currentPage - 1);
+ }}
+ />
+
+ )}
+
+ {paginationLinks.map((page, index) =>
+ typeof page === 'number' ? (
+
+ {
+ e.preventDefault();
+ handlePageChange(page);
+ }}
+ >
+ {page}
+
+
+ ) : (
+
+
+
+ ),
+ )}
+
+ {totalPages > visiblePages && currentPage < totalPages && (
+
+ {
+ e.preventDefault();
+ handlePageChange(currentPage + 1);
+ }}
+ />
+
+ )}
+
+ {totalPages > visiblePages && currentPage < totalPages && (
+
+ {
+ e.preventDefault();
+ handlePageChange(totalPages);
+ }}
+ >
+
+
+
+ )}
+
+
+ )}
+
+ );
+};
+
+export default Posts;
diff --git a/templates/cms/nextjs/src/components/blocks/Pricing.tsx b/templates/cms/nextjs/src/components/blocks/Pricing.tsx
new file mode 100644
index 0000000..de3345a
--- /dev/null
+++ b/templates/cms/nextjs/src/components/blocks/Pricing.tsx
@@ -0,0 +1,56 @@
+import Tagline from '../ui/Tagline';
+import Headline from '@/components/ui/Headline';
+import PricingCard from '@/components/blocks/PricingCard';
+
+interface PricingProps {
+ data: {
+ tagline?: string;
+ headline?: string;
+ pricing_cards: Array<{
+ id: string;
+ title: string;
+ description?: string;
+ price?: string;
+ badge?: string;
+ features?: string[];
+ button?: {
+ id: string;
+ label: string | null;
+ variant: string | null;
+ url: string | null;
+ };
+ is_highlighted?: boolean;
+ }>;
+ };
+}
+
+const Pricing = ({ data }: PricingProps) => {
+ const { tagline, headline, pricing_cards } = data;
+
+ if (!pricing_cards || !Array.isArray(pricing_cards)) {
+ return null;
+ }
+
+ const gridClasses = (() => {
+ if (pricing_cards.length === 1) return 'grid-cols-1';
+ if (pricing_cards.length % 3 === 0) return 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3';
+
+ // Default to 2 columns for pricing cards
+ return 'grid-cols-1 sm:grid-cols-2';
+ })();
+
+ return (
+
+ {tagline && }
+ {headline && }
+
+
+ {pricing_cards.map((card) => (
+
+ ))}
+
+
+ );
+};
+
+export default Pricing;
diff --git a/templates/cms/nextjs/src/components/blocks/PricingCard.tsx b/templates/cms/nextjs/src/components/blocks/PricingCard.tsx
new file mode 100644
index 0000000..3d49314
--- /dev/null
+++ b/templates/cms/nextjs/src/components/blocks/PricingCard.tsx
@@ -0,0 +1,75 @@
+import { Badge } from '@/components/ui/badge';
+import { Separator } from '@/components/ui/separator';
+import Button from '@/components/blocks/Button';
+import { CheckCircle2 } from 'lucide-react';
+
+export interface PricingCardProps {
+ card: {
+ id: string;
+ title: string;
+ description?: string;
+ price?: string;
+ badge?: string;
+ features?: string[];
+ button?: {
+ id: string;
+ label: string | null;
+ variant: string | null;
+ url: string | null;
+ };
+ is_highlighted?: boolean;
+ };
+}
+
+const PricingCard = ({ card }: PricingCardProps) => {
+ return (
+
+
+
{card.title}
+
+ {card.badge && (
+
+ {card.badge}
+
+ )}
+
+
+ {card.price &&
{card.price}
}
+ {card.description &&
{card.description}
}
+
+
+
+
+ {card.features && Array.isArray(card.features) && (
+
+ {card.features.map((feature, index) => (
+
+
+
+
+ {feature}
+
+ ))}
+
+ )}
+
+
+ {card.button && (
+
+ )}
+
+
+ );
+};
+
+export default PricingCard;
diff --git a/templates/cms/nextjs/src/components/blocks/RichText.tsx b/templates/cms/nextjs/src/components/blocks/RichText.tsx
new file mode 100644
index 0000000..74de7ad
--- /dev/null
+++ b/templates/cms/nextjs/src/components/blocks/RichText.tsx
@@ -0,0 +1,68 @@
+'use client';
+
+import { useEffect } from 'react';
+import { useRouter } from 'next/navigation';
+import { cn } from '@/lib/utils';
+import Tagline from '../ui/Tagline';
+import Headline from '@/components/ui/Headline';
+import Text from '@/components/ui/Text';
+
+interface RichTextProps {
+ data: {
+ tagline?: string;
+ headline?: string;
+ content: string;
+ alignment?: 'left' | 'center' | 'right';
+ };
+ className?: string;
+}
+
+const RichText = ({ data, className }: RichTextProps) => {
+ const { tagline, headline, content, alignment = 'left' } = data;
+ const router = useRouter();
+
+ useEffect(() => {
+ const container = document.querySelector('.prose');
+ const links = container?.querySelectorAll('a');
+
+ links?.forEach((link) => {
+ const href = link.getAttribute('href');
+ if (href && href.startsWith('/')) {
+ link.onclick = (event) => {
+ event.preventDefault();
+ router.push(href);
+ };
+ }
+ });
+
+ const iframes = container?.querySelectorAll('iframe');
+ iframes?.forEach((iframe) => {
+ const wrapper = document.createElement('div');
+ wrapper.className = 'relative aspect-video';
+ iframe.parentNode?.insertBefore(wrapper, iframe);
+ wrapper.appendChild(iframe);
+
+ iframe.style.position = 'absolute';
+ iframe.style.top = '0';
+ iframe.style.left = '0';
+ iframe.style.width = '100%';
+ iframe.style.height = '100%';
+ });
+ }, [content, router]);
+
+ return (
+
+ {tagline && }
+ {headline && }
+
+
+ );
+};
+
+export default RichText;
diff --git a/templates/cms/nextjs/src/components/forms/DynamicForm.tsx b/templates/cms/nextjs/src/components/forms/DynamicForm.tsx
new file mode 100644
index 0000000..7ffb794
--- /dev/null
+++ b/templates/cms/nextjs/src/components/forms/DynamicForm.tsx
@@ -0,0 +1,62 @@
+import { useForm } from 'react-hook-form';
+import { zodResolver } from '@hookform/resolvers/zod';
+import Button from '@/components/blocks/Button';
+import { Form } from '@/components/ui/form';
+import Field from './FormField';
+import { buildZodSchema } from '@/lib/zodSchemaBuilder';
+import type { FormField as FormFieldType } from '@/types/directus-schema';
+
+interface DynamicFormProps {
+ fields: FormFieldType[];
+ onSubmit: (data: Record) => void;
+ submitLabel: string;
+}
+
+const DynamicForm = ({ fields, onSubmit, submitLabel }: DynamicFormProps) => {
+ const sortedFields = [...fields].sort((a, b) => (a.sort || 0) - (b.sort || 0));
+ const formSchema = buildZodSchema(fields);
+
+ const form = useForm({
+ resolver: zodResolver(formSchema),
+ defaultValues: fields.reduce>((defaults, field) => {
+ if (!field.name) return defaults;
+ switch (field.type) {
+ case 'checkbox':
+ defaults[field.name] = false;
+ break;
+ case 'checkbox_group':
+ defaults[field.name] = [];
+ break;
+ case 'radio':
+ defaults[field.name] = '';
+ break;
+ default:
+ defaults[field.name] = '';
+ break;
+ }
+
+ return defaults;
+ }, {}),
+ });
+
+ return (
+
+
+ );
+};
+
+export default DynamicForm;
diff --git a/templates/cms/nextjs/src/components/forms/FormBuilder.tsx b/templates/cms/nextjs/src/components/forms/FormBuilder.tsx
new file mode 100644
index 0000000..45e7f8a
--- /dev/null
+++ b/templates/cms/nextjs/src/components/forms/FormBuilder.tsx
@@ -0,0 +1,73 @@
+'use client';
+
+import { useState } from 'react';
+import { CheckCircle } from 'lucide-react';
+import DynamicForm from './DynamicForm';
+import { submitForm } from '@/lib/directus/forms';
+import { FormField } from '@/types/directus-schema';
+import { cn } from '@/lib/utils';
+interface FormBuilderProps {
+ className?: string;
+ form: {
+ id: string;
+ on_success?: 'redirect' | 'message' | null;
+ sort?: number | null;
+ submit_label?: string;
+ success_message?: string | null;
+ title?: string | null;
+ success_redirect_url?: string | null;
+ is_active?: boolean | null;
+ fields: FormField[];
+ };
+}
+
+const FormBuilder = ({ form, className }: FormBuilderProps) => {
+ const [isSubmitted, setIsSubmitted] = useState(false);
+ const [error, setError] = useState(null);
+
+ if (!form.is_active) return null;
+
+ const handleSubmit = async (data: Record) => {
+ setError(null);
+ try {
+ const fieldsWithNames = form.fields.map((field) => ({
+ id: field.id,
+ name: field.name || '',
+ type: field.type || '',
+ }));
+
+ await submitForm(form.id, fieldsWithNames, data);
+
+ if (form.on_success === 'redirect' && form.success_redirect_url) {
+ window.location.href = form.success_redirect_url;
+ } else {
+ setIsSubmitted(true);
+ }
+ } catch (err) {
+ console.error('Error submitting form:', err);
+ setError('Failed to submit the form. Please try again later.');
+ }
+ };
+
+ if (isSubmitted) {
+ return (
+
+
+
{form.success_message || 'Your form has been submitted successfully.'}
+
+ );
+ }
+
+ return (
+
+ {error && (
+
+ Error: {error}
+
+ )}
+
+
+ );
+};
+
+export default FormBuilder;
diff --git a/templates/cms/nextjs/src/components/forms/FormField.tsx b/templates/cms/nextjs/src/components/forms/FormField.tsx
new file mode 100644
index 0000000..bb342f3
--- /dev/null
+++ b/templates/cms/nextjs/src/components/forms/FormField.tsx
@@ -0,0 +1,97 @@
+import { FormField as ShadcnFormField, FormItem, FormLabel, FormControl, FormMessage } from '@/components/ui/form';
+import { Input } from '@/components/ui/input';
+import { Textarea } from '@/components/ui/textarea';
+import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
+import { Info } from 'lucide-react';
+import CheckboxField from './fields/CheckboxField';
+import CheckboxGroupField from './fields/CheckboxGroupField';
+import RadioGroupField from './fields/RadioGroupField';
+import SelectField from './fields/SelectField';
+import FileUploadField from './fields/FileUploadField';
+import type { FormField as FormFieldType } from '@/types/directus-schema';
+import { UseFormReturn } from 'react-hook-form';
+import { cn } from '@/lib/utils';
+
+interface FieldProps {
+ field: FormFieldType;
+ form: UseFormReturn;
+}
+
+const Field = ({ field, form }: FieldProps) => {
+ if (field.type === 'hidden') return null;
+
+ const getFieldElement = () => {
+ switch (field.type) {
+ case 'text':
+ return ;
+ case 'textarea':
+ return ;
+ case 'checkbox':
+ return ;
+ case 'checkbox_group':
+ return ;
+ case 'radio':
+ return ;
+ case 'select':
+ return (
+
+ );
+ case 'file':
+ return ;
+ default:
+ return null;
+ }
+ };
+
+ const fieldElement = getFieldElement();
+ if (!fieldElement) return null;
+
+ const widthClass = field.width
+ ? {
+ 100: 'flex-[100%]',
+ 50: 'flex-[calc(50%-1rem)]',
+ 67: 'flex-[calc(67%-1rem)]',
+ 33: 'flex-[calc(33%-1rem)]',
+ }[field.width] || 'flex-[100%]'
+ : 'flex-[100%]';
+
+ return (
+
+
(
+
+
+
+ {field.type !== 'checkbox' && {field.label} }
+
+ {field.help && (
+
+
+
+
+
+ {field.help}
+
+
+ )}
+
+ {field.required && *Required }
+
+ {fieldElement}
+
+
+ )}
+ />
+
+ );
+};
+
+export default Field;
diff --git a/templates/cms/nextjs/src/components/forms/fields/CheckboxField.tsx b/templates/cms/nextjs/src/components/forms/fields/CheckboxField.tsx
new file mode 100644
index 0000000..500a042
--- /dev/null
+++ b/templates/cms/nextjs/src/components/forms/fields/CheckboxField.tsx
@@ -0,0 +1,19 @@
+import { Checkbox } from '@/components/ui/checkbox';
+import { UseFormReturn } from 'react-hook-form';
+
+interface CheckboxFieldProps {
+ name: string;
+ label: string;
+ form: UseFormReturn;
+}
+
+const CheckboxField = ({ name, label, form }: CheckboxFieldProps) => (
+
+ form.setValue(name, checked)} />
+
+ {label}
+
+
+);
+
+export default CheckboxField;
diff --git a/templates/cms/nextjs/src/components/forms/fields/CheckboxGroupField.tsx b/templates/cms/nextjs/src/components/forms/fields/CheckboxGroupField.tsx
new file mode 100644
index 0000000..1a8f77c
--- /dev/null
+++ b/templates/cms/nextjs/src/components/forms/fields/CheckboxGroupField.tsx
@@ -0,0 +1,36 @@
+import { Checkbox } from '@/components/ui/checkbox';
+import { UseFormReturn } from 'react-hook-form';
+
+interface CheckboxGroupFieldProps {
+ name: string;
+ options: { value: string; text: string }[];
+ form: UseFormReturn;
+}
+
+const CheckboxGroupField = ({ name, options, form }: CheckboxGroupFieldProps) => {
+ const currentValues = form.watch(name) || [];
+
+ const toggleValue = (value: string, checked?: boolean) => {
+ const updatedValues = checked ? [...currentValues, value] : currentValues.filter((v: string) => v !== value);
+ form.setValue(name, updatedValues);
+ };
+
+ return (
+
+ {options.map((option) => (
+
+ toggleValue(option.value, !!checked)}
+ />
+
+ {option.text}
+
+
+ ))}
+
+ );
+};
+
+export default CheckboxGroupField;
diff --git a/templates/cms/nextjs/src/components/forms/fields/FileUploadField.tsx b/templates/cms/nextjs/src/components/forms/fields/FileUploadField.tsx
new file mode 100644
index 0000000..eba0a19
--- /dev/null
+++ b/templates/cms/nextjs/src/components/forms/fields/FileUploadField.tsx
@@ -0,0 +1,22 @@
+import { Input } from '@/components/ui/input';
+import { UseFormReturn } from 'react-hook-form';
+
+interface FileUploadFieldProps {
+ name: string;
+ form: UseFormReturn;
+}
+
+const FileUploadField = ({ name, form }: FileUploadFieldProps) => {
+ return (
+ {
+ const file = e.target.files?.[0];
+ form.setValue(name, file);
+ }}
+ />
+ );
+};
+
+export default FileUploadField;
diff --git a/templates/cms/nextjs/src/components/forms/fields/RadioGroupField.tsx b/templates/cms/nextjs/src/components/forms/fields/RadioGroupField.tsx
new file mode 100644
index 0000000..620f830
--- /dev/null
+++ b/templates/cms/nextjs/src/components/forms/fields/RadioGroupField.tsx
@@ -0,0 +1,23 @@
+import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';
+import { UseFormReturn } from 'react-hook-form';
+
+interface RadioGroupFieldProps {
+ name: string;
+ options: { value: string; text: string }[];
+ form: UseFormReturn;
+}
+
+const RadioGroupField = ({ name, options, form }: RadioGroupFieldProps) => (
+ form.setValue(name, value)} className="">
+ {options.map((option) => (
+
+
+
+ {option.text}
+
+
+ ))}
+
+);
+
+export default RadioGroupField;
diff --git a/templates/cms/nextjs/src/components/forms/fields/SelectField.tsx b/templates/cms/nextjs/src/components/forms/fields/SelectField.tsx
new file mode 100644
index 0000000..d37cb2f
--- /dev/null
+++ b/templates/cms/nextjs/src/components/forms/fields/SelectField.tsx
@@ -0,0 +1,28 @@
+import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@/components/ui/select';
+import { UseFormReturn } from 'react-hook-form';
+
+interface SelectFieldProps {
+ name: string;
+ options: { value: string; text: string }[];
+ placeholder?: string | null;
+ form: UseFormReturn;
+}
+
+const SelectField = ({ name, options, placeholder, form }: SelectFieldProps) => {
+ return (
+ form.setValue(name, value)} value={form.getValues(name)}>
+
+
+
+
+ {options.map((option) => (
+
+ {option.text}
+
+ ))}
+
+
+ );
+};
+
+export default SelectField;
diff --git a/templates/cms/nextjs/src/components/layout/Footer.tsx b/templates/cms/nextjs/src/components/layout/Footer.tsx
new file mode 100644
index 0000000..4482ccc
--- /dev/null
+++ b/templates/cms/nextjs/src/components/layout/Footer.tsx
@@ -0,0 +1,73 @@
+'use client';
+
+import Link from 'next/link';
+import ThemeToggle from '@/components/ui/ThemeToggle';
+import Container from '@/components/ui/container';
+import { Key } from 'react';
+
+export default function Footer({ navigation, globals }: { navigation: any; globals: any }) {
+ const directusURL = process.env.NEXT_PUBLIC_DIRECTUS_URL;
+ const lightLogoUrl = globals?.logo ? `${directusURL}/assets/${globals.logo}` : '/images/logo.svg';
+ const darkLogoUrl = globals?.logo_dark_mode ? `${directusURL}/assets/${globals.logo_dark_mode}` : '';
+
+ return (
+
+
+
+
+
+
+ {darkLogoUrl && (
+
+ )}
+
+ {globals?.description &&
{globals.description}
}
+ {globals?.social_links && (
+
+ {globals.social_links.map((social: { service: Key | null | undefined; url: string | undefined }) => (
+
+
+
+ ))}
+
+ )}
+
+
+
+
+ {navigation?.items?.map((group: any) => (
+
+ {group.page?.permalink ? (
+
+ {group.title}
+
+ ) : (
+
+ {group.title}
+
+ )}
+
+ ))}
+
+
+
+
+
+
+
+ );
+}
diff --git a/templates/cms/nextjs/src/components/layout/NavigationBar.tsx b/templates/cms/nextjs/src/components/layout/NavigationBar.tsx
new file mode 100644
index 0000000..9edbd29
--- /dev/null
+++ b/templates/cms/nextjs/src/components/layout/NavigationBar.tsx
@@ -0,0 +1,151 @@
+'use client';
+
+import { useState } from 'react';
+import Image from 'next/image';
+import Link from 'next/link';
+import {
+ NavigationMenu,
+ NavigationMenuList,
+ NavigationMenuItem,
+ NavigationMenuTrigger,
+ NavigationMenuContent,
+ NavigationMenuLink,
+} from '@/components/ui/navigation-menu';
+import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from '@/components/ui/dropdown-menu';
+import { Button } from '@/components/ui/button';
+import { Collapsible, CollapsibleTrigger, CollapsibleContent } from '@/components/ui/collapsible';
+import { ChevronDown, Menu } from 'lucide-react';
+import ThemeToggle from '../ui/ThemeToggle';
+import SearchModal from '@/components/ui/SearchModal';
+import Container from '@/components/ui/container';
+
+export default function NavigationBar({ navigation, globals }: { navigation: any; globals: any }) {
+ const [menuOpen, setMenuOpen] = useState(false);
+
+ const directusURL = process.env.NEXT_PUBLIC_DIRECTUS_URL;
+ const lightLogoUrl = globals?.logo ? `${directusURL}/assets/${globals.logo}` : '/images/logo.svg';
+ const darkLogoUrl = globals?.logo_dark_mode ? `${directusURL}/assets/${globals.logo_dark_mode}` : '';
+
+ const handleLinkClick = () => {
+ setMenuOpen(false);
+ };
+
+ return (
+
+
+
+
+ {darkLogoUrl && (
+
+ )}
+
+
+
+
+
+
+ {navigation?.items?.map((section: any) => (
+
+ {section.children && section.children.length > 0 ? (
+ <>
+
+ {section.title}
+
+
+
+ {section.children.map((child: any) => (
+
+
+ {child.title}
+
+
+ ))}
+
+
+ >
+ ) : (
+
+ {section.title}
+
+ )}
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
+ {navigation?.items?.map((section: any) => (
+
+ {section.children && section.children.length > 0 ? (
+
+
+ {section.title}
+
+
+
+ {section.children.map((child: any) => (
+
+ {child.title}
+
+ ))}
+
+
+ ) : (
+
+ {section.title}
+
+ )}
+
+ ))}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/templates/cms/nextjs/src/components/layout/PageBuilder.tsx b/templates/cms/nextjs/src/components/layout/PageBuilder.tsx
new file mode 100644
index 0000000..db674cc
--- /dev/null
+++ b/templates/cms/nextjs/src/components/layout/PageBuilder.tsx
@@ -0,0 +1,26 @@
+import { PageBlock } from '@/types/directus-schema';
+import BaseBlock from '@/components/blocks/BaseBlock';
+import Container from '@/components/ui/container';
+interface PageBuilderProps {
+ sections: PageBlock[];
+}
+
+const PageBuilder = ({ sections }: PageBuilderProps) => {
+ const validBlocks = sections.filter(
+ (block): block is PageBlock & { collection: string; item: object } =>
+ typeof block.collection === 'string' && !!block.item && typeof block.item === 'object',
+ );
+
+ return (
+
+ {validBlocks.map((block) => (
+
+
+
+
+
+ ))}
+
+ );
+};
+export default PageBuilder;
diff --git a/templates/cms/nextjs/src/components/shared/DirectusImage.tsx b/templates/cms/nextjs/src/components/shared/DirectusImage.tsx
new file mode 100644
index 0000000..f60027b
--- /dev/null
+++ b/templates/cms/nextjs/src/components/shared/DirectusImage.tsx
@@ -0,0 +1,14 @@
+import { getDirectusAssetURL } from '@/lib/directus/directus-utils';
+import Image, { ImageProps } from 'next/image';
+
+export interface DirectusImageProps extends Omit {
+ uuid: string;
+}
+
+const DirectusImage = ({ uuid, alt, width, height, ...rest }: DirectusImageProps) => {
+ const src = getDirectusAssetURL(uuid);
+
+ return ;
+};
+
+export default DirectusImage;
diff --git a/templates/cms/nextjs/src/components/ui/Headline.tsx b/templates/cms/nextjs/src/components/ui/Headline.tsx
new file mode 100644
index 0000000..c9c8af4
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/Headline.tsx
@@ -0,0 +1,20 @@
+interface HeadlineProps {
+ headline?: string | null;
+ className?: string;
+ as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span' | 'div';
+}
+
+const Headline = ({ headline, className = '', as: Component = 'p' }: HeadlineProps) => {
+ if (!headline) return null;
+
+ return (
+
+ {headline}
+
+ );
+};
+
+export default Headline;
diff --git a/templates/cms/nextjs/src/components/ui/SearchModal.tsx b/templates/cms/nextjs/src/components/ui/SearchModal.tsx
new file mode 100644
index 0000000..461cf2d
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/SearchModal.tsx
@@ -0,0 +1,129 @@
+'use client';
+
+import { useEffect, useState } from 'react';
+import {
+ CommandDialog,
+ CommandEmpty,
+ CommandGroup,
+ CommandInput,
+ CommandItem,
+ CommandList,
+} from '@/components/ui/command';
+import { Button } from '@/components/ui/button';
+import { Search } from 'lucide-react';
+import { Badge } from '@/components/ui/badge';
+import { debounce } from '@/lib/utils';
+import { DialogDescription, DialogTitle } from './dialog';
+import { useRouter } from 'next/navigation';
+
+type SearchResult = {
+ id: string;
+ title: string;
+ description: string;
+ type: string;
+ link: string;
+};
+
+export default function SearchModal() {
+ const [open, setOpen] = useState(false);
+ const [results, setResults] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const [searched, setSearched] = useState(false);
+
+ const router = useRouter();
+
+ useEffect(() => {
+ const onKeyDown = (e: KeyboardEvent) => {
+ if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'k') {
+ e.preventDefault();
+ setOpen((prev) => !prev);
+ }
+ };
+ document.addEventListener('keydown', onKeyDown);
+
+ return () => document.removeEventListener('keydown', onKeyDown);
+ }, []);
+
+ useEffect(() => {
+ if (!open) {
+ setResults([]);
+ setSearched(false);
+ setLoading(false);
+ }
+ }, [open]);
+
+ const fetchResults = async (search: string) => {
+ if (search.length < 3) {
+ setResults([]);
+ setSearched(false);
+
+ return;
+ }
+
+ setLoading(true);
+ setSearched(true);
+
+ try {
+ const res = await fetch(`/api/search?search=${encodeURIComponent(search)}`);
+ if (!res.ok) throw new Error('Failed to fetch results');
+ const data: SearchResult[] = await res.json();
+ setResults(data.filter((r) => r.link));
+ } catch (error) {
+ console.error('Error fetching search results:', error);
+ setResults([]);
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ const debouncedFetchResults = debounce(fetchResults, 300);
+
+ return (
+
+
setOpen(true)} aria-label="Search">
+
+
+
+
+ Search
+ Search for pages or posts
+
+ debouncedFetchResults(value)}
+ className="m-2 p-4 focus:outline-none text-base leading-normal"
+ />
+
+
+ {!loading && !searched && (
+ Enter a search term above to see results
+ )}
+ {loading && Loading... }
+ {!loading && searched && results.length === 0 && (
+ No results found
+ )}
+ {!loading && results.length > 0 && (
+
+ {results.map((result) => (
+ {
+ router.push(result.link);
+ setOpen(false);
+ }}
+ >
+ {result.type}
+
+
{result.title}
+ {result.description &&
{result.description}
}
+
+
+ ))}
+
+ )}
+
+
+
+ );
+}
diff --git a/templates/cms/nextjs/src/components/ui/ShareDialog.tsx b/templates/cms/nextjs/src/components/ui/ShareDialog.tsx
new file mode 100644
index 0000000..5ccb9e4
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/ShareDialog.tsx
@@ -0,0 +1,101 @@
+'use client';
+
+import { Copy, Share } from 'lucide-react';
+import { useState } from 'react';
+import { Button } from '@/components/ui/button';
+import {
+ Dialog,
+ DialogClose,
+ DialogContent,
+ DialogFooter,
+ DialogHeader,
+ DialogTitle,
+ DialogTrigger,
+} from '@/components/ui/dialog';
+import { Input } from '@/components/ui/input';
+import { Label } from '@/components/ui/label';
+
+const ShareDialog = ({ postUrl, postTitle }: { postUrl: string; postTitle: string }) => {
+ const [copied, setCopied] = useState(false);
+
+ const handleCopy = () => {
+ navigator.clipboard.writeText(postUrl);
+ setCopied(true);
+ setTimeout(() => setCopied(false), 2000);
+ };
+
+ const socialLinks = [
+ {
+ service: 'reddit',
+ url: `http://www.reddit.com/submit?url=${encodeURIComponent(postUrl)}&title=${encodeURIComponent(postTitle)}`,
+ icon: '/icons/social/reddit.svg',
+ },
+ {
+ service: 'x',
+ url: `https://twitter.com/intent/tweet?url=${encodeURIComponent(postUrl)}&text=${encodeURIComponent(postTitle)}`,
+ icon: '/icons/social/twitter.svg',
+ },
+ {
+ service: 'linkedin',
+ url: `https://www.linkedin.com/shareArticle/?mini=true&url=${encodeURIComponent(postUrl)}&title=${encodeURIComponent(postTitle)}`,
+ icon: '/icons/social/linkedin.svg',
+ },
+ ];
+
+ return (
+
+
+
+
+ Share Blog
+
+
+
+
+ Share this blog post
+
+
+ {socialLinks.map((social) => (
+
+
+
+ ))}
+
+
+
+
+ Link
+
+
+
+
+ Copy
+
+
+
+ {copied && Link copied to clipboard!
}
+
+
+
+ Close
+
+
+
+
+
+ );
+};
+
+export default ShareDialog;
diff --git a/templates/cms/nextjs/src/components/ui/Tagline.tsx b/templates/cms/nextjs/src/components/ui/Tagline.tsx
new file mode 100644
index 0000000..58e92c9
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/Tagline.tsx
@@ -0,0 +1,20 @@
+interface TitleProps {
+ tagline?: string | null;
+ className?: string;
+ as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span' | 'div';
+}
+
+const Tagline = ({ tagline, className = '', as: Component = 'h2' }: TitleProps) => {
+ if (!tagline) return null;
+
+ return (
+
+ {tagline}
+
+ );
+};
+
+export default Tagline;
diff --git a/templates/cms/nextjs/src/components/ui/Text.tsx b/templates/cms/nextjs/src/components/ui/Text.tsx
new file mode 100644
index 0000000..2cd33a9
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/Text.tsx
@@ -0,0 +1,12 @@
+import { cn } from '@/lib/utils';
+
+export interface TextProps {
+ content: string;
+ className?: string;
+}
+
+const Text = ({ content, className }: TextProps) => {
+ return
;
+};
+
+export default Text;
diff --git a/templates/cms/nextjs/src/components/ui/ThemeProvider.tsx b/templates/cms/nextjs/src/components/ui/ThemeProvider.tsx
new file mode 100644
index 0000000..3939d2c
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/ThemeProvider.tsx
@@ -0,0 +1,38 @@
+'use client';
+import * as React from 'react';
+import { createContext, useContext, useEffect, useState } from 'react';
+
+import { ThemeProvider as NextThemesProvider } from 'next-themes';
+
+const ThemeContext = createContext({ theme: 'light', setTheme: (theme: string) => {} });
+
+export function ThemeProvider({ children, ...props }: React.ComponentProps) {
+ const [theme, setTheme] = useState('light');
+ const [mounted, setMounted] = useState(false);
+
+ useEffect(() => {
+ const storedTheme = localStorage.getItem('theme');
+ const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
+ setTheme(storedTheme || systemTheme);
+ setMounted(true);
+ }, []);
+
+ useEffect(() => {
+ if (mounted) {
+ document.documentElement.classList.remove('light', 'dark');
+ document.documentElement.classList.add(theme);
+ localStorage.setItem('theme', theme);
+ }
+ }, [theme, mounted]);
+
+ if (!mounted) {
+ return null;
+ }
+
+ return (
+
+ {children}
+
+ );
+}
+export const useTheme = () => useContext(ThemeContext);
diff --git a/templates/cms/nextjs/src/components/ui/ThemeToggle.tsx b/templates/cms/nextjs/src/components/ui/ThemeToggle.tsx
new file mode 100644
index 0000000..dd77588
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/ThemeToggle.tsx
@@ -0,0 +1,55 @@
+'use client';
+
+import { useTheme } from 'next-themes';
+import clsx from 'clsx';
+
+interface ThemeToggleProps {
+ className?: string;
+}
+
+const ThemeToggle = ({ className }: ThemeToggleProps) => {
+ const { theme, setTheme, resolvedTheme } = useTheme();
+
+ const isDark = theme === 'dark' || resolvedTheme === 'dark';
+
+ return (
+ setTheme(isDark ? 'light' : 'dark')}
+ className={clsx(
+ 'p-1 rounded-full border border-gray-300 dark:border-gray-600 bg-gray-100 dark:bg-gray-800 transition-colors',
+ className,
+ )}
+ >
+ {isDark ? (
+
+
+
+ ) : (
+
+
+
+ )}
+
+ );
+};
+
+export default ThemeToggle;
diff --git a/templates/cms/nextjs/src/components/ui/badge.tsx b/templates/cms/nextjs/src/components/ui/badge.tsx
new file mode 100644
index 0000000..7fa5273
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/badge.tsx
@@ -0,0 +1,29 @@
+import * as React from 'react';
+import { cva, type VariantProps } from 'class-variance-authority';
+
+import { cn } from '@/lib/utils';
+
+const badgeVariants = cva(
+ 'inline-flex items-center rounded border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',
+ {
+ variants: {
+ variant: {
+ default: 'border-transparent bg-primary text-accent',
+ secondary: 'border-transparent bg-secondary text-white hover:bg-secondary/80',
+ destructive: 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80',
+ outline: 'text-foreground',
+ },
+ },
+ defaultVariants: {
+ variant: 'default',
+ },
+ },
+);
+
+export interface BadgeProps extends React.HTMLAttributes, VariantProps {}
+
+function Badge({ className, variant, ...props }: BadgeProps) {
+ return
;
+}
+
+export { Badge, badgeVariants };
diff --git a/templates/cms/nextjs/src/components/ui/button.tsx b/templates/cms/nextjs/src/components/ui/button.tsx
new file mode 100644
index 0000000..feb6687
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/button.tsx
@@ -0,0 +1,52 @@
+import * as React from 'react';
+import { Slot } from '@radix-ui/react-slot';
+import { cva, type VariantProps } from 'class-variance-authority';
+
+import { cn } from '@/lib/utils';
+
+const buttonVariants = cva(
+ 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',
+ {
+ variants: {
+ variant: {
+ default: 'bg-gray text-gray-dark hover:bg-gray/90 hover:text-accent',
+ destructive: 'bg-red-600 text-white hover:bg-red-500',
+ outline: 'border border-gray-500 hover:text-accent hover:border-accent',
+ secondary: 'bg-blue text-white hover:bg-blue-800 dark:bg-accent',
+ ghost: 'bg-transparent text-gray-900 hover:bg-background-muted dark:text-white',
+ link: 'text-gray-700 underline-offset-4 hover:text-accent dark:text-gray-500',
+ },
+ size: {
+ default: 'h-10 px-4 py-2',
+ sm: 'h-9 rounded-md px-3',
+ lg: 'h-11 rounded-md px-8',
+ icon: 'size-10 p-0',
+ },
+ block: {
+ true: 'w-full',
+ },
+ },
+ defaultVariants: {
+ variant: 'default',
+ size: 'default',
+ },
+ },
+);
+
+export interface ButtonProps
+ extends React.ButtonHTMLAttributes,
+ VariantProps {
+ asChild?: boolean;
+ block?: boolean;
+}
+
+const Button = React.forwardRef(
+ ({ className, variant, size, asChild = false, block = false, ...props }, ref) => {
+ const Comp = asChild ? Slot : 'button';
+
+ return ;
+ },
+);
+Button.displayName = 'Button';
+
+export { Button, buttonVariants };
diff --git a/templates/cms/nextjs/src/components/ui/checkbox.tsx b/templates/cms/nextjs/src/components/ui/checkbox.tsx
new file mode 100644
index 0000000..72a80cd
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/checkbox.tsx
@@ -0,0 +1,28 @@
+'use client';
+
+import * as React from 'react';
+import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
+import { Check } from 'lucide-react';
+
+import { cn } from '@/lib/utils';
+
+const Checkbox = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+
+
+));
+Checkbox.displayName = CheckboxPrimitive.Root.displayName;
+
+export { Checkbox };
diff --git a/templates/cms/nextjs/src/components/ui/collapsible.tsx b/templates/cms/nextjs/src/components/ui/collapsible.tsx
new file mode 100644
index 0000000..86ab87d
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/collapsible.tsx
@@ -0,0 +1,11 @@
+'use client';
+
+import * as CollapsiblePrimitive from '@radix-ui/react-collapsible';
+
+const Collapsible = CollapsiblePrimitive.Root;
+
+const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;
+
+const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;
+
+export { Collapsible, CollapsibleTrigger, CollapsibleContent };
diff --git a/templates/cms/nextjs/src/components/ui/command.tsx b/templates/cms/nextjs/src/components/ui/command.tsx
new file mode 100644
index 0000000..85b04fe
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/command.tsx
@@ -0,0 +1,136 @@
+'use client';
+
+import * as React from 'react';
+import { type DialogProps } from '@radix-ui/react-dialog';
+import { Command as CommandPrimitive } from 'cmdk';
+import { Search } from 'lucide-react';
+
+import { cn } from '@/lib/utils';
+import { Dialog, DialogContent } from '@/components/ui/dialog';
+
+const Command = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+Command.displayName = CommandPrimitive.displayName;
+
+const CommandDialog = ({ children, ...props }: DialogProps) => {
+ return (
+
+
+
+ {children}
+
+
+
+ );
+};
+
+const CommandInput = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+
+));
+
+CommandInput.displayName = CommandPrimitive.Input.displayName;
+
+const CommandList = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+
+CommandList.displayName = CommandPrimitive.List.displayName;
+
+const CommandEmpty = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>((props, ref) => );
+
+CommandEmpty.displayName = CommandPrimitive.Empty.displayName;
+
+const CommandGroup = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+
+CommandGroup.displayName = CommandPrimitive.Group.displayName;
+
+const CommandSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+CommandSeparator.displayName = CommandPrimitive.Separator.displayName;
+
+const CommandItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+
+CommandItem.displayName = CommandPrimitive.Item.displayName;
+
+const CommandShortcut = ({ className, ...props }: React.HTMLAttributes) => {
+ return ;
+};
+CommandShortcut.displayName = 'CommandShortcut';
+
+export {
+ Command,
+ CommandDialog,
+ CommandInput,
+ CommandList,
+ CommandEmpty,
+ CommandGroup,
+ CommandItem,
+ CommandShortcut,
+ CommandSeparator,
+};
diff --git a/templates/cms/nextjs/src/components/ui/container.tsx b/templates/cms/nextjs/src/components/ui/container.tsx
new file mode 100644
index 0000000..b0a7fc5
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/container.tsx
@@ -0,0 +1,22 @@
+import { PropsWithChildren } from 'react';
+import { cn } from '@/lib/utils';
+
+type SemanticElement = 'div' | 'section' | 'main' | 'article' | 'aside' | 'nav' | 'header' | 'footer' | 'form';
+
+interface ContainerProps extends PropsWithChildren {
+ className?: string;
+ as?: SemanticElement;
+ role?: string;
+}
+
+const Container = ({ children = null, className = '', as: Component = 'div', role }: ContainerProps) => {
+ if (!children) return null;
+
+ return (
+
+ {children}
+
+ );
+};
+
+export default Container;
diff --git a/templates/cms/nextjs/src/components/ui/dialog.tsx b/templates/cms/nextjs/src/components/ui/dialog.tsx
new file mode 100644
index 0000000..857bd9c
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/dialog.tsx
@@ -0,0 +1,99 @@
+'use client';
+
+import * as React from 'react';
+import * as DialogPrimitive from '@radix-ui/react-dialog';
+import { X } from 'lucide-react';
+
+import { cn } from '@/lib/utils';
+
+const Dialog = DialogPrimitive.Root;
+
+const DialogTrigger = DialogPrimitive.Trigger;
+
+const DialogPortal = DialogPrimitive.Portal;
+
+const DialogClose = DialogPrimitive.Close;
+
+const DialogOverlay = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
+
+const DialogContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & { hideCloseButton?: boolean }
+>(({ className, children, hideCloseButton = false, ...props }, ref) => (
+
+
+
+ {children}
+ {!hideCloseButton && (
+
+
+ Close
+
+ )}
+
+
+));
+DialogContent.displayName = DialogPrimitive.Content.displayName;
+
+const DialogHeader = ({ className, ...props }: React.HTMLAttributes) => (
+
+);
+DialogHeader.displayName = 'DialogHeader';
+
+const DialogFooter = ({ className, ...props }: React.HTMLAttributes) => (
+
+);
+DialogFooter.displayName = 'DialogFooter';
+
+const DialogTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+DialogTitle.displayName = DialogPrimitive.Title.displayName;
+
+const DialogDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+DialogDescription.displayName = DialogPrimitive.Description.displayName;
+
+export {
+ Dialog,
+ DialogPortal,
+ DialogOverlay,
+ DialogClose,
+ DialogTrigger,
+ DialogContent,
+ DialogHeader,
+ DialogFooter,
+ DialogTitle,
+ DialogDescription,
+};
diff --git a/templates/cms/nextjs/src/components/ui/dropdown-menu.tsx b/templates/cms/nextjs/src/components/ui/dropdown-menu.tsx
new file mode 100644
index 0000000..e0ecbc7
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/dropdown-menu.tsx
@@ -0,0 +1,181 @@
+'use client';
+
+import * as React from 'react';
+import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
+import { Check, ChevronRight, Circle } from 'lucide-react';
+
+import { cn } from '@/lib/utils';
+
+const DropdownMenu = DropdownMenuPrimitive.Root;
+
+const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
+
+const DropdownMenuGroup = DropdownMenuPrimitive.Group;
+
+const DropdownMenuPortal = DropdownMenuPrimitive.Portal;
+
+const DropdownMenuSub = DropdownMenuPrimitive.Sub;
+
+const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
+
+const DropdownMenuSubTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean;
+ }
+>(({ className, inset, children, ...props }, ref) => (
+
+ {children}
+
+
+));
+DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
+
+const DropdownMenuSubContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
+
+const DropdownMenuContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, sideOffset = 4, ...props }, ref) => (
+
+
+
+));
+DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
+
+const DropdownMenuItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean;
+ }
+>(({ className, inset, ...props }, ref) => (
+
+));
+DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
+
+const DropdownMenuCheckboxItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, checked, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+));
+DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
+
+const DropdownMenuRadioItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+));
+DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
+
+const DropdownMenuLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean;
+ }
+>(({ className, inset, ...props }, ref) => (
+
+));
+DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
+
+const DropdownMenuSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
+
+const DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes) => {
+ return ;
+};
+DropdownMenuShortcut.displayName = 'DropdownMenuShortcut';
+
+export {
+ DropdownMenu,
+ DropdownMenuTrigger,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuCheckboxItem,
+ DropdownMenuRadioItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuShortcut,
+ DropdownMenuGroup,
+ DropdownMenuPortal,
+ DropdownMenuSub,
+ DropdownMenuSubContent,
+ DropdownMenuSubTrigger,
+ DropdownMenuRadioGroup,
+};
diff --git a/templates/cms/nextjs/src/components/ui/form.tsx b/templates/cms/nextjs/src/components/ui/form.tsx
new file mode 100644
index 0000000..61eb7fe
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/form.tsx
@@ -0,0 +1,131 @@
+'use client';
+
+import * as React from 'react';
+import * as LabelPrimitive from '@radix-ui/react-label';
+import { Slot } from '@radix-ui/react-slot';
+import { Controller, ControllerProps, FieldPath, FieldValues, FormProvider, useFormContext } from 'react-hook-form';
+
+import { cn } from '@/lib/utils';
+import { Label } from '@/components/ui/label';
+
+const Form = FormProvider;
+
+type FormFieldContextValue<
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath,
+> = {
+ name: TName;
+};
+
+const FormFieldContext = React.createContext({} as FormFieldContextValue);
+
+const FormField = <
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath,
+>({
+ ...props
+}: ControllerProps) => {
+ return (
+
+
+
+ );
+};
+
+const useFormField = () => {
+ const fieldContext = React.useContext(FormFieldContext);
+ const itemContext = React.useContext(FormItemContext);
+ const { getFieldState, formState } = useFormContext();
+
+ const fieldState = getFieldState(fieldContext.name, formState);
+
+ if (!fieldContext) {
+ throw new Error('useFormField should be used within ');
+ }
+
+ const { id } = itemContext;
+
+ return {
+ id,
+ name: fieldContext.name,
+ formItemId: `${id}-form-item`,
+ formDescriptionId: `${id}-form-item-description`,
+ formMessageId: `${id}-form-item-message`,
+ ...fieldState,
+ };
+};
+
+type FormItemContextValue = {
+ id: string;
+};
+
+const FormItemContext = React.createContext({} as FormItemContextValue);
+
+const FormItem = React.forwardRef>(
+ ({ className, ...props }, ref) => {
+ const id = React.useId();
+
+ return (
+
+
+
+ );
+ },
+);
+FormItem.displayName = 'FormItem';
+
+const FormLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ const { error, formItemId } = useFormField();
+
+ return ;
+});
+FormLabel.displayName = 'FormLabel';
+
+const FormControl = React.forwardRef, React.ComponentPropsWithoutRef>(
+ ({ ...props }, ref) => {
+ const { error, formItemId, formDescriptionId, formMessageId } = useFormField();
+
+ return (
+
+ );
+ },
+);
+FormControl.displayName = 'FormControl';
+
+const FormDescription = React.forwardRef>(
+ ({ className, ...props }, ref) => {
+ const { formDescriptionId } = useFormField();
+
+ return
;
+ },
+);
+FormDescription.displayName = 'FormDescription';
+
+const FormMessage = React.forwardRef>(
+ ({ className, children, ...props }, ref) => {
+ const { error, formMessageId } = useFormField();
+ const body = error ? String(error?.message) : children;
+
+ if (!body) {
+ return null;
+ }
+
+ return (
+
+ {body}
+
+ );
+ },
+);
+FormMessage.displayName = 'FormMessage';
+
+export { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField };
diff --git a/templates/cms/nextjs/src/components/ui/input.tsx b/templates/cms/nextjs/src/components/ui/input.tsx
new file mode 100644
index 0000000..07474c1
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/input.tsx
@@ -0,0 +1,22 @@
+import * as React from 'react';
+
+import { cn } from '@/lib/utils';
+
+const Input = React.forwardRef>(
+ ({ className, type, ...props }, ref) => {
+ return (
+
+ );
+ },
+);
+Input.displayName = 'Input';
+
+export { Input };
diff --git a/templates/cms/nextjs/src/components/ui/label.tsx b/templates/cms/nextjs/src/components/ui/label.tsx
new file mode 100644
index 0000000..084b15b
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/label.tsx
@@ -0,0 +1,19 @@
+'use client';
+
+import * as React from 'react';
+import * as LabelPrimitive from '@radix-ui/react-label';
+import { cva, type VariantProps } from 'class-variance-authority';
+
+import { cn } from '@/lib/utils';
+
+const labelVariants = cva('text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70');
+
+const Label = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & VariantProps
+>(({ className, ...props }, ref) => (
+
+));
+Label.displayName = LabelPrimitive.Root.displayName;
+
+export { Label };
diff --git a/templates/cms/nextjs/src/components/ui/navigation-menu.tsx b/templates/cms/nextjs/src/components/ui/navigation-menu.tsx
new file mode 100644
index 0000000..c0ae1e1
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/navigation-menu.tsx
@@ -0,0 +1,120 @@
+import * as React from 'react';
+import * as NavigationMenuPrimitive from '@radix-ui/react-navigation-menu';
+import { cva } from 'class-variance-authority';
+import { ChevronDown } from 'lucide-react';
+
+import { cn } from '@/lib/utils';
+
+const NavigationMenu = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ {children}
+
+
+));
+NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName;
+
+const NavigationMenuList = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName;
+
+const NavigationMenuItem = NavigationMenuPrimitive.Item;
+
+const navigationMenuTriggerStyle = cva(
+ 'group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:text-accent focus:text-accent focus:text-accent focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:text-accent/50 data-[state=open]:text-accent/50',
+);
+
+const NavigationMenuTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ {children}{' '}
+
+
+));
+NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName;
+
+const NavigationMenuContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName;
+
+const NavigationMenuLink = NavigationMenuPrimitive.Link;
+
+const NavigationMenuViewport = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+NavigationMenuViewport.displayName = NavigationMenuPrimitive.Viewport.displayName;
+
+const NavigationMenuIndicator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+NavigationMenuIndicator.displayName = NavigationMenuPrimitive.Indicator.displayName;
+
+export {
+ navigationMenuTriggerStyle,
+ NavigationMenu,
+ NavigationMenuList,
+ NavigationMenuItem,
+ NavigationMenuContent,
+ NavigationMenuTrigger,
+ NavigationMenuLink,
+ NavigationMenuIndicator,
+ NavigationMenuViewport,
+};
diff --git a/templates/cms/nextjs/src/components/ui/pagination.tsx b/templates/cms/nextjs/src/components/ui/pagination.tsx
new file mode 100644
index 0000000..a55c405
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/pagination.tsx
@@ -0,0 +1,82 @@
+import * as React from 'react';
+import { ChevronLeft, ChevronRight, MoreHorizontal } from 'lucide-react';
+
+import { cn } from '@/lib/utils';
+import { ButtonProps, buttonVariants } from '@/components/ui/button';
+import Link from 'next/link';
+
+const Pagination = ({ className, ...props }: React.ComponentProps<'nav'>) => (
+
+);
+Pagination.displayName = 'Pagination';
+
+const PaginationContent = React.forwardRef>(
+ ({ className, ...props }, ref) => (
+
+ ),
+);
+PaginationContent.displayName = 'PaginationContent';
+
+const PaginationItem = React.forwardRef>(({ className, ...props }, ref) => (
+
+));
+PaginationItem.displayName = 'PaginationItem';
+
+type PaginationLinkProps = {
+ isActive?: boolean;
+} & Pick &
+ React.ComponentProps;
+
+const PaginationLink = ({ className, isActive, size = 'icon', ...props }: PaginationLinkProps) => (
+
+);
+PaginationLink.displayName = 'PaginationLink';
+
+const PaginationPrevious = ({ className, ...props }: React.ComponentProps) => (
+
+
+ Previous
+
+);
+PaginationPrevious.displayName = 'PaginationPrevious';
+
+const PaginationNext = ({ className, ...props }: React.ComponentProps) => (
+
+ Next
+
+
+);
+PaginationNext.displayName = 'PaginationNext';
+
+const PaginationEllipsis = ({ className, ...props }: React.ComponentProps<'span'>) => (
+
+
+ More pages
+
+);
+PaginationEllipsis.displayName = 'PaginationEllipsis';
+
+export {
+ Pagination,
+ PaginationContent,
+ PaginationEllipsis,
+ PaginationItem,
+ PaginationLink,
+ PaginationNext,
+ PaginationPrevious,
+};
diff --git a/templates/cms/nextjs/src/components/ui/radio-group.tsx b/templates/cms/nextjs/src/components/ui/radio-group.tsx
new file mode 100644
index 0000000..72399cb
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/radio-group.tsx
@@ -0,0 +1,38 @@
+'use client';
+
+import * as React from 'react';
+import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
+import { Circle } from 'lucide-react';
+
+import { cn } from '@/lib/utils';
+
+const RadioGroup = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ return ;
+});
+RadioGroup.displayName = RadioGroupPrimitive.Root.displayName;
+
+const RadioGroupItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ return (
+
+
+
+
+
+ );
+});
+RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;
+
+export { RadioGroup, RadioGroupItem };
diff --git a/templates/cms/nextjs/src/components/ui/select.tsx b/templates/cms/nextjs/src/components/ui/select.tsx
new file mode 100644
index 0000000..19caaf9
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/select.tsx
@@ -0,0 +1,145 @@
+'use client';
+
+import * as React from 'react';
+import * as SelectPrimitive from '@radix-ui/react-select';
+import { Check, ChevronDown, ChevronUp } from 'lucide-react';
+
+import { cn } from '@/lib/utils';
+
+const Select = SelectPrimitive.Root;
+
+const SelectGroup = SelectPrimitive.Group;
+
+const SelectValue = SelectPrimitive.Value;
+
+const SelectTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+ span]:line-clamp-1',
+ className,
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+
+));
+SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
+
+const SelectScrollUpButton = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
+
+const SelectScrollDownButton = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
+
+const SelectContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, position = 'popper', ...props }, ref) => (
+
+
+
+
+ {children}
+
+
+
+
+));
+SelectContent.displayName = SelectPrimitive.Content.displayName;
+
+const SelectLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+SelectLabel.displayName = SelectPrimitive.Label.displayName;
+
+const SelectItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+
+ {children}
+
+));
+SelectItem.displayName = SelectPrimitive.Item.displayName;
+
+const SelectSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
+
+export {
+ Select,
+ SelectGroup,
+ SelectValue,
+ SelectTrigger,
+ SelectContent,
+ SelectLabel,
+ SelectItem,
+ SelectSeparator,
+ SelectScrollUpButton,
+ SelectScrollDownButton,
+};
diff --git a/templates/cms/nextjs/src/components/ui/separator.tsx b/templates/cms/nextjs/src/components/ui/separator.tsx
new file mode 100644
index 0000000..66de99f
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/separator.tsx
@@ -0,0 +1,26 @@
+'use client';
+
+import * as React from 'react';
+import * as SeparatorPrimitive from '@radix-ui/react-separator';
+
+import { cn } from '@/lib/utils';
+
+const Separator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => (
+
+));
+Separator.displayName = SeparatorPrimitive.Root.displayName;
+
+export { Separator };
diff --git a/templates/cms/nextjs/src/components/ui/textarea.tsx b/templates/cms/nextjs/src/components/ui/textarea.tsx
new file mode 100644
index 0000000..9c78267
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/textarea.tsx
@@ -0,0 +1,21 @@
+import * as React from 'react';
+
+import { cn } from '@/lib/utils';
+
+const Textarea = React.forwardRef>(
+ ({ className, ...props }, ref) => {
+ return (
+
+ );
+ },
+);
+Textarea.displayName = 'Textarea';
+
+export { Textarea };
diff --git a/templates/cms/nextjs/src/components/ui/tooltip.tsx b/templates/cms/nextjs/src/components/ui/tooltip.tsx
new file mode 100644
index 0000000..2e32f3f
--- /dev/null
+++ b/templates/cms/nextjs/src/components/ui/tooltip.tsx
@@ -0,0 +1,30 @@
+'use client';
+
+import * as React from 'react';
+import * as TooltipPrimitive from '@radix-ui/react-tooltip';
+
+import { cn } from '@/lib/utils';
+
+const TooltipProvider = TooltipPrimitive.Provider;
+
+const Tooltip = TooltipPrimitive.Root;
+
+const TooltipTrigger = TooltipPrimitive.Trigger;
+
+const TooltipContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, sideOffset = 4, ...props }, ref) => (
+
+));
+TooltipContent.displayName = TooltipPrimitive.Content.displayName;
+
+export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
diff --git a/templates/cms/nextjs/src/lib/directus/directus-utils.ts b/templates/cms/nextjs/src/lib/directus/directus-utils.ts
new file mode 100644
index 0000000..4fbc672
--- /dev/null
+++ b/templates/cms/nextjs/src/lib/directus/directus-utils.ts
@@ -0,0 +1,11 @@
+import { DirectusFile } from '@/types/directus-schema';
+
+export function getDirectusAssetURL(fileOrString: string | DirectusFile | null | undefined): string {
+ if (!fileOrString) return '';
+
+ if (typeof fileOrString === 'string') {
+ return `${process.env.NEXT_PUBLIC_DIRECTUS_URL}/assets/${fileOrString}`;
+ }
+
+ return `${process.env.NEXT_PUBLIC_DIRECTUS_URL}/assets/${fileOrString.id}`;
+}
diff --git a/templates/cms/nextjs/src/lib/directus/directus.ts b/templates/cms/nextjs/src/lib/directus/directus.ts
new file mode 100644
index 0000000..e09674d
--- /dev/null
+++ b/templates/cms/nextjs/src/lib/directus/directus.ts
@@ -0,0 +1,50 @@
+import {
+ createDirectus,
+ readItems,
+ readItem,
+ readSingleton,
+ rest,
+ readUser,
+ createItem,
+ uploadFiles,
+ withToken,
+} from '@directus/sdk';
+import type { RestClient } from '@directus/sdk';
+import Queue from 'p-queue';
+import type { Schema } from '@/types/directus-schema';
+
+// Helper for retrying fetch requests
+const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
+const fetchRetry = async (count: number, ...args: Parameters) => {
+ const response = await fetch(...args);
+
+ if (count > 2 || response.status !== 429) return response;
+
+ console.warn(`[429] Too Many Requests (Attempt ${count + 1})`);
+
+ await sleep(500);
+
+ return fetchRetry(count + 1, ...args);
+};
+
+// Queue for rate-limited requests
+const queue = new Queue({ intervalCap: 10, interval: 500, carryoverConcurrencyCount: true });
+
+const directusUrl = process.env.NEXT_PUBLIC_DIRECTUS_URL as string;
+
+const directus = createDirectus(directusUrl, {
+ globals: {
+ fetch: (...args) => queue.add(() => fetchRetry(0, ...args)),
+ },
+}).with(rest());
+
+export const useDirectus = () => ({
+ directus: directus as RestClient,
+ readItems,
+ readItem,
+ readSingleton,
+ readUser,
+ createItem,
+ uploadFiles,
+ withToken,
+});
diff --git a/templates/cms/nextjs/src/lib/directus/fetchers.ts b/templates/cms/nextjs/src/lib/directus/fetchers.ts
new file mode 100644
index 0000000..5f049d5
--- /dev/null
+++ b/templates/cms/nextjs/src/lib/directus/fetchers.ts
@@ -0,0 +1,333 @@
+import { BlockPost, PageBlock, Post, Schema } from '@/types/directus-schema';
+import { useDirectus } from './directus';
+import { QueryFilter, readItems, aggregate, readItem, readSingleton } from '@directus/sdk';
+
+/**
+ * Fetches page data by permalink, including all nested blocks and dynamically fetching blog posts if required.
+ */
+export const fetchPageData = async (permalink: string, postPage = 1) => {
+ const { directus, readItems } = useDirectus();
+
+ try {
+ const pageData = await directus.request(
+ readItems('pages', {
+ filter: { permalink: { _eq: permalink } },
+ limit: 1,
+ fields: [
+ 'title',
+ 'description',
+ {
+ blocks: [
+ 'id',
+ 'background',
+ 'collection',
+ 'item',
+ 'sort',
+ 'hide_block',
+ {
+ item: {
+ block_richtext: ['tagline', 'headline', 'content', 'alignment'],
+ block_gallery: ['id', 'tagline', 'headline', { items: ['id', 'directus_file', 'sort'] }],
+ block_pricing: [
+ 'tagline',
+ 'headline',
+ {
+ pricing_cards: [
+ 'id',
+ 'title',
+ 'description',
+ 'price',
+ 'badge',
+ 'features',
+ 'is_highlighted',
+ {
+ button: [
+ 'id',
+ 'label',
+ 'variant',
+ 'url',
+ 'type',
+ { page: ['permalink'] },
+ { post: ['slug'] },
+ ],
+ },
+ ],
+ },
+ ],
+ block_hero: [
+ 'tagline',
+ 'headline',
+ 'description',
+ 'layout',
+ 'image',
+ {
+ button_group: [
+ 'id',
+ {
+ buttons: [
+ 'id',
+ 'label',
+ 'variant',
+ 'url',
+ 'type',
+ { page: ['permalink'] },
+ { post: ['slug'] },
+ ],
+ },
+ ],
+ },
+ ],
+ block_posts: ['tagline', 'headline', 'collection', 'limit'],
+ block_form: [
+ 'id',
+ 'tagline',
+ 'headline',
+ {
+ form: [
+ 'id',
+ 'title',
+ 'submit_label',
+ 'success_message',
+ 'on_success',
+ 'success_redirect_url',
+ 'is_active',
+ {
+ fields: [
+ 'id',
+ 'name',
+ 'type',
+ 'label',
+ 'placeholder',
+ 'help',
+ 'validation',
+ 'width',
+ 'choices',
+ 'required',
+ 'sort',
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ },
+ ],
+ },
+ ],
+ deep: {
+ blocks: { _sort: ['sort'], _filter: { hide_block: { _neq: true } } },
+ },
+ }),
+ );
+
+ if (!pageData.length) {
+ throw new Error('Page not found');
+ }
+
+ const page = pageData[0];
+
+ if (Array.isArray(page.blocks)) {
+ for (const block of page.blocks as PageBlock[]) {
+ if (
+ block.collection === 'block_posts' &&
+ typeof block.item === 'object' &&
+ (block.item as BlockPost).collection === 'posts'
+ ) {
+ const limit = (block.item as BlockPost).limit ?? 6;
+ const posts = await directus.request(
+ readItems('posts', {
+ fields: ['id', 'title', 'description', 'slug', 'image', 'status', 'published_at'],
+ filter: { status: { _eq: 'published' } },
+ sort: ['-published_at'],
+ limit,
+ page: postPage,
+ }),
+ );
+
+ (block.item as BlockPost & { posts: Post[] }).posts = posts;
+ }
+ }
+ }
+
+ return page;
+ } catch (error) {
+ console.error('Error fetching page data:', error);
+ throw new Error('Failed to fetch page data');
+ }
+};
+
+/**
+ * Fetches global site data, header navigation, and footer navigation.
+ */
+export const fetchSiteData = async () => {
+ const { directus } = useDirectus();
+
+ try {
+ const [globals, headerNavigation, footerNavigation] = await Promise.all([
+ directus.request(
+ readSingleton('globals', {
+ fields: ['title', 'description', 'logo', 'logo_dark_mode', 'social_links', 'accent_color', 'favicon'],
+ }),
+ ),
+ directus.request(
+ readItem('navigation', 'main', {
+ fields: [
+ {
+ items: [
+ 'id',
+ 'title',
+ {
+ page: ['permalink'],
+ children: ['id', 'title', 'url', { page: ['permalink'] }],
+ },
+ ],
+ },
+ ],
+ deep: { items: { _sort: ['sort'] } },
+ }),
+ ),
+ directus.request(
+ readItem('navigation', 'footer', {
+ fields: [
+ {
+ items: [
+ 'id',
+ 'title',
+ {
+ page: ['permalink'],
+ children: ['id', 'title', 'url', { page: ['permalink'] }],
+ },
+ ],
+ },
+ ],
+ }),
+ ),
+ ]);
+
+ return { globals, headerNavigation, footerNavigation };
+ } catch (error) {
+ console.error('Error fetching site data:', error);
+ throw new Error('Failed to fetch site data');
+ }
+};
+
+/**
+ * Fetches a single blog post by slug. Handles live preview mode
+ */
+export const fetchPostBySlug = async (slug: string, options?: { draft?: boolean }) => {
+ const { directus, readItems } = useDirectus();
+
+ try {
+ const filter: QueryFilter = options?.draft
+ ? { slug: { _eq: slug } }
+ : { slug: { _eq: slug }, status: { _eq: 'published' } };
+
+ const posts = await directus.request(
+ readItems('posts', {
+ filter,
+ limit: 1,
+ fields: ['id', 'title', 'content', 'status', 'image', 'description', 'author'],
+ }),
+ );
+
+ const post = posts[0];
+
+ if (!post) {
+ console.error(`No post found with slug: ${slug}`);
+
+ return null;
+ }
+
+ return post;
+ } catch (error) {
+ console.error(`Error fetching post with slug "${slug}":`, error);
+ throw new Error(`Failed to fetch post with slug "${slug}"`);
+ }
+};
+
+/**
+ * Fetches related blog posts excluding the given ID.
+ */
+export const fetchRelatedPosts = async (excludeId: string) => {
+ const { directus, readItems } = useDirectus();
+
+ try {
+ const relatedPosts = await directus.request(
+ readItems('posts', {
+ filter: { status: { _eq: 'published' }, id: { _neq: excludeId } },
+ fields: ['id', 'title', 'image', 'slug'],
+ limit: 2,
+ }),
+ );
+
+ return relatedPosts;
+ } catch (error) {
+ console.error('Error fetching related posts:', error);
+ throw new Error('Failed to fetch related posts');
+ }
+};
+
+/**
+ * Fetches author details by ID.
+ */
+export const fetchAuthorById = async (authorId: string) => {
+ const { directus, readUser } = useDirectus();
+
+ try {
+ const author = await directus.request(
+ readUser(authorId, {
+ fields: ['first_name', 'last_name', 'avatar'],
+ }),
+ );
+
+ return author;
+ } catch (error) {
+ console.error(`Error fetching author with ID "${authorId}":`, error);
+ throw new Error(`Failed to fetch author with ID "${authorId}"`);
+ }
+};
+
+/**
+ * Fetches paginated blog posts.
+ */
+export const fetchPaginatedPosts = async (limit: number, page: number) => {
+ const { directus } = useDirectus();
+ try {
+ const response = await directus.request(
+ readItems('posts', {
+ limit,
+ page,
+ sort: ['-published_at'],
+ fields: ['id', 'title', 'description', 'slug', 'image'],
+ filter: { status: { _eq: 'published' } },
+ }),
+ );
+
+ return response;
+ } catch (error) {
+ console.error('Error fetching paginated posts:', error);
+ throw new Error('Failed to fetch paginated posts');
+ }
+};
+
+/**
+ * Fetches the total number of published blog posts.
+ */
+export const fetchTotalPostCount = async (): Promise => {
+ const { directus } = useDirectus();
+
+ try {
+ const response = await directus.request(
+ aggregate('posts', {
+ aggregate: { count: '*' },
+ filter: { status: { _eq: 'published' } },
+ }),
+ );
+
+ return Number(response[0]?.count) || 0;
+ } catch (error) {
+ console.error('Error fetching total post count:', error);
+
+ return 0;
+ }
+};
diff --git a/templates/cms/nextjs/src/lib/directus/forms.ts b/templates/cms/nextjs/src/lib/directus/forms.ts
new file mode 100644
index 0000000..00f348e
--- /dev/null
+++ b/templates/cms/nextjs/src/lib/directus/forms.ts
@@ -0,0 +1,59 @@
+import { useDirectus } from './directus';
+
+interface SubmissionValue {
+ field: string;
+ value?: string;
+ file?: string;
+}
+
+export const submitForm = async (
+ formId: string,
+ fields: { id: string; name: string; type: string }[],
+ data: Record,
+) => {
+ const { directus, uploadFiles, createItem, withToken } = useDirectus();
+ const TOKEN = process.env.DIRECTUS_FORM_TOKEN;
+
+ if (!TOKEN) {
+ throw new Error('DIRECTUS_FORM_TOKEN is not defined. Check your .env file.');
+ }
+
+ try {
+ const submissionValues: SubmissionValue[] = [];
+
+ for (const field of fields) {
+ const value = data[field.name];
+
+ if (value === undefined || value === null) continue;
+
+ if (field.type === 'file' && value instanceof File) {
+ const formData = new FormData();
+ formData.append('file', value);
+
+ const uploadedFile = await directus.request(withToken(TOKEN, uploadFiles(formData)));
+
+ if (uploadedFile && 'id' in uploadedFile) {
+ submissionValues.push({
+ field: field.id,
+ file: uploadedFile.id,
+ });
+ }
+ } else {
+ submissionValues.push({
+ field: field.id,
+ value: value.toString(),
+ });
+ }
+ }
+
+ const payload = {
+ form: formId,
+ values: submissionValues,
+ };
+
+ await directus.request(withToken(TOKEN, createItem('form_submissions', payload)));
+ } catch (error) {
+ console.error('Error submitting form:', error);
+ throw new Error('Failed to submit form');
+ }
+};
diff --git a/templates/cms/nextjs/src/lib/directus/generateDirectusTypes.ts b/templates/cms/nextjs/src/lib/directus/generateDirectusTypes.ts
new file mode 100644
index 0000000..75299b0
--- /dev/null
+++ b/templates/cms/nextjs/src/lib/directus/generateDirectusTypes.ts
@@ -0,0 +1,26 @@
+import { config } from 'dotenv';
+import { generateDirectusTypes } from 'directus-sdk-typegen';
+
+config();
+
+async function generateTypes() {
+ const directusUrl = process.env.NEXT_PUBLIC_DIRECTUS_URL;
+ const directusToken = process.env.DIRECTUS_PUBLIC_TOKEN;
+
+ if (!directusUrl || !directusToken) {
+ console.error('Error: NEXT_PUBLIC_DIRECTUS_URL or DIRECTUS_PUBLIC_TOKEN is missing in the .env file.');
+ process.exit(1);
+ }
+ try {
+ await generateDirectusTypes({
+ outputPath: './src/types/directus-schema.ts',
+ directusUrl,
+ directusToken,
+ });
+ console.log('Types successfully generated!');
+ } catch (error) {
+ console.error('Failed to generate types:', error);
+ }
+}
+
+generateTypes();
diff --git a/templates/cms/nextjs/src/lib/utils.ts b/templates/cms/nextjs/src/lib/utils.ts
new file mode 100644
index 0000000..1774d30
--- /dev/null
+++ b/templates/cms/nextjs/src/lib/utils.ts
@@ -0,0 +1,23 @@
+import { ClassValue, clsx } from 'clsx';
+import { twMerge } from 'tailwind-merge';
+import { Metadata } from 'next';
+
+/**
+ * Combines class names dynamically with Tailwind merge.
+ *
+ * @param inputs - The class names to combine
+ * @returns A single string with combined class names
+ */
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs));
+}
+
+// Native debounce utility
+export function debounce void>(func: T, wait: number): (...args: Parameters) => void {
+ let timeout: ReturnType | null;
+
+ return (...args: Parameters) => {
+ if (timeout) clearTimeout(timeout);
+ timeout = setTimeout(() => func(...args), wait);
+ };
+}
diff --git a/templates/cms/nextjs/src/lib/zodSchemaBuilder.ts b/templates/cms/nextjs/src/lib/zodSchemaBuilder.ts
new file mode 100644
index 0000000..1bece61
--- /dev/null
+++ b/templates/cms/nextjs/src/lib/zodSchemaBuilder.ts
@@ -0,0 +1,100 @@
+import { z } from 'zod';
+import type { FormField } from '@/types/directus-schema';
+
+export const buildZodSchema = (fields: FormField[]) => {
+ const schema: Record = {};
+
+ fields.forEach((field) => {
+ let fieldSchema: z.ZodTypeAny;
+
+ switch (field.type) {
+ case 'checkbox':
+ fieldSchema = z.boolean().default(false);
+ break;
+
+ case 'checkbox_group':
+ fieldSchema = z.array(z.string()).default([]);
+ break;
+
+ case 'radio':
+ fieldSchema = z.string();
+ break;
+
+ case 'file':
+ if (field.required) {
+ fieldSchema = z.instanceof(File, {
+ message: `${field.label || field.name} is required`,
+ });
+ } else {
+ fieldSchema = z
+ .instanceof(File, {
+ message: `${field.label || field.name} must be a valid file if provided`,
+ })
+ .or(z.undefined());
+ }
+ break;
+
+ default:
+ fieldSchema = z.string();
+ break;
+ }
+
+ if (field.validation) {
+ const rules = field.validation.split('|');
+ rules.forEach((rule) => {
+ const [ruleName, ruleValue] = rule.split(':');
+ const normalizedRule = ruleName.toLowerCase();
+
+ if (fieldSchema instanceof z.ZodString) {
+ switch (normalizedRule) {
+ case 'email':
+ fieldSchema = fieldSchema.email(`${field.label || field.name} must be a valid email`);
+ break;
+
+ case 'url':
+ fieldSchema = fieldSchema.url(`${field.label || field.name} must be a valid URL`);
+ break;
+
+ case 'min': {
+ const min = parseInt(ruleValue, 10);
+ fieldSchema = fieldSchema.min(min, `${field.label || field.name} must be at least ${min} characters`);
+ break;
+ }
+
+ case 'max': {
+ const max = parseInt(ruleValue, 10);
+ fieldSchema = fieldSchema.max(max, `${field.label || field.name} must be at most ${max} characters`);
+ break;
+ }
+ case 'length': {
+ const length = parseInt(ruleValue, 10);
+ fieldSchema = fieldSchema.length(
+ length,
+ `${field.label || field.name} must be exactly ${length} characters`,
+ );
+ break;
+ }
+
+ default:
+ console.warn(`Unknown validation rule: ${ruleName}`);
+ }
+ }
+ });
+ }
+
+ if (field.required) {
+ if (fieldSchema instanceof z.ZodString) {
+ fieldSchema = fieldSchema.nonempty(`${field.label || field.name} is required`);
+ }
+ } else {
+ // Allow empty strings or undefined for optional fields
+ fieldSchema = fieldSchema.or(z.literal('')).or(z.undefined());
+ }
+
+ if (field.name) {
+ schema[field.name] = fieldSchema;
+ }
+ });
+
+ return z.object(schema);
+};
diff --git a/templates/cms/nextjs/src/styles/fonts.css b/templates/cms/nextjs/src/styles/fonts.css
new file mode 100644
index 0000000..751dedb
--- /dev/null
+++ b/templates/cms/nextjs/src/styles/fonts.css
@@ -0,0 +1,26 @@
+@font-face {
+ font-family: 'Inter';
+ font-weight: 100 900;
+ font-display: swap;
+ src: url('/fonts/inter.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Poppins';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('/fonts/poppins-400.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Poppins';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url('/fonts/poppins-700.woff2') format('woff2');
+}
+
+html {
+ font-family: 'Inter', sans-serif;
+}
diff --git a/templates/cms/nextjs/src/styles/globals.css b/templates/cms/nextjs/src/styles/globals.css
new file mode 100644
index 0000000..4a65bb8
--- /dev/null
+++ b/templates/cms/nextjs/src/styles/globals.css
@@ -0,0 +1,56 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+:root {
+ --background-color: #ffffff; /* Light background */
+ --foreground-color: #42566e; /* Light text */
+ --background-color-muted: color-mix(in srgb, var(--background-color), var(--foreground-color) 10%);
+ --accent-color: #6644ff; /* Accent color */
+ --background-variant-color: #172940;
+ --accent-color-dark: color-mix(in srgb, var(--accent-color), black 40%);
+ --accent-color-soft: color-mix(in srgb, var(--accent-color), white 20%);
+ --accent-color-light: color-mix(in srgb, var(--accent-color), white 90%);
+ --input-color: color-mix(in srgb, var(--background-color), var(--foreground-color) 30%);
+}
+
+.dark {
+ --background-color: #0e1a2b ; /* Default dark background */
+ --background-color-muted: color-mix(in srgb, var(--background-color), var(--foreground-color) 10%);
+ --background-variant-color: #172940;
+ --foreground-color: #ffffff; /* Default dark text */
+}
+
+@layer base {
+ html {
+ @apply bg-[var(--background-color)] text-[var(--foreground-color)];
+ }
+}
+
+@layer components {
+ input:focus,
+ textarea:focus,
+ select:focus,
+ button:focus,
+ a:focus,
+ [role='button']:focus {
+ @apply outline-none ring-2 ring-[var(--accent-color)] ring-offset-2 ring-offset-background;
+ }
+
+ [data-background='dark'] {
+ @apply bg-gray dark:bg-[var(--background-variant-color)];
+ }
+
+
+ :root:not(.dark) [data-background='dark'] {
+ .inline-flex[class*='bg-gray'] {
+ @apply bg-[#172940] text-white hover:bg-accent;
+ }
+ }
+}
+
+@layer utilities {
+ a {
+ @apply hover:text-accent transition-colors no-underline;
+ }
+}
diff --git a/templates/cms/nextjs/src/types/directus-schema.ts b/templates/cms/nextjs/src/types/directus-schema.ts
new file mode 100644
index 0000000..e29f6a4
--- /dev/null
+++ b/templates/cms/nextjs/src/types/directus-schema.ts
@@ -0,0 +1,830 @@
+/* eslint-disable no-useless-escape */
+export interface BlockButton {
+ /** @required */
+ id: string;
+ sort?: number | null;
+ /** @description What type of link is this? Page and Post allow you to link to internal content. URL is for external content. Group can contain other menu items. */
+ type?: 'page' | 'post' | 'url' | null;
+ /** @description The internal page to link to. */
+ page?: Page | string | null;
+ /** @description The internal post to link to. */
+ post?: Post | string | null;
+ /** @description Text to include on the button. */
+ label?: string | null;
+ /** @description What type of button */
+ variant?: 'default' | 'outline' | 'soft' | 'ghost' | 'link' | null;
+ /** @description The id of the Button Group this button belongs to. */
+ button_group?: BlockButtonGroup | string | null;
+ /** @description The URL to link to. Could be relative (ie `/my-page`) or a full external URL (ie `https://docs.directus.io`) */
+ url?: string | null;
+}
+
+export interface BlockButtonGroup {
+ /** @required */
+ id: string;
+ sort?: number | null;
+ /** @description Add individual buttons to the button group. */
+ buttons?: BlockButton[] | string[];
+}
+
+export interface BlockForm {
+ /** @required */
+ id: string;
+ /** @description Form to show within block */
+ form?: Form | string | null;
+ /** @description Larger main headline for this page section. */
+ headline?: string | null;
+ /** @description Smaller copy shown above the headline to label a section or add extra context. */
+ tagline?: string | null;
+}
+
+export interface BlockGallery {
+ /** @description Larger main headline for this page section. */
+ headline?: string | null;
+ /** @required */
+ id: string;
+ /** @description Smaller copy shown above the headline to label a section or add extra context. */
+ tagline?: string | null;
+}
+
+export interface BlockGalleryItem {
+ /** @required */
+ id: string;
+ /** @description The id of the gallery block this item belongs to. */
+ block_gallery?: BlockGallery | string | null;
+ /** @description The id of the file included in the gallery. */
+ directus_file?: DirectusFile | string | null;
+ sort?: number | null;
+}
+
+export interface BlockHero {
+ /** @description Larger main headline for this page section. */
+ headline?: string | null;
+ /** @required */
+ id: string;
+ /** @description Featured image in the hero. */
+ image?: DirectusFile | string | null;
+ /** @description Action buttons that show below headline and description. */
+ button_group?: BlockButtonGroup | string | null;
+ /** @description Supporting copy that shows below the headline. */
+ description?: string | null;
+ /** @description Smaller copy shown above the headline to label a section or add extra context. */
+ tagline?: string | null;
+ /** @description The layout for the component. You can set the image to display left, right, or in the center of page.. */
+ layout?: string | null;
+}
+
+export interface BlockPost {
+ /** @required */
+ id: string;
+ /** @description Larger main headline for this page section. */
+ headline?: string | null;
+ /** @description The collection of content to fetch and display on the page within this block. @required */
+ collection: 'posts';
+ /** @description Smaller copy shown above the headline to label a section or add extra context. */
+ tagline?: string | null;
+ limit?: number | null;
+}
+
+export interface BlockPricing {
+ /** @required */
+ id: string;
+ /** @description Larger main headline for this page section. */
+ headline?: string | null;
+ /** @description Smaller copy shown above the headline to label a section or add extra context. */
+ tagline?: string | null;
+ /** @description The individual pricing cards to display. */
+ pricing_cards?: BlockPricingCard[] | string[];
+}
+
+export interface BlockPricingCard {
+ /** @required */
+ id: string;
+ /** @description Name of the pricing plan. Shown at the top of the card. */
+ title?: string | null;
+ /** @description Short, one sentence description of the pricing plan and who it is for. */
+ description?: string | null;
+ /** @description Price and term for the pricing plan. (ie `$199/mo`) */
+ price?: string | null;
+ /** @description Badge that displays at the top of the pricing plan card to add helpful context. */
+ badge?: string | null;
+ /** @description Short list of features included in this plan. Press `Enter` to add another item to the list. */
+ features?: any | null;
+ /** @description The action button / link shown at the bottom of the pricing card. */
+ button?: BlockButton | string | null;
+ /** @description The id of the pricing block this card belongs to. */
+ pricing?: BlockPricing | string | null;
+ /** @description Add highlighted border around the pricing plan to make it stand out. */
+ is_highlighted?: boolean | null;
+ sort?: number | null;
+}
+
+export interface BlockRichtext {
+ /** @description Rich text content for this block. */
+ content?: string | null;
+ /** @description Larger main headline for this page section. */
+ headline?: string | null;
+ /** @required */
+ id: string;
+ /** @description Controls how the content block is positioned on the page. Choose "Left" to align the block against the left margin or "Center" to position the block in the middle of the page. This setting affects the entire content block's placement, not the text alignment within it. */
+ alignment?: 'left' | 'center' | null;
+ /** @description Smaller copy shown above the headline to label a section or add extra context. */
+ tagline?: string | null;
+}
+
+export interface FormField {
+ /** @required */
+ id: string;
+ /** @description Unique field identifier, not shown to users (lowercase, hyphenated) */
+ name?: string | null;
+ /** @description Input type for the field */
+ type?: string | null;
+ /** @description Text label shown to form users. */
+ label?: string | null;
+ /** @description Default text shown in empty input. */
+ placeholder?: string | null;
+ /** @description Additional instructions shown below the input */
+ help?: string | null;
+ /** @description Available rules: `email`, `url`, `min:5`, `max:20`, `length:10`. Combine with pipes example: `email|max:255` */
+ validation?: string | null;
+ /** @description Field width on the form */
+ width?: '100' | '67' | '50' | '33' | null;
+ /** @description Options for radio or select inputs */
+ choices?: Array<{ text: string; value: string }> | null;
+ /** @description Parent form this field belongs to. */
+ form?: Form | string | null;
+ sort?: number | null;
+ /** @description Make this field mandatory to complete. */
+ required?: boolean | null;
+}
+
+export interface Form {
+ /** @required */
+ id: string;
+ /** @description Action after successful submission. */
+ on_success?: 'redirect' | 'message' | null;
+ sort?: number | null;
+ /** @description Text shown on submit button. */
+ submit_label?: string | null;
+ /** @description Message shown after successful submission. */
+ success_message?: string | null;
+ /** @description Form name (for internal reference). */
+ title?: string | null;
+ /** @description Destination URL after successful submission. */
+ success_redirect_url?: string | null;
+ /** @description Show or hide this form from the site. */
+ is_active?: boolean | null;
+ /** @description Setup email notifications when forms are submitted. */
+ emails?: Array<{ to: string[]; subject: string; message: string }> | null;
+ /** @description Form structure and input fields */
+ fields?: FormField[] | string[];
+ /** @description Received form responses. */
+ submissions?: FormSubmission[] | string[];
+}
+
+export interface FormSubmission {
+ /** @description Unique ID for this specific form submission @required */
+ id: string;
+ /** @description Form submission date and time. */
+ timestamp?: string | null;
+ /** @description Associated form for this submission. */
+ form?: Form | string | null;
+ /** @description Submitted field responses */
+ values?: FormSubmissionValue[] | string[];
+}
+
+export interface FormSubmissionValue {
+ id?: string;
+ /** @description Parent form submission for this value. */
+ form_submission?: FormSubmission | string | null;
+ field?: FormField | string | null;
+ /** @description The data entered by the user for this specific field in the form submission. */
+ value?: string | null;
+ sort?: number | null;
+ file?: DirectusFile | string | null;
+}
+
+export interface Globals {
+ /** @description Site summary for search results. */
+ description?: string | null;
+ /** @required */
+ id: string;
+ /** @description Social media profile URLs */
+ social_links?: Array<{
+ service: 'facebook' | 'instagram' | 'linkedin' | 'twitter' | 'vimeo' | 'youtube' | 'github' | 'discord' | 'docker';
+ url: string;
+ }> | null;
+ /** @description Short phrase describing the site. */
+ tagline?: string | null;
+ /** @description Main site title */
+ title?: string | null;
+ /** @description Public URL for the website */
+ url?: string | null;
+ /** @description Small icon for browser tabs. 1:1 ratio. No larger than 512px × 512px. */
+ favicon?: DirectusFile | string | null;
+ /** @description Main logo shown on the site (for light mode). */
+ logo?: DirectusFile | string | null;
+ /** @description Secret OpenAI API key. Don't share with anyone outside your team. */
+ openai_api_key?: string | null;
+ /** @description The public URL for this Directus instance. Used in Flows. */
+ directus_url?: string | null;
+ /** @description Accent color for the website (used on buttons, links, etc). */
+ accent_color?: string | null;
+ /** @description Main logo shown on the site (for dark mode). */
+ logo_dark_mode?: DirectusFile | string | null;
+}
+
+export interface Navigation {
+ /** @description Unique identifier for this menu. Can't be edited after creation. @required */
+ id: string;
+ /** @description What is the name of this menu? Only used internally. */
+ title?: string | null;
+ /** @description Show or hide this menu from the site. */
+ is_active?: boolean | null;
+ /** @description Links within the menu. */
+ items?: NavigationItem[] | string[];
+}
+
+export interface NavigationItem {
+ /** @required */
+ id: string;
+ /** @description Navigation menu that the individual links belong to. */
+ navigation?: Navigation | string | null;
+ /** @description The internal page to link to. */
+ page?: Page | string | null;
+ /** @description The parent navigation item. */
+ parent?: NavigationItem | string | null;
+ sort?: number | null;
+ /** @description Label shown to the user for the menu item. @required */
+ title: string;
+ /** @description What type of link is this? Page and Post allow you to link to internal content. URL is for external content. Group can contain other menu items. */
+ type?: 'page' | 'post' | 'url' | 'group' | null;
+ /** @description The URL to link to. Could be relative (ie `/my-page`) or a full external URL (ie `https://docs.directus.io`) */
+ url?: string | null;
+ /** @description The internal post to link to. */
+ post?: Post | string | null;
+ /** @description Add child menu items within the group. */
+ children?: NavigationItem[] | string[];
+}
+
+export interface PageBlock {
+ /** @required */
+ id: string;
+ sort?: number | null;
+ /** @description The id of the page that this block belongs to. */
+ page?: Page | string | null;
+ /** @description The data for the block. */
+ item?: BlockHero | BlockRichtext | BlockForm | BlockPost | BlockGallery | BlockPricing | string | null;
+ /** @description The collection (type of block). */
+ collection?: string | null;
+ /** @description Temporarily hide this block on the website without having to remove it from your page. */
+ hide_block?: boolean | null;
+ /** @description Background color for the block to create contrast. Does not control dark or light mode for the entire site. */
+ background?: 'light' | 'dark' | null;
+}
+
+export interface Page {
+ /** @required */
+ id: string;
+ sort?: number | null;
+ /** @description Page title (visible to visitors and used in SEO). @required */
+ title: string;
+ /** @description Unique URL for this page (start with `/`, can have multiple segments `/about/me`)). @required */
+ permalink: string;
+ /** @description Short summary of what's on the page. Also used for SEO meta description. */
+ description?: string | null;
+ /** @description Is this page published? */
+ status?: 'draft' | 'in_review' | 'published';
+ /** @description Publish now or schedule for later. */
+ published_at?: string | null;
+ /** @description Create and arrange different content blocks (like text, images, or videos) to build your page. */
+ blocks?: PageBlock[] | string[];
+}
+
+export interface Post {
+ /** @description Rich text content of your blog post. */
+ content?: string | null;
+ /** @required */
+ id: string;
+ /** @description Featured image for this post. Used in cards linking to the post and in the post detail page. */
+ image?: DirectusFile | string | null;
+ /** @description Unique URL for this post (e.g., `yoursite.com/posts/{{your-slug}}`) */
+ slug?: string | null;
+ sort?: number | null;
+ /** @description Is this post published? */
+ status?: 'draft' | 'in_review' | 'published';
+ /** @description Title of the blog post (used in page title and meta tags) @required */
+ title: string;
+ /** @description Short summary of the blog post to entice readers. */
+ description?: string | null;
+ /** @description Select the team member who wrote this post */
+ author?: DirectusUser | string | null;
+ /** @description Publish now or schedule for later. */
+ published_at?: string | null;
+}
+
+export interface DirectusAccess {
+ /** @required */
+ id: string;
+ role?: DirectusRole | string | null;
+ user?: DirectusUser | string | null;
+ policy?: DirectusPolicy | string;
+ sort?: number | null;
+}
+
+export interface DirectusActivity {
+ /** @required */
+ id: number;
+ action?: string;
+ user?: DirectusUser | string | null;
+ timestamp?: string;
+ ip?: string | null;
+ user_agent?: string | null;
+ collection?: string;
+ item?: string;
+ origin?: string | null;
+ revisions?: DirectusRevision[] | string[];
+}
+
+export interface DirectusCollection {
+ /** @required */
+ collection: string;
+ icon?: string | null;
+ note?: string | null;
+ display_template?: string | null;
+ hidden?: boolean;
+ singleton?: boolean;
+ translations?: Array<{ language: string; translation: string; singular: string; plural: string }> | null;
+ archive_field?: string | null;
+ archive_app_filter?: boolean;
+ archive_value?: string | null;
+ unarchive_value?: string | null;
+ sort_field?: string | null;
+ accountability?: 'all' | 'activity' | null | null;
+ color?: string | null;
+ item_duplication_fields?: any | null;
+ sort?: number | null;
+ group?: DirectusCollection | string | null;
+ collapse?: string;
+ preview_url?: string | null;
+ versioning?: boolean;
+}
+
+export interface DirectusComment {
+ /** @required */
+ id: string;
+ collection?: DirectusCollection | string;
+ item?: string;
+ comment?: string;
+ date_created?: string | null;
+ date_updated?: string | null;
+ user_created?: DirectusUser | string | null;
+ user_updated?: DirectusUser | string | null;
+}
+
+export interface DirectusField {
+ /** @required */
+ id: number;
+ collection?: DirectusCollection | string;
+ field?: string;
+ special?: string[] | null;
+ interface?: string | null;
+ options?: any | null;
+ display?: string | null;
+ display_options?: any | null;
+ readonly?: boolean;
+ hidden?: boolean;
+ sort?: number | null;
+ width?: string | null;
+ translations?: any | null;
+ note?: string | null;
+ conditions?: any | null;
+ required?: boolean | null;
+ group?: DirectusField | string | null;
+ validation?: any | null;
+ validation_message?: string | null;
+}
+
+export interface DirectusFile {
+ /** @required */
+ id: string;
+ storage?: string;
+ filename_disk?: string | null;
+ filename_download?: string;
+ title?: string | null;
+ type?: string | null;
+ folder?: DirectusFolder | string | null;
+ uploaded_by?: DirectusUser | string | null;
+ created_on?: string;
+ modified_by?: DirectusUser | string | null;
+ modified_on?: string;
+ charset?: string | null;
+ filesize?: number | null;
+ width?: number | null;
+ height?: number | null;
+ duration?: number | null;
+ embed?: string | null;
+ description?: string | null;
+ location?: string | null;
+ tags?: string[] | null;
+ metadata?: any | null;
+ focal_point_x?: number | null;
+ focal_point_y?: number | null;
+ tus_id?: string | null;
+ tus_data?: any | null;
+ uploaded_on?: string | null;
+}
+
+export interface DirectusFolder {
+ /** @required */
+ id: string;
+ name?: string;
+ parent?: DirectusFolder | string | null;
+}
+
+export interface DirectusMigration {
+ /** @required */
+ version: string;
+ name?: string;
+ timestamp?: string | null;
+}
+
+export interface DirectusPermission {
+ /** @required */
+ id: number;
+ collection?: string;
+ action?: string;
+ permissions?: any | null;
+ validation?: any | null;
+ presets?: any | null;
+ fields?: string[] | null;
+ policy?: DirectusPolicy | string;
+}
+
+export interface DirectusPolicy {
+ /** @required */
+ id: string;
+ /** @required */
+ name: string;
+ icon?: string;
+ description?: string | null;
+ ip_access?: string[] | null;
+ enforce_tfa?: boolean;
+ admin_access?: boolean;
+ app_access?: boolean;
+ permissions?: DirectusPermission[] | string[];
+ users?: DirectusAccess[] | string[];
+ roles?: DirectusAccess[] | string[];
+}
+
+export interface DirectusPreset {
+ /** @required */
+ id: number;
+ bookmark?: string | null;
+ user?: DirectusUser | string | null;
+ role?: DirectusRole | string | null;
+ collection?: string | null;
+ search?: string | null;
+ layout?: string | null;
+ layout_query?: any | null;
+ layout_options?: any | null;
+ refresh_interval?: number | null;
+ filter?: any | null;
+ icon?: string | null;
+ color?: string | null;
+}
+
+export interface DirectusRelation {
+ /** @required */
+ id: number;
+ many_collection?: string;
+ many_field?: string;
+ one_collection?: string | null;
+ one_field?: string | null;
+ one_collection_field?: string | null;
+ one_allowed_collections?: string[] | null;
+ junction_field?: string | null;
+ sort_field?: string | null;
+ one_deselect_action?: string;
+}
+
+export interface DirectusRevision {
+ /** @required */
+ id: number;
+ activity?: DirectusActivity | string;
+ collection?: string;
+ item?: string;
+ data?: any | null;
+ delta?: any | null;
+ parent?: DirectusRevision | string | null;
+ version?: DirectusVersion | string | null;
+}
+
+export interface DirectusRole {
+ /** @required */
+ id: string;
+ /** @required */
+ name: string;
+ icon?: string;
+ description?: string | null;
+ parent?: DirectusRole | string | null;
+ children?: DirectusRole[] | string[];
+ policies?: DirectusAccess[] | string[];
+ users?: DirectusUser[] | string[];
+}
+
+export interface DirectusSession {
+ /** @required */
+ token: string;
+ user?: DirectusUser | string | null;
+ expires?: string;
+ ip?: string | null;
+ user_agent?: string | null;
+ share?: DirectusShare | string | null;
+ origin?: string | null;
+ next_token?: string | null;
+}
+
+export interface DirectusSettings {
+ /** @required */
+ id: number;
+ project_name?: string;
+ project_url?: string | null;
+ project_color?: string;
+ project_logo?: DirectusFile | string | null;
+ public_foreground?: DirectusFile | string | null;
+ public_background?: DirectusFile | string | null;
+ public_note?: string | null;
+ auth_login_attempts?: number | null;
+ auth_password_policy?:
+ | null
+ | `/^.{8,}$/`
+ | `/(?=^.{8,}$)(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+}{\';\'?>.<,])(?!.*\\s).*$/`
+ | null;
+ storage_asset_transform?: 'all' | 'none' | 'presets' | null;
+ storage_asset_presets?: Array<{
+ key: string;
+ fit: 'contain' | 'cover' | 'inside' | 'outside';
+ width: number;
+ height: number;
+ quality: number;
+ withoutEnlargement: boolean;
+ format: 'auto' | 'jpeg' | 'png' | 'webp' | 'tiff' | 'avif';
+ transforms: any;
+ }> | null;
+ custom_css?: string | null;
+ storage_default_folder?: DirectusFolder | string | null;
+ basemaps?: Array<{
+ name: string;
+ type: 'raster' | 'tile' | 'style';
+ url: string;
+ tileSize: number;
+ attribution: string;
+ }> | null;
+ mapbox_key?: string | null;
+ module_bar?: any | null;
+ project_descriptor?: string | null;
+ default_language?: string;
+ custom_aspect_ratios?: Array<{ text: string; value: number }> | null;
+ public_favicon?: DirectusFile | string | null;
+ default_appearance?: 'auto' | 'light' | 'dark';
+ default_theme_light?: string | null;
+ theme_light_overrides?: any | null;
+ default_theme_dark?: string | null;
+ theme_dark_overrides?: any | null;
+ report_error_url?: string | null;
+ report_bug_url?: string | null;
+ report_feature_url?: string | null;
+ public_registration?: boolean;
+ public_registration_verify_email?: boolean;
+ public_registration_role?: DirectusRole | string | null;
+ public_registration_email_filter?: any | null;
+ /** @description Settings for the Command Palette Module. */
+ command_palette_settings?: Record | null;
+}
+
+export interface DirectusUser {
+ /** @required */
+ id: string;
+ first_name?: string | null;
+ last_name?: string | null;
+ email?: string | null;
+ password?: string | null;
+ location?: string | null;
+ title?: string | null;
+ description?: string | null;
+ tags?: string[] | null;
+ avatar?: DirectusFile | string | null;
+ language?: string | null;
+ tfa_secret?: string | null;
+ status?: 'draft' | 'invited' | 'unverified' | 'active' | 'suspended' | 'archived';
+ role?: DirectusRole | string | null;
+ token?: string | null;
+ last_access?: string | null;
+ last_page?: string | null;
+ provider?: string;
+ external_identifier?: string | null;
+ auth_data?: any | null;
+ email_notifications?: boolean | null;
+ appearance?: null | 'auto' | 'light' | 'dark' | null;
+ theme_dark?: string | null;
+ theme_light?: string | null;
+ theme_light_overrides?: any | null;
+ theme_dark_overrides?: any | null;
+ /** @description Blog posts this user has authored. */
+ posts?: Post[] | string[];
+ policies?: DirectusAccess[] | string[];
+}
+
+export interface DirectusWebhook {
+ /** @required */
+ id: number;
+ name?: string;
+ method?: null;
+ url?: string;
+ status?: 'active' | 'inactive';
+ data?: boolean;
+ actions?: string[];
+ collections?: string[];
+ headers?: Array<{ header: string; value: string }> | null;
+ was_active_before_deprecation?: boolean;
+ migrated_flow?: DirectusFlow | string | null;
+}
+
+export interface DirectusDashboard {
+ /** @required */
+ id: string;
+ name?: string;
+ icon?: string;
+ note?: string | null;
+ date_created?: string | null;
+ user_created?: DirectusUser | string | null;
+ color?: string | null;
+ panels?: DirectusPanel[] | string[];
+}
+
+export interface DirectusPanel {
+ /** @required */
+ id: string;
+ dashboard?: DirectusDashboard | string;
+ name?: string | null;
+ icon?: string | null;
+ color?: string | null;
+ show_header?: boolean;
+ note?: string | null;
+ type?: string;
+ position_x?: number;
+ position_y?: number;
+ width?: number;
+ height?: number;
+ options?: any | null;
+ date_created?: string | null;
+ user_created?: DirectusUser | string | null;
+}
+
+export interface DirectusNotification {
+ /** @required */
+ id: number;
+ timestamp?: string | null;
+ status?: string | null;
+ recipient?: DirectusUser | string;
+ sender?: DirectusUser | string | null;
+ subject?: string;
+ message?: string | null;
+ collection?: string | null;
+ item?: string | null;
+}
+
+export interface DirectusShare {
+ /** @required */
+ id: string;
+ name?: string | null;
+ collection?: DirectusCollection | string;
+ item?: string;
+ role?: DirectusRole | string | null;
+ password?: string | null;
+ user_created?: DirectusUser | string | null;
+ date_created?: string | null;
+ date_start?: string | null;
+ date_end?: string | null;
+ times_used?: number | null;
+ max_uses?: number | null;
+}
+
+export interface DirectusFlow {
+ /** @required */
+ id: string;
+ name?: string;
+ icon?: string | null;
+ color?: string | null;
+ description?: string | null;
+ status?: string;
+ trigger?: string | null;
+ accountability?: string | null;
+ options?: any | null;
+ operation?: DirectusOperation | string | null;
+ date_created?: string | null;
+ user_created?: DirectusUser | string | null;
+ operations?: DirectusOperation[] | string[];
+}
+
+export interface DirectusOperation {
+ /** @required */
+ id: string;
+ name?: string | null;
+ key?: string;
+ type?: string;
+ position_x?: number;
+ position_y?: number;
+ options?: any | null;
+ resolve?: DirectusOperation | string | null;
+ reject?: DirectusOperation | string | null;
+ flow?: DirectusFlow | string;
+ date_created?: string | null;
+ user_created?: DirectusUser | string | null;
+}
+
+export interface DirectusTranslation {
+ /** @required */
+ id: string;
+ /** @required */
+ language: string;
+ /** @required */
+ key: string;
+ /** @required */
+ value: string;
+}
+
+export interface DirectusVersion {
+ /** @required */
+ id: string;
+ key?: string;
+ name?: string | null;
+ collection?: DirectusCollection | string;
+ item?: string;
+ hash?: string | null;
+ date_created?: string | null;
+ date_updated?: string | null;
+ user_created?: DirectusUser | string | null;
+ user_updated?: DirectusUser | string | null;
+ delta?: any | null;
+}
+
+export interface DirectusExtension {
+ enabled?: boolean;
+ /** @required */
+ id: string;
+ folder?: string;
+ source?: string;
+ bundle?: string | null;
+}
+
+export interface Schema {
+ block_button: BlockButton[];
+ block_button_group: BlockButtonGroup[];
+ block_form: BlockForm[];
+ block_gallery: BlockGallery[];
+ block_gallery_items: BlockGalleryItem[];
+ block_hero: BlockHero[];
+ block_posts: BlockPost[];
+ block_pricing: BlockPricing[];
+ block_pricing_cards: BlockPricingCard[];
+ block_richtext: BlockRichtext[];
+ form_fields: FormField[];
+ forms: Form[];
+ form_submissions: FormSubmission[];
+ form_submission_values: FormSubmissionValue[];
+ globals: Globals;
+ navigation: Navigation[];
+ navigation_items: NavigationItem[];
+ page_blocks: PageBlock[];
+ pages: Page[];
+ posts: Post[];
+ directus_access: DirectusAccess[];
+ directus_activity: DirectusActivity[];
+ directus_collections: DirectusCollection[];
+ directus_comments: DirectusComment[];
+ directus_fields: DirectusField[];
+ directus_files: DirectusFile[];
+ directus_folders: DirectusFolder[];
+ directus_migrations: DirectusMigration[];
+ directus_permissions: DirectusPermission[];
+ directus_policies: DirectusPolicy[];
+ directus_presets: DirectusPreset[];
+ directus_relations: DirectusRelation[];
+ directus_revisions: DirectusRevision[];
+ directus_roles: DirectusRole[];
+ directus_sessions: DirectusSession[];
+ directus_settings: DirectusSettings;
+ directus_users: DirectusUser[];
+ directus_webhooks: DirectusWebhook[];
+ directus_dashboards: DirectusDashboard[];
+ directus_panels: DirectusPanel[];
+ directus_notifications: DirectusNotification[];
+ directus_shares: DirectusShare[];
+ directus_flows: DirectusFlow[];
+ directus_operations: DirectusOperation[];
+ directus_translations: DirectusTranslation[];
+ directus_versions: DirectusVersion[];
+ directus_extensions: DirectusExtension[];
+}
diff --git a/templates/cms/nextjs/tailwind.config.ts b/templates/cms/nextjs/tailwind.config.ts
new file mode 100644
index 0000000..42563b4
--- /dev/null
+++ b/templates/cms/nextjs/tailwind.config.ts
@@ -0,0 +1,184 @@
+import type { Config } from 'tailwindcss';
+import tailwindcssAnimate from 'tailwindcss-animate';
+import typography from '@tailwindcss/typography';
+
+const config: Config = {
+ darkMode: 'class',
+ content: ['./app/**/*.{js,ts,jsx,tsx}', './components/**/*.{js,ts,jsx,tsx}', './src/**/*.{js,ts,jsx,tsx}'],
+ theme: {
+ extend: {
+ fontFamily: {
+ heading: ['Poppins', 'sans-serif'],
+ sans: ['Inter', 'sans-serif'],
+ code: ['Fira Mono', 'monospace'],
+ },
+ fontSize: {
+ tagline: ['24px', '33.6px'], // Tagline
+ headline: ['56px', '64px'], // Headline
+ h1: ['56px', '78.4px'], // Heading 1
+ h2: ['36px', '50.4px'], // Heading 2
+ h3: ['24px', '33.6px'], // Heading 3
+ description: ['16px', '22.4px'], // Description
+ regular: ['16px', '24px'], // Regular text
+ bold: ['16px', '22.4px'], // Bolded text
+ nav: ['16px', '22.4px'], // Navbar link
+ code: ['14px', '16.8px'], // Code snippet
+ },
+ alignments: {
+ left: 'text-left',
+ center: 'text-center',
+ right: 'text-right',
+ },
+ colors: {
+ background: {
+ DEFAULT: 'var(--background-color)',
+ muted: 'var(--background-color-muted)',
+ variant: 'var(--background-variant-color)',
+ },
+ foreground: 'var(--foreground-color)',
+ primary: 'var(--accent-color-light)',
+ input: 'var(--input-color)',
+ secondary: 'var(--accent-color-dark)',
+ accent: 'var(--accent-color)',
+ soft: 'var(--accent-color-soft)',
+ blue: {
+ DEFAULT: '#172940',
+ },
+ gray: {
+ DEFAULT: '#F5F8FB',
+ muted: '#A5B0BD',
+ dark: '#42566E',
+ },
+ },
+ typography: {
+ DEFAULT: {
+ css: {
+ color: 'var(--foreground-color)',
+ textAlign: 'left',
+ a: {
+ color: 'var(--accent-color)',
+ textDecoration: 'none',
+ '&:hover': {
+ textDecoration: 'underline',
+ },
+ },
+ h1: {
+ fontFamily: 'Poppins',
+ fontSize: 'clamp(2.5rem, 5vw, 3.5rem)',
+ fontWeight: '400',
+ lineHeight: '1.2',
+ marginTop: '1rem',
+ },
+ h2: {
+ fontFamily: 'Poppins',
+ fontSize: 'clamp(2rem, 4vw, 2.5rem)',
+ fontWeight: '400',
+ lineHeight: '1.3',
+ marginTop: '1rem',
+ },
+ h3: {
+ fontFamily: 'Poppins',
+ fontSize: 'clamp(1.5rem, 3vw, 2rem)',
+ fontWeight: '400',
+ lineHeight: '1.4',
+ marginTop: '0',
+ },
+ p: {
+ fontFamily: 'Inter',
+ fontSize: 'clamp(1rem, 2vw, 1.25rem)',
+ fontWeight: '400',
+ lineHeight: '1.75',
+ },
+ img: {
+ borderRadius: '8px',
+ margin: '1rem 0',
+ maxWidth: '100%',
+ height: 'auto',
+ },
+ iframe: {
+ borderRadius: '8px',
+ margin: '1rem 0',
+ },
+ code: {
+ fontFamily: 'Fira Mono',
+ fontSize: 'clamp(0.875rem, 1rem, 1.125rem)',
+ fontWeight: '400',
+ lineHeight: '1.6',
+ backgroundColor: 'var(--background-color-muted)',
+ color: 'var(--foreground-color)',
+ borderRadius: '4px',
+ padding: '0.15rem 0.35rem',
+ display: 'inline',
+ '&::before': {
+ content: 'none',
+ },
+ '&::after': {
+ content: 'none',
+ },
+ },
+ 'p > code': {
+ '&::before': {
+ content: 'none',
+ },
+ '&::after': {
+ content: 'none',
+ },
+ },
+ pre: {
+ fontFamily: 'Fira Mono',
+ fontSize: 'clamp(0.9rem, 1.125rem, 1.25rem)',
+ lineHeight: '1.6',
+ backgroundColor: 'var(--background-color-muted)',
+ color: 'var(--foreground-color)',
+ borderRadius: '8px',
+ padding: '1rem',
+ overflowX: 'auto',
+ },
+ blockquote: {
+ fontStyle: 'italic',
+ borderLeft: '4px solid var(--accent-color)',
+ paddingLeft: '1rem',
+ textAlign: 'left',
+ },
+ ul: {
+ listStyleType: 'disc',
+ paddingLeft: '1.25rem',
+ listStylePosition: 'inside',
+ },
+ ol: {
+ listStyleType: 'decimal',
+ paddingLeft: '1.25rem',
+ listStylePosition: 'inside',
+ },
+ li: {
+ marginBottom: '0.5rem',
+ '& p': {
+ display: 'inline',
+ margin: '0',
+ },
+ },
+ },
+ },
+ dark: {
+ css: {
+ color: 'var(--foreground-color)',
+ a: {
+ color: 'var(--accent-color)',
+ textDecoration: 'none',
+ '&:hover': {
+ textDecoration: 'underline',
+ },
+ },
+ blockquote: {
+ borderLeftColor: 'var(--gray-700)',
+ },
+ },
+ },
+ },
+ },
+ },
+ plugins: [tailwindcssAnimate, typography],
+ safelist: ['grid-cols-1', 'sm:grid-cols-2', 'lg:grid-cols-3'],
+};
+
+export default config;
diff --git a/templates/cms/nextjs/tsconfig.json b/templates/cms/nextjs/tsconfig.json
new file mode 100644
index 0000000..e54ed09
--- /dev/null
+++ b/templates/cms/nextjs/tsconfig.json
@@ -0,0 +1,27 @@
+{
+ "compilerOptions": {
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true,
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ],
+ "paths": {
+ "@/*": ["./src/*"]
+ },
+ "target": "ES2023"
+ },
+ "include": ["src/next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
+ "exclude": ["node_modules"]
+}
diff --git a/templates/cms/nuxt/.gitignore b/templates/cms/nuxt/.gitignore
new file mode 100644
index 0000000..fad94af
--- /dev/null
+++ b/templates/cms/nuxt/.gitignore
@@ -0,0 +1,31 @@
+# Node.js
+node_modules/
+
+# Logs
+npm-debug.log*
+pnpm-debug.log*
+yarn-debug.log*
+*.log
+
+.nuxt
+.output
+
+# Environment variables
+.env
+.env.*.local
+
+# System files
+.DS_Store
+Thumbs.db
+
+# IDE/Editor Configs
+.idea/
+.vscode/
+
+# Test Coverage
+coverage/
+
+# Tailwind CSS Cache
+.stylelintcache
+
+certificates
\ No newline at end of file
diff --git a/simple-crm/README.md b/templates/crm/directus/template/README.md
similarity index 100%
rename from simple-crm/README.md
rename to templates/crm/directus/template/README.md
diff --git a/simple-crm/package.json b/templates/crm/directus/template/package.json
similarity index 100%
rename from simple-crm/package.json
rename to templates/crm/directus/template/package.json
diff --git a/simple-crm/src/access.json b/templates/crm/directus/template/src/access.json
similarity index 100%
rename from simple-crm/src/access.json
rename to templates/crm/directus/template/src/access.json
diff --git a/simple-crm/src/assets/079fb4b8-925e-4bd9-b674-76d517b94073.webp b/templates/crm/directus/template/src/assets/079fb4b8-925e-4bd9-b674-76d517b94073.webp
similarity index 100%
rename from simple-crm/src/assets/079fb4b8-925e-4bd9-b674-76d517b94073.webp
rename to templates/crm/directus/template/src/assets/079fb4b8-925e-4bd9-b674-76d517b94073.webp
diff --git a/simple-crm/src/assets/13cdfde4-bcc8-489e-ac86-d47698e684f8.com b/templates/crm/directus/template/src/assets/13cdfde4-bcc8-489e-ac86-d47698e684f8.com
similarity index 100%
rename from simple-crm/src/assets/13cdfde4-bcc8-489e-ac86-d47698e684f8.com
rename to templates/crm/directus/template/src/assets/13cdfde4-bcc8-489e-ac86-d47698e684f8.com
diff --git a/simple-crm/src/assets/17ac8a25-1ba0-4d92-90a1-2403a3107ce0.webp b/templates/crm/directus/template/src/assets/17ac8a25-1ba0-4d92-90a1-2403a3107ce0.webp
similarity index 100%
rename from simple-crm/src/assets/17ac8a25-1ba0-4d92-90a1-2403a3107ce0.webp
rename to templates/crm/directus/template/src/assets/17ac8a25-1ba0-4d92-90a1-2403a3107ce0.webp
diff --git a/simple-crm/src/assets/3ed710b0-1a72-4064-bd00-c6e534a291f6.png b/templates/crm/directus/template/src/assets/3ed710b0-1a72-4064-bd00-c6e534a291f6.png
similarity index 100%
rename from simple-crm/src/assets/3ed710b0-1a72-4064-bd00-c6e534a291f6.png
rename to templates/crm/directus/template/src/assets/3ed710b0-1a72-4064-bd00-c6e534a291f6.png
diff --git a/simple-crm/src/assets/604c60f9-1d3d-4a0d-be38-547f08391b1c.webp b/templates/crm/directus/template/src/assets/604c60f9-1d3d-4a0d-be38-547f08391b1c.webp
similarity index 100%
rename from simple-crm/src/assets/604c60f9-1d3d-4a0d-be38-547f08391b1c.webp
rename to templates/crm/directus/template/src/assets/604c60f9-1d3d-4a0d-be38-547f08391b1c.webp
diff --git a/simple-crm/src/assets/b742d3fe-952c-4215-bbe7-42fee88e992a.webp b/templates/crm/directus/template/src/assets/b742d3fe-952c-4215-bbe7-42fee88e992a.webp
similarity index 100%
rename from simple-crm/src/assets/b742d3fe-952c-4215-bbe7-42fee88e992a.webp
rename to templates/crm/directus/template/src/assets/b742d3fe-952c-4215-bbe7-42fee88e992a.webp
diff --git a/simple-crm/src/assets/d01d4ff6-c319-4e31-b574-aa84368d31e8.webp b/templates/crm/directus/template/src/assets/d01d4ff6-c319-4e31-b574-aa84368d31e8.webp
similarity index 100%
rename from simple-crm/src/assets/d01d4ff6-c319-4e31-b574-aa84368d31e8.webp
rename to templates/crm/directus/template/src/assets/d01d4ff6-c319-4e31-b574-aa84368d31e8.webp
diff --git a/simple-crm/src/collections.json b/templates/crm/directus/template/src/collections.json
similarity index 100%
rename from simple-crm/src/collections.json
rename to templates/crm/directus/template/src/collections.json
diff --git a/simple-crm/src/content/activities.json b/templates/crm/directus/template/src/content/activities.json
similarity index 100%
rename from simple-crm/src/content/activities.json
rename to templates/crm/directus/template/src/content/activities.json
diff --git a/simple-crm/src/content/activity_contacts.json b/templates/crm/directus/template/src/content/activity_contacts.json
similarity index 100%
rename from simple-crm/src/content/activity_contacts.json
rename to templates/crm/directus/template/src/content/activity_contacts.json
diff --git a/simple-crm/src/content/contact_tags.json b/templates/crm/directus/template/src/content/contact_tags.json
similarity index 100%
rename from simple-crm/src/content/contact_tags.json
rename to templates/crm/directus/template/src/content/contact_tags.json
diff --git a/simple-crm/src/content/contacts.json b/templates/crm/directus/template/src/content/contacts.json
similarity index 100%
rename from simple-crm/src/content/contacts.json
rename to templates/crm/directus/template/src/content/contacts.json
diff --git a/simple-crm/src/content/deal_contacts.json b/templates/crm/directus/template/src/content/deal_contacts.json
similarity index 100%
rename from simple-crm/src/content/deal_contacts.json
rename to templates/crm/directus/template/src/content/deal_contacts.json
diff --git a/simple-crm/src/content/deal_stages.json b/templates/crm/directus/template/src/content/deal_stages.json
similarity index 100%
rename from simple-crm/src/content/deal_stages.json
rename to templates/crm/directus/template/src/content/deal_stages.json
diff --git a/simple-crm/src/content/deals.json b/templates/crm/directus/template/src/content/deals.json
similarity index 100%
rename from simple-crm/src/content/deals.json
rename to templates/crm/directus/template/src/content/deals.json
diff --git a/simple-crm/src/content/organization_addresses.json b/templates/crm/directus/template/src/content/organization_addresses.json
similarity index 100%
rename from simple-crm/src/content/organization_addresses.json
rename to templates/crm/directus/template/src/content/organization_addresses.json
diff --git a/simple-crm/src/content/organization_contacts.json b/templates/crm/directus/template/src/content/organization_contacts.json
similarity index 100%
rename from simple-crm/src/content/organization_contacts.json
rename to templates/crm/directus/template/src/content/organization_contacts.json
diff --git a/simple-crm/src/content/organization_tags.json b/templates/crm/directus/template/src/content/organization_tags.json
similarity index 100%
rename from simple-crm/src/content/organization_tags.json
rename to templates/crm/directus/template/src/content/organization_tags.json
diff --git a/simple-crm/src/content/organizations.json b/templates/crm/directus/template/src/content/organizations.json
similarity index 100%
rename from simple-crm/src/content/organizations.json
rename to templates/crm/directus/template/src/content/organizations.json
diff --git a/simple-crm/src/content/tags.json b/templates/crm/directus/template/src/content/tags.json
similarity index 100%
rename from simple-crm/src/content/tags.json
rename to templates/crm/directus/template/src/content/tags.json
diff --git a/simple-crm/src/dashboards.json b/templates/crm/directus/template/src/dashboards.json
similarity index 100%
rename from simple-crm/src/dashboards.json
rename to templates/crm/directus/template/src/dashboards.json
diff --git a/simple-crm/src/extensions.json b/templates/crm/directus/template/src/extensions.json
similarity index 100%
rename from simple-crm/src/extensions.json
rename to templates/crm/directus/template/src/extensions.json
diff --git a/simple-crm/src/fields.json b/templates/crm/directus/template/src/fields.json
similarity index 100%
rename from simple-crm/src/fields.json
rename to templates/crm/directus/template/src/fields.json
diff --git a/simple-crm/src/files.json b/templates/crm/directus/template/src/files.json
similarity index 100%
rename from simple-crm/src/files.json
rename to templates/crm/directus/template/src/files.json
diff --git a/simple-crm/src/flows.json b/templates/crm/directus/template/src/flows.json
similarity index 100%
rename from simple-crm/src/flows.json
rename to templates/crm/directus/template/src/flows.json
diff --git a/simple-crm/src/folders.json b/templates/crm/directus/template/src/folders.json
similarity index 100%
rename from simple-crm/src/folders.json
rename to templates/crm/directus/template/src/folders.json
diff --git a/simple-crm/src/operations.json b/templates/crm/directus/template/src/operations.json
similarity index 100%
rename from simple-crm/src/operations.json
rename to templates/crm/directus/template/src/operations.json
diff --git a/simple-crm/src/panels.json b/templates/crm/directus/template/src/panels.json
similarity index 100%
rename from simple-crm/src/panels.json
rename to templates/crm/directus/template/src/panels.json
diff --git a/simple-crm/src/permissions.json b/templates/crm/directus/template/src/permissions.json
similarity index 100%
rename from simple-crm/src/permissions.json
rename to templates/crm/directus/template/src/permissions.json
diff --git a/simple-crm/src/policies.json b/templates/crm/directus/template/src/policies.json
similarity index 100%
rename from simple-crm/src/policies.json
rename to templates/crm/directus/template/src/policies.json
diff --git a/simple-crm/src/presets.json b/templates/crm/directus/template/src/presets.json
similarity index 100%
rename from simple-crm/src/presets.json
rename to templates/crm/directus/template/src/presets.json
diff --git a/simple-crm/src/relations.json b/templates/crm/directus/template/src/relations.json
similarity index 100%
rename from simple-crm/src/relations.json
rename to templates/crm/directus/template/src/relations.json
diff --git a/simple-crm/src/roles.json b/templates/crm/directus/template/src/roles.json
similarity index 100%
rename from simple-crm/src/roles.json
rename to templates/crm/directus/template/src/roles.json
diff --git a/simple-crm/src/schema/snapshot.json b/templates/crm/directus/template/src/schema/snapshot.json
similarity index 100%
rename from simple-crm/src/schema/snapshot.json
rename to templates/crm/directus/template/src/schema/snapshot.json
diff --git a/simple-crm/src/settings.json b/templates/crm/directus/template/src/settings.json
similarity index 100%
rename from simple-crm/src/settings.json
rename to templates/crm/directus/template/src/settings.json
diff --git a/simple-crm/src/translations.json b/templates/crm/directus/template/src/translations.json
similarity index 100%
rename from simple-crm/src/translations.json
rename to templates/crm/directus/template/src/translations.json
diff --git a/simple-crm/src/users.json b/templates/crm/directus/template/src/users.json
similarity index 100%
rename from simple-crm/src/users.json
rename to templates/crm/directus/template/src/users.json
diff --git a/simple-ecommerce/README.md b/templates/ecommerce/directus/template/README.md
similarity index 100%
rename from simple-ecommerce/README.md
rename to templates/ecommerce/directus/template/README.md
diff --git a/simple-ecommerce/package.json b/templates/ecommerce/directus/template/package.json
similarity index 100%
rename from simple-ecommerce/package.json
rename to templates/ecommerce/directus/template/package.json
diff --git a/simple-ecommerce/src/access.json b/templates/ecommerce/directus/template/src/access.json
similarity index 100%
rename from simple-ecommerce/src/access.json
rename to templates/ecommerce/directus/template/src/access.json
diff --git a/simple-ecommerce/src/assets/2c9ff5bc-4644-4a97-800a-a7fda87ac2e0.webp b/templates/ecommerce/directus/template/src/assets/2c9ff5bc-4644-4a97-800a-a7fda87ac2e0.webp
similarity index 100%
rename from simple-ecommerce/src/assets/2c9ff5bc-4644-4a97-800a-a7fda87ac2e0.webp
rename to templates/ecommerce/directus/template/src/assets/2c9ff5bc-4644-4a97-800a-a7fda87ac2e0.webp
diff --git a/simple-ecommerce/src/assets/638bf080-5ec6-4d55-a29e-267f4022b3e7.png b/templates/ecommerce/directus/template/src/assets/638bf080-5ec6-4d55-a29e-267f4022b3e7.png
similarity index 100%
rename from simple-ecommerce/src/assets/638bf080-5ec6-4d55-a29e-267f4022b3e7.png
rename to templates/ecommerce/directus/template/src/assets/638bf080-5ec6-4d55-a29e-267f4022b3e7.png
diff --git a/simple-ecommerce/src/assets/6a0656da-1da8-46d5-92e1-817052fc67eb.png b/templates/ecommerce/directus/template/src/assets/6a0656da-1da8-46d5-92e1-817052fc67eb.png
similarity index 100%
rename from simple-ecommerce/src/assets/6a0656da-1da8-46d5-92e1-817052fc67eb.png
rename to templates/ecommerce/directus/template/src/assets/6a0656da-1da8-46d5-92e1-817052fc67eb.png
diff --git a/simple-ecommerce/src/collections.json b/templates/ecommerce/directus/template/src/collections.json
similarity index 100%
rename from simple-ecommerce/src/collections.json
rename to templates/ecommerce/directus/template/src/collections.json
diff --git a/simple-ecommerce/src/content/categories.json b/templates/ecommerce/directus/template/src/content/categories.json
similarity index 100%
rename from simple-ecommerce/src/content/categories.json
rename to templates/ecommerce/directus/template/src/content/categories.json
diff --git a/simple-ecommerce/src/content/customer_addresses.json b/templates/ecommerce/directus/template/src/content/customer_addresses.json
similarity index 100%
rename from simple-ecommerce/src/content/customer_addresses.json
rename to templates/ecommerce/directus/template/src/content/customer_addresses.json
diff --git a/simple-ecommerce/src/content/customers.json b/templates/ecommerce/directus/template/src/content/customers.json
similarity index 100%
rename from simple-ecommerce/src/content/customers.json
rename to templates/ecommerce/directus/template/src/content/customers.json
diff --git a/simple-ecommerce/src/content/order_items.json b/templates/ecommerce/directus/template/src/content/order_items.json
similarity index 100%
rename from simple-ecommerce/src/content/order_items.json
rename to templates/ecommerce/directus/template/src/content/order_items.json
diff --git a/simple-ecommerce/src/content/orders.json b/templates/ecommerce/directus/template/src/content/orders.json
similarity index 100%
rename from simple-ecommerce/src/content/orders.json
rename to templates/ecommerce/directus/template/src/content/orders.json
diff --git a/simple-ecommerce/src/content/product_images.json b/templates/ecommerce/directus/template/src/content/product_images.json
similarity index 100%
rename from simple-ecommerce/src/content/product_images.json
rename to templates/ecommerce/directus/template/src/content/product_images.json
diff --git a/simple-ecommerce/src/content/product_variants.json b/templates/ecommerce/directus/template/src/content/product_variants.json
similarity index 100%
rename from simple-ecommerce/src/content/product_variants.json
rename to templates/ecommerce/directus/template/src/content/product_variants.json
diff --git a/simple-ecommerce/src/content/products.json b/templates/ecommerce/directus/template/src/content/products.json
similarity index 100%
rename from simple-ecommerce/src/content/products.json
rename to templates/ecommerce/directus/template/src/content/products.json
diff --git a/simple-ecommerce/src/content/tax_rates.json b/templates/ecommerce/directus/template/src/content/tax_rates.json
similarity index 100%
rename from simple-ecommerce/src/content/tax_rates.json
rename to templates/ecommerce/directus/template/src/content/tax_rates.json
diff --git a/simple-ecommerce/src/dashboards.json b/templates/ecommerce/directus/template/src/dashboards.json
similarity index 100%
rename from simple-ecommerce/src/dashboards.json
rename to templates/ecommerce/directus/template/src/dashboards.json
diff --git a/simple-ecommerce/src/extensions.json b/templates/ecommerce/directus/template/src/extensions.json
similarity index 100%
rename from simple-ecommerce/src/extensions.json
rename to templates/ecommerce/directus/template/src/extensions.json
diff --git a/simple-ecommerce/src/fields.json b/templates/ecommerce/directus/template/src/fields.json
similarity index 100%
rename from simple-ecommerce/src/fields.json
rename to templates/ecommerce/directus/template/src/fields.json
diff --git a/simple-ecommerce/src/files.json b/templates/ecommerce/directus/template/src/files.json
similarity index 100%
rename from simple-ecommerce/src/files.json
rename to templates/ecommerce/directus/template/src/files.json
diff --git a/simple-ecommerce/src/flows.json b/templates/ecommerce/directus/template/src/flows.json
similarity index 100%
rename from simple-ecommerce/src/flows.json
rename to templates/ecommerce/directus/template/src/flows.json
diff --git a/simple-ecommerce/src/folders.json b/templates/ecommerce/directus/template/src/folders.json
similarity index 100%
rename from simple-ecommerce/src/folders.json
rename to templates/ecommerce/directus/template/src/folders.json
diff --git a/simple-ecommerce/src/operations.json b/templates/ecommerce/directus/template/src/operations.json
similarity index 100%
rename from simple-ecommerce/src/operations.json
rename to templates/ecommerce/directus/template/src/operations.json
diff --git a/simple-ecommerce/src/panels.json b/templates/ecommerce/directus/template/src/panels.json
similarity index 100%
rename from simple-ecommerce/src/panels.json
rename to templates/ecommerce/directus/template/src/panels.json
diff --git a/simple-ecommerce/src/permissions.json b/templates/ecommerce/directus/template/src/permissions.json
similarity index 100%
rename from simple-ecommerce/src/permissions.json
rename to templates/ecommerce/directus/template/src/permissions.json
diff --git a/simple-ecommerce/src/policies.json b/templates/ecommerce/directus/template/src/policies.json
similarity index 100%
rename from simple-ecommerce/src/policies.json
rename to templates/ecommerce/directus/template/src/policies.json
diff --git a/simple-ecommerce/src/presets.json b/templates/ecommerce/directus/template/src/presets.json
similarity index 100%
rename from simple-ecommerce/src/presets.json
rename to templates/ecommerce/directus/template/src/presets.json
diff --git a/simple-ecommerce/src/relations.json b/templates/ecommerce/directus/template/src/relations.json
similarity index 100%
rename from simple-ecommerce/src/relations.json
rename to templates/ecommerce/directus/template/src/relations.json
diff --git a/simple-ecommerce/src/roles.json b/templates/ecommerce/directus/template/src/roles.json
similarity index 100%
rename from simple-ecommerce/src/roles.json
rename to templates/ecommerce/directus/template/src/roles.json
diff --git a/simple-ecommerce/src/schema/snapshot.json b/templates/ecommerce/directus/template/src/schema/snapshot.json
similarity index 100%
rename from simple-ecommerce/src/schema/snapshot.json
rename to templates/ecommerce/directus/template/src/schema/snapshot.json
diff --git a/simple-ecommerce/src/settings.json b/templates/ecommerce/directus/template/src/settings.json
similarity index 100%
rename from simple-ecommerce/src/settings.json
rename to templates/ecommerce/directus/template/src/settings.json
diff --git a/simple-ecommerce/src/translations.json b/templates/ecommerce/directus/template/src/translations.json
similarity index 100%
rename from simple-ecommerce/src/translations.json
rename to templates/ecommerce/directus/template/src/translations.json
diff --git a/simple-ecommerce/src/users.json b/templates/ecommerce/directus/template/src/users.json
similarity index 100%
rename from simple-ecommerce/src/users.json
rename to templates/ecommerce/directus/template/src/users.json
diff --git a/help-center/README.md b/templates/help-center/directus/template/README.md
similarity index 100%
rename from help-center/README.md
rename to templates/help-center/directus/template/README.md
diff --git a/help-center/package.json b/templates/help-center/directus/template/package.json
similarity index 100%
rename from help-center/package.json
rename to templates/help-center/directus/template/package.json
diff --git a/help-center/src/access.json b/templates/help-center/directus/template/src/access.json
similarity index 100%
rename from help-center/src/access.json
rename to templates/help-center/directus/template/src/access.json
diff --git a/help-center/src/assets/13d36e5e-3244-4a00-8adb-543a7c72cd7f.jpg b/templates/help-center/directus/template/src/assets/13d36e5e-3244-4a00-8adb-543a7c72cd7f.jpg
similarity index 100%
rename from help-center/src/assets/13d36e5e-3244-4a00-8adb-543a7c72cd7f.jpg
rename to templates/help-center/directus/template/src/assets/13d36e5e-3244-4a00-8adb-543a7c72cd7f.jpg
diff --git a/help-center/src/assets/f70845e5-3172-4bd7-9405-29241fe91cbc.webp b/templates/help-center/directus/template/src/assets/f70845e5-3172-4bd7-9405-29241fe91cbc.webp
similarity index 100%
rename from help-center/src/assets/f70845e5-3172-4bd7-9405-29241fe91cbc.webp
rename to templates/help-center/directus/template/src/assets/f70845e5-3172-4bd7-9405-29241fe91cbc.webp
diff --git a/help-center/src/collections.json b/templates/help-center/directus/template/src/collections.json
similarity index 100%
rename from help-center/src/collections.json
rename to templates/help-center/directus/template/src/collections.json
diff --git a/help-center/src/content/help_articles.json b/templates/help-center/directus/template/src/content/help_articles.json
similarity index 100%
rename from help-center/src/content/help_articles.json
rename to templates/help-center/directus/template/src/content/help_articles.json
diff --git a/help-center/src/content/help_articles_translations.json b/templates/help-center/directus/template/src/content/help_articles_translations.json
similarity index 100%
rename from help-center/src/content/help_articles_translations.json
rename to templates/help-center/directus/template/src/content/help_articles_translations.json
diff --git a/help-center/src/content/help_collections.json b/templates/help-center/directus/template/src/content/help_collections.json
similarity index 100%
rename from help-center/src/content/help_collections.json
rename to templates/help-center/directus/template/src/content/help_collections.json
diff --git a/help-center/src/content/help_collections_translations.json b/templates/help-center/directus/template/src/content/help_collections_translations.json
similarity index 100%
rename from help-center/src/content/help_collections_translations.json
rename to templates/help-center/directus/template/src/content/help_collections_translations.json
diff --git a/help-center/src/content/help_feedback.json b/templates/help-center/directus/template/src/content/help_feedback.json
similarity index 100%
rename from help-center/src/content/help_feedback.json
rename to templates/help-center/directus/template/src/content/help_feedback.json
diff --git a/help-center/src/content/help_settings.json b/templates/help-center/directus/template/src/content/help_settings.json
similarity index 100%
rename from help-center/src/content/help_settings.json
rename to templates/help-center/directus/template/src/content/help_settings.json
diff --git a/help-center/src/content/help_settings_translations.json b/templates/help-center/directus/template/src/content/help_settings_translations.json
similarity index 100%
rename from help-center/src/content/help_settings_translations.json
rename to templates/help-center/directus/template/src/content/help_settings_translations.json
diff --git a/help-center/src/content/languages.json b/templates/help-center/directus/template/src/content/languages.json
similarity index 100%
rename from help-center/src/content/languages.json
rename to templates/help-center/directus/template/src/content/languages.json
diff --git a/help-center/src/dashboards.json b/templates/help-center/directus/template/src/dashboards.json
similarity index 100%
rename from help-center/src/dashboards.json
rename to templates/help-center/directus/template/src/dashboards.json
diff --git a/help-center/src/extensions.json b/templates/help-center/directus/template/src/extensions.json
similarity index 100%
rename from help-center/src/extensions.json
rename to templates/help-center/directus/template/src/extensions.json
diff --git a/help-center/src/fields.json b/templates/help-center/directus/template/src/fields.json
similarity index 100%
rename from help-center/src/fields.json
rename to templates/help-center/directus/template/src/fields.json
diff --git a/help-center/src/files.json b/templates/help-center/directus/template/src/files.json
similarity index 100%
rename from help-center/src/files.json
rename to templates/help-center/directus/template/src/files.json
diff --git a/help-center/src/flows.json b/templates/help-center/directus/template/src/flows.json
similarity index 100%
rename from help-center/src/flows.json
rename to templates/help-center/directus/template/src/flows.json
diff --git a/help-center/src/folders.json b/templates/help-center/directus/template/src/folders.json
similarity index 100%
rename from help-center/src/folders.json
rename to templates/help-center/directus/template/src/folders.json
diff --git a/help-center/src/operations.json b/templates/help-center/directus/template/src/operations.json
similarity index 100%
rename from help-center/src/operations.json
rename to templates/help-center/directus/template/src/operations.json
diff --git a/help-center/src/panels.json b/templates/help-center/directus/template/src/panels.json
similarity index 100%
rename from help-center/src/panels.json
rename to templates/help-center/directus/template/src/panels.json
diff --git a/help-center/src/permissions.json b/templates/help-center/directus/template/src/permissions.json
similarity index 100%
rename from help-center/src/permissions.json
rename to templates/help-center/directus/template/src/permissions.json
diff --git a/help-center/src/policies.json b/templates/help-center/directus/template/src/policies.json
similarity index 100%
rename from help-center/src/policies.json
rename to templates/help-center/directus/template/src/policies.json
diff --git a/help-center/src/presets.json b/templates/help-center/directus/template/src/presets.json
similarity index 100%
rename from help-center/src/presets.json
rename to templates/help-center/directus/template/src/presets.json
diff --git a/help-center/src/relations.json b/templates/help-center/directus/template/src/relations.json
similarity index 100%
rename from help-center/src/relations.json
rename to templates/help-center/directus/template/src/relations.json
diff --git a/help-center/src/roles.json b/templates/help-center/directus/template/src/roles.json
similarity index 100%
rename from help-center/src/roles.json
rename to templates/help-center/directus/template/src/roles.json
diff --git a/help-center/src/schema/snapshot.json b/templates/help-center/directus/template/src/schema/snapshot.json
similarity index 100%
rename from help-center/src/schema/snapshot.json
rename to templates/help-center/directus/template/src/schema/snapshot.json
diff --git a/help-center/src/settings.json b/templates/help-center/directus/template/src/settings.json
similarity index 100%
rename from help-center/src/settings.json
rename to templates/help-center/directus/template/src/settings.json
diff --git a/help-center/src/translations.json b/templates/help-center/directus/template/src/translations.json
similarity index 100%
rename from help-center/src/translations.json
rename to templates/help-center/directus/template/src/translations.json
diff --git a/help-center/src/users.json b/templates/help-center/directus/template/src/users.json
similarity index 100%
rename from help-center/src/users.json
rename to templates/help-center/directus/template/src/users.json