commit 4cfe66a27ddcd8eddcaa135c000f1f681c6810df Author: wehub-resource-sync Date: Mon Jul 13 13:34:31 2026 +0800 chore: import upstream snapshot with attribution diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..37a6700 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +charset = utf-8 +indent_style = space +indent_size = 2 +tab_width = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..c41eb53 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.wasp linguist-language=TypeScript diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..456cc3d --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,14 @@ +# These are supported funding model platforms + +github: [wasp-lang] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +polar: # Replace with a single Polar username +buy_me_a_coffee: # Replace with a single Buy Me a Coffee username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..7758daa --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,11 @@ +## Description + +> Describe your PR! If it fixes specific issue, mention it with "Fixes # (issue)". + +## Contributor Checklist + +> Make sure to do the following steps if they are applicable to your PR: + +- [ ] **Update e2e tests**: If you changed the [/template/app](/template/app), then make sure to do any neccessary updates to [/template/e2e-tests](/template/e2e-tests) also. +- [ ] **Update demo app**: If you changed the [/template/app](/template/app), then make sure to do any neccessary updates to [/opensaas-sh/app_diff](/opensaas-sh/app_diff) also. Check [/opensaas-sh/README.md](/opensaas-sh/README.md) for details. +- [ ] **Update docs**: If needed, update the [/opensaas-sh/blog/src/content/docs](/opensaas-sh/blog/src/content/docs). diff --git a/.github/workflows/automation-pr-label-external.yaml b/.github/workflows/automation-pr-label-external.yaml new file mode 100644 index 0000000..b2d2320 --- /dev/null +++ b/.github/workflows/automation-pr-label-external.yaml @@ -0,0 +1,39 @@ +name: "Automation - Label external PRs" + +############################################################ +# CAUTION: This workflow should not check out the PR code! # +############################################################ +# The `pull_request_target` event is only intended for simple automations on the +# PRs themselves (e.g., labeling, commenting). If we checked out the PR code here, +# we would be running untrusted code and giving it access to our repository +# secrets, which is a major security risk. +# +# More info at: +# https://securitylab.github.com/resources/github-actions-preventing-pwn-requests/ + +on: + pull_request_target: + types: + - opened + - reopened + - ready_for_review + +jobs: + label-external-prs: + name: Label external PRs + runs-on: ubuntu-latest + + permissions: + pull-requests: write + + # We check if the PR comes from a different repo than ours: + if: github.event.pull_request.head.repo.full_name != github.repository + + steps: + - name: Label external PR + run: gh pr edit "$PR_NUMBER" --add-label "$LABEL_NAME" + env: + LABEL_NAME: "external" + PR_NUMBER: ${{ github.event.pull_request.number }} + GH_TOKEN: ${{ github.token }} + GH_REPO: ${{ github.repository }} diff --git a/.github/workflows/blog-deployment.yml b/.github/workflows/blog-deployment.yml new file mode 100644 index 0000000..8a071dd --- /dev/null +++ b/.github/workflows/blog-deployment.yml @@ -0,0 +1,66 @@ +name: Deploy Blog to Netlify + +on: + push: + branches: + - main + paths: + - "opensaas-sh/blog/**" + pull_request: + branches: + - main + paths: + - "opensaas-sh/blog/**" + +jobs: + build: + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' + steps: + - name: Checkout code + uses: actions/checkout@v6 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: .nvmrc + + - name: Install dependencies + working-directory: ./opensaas-sh/blog + run: npm ci + + - name: Build site + working-directory: ./opensaas-sh/blog + run: npm run build + + deploy: + runs-on: ubuntu-latest + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + steps: + - name: Checkout code + uses: actions/checkout@v6 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: .nvmrc + + - name: Install dependencies + working-directory: ./opensaas-sh/blog + run: npm ci + + - name: Build site + working-directory: ./opensaas-sh/blog + run: npm run build + + - name: Deploy to Netlify + uses: nwtgck/actions-netlify@v3 + with: + publish-dir: "./opensaas-sh/blog/dist" + production-branch: main + github-token: ${{ secrets.GITHUB_TOKEN }} + deploy-message: "Deploy from GitHub Actions" + env: + NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} + NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} + timeout-minutes: 1 diff --git a/.github/workflows/check-opensaas-diffs.yml b/.github/workflows/check-opensaas-diffs.yml new file mode 100644 index 0000000..4b6e49d --- /dev/null +++ b/.github/workflows/check-opensaas-diffs.yml @@ -0,0 +1,29 @@ +name: Check `opensaas-sh` diffs are up to date + +on: + workflow_dispatch: + pull_request: + push: + branches: + - main + +jobs: + check-diffs: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v6 + + - name: Generate diffs + run: | + ./opensaas-sh/tools/patch.sh + ./opensaas-sh/tools/diff.sh + + - name: Check for uncommitted changes + run: | + if [[ -n $(git status --porcelain) ]]; then + echo "Error: There are uncommitted diff changes" + echo "Please run './opensaas-sh/tools/patch.sh' and './opensaas-sh/tools/diff.sh' locally and commit the changes" + git status + exit 1 + fi diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml new file mode 100644 index 0000000..67e584e --- /dev/null +++ b/.github/workflows/e2e-tests.yml @@ -0,0 +1,124 @@ +name: e2e tests + +on: + workflow_dispatch: + push: + branches: + - main + pull_request: + +env: + WASP_TELEMETRY_DISABLE: 1 + WASP_VERSION: + # If you're copying this workflow to your own project, set this to your app's Wasp version: + main + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout the repo + uses: actions/checkout@v6 + + - name: Setup Node.js + id: setup-node + uses: actions/setup-node@v6 + with: + node-version: "24.14.1" + + - name: Docker setup + uses: docker/setup-buildx-action@v4 + + - name: Install Wasp ${{ env.WASP_VERSION }} + if: env.WASP_VERSION != 'main' + run: npm i -g @wasp.sh/wasp-cli@${{ env.WASP_VERSION }} + + # If you're copying this workflow to your own project, you can remove this step: + - name: Install latest development Wasp + if: env.WASP_VERSION == 'main' + # Installs the latest published build of the CLI from the `main` branch. + run: npm i -g https://pkg.pr.new/@wasp.sh/wasp-cli@main + + - name: Cache global node modules + uses: actions/cache@v5 + with: + path: ~/.npm + key: node-modules-${{ runner.os }}-${{ hashFiles('template/app/package-lock.json') }}-${{ hashFiles('template/e2e-tests/package-lock.json') }}-wasp${{ env.WASP_VERSION }}-node${{ steps.setup-node.outputs.node-version }} + restore-keys: | + node-modules-${{ runner.os }}- + + # In order for the app to run in the dev mode we need to set the required env vars even if + # they aren't actually used by the app. This step sets mock env vars in order to pass the + # validation steps so the app can run in the CI environment. For env vars that are actually + # used in tests and therefore need real values, we set them in the GitHub secrets settings and + # access them in a step below. + - name: Prepare the template for tests + working-directory: ./template + run: | + cd app + cp .env.server.example .env.server && cp .env.client.example .env.client + wasp install + + - name: "Install Node.js dependencies for Playwright tests" + if: steps.cache-e2e-tests.outputs.cache-hit != 'true' + working-directory: ./template + run: | + cd e2e-tests + npm ci + + - name: "Store Playwright's Version" + working-directory: ./template + run: | + cd e2e-tests + PLAYWRIGHT_VERSION=$(npm ls @playwright/test | grep @playwright | sed 's/.*@//') + echo "Playwright's Version: $PLAYWRIGHT_VERSION" + echo "PLAYWRIGHT_VERSION=$PLAYWRIGHT_VERSION" >> $GITHUB_ENV + + - name: "Cache Playwright Browsers for Playwright's Version" + id: cache-playwright-browsers + uses: actions/cache@v5 + with: + path: ~/.cache/ms-playwright + key: playwright-browsers-${{ env.PLAYWRIGHT_VERSION }}-${{ runner.os }} + + - name: "Set up Playwright" + if: steps.cache-playwright-browsers.outputs.cache-hit != 'true' + working-directory: ./template + run: | + cd e2e-tests + npx playwright install --with-deps + + - name: "Install Stripe CLI" + run: | + curl -s https://packages.stripe.dev/api/security/keypair/stripe-cli-gpg/public | gpg --dearmor | sudo tee /usr/share/keyrings/stripe.gpg + echo "deb [signed-by=/usr/share/keyrings/stripe.gpg] https://packages.stripe.dev/stripe-cli-debian-local stable main" | sudo tee -a /etc/apt/sources.list.d/stripe.list + sudo apt update + sudo apt install stripe + + # For Stripe webhooks to work in development, we need to run the Stripe CLI to listen for webhook events. + # The Stripe CLI will receive the webhook events from Stripe test payments and + # forward them to our local server so that we can test the payment flow in our e2e tests. + - name: "Run Stripe CLI to listen for webhooks" + env: + STRIPE_DEVICE_NAME: ${{ secrets.STRIPE_DEVICE_NAME }} + run: | + stripe listen --api-key ${{ secrets.STRIPE_KEY }} --forward-to localhost:3001/payments-webhook & + + - name: "Run Playwright tests" + env: + # The e2e tests are testing parts of the app that need certain env vars, so we need to access them here. + # These secretes can be set in your GitHub repo settings, e.g. https://github.com///settings/secrets/actions + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + STRIPE_API_KEY: ${{ secrets.STRIPE_KEY }} + STRIPE_WEBHOOK_SECRET: ${{ secrets.STRIPE_WEBHOOK_SECRET }} + PAYMENTS_HOBBY_SUBSCRIPTION_PLAN_ID: ${{ secrets.STRIPE_HOBBY_SUBSCRIPTION_PRICE_ID }} + PAYMENTS_PRO_SUBSCRIPTION_PLAN_ID: ${{ secrets.STRIPE_PRO_SUBSCRIPTION_PRICE_ID }} + PAYMENTS_CREDITS_10_PLAN_ID: ${{ secrets.STRIPE_CREDITS_PRICE_ID }} + SKIP_EMAIL_VERIFICATION_IN_DEV: true + # Client-side env vars + REACT_APP_GOOGLE_ANALYTICS_ID: G-H3LSJCK95H + working-directory: ./template + run: | + cd e2e-tests + npm run e2e:playwright diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..97e141d --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,48 @@ +name: Lint + +on: + push: + branches: + - main + pull_request: + +jobs: + prettier: + name: Prettier Check + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Checkout code + uses: actions/checkout@v6 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: .nvmrc + + - name: Install dependencies + run: npm ci + + - name: Run Prettier check + run: npm run prettier:check + + eslint: + name: ESLint Check + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Checkout code + uses: actions/checkout@v6 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: .nvmrc + + - name: Install dependencies + run: npm ci + + - name: Run ESLint + run: npm run lint diff --git a/.github/workflows/template-release.yml b/.github/workflows/template-release.yml new file mode 100644 index 0000000..f6b02ab --- /dev/null +++ b/.github/workflows/template-release.yml @@ -0,0 +1,48 @@ +--- +name: Template Release + +"on": + push: + tags: + - "wasp-v*-template" + + workflow_dispatch: + inputs: + tag: + description: "Tag to release (e.g., wasp-v0.18-template)" + required: true + +permissions: + contents: write + +jobs: + release: + runs-on: ubuntu-latest + + env: + tag_name: ${{ inputs.tag || github.ref_name }} + archive_name: template.tar.gz + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + with: + ref: ${{ env.tag_name}} + + - name: Create template archive + # The Wasp CLI expects the template contents to be in the root of the archive. + working-directory: template + run: tar -czf "../$archive_name" . + + - name: Create release if it doesn't exist + run: | + if ! gh release view "$tag_name"; then + gh release create "$tag_name" + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload release asset + run: gh release upload "$tag_name" "$archive_name" --clobber + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cec5060 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +# Dependencies +node_modules/ + +# macOS-specific files. +.DS_Store + +# We want to keep the template clean from the usual build artifacts. +# We also don't want to ship these ignore rules to the users. +template/app/migrations +template/app/package-lock.json diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..ef289f8 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +# Helps prevent supply chain attacks +min-release-age=7 diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..e5113ea --- /dev/null +++ b/.nvmrc @@ -0,0 +1,2 @@ +24.14.1 +# This is not the only place where the Node version is specified. Please do a grep as well. diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..7155fb0 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,16 @@ +# Build outputs. +.wasp/ +dist/ + +# Open SaaS app diff folder. +app_diff/ + +# Formatting `.md` and `.mdx` files can introduce logical changes. +**/blog/**/*.md +**/blog/**/*.mdx + +# Ignore minified JS files in the public folder. +**/public/**/*.js + +# Blog scripts. +opensaas-sh/blog/scripts/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..d6bde10 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,47 @@ +Thanks so much for considering contributing to Open SaaS 🙏 + +## Considerations before Contributing + +Check if there is a GitHub issue already for the thing you would like to work on. If there is no issue yet, create a new one. + +Let us know, in the issue, that you would like to work on it and how you plan to approach it. +This helps, especially with the more complex issues, as it allows us to discuss the solution upfront and make sure it is well planned and fits with the rest of the project. + +## Repo organization + +Repo is divided into two main parts: [template](/template) dir and [opensaas-sh](/opensaas-sh) dir. + +`template` contains the actual open saas template that will be used by Wasp to create your new open-saas-based app when you run `wasp new -t saas`. + +`opensaas-sh` is the app deployed to https://opensaas.sh , and is actually made with open saas! It contains a demo app and open saas docs. We keep it updated as we work on the template. + +## How to Contribute + +> [!IMPORTANT] +> The in-development version of the template uses the in-development version of Wasp. We've set up the `./tools/wasp` script. +> To use it, whenever you would normally run `wasp `, run `/tools/wasp ` instead. + +1. Make sure you understand the basics of how open-saas works (check out [docs](https://docs.opensaas.sh)). +2. Check out this repo (`main` branch) and make sure you are able to get the app in [template/app/](/template/app) running (to set it up, follow the same steps as for running a new open-saas app, as explained in the open-saas docs). +3. Create a new git branch for your work (aka feature branch) and do your changes on it. +4. Update e2e tests in [template/e2e-tests](/template/e2e-tests/) if needed and make sure they are passing. +5. Update docs in [opensaas-sh/blog/src/content/docs](/opensaas-sh/blog/src/content/docs/) if needed. Check [opensaas-sh/README.md](/opensaas-sh/README.md) for more details. +6. Update demo app in [opensaas-sh/app_diff](/opensaas-sh/app_diff) if needed. Check [opensaas-sh/README.md](/opensaas-sh/README.md) for more details. +7. Create a pull request (towards `main` as a base branch). +8. Make a "Da Boi" meme while you wait for us to review your PR(s). +9. If you don't know who "Da Boi" is, head back to the [Wasp Discord](https://discord.gg/aCamt5wCpS) and find out :) + +## Additional Info + +### Template Versioning + +Whenever a user starts a new Wasp project with `wasp new -t `, Wasp looks for a specific tag on the template repo, and pulls the project at the commit associated with that tag. + +In the case of Open SaaS, which is a Wasp template, the tag is `wasp-v{{version}}-template`, where `{{version}}` is the current version of Wasp, e.g. `wasp-v0.13-template`. + +We manually (re)assign the appropriate tag when we are ready to release a new version of Open Saas. + +### Releasing + +1. Assign appropriate tag to the commit we want to release (usually current `main`) so `wasp new -t saas` can pick up code from the [/template](/template). +2. Deploy the demo app + landing page and blog + docs: [/opensaas-sh/README.md#Deployment](/opensaas-sh/README.md#Deployment). diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..179283f --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 wasp-lang + +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. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..1cf3278 --- /dev/null +++ b/README.md @@ -0,0 +1,128 @@ +## Welcome to your new SaaS App! 🎉 + + + +https://github.com/user-attachments/assets/3856276b-23e9-455e-a564-b5f26f4f0e98 + +You've decided to build a SaaS app with the Open SaaS template. Great choice! + +This template is: + +1. fully open-source +2. completely free to use and distribute +3. comes with a ton of features out of the box! +4. ready to work with your favorite AI coding tool or agent (Claude Code, Cursor, Codex, OpenCode, etc.) + +🧑‍💻 Check it out in action here: [OpenSaaS.sh](https://opensaas.sh) +📚 Check out the Docs here: [Open SaaS Docs](https://docs.opensaas.sh) + +## What's inside? + +The template itself is built on top of some very powerful tools and frameworks, including: + +- 🐝 [Wasp](https://wasp.sh) - a full-stack React, NodeJS, Prisma framework with superpowers +- 🚀 [Astro](https://starlight.astro.build/) - Astro's lightweight "Starlight" template for documentation and blog +- 💸 [Stripe](https://stripe.com), [Polar.sh](https://polar.sh), or [Lemon Squeezy](https://lemonsqueezy.com/) - for products and payments +- 💅 [ShadCN UI](https://tailwindcss.com) - for components & styling (plus admin dashboard!) +- 🤖 [AI-Ready](https://docs.opensaas.sh/) - Custom Plugins, Skills, & Rules for AI-assisted coding with Claude Code, Cursor, or your favorite AI-assisted coding tool +- 📈 [Plausible](https://plausible.io) or [Google](https://analytics.google.com/) Analytics +- 🤖 [OpenAI](https://openai.com) - OpenAI API w/ function calling example +- 📦 [AWS S3](https://aws.amazon.com/s3/) - for file uploads +- 📧 [SendGrid](https://sendgrid.com), [MailGun](https://mailgun.com), or SMTP - for email sending +- 🧪 [Playwright](https://playwright.dev) - end-to-end tests with Playwright + +Because we're using Wasp as the full-stack framework, we can leverage a lot of its features to build our SaaS in record time, including: + +- 🔐 [Full-stack Authentication](https://wasp.sh/docs/auth/overview) - Email verified + social Auth in a few lines of code. +- ⛑ [End-to-end Type Safety](https://wasp.sh/docs/data-model/operations/overview) - Type your backend functions and get inferred types on the front-end automatically, without the need to install or configure any third-party libraries. Oh, and type-safe Links, too! +- 🤖 [Jobs](https://wasp.sh/docs/advanced/jobs) - Run cron jobs in the background or set up queues simply by defining a function in the config file. +- 🚀 [One-command Deploy](https://wasp.sh/docs/advanced/deployment/overview) - Easily deploy your DB, Server, & Client with one commaned to [Railway](https://railway.app) or [Fly.io](https://fly.io) via the CLI. Or deploy manually to any other hosting serivce of your choice. + +You also get access to Wasp's diverse, helpful community if you get stuck or need help. + +- 🤝 [Wasp Discord](https://discord.gg/aCamt5wCpS) + +## Getting Started + +### Simple Instructions + +First, to install the latest version of [Wasp](https://wasp.sh/) on macOS, Linux, or Windows with WSL, run the following command: + +```bash +npm i -g @wasp.sh/wasp-cli +``` + +Then, create a new SaaS app with the following command: + +```bash +wasp new -t saas +``` + +This will create a **clean copy of the Open SaaS template** into a new directory, and you can start building your SaaS app right away! + +### Detailed Instructions + +For everything you need to know about getting started and using this template, check out the [Open SaaS Docs](https://docs.opensaas.sh). + +We've documented everything in great detail, including installation instructions, pulling updates to the template, guides for integrating services, SEO, deployment, and more. 🚀 + +## Getting Help & Providing Feedback + +There are two ways to get help or provide feedback (and we try to always respond quickly!): + +1. [Open an issue](https://github.com/wasp-lang/open-saas/issues) +2. [Wasp Discord](https://discord.gg/aCamt5wCpS) -- please direct questions to the #🙋questions forum channel + +## Development Tools + +### Code Quality Tools + +This repository includes comprehensive code quality tooling to help maintain code standards: + +#### Prettier (Code Formatting) + +Prettier is configured for automatic code formatting across all JavaScript, TypeScript, and other supported files. + +```bash +# Check if files are formatted correctly +npm run prettier:check + +# Automatically format all files +npm run prettier:format +``` + +#### ESLint (Code Linting) + +ESLint is configured with TypeScript and React support to catch potential bugs and enforce code quality standards. + +```bash +# Run ESLint to check for issues +npm run lint + +# Automatically fix fixable issues +npm run lint:fix +``` + +The ESLint configuration includes: + +- TypeScript support with `@typescript-eslint` +- React and React Hooks linting +- Sensible defaults tuned for a SaaS application +- Automatic support for CommonJS (.cjs), ES Modules (.mjs), and TypeScript files + +Both Prettier and ESLint checks are automatically run in CI/CD pipelines to ensure code quality. + +For information about other development tools used to maintain derived projects (like opensaas.sh and template-test), see [tools/README.md](./tools/README.md). + +## Contributing + +Note that we've tried to get as many of the core features of a SaaS app into this template as possible, but there still might be some missing features or functionality. + +We could always use some help tying up loose ends: contributions are welcome! Check out [CONTRIBUTING.md](/CONTRIBUTING.md) for more details. diff --git a/README.wehub.md b/README.wehub.md new file mode 100644 index 0000000..72ef181 --- /dev/null +++ b/README.wehub.md @@ -0,0 +1,7 @@ +# WeHub 来源说明 + +- 原始项目:`wasp-lang/open-saas` +- 原始仓库:https://github.com/wasp-lang/open-saas +- 导入方式:上游默认分支的最新快照 +- 原作者、版权和许可证信息以原始仓库及本仓库 LICENSE 为准 +- 本文件仅用于记录来源,不代表 WeHub 是原项目作者 diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..ff8f1d8 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,76 @@ +import js from "@eslint/js"; +import reactPlugin from "eslint-plugin-react"; +import reactHooksPlugin from "eslint-plugin-react-hooks"; +import tseslint from "typescript-eslint"; + +export default tseslint.config( + // Ignore patterns + { + ignores: [ + "**/node_modules/**", + "**/.wasp/**", + "**/dist/**", + "**/build/**", + "app_diff/**", + "**/public/**/*.js", + "**/.astro/**", + "opensaas-sh/blog/scripts/**", + ], + }, + + // Base JavaScript rules for all files + js.configs.recommended, + + // TypeScript rules for TS/TSX files + ...tseslint.configs.recommended, + + // React-specific rules + { + files: ["**/*.jsx", "**/*.tsx"], + plugins: { + react: reactPlugin, + "react-hooks": reactHooksPlugin, + }, + settings: { + react: { + version: "detect", + }, + }, + rules: { + ...reactPlugin.configs.recommended.rules, + ...reactHooksPlugin.configs.recommended.rules, + "react/react-in-jsx-scope": "off", // Not needed in React 17+ + "react/prop-types": "warn", // Using TypeScript for type checking + "react/no-unescaped-entities": "off", // Allow apostrophes in JSX + }, + }, + + // CommonJS configuration files (postcss.config.cjs, etc.) + { + files: ["**/*.cjs"], + languageOptions: { + sourceType: "commonjs", + globals: { + module: "readonly", + require: "readonly", + __dirname: "readonly", + __filename: "readonly", + process: "readonly", + console: "readonly", + }, + }, + }, + + // Node.js scripts and MJS files + { + files: ["**/*.mjs", "**/scripts/**/*.js"], + languageOptions: { + globals: { + process: "readonly", + console: "readonly", + __dirname: "readonly", + __filename: "readonly", + }, + }, + }, +); diff --git a/opensaas-sh/.gitignore b/opensaas-sh/.gitignore new file mode 100644 index 0000000..908f7bb --- /dev/null +++ b/opensaas-sh/.gitignore @@ -0,0 +1 @@ +app/ diff --git a/opensaas-sh/README.md b/opensaas-sh/README.md new file mode 100644 index 0000000..7fb6b61 --- /dev/null +++ b/opensaas-sh/README.md @@ -0,0 +1,36 @@ +# OpenSaas.sh + +This is the https://opensaas.sh page and demo app, built with the Open Saas template! + +It consists of a Wasp app for showcasing the Open Saas template (+ landing page), while the Astro blog is blog and docs for the Open Saas template, found at https://docs.opensaas.sh. + +Inception :)! + +## Development + +### Demo app (app_diff/) + +> [!IMPORTANT] +> The in-development version of the template uses the in-development version of Wasp. We've set up the `./tools/wasp` script. +> To use it, whenever you would normally run `wasp `, run `/tools/wasp ` instead. + +Since the demo app is just the open saas template with some small tweaks, and we want to be able to easily keep it up to date as the template changes, we don't version (in git) the actual demo app code, instead we version the diffs between it and the template: `app_diff/`. + +#### Workflow + +- Generate `app/` from template and diffs: `./tools/patch.sh` +- Update diffs after modifying `app/`: `./tools/diff.sh` + +For detailed information about the diff/patch workflow and macOS setup requirements, see [../tools/README.md](../tools/README.md). + +### Blog (blog/) + +Blog (and docs in it) is currently tracked in whole, as it has quite some content, so updating it to the latest version of Open Saas is done manually, but it might be interesting to also move it to the `diff` approach, as we use for the demo app, if it turns out to be a good match. + +For more info on authoring content for the docs and blog, including information on custom components, see the [blog/README.md](blog/README.md). + +## Deployment + +App: check its README.md (after you generate it with `.tools/patch.sh`) . + +Blog (docs): hosted on Netlify. diff --git a/opensaas-sh/app_diff/.claude/settings.json.diff b/opensaas-sh/app_diff/.claude/settings.json.diff new file mode 100644 index 0000000..8b73df4 --- /dev/null +++ b/opensaas-sh/app_diff/.claude/settings.json.diff @@ -0,0 +1,14 @@ +--- template/app/.claude/settings.json ++++ opensaas-sh/app/.claude/settings.json +@@ -0,0 +1,11 @@ ++{ ++ "enableAllProjectMcpServers": true, ++ "enabledMcpjsonServers": ["chrome-devtools"], ++ "permissions": { ++ "allow": [ ++ "Bash(ln:*)", ++ "Bash(wasp start:*)", ++ "Bash(npx -y https://pkg.pr.new/@wasp.sh/wasp-cli@main:*)" ++ ] ++ } ++} diff --git a/opensaas-sh/app_diff/.env.client.diff b/opensaas-sh/app_diff/.env.client.diff new file mode 100644 index 0000000..e34ce17 --- /dev/null +++ b/opensaas-sh/app_diff/.env.client.diff @@ -0,0 +1,4 @@ +--- template/app/.env.client ++++ opensaas-sh/app/.env.client +@@ -0,0 +1 @@ ++REACT_APP_GOOGLE_ANALYTICS_ID=G-H3LSJCK95H diff --git a/opensaas-sh/app_diff/.env.vault.diff b/opensaas-sh/app_diff/.env.vault.diff new file mode 100644 index 0000000..9e2307f --- /dev/null +++ b/opensaas-sh/app_diff/.env.vault.diff @@ -0,0 +1,28 @@ +--- template/app/.env.vault ++++ opensaas-sh/app/.env.vault +@@ -0,0 +1,25 @@ ++#/-------------------.env.vault---------------------/ ++#/ cloud-agnostic vaulting standard / ++#/ [how it works](https://dotenv.org/env-vault) / ++#/--------------------------------------------------/ ++ ++# development ++DOTENV_VAULT_DEVELOPMENT="SoTXvOA7WDmjPwt0IbqGyXjvBdID/up9D4CU6eyCe85ORp4sgB/w6APQ38Iojk7TubYChAom+Of3MHU3XzSCWyT1kUh4XMU6+1CoBv+xeCI+eBcKYmhcrOJXaYp4O0Hy2RYq/OZaQT+ybVihVFZWylaMNdsLG41ytKx3HvsPq0JePIv7SQcTUo50zBiUP44LbS4St76DEsao8hN00zPeg/59VFoVgWBrnR2J+TclMxB87dWB02ddBpWJtXVWfTmy7Q9wCfKWsUVAjVvePu6gu0SvIUROG/WXUbqMIbebIkJ00oTi+z72h7Ssx8PgLJOy559bOVPgJvJWiZSD7D6Bnj9JLPUG3D2Vu9gJOwxsGPs7sJzt7/+pXaYcMb9pHQHZKPYDtojrkI+RgT/PPLLxX3gp95Cq1tkRQfqYwnSfihin0R1e/4AW2PcFYGoJWFkdSkaYPGWF82YBoQDr+7NJuvwcxTs1LaqRllxUIKLGgBE5nX+1wlkrXoVU8taWexuT/KGGTMGTY7UAxcJkSmr94+Rk5bjEGIt/xHZPkh7QIVUEl8X6gcNJ2r+DwKAFVH73WX+H0hYDf61/nAHj6kK7sjVLS+C2BoZ1Pg3G/Gwue+AFoLbUgZCBhBFoLnrEfFNNGKbU0YK6NKtWYFaLpKDAQLxmRh+nsLap+QI1OdHKCP2byBNiML92IvyEIxnqUBprRp1TMdAo522OBzzY4GNuUnpy3qAv+/rU07G0n/3FGpgpSZPX/xN6IFyKOoSbO2BD9sv3BPHouT68Q3Vi2miu3XGb7nuqe5Dun/6TdBpKey4bj0UU9WTElLH/wZ3leUDftW05zJF/e9Nv/nZ8sRCGPik2VTmF2hdOVjZ7tjM2dV9l/cko3PBXnWcPzXJ1XprnPnswfqq8YN4b7fZPVC9puVWqF0veuRDI9YkbusBQWUOvJjf5yg+BHihnOqIGSELqzmGS99SzvzL7RFRD9gXAVKD5e9F1QyPVBb/jdw6hdG5ZdwoS+5x75RtsUR9HhcYo1+Vwg4FLiwyBjJuHsGezS4waMetPvKT6XCjz1Vb+M00lVpoF0ABajRkKqS+NgEBMs521XStQ4eAFOVbtUkW0iMqzKeKgL+FZSYqQS4vLRYlDx1yJ3BgMk5+serX+QuNiVdzTMDaEt2W4l4TObneMuwBz5RentbzgDzhWylhtRliVHBfaP6XpCH1k13UBG1rrpjIaBv09go4UpXp36FfV/z+FdnjX8az6nDLRr7xZ6nxaR+9k5KGB1G/VwHtYJzrVbUnwJHGw7EZraJd6RmYICzy987HuOXp1SJk1AcJbQq4HR+PnZzjZLKdnBfPWCaA69hhYfuunYOM7lcz9LB0CjEAFTwxb0vyrTXrS+W+sbWKCBSqAbdCzlNZ3LO6yGoUHuunDyzqbPEWGtMfvoTtnce6teKOBh0zXkzA8i0P12h7qCt93HFvwBd9kKRRaAs4tSNQ7L8E2wQl7QP4U4BadcOf3pwuxZKUy69iTi7NXEceUr0M7FGuP/7VQ9jUsVNRliyhoG+N8wmdXhBuc5YP3BGUC6WzK0krPcWkxEzQKBq+JcbkHE0GnLwJjV0aV/JcLBIWacg1f4ehmYUVm1Ox54TQIES6BK8m7TgDpYQp4TUS7RU5lh4vvqxxbo2visY0VKFUXncEMYpX7G4eJVPFGjUghAlpinx3psHiJUe0crE6pRwPzHEZzVZ2W9KPhKkaCrrunX/8kyMvcm6RHc5WizAvuh2pPWiWax3bg7/rVLG84akL5LzLLnNJQuT7qCRYLB35X17+Onr2mTjB4hPpek2nsaR8VAeyGCAgw2q41Opy2v7vKIGq3h8F+1Baqiy8bzOmTEdzjD7No+c1YBeS75+/4BiUCrlQ9zUVKRR7RVjEDOrTGUCAWf6evsPKcqg4Arg0BxOrtfsd9EWZvstk53cbkPc6kGS0eN6Esv/+Xz+3sEiKiC7nntiMJPBCvx5uKPVKlduKJLEVipoIdJhf3GrWTDCich7+b4vPj3T6Jc6sRKZm5zVSyvUlgu7WSr0HnrlMMrhp2SKmxTMFkscBeNd1x7Z0JaNZylG5yB83ezhTgm2d5IB1BMLfuTgl29bg79B47YEQTFyg2HK0lcVAiMtXjybbqgJeTwuNs+/zvb+7Ry2UMQBJuli8atQaTjSPl4Bpkj+Ky090yj2WKbyR1mEGqD/blOy5kDGf1RuigOYjoDepJBmdOYyt1T1bB7lrPYEK2yoOdyOUqF5UtP1SJGLTBTEIDej4kEiQOulrokRvDl4DgbC0GQ/y/bV423C23zhbS8r+e9H2t6wtD2Mviq38gAIpgQSFK2iZPPnTdSgklTlcCWGzO7cGVk79QIqa/p8pwSXi7mjbPcyYH5QKiblIWJBV/bmaj5QyDdTpf59tlc5vWeuMZA4cpIo8NC90QhI/Jdz1/FoFKUngxD83CA9hngCUcZMz7fPXZyJTwWYNJkX8ZEJr/qsfeKXI8aLgTtqsZCX1a1Ab5awft4UUhW9MrubyJEZQhDRBek6vpysUOGtvocOPhqGP95aIzAg==" ++DOTENV_VAULT_DEVELOPMENT_VERSION=16 ++ ++# ci ++DOTENV_VAULT_CI="gLPj+GuhKqDgQnDt+OEBzLtZLSVQwXeNPDBBH+vyrA7w9BrTr1vyxopeWfbvadoLEO9VUsaMZVKhl1jWWFzujljN/37ekawekwWwEVZeMHilyuAxtx/kk5HOwq4PNG126YXVP4UCi0KneD7Qy1KMVqkzTMmIpGZ3Stp+4/pmoKF8hFGSYsElBoNCFzCLwNzIZ3qVzITkAVMKvAbFDsl0A3S1FAUuJvmupxSJYVT6zQsSBkG6jkCG8oKDDMe+XRHAf8da6L635p1+v3FsPGt438q9yyWXvWsne5NOE/GzLzLOWlQQJEP/PJ3673sBSnqP0UirIVJTxXLsNT++U56O4J2bhz6hjvcllkzz7QW/aD5t/VkuhEEaKY44aoglW7FraBETxpo4lFcw0rbCdOQqFOxe1GdN82/ZY8Z7NftMCN2rFPTBVw6tp5GMJsN+q6ShS2j/nILyUiLoUbgFsdIn2WJdTlvowNjIKcs27LvEG5E55Lg/tNWD1TQcLYzJkGAecWbZeCFm/9E1HOZXpHvxIe5ZD+GDl9D7UATZr08Jy3ntMX+i2FW2eilz14g0SsgBkwaOvGFKfiyCAwTaU31PCKmEkqdQSSaJ36oKXj9OFojdf9/+dJLLEGS+BI6u0u+32dl3ASm8ftgcTqdziKDKluVv6DY4MCne9wEFtJQi4lEU2JD9XfATGxLfdyPM9/PgeL7dPQrlSnbOZX7scPsHeQQB0kp8MC6b86lhTqgcqaC4lAG7dK6fE1R/f2j28ININkr+cLhtWvZb0sBhMXhMMxJPmA7usHXYn2ual30egREo+hkAeQbBYBB2QD/TJFjlo3qoKpvjEVy5LpwDLwy/11sQBBMjlxCcjJv49Y6VyAA3V2WH3HDAEO+fnNbDvoji+sUjf0UlHzCFwJzkU8jCxEYjXiSWIWltNtPzM9r6By1qnv4mIl4lhCEEsX4MOkPJaPaOMnGdMQnvDwaUmxochDKDgoTJUm8BjZlp/UMOcSj22oxw6MmOOh9TSzrD6Cf+KtncKLsCW8/fr1b1I/wUmR2ASSTHpVhpGFv4Mgq6GhGP5wlZdBfcmEwcu1QIsyHTzgJgeysKf2Q42hJGOYHdHvPwb4/5oXwD71sZHe1FvIea5S2WN3agfYJ8J1FTm8MC+sQX+I/ZQvpcojUa7qkKJylrqv05Mo11+HaHxSgaYgaenuPOIOBTTSinw9QcB7GGAyonpjamG2LRpKZ4KgSBH+MgNA1+bbA5V8syOSGsSseAikFtjnbavXe4Rbm8gLRS3lFa0avAIZb1s68AW80feXMIsXeaBv86gkrbzkWugchUPdJjfwIm1Qx1DdY+NynMq55Ey5jK6miGDd7yIY1CQnkKTTRGH0VmhNt7imdVrWTtJKdL2DxPS9IaEEHZqPJiWU49Q1eR344zJuXgFezaC9gyH0CqGbrZymlSc8a94HZWNbdhz6tx+cjZdTzHNW8r5jTUmF8G/v9Mx4EHqIViFoLgY4IlMl8qu3wWOOOl5uZBMpJkaav7VXiko/f166EhE2uC5N4t3v7QwaG8Iqal7FM8QQX9zqp4BNht+MjFTWfIik2tH9E3E+qmIAwLYyyaonYF7WKAfv9mNlr29JjFX8CK1Q==" ++DOTENV_VAULT_CI_VERSION=10 ++ ++# staging ++DOTENV_VAULT_STAGING="e0RuXVNGV1PeU7FikDvw6tGaihOhf8hcgqMwAGBjfIVQVXgSbhaIzMiGC1fbcHZ1MAfIzKB81ptEkdy2sGRFJzx9FuZkLg/ane0QYjzxd1d+XRPxm+wTYIKLzkJtrP3jymJj4qXv43JrOtg3PjVHvM+/zZGkdm29D4qQrq4LbhO7mLL9TA2ob7ptfVT3ifKt0zlVV2DJPaHOS5jIt/N+rk695t5cFs5xcIEtjg+14TbU+4RF7gKFOjlQDgkr39UKe1bti4q3GdsQHnHAP1iYELz/eWFjZbM6k2VYTj5XHw7fu4lB0pSdiAfkHfg4IJ81YIcCLVQ7LiP3wqNnvUZqS2eXAm1eoJPZfXOutsrkaj23kbBcbVAByDZFDnNhae3jH3I5/CteO4jWDllxDpl7LBcF4tnWzdXkIu/syLr3TXFFl0WywyuMsVeDaA9UCLrHpfXak64I9iNuOdGKnA78hdaeTTCMjjxXjPCH9DmPuBm3k8YTT7QzuqgvccP56GZ28Nawz9lXFPAhNCCfEaXqQxstzpVIEAenElgfB/3JrJJRF0BUSt94gafMFf3TAWaRHKmGTpEYrQu/c4QggTjQb3L0cb1EnU5nSHKGY6Dwfg5qvLJ8u06lHY5f2ryv3q8RMme+sukf6mUzzBXGs2ibl/DCVj0u+Ti9LiF8CKw5mSN5g1IxTV1G+C+F8iLqZG3sfb2PQXOHZCavLgWSajCiUcikOwRn2OKLuRdOL5Jt0Vjca7EwT9sbEf8SQdwd61SVcQhjgCFBzMCWI3VSqunX8uoNSTWz+4cVlbYIiCmULOTuER0OxMKISL3kAF7XYQN6Zu7Md6Wyb5K3oBmjdiBYvlBDQHb0zjc8LoLCFT4dz9Yqt7leGMBbTc75F9KQJ8NnjLGTh6xXbKtCu15HmgSf8qgVyuWDWQtFLBLMjVUXvtGTdYEPUaxwG95ktZ46IcVuwKo+CHIkH8WNuZHW9qB3beWITvLT9jpyqnj9dRUhJvRPorh0Y0L2nBwvrcWSQmehNj6RKw/xv3wIKmUtYWDcWHFGfqkq1CHuW7rz5FEWJk94FIljt0ChoanTae2VTWJ2mh15qcFAOfq/xAs3f7W5C6TuAXXxeeEYHvy/GQ2RfEQ+BSBRi0EsYHUBnLRZMceHat1Wkm7yB2ybLZu7VZpT+RZbpMlTtz6HfzLjvqv05OAgNyuYc0gfuIS2fljWBkNJ/AQvFebYaw9PW9nLEsj419SMy8DqobGTMJpvIwEwQLBOajmS2yzb//reAgxaJ6JYA16cLHSPjwoWHGIuHGG8EYaEUhFCZIEgYcfvETOZzY8PN/+Rrf784aG1XCyno+aComWpxfJBPhz9fKCtmp7oYLBe1OfSqLOy/wQpnBz5K+pRpRUOC+6cHQAYZ3JQ7z8isHSs9JkeCVZaTc8yJQi6erR2hw5xiKnju2twpXgds64wcrv2QmPLZgmfvHmihG5PbG9PKn9lGjZ8T154TqzoHQMbvGCxknhTwRX/ToLWnMMVUsiKCgyT5dPlxrhzpRm8lF6Rsj7k0VqaVfrNkjORmcLXtcWfo6J8LsYQBzXVGxC6OLzJ/ZSenrtvheaUc7uGZZ7Av40WgvnEq8pv9q3lTSfRxw==" ++DOTENV_VAULT_STAGING_VERSION=10 ++ ++# production ++DOTENV_VAULT_PRODUCTION="Nd5c0+PfKA4LH1MRMo50wM2etCkrd7CrV69hSeGM2bQMzeKc1gat5TVSI/X/1MutGqvJqbhSnVdnEp8xC2MoybCX3SYJWpM718NvVw8lffNn0NJ56dTIyk5il95T4Cydc/IjQEDQjyKer4uydJIiiqdMJIszoCrJDTrDtx4i3Efs1I5aWeYhiGymUFes5ZQbuWeXT3FQ0hcE0BYGzVYKvNCFRb6xrvtABldhpy0jNOXZ/lB2FCJr7xx3bKplfOKKv9ZmUXWW5EDCV+tccbzmGSZIn1jvKKHQYgZUA1FAGXM1gecE8qNtjZokfsRO9yaoIymeItMObRxAHtSoQNPlEVJMT5/ReuJHqA3U8qr8IQefb6FSzoJj6L62TUyYJgKaLMW6wga65AuSymbKK2AYCN6c9G7/HEqLcA1s6OQeZHG5z+RmOGiAAmudOTNwNAsI6/P2Z+x/qsJN2MB7T2T5zFb9W+1IDmjczNfVPH+J9bkWJ8Zw1n8mzPVcSIDnX3M0HW/HrFIaBKduzPp/CQtpIgnoZ+PEfs/vHYf2Fji0FBW3surZUpxE8lz1qB9DvfzPVYyZzJZhw3nHoj0XeZNBz1iFsmIeH3+NQFqYmywMgWcGr/V50kkdT8ucsPSnSsfPLTY0DfXaWX+8Rbgs/dhX1CZ32ojq7xGjuNVRLJgmq1+IYVLuue23X4h8EFMjdeQGXtV/CyRLIDKMYQFooDGFlPGwUaZJxWlD80kx3xXDV2H1kZGuYyIPFvMCRlbRPXkM6ZhxxcsPEfQecb0wrazfw4O3r0YMFGPUhMPAZa0HbXlsd5FEKYbsQVpLe8qAFi8nHeq4c12JZWQr7rfPqJyKvh9sYCARw+p1gp1i/7tKOnzcU5qtM4EaPX4C/mlnf5iHMXKWbuEfwU4PwtqSTzXf75qUBLNKqF7W/soOsrrS3FbMZJThzrXyJqLlUaSvnQSJGWBCwm08eNqjIQ+k8dF8lYafOQN+Du87RFEhDIgD54aR5EuqMKjQPSRHZgWMlSY3wDfXAy5sRsNcXQ035mKhF8VDTtbPcROoHkWD2xvaVPgp2e6JWU3d9MpinphBgz83E3c7wi5GnpwZnXn3EMzOFLqoFcaJvlVR3cTD56awox/I6HEfp5FitWKcgtwXlO5WfAmiNondYTzKR09fs4GCvJ76zZThh/6Q5amfHxtKVIlde5jDuMD5ZzGwJM/M3zmWOra7W0SQKVJUZ1U8JD6Tqk4TtafMNyuxCf+93omio8rm7TPkBlFE5D2aoH0Spivc/2D0U1iNQU04edwtX8qIKIizseWwlRyCT1k8LaychC4XVZqgHLt9j0C4z9sbaGxjbxU/1nuIVxgLEJOalqpuNFkaSLH7cOcs2lsUX7htPOYkCAuSMYT10ORNLZk008+kHX5o4Z77KranYLM2LknY6l6dPwdqGKyu5Q/yGdN4MWvA3d5lKePvKsY8xVqa7j4K8mYJW8J0qXIzeMlx/+Z+AyOBVW8S9hK652CjDCAjaDLv1Cc5CNT8gjucbr7HEt6+jiR+eXPrPatgcOnF8pwxJeVx4FHVVBqfyt3AUFjbHa1T8EZVdpFGp0Qm9CWKpX52IsVKmIA7yJKjexqjEIaTmKe6AA==" ++DOTENV_VAULT_PRODUCTION_VERSION=10 ++ ++#/----------------settings/metadata-----------------/ ++DOTENV_VAULT="vlt_47e3eeb0730e831e688049600e59f8975260a1f00302ae08684ed87ba67872d0" ++DOTENV_API_URL="https://vault.dotenv.org" ++DOTENV_CLI="npx dotenv-vault@latest" diff --git a/opensaas-sh/app_diff/.gitignore.diff b/opensaas-sh/app_diff/.gitignore.diff new file mode 100644 index 0000000..b7effc1 --- /dev/null +++ b/opensaas-sh/app_diff/.gitignore.diff @@ -0,0 +1,26 @@ +--- template/app/.gitignore ++++ opensaas-sh/app/.gitignore +@@ -1,2 +1,23 @@ + node_modules/ + .wasp/ ++ ++.env ++.env.* ++ ++# These two we added only because dotenv-vault keeps adding them if it doesn't find them, ++# even though we don't need them. Remove them once dotenv-vault stops doing that. ++.env* ++.flaskenv* ++ ++# Don't ignore example dotenv files. ++!.env.example ++!.env.*.example ++ ++# We don't want to ignore .env.client as it doesn't have any secrets. ++!.env.client ++# These are config files for dotenv-vault, so we don't want to ignore them. ++!.env.project ++!.env.vault ++ ++# Generated by scripts/generate-llms-txt.mjs at predeploy ++public/llms.txt diff --git a/opensaas-sh/app_diff/README.md.diff b/opensaas-sh/app_diff/README.md.diff new file mode 100644 index 0000000..7612ff1 --- /dev/null +++ b/opensaas-sh/app_diff/README.md.diff @@ -0,0 +1,32 @@ +--- template/app/README.md ++++ opensaas-sh/app/README.md +@@ -1,12 +1,27 @@ +-# ++# opensaas.sh (demo) app + +-Built with [Wasp](https://wasp.sh), based on the [Open Saas](https://opensaas.sh) template. ++This is a Wasp app based on Open Saas template with minimal modifications that make it into a demo app that showcases Open Saas's abilities. ++ ++It is deployed to https://opensaas.sh and serves both as a landing page for Open Saas and as a demo app. + + ## Development + ++### .env files ++ ++`.env.client` file is versioned, but `.env.server` file you have to obtain by running `npm run env:pull`, since it has secrets in it. ++This will generate `.env.server` based on the `.env.vault`. ++We are using https://vault.dotenv.org to power this and have an account/organization up there. ++If you modify .env.server and want to persist the changes (for yourself and for the other team members), do `npm run env:push`. ++ + ### Running locally + + - Make sure you have the `.env.client` and `.env.server` files with correct dev values in the root of the project. + - Run the database with `wasp start db` and leave it running. + - Run `wasp start` and leave it running. + - [OPTIONAL]: If this is the first time starting the app, or you've just made changes to your entities/prisma schema, also run `wasp db migrate-dev`. ++ ++## Deployment ++ ++This app is deployed to fly.io, Wasp org, via `wasp deploy fly deploy`. ++ ++You can run `npm run deploy` to deploy it via `wasp deploy fly deploy` with required client side env vars correctly set. diff --git a/opensaas-sh/app_diff/deletions b/opensaas-sh/app_diff/deletions new file mode 100644 index 0000000..a9946e7 --- /dev/null +++ b/opensaas-sh/app_diff/deletions @@ -0,0 +1,22 @@ +.agents/skills/add-wasp-skills/SKILL.md +.agents/skills/getting-started/SKILL.md +.agents/skills/guided-tour/SKILL.md +.claude/skills/add-wasp-skills +.claude/skills/getting-started +.claude/skills/guided-tour +public/llms.txt +src/client/static/open-saas-banner-dark.svg +src/client/static/open-saas-banner-light.svg +src/landing-page/components/Hero.tsx +src/payment/lemonSqueezy/checkoutUtils.ts +src/payment/lemonSqueezy/env.ts +src/payment/lemonSqueezy/paymentDetails.ts +src/payment/lemonSqueezy/paymentProcessor.ts +src/payment/lemonSqueezy/webhook.ts +src/payment/lemonSqueezy/webhookPayload.ts +src/payment/polar/checkoutUtils.ts +src/payment/polar/env.ts +src/payment/polar/paymentProcessor.ts +src/payment/polar/polarClient.ts +src/payment/polar/webhook.ts +src/payment/webhook.ts diff --git a/opensaas-sh/app_diff/fly-client.toml.diff b/opensaas-sh/app_diff/fly-client.toml.diff new file mode 100644 index 0000000..a735779 --- /dev/null +++ b/opensaas-sh/app_diff/fly-client.toml.diff @@ -0,0 +1,25 @@ +--- template/app/fly-client.toml ++++ opensaas-sh/app/fly-client.toml +@@ -0,0 +1,22 @@ ++# fly.toml app configuration file generated for open-saas-wasp-sh-client on 2025-07-18T17:12:02+02:00 ++# ++# See https://fly.io/docs/reference/configuration/ for information about how to use this file. ++# ++ ++app = 'open-saas-wasp-sh-client' ++primary_region = 'ams' ++ ++[build] ++ ++[http_service] ++ internal_port = 8043 ++ force_https = true ++ auto_stop_machines = 'stop' ++ auto_start_machines = true ++ min_machines_running = 0 ++ processes = ['app'] ++ ++[[vm]] ++ memory = '1gb' ++ cpu_kind = 'shared' ++ cpus = 1 diff --git a/opensaas-sh/app_diff/fly-server.toml.diff b/opensaas-sh/app_diff/fly-server.toml.diff new file mode 100644 index 0000000..af1121c --- /dev/null +++ b/opensaas-sh/app_diff/fly-server.toml.diff @@ -0,0 +1,25 @@ +--- template/app/fly-server.toml ++++ opensaas-sh/app/fly-server.toml +@@ -0,0 +1,22 @@ ++# fly.toml app configuration file generated for open-saas-wasp-sh-server on 2025-07-18T17:11:52+02:00 ++# ++# See https://fly.io/docs/reference/configuration/ for information about how to use this file. ++# ++ ++app = 'open-saas-wasp-sh-server' ++primary_region = 'ams' ++ ++[build] ++ ++[http_service] ++ internal_port = 8080 ++ force_https = true ++ auto_stop_machines = 'stop' ++ auto_start_machines = true ++ min_machines_running = 1 ++ processes = ['app'] ++ ++[[vm]] ++ memory = '1gb' ++ cpu_kind = 'shared' ++ cpus = 1 diff --git a/opensaas-sh/app_diff/main.wasp.ts.diff b/opensaas-sh/app_diff/main.wasp.ts.diff new file mode 100644 index 0000000..3014b3d --- /dev/null +++ b/opensaas-sh/app_diff/main.wasp.ts.diff @@ -0,0 +1,40 @@ +--- template/app/main.wasp.ts ++++ opensaas-sh/app/main.wasp.ts +@@ -3,7 +3,6 @@ + import { App } from "./src/client/App" with { type: "ref" }; + import { NotFoundPage } from "./src/client/components/NotFoundPage" with { type: "ref" }; + import { serverEnvValidationSchema } from "./src/env" with { type: "ref" }; +-import { LandingPage } from "./src/landing-page/LandingPage" with { type: "ref" }; + import { seedMockUsers } from "./src/server/scripts/dbSeeds" with { type: "ref" }; + + import { adminSpec } from "./src/admin/admin.wasp"; +@@ -12,6 +11,7 @@ + import { head } from "./src/client/head.wasp"; + import { demoAiAppSpec } from "./src/demo-ai-app/demo-ai-app.wasp"; + import { fileUploadSpec } from "./src/file-upload/file-upload.wasp"; ++import { landingPage } from "./src/landing-page/landing-page.wasp"; + import { paymentSpec } from "./src/payment/payment.wasp"; + import { emailSender } from "./src/server/emailSender.wasp"; + import { userSpec } from "./src/user/user.wasp"; +@@ -19,7 +19,7 @@ + export default app({ + name: "OpenSaaS", + wasp: { version: "^0.25.0" }, +- title: "My Open SaaS App", ++ title: "Open SaaS", + head, + auth: authConfig, + db: { +@@ -37,10 +37,9 @@ + }, + emailSender, + spec: [ +- // Prerendering routes with static content creates HTML files at build time that are served immediately, +- // improving SEO, search engine/AI crawling, and performance: https://wasp.sh/docs/advanced/prerendering +- route("LandingPageRoute", "/", page(LandingPage), { prerender: true }), + route("NotFoundRoute", "*", page(NotFoundPage)), ++ ++ landingPage, + authSpec, + userSpec, + demoAiAppSpec, diff --git a/opensaas-sh/app_diff/migrations/20231213174854_init/migration.sql.diff b/opensaas-sh/app_diff/migrations/20231213174854_init/migration.sql.diff new file mode 100644 index 0000000..461896d --- /dev/null +++ b/opensaas-sh/app_diff/migrations/20231213174854_init/migration.sql.diff @@ -0,0 +1,121 @@ +--- template/app/migrations/20231213174854_init/migration.sql ++++ opensaas-sh/app/migrations/20231213174854_init/migration.sql +@@ -0,0 +1,118 @@ ++-- CreateTable ++CREATE TABLE "User" ( ++ "id" SERIAL NOT NULL, ++ "email" TEXT, ++ "username" TEXT, ++ "password" TEXT, ++ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, ++ "lastActiveTimestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, ++ "isEmailVerified" BOOLEAN NOT NULL DEFAULT false, ++ "isMockUser" BOOLEAN NOT NULL DEFAULT false, ++ "isAdmin" BOOLEAN NOT NULL DEFAULT true, ++ "emailVerificationSentAt" TIMESTAMP(3), ++ "passwordResetSentAt" TIMESTAMP(3), ++ "stripeId" TEXT, ++ "checkoutSessionId" TEXT, ++ "hasPaid" BOOLEAN NOT NULL DEFAULT false, ++ "subscriptionTier" TEXT, ++ "subscriptionStatus" TEXT, ++ "sendEmail" BOOLEAN NOT NULL DEFAULT false, ++ "datePaid" TIMESTAMP(3), ++ "credits" INTEGER NOT NULL DEFAULT 3, ++ ++ CONSTRAINT "User_pkey" PRIMARY KEY ("id") ++); ++ ++-- CreateTable ++CREATE TABLE "SocialLogin" ( ++ "id" TEXT NOT NULL, ++ "provider" TEXT NOT NULL, ++ "providerId" TEXT NOT NULL, ++ "userId" INTEGER NOT NULL, ++ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, ++ ++ CONSTRAINT "SocialLogin_pkey" PRIMARY KEY ("id") ++); ++ ++-- CreateTable ++CREATE TABLE "GptResponse" ( ++ "id" TEXT NOT NULL, ++ "content" TEXT NOT NULL, ++ "userId" INTEGER NOT NULL, ++ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, ++ "updatedAt" TIMESTAMP(3) NOT NULL, ++ ++ CONSTRAINT "GptResponse_pkey" PRIMARY KEY ("id") ++); ++ ++-- CreateTable ++CREATE TABLE "ContactFormMessage" ( ++ "id" TEXT NOT NULL, ++ "content" TEXT NOT NULL, ++ "userId" INTEGER NOT NULL, ++ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, ++ "isRead" BOOLEAN NOT NULL DEFAULT false, ++ "repliedAt" TIMESTAMP(3), ++ ++ CONSTRAINT "ContactFormMessage_pkey" PRIMARY KEY ("id") ++); ++ ++-- CreateTable ++CREATE TABLE "DailyStats" ( ++ "id" SERIAL NOT NULL, ++ "date" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, ++ "totalViews" INTEGER NOT NULL DEFAULT 0, ++ "prevDayViewsChangePercent" TEXT NOT NULL DEFAULT '0', ++ "userCount" INTEGER NOT NULL DEFAULT 0, ++ "paidUserCount" INTEGER NOT NULL DEFAULT 0, ++ "userDelta" INTEGER NOT NULL DEFAULT 0, ++ "paidUserDelta" INTEGER NOT NULL DEFAULT 0, ++ "totalRevenue" DOUBLE PRECISION NOT NULL DEFAULT 0, ++ "totalProfit" DOUBLE PRECISION NOT NULL DEFAULT 0, ++ ++ CONSTRAINT "DailyStats_pkey" PRIMARY KEY ("id") ++); ++ ++-- CreateTable ++CREATE TABLE "PageViewSource" ( ++ "date" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, ++ "name" TEXT NOT NULL, ++ "visitors" INTEGER NOT NULL, ++ "dailyStatsId" INTEGER, ++ ++ CONSTRAINT "PageViewSource_pkey" PRIMARY KEY ("date","name") ++); ++ ++-- CreateTable ++CREATE TABLE "Logs" ( ++ "id" SERIAL NOT NULL, ++ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, ++ "message" TEXT NOT NULL, ++ "level" TEXT NOT NULL, ++ ++ CONSTRAINT "Logs_pkey" PRIMARY KEY ("id") ++); ++ ++-- CreateIndex ++CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); ++ ++-- CreateIndex ++CREATE UNIQUE INDEX "User_username_key" ON "User"("username"); ++ ++-- CreateIndex ++CREATE UNIQUE INDEX "SocialLogin_provider_providerId_userId_key" ON "SocialLogin"("provider", "providerId", "userId"); ++ ++-- CreateIndex ++CREATE UNIQUE INDEX "DailyStats_date_key" ON "DailyStats"("date"); ++ ++-- AddForeignKey ++ALTER TABLE "SocialLogin" ADD CONSTRAINT "SocialLogin_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; ++ ++-- AddForeignKey ++ALTER TABLE "GptResponse" ADD CONSTRAINT "GptResponse_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; ++ ++-- AddForeignKey ++ALTER TABLE "ContactFormMessage" ADD CONSTRAINT "ContactFormMessage_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; ++ ++-- AddForeignKey ++ALTER TABLE "PageViewSource" ADD CONSTRAINT "PageViewSource_dailyStatsId_fkey" FOREIGN KEY ("dailyStatsId") REFERENCES "DailyStats"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/opensaas-sh/app_diff/migrations/20240105224550_tasks/migration.sql.diff b/opensaas-sh/app_diff/migrations/20240105224550_tasks/migration.sql.diff new file mode 100644 index 0000000..549fc7a --- /dev/null +++ b/opensaas-sh/app_diff/migrations/20240105224550_tasks/migration.sql.diff @@ -0,0 +1,17 @@ +--- template/app/migrations/20240105224550_tasks/migration.sql ++++ opensaas-sh/app/migrations/20240105224550_tasks/migration.sql +@@ -0,0 +1,14 @@ ++-- CreateTable ++CREATE TABLE "Task" ( ++ "id" TEXT NOT NULL, ++ "description" TEXT NOT NULL, ++ "time" TEXT NOT NULL DEFAULT '1', ++ "isDone" BOOLEAN NOT NULL DEFAULT false, ++ "userId" INTEGER NOT NULL, ++ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, ++ ++ CONSTRAINT "Task_pkey" PRIMARY KEY ("id") ++); ++ ++-- AddForeignKey ++ALTER TABLE "Task" ADD CONSTRAINT "Task_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/opensaas-sh/app_diff/migrations/20240207164719_files/migration.sql.diff b/opensaas-sh/app_diff/migrations/20240207164719_files/migration.sql.diff new file mode 100644 index 0000000..901de10 --- /dev/null +++ b/opensaas-sh/app_diff/migrations/20240207164719_files/migration.sql.diff @@ -0,0 +1,18 @@ +--- template/app/migrations/20240207164719_files/migration.sql ++++ opensaas-sh/app/migrations/20240207164719_files/migration.sql +@@ -0,0 +1,15 @@ ++-- CreateTable ++CREATE TABLE "File" ( ++ "id" TEXT NOT NULL, ++ "name" TEXT NOT NULL, ++ "type" TEXT NOT NULL, ++ "key" TEXT NOT NULL, ++ "uploadUrl" TEXT NOT NULL, ++ "userId" INTEGER NOT NULL, ++ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, ++ ++ CONSTRAINT "File_pkey" PRIMARY KEY ("id") ++); ++ ++-- AddForeignKey ++ALTER TABLE "File" ADD CONSTRAINT "File_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/opensaas-sh/app_diff/migrations/20240226123357_new_auth_structure/migration.sql.diff b/opensaas-sh/app_diff/migrations/20240226123357_new_auth_structure/migration.sql.diff new file mode 100644 index 0000000..50d61c3 --- /dev/null +++ b/opensaas-sh/app_diff/migrations/20240226123357_new_auth_structure/migration.sql.diff @@ -0,0 +1,47 @@ +--- template/app/migrations/20240226123357_new_auth_structure/migration.sql ++++ opensaas-sh/app/migrations/20240226123357_new_auth_structure/migration.sql +@@ -0,0 +1,44 @@ ++-- CreateTable ++CREATE TABLE "Auth" ( ++ "id" TEXT NOT NULL, ++ "userId" INTEGER, ++ ++ CONSTRAINT "Auth_pkey" PRIMARY KEY ("id") ++); ++ ++-- CreateTable ++CREATE TABLE "AuthIdentity" ( ++ "providerName" TEXT NOT NULL, ++ "providerUserId" TEXT NOT NULL, ++ "providerData" TEXT NOT NULL DEFAULT '{}', ++ "authId" TEXT NOT NULL, ++ ++ CONSTRAINT "AuthIdentity_pkey" PRIMARY KEY ("providerName","providerUserId") ++); ++ ++-- CreateTable ++CREATE TABLE "Session" ( ++ "id" TEXT NOT NULL, ++ "expiresAt" TIMESTAMP(3) NOT NULL, ++ "userId" TEXT NOT NULL, ++ ++ CONSTRAINT "Session_pkey" PRIMARY KEY ("id") ++); ++ ++-- CreateIndex ++CREATE UNIQUE INDEX "Auth_userId_key" ON "Auth"("userId"); ++ ++-- CreateIndex ++CREATE UNIQUE INDEX "Session_id_key" ON "Session"("id"); ++ ++-- CreateIndex ++CREATE INDEX "Session_userId_idx" ON "Session"("userId"); ++ ++-- AddForeignKey ++ALTER TABLE "Auth" ADD CONSTRAINT "Auth_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; ++ ++-- AddForeignKey ++ALTER TABLE "AuthIdentity" ADD CONSTRAINT "AuthIdentity_authId_fkey" FOREIGN KEY ("authId") REFERENCES "Auth"("id") ON DELETE CASCADE ON UPDATE CASCADE; ++ ++-- AddForeignKey ++ALTER TABLE "Session" ADD CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "Auth"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/opensaas-sh/app_diff/migrations/20240226130234_remove_old_auth_structure/migration.sql.diff b/opensaas-sh/app_diff/migrations/20240226130234_remove_old_auth_structure/migration.sql.diff new file mode 100644 index 0000000..e2adb66 --- /dev/null +++ b/opensaas-sh/app_diff/migrations/20240226130234_remove_old_auth_structure/migration.sql.diff @@ -0,0 +1,24 @@ +--- template/app/migrations/20240226130234_remove_old_auth_structure/migration.sql ++++ opensaas-sh/app/migrations/20240226130234_remove_old_auth_structure/migration.sql +@@ -0,0 +1,21 @@ ++/* ++ Warnings: ++ ++ - You are about to drop the column `emailVerificationSentAt` on the `User` table. All the data in the column will be lost. ++ - You are about to drop the column `isEmailVerified` on the `User` table. All the data in the column will be lost. ++ - You are about to drop the column `password` on the `User` table. All the data in the column will be lost. ++ - You are about to drop the column `passwordResetSentAt` on the `User` table. All the data in the column will be lost. ++ - You are about to drop the `SocialLogin` table. If the table is not empty, all the data it contains will be lost. ++ ++*/ ++-- DropForeignKey ++ALTER TABLE "SocialLogin" DROP CONSTRAINT "SocialLogin_userId_fkey"; ++ ++-- AlterTable ++ALTER TABLE "User" DROP COLUMN "emailVerificationSentAt", ++DROP COLUMN "isEmailVerified", ++DROP COLUMN "password", ++DROP COLUMN "passwordResetSentAt"; ++ ++-- DropTable ++DROP TABLE "SocialLogin"; diff --git a/opensaas-sh/app_diff/migrations/20240226145340_remove_unique_email_username/migration.sql.diff b/opensaas-sh/app_diff/migrations/20240226145340_remove_unique_email_username/migration.sql.diff new file mode 100644 index 0000000..2548139 --- /dev/null +++ b/opensaas-sh/app_diff/migrations/20240226145340_remove_unique_email_username/migration.sql.diff @@ -0,0 +1,8 @@ +--- template/app/migrations/20240226145340_remove_unique_email_username/migration.sql ++++ opensaas-sh/app/migrations/20240226145340_remove_unique_email_username/migration.sql +@@ -0,0 +1,5 @@ ++-- DropIndex ++DROP INDEX "User_email_key"; ++ ++-- DropIndex ++DROP INDEX "User_username_key"; diff --git a/opensaas-sh/app_diff/migrations/20240605151848_remove_has_paid/migration.sql.diff b/opensaas-sh/app_diff/migrations/20240605151848_remove_has_paid/migration.sql.diff new file mode 100644 index 0000000..dbcc2a0 --- /dev/null +++ b/opensaas-sh/app_diff/migrations/20240605151848_remove_has_paid/migration.sql.diff @@ -0,0 +1,11 @@ +--- template/app/migrations/20240605151848_remove_has_paid/migration.sql ++++ opensaas-sh/app/migrations/20240605151848_remove_has_paid/migration.sql +@@ -0,0 +1,8 @@ ++/* ++ Warnings: ++ ++ - You are about to drop the column `hasPaid` on the `User` table. All the data in the column will be lost. ++ ++*/ ++-- AlterTable ++ALTER TABLE "User" DROP COLUMN "hasPaid"; diff --git a/opensaas-sh/app_diff/migrations/20240702143707_update_user_entity/migration.sql.diff b/opensaas-sh/app_diff/migrations/20240702143707_update_user_entity/migration.sql.diff new file mode 100644 index 0000000..e260229 --- /dev/null +++ b/opensaas-sh/app_diff/migrations/20240702143707_update_user_entity/migration.sql.diff @@ -0,0 +1,68 @@ +--- template/app/migrations/20240702143707_update_user_entity/migration.sql ++++ opensaas-sh/app/migrations/20240702143707_update_user_entity/migration.sql +@@ -0,0 +1,65 @@ ++/* ++ Warnings: ++ ++ - The primary key for the `User` table will be changed. If it partially fails, the table could be left without primary key constraint. ++ - A unique constraint covering the columns `[email]` on the table `User` will be added. If there are existing duplicate values, this will fail. ++ - A unique constraint covering the columns `[username]` on the table `User` will be added. If there are existing duplicate values, this will fail. ++ ++*/ ++-- DropForeignKey ++ALTER TABLE "Auth" DROP CONSTRAINT "Auth_userId_fkey"; ++ ++-- DropForeignKey ++ALTER TABLE "ContactFormMessage" DROP CONSTRAINT "ContactFormMessage_userId_fkey"; ++ ++-- DropForeignKey ++ALTER TABLE "File" DROP CONSTRAINT "File_userId_fkey"; ++ ++-- DropForeignKey ++ALTER TABLE "GptResponse" DROP CONSTRAINT "GptResponse_userId_fkey"; ++ ++-- DropForeignKey ++ALTER TABLE "Task" DROP CONSTRAINT "Task_userId_fkey"; ++ ++-- AlterTable ++ALTER TABLE "Auth" ALTER COLUMN "userId" SET DATA TYPE TEXT; ++ ++-- AlterTable ++ALTER TABLE "ContactFormMessage" ALTER COLUMN "userId" SET DATA TYPE TEXT; ++ ++-- AlterTable ++ALTER TABLE "File" ALTER COLUMN "userId" SET DATA TYPE TEXT; ++ ++-- AlterTable ++ALTER TABLE "GptResponse" ALTER COLUMN "userId" SET DATA TYPE TEXT; ++ ++-- AlterTable ++ALTER TABLE "Task" ALTER COLUMN "userId" SET DATA TYPE TEXT; ++ ++-- AlterTable ++ALTER TABLE "User" DROP CONSTRAINT "User_pkey", ++ALTER COLUMN "id" DROP DEFAULT, ++ALTER COLUMN "id" SET DATA TYPE TEXT, ++ADD CONSTRAINT "User_pkey" PRIMARY KEY ("id"); ++DROP SEQUENCE "User_id_seq"; ++ ++-- CreateIndex ++CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); ++ ++-- CreateIndex ++CREATE UNIQUE INDEX "User_username_key" ON "User"("username"); ++ ++-- AddForeignKey ++ALTER TABLE "GptResponse" ADD CONSTRAINT "GptResponse_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; ++ ++-- AddForeignKey ++ALTER TABLE "Task" ADD CONSTRAINT "Task_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; ++ ++-- AddForeignKey ++ALTER TABLE "File" ADD CONSTRAINT "File_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; ++ ++-- AddForeignKey ++ALTER TABLE "ContactFormMessage" ADD CONSTRAINT "ContactFormMessage_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; ++ ++-- AddForeignKey ++ALTER TABLE "Auth" ADD CONSTRAINT "Auth_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/opensaas-sh/app_diff/migrations/20240715142249_version_14/migration.sql.diff b/opensaas-sh/app_diff/migrations/20240715142249_version_14/migration.sql.diff new file mode 100644 index 0000000..26cd803 --- /dev/null +++ b/opensaas-sh/app_diff/migrations/20240715142249_version_14/migration.sql.diff @@ -0,0 +1,19 @@ +--- template/app/migrations/20240715142249_version_14/migration.sql ++++ opensaas-sh/app/migrations/20240715142249_version_14/migration.sql +@@ -0,0 +1,16 @@ ++/* ++ Warnings: ++ ++ - You are about to drop the column `sendEmail` on the `User` table. All the data in the column will be lost. ++ - You are about to drop the column `subscriptionTier` on the `User` table. All the data in the column will be lost. ++ - A unique constraint covering the columns `[stripeId]` on the table `User` will be added. If there are existing duplicate values, this will fail. ++ ++*/ ++-- AlterTable ++ALTER TABLE "User" DROP COLUMN "sendEmail", ++DROP COLUMN "subscriptionTier", ++ADD COLUMN "sendNewsletter" BOOLEAN NOT NULL DEFAULT false, ++ADD COLUMN "subscriptionPlan" TEXT; ++ ++-- CreateIndex ++CREATE UNIQUE INDEX "User_stripeId_key" ON "User"("stripeId"); diff --git a/opensaas-sh/app_diff/migrations/20241126132514_remove_checkout_session_id/migration.sql.diff b/opensaas-sh/app_diff/migrations/20241126132514_remove_checkout_session_id/migration.sql.diff new file mode 100644 index 0000000..f6636a6 --- /dev/null +++ b/opensaas-sh/app_diff/migrations/20241126132514_remove_checkout_session_id/migration.sql.diff @@ -0,0 +1,11 @@ +--- template/app/migrations/20241126132514_remove_checkout_session_id/migration.sql ++++ opensaas-sh/app/migrations/20241126132514_remove_checkout_session_id/migration.sql +@@ -0,0 +1,8 @@ ++/* ++ Warnings: ++ ++ - You are about to drop the column `checkoutSessionId` on the `User` table. All the data in the column will be lost. ++ ++*/ ++-- AlterTable ++ALTER TABLE "User" DROP COLUMN IF EXISTS "checkoutSessionId"; diff --git a/opensaas-sh/app_diff/migrations/20250220095333_remove_last_active_timestamp/migration.sql.diff b/opensaas-sh/app_diff/migrations/20250220095333_remove_last_active_timestamp/migration.sql.diff new file mode 100644 index 0000000..514dd69 --- /dev/null +++ b/opensaas-sh/app_diff/migrations/20250220095333_remove_last_active_timestamp/migration.sql.diff @@ -0,0 +1,11 @@ +--- template/app/migrations/20250220095333_remove_last_active_timestamp/migration.sql ++++ opensaas-sh/app/migrations/20250220095333_remove_last_active_timestamp/migration.sql +@@ -0,0 +1,8 @@ ++/* ++ Warnings: ++ ++ - You are about to drop the column `lastActiveTimestamp` on the `User` table. All the data in the column will be lost. ++ ++*/ ++-- AlterTable ++ALTER TABLE "User" DROP COLUMN "lastActiveTimestamp"; diff --git a/opensaas-sh/app_diff/migrations/20250710084843_remove_newsletter_fields/migration.sql.diff b/opensaas-sh/app_diff/migrations/20250710084843_remove_newsletter_fields/migration.sql.diff new file mode 100644 index 0000000..2678113 --- /dev/null +++ b/opensaas-sh/app_diff/migrations/20250710084843_remove_newsletter_fields/migration.sql.diff @@ -0,0 +1,11 @@ +--- template/app/migrations/20250710084843_remove_newsletter_fields/migration.sql ++++ opensaas-sh/app/migrations/20250710084843_remove_newsletter_fields/migration.sql +@@ -0,0 +1,8 @@ ++/* ++ Warnings: ++ ++ - You are about to drop the column `sendNewsletter` on the `User` table. All the data in the column will be lost. ++ ++*/ ++-- AlterTable ++ALTER TABLE "User" DROP COLUMN "sendNewsletter"; diff --git a/opensaas-sh/app_diff/migrations/20250731133938_drop_upload_url_from_file/migration.sql.diff b/opensaas-sh/app_diff/migrations/20250731133938_drop_upload_url_from_file/migration.sql.diff new file mode 100644 index 0000000..1a2122b --- /dev/null +++ b/opensaas-sh/app_diff/migrations/20250731133938_drop_upload_url_from_file/migration.sql.diff @@ -0,0 +1,11 @@ +--- template/app/migrations/20250731133938_drop_upload_url_from_file/migration.sql ++++ opensaas-sh/app/migrations/20250731133938_drop_upload_url_from_file/migration.sql +@@ -0,0 +1,8 @@ ++/* ++ Warnings: ++ ++ - You are about to drop the column `uploadUrl` on the `File` table. All the data in the column will be lost. ++ ++*/ ++-- AlterTable ++ALTER TABLE "File" DROP COLUMN "uploadUrl"; diff --git a/opensaas-sh/app_diff/migrations/20250806121259_add_s3_key_file/migration.sql.diff b/opensaas-sh/app_diff/migrations/20250806121259_add_s3_key_file/migration.sql.diff new file mode 100644 index 0000000..b72ee9c --- /dev/null +++ b/opensaas-sh/app_diff/migrations/20250806121259_add_s3_key_file/migration.sql.diff @@ -0,0 +1,14 @@ +--- template/app/migrations/20250806121259_add_s3_key_file/migration.sql ++++ opensaas-sh/app/migrations/20250806121259_add_s3_key_file/migration.sql +@@ -0,0 +1,11 @@ ++/* ++ Warnings: ++ ++ - You are about to drop the column `key` on the `File` table. All the data in the column will be lost. ++ - Added the required column `s3Key` to the `File` table without a default value. This is not possible if the table is not empty. ++ ++*/ ++-- AlterTable ++DELETE FROM "File"; ++ALTER TABLE "File" DROP COLUMN "key", ++ADD COLUMN "s3Key" TEXT NOT NULL; diff --git a/opensaas-sh/app_diff/migrations/migration_lock.toml.diff b/opensaas-sh/app_diff/migrations/migration_lock.toml.diff new file mode 100644 index 0000000..4cf6d88 --- /dev/null +++ b/opensaas-sh/app_diff/migrations/migration_lock.toml.diff @@ -0,0 +1,7 @@ +--- template/app/migrations/migration_lock.toml ++++ opensaas-sh/app/migrations/migration_lock.toml +@@ -0,0 +1,3 @@ ++# Please do not edit this file manually ++# It should be added in your version-control system (i.e. Git) ++provider = "postgresql" +\ No newline at end of file diff --git a/opensaas-sh/app_diff/package-lock.json.diff b/opensaas-sh/app_diff/package-lock.json.diff new file mode 100644 index 0000000..a5851d2 --- /dev/null +++ b/opensaas-sh/app_diff/package-lock.json.diff @@ -0,0 +1,7696 @@ +--- template/app/package-lock.json ++++ opensaas-sh/app/package-lock.json +@@ -0,0 +1,7693 @@ ++{ ++ "name": "opensaas", ++ "lockfileVersion": 3, ++ "requires": true, ++ "packages": { ++ "": { ++ "name": "opensaas", ++ "workspaces": [ ++ ".wasp/out/*", ++ ".wasp/out/sdk/wasp" ++ ], ++ "dependencies": { ++ "@aws-sdk/client-s3": "^3.523.0", ++ "@aws-sdk/s3-presigned-post": "^3.750.0", ++ "@aws-sdk/s3-request-presigner": "^3.523.0", ++ "@google-analytics/data": "4.1.0", ++ "@hookform/resolvers": "^5.1.1", ++ "@radix-ui/react-accordion": "^1.2.11", ++ "@radix-ui/react-avatar": "^1.1.10", ++ "@radix-ui/react-checkbox": "^1.3.2", ++ "@radix-ui/react-dialog": "^1.1.14", ++ "@radix-ui/react-dropdown-menu": "^2.1.15", ++ "@radix-ui/react-label": "^2.1.7", ++ "@radix-ui/react-progress": "^1.1.7", ++ "@radix-ui/react-select": "^2.2.5", ++ "@radix-ui/react-separator": "^1.1.7", ++ "@radix-ui/react-slot": "^1.2.3", ++ "@radix-ui/react-switch": "^1.2.5", ++ "@radix-ui/react-toast": "^1.2.14", ++ "@tailwindcss/forms": "^0.5.11", ++ "@tailwindcss/typography": "^0.5.19", ++ "apexcharts": "5.10.1", ++ "class-variance-authority": "^0.7.1", ++ "clsx": "^2.1.1", ++ "ky": "^2.0.0", ++ "lucide-react": "^0.525.0", ++ "openai": "^6.27.0", ++ "prettier": "3.1.1", ++ "prettier-plugin-tailwindcss": "^0.7.2", ++ "react": "^19.2.1", ++ "react-apexcharts": "2.1.0", ++ "react-dom": "^19.2.1", ++ "react-hook-form": "^7.60.0", ++ "react-icons": "^5.5.0", ++ "react-router": "^8.0.1", ++ "stripe": "18.1.0", ++ "tailwind-merge": "^2.2.1", ++ "tailwindcss": "^4.1.18", ++ "tailwindcss-animate": "^1.0.7", ++ "vanilla-cookieconsent": "^3.0.1", ++ "zod": "^4.3.6" ++ }, ++ "devDependencies": { ++ "@faker-js/faker": "8.3.1", ++ "@tailwindcss/vite": "^4.3.1", ++ "@types/express": "^5.0.0", ++ "@types/node": "^24.0.0", ++ "@types/react": "^19.2.7", ++ "@wasp.sh/spec": "file:.wasp/spec", ++ "prisma": "5.19.1", ++ "typescript": "6.0.3", ++ "vite": "^8.1.0", ++ "vitest": "^4.1.9" ++ } ++ }, ++ ".wasp/spec": { ++ "name": "@wasp.sh/spec", ++ "version": "0.25.0", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "estree-util-scope": "^1.0.0", ++ "estree-walker": "^3.0.3", ++ "type-fest": "^5.6.0", ++ "typescript": "^6.0.3", ++ "unrun": "^0.3.0" ++ }, ++ "bin": { ++ "__internal_wasp_spec__": "dist/src/run.js" ++ }, ++ "devDependencies": { ++ "@eslint/js": "^9.9.0", ++ "@types/node": "^22.17.0", ++ "@vitest/coverage-v8": "^4.1.9", ++ "eslint": "^9.9.0", ++ "globals": "^15.9.0", ++ "nodemon": "^3.1.4", ++ "typescript-eslint": "^8.1.0", ++ "vitest": "^4.1.9" ++ } ++ }, ++ ".wasp/spec/node_modules/@types/node": { ++ "version": "22.19.19", ++ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.19.tgz", ++ "integrity": "sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "undici-types": "~6.21.0" ++ } ++ }, ++ ".wasp/spec/node_modules/undici-types": { ++ "version": "6.21.0", ++ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", ++ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/@aws-crypto/crc32": { ++ "version": "5.2.0", ++ "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", ++ "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-crypto/util": "^5.2.0", ++ "@aws-sdk/types": "^3.222.0", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=16.0.0" ++ } ++ }, ++ "node_modules/@aws-crypto/crc32c": { ++ "version": "5.2.0", ++ "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", ++ "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-crypto/util": "^5.2.0", ++ "@aws-sdk/types": "^3.222.0", ++ "tslib": "^2.6.2" ++ } ++ }, ++ "node_modules/@aws-crypto/sha1-browser": { ++ "version": "5.2.0", ++ "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", ++ "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-crypto/supports-web-crypto": "^5.2.0", ++ "@aws-crypto/util": "^5.2.0", ++ "@aws-sdk/types": "^3.222.0", ++ "@aws-sdk/util-locate-window": "^3.0.0", ++ "@smithy/util-utf8": "^2.0.0", ++ "tslib": "^2.6.2" ++ } ++ }, ++ "node_modules/@aws-crypto/sha256-browser": { ++ "version": "5.2.0", ++ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", ++ "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-crypto/sha256-js": "^5.2.0", ++ "@aws-crypto/supports-web-crypto": "^5.2.0", ++ "@aws-crypto/util": "^5.2.0", ++ "@aws-sdk/types": "^3.222.0", ++ "@aws-sdk/util-locate-window": "^3.0.0", ++ "@smithy/util-utf8": "^2.0.0", ++ "tslib": "^2.6.2" ++ } ++ }, ++ "node_modules/@aws-crypto/sha256-js": { ++ "version": "5.2.0", ++ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", ++ "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-crypto/util": "^5.2.0", ++ "@aws-sdk/types": "^3.222.0", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=16.0.0" ++ } ++ }, ++ "node_modules/@aws-crypto/supports-web-crypto": { ++ "version": "5.2.0", ++ "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", ++ "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "tslib": "^2.6.2" ++ } ++ }, ++ "node_modules/@aws-crypto/util": { ++ "version": "5.2.0", ++ "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", ++ "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-sdk/types": "^3.222.0", ++ "@smithy/util-utf8": "^2.0.0", ++ "tslib": "^2.6.2" ++ } ++ }, ++ "node_modules/@aws-sdk/client-s3": { ++ "version": "3.1048.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1048.0.tgz", ++ "integrity": "sha512-SrJn5FteqqtcDBgQIvqLKk3Qn/2vSsi5XR03I53EDDR4CbCdLysVSNgUnjVncEECMua9Pz+nxO0/lEx3TP+6mA==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-crypto/sha1-browser": "5.2.0", ++ "@aws-crypto/sha256-browser": "5.2.0", ++ "@aws-crypto/sha256-js": "5.2.0", ++ "@aws-sdk/core": "^3.974.11", ++ "@aws-sdk/credential-provider-node": "^3.972.42", ++ "@aws-sdk/middleware-bucket-endpoint": "^3.972.13", ++ "@aws-sdk/middleware-expect-continue": "^3.972.12", ++ "@aws-sdk/middleware-flexible-checksums": "^3.974.19", ++ "@aws-sdk/middleware-location-constraint": "^3.972.10", ++ "@aws-sdk/middleware-sdk-s3": "^3.972.40", ++ "@aws-sdk/middleware-ssec": "^3.972.10", ++ "@aws-sdk/signature-v4-multi-region": "^3.996.27", ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/core": "^3.24.2", ++ "@smithy/fetch-http-handler": "^5.4.2", ++ "@smithy/node-http-handler": "^4.7.2", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/core": { ++ "version": "3.974.11", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.11.tgz", ++ "integrity": "sha512-QpnINq5FZH6EOaDEkmHdT7eUunbvD27pDNQypaWjFyYz7Zl1q3UCMQErBZxpmfGfI7MvI2TlK8KTkgNpv8b1ug==", ++ "deprecated": "Deprecated due to an error deserialization bug in JSON 1.0 protocol services, see https://github.com/aws/aws-sdk-js-v3/pull/8031. Newer version available.", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-sdk/types": "^3.973.8", ++ "@aws-sdk/xml-builder": "^3.972.24", ++ "@aws/lambda-invoke-store": "^0.2.2", ++ "@smithy/core": "^3.24.2", ++ "@smithy/signature-v4": "^5.4.2", ++ "@smithy/types": "^4.14.1", ++ "bowser": "^2.11.0", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/crc64-nvme": { ++ "version": "3.972.8", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.8.tgz", ++ "integrity": "sha512-fVfUCL/Xh2zINYMPZvj+iBn6XWouQf0DAnjaWCI9MkmqXzL2Iy5FoQB8O7syFe6gN6AH1ecDDU58T51Ou0kFkA==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/credential-provider-env": { ++ "version": "3.972.37", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.37.tgz", ++ "integrity": "sha512-/jpPvEh6f7ntmIzf7dNxoNX6Q8vt8UpesCjbW6mFfk4V1NW6bIy9qxcQ6WbA8As5yQhsZOe+xeNd4xHX8kdY2Q==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-sdk/core": "^3.974.11", ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/core": "^3.24.2", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/credential-provider-http": { ++ "version": "3.972.39", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.39.tgz", ++ "integrity": "sha512-pIgTpisWyWg7X1bUbzSjuUYosYTD0Ghz2M0hkSTmb3a6i3qV3uU+NYJPI/E2XSC0HcsZh5rsLPzeXrkb2DS0Cg==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-sdk/core": "^3.974.11", ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/core": "^3.24.2", ++ "@smithy/fetch-http-handler": "^5.4.2", ++ "@smithy/node-http-handler": "^4.7.2", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/credential-provider-ini": { ++ "version": "3.972.41", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.41.tgz", ++ "integrity": "sha512-u2tyjaxJJzW8UtW4SM1ZcPMDwO6y+kV+llvou+Adts0FAKyzes5jG4izQN+KX3yE8ZROpS5y1LJ//xL2iSf76w==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-sdk/core": "^3.974.11", ++ "@aws-sdk/credential-provider-env": "^3.972.37", ++ "@aws-sdk/credential-provider-http": "^3.972.39", ++ "@aws-sdk/credential-provider-login": "^3.972.41", ++ "@aws-sdk/credential-provider-process": "^3.972.37", ++ "@aws-sdk/credential-provider-sso": "^3.972.41", ++ "@aws-sdk/credential-provider-web-identity": "^3.972.41", ++ "@aws-sdk/nested-clients": "^3.997.9", ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/core": "^3.24.2", ++ "@smithy/credential-provider-imds": "^4.3.2", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/credential-provider-login": { ++ "version": "3.972.41", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.41.tgz", ++ "integrity": "sha512-0LBitxXiAiaE5nlFPfpNIww/8FRY/I7WIndWsc9GmNFOM7cE1wNpVNQEGEk9Outg5l8xl+3vybxFyUy4l9q/LQ==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-sdk/core": "^3.974.11", ++ "@aws-sdk/nested-clients": "^3.997.9", ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/core": "^3.24.2", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/credential-provider-node": { ++ "version": "3.972.42", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.42.tgz", ++ "integrity": "sha512-D4oon2zbqqsWOJUM99Gm3/ZyJ0IJvTXVN3PyloGb3kQEyI36fjCZheZj422lAgTWWd6TSHgiImLt3RIaLdv3dQ==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-sdk/credential-provider-env": "^3.972.37", ++ "@aws-sdk/credential-provider-http": "^3.972.39", ++ "@aws-sdk/credential-provider-ini": "^3.972.41", ++ "@aws-sdk/credential-provider-process": "^3.972.37", ++ "@aws-sdk/credential-provider-sso": "^3.972.41", ++ "@aws-sdk/credential-provider-web-identity": "^3.972.41", ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/core": "^3.24.2", ++ "@smithy/credential-provider-imds": "^4.3.2", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/credential-provider-process": { ++ "version": "3.972.37", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.37.tgz", ++ "integrity": "sha512-7nVaHBUaWIddASYfVaA9O4D5ZVjewU3sCol9WqZPGfW0nR+0WqE0xHZnD/U2L33PlOB8KNXGKZ6wOES/QijKzg==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-sdk/core": "^3.974.11", ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/core": "^3.24.2", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/credential-provider-sso": { ++ "version": "3.972.41", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.41.tgz", ++ "integrity": "sha512-IOWAWEHe5LkjSKkkUUX9ciV6Y1scHTsnfEkdt5yyC4Slrc7AGbkLPrpntjqh18ksJAMOaVhoBsO8p2WyTcY2wQ==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-sdk/core": "^3.974.11", ++ "@aws-sdk/nested-clients": "^3.997.9", ++ "@aws-sdk/token-providers": "3.1048.0", ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/core": "^3.24.2", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/credential-provider-web-identity": { ++ "version": "3.972.41", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.41.tgz", ++ "integrity": "sha512-mbACk9Yypa8nm4iGZLs0PofOXEcTDOUw6wDnsPXNDNSd2WNXs1tSo+6nc/fh0jLYdfVZThhBL98PHW4aXFsG5A==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-sdk/core": "^3.974.11", ++ "@aws-sdk/nested-clients": "^3.997.9", ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/core": "^3.24.2", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/middleware-bucket-endpoint": { ++ "version": "3.972.13", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.13.tgz", ++ "integrity": "sha512-JDaukix+kt5KwF7FzNSkfZHpqiPJajVkKJLJexF6z5B44+CN70BXGiQaCEAiCtKtRZNvC16eF3SY9L0bDJPlbA==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-sdk/core": "^3.974.11", ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/core": "^3.24.2", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/middleware-expect-continue": { ++ "version": "3.972.12", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.12.tgz", ++ "integrity": "sha512-dA5pKTom/Ls9mgeyeaRBNQrRIVOLVjv4AmKOB0/e4yaiXEUy0gSz2d3liP8JHtYoCAEWySU1jWnyzwLOREN+4g==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/core": "^3.24.2", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/middleware-flexible-checksums": { ++ "version": "3.974.19", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.19.tgz", ++ "integrity": "sha512-GLciZVIvWM3C+ffuqnUqlAZwRjQdLt+KXiqr9+aRwZyKVyF2J5lrJAzzSqwweNl9hUWBN00BhilWXdMI5DjNcw==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-crypto/crc32": "5.2.0", ++ "@aws-crypto/crc32c": "5.2.0", ++ "@aws-crypto/util": "5.2.0", ++ "@aws-sdk/core": "^3.974.11", ++ "@aws-sdk/crc64-nvme": "^3.972.8", ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/core": "^3.24.2", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/middleware-location-constraint": { ++ "version": "3.972.10", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.10.tgz", ++ "integrity": "sha512-rI3NZvJcEvjoD0+0PI0iUAwlPw2IlSlhyvgBK/3WkKJQE/YiKFedd9dMN2lVacdNxPNhxL/jzQaKQdrGtQagjQ==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/middleware-sdk-s3": { ++ "version": "3.972.40", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.40.tgz", ++ "integrity": "sha512-vyFY4EsAGySqqd87Z7n4qcCYXJO3QArB8VIJzuupY5XuLHIp579HTZldIUGGABvAOzLptfPb9+lJBJcB+3/cvA==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-sdk/core": "^3.974.11", ++ "@aws-sdk/signature-v4-multi-region": "^3.996.27", ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/core": "^3.24.2", ++ "@smithy/signature-v4": "^5.4.2", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/middleware-ssec": { ++ "version": "3.972.10", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.10.tgz", ++ "integrity": "sha512-Gli9A0u8EVVb+5bFDGS/QbSVg28w/wpEidg1ggVcSj65BDTdGR6punsOcVjqdiu1i42WHWo51MCvARPIIz9juw==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/nested-clients": { ++ "version": "3.997.9", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.9.tgz", ++ "integrity": "sha512-jPR3rnmRI4hWYyzfmTGBr7NblMp8QYYeflHXba1H6+7CGrWVqWKQzaXFQ4qbExqPRsXN3T3L3JxFhr6aouXUGQ==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-crypto/sha256-browser": "5.2.0", ++ "@aws-crypto/sha256-js": "5.2.0", ++ "@aws-sdk/core": "^3.974.11", ++ "@aws-sdk/signature-v4-multi-region": "^3.996.27", ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/core": "^3.24.2", ++ "@smithy/fetch-http-handler": "^5.4.2", ++ "@smithy/node-http-handler": "^4.7.2", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/s3-presigned-post": { ++ "version": "3.1048.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/s3-presigned-post/-/s3-presigned-post-3.1048.0.tgz", ++ "integrity": "sha512-VA9uWoqWj1rgq+4HlMDJYStAIXLJYGaLDk/Au6J5BaL2RofEvbTVEZqmpx7xvUxNMiAA4HGyduKSdc4Kbkhajw==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-sdk/client-s3": "3.1048.0", ++ "@aws-sdk/core": "^3.974.11", ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/core": "^3.24.2", ++ "@smithy/signature-v4": "^5.4.2", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/s3-request-presigner": { ++ "version": "3.1048.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.1048.0.tgz", ++ "integrity": "sha512-7/yZh562OhKvwBFS/nVL+7qMecUGO91XfaPfqisWiswtlgoQ4gt4zHn9MuUwoPcIYgdkOO0RucOzcD13u7uJEg==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-sdk/core": "^3.974.11", ++ "@aws-sdk/signature-v4-multi-region": "^3.996.27", ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/core": "^3.24.2", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/signature-v4-multi-region": { ++ "version": "3.996.27", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.27.tgz", ++ "integrity": "sha512-0Phbz4t6HI3D3skxvG2uI+VWU034/nSIw1T8d+FPzzQG9EQTrw94o9mOKO2Gv3n3Oc8P7JD7RAUxkoneLWv5Eg==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/core": "^3.24.2", ++ "@smithy/signature-v4": "^5.4.2", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/token-providers": { ++ "version": "3.1048.0", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1048.0.tgz", ++ "integrity": "sha512-k0y/GcuesuSfWyUM0WamrGyeZmltRYaPbHO82UDA6mZ/doB+FOHKutikPAtSXMn/hDz970cF+iRuuiYO9VEbAA==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-sdk/core": "^3.974.11", ++ "@aws-sdk/nested-clients": "^3.997.9", ++ "@aws-sdk/types": "^3.973.8", ++ "@smithy/core": "^3.24.2", ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/types": { ++ "version": "3.973.8", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", ++ "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@smithy/types": "^4.14.1", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/util-locate-window": { ++ "version": "3.965.5", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz", ++ "integrity": "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws-sdk/xml-builder": { ++ "version": "3.972.24", ++ "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.24.tgz", ++ "integrity": "sha512-V8z5YcDPfsvzrBlj0xR1vhRtocblhYbqdreCJB/voGd4Sr5zjNAeWxexbnqVtskTJe0vFb5KMqbSL++ePl+zRw==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@nodable/entities": "2.1.0", ++ "@smithy/types": "^4.14.1", ++ "fast-xml-parser": "5.7.3", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=20.0.0" ++ } ++ }, ++ "node_modules/@aws/lambda-invoke-store": { ++ "version": "0.2.4", ++ "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", ++ "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", ++ "license": "Apache-2.0", ++ "engines": { ++ "node": ">=18.0.0" ++ } ++ }, ++ "node_modules/@babel/helper-string-parser": { ++ "version": "7.29.7", ++ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", ++ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=6.9.0" ++ } ++ }, ++ "node_modules/@babel/helper-validator-identifier": { ++ "version": "7.29.7", ++ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", ++ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=6.9.0" ++ } ++ }, ++ "node_modules/@babel/parser": { ++ "version": "7.29.7", ++ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", ++ "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@babel/types": "^7.29.7" ++ }, ++ "bin": { ++ "parser": "bin/babel-parser.js" ++ }, ++ "engines": { ++ "node": ">=6.0.0" ++ } ++ }, ++ "node_modules/@babel/types": { ++ "version": "7.29.7", ++ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", ++ "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@babel/helper-string-parser": "^7.29.7", ++ "@babel/helper-validator-identifier": "^7.29.7" ++ }, ++ "engines": { ++ "node": ">=6.9.0" ++ } ++ }, ++ "node_modules/@bcoe/v8-coverage": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", ++ "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=18" ++ } ++ }, ++ "node_modules/@emnapi/core": { ++ "version": "1.11.1", ++ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", ++ "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "dependencies": { ++ "@emnapi/wasi-threads": "1.2.2", ++ "tslib": "^2.4.0" ++ } ++ }, ++ "node_modules/@emnapi/runtime": { ++ "version": "1.11.1", ++ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", ++ "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "dependencies": { ++ "tslib": "^2.4.0" ++ } ++ }, ++ "node_modules/@emnapi/wasi-threads": { ++ "version": "1.2.2", ++ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", ++ "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "dependencies": { ++ "tslib": "^2.4.0" ++ } ++ }, ++ "node_modules/@eslint-community/eslint-utils": { ++ "version": "4.9.1", ++ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", ++ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "eslint-visitor-keys": "^3.4.3" ++ }, ++ "engines": { ++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/eslint" ++ }, ++ "peerDependencies": { ++ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" ++ } ++ }, ++ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { ++ "version": "3.4.3", ++ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", ++ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", ++ "dev": true, ++ "license": "Apache-2.0", ++ "engines": { ++ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/eslint" ++ } ++ }, ++ "node_modules/@eslint-community/regexpp": { ++ "version": "4.12.2", ++ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", ++ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" ++ } ++ }, ++ "node_modules/@eslint/config-array": { ++ "version": "0.21.2", ++ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", ++ "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", ++ "dev": true, ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@eslint/object-schema": "^2.1.7", ++ "debug": "^4.3.1", ++ "minimatch": "^3.1.5" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ } ++ }, ++ "node_modules/@eslint/config-helpers": { ++ "version": "0.4.2", ++ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", ++ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", ++ "dev": true, ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@eslint/core": "^0.17.0" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ } ++ }, ++ "node_modules/@eslint/core": { ++ "version": "0.17.0", ++ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", ++ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", ++ "dev": true, ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@types/json-schema": "^7.0.15" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ } ++ }, ++ "node_modules/@eslint/eslintrc": { ++ "version": "3.3.5", ++ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", ++ "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "ajv": "^6.14.0", ++ "debug": "^4.3.2", ++ "espree": "^10.0.1", ++ "globals": "^14.0.0", ++ "ignore": "^5.2.0", ++ "import-fresh": "^3.2.1", ++ "js-yaml": "^4.1.1", ++ "minimatch": "^3.1.5", ++ "strip-json-comments": "^3.1.1" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/eslint" ++ } ++ }, ++ "node_modules/@eslint/eslintrc/node_modules/globals": { ++ "version": "14.0.0", ++ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", ++ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=18" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/@eslint/js": { ++ "version": "9.39.4", ++ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", ++ "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "url": "https://eslint.org/donate" ++ } ++ }, ++ "node_modules/@eslint/object-schema": { ++ "version": "2.1.7", ++ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", ++ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", ++ "dev": true, ++ "license": "Apache-2.0", ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ } ++ }, ++ "node_modules/@eslint/plugin-kit": { ++ "version": "0.4.1", ++ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", ++ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", ++ "dev": true, ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@eslint/core": "^0.17.0", ++ "levn": "^0.4.1" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ } ++ }, ++ "node_modules/@faker-js/faker": { ++ "version": "8.3.1", ++ "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.3.1.tgz", ++ "integrity": "sha512-FdgpFxY6V6rLZE9mmIBb9hM0xpfvQOSNOLnzolzKwsE1DH+gC7lEKV1p1IbR0lAYyvYd5a4u3qWJzowUkw1bIw==", ++ "deprecated": "Please update to a newer version", ++ "dev": true, ++ "funding": [ ++ { ++ "type": "opencollective", ++ "url": "https://opencollective.com/fakerjs" ++ } ++ ], ++ "license": "MIT", ++ "engines": { ++ "node": "^14.17.0 || ^16.13.0 || >=18.0.0", ++ "npm": ">=6.14.13" ++ } ++ }, ++ "node_modules/@floating-ui/core": { ++ "version": "1.7.5", ++ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", ++ "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", ++ "license": "MIT", ++ "dependencies": { ++ "@floating-ui/utils": "^0.2.11" ++ } ++ }, ++ "node_modules/@floating-ui/dom": { ++ "version": "1.7.6", ++ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", ++ "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", ++ "license": "MIT", ++ "dependencies": { ++ "@floating-ui/core": "^1.7.5", ++ "@floating-ui/utils": "^0.2.11" ++ } ++ }, ++ "node_modules/@floating-ui/react-dom": { ++ "version": "2.1.8", ++ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", ++ "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", ++ "license": "MIT", ++ "dependencies": { ++ "@floating-ui/dom": "^1.7.6" ++ }, ++ "peerDependencies": { ++ "react": ">=16.8.0", ++ "react-dom": ">=16.8.0" ++ } ++ }, ++ "node_modules/@floating-ui/utils": { ++ "version": "0.2.11", ++ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", ++ "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", ++ "license": "MIT" ++ }, ++ "node_modules/@google-analytics/data": { ++ "version": "4.1.0", ++ "resolved": "https://registry.npmjs.org/@google-analytics/data/-/data-4.1.0.tgz", ++ "integrity": "sha512-OMHSfqKi1a7OSjpc1n3MSynuPnfLrzYa8euEp2mrRH2XRzjFnHoQ0smiLOy3GSwGVbzT0ps8juNcT72I2nZjjQ==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "google-gax": "^4.0.3" ++ }, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/@grpc/grpc-js": { ++ "version": "1.14.3", ++ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", ++ "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@grpc/proto-loader": "^0.8.0", ++ "@js-sdsl/ordered-map": "^4.4.2" ++ }, ++ "engines": { ++ "node": ">=12.10.0" ++ } ++ }, ++ "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { ++ "version": "0.8.1", ++ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.1.tgz", ++ "integrity": "sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "lodash.camelcase": "^4.3.0", ++ "long": "^5.0.0", ++ "protobufjs": "^7.5.5", ++ "yargs": "^17.7.2" ++ }, ++ "bin": { ++ "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" ++ }, ++ "engines": { ++ "node": ">=6" ++ } ++ }, ++ "node_modules/@grpc/proto-loader": { ++ "version": "0.7.15", ++ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", ++ "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "lodash.camelcase": "^4.3.0", ++ "long": "^5.0.0", ++ "protobufjs": "^7.2.5", ++ "yargs": "^17.7.2" ++ }, ++ "bin": { ++ "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" ++ }, ++ "engines": { ++ "node": ">=6" ++ } ++ }, ++ "node_modules/@hookform/resolvers": { ++ "version": "5.2.2", ++ "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.2.2.tgz", ++ "integrity": "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==", ++ "license": "MIT", ++ "dependencies": { ++ "@standard-schema/utils": "^0.3.0" ++ }, ++ "peerDependencies": { ++ "react-hook-form": "^7.55.0" ++ } ++ }, ++ "node_modules/@humanfs/core": { ++ "version": "0.19.2", ++ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", ++ "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", ++ "dev": true, ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@humanfs/types": "^0.15.0" ++ }, ++ "engines": { ++ "node": ">=18.18.0" ++ } ++ }, ++ "node_modules/@humanfs/node": { ++ "version": "0.16.8", ++ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", ++ "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", ++ "dev": true, ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@humanfs/core": "^0.19.2", ++ "@humanfs/types": "^0.15.0", ++ "@humanwhocodes/retry": "^0.4.0" ++ }, ++ "engines": { ++ "node": ">=18.18.0" ++ } ++ }, ++ "node_modules/@humanfs/types": { ++ "version": "0.15.0", ++ "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", ++ "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", ++ "dev": true, ++ "license": "Apache-2.0", ++ "engines": { ++ "node": ">=18.18.0" ++ } ++ }, ++ "node_modules/@humanwhocodes/module-importer": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", ++ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", ++ "dev": true, ++ "license": "Apache-2.0", ++ "engines": { ++ "node": ">=12.22" ++ }, ++ "funding": { ++ "type": "github", ++ "url": "https://github.com/sponsors/nzakas" ++ } ++ }, ++ "node_modules/@humanwhocodes/retry": { ++ "version": "0.4.3", ++ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", ++ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", ++ "dev": true, ++ "license": "Apache-2.0", ++ "engines": { ++ "node": ">=18.18" ++ }, ++ "funding": { ++ "type": "github", ++ "url": "https://github.com/sponsors/nzakas" ++ } ++ }, ++ "node_modules/@jridgewell/gen-mapping": { ++ "version": "0.3.13", ++ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", ++ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@jridgewell/sourcemap-codec": "^1.5.0", ++ "@jridgewell/trace-mapping": "^0.3.24" ++ } ++ }, ++ "node_modules/@jridgewell/remapping": { ++ "version": "2.3.5", ++ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", ++ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@jridgewell/gen-mapping": "^0.3.5", ++ "@jridgewell/trace-mapping": "^0.3.24" ++ } ++ }, ++ "node_modules/@jridgewell/resolve-uri": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", ++ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=6.0.0" ++ } ++ }, ++ "node_modules/@jridgewell/sourcemap-codec": { ++ "version": "1.5.5", ++ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", ++ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/@jridgewell/trace-mapping": { ++ "version": "0.3.31", ++ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", ++ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@jridgewell/resolve-uri": "^3.1.0", ++ "@jridgewell/sourcemap-codec": "^1.4.14" ++ } ++ }, ++ "node_modules/@js-sdsl/ordered-map": { ++ "version": "4.4.2", ++ "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", ++ "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", ++ "license": "MIT", ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/js-sdsl" ++ } ++ }, ++ "node_modules/@napi-rs/wasm-runtime": { ++ "version": "1.1.6", ++ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", ++ "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "dependencies": { ++ "@tybys/wasm-util": "^0.10.3" ++ }, ++ "funding": { ++ "type": "github", ++ "url": "https://github.com/sponsors/Brooooooklyn" ++ }, ++ "peerDependencies": { ++ "@emnapi/core": "^1.7.1", ++ "@emnapi/runtime": "^1.7.1" ++ } ++ }, ++ "node_modules/@nodable/entities": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.0.tgz", ++ "integrity": "sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==", ++ "funding": [ ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/nodable" ++ } ++ ], ++ "license": "MIT" ++ }, ++ "node_modules/@oxc-project/types": { ++ "version": "0.138.0", ++ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.138.0.tgz", ++ "integrity": "sha512-1a7ZKmrRTCoN1XMZ4L0PyyqrMnrNlLyPuOkdSX2MZg7IiIGRUyurNhAm73ptDOraoBcIordsIGKNPKUzy3ZmfA==", ++ "dev": true, ++ "license": "MIT", ++ "funding": { ++ "url": "https://github.com/sponsors/Boshen" ++ } ++ }, ++ "node_modules/@prisma/debug": { ++ "version": "5.19.1", ++ "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.19.1.tgz", ++ "integrity": "sha512-lAG6A6QnG2AskAukIEucYJZxxcSqKsMK74ZFVfCTOM/7UiyJQi48v6TQ47d6qKG3LbMslqOvnTX25dj/qvclGg==", ++ "dev": true, ++ "license": "Apache-2.0" ++ }, ++ "node_modules/@prisma/engines": { ++ "version": "5.19.1", ++ "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.19.1.tgz", ++ "integrity": "sha512-kR/PoxZDrfUmbbXqqb8SlBBgCjvGaJYMCOe189PEYzq9rKqitQ2fvT/VJ8PDSe8tTNxhc2KzsCfCAL+Iwm/7Cg==", ++ "dev": true, ++ "hasInstallScript": true, ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@prisma/debug": "5.19.1", ++ "@prisma/engines-version": "5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3", ++ "@prisma/fetch-engine": "5.19.1", ++ "@prisma/get-platform": "5.19.1" ++ } ++ }, ++ "node_modules/@prisma/engines-version": { ++ "version": "5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3", ++ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3.tgz", ++ "integrity": "sha512-xR6rt+z5LnNqTP5BBc+8+ySgf4WNMimOKXRn6xfNRDSpHvbOEmd7+qAOmzCrddEc4Cp8nFC0txU14dstjH7FXA==", ++ "dev": true, ++ "license": "Apache-2.0" ++ }, ++ "node_modules/@prisma/fetch-engine": { ++ "version": "5.19.1", ++ "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.19.1.tgz", ++ "integrity": "sha512-pCq74rtlOVJfn4pLmdJj+eI4P7w2dugOnnTXpRilP/6n5b2aZiA4ulJlE0ddCbTPkfHmOL9BfaRgA8o+1rfdHw==", ++ "dev": true, ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@prisma/debug": "5.19.1", ++ "@prisma/engines-version": "5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3", ++ "@prisma/get-platform": "5.19.1" ++ } ++ }, ++ "node_modules/@prisma/get-platform": { ++ "version": "5.19.1", ++ "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.19.1.tgz", ++ "integrity": "sha512-sCeoJ+7yt0UjnR+AXZL7vXlg5eNxaFOwC23h0KvW1YIXUoa7+W2ZcAUhoEQBmJTW4GrFqCuZ8YSP0mkDa4k3Zg==", ++ "dev": true, ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@prisma/debug": "5.19.1" ++ } ++ }, ++ "node_modules/@protobufjs/aspromise": { ++ "version": "1.1.2", ++ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", ++ "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", ++ "license": "BSD-3-Clause" ++ }, ++ "node_modules/@protobufjs/base64": { ++ "version": "1.1.2", ++ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", ++ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", ++ "license": "BSD-3-Clause" ++ }, ++ "node_modules/@protobufjs/codegen": { ++ "version": "2.0.5", ++ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", ++ "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", ++ "license": "BSD-3-Clause" ++ }, ++ "node_modules/@protobufjs/eventemitter": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", ++ "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", ++ "license": "BSD-3-Clause" ++ }, ++ "node_modules/@protobufjs/fetch": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", ++ "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", ++ "license": "BSD-3-Clause", ++ "dependencies": { ++ "@protobufjs/aspromise": "^1.1.1" ++ } ++ }, ++ "node_modules/@protobufjs/float": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", ++ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", ++ "license": "BSD-3-Clause" ++ }, ++ "node_modules/@protobufjs/inquire": { ++ "version": "1.1.2", ++ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.2.tgz", ++ "integrity": "sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==", ++ "license": "BSD-3-Clause" ++ }, ++ "node_modules/@protobufjs/path": { ++ "version": "1.1.2", ++ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", ++ "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", ++ "license": "BSD-3-Clause" ++ }, ++ "node_modules/@protobufjs/pool": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", ++ "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", ++ "license": "BSD-3-Clause" ++ }, ++ "node_modules/@protobufjs/utf8": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", ++ "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", ++ "license": "BSD-3-Clause" ++ }, ++ "node_modules/@radix-ui/number": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", ++ "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", ++ "license": "MIT" ++ }, ++ "node_modules/@radix-ui/primitive": { ++ "version": "1.1.3", ++ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", ++ "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", ++ "license": "MIT" ++ }, ++ "node_modules/@radix-ui/react-accordion": { ++ "version": "1.2.12", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", ++ "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/primitive": "1.1.3", ++ "@radix-ui/react-collapsible": "1.1.12", ++ "@radix-ui/react-collection": "1.1.7", ++ "@radix-ui/react-compose-refs": "1.1.2", ++ "@radix-ui/react-context": "1.1.2", ++ "@radix-ui/react-direction": "1.1.1", ++ "@radix-ui/react-id": "1.1.1", ++ "@radix-ui/react-primitive": "2.1.3", ++ "@radix-ui/react-use-controllable-state": "1.2.2" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-arrow": { ++ "version": "1.1.7", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", ++ "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-primitive": "2.1.3" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-avatar": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.11.tgz", ++ "integrity": "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-context": "1.1.3", ++ "@radix-ui/react-primitive": "2.1.4", ++ "@radix-ui/react-use-callback-ref": "1.1.1", ++ "@radix-ui/react-use-is-hydrated": "0.1.0", ++ "@radix-ui/react-use-layout-effect": "1.1.1" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context": { ++ "version": "1.1.3", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", ++ "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", ++ "license": "MIT", ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive": { ++ "version": "2.1.4", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", ++ "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-slot": "1.2.4" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-checkbox": { ++ "version": "1.3.3", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", ++ "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/primitive": "1.1.3", ++ "@radix-ui/react-compose-refs": "1.1.2", ++ "@radix-ui/react-context": "1.1.2", ++ "@radix-ui/react-presence": "1.1.5", ++ "@radix-ui/react-primitive": "2.1.3", ++ "@radix-ui/react-use-controllable-state": "1.2.2", ++ "@radix-ui/react-use-previous": "1.1.1", ++ "@radix-ui/react-use-size": "1.1.1" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-collapsible": { ++ "version": "1.1.12", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", ++ "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/primitive": "1.1.3", ++ "@radix-ui/react-compose-refs": "1.1.2", ++ "@radix-ui/react-context": "1.1.2", ++ "@radix-ui/react-id": "1.1.1", ++ "@radix-ui/react-presence": "1.1.5", ++ "@radix-ui/react-primitive": "2.1.3", ++ "@radix-ui/react-use-controllable-state": "1.2.2", ++ "@radix-ui/react-use-layout-effect": "1.1.1" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-collection": { ++ "version": "1.1.7", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", ++ "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-compose-refs": "1.1.2", ++ "@radix-ui/react-context": "1.1.2", ++ "@radix-ui/react-primitive": "2.1.3", ++ "@radix-ui/react-slot": "1.2.3" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { ++ "version": "1.2.3", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", ++ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-compose-refs": "1.1.2" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-compose-refs": { ++ "version": "1.1.2", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", ++ "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", ++ "license": "MIT", ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-context": { ++ "version": "1.1.2", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", ++ "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", ++ "license": "MIT", ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-dialog": { ++ "version": "1.1.15", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", ++ "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/primitive": "1.1.3", ++ "@radix-ui/react-compose-refs": "1.1.2", ++ "@radix-ui/react-context": "1.1.2", ++ "@radix-ui/react-dismissable-layer": "1.1.11", ++ "@radix-ui/react-focus-guards": "1.1.3", ++ "@radix-ui/react-focus-scope": "1.1.7", ++ "@radix-ui/react-id": "1.1.1", ++ "@radix-ui/react-portal": "1.1.9", ++ "@radix-ui/react-presence": "1.1.5", ++ "@radix-ui/react-primitive": "2.1.3", ++ "@radix-ui/react-slot": "1.2.3", ++ "@radix-ui/react-use-controllable-state": "1.2.2", ++ "aria-hidden": "^1.2.4", ++ "react-remove-scroll": "^2.6.3" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { ++ "version": "1.2.3", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", ++ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-compose-refs": "1.1.2" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-direction": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", ++ "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", ++ "license": "MIT", ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-dismissable-layer": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", ++ "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/primitive": "1.1.3", ++ "@radix-ui/react-compose-refs": "1.1.2", ++ "@radix-ui/react-primitive": "2.1.3", ++ "@radix-ui/react-use-callback-ref": "1.1.1", ++ "@radix-ui/react-use-escape-keydown": "1.1.1" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-dropdown-menu": { ++ "version": "2.1.16", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", ++ "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/primitive": "1.1.3", ++ "@radix-ui/react-compose-refs": "1.1.2", ++ "@radix-ui/react-context": "1.1.2", ++ "@radix-ui/react-id": "1.1.1", ++ "@radix-ui/react-menu": "2.1.16", ++ "@radix-ui/react-primitive": "2.1.3", ++ "@radix-ui/react-use-controllable-state": "1.2.2" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-focus-guards": { ++ "version": "1.1.3", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", ++ "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", ++ "license": "MIT", ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-focus-scope": { ++ "version": "1.1.7", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", ++ "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-compose-refs": "1.1.2", ++ "@radix-ui/react-primitive": "2.1.3", ++ "@radix-ui/react-use-callback-ref": "1.1.1" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-id": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", ++ "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-use-layout-effect": "1.1.1" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-label": { ++ "version": "2.1.8", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.8.tgz", ++ "integrity": "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-primitive": "2.1.4" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive": { ++ "version": "2.1.4", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", ++ "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-slot": "1.2.4" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-menu": { ++ "version": "2.1.16", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", ++ "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/primitive": "1.1.3", ++ "@radix-ui/react-collection": "1.1.7", ++ "@radix-ui/react-compose-refs": "1.1.2", ++ "@radix-ui/react-context": "1.1.2", ++ "@radix-ui/react-direction": "1.1.1", ++ "@radix-ui/react-dismissable-layer": "1.1.11", ++ "@radix-ui/react-focus-guards": "1.1.3", ++ "@radix-ui/react-focus-scope": "1.1.7", ++ "@radix-ui/react-id": "1.1.1", ++ "@radix-ui/react-popper": "1.2.8", ++ "@radix-ui/react-portal": "1.1.9", ++ "@radix-ui/react-presence": "1.1.5", ++ "@radix-ui/react-primitive": "2.1.3", ++ "@radix-ui/react-roving-focus": "1.1.11", ++ "@radix-ui/react-slot": "1.2.3", ++ "@radix-ui/react-use-callback-ref": "1.1.1", ++ "aria-hidden": "^1.2.4", ++ "react-remove-scroll": "^2.6.3" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": { ++ "version": "1.2.3", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", ++ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-compose-refs": "1.1.2" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-popper": { ++ "version": "1.2.8", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", ++ "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", ++ "license": "MIT", ++ "dependencies": { ++ "@floating-ui/react-dom": "^2.0.0", ++ "@radix-ui/react-arrow": "1.1.7", ++ "@radix-ui/react-compose-refs": "1.1.2", ++ "@radix-ui/react-context": "1.1.2", ++ "@radix-ui/react-primitive": "2.1.3", ++ "@radix-ui/react-use-callback-ref": "1.1.1", ++ "@radix-ui/react-use-layout-effect": "1.1.1", ++ "@radix-ui/react-use-rect": "1.1.1", ++ "@radix-ui/react-use-size": "1.1.1", ++ "@radix-ui/rect": "1.1.1" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-portal": { ++ "version": "1.1.9", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", ++ "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-primitive": "2.1.3", ++ "@radix-ui/react-use-layout-effect": "1.1.1" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-presence": { ++ "version": "1.1.5", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", ++ "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-compose-refs": "1.1.2", ++ "@radix-ui/react-use-layout-effect": "1.1.1" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-primitive": { ++ "version": "2.1.3", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", ++ "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-slot": "1.2.3" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { ++ "version": "1.2.3", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", ++ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-compose-refs": "1.1.2" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-progress": { ++ "version": "1.1.8", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.8.tgz", ++ "integrity": "sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-context": "1.1.3", ++ "@radix-ui/react-primitive": "2.1.4" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-context": { ++ "version": "1.1.3", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", ++ "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", ++ "license": "MIT", ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-primitive": { ++ "version": "2.1.4", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", ++ "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-slot": "1.2.4" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-roving-focus": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", ++ "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/primitive": "1.1.3", ++ "@radix-ui/react-collection": "1.1.7", ++ "@radix-ui/react-compose-refs": "1.1.2", ++ "@radix-ui/react-context": "1.1.2", ++ "@radix-ui/react-direction": "1.1.1", ++ "@radix-ui/react-id": "1.1.1", ++ "@radix-ui/react-primitive": "2.1.3", ++ "@radix-ui/react-use-callback-ref": "1.1.1", ++ "@radix-ui/react-use-controllable-state": "1.2.2" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-select": { ++ "version": "2.2.6", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", ++ "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/number": "1.1.1", ++ "@radix-ui/primitive": "1.1.3", ++ "@radix-ui/react-collection": "1.1.7", ++ "@radix-ui/react-compose-refs": "1.1.2", ++ "@radix-ui/react-context": "1.1.2", ++ "@radix-ui/react-direction": "1.1.1", ++ "@radix-ui/react-dismissable-layer": "1.1.11", ++ "@radix-ui/react-focus-guards": "1.1.3", ++ "@radix-ui/react-focus-scope": "1.1.7", ++ "@radix-ui/react-id": "1.1.1", ++ "@radix-ui/react-popper": "1.2.8", ++ "@radix-ui/react-portal": "1.1.9", ++ "@radix-ui/react-primitive": "2.1.3", ++ "@radix-ui/react-slot": "1.2.3", ++ "@radix-ui/react-use-callback-ref": "1.1.1", ++ "@radix-ui/react-use-controllable-state": "1.2.2", ++ "@radix-ui/react-use-layout-effect": "1.1.1", ++ "@radix-ui/react-use-previous": "1.1.1", ++ "@radix-ui/react-visually-hidden": "1.2.3", ++ "aria-hidden": "^1.2.4", ++ "react-remove-scroll": "^2.6.3" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": { ++ "version": "1.2.3", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", ++ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-compose-refs": "1.1.2" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-separator": { ++ "version": "1.1.8", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.8.tgz", ++ "integrity": "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-primitive": "2.1.4" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": { ++ "version": "2.1.4", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", ++ "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-slot": "1.2.4" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-slot": { ++ "version": "1.2.4", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", ++ "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-compose-refs": "1.1.2" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-switch": { ++ "version": "1.2.6", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", ++ "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/primitive": "1.1.3", ++ "@radix-ui/react-compose-refs": "1.1.2", ++ "@radix-ui/react-context": "1.1.2", ++ "@radix-ui/react-primitive": "2.1.3", ++ "@radix-ui/react-use-controllable-state": "1.2.2", ++ "@radix-ui/react-use-previous": "1.1.1", ++ "@radix-ui/react-use-size": "1.1.1" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-toast": { ++ "version": "1.2.15", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz", ++ "integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/primitive": "1.1.3", ++ "@radix-ui/react-collection": "1.1.7", ++ "@radix-ui/react-compose-refs": "1.1.2", ++ "@radix-ui/react-context": "1.1.2", ++ "@radix-ui/react-dismissable-layer": "1.1.11", ++ "@radix-ui/react-portal": "1.1.9", ++ "@radix-ui/react-presence": "1.1.5", ++ "@radix-ui/react-primitive": "2.1.3", ++ "@radix-ui/react-use-callback-ref": "1.1.1", ++ "@radix-ui/react-use-controllable-state": "1.2.2", ++ "@radix-ui/react-use-layout-effect": "1.1.1", ++ "@radix-ui/react-visually-hidden": "1.2.3" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-use-callback-ref": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", ++ "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", ++ "license": "MIT", ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-use-controllable-state": { ++ "version": "1.2.2", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", ++ "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-use-effect-event": "0.0.2", ++ "@radix-ui/react-use-layout-effect": "1.1.1" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-use-effect-event": { ++ "version": "0.0.2", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", ++ "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-use-layout-effect": "1.1.1" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-use-escape-keydown": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", ++ "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-use-callback-ref": "1.1.1" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-use-is-hydrated": { ++ "version": "0.1.0", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", ++ "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", ++ "license": "MIT", ++ "dependencies": { ++ "use-sync-external-store": "^1.5.0" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-use-layout-effect": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", ++ "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", ++ "license": "MIT", ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-use-previous": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", ++ "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", ++ "license": "MIT", ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-use-rect": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", ++ "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/rect": "1.1.1" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-use-size": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", ++ "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-use-layout-effect": "1.1.1" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@radix-ui/react-visually-hidden": { ++ "version": "1.2.3", ++ "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", ++ "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", ++ "license": "MIT", ++ "dependencies": { ++ "@radix-ui/react-primitive": "2.1.3" ++ }, ++ "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 ++ } ++ } ++ }, ++ "node_modules/@radix-ui/rect": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", ++ "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", ++ "license": "MIT" ++ }, ++ "node_modules/@rolldown/binding-android-arm64": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.4.tgz", ++ "integrity": "sha512-EZLpf/8y7GXkkra90ML47kzik/GMP3EMcE9bPyHmRfxLC6z9+aW5A8poCsoxjrT5GfEcNAAvWwUHjvP1pUQkfw==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "android" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/@rolldown/binding-darwin-arm64": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.4.tgz", ++ "integrity": "sha512-aUi+HBvmYb7j8krl1+qJgkG8C17fO79gk3c+jPw4S8glRFc1DTija9S3EyaTSQUm5GJXYKDAsugBEhFHH2vYiQ==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "darwin" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/@rolldown/binding-darwin-x64": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.4.tgz", ++ "integrity": "sha512-F7hHC3gwY11+vByKPRWqwGbeXWVgKmL+pTGCinaEhdihzBV2aQ0fvZOch9cXYUOKuKKq429HeYXOqQLc7wFCEg==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "darwin" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/@rolldown/binding-freebsd-x64": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.4.tgz", ++ "integrity": "sha512-sI5yw+7s92SK6odiEhD5lKCBlWcpjHS5qyqpVQbZAJ0fIzEUXrmbl3DH2ybR3PZogulNJF+COLtmA8hUfvkCCQ==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "freebsd" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/@rolldown/binding-linux-arm-gnueabihf": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.4.tgz", ++ "integrity": "sha512-mCi0OKgEieFircrtVYmQAFGszRtMnZ6fpZAXrxanXAu7lqZcsK1E1RAaZNG0uKAnxox3B1f4EyQNnoyMfN1vAA==", ++ "cpu": [ ++ "arm" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/@rolldown/binding-linux-arm64-gnu": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.4.tgz", ++ "integrity": "sha512-B9Ial3Kv5sh0SHnB1g/QWcUQCEvCF6QKGAl4zXypYj65mVI+B4AhFBwPtSN7pDrJeIx8Z7zdy4ntx+wQABom7w==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "libc": [ ++ "glibc" ++ ], ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/@rolldown/binding-linux-arm64-musl": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.4.tgz", ++ "integrity": "sha512-lZVym0PuHE1KZ22gmFTC15lAkrg9iTszR617oYRB/iPY1A56ywoJzVKOJBKaot5RiikCObmur6pogpse3gRcng==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "libc": [ ++ "musl" ++ ], ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/@rolldown/binding-linux-ppc64-gnu": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.4.tgz", ++ "integrity": "sha512-t2DNiLJWNTbnEHyUzTumldML6ET4/g16467LZoDDJ3tSxGvguL5/NyC2lCsNKuyRycg9XeDQF5SSv+TNOhQEXg==", ++ "cpu": [ ++ "ppc64" ++ ], ++ "dev": true, ++ "libc": [ ++ "glibc" ++ ], ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/@rolldown/binding-linux-s390x-gnu": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.4.tgz", ++ "integrity": "sha512-0WIRnL1Uw4BvTZRLQt+PVgo6ZKTJadlC2btP+/EOXv2f/DWbY0rEgl+y834mIVwP1FkTlWVTrGGJXf12lru7EQ==", ++ "cpu": [ ++ "s390x" ++ ], ++ "dev": true, ++ "libc": [ ++ "glibc" ++ ], ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/@rolldown/binding-linux-x64-gnu": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.4.tgz", ++ "integrity": "sha512-JWtGshGfX+oENAKonoNkqEJX+7hC8yfhi9GUyPX1VX4mdh1y5r+ZiJLR5XzAB0aoP6s/PcILsGjKq8O0mm24bw==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "libc": [ ++ "glibc" ++ ], ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/@rolldown/binding-linux-x64-musl": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.4.tgz", ++ "integrity": "sha512-rT6yQcxUuXs4CnbofqwHRRV0iem349rLMYpTjkgQGLjrY4ado/eDzwPZPTCgTOlF6Nkp8NEv70yLMTn6qkWxsQ==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "libc": [ ++ "musl" ++ ], ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/@rolldown/binding-openharmony-arm64": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.4.tgz", ++ "integrity": "sha512-KXMGoboq5cyaCQjDA4GLuRiOwBQ0EyFnJoVViLeZ45/3rFItRODEr+NdsBcVpll40hhNArlm/speWGRvj08LzA==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "openharmony" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/@rolldown/binding-wasm32-wasi": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.4.tgz", ++ "integrity": "sha512-5K83rb36oJiY7BCyE9zLZtGcPV4g5wvq+xwdO0XPIwDVZI8cyB/AUjkNXGb92/rnmezEkjMOpgY61rtwjQtFwg==", ++ "cpu": [ ++ "wasm32" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "dependencies": { ++ "@emnapi/core": "1.11.1", ++ "@emnapi/runtime": "1.11.1", ++ "@napi-rs/wasm-runtime": "^1.1.6" ++ }, ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/@rolldown/binding-win32-arm64-msvc": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.4.tgz", ++ "integrity": "sha512-PnWBtw3TV5KOg69HQQDR0mnQuyCmSGR2pAB4DC1rPF808fgKeTUMj2EOEyKATpgiuxuR5APQmiDO7PDgEjTFSA==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "win32" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/@rolldown/binding-win32-x64-msvc": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.4.tgz", ++ "integrity": "sha512-M1lpniBePobTfsa7Ks9a199e1akxsXn+GYBUKsEzv3YFzOm1HJAMNwKI3qr0Zq+mxwx9gOZoTdP1yXRYsZUocQ==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "win32" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/@smithy/core": { ++ "version": "3.24.3", ++ "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.24.3.tgz", ++ "integrity": "sha512-Ep/7tPamGY8mgESE3LyLKtxJyy6U52WWAqr/3wial47Sj4u3PiIF73AOGI27UyLy9duTkhZbgzodOfLV4TduZg==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@aws-crypto/crc32": "5.2.0", ++ "@smithy/types": "^4.14.2", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ } ++ }, ++ "node_modules/@smithy/credential-provider-imds": { ++ "version": "4.3.3", ++ "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.3.3.tgz", ++ "integrity": "sha512-I2Bti0DKFo2IJyN28ijCsx51BAumEYR4/1yZ1FXyBygy9MqbnMqCev4JPth/MbpRfBSRAX35hITSnAdJRo1u5w==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@smithy/core": "^3.24.3", ++ "@smithy/types": "^4.14.2", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ } ++ }, ++ "node_modules/@smithy/fetch-http-handler": { ++ "version": "5.4.3", ++ "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.4.3.tgz", ++ "integrity": "sha512-F+DRf8IJazRJgYog2A/yJK7eYVc0rqTlRzO+5ZxjJd4WkZoKz0IJRncf7G6t1pdVT3kryJcwuTFhN1c5m6N47A==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@smithy/core": "^3.24.3", ++ "@smithy/types": "^4.14.2", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ } ++ }, ++ "node_modules/@smithy/is-array-buffer": { ++ "version": "2.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", ++ "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/@smithy/node-http-handler": { ++ "version": "4.7.3", ++ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.7.3.tgz", ++ "integrity": "sha512-/jPhevcTFPMVl6KNjbaI47iOg1zxC7IsnX4PQDGVZKMFceOXtB8IEYaB7a9VvkP/3oC60WzTeKocvSI7vLT0vA==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@smithy/core": "^3.24.3", ++ "@smithy/types": "^4.14.2", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ } ++ }, ++ "node_modules/@smithy/signature-v4": { ++ "version": "5.4.3", ++ "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.4.3.tgz", ++ "integrity": "sha512-53+75QuPl6DL+ct6vVEB51FDO5oulXr20TPV46VvJZg76lIlXNWfxi8j+G2V/t0I2qxCBOa3vX/8bmjrpFVo9g==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@smithy/core": "^3.24.3", ++ "@smithy/types": "^4.14.2", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ } ++ }, ++ "node_modules/@smithy/types": { ++ "version": "4.14.2", ++ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.2.tgz", ++ "integrity": "sha512-P+otAxbV4CqBybp7EkcJCrig63yE2E7PuNVOmilVMRcx/O+QDzGULTrKsq4DV13gSfak9ObPrWaHl/9bL5YcWw==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=18.0.0" ++ } ++ }, ++ "node_modules/@smithy/util-buffer-from": { ++ "version": "2.2.0", ++ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", ++ "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@smithy/is-array-buffer": "^2.2.0", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/@smithy/util-utf8": { ++ "version": "2.3.0", ++ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", ++ "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@smithy/util-buffer-from": "^2.2.0", ++ "tslib": "^2.6.2" ++ }, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/@standard-schema/spec": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", ++ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/@standard-schema/utils": { ++ "version": "0.3.0", ++ "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", ++ "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", ++ "license": "MIT" ++ }, ++ "node_modules/@tailwindcss/forms": { ++ "version": "0.5.11", ++ "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.11.tgz", ++ "integrity": "sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA==", ++ "license": "MIT", ++ "dependencies": { ++ "mini-svg-data-uri": "^1.2.3" ++ }, ++ "peerDependencies": { ++ "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" ++ } ++ }, ++ "node_modules/@tailwindcss/node": { ++ "version": "4.3.2", ++ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz", ++ "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@jridgewell/remapping": "^2.3.5", ++ "enhanced-resolve": "5.21.6", ++ "jiti": "^2.7.0", ++ "lightningcss": "1.32.0", ++ "magic-string": "^0.30.21", ++ "source-map-js": "^1.2.1", ++ "tailwindcss": "4.3.2" ++ } ++ }, ++ "node_modules/@tailwindcss/oxide": { ++ "version": "4.3.2", ++ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz", ++ "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">= 20" ++ }, ++ "optionalDependencies": { ++ "@tailwindcss/oxide-android-arm64": "4.3.2", ++ "@tailwindcss/oxide-darwin-arm64": "4.3.2", ++ "@tailwindcss/oxide-darwin-x64": "4.3.2", ++ "@tailwindcss/oxide-freebsd-x64": "4.3.2", ++ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2", ++ "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2", ++ "@tailwindcss/oxide-linux-arm64-musl": "4.3.2", ++ "@tailwindcss/oxide-linux-x64-gnu": "4.3.2", ++ "@tailwindcss/oxide-linux-x64-musl": "4.3.2", ++ "@tailwindcss/oxide-wasm32-wasi": "4.3.2", ++ "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2", ++ "@tailwindcss/oxide-win32-x64-msvc": "4.3.2" ++ } ++ }, ++ "node_modules/@tailwindcss/oxide-android-arm64": { ++ "version": "4.3.2", ++ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz", ++ "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "android" ++ ], ++ "engines": { ++ "node": ">= 20" ++ } ++ }, ++ "node_modules/@tailwindcss/oxide-darwin-arm64": { ++ "version": "4.3.2", ++ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz", ++ "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "darwin" ++ ], ++ "engines": { ++ "node": ">= 20" ++ } ++ }, ++ "node_modules/@tailwindcss/oxide-darwin-x64": { ++ "version": "4.3.2", ++ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz", ++ "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "darwin" ++ ], ++ "engines": { ++ "node": ">= 20" ++ } ++ }, ++ "node_modules/@tailwindcss/oxide-freebsd-x64": { ++ "version": "4.3.2", ++ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz", ++ "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "freebsd" ++ ], ++ "engines": { ++ "node": ">= 20" ++ } ++ }, ++ "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { ++ "version": "4.3.2", ++ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz", ++ "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==", ++ "cpu": [ ++ "arm" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 20" ++ } ++ }, ++ "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { ++ "version": "4.3.2", ++ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz", ++ "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "libc": [ ++ "glibc" ++ ], ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 20" ++ } ++ }, ++ "node_modules/@tailwindcss/oxide-linux-arm64-musl": { ++ "version": "4.3.2", ++ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz", ++ "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "libc": [ ++ "musl" ++ ], ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 20" ++ } ++ }, ++ "node_modules/@tailwindcss/oxide-linux-x64-gnu": { ++ "version": "4.3.2", ++ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz", ++ "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "libc": [ ++ "glibc" ++ ], ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 20" ++ } ++ }, ++ "node_modules/@tailwindcss/oxide-linux-x64-musl": { ++ "version": "4.3.2", ++ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz", ++ "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "libc": [ ++ "musl" ++ ], ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 20" ++ } ++ }, ++ "node_modules/@tailwindcss/oxide-wasm32-wasi": { ++ "version": "4.3.2", ++ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz", ++ "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==", ++ "bundleDependencies": [ ++ "@napi-rs/wasm-runtime", ++ "@emnapi/core", ++ "@emnapi/runtime", ++ "@tybys/wasm-util", ++ "@emnapi/wasi-threads", ++ "tslib" ++ ], ++ "cpu": [ ++ "wasm32" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "dependencies": { ++ "@emnapi/core": "^1.11.1", ++ "@emnapi/runtime": "^1.11.1", ++ "@emnapi/wasi-threads": "^1.2.2", ++ "@napi-rs/wasm-runtime": "^1.1.4", ++ "@tybys/wasm-util": "^0.10.2", ++ "tslib": "^2.8.1" ++ }, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { ++ "version": "4.3.2", ++ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz", ++ "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "win32" ++ ], ++ "engines": { ++ "node": ">= 20" ++ } ++ }, ++ "node_modules/@tailwindcss/oxide-win32-x64-msvc": { ++ "version": "4.3.2", ++ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz", ++ "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "win32" ++ ], ++ "engines": { ++ "node": ">= 20" ++ } ++ }, ++ "node_modules/@tailwindcss/typography": { ++ "version": "0.5.19", ++ "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz", ++ "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==", ++ "license": "MIT", ++ "dependencies": { ++ "postcss-selector-parser": "6.0.10" ++ }, ++ "peerDependencies": { ++ "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" ++ } ++ }, ++ "node_modules/@tailwindcss/vite": { ++ "version": "4.3.2", ++ "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.2.tgz", ++ "integrity": "sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@tailwindcss/node": "4.3.2", ++ "@tailwindcss/oxide": "4.3.2", ++ "tailwindcss": "4.3.2" ++ }, ++ "peerDependencies": { ++ "vite": "^5.2.0 || ^6 || ^7 || ^8" ++ } ++ }, ++ "node_modules/@tootallnate/once": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz", ++ "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==", ++ "license": "MIT", ++ "engines": { ++ "node": ">= 10" ++ } ++ }, ++ "node_modules/@tybys/wasm-util": { ++ "version": "0.10.3", ++ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", ++ "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "dependencies": { ++ "tslib": "^2.4.0" ++ } ++ }, ++ "node_modules/@types/body-parser": { ++ "version": "1.19.6", ++ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", ++ "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@types/connect": "*", ++ "@types/node": "*" ++ } ++ }, ++ "node_modules/@types/caseless": { ++ "version": "0.12.5", ++ "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", ++ "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", ++ "license": "MIT" ++ }, ++ "node_modules/@types/chai": { ++ "version": "5.2.3", ++ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", ++ "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@types/deep-eql": "*", ++ "assertion-error": "^2.0.1" ++ } ++ }, ++ "node_modules/@types/connect": { ++ "version": "3.4.38", ++ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", ++ "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@types/node": "*" ++ } ++ }, ++ "node_modules/@types/deep-eql": { ++ "version": "4.0.2", ++ "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", ++ "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/@types/estree": { ++ "version": "1.0.8", ++ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", ++ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/@types/express": { ++ "version": "5.0.6", ++ "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", ++ "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@types/body-parser": "*", ++ "@types/express-serve-static-core": "^5.0.0", ++ "@types/serve-static": "^2" ++ } ++ }, ++ "node_modules/@types/express-serve-static-core": { ++ "version": "5.1.1", ++ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", ++ "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@types/node": "*", ++ "@types/qs": "*", ++ "@types/range-parser": "*", ++ "@types/send": "*" ++ } ++ }, ++ "node_modules/@types/http-errors": { ++ "version": "2.0.5", ++ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", ++ "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/@types/json-schema": { ++ "version": "7.0.15", ++ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", ++ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/@types/long": { ++ "version": "4.0.2", ++ "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", ++ "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", ++ "license": "MIT" ++ }, ++ "node_modules/@types/node": { ++ "version": "24.12.4", ++ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.4.tgz", ++ "integrity": "sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==", ++ "license": "MIT", ++ "dependencies": { ++ "undici-types": "~7.16.0" ++ } ++ }, ++ "node_modules/@types/qs": { ++ "version": "6.15.1", ++ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", ++ "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/@types/range-parser": { ++ "version": "1.2.7", ++ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", ++ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/@types/react": { ++ "version": "19.2.14", ++ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", ++ "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", ++ "devOptional": true, ++ "license": "MIT", ++ "dependencies": { ++ "csstype": "^3.2.2" ++ } ++ }, ++ "node_modules/@types/request": { ++ "version": "2.48.13", ++ "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.13.tgz", ++ "integrity": "sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==", ++ "license": "MIT", ++ "dependencies": { ++ "@types/caseless": "*", ++ "@types/node": "*", ++ "@types/tough-cookie": "*", ++ "form-data": "^2.5.5" ++ } ++ }, ++ "node_modules/@types/request/node_modules/form-data": { ++ "version": "2.5.5", ++ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", ++ "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", ++ "license": "MIT", ++ "dependencies": { ++ "asynckit": "^0.4.0", ++ "combined-stream": "^1.0.8", ++ "es-set-tostringtag": "^2.1.0", ++ "hasown": "^2.0.2", ++ "mime-types": "^2.1.35", ++ "safe-buffer": "^5.2.1" ++ }, ++ "engines": { ++ "node": ">= 0.12" ++ } ++ }, ++ "node_modules/@types/send": { ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", ++ "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@types/node": "*" ++ } ++ }, ++ "node_modules/@types/serve-static": { ++ "version": "2.2.0", ++ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", ++ "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@types/http-errors": "*", ++ "@types/node": "*" ++ } ++ }, ++ "node_modules/@types/tough-cookie": { ++ "version": "4.0.5", ++ "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", ++ "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", ++ "license": "MIT" ++ }, ++ "node_modules/@typescript-eslint/eslint-plugin": { ++ "version": "8.59.3", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", ++ "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@eslint-community/regexpp": "^4.12.2", ++ "@typescript-eslint/scope-manager": "8.59.3", ++ "@typescript-eslint/type-utils": "8.59.3", ++ "@typescript-eslint/utils": "8.59.3", ++ "@typescript-eslint/visitor-keys": "8.59.3", ++ "ignore": "^7.0.5", ++ "natural-compare": "^1.4.0", ++ "ts-api-utils": "^2.5.0" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ }, ++ "peerDependencies": { ++ "@typescript-eslint/parser": "^8.59.3", ++ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", ++ "typescript": ">=4.8.4 <6.1.0" ++ } ++ }, ++ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { ++ "version": "7.0.5", ++ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", ++ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">= 4" ++ } ++ }, ++ "node_modules/@typescript-eslint/parser": { ++ "version": "8.59.3", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", ++ "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@typescript-eslint/scope-manager": "8.59.3", ++ "@typescript-eslint/types": "8.59.3", ++ "@typescript-eslint/typescript-estree": "8.59.3", ++ "@typescript-eslint/visitor-keys": "8.59.3", ++ "debug": "^4.4.3" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ }, ++ "peerDependencies": { ++ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", ++ "typescript": ">=4.8.4 <6.1.0" ++ } ++ }, ++ "node_modules/@typescript-eslint/project-service": { ++ "version": "8.59.3", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", ++ "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@typescript-eslint/tsconfig-utils": "^8.59.3", ++ "@typescript-eslint/types": "^8.59.3", ++ "debug": "^4.4.3" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ }, ++ "peerDependencies": { ++ "typescript": ">=4.8.4 <6.1.0" ++ } ++ }, ++ "node_modules/@typescript-eslint/scope-manager": { ++ "version": "8.59.3", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", ++ "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@typescript-eslint/types": "8.59.3", ++ "@typescript-eslint/visitor-keys": "8.59.3" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ } ++ }, ++ "node_modules/@typescript-eslint/tsconfig-utils": { ++ "version": "8.59.3", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", ++ "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ }, ++ "peerDependencies": { ++ "typescript": ">=4.8.4 <6.1.0" ++ } ++ }, ++ "node_modules/@typescript-eslint/type-utils": { ++ "version": "8.59.3", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", ++ "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@typescript-eslint/types": "8.59.3", ++ "@typescript-eslint/typescript-estree": "8.59.3", ++ "@typescript-eslint/utils": "8.59.3", ++ "debug": "^4.4.3", ++ "ts-api-utils": "^2.5.0" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ }, ++ "peerDependencies": { ++ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", ++ "typescript": ">=4.8.4 <6.1.0" ++ } ++ }, ++ "node_modules/@typescript-eslint/types": { ++ "version": "8.59.3", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", ++ "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ } ++ }, ++ "node_modules/@typescript-eslint/typescript-estree": { ++ "version": "8.59.3", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", ++ "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@typescript-eslint/project-service": "8.59.3", ++ "@typescript-eslint/tsconfig-utils": "8.59.3", ++ "@typescript-eslint/types": "8.59.3", ++ "@typescript-eslint/visitor-keys": "8.59.3", ++ "debug": "^4.4.3", ++ "minimatch": "^10.2.2", ++ "semver": "^7.7.3", ++ "tinyglobby": "^0.2.15", ++ "ts-api-utils": "^2.5.0" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ }, ++ "peerDependencies": { ++ "typescript": ">=4.8.4 <6.1.0" ++ } ++ }, ++ "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { ++ "version": "4.0.4", ++ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", ++ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": "18 || 20 || >=22" ++ } ++ }, ++ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { ++ "version": "5.0.6", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", ++ "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "balanced-match": "^4.0.2" ++ }, ++ "engines": { ++ "node": "18 || 20 || >=22" ++ } ++ }, ++ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { ++ "version": "10.2.5", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", ++ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", ++ "dev": true, ++ "license": "BlueOak-1.0.0", ++ "dependencies": { ++ "brace-expansion": "^5.0.5" ++ }, ++ "engines": { ++ "node": "18 || 20 || >=22" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/isaacs" ++ } ++ }, ++ "node_modules/@typescript-eslint/utils": { ++ "version": "8.59.3", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", ++ "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@eslint-community/eslint-utils": "^4.9.1", ++ "@typescript-eslint/scope-manager": "8.59.3", ++ "@typescript-eslint/types": "8.59.3", ++ "@typescript-eslint/typescript-estree": "8.59.3" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ }, ++ "peerDependencies": { ++ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", ++ "typescript": ">=4.8.4 <6.1.0" ++ } ++ }, ++ "node_modules/@typescript-eslint/visitor-keys": { ++ "version": "8.59.3", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", ++ "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@typescript-eslint/types": "8.59.3", ++ "eslint-visitor-keys": "^5.0.0" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ } ++ }, ++ "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { ++ "version": "5.0.1", ++ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", ++ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", ++ "dev": true, ++ "license": "Apache-2.0", ++ "engines": { ++ "node": "^20.19.0 || ^22.13.0 || >=24" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/eslint" ++ } ++ }, ++ "node_modules/@vitest/coverage-v8": { ++ "version": "4.1.9", ++ "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.9.tgz", ++ "integrity": "sha512-G9/lgqibheLVBDRuya45EbsEXTYcWoSG+TLg7i2axuzx0Eq62eXn+aWXyaVdV5vKvFSWd6ywcX8hA7la9Pvu8g==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@bcoe/v8-coverage": "^1.0.2", ++ "@vitest/utils": "4.1.9", ++ "ast-v8-to-istanbul": "^1.0.0", ++ "istanbul-lib-coverage": "^3.2.2", ++ "istanbul-lib-report": "^3.0.1", ++ "istanbul-reports": "^3.2.0", ++ "magicast": "^0.5.2", ++ "obug": "^2.1.1", ++ "std-env": "^4.0.0-rc.1", ++ "tinyrainbow": "^3.1.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/vitest" ++ }, ++ "peerDependencies": { ++ "@vitest/browser": "4.1.9", ++ "vitest": "4.1.9" ++ }, ++ "peerDependenciesMeta": { ++ "@vitest/browser": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@vitest/expect": { ++ "version": "4.1.9", ++ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.9.tgz", ++ "integrity": "sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@standard-schema/spec": "^1.1.0", ++ "@types/chai": "^5.2.2", ++ "@vitest/spy": "4.1.9", ++ "@vitest/utils": "4.1.9", ++ "chai": "^6.2.2", ++ "tinyrainbow": "^3.1.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/vitest" ++ } ++ }, ++ "node_modules/@vitest/mocker": { ++ "version": "4.1.9", ++ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.9.tgz", ++ "integrity": "sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@vitest/spy": "4.1.9", ++ "estree-walker": "^3.0.3", ++ "magic-string": "^0.30.21" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/vitest" ++ }, ++ "peerDependencies": { ++ "msw": "^2.4.9", ++ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" ++ }, ++ "peerDependenciesMeta": { ++ "msw": { ++ "optional": true ++ }, ++ "vite": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@vitest/pretty-format": { ++ "version": "4.1.9", ++ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.9.tgz", ++ "integrity": "sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "tinyrainbow": "^3.1.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/vitest" ++ } ++ }, ++ "node_modules/@vitest/runner": { ++ "version": "4.1.9", ++ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.9.tgz", ++ "integrity": "sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@vitest/utils": "4.1.9", ++ "pathe": "^2.0.3" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/vitest" ++ } ++ }, ++ "node_modules/@vitest/snapshot": { ++ "version": "4.1.9", ++ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.9.tgz", ++ "integrity": "sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@vitest/pretty-format": "4.1.9", ++ "@vitest/utils": "4.1.9", ++ "magic-string": "^0.30.21", ++ "pathe": "^2.0.3" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/vitest" ++ } ++ }, ++ "node_modules/@vitest/spy": { ++ "version": "4.1.9", ++ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.9.tgz", ++ "integrity": "sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==", ++ "dev": true, ++ "license": "MIT", ++ "funding": { ++ "url": "https://opencollective.com/vitest" ++ } ++ }, ++ "node_modules/@vitest/utils": { ++ "version": "4.1.9", ++ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.9.tgz", ++ "integrity": "sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@vitest/pretty-format": "4.1.9", ++ "convert-source-map": "^2.0.0", ++ "tinyrainbow": "^3.1.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/vitest" ++ } ++ }, ++ "node_modules/@wasp.sh/spec": { ++ "resolved": ".wasp/spec", ++ "link": true ++ }, ++ "node_modules/@yr/monotone-cubic-spline": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz", ++ "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==", ++ "license": "MIT" ++ }, ++ "node_modules/abort-controller": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", ++ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", ++ "license": "MIT", ++ "dependencies": { ++ "event-target-shim": "^5.0.0" ++ }, ++ "engines": { ++ "node": ">=6.5" ++ } ++ }, ++ "node_modules/acorn": { ++ "version": "8.16.0", ++ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", ++ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", ++ "dev": true, ++ "license": "MIT", ++ "bin": { ++ "acorn": "bin/acorn" ++ }, ++ "engines": { ++ "node": ">=0.4.0" ++ } ++ }, ++ "node_modules/acorn-jsx": { ++ "version": "5.3.2", ++ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", ++ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", ++ "dev": true, ++ "license": "MIT", ++ "peerDependencies": { ++ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" ++ } ++ }, ++ "node_modules/agent-base": { ++ "version": "6.0.2", ++ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", ++ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", ++ "license": "MIT", ++ "dependencies": { ++ "debug": "4" ++ }, ++ "engines": { ++ "node": ">= 6.0.0" ++ } ++ }, ++ "node_modules/ajv": { ++ "version": "6.15.0", ++ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", ++ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "fast-deep-equal": "^3.1.1", ++ "fast-json-stable-stringify": "^2.0.0", ++ "json-schema-traverse": "^0.4.1", ++ "uri-js": "^4.2.2" ++ }, ++ "funding": { ++ "type": "github", ++ "url": "https://github.com/sponsors/epoberezkin" ++ } ++ }, ++ "node_modules/ansi-regex": { ++ "version": "5.0.1", ++ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", ++ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", ++ "license": "MIT", ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/ansi-styles": { ++ "version": "4.3.0", ++ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", ++ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", ++ "license": "MIT", ++ "dependencies": { ++ "color-convert": "^2.0.1" ++ }, ++ "engines": { ++ "node": ">=8" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/ansi-styles?sponsor=1" ++ } ++ }, ++ "node_modules/anymatch": { ++ "version": "3.1.3", ++ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", ++ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", ++ "dev": true, ++ "license": "ISC", ++ "dependencies": { ++ "normalize-path": "^3.0.0", ++ "picomatch": "^2.0.4" ++ }, ++ "engines": { ++ "node": ">= 8" ++ } ++ }, ++ "node_modules/anymatch/node_modules/picomatch": { ++ "version": "2.3.2", ++ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", ++ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=8.6" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/jonschlinkert" ++ } ++ }, ++ "node_modules/apexcharts": { ++ "version": "5.10.1", ++ "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-5.10.1.tgz", ++ "integrity": "sha512-BpKKRopNm5cziXmA1igmCKiJ02I2g/I4vBtjhB6/50FrrY2IH5csvCzzqiIuFCB+P+2p0MgLAGOJPKOUvXO63w==", ++ "license": "SEE LICENSE IN LICENSE", ++ "dependencies": { ++ "@yr/monotone-cubic-spline": "^1.0.3" ++ } ++ }, ++ "node_modules/argparse": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", ++ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", ++ "dev": true, ++ "license": "Python-2.0" ++ }, ++ "node_modules/aria-hidden": { ++ "version": "1.2.6", ++ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", ++ "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", ++ "license": "MIT", ++ "dependencies": { ++ "tslib": "^2.0.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ } ++ }, ++ "node_modules/assertion-error": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", ++ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=12" ++ } ++ }, ++ "node_modules/ast-v8-to-istanbul": { ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.4.tgz", ++ "integrity": "sha512-0bC0/4bTSrnwdhU3IsZDwEdojvuPrSg59OYZfKsLRtJZ0u8VBx9DebfqqG8bRdCC0I7vjgxmPi41P0lpkhJHtA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@jridgewell/trace-mapping": "^0.3.31", ++ "estree-walker": "^3.0.3", ++ "js-tokens": "^10.0.0" ++ } ++ }, ++ "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { ++ "version": "10.0.0", ++ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", ++ "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/asynckit": { ++ "version": "0.4.0", ++ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", ++ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", ++ "license": "MIT" ++ }, ++ "node_modules/balanced-match": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", ++ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/base64-js": { ++ "version": "1.5.1", ++ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", ++ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", ++ "funding": [ ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/feross" ++ }, ++ { ++ "type": "patreon", ++ "url": "https://www.patreon.com/feross" ++ }, ++ { ++ "type": "consulting", ++ "url": "https://feross.org/support" ++ } ++ ], ++ "license": "MIT" ++ }, ++ "node_modules/bignumber.js": { ++ "version": "9.3.1", ++ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", ++ "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", ++ "license": "MIT", ++ "engines": { ++ "node": "*" ++ } ++ }, ++ "node_modules/binary-extensions": { ++ "version": "2.3.0", ++ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", ++ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=8" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/bowser": { ++ "version": "2.14.1", ++ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", ++ "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", ++ "license": "MIT" ++ }, ++ "node_modules/brace-expansion": { ++ "version": "1.1.14", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", ++ "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "node_modules/braces": { ++ "version": "3.0.3", ++ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", ++ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "fill-range": "^7.1.1" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/buffer-equal-constant-time": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", ++ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", ++ "license": "BSD-3-Clause" ++ }, ++ "node_modules/call-bind-apply-helpers": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", ++ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", ++ "license": "MIT", ++ "dependencies": { ++ "es-errors": "^1.3.0", ++ "function-bind": "^1.1.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/call-bound": { ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", ++ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", ++ "license": "MIT", ++ "dependencies": { ++ "call-bind-apply-helpers": "^1.0.2", ++ "get-intrinsic": "^1.3.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/callsites": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", ++ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=6" ++ } ++ }, ++ "node_modules/chai": { ++ "version": "6.2.2", ++ "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", ++ "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=18" ++ } ++ }, ++ "node_modules/chalk": { ++ "version": "4.1.2", ++ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", ++ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "ansi-styles": "^4.1.0", ++ "supports-color": "^7.1.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/chalk?sponsor=1" ++ } ++ }, ++ "node_modules/chokidar": { ++ "version": "3.6.0", ++ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", ++ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "anymatch": "~3.1.2", ++ "braces": "~3.0.2", ++ "glob-parent": "~5.1.2", ++ "is-binary-path": "~2.1.0", ++ "is-glob": "~4.0.1", ++ "normalize-path": "~3.0.0", ++ "readdirp": "~3.6.0" ++ }, ++ "engines": { ++ "node": ">= 8.10.0" ++ }, ++ "funding": { ++ "url": "https://paulmillr.com/funding/" ++ }, ++ "optionalDependencies": { ++ "fsevents": "~2.3.2" ++ } ++ }, ++ "node_modules/chokidar/node_modules/glob-parent": { ++ "version": "5.1.2", ++ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", ++ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", ++ "dev": true, ++ "license": "ISC", ++ "dependencies": { ++ "is-glob": "^4.0.1" ++ }, ++ "engines": { ++ "node": ">= 6" ++ } ++ }, ++ "node_modules/class-variance-authority": { ++ "version": "0.7.1", ++ "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", ++ "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "clsx": "^2.1.1" ++ }, ++ "funding": { ++ "url": "https://polar.sh/cva" ++ } ++ }, ++ "node_modules/cliui": { ++ "version": "8.0.1", ++ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", ++ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", ++ "license": "ISC", ++ "dependencies": { ++ "string-width": "^4.2.0", ++ "strip-ansi": "^6.0.1", ++ "wrap-ansi": "^7.0.0" ++ }, ++ "engines": { ++ "node": ">=12" ++ } ++ }, ++ "node_modules/clsx": { ++ "version": "2.1.1", ++ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", ++ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", ++ "license": "MIT", ++ "engines": { ++ "node": ">=6" ++ } ++ }, ++ "node_modules/color-convert": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", ++ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", ++ "license": "MIT", ++ "dependencies": { ++ "color-name": "~1.1.4" ++ }, ++ "engines": { ++ "node": ">=7.0.0" ++ } ++ }, ++ "node_modules/color-name": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", ++ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", ++ "license": "MIT" ++ }, ++ "node_modules/combined-stream": { ++ "version": "1.0.8", ++ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", ++ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", ++ "license": "MIT", ++ "dependencies": { ++ "delayed-stream": "~1.0.0" ++ }, ++ "engines": { ++ "node": ">= 0.8" ++ } ++ }, ++ "node_modules/concat-map": { ++ "version": "0.0.1", ++ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", ++ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/convert-source-map": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", ++ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/cookie-es": { ++ "version": "3.1.1", ++ "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-3.1.1.tgz", ++ "integrity": "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==", ++ "license": "MIT" ++ }, ++ "node_modules/cross-spawn": { ++ "version": "7.0.6", ++ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", ++ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "path-key": "^3.1.0", ++ "shebang-command": "^2.0.0", ++ "which": "^2.0.1" ++ }, ++ "engines": { ++ "node": ">= 8" ++ } ++ }, ++ "node_modules/cssesc": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", ++ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", ++ "license": "MIT", ++ "bin": { ++ "cssesc": "bin/cssesc" ++ }, ++ "engines": { ++ "node": ">=4" ++ } ++ }, ++ "node_modules/csstype": { ++ "version": "3.2.3", ++ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", ++ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", ++ "devOptional": true, ++ "license": "MIT" ++ }, ++ "node_modules/debug": { ++ "version": "4.4.3", ++ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", ++ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", ++ "license": "MIT", ++ "dependencies": { ++ "ms": "^2.1.3" ++ }, ++ "engines": { ++ "node": ">=6.0" ++ }, ++ "peerDependenciesMeta": { ++ "supports-color": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/deep-is": { ++ "version": "0.1.4", ++ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", ++ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/delayed-stream": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", ++ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", ++ "license": "MIT", ++ "engines": { ++ "node": ">=0.4.0" ++ } ++ }, ++ "node_modules/dequal": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", ++ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=6" ++ } ++ }, ++ "node_modules/detect-libc": { ++ "version": "2.1.2", ++ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", ++ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", ++ "dev": true, ++ "license": "Apache-2.0", ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/detect-node-es": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", ++ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", ++ "license": "MIT" ++ }, ++ "node_modules/devlop": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", ++ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "dequal": "^2.0.0" ++ }, ++ "funding": { ++ "type": "github", ++ "url": "https://github.com/sponsors/wooorm" ++ } ++ }, ++ "node_modules/dunder-proto": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", ++ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", ++ "license": "MIT", ++ "dependencies": { ++ "call-bind-apply-helpers": "^1.0.1", ++ "es-errors": "^1.3.0", ++ "gopd": "^1.2.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/duplexify": { ++ "version": "4.1.3", ++ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", ++ "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", ++ "license": "MIT", ++ "dependencies": { ++ "end-of-stream": "^1.4.1", ++ "inherits": "^2.0.3", ++ "readable-stream": "^3.1.1", ++ "stream-shift": "^1.0.2" ++ } ++ }, ++ "node_modules/ecdsa-sig-formatter": { ++ "version": "1.0.11", ++ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", ++ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "safe-buffer": "^5.0.1" ++ } ++ }, ++ "node_modules/emoji-regex": { ++ "version": "8.0.0", ++ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", ++ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", ++ "license": "MIT" ++ }, ++ "node_modules/end-of-stream": { ++ "version": "1.4.5", ++ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", ++ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", ++ "license": "MIT", ++ "dependencies": { ++ "once": "^1.4.0" ++ } ++ }, ++ "node_modules/enhanced-resolve": { ++ "version": "5.21.6", ++ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", ++ "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "graceful-fs": "^4.2.4", ++ "tapable": "^2.3.3" ++ }, ++ "engines": { ++ "node": ">=10.13.0" ++ } ++ }, ++ "node_modules/es-define-property": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", ++ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", ++ "license": "MIT", ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/es-errors": { ++ "version": "1.3.0", ++ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", ++ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", ++ "license": "MIT", ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/es-module-lexer": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", ++ "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/es-object-atoms": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", ++ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", ++ "license": "MIT", ++ "dependencies": { ++ "es-errors": "^1.3.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/es-set-tostringtag": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", ++ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", ++ "license": "MIT", ++ "dependencies": { ++ "es-errors": "^1.3.0", ++ "get-intrinsic": "^1.2.6", ++ "has-tostringtag": "^1.0.2", ++ "hasown": "^2.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/escalade": { ++ "version": "3.2.0", ++ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", ++ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", ++ "license": "MIT", ++ "engines": { ++ "node": ">=6" ++ } ++ }, ++ "node_modules/escape-string-regexp": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", ++ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/eslint": { ++ "version": "9.39.4", ++ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", ++ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@eslint-community/eslint-utils": "^4.8.0", ++ "@eslint-community/regexpp": "^4.12.1", ++ "@eslint/config-array": "^0.21.2", ++ "@eslint/config-helpers": "^0.4.2", ++ "@eslint/core": "^0.17.0", ++ "@eslint/eslintrc": "^3.3.5", ++ "@eslint/js": "9.39.4", ++ "@eslint/plugin-kit": "^0.4.1", ++ "@humanfs/node": "^0.16.6", ++ "@humanwhocodes/module-importer": "^1.0.1", ++ "@humanwhocodes/retry": "^0.4.2", ++ "@types/estree": "^1.0.6", ++ "ajv": "^6.14.0", ++ "chalk": "^4.0.0", ++ "cross-spawn": "^7.0.6", ++ "debug": "^4.3.2", ++ "escape-string-regexp": "^4.0.0", ++ "eslint-scope": "^8.4.0", ++ "eslint-visitor-keys": "^4.2.1", ++ "espree": "^10.4.0", ++ "esquery": "^1.5.0", ++ "esutils": "^2.0.2", ++ "fast-deep-equal": "^3.1.3", ++ "file-entry-cache": "^8.0.0", ++ "find-up": "^5.0.0", ++ "glob-parent": "^6.0.2", ++ "ignore": "^5.2.0", ++ "imurmurhash": "^0.1.4", ++ "is-glob": "^4.0.0", ++ "json-stable-stringify-without-jsonify": "^1.0.1", ++ "lodash.merge": "^4.6.2", ++ "minimatch": "^3.1.5", ++ "natural-compare": "^1.4.0", ++ "optionator": "^0.9.3" ++ }, ++ "bin": { ++ "eslint": "bin/eslint.js" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "url": "https://eslint.org/donate" ++ }, ++ "peerDependencies": { ++ "jiti": "*" ++ }, ++ "peerDependenciesMeta": { ++ "jiti": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/eslint-scope": { ++ "version": "8.4.0", ++ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", ++ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", ++ "dev": true, ++ "license": "BSD-2-Clause", ++ "dependencies": { ++ "esrecurse": "^4.3.0", ++ "estraverse": "^5.2.0" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/eslint" ++ } ++ }, ++ "node_modules/eslint-visitor-keys": { ++ "version": "4.2.1", ++ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", ++ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", ++ "dev": true, ++ "license": "Apache-2.0", ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/eslint" ++ } ++ }, ++ "node_modules/espree": { ++ "version": "10.4.0", ++ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", ++ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", ++ "dev": true, ++ "license": "BSD-2-Clause", ++ "dependencies": { ++ "acorn": "^8.15.0", ++ "acorn-jsx": "^5.3.2", ++ "eslint-visitor-keys": "^4.2.1" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/eslint" ++ } ++ }, ++ "node_modules/esquery": { ++ "version": "1.7.0", ++ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", ++ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", ++ "dev": true, ++ "license": "BSD-3-Clause", ++ "dependencies": { ++ "estraverse": "^5.1.0" ++ }, ++ "engines": { ++ "node": ">=0.10" ++ } ++ }, ++ "node_modules/esrecurse": { ++ "version": "4.3.0", ++ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", ++ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", ++ "dev": true, ++ "license": "BSD-2-Clause", ++ "dependencies": { ++ "estraverse": "^5.2.0" ++ }, ++ "engines": { ++ "node": ">=4.0" ++ } ++ }, ++ "node_modules/estraverse": { ++ "version": "5.3.0", ++ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", ++ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", ++ "dev": true, ++ "license": "BSD-2-Clause", ++ "engines": { ++ "node": ">=4.0" ++ } ++ }, ++ "node_modules/estree-util-scope": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", ++ "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@types/estree": "^1.0.0", ++ "devlop": "^1.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/unified" ++ } ++ }, ++ "node_modules/estree-walker": { ++ "version": "3.0.3", ++ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", ++ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@types/estree": "^1.0.0" ++ } ++ }, ++ "node_modules/esutils": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", ++ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", ++ "dev": true, ++ "license": "BSD-2-Clause", ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/event-target-shim": { ++ "version": "5.0.1", ++ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", ++ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", ++ "license": "MIT", ++ "engines": { ++ "node": ">=6" ++ } ++ }, ++ "node_modules/expect-type": { ++ "version": "1.3.0", ++ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", ++ "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", ++ "dev": true, ++ "license": "Apache-2.0", ++ "engines": { ++ "node": ">=12.0.0" ++ } ++ }, ++ "node_modules/extend": { ++ "version": "3.0.2", ++ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", ++ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", ++ "license": "MIT" ++ }, ++ "node_modules/fast-deep-equal": { ++ "version": "3.1.3", ++ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", ++ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/fast-json-stable-stringify": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", ++ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/fast-levenshtein": { ++ "version": "2.0.6", ++ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", ++ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/fast-xml-builder": { ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", ++ "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", ++ "funding": [ ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/NaturalIntelligence" ++ } ++ ], ++ "license": "MIT", ++ "dependencies": { ++ "path-expression-matcher": "^1.5.0", ++ "xml-naming": "^0.1.0" ++ } ++ }, ++ "node_modules/fast-xml-parser": { ++ "version": "5.7.3", ++ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", ++ "integrity": "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg==", ++ "funding": [ ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/NaturalIntelligence" ++ } ++ ], ++ "license": "MIT", ++ "dependencies": { ++ "@nodable/entities": "^2.1.0", ++ "fast-xml-builder": "^1.1.7", ++ "path-expression-matcher": "^1.5.0", ++ "strnum": "^2.2.3" ++ }, ++ "bin": { ++ "fxparser": "src/cli/cli.js" ++ } ++ }, ++ "node_modules/fdir": { ++ "version": "6.5.0", ++ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", ++ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=12.0.0" ++ }, ++ "peerDependencies": { ++ "picomatch": "^3 || ^4" ++ }, ++ "peerDependenciesMeta": { ++ "picomatch": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/file-entry-cache": { ++ "version": "8.0.0", ++ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", ++ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "flat-cache": "^4.0.0" ++ }, ++ "engines": { ++ "node": ">=16.0.0" ++ } ++ }, ++ "node_modules/fill-range": { ++ "version": "7.1.1", ++ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", ++ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "to-regex-range": "^5.0.1" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/find-up": { ++ "version": "5.0.0", ++ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", ++ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "locate-path": "^6.0.0", ++ "path-exists": "^4.0.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/flat-cache": { ++ "version": "4.0.1", ++ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", ++ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "flatted": "^3.2.9", ++ "keyv": "^4.5.4" ++ }, ++ "engines": { ++ "node": ">=16" ++ } ++ }, ++ "node_modules/flatted": { ++ "version": "3.4.2", ++ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", ++ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", ++ "dev": true, ++ "license": "ISC" ++ }, ++ "node_modules/fsevents": { ++ "version": "2.3.3", ++ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", ++ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", ++ "dev": true, ++ "hasInstallScript": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "darwin" ++ ], ++ "engines": { ++ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" ++ } ++ }, ++ "node_modules/function-bind": { ++ "version": "1.1.2", ++ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", ++ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", ++ "license": "MIT", ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/gaxios": { ++ "version": "6.7.1", ++ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", ++ "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "extend": "^3.0.2", ++ "https-proxy-agent": "^7.0.1", ++ "is-stream": "^2.0.0", ++ "node-fetch": "^2.6.9", ++ "uuid": "^9.0.1" ++ }, ++ "engines": { ++ "node": ">=14" ++ } ++ }, ++ "node_modules/gaxios/node_modules/agent-base": { ++ "version": "7.1.4", ++ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", ++ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", ++ "license": "MIT", ++ "engines": { ++ "node": ">= 14" ++ } ++ }, ++ "node_modules/gaxios/node_modules/https-proxy-agent": { ++ "version": "7.0.6", ++ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", ++ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", ++ "license": "MIT", ++ "dependencies": { ++ "agent-base": "^7.1.2", ++ "debug": "4" ++ }, ++ "engines": { ++ "node": ">= 14" ++ } ++ }, ++ "node_modules/gcp-metadata": { ++ "version": "6.1.1", ++ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", ++ "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "gaxios": "^6.1.1", ++ "google-logging-utils": "^0.0.2", ++ "json-bigint": "^1.0.0" ++ }, ++ "engines": { ++ "node": ">=14" ++ } ++ }, ++ "node_modules/get-caller-file": { ++ "version": "2.0.5", ++ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", ++ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", ++ "license": "ISC", ++ "engines": { ++ "node": "6.* || 8.* || >= 10.*" ++ } ++ }, ++ "node_modules/get-intrinsic": { ++ "version": "1.3.0", ++ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", ++ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", ++ "license": "MIT", ++ "dependencies": { ++ "call-bind-apply-helpers": "^1.0.2", ++ "es-define-property": "^1.0.1", ++ "es-errors": "^1.3.0", ++ "es-object-atoms": "^1.1.1", ++ "function-bind": "^1.1.2", ++ "get-proto": "^1.0.1", ++ "gopd": "^1.2.0", ++ "has-symbols": "^1.1.0", ++ "hasown": "^2.0.2", ++ "math-intrinsics": "^1.1.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/get-nonce": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", ++ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", ++ "license": "MIT", ++ "engines": { ++ "node": ">=6" ++ } ++ }, ++ "node_modules/get-proto": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", ++ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", ++ "license": "MIT", ++ "dependencies": { ++ "dunder-proto": "^1.0.1", ++ "es-object-atoms": "^1.0.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/glob-parent": { ++ "version": "6.0.2", ++ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", ++ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", ++ "dev": true, ++ "license": "ISC", ++ "dependencies": { ++ "is-glob": "^4.0.3" ++ }, ++ "engines": { ++ "node": ">=10.13.0" ++ } ++ }, ++ "node_modules/globals": { ++ "version": "15.15.0", ++ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", ++ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=18" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/google-auth-library": { ++ "version": "9.15.1", ++ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", ++ "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "base64-js": "^1.3.0", ++ "ecdsa-sig-formatter": "^1.0.11", ++ "gaxios": "^6.1.1", ++ "gcp-metadata": "^6.1.0", ++ "gtoken": "^7.0.0", ++ "jws": "^4.0.0" ++ }, ++ "engines": { ++ "node": ">=14" ++ } ++ }, ++ "node_modules/google-gax": { ++ "version": "4.6.1", ++ "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.6.1.tgz", ++ "integrity": "sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@grpc/grpc-js": "^1.10.9", ++ "@grpc/proto-loader": "^0.7.13", ++ "@types/long": "^4.0.0", ++ "abort-controller": "^3.0.0", ++ "duplexify": "^4.0.0", ++ "google-auth-library": "^9.3.0", ++ "node-fetch": "^2.7.0", ++ "object-hash": "^3.0.0", ++ "proto3-json-serializer": "^2.0.2", ++ "protobufjs": "^7.3.2", ++ "retry-request": "^7.0.0", ++ "uuid": "^9.0.1" ++ }, ++ "engines": { ++ "node": ">=14" ++ } ++ }, ++ "node_modules/google-logging-utils": { ++ "version": "0.0.2", ++ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", ++ "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", ++ "license": "Apache-2.0", ++ "engines": { ++ "node": ">=14" ++ } ++ }, ++ "node_modules/gopd": { ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", ++ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", ++ "license": "MIT", ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/graceful-fs": { ++ "version": "4.2.11", ++ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", ++ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", ++ "dev": true, ++ "license": "ISC" ++ }, ++ "node_modules/gtoken": { ++ "version": "7.1.0", ++ "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", ++ "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", ++ "license": "MIT", ++ "dependencies": { ++ "gaxios": "^6.0.0", ++ "jws": "^4.0.0" ++ }, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/has-flag": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", ++ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/has-symbols": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", ++ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", ++ "license": "MIT", ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/has-tostringtag": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", ++ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", ++ "license": "MIT", ++ "dependencies": { ++ "has-symbols": "^1.0.3" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/hasown": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", ++ "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", ++ "license": "MIT", ++ "dependencies": { ++ "function-bind": "^1.1.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/html-escaper": { ++ "version": "2.0.2", ++ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", ++ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/http-proxy-agent": { ++ "version": "5.0.0", ++ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", ++ "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", ++ "license": "MIT", ++ "dependencies": { ++ "@tootallnate/once": "2", ++ "agent-base": "6", ++ "debug": "4" ++ }, ++ "engines": { ++ "node": ">= 6" ++ } ++ }, ++ "node_modules/https-proxy-agent": { ++ "version": "5.0.1", ++ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", ++ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", ++ "license": "MIT", ++ "dependencies": { ++ "agent-base": "6", ++ "debug": "4" ++ }, ++ "engines": { ++ "node": ">= 6" ++ } ++ }, ++ "node_modules/ignore": { ++ "version": "5.3.2", ++ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", ++ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">= 4" ++ } ++ }, ++ "node_modules/ignore-by-default": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", ++ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", ++ "dev": true, ++ "license": "ISC" ++ }, ++ "node_modules/import-fresh": { ++ "version": "3.3.1", ++ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", ++ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "parent-module": "^1.0.0", ++ "resolve-from": "^4.0.0" ++ }, ++ "engines": { ++ "node": ">=6" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/imurmurhash": { ++ "version": "0.1.4", ++ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", ++ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=0.8.19" ++ } ++ }, ++ "node_modules/inherits": { ++ "version": "2.0.4", ++ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", ++ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", ++ "license": "ISC" ++ }, ++ "node_modules/is-binary-path": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", ++ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "binary-extensions": "^2.0.0" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/is-extglob": { ++ "version": "2.1.1", ++ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", ++ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/is-fullwidth-code-point": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", ++ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", ++ "license": "MIT", ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/is-glob": { ++ "version": "4.0.3", ++ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", ++ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "is-extglob": "^2.1.1" ++ }, ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/is-number": { ++ "version": "7.0.0", ++ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", ++ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=0.12.0" ++ } ++ }, ++ "node_modules/is-stream": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", ++ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", ++ "license": "MIT", ++ "engines": { ++ "node": ">=8" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/isexe": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", ++ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", ++ "dev": true, ++ "license": "ISC" ++ }, ++ "node_modules/istanbul-lib-coverage": { ++ "version": "3.2.2", ++ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", ++ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", ++ "dev": true, ++ "license": "BSD-3-Clause", ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/istanbul-lib-report": { ++ "version": "3.0.1", ++ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", ++ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", ++ "dev": true, ++ "license": "BSD-3-Clause", ++ "dependencies": { ++ "istanbul-lib-coverage": "^3.0.0", ++ "make-dir": "^4.0.0", ++ "supports-color": "^7.1.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ } ++ }, ++ "node_modules/istanbul-reports": { ++ "version": "3.2.0", ++ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", ++ "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", ++ "dev": true, ++ "license": "BSD-3-Clause", ++ "dependencies": { ++ "html-escaper": "^2.0.0", ++ "istanbul-lib-report": "^3.0.0" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/jiti": { ++ "version": "2.7.0", ++ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", ++ "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", ++ "dev": true, ++ "license": "MIT", ++ "bin": { ++ "jiti": "lib/jiti-cli.mjs" ++ } ++ }, ++ "node_modules/js-tokens": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", ++ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", ++ "license": "MIT" ++ }, ++ "node_modules/js-yaml": { ++ "version": "4.1.1", ++ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", ++ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "argparse": "^2.0.1" ++ }, ++ "bin": { ++ "js-yaml": "bin/js-yaml.js" ++ } ++ }, ++ "node_modules/json-bigint": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", ++ "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", ++ "license": "MIT", ++ "dependencies": { ++ "bignumber.js": "^9.0.0" ++ } ++ }, ++ "node_modules/json-buffer": { ++ "version": "3.0.1", ++ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", ++ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/json-schema-traverse": { ++ "version": "0.4.1", ++ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", ++ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/json-stable-stringify-without-jsonify": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", ++ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/jwa": { ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", ++ "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", ++ "license": "MIT", ++ "dependencies": { ++ "buffer-equal-constant-time": "^1.0.1", ++ "ecdsa-sig-formatter": "1.0.11", ++ "safe-buffer": "^5.0.1" ++ } ++ }, ++ "node_modules/jws": { ++ "version": "4.0.1", ++ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", ++ "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", ++ "license": "MIT", ++ "dependencies": { ++ "jwa": "^2.0.1", ++ "safe-buffer": "^5.0.1" ++ } ++ }, ++ "node_modules/keyv": { ++ "version": "4.5.4", ++ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", ++ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "json-buffer": "3.0.1" ++ } ++ }, ++ "node_modules/ky": { ++ "version": "2.0.2", ++ "resolved": "https://registry.npmjs.org/ky/-/ky-2.0.2.tgz", ++ "integrity": "sha512-/GmXpo9F9W+f8n4Ivr2iH+7h7wL7jLbLKWkMlpflcCRb6kGjBfTlASEXaZ9qUgNTn4VgS0P2pwxxzQ4EM6Ulgg==", ++ "license": "MIT", ++ "engines": { ++ "node": ">=22" ++ }, ++ "funding": { ++ "url": "https://github.com/sindresorhus/ky?sponsor=1" ++ } ++ }, ++ "node_modules/levn": { ++ "version": "0.4.1", ++ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", ++ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "prelude-ls": "^1.2.1", ++ "type-check": "~0.4.0" ++ }, ++ "engines": { ++ "node": ">= 0.8.0" ++ } ++ }, ++ "node_modules/lightningcss": { ++ "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", ++ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", ++ "dev": true, ++ "license": "MPL-2.0", ++ "dependencies": { ++ "detect-libc": "^2.0.3" ++ }, ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ }, ++ "optionalDependencies": { ++ "lightningcss-android-arm64": "1.32.0", ++ "lightningcss-darwin-arm64": "1.32.0", ++ "lightningcss-darwin-x64": "1.32.0", ++ "lightningcss-freebsd-x64": "1.32.0", ++ "lightningcss-linux-arm-gnueabihf": "1.32.0", ++ "lightningcss-linux-arm64-gnu": "1.32.0", ++ "lightningcss-linux-arm64-musl": "1.32.0", ++ "lightningcss-linux-x64-gnu": "1.32.0", ++ "lightningcss-linux-x64-musl": "1.32.0", ++ "lightningcss-win32-arm64-msvc": "1.32.0", ++ "lightningcss-win32-x64-msvc": "1.32.0" ++ } ++ }, ++ "node_modules/lightningcss-android-arm64": { ++ "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", ++ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "android" ++ ], ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ } ++ }, ++ "node_modules/lightningcss-darwin-arm64": { ++ "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", ++ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "darwin" ++ ], ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ } ++ }, ++ "node_modules/lightningcss-darwin-x64": { ++ "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", ++ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "darwin" ++ ], ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ } ++ }, ++ "node_modules/lightningcss-freebsd-x64": { ++ "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", ++ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "freebsd" ++ ], ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ } ++ }, ++ "node_modules/lightningcss-linux-arm-gnueabihf": { ++ "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", ++ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", ++ "cpu": [ ++ "arm" ++ ], ++ "dev": true, ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ } ++ }, ++ "node_modules/lightningcss-linux-arm64-gnu": { ++ "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", ++ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "libc": [ ++ "glibc" ++ ], ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ } ++ }, ++ "node_modules/lightningcss-linux-arm64-musl": { ++ "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", ++ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "libc": [ ++ "musl" ++ ], ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ } ++ }, ++ "node_modules/lightningcss-linux-x64-gnu": { ++ "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", ++ "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "libc": [ ++ "glibc" ++ ], ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ } ++ }, ++ "node_modules/lightningcss-linux-x64-musl": { ++ "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", ++ "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "libc": [ ++ "musl" ++ ], ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ } ++ }, ++ "node_modules/lightningcss-win32-arm64-msvc": { ++ "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", ++ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "win32" ++ ], ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ } ++ }, ++ "node_modules/lightningcss-win32-x64-msvc": { ++ "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", ++ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "win32" ++ ], ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ } ++ }, ++ "node_modules/locate-path": { ++ "version": "6.0.0", ++ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", ++ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "p-locate": "^5.0.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/lodash.camelcase": { ++ "version": "4.3.0", ++ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", ++ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", ++ "license": "MIT" ++ }, ++ "node_modules/lodash.merge": { ++ "version": "4.6.2", ++ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", ++ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/long": { ++ "version": "5.3.2", ++ "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", ++ "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", ++ "license": "Apache-2.0" ++ }, ++ "node_modules/loose-envify": { ++ "version": "1.4.0", ++ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", ++ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", ++ "license": "MIT", ++ "dependencies": { ++ "js-tokens": "^3.0.0 || ^4.0.0" ++ }, ++ "bin": { ++ "loose-envify": "cli.js" ++ } ++ }, ++ "node_modules/lucide-react": { ++ "version": "0.525.0", ++ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.525.0.tgz", ++ "integrity": "sha512-Tm1txJ2OkymCGkvwoHt33Y2JpN5xucVq1slHcgE6Lk0WjDfjgKWor5CdVER8U6DvcfMwh4M8XxmpTiyzfmfDYQ==", ++ "license": "ISC", ++ "peerDependencies": { ++ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" ++ } ++ }, ++ "node_modules/magic-string": { ++ "version": "0.30.21", ++ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", ++ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@jridgewell/sourcemap-codec": "^1.5.5" ++ } ++ }, ++ "node_modules/magicast": { ++ "version": "0.5.3", ++ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", ++ "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@babel/parser": "^7.29.3", ++ "@babel/types": "^7.29.0", ++ "source-map-js": "^1.2.1" ++ } ++ }, ++ "node_modules/make-dir": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", ++ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "semver": "^7.5.3" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/math-intrinsics": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", ++ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", ++ "license": "MIT", ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/mime-db": { ++ "version": "1.52.0", ++ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", ++ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", ++ "license": "MIT", ++ "engines": { ++ "node": ">= 0.6" ++ } ++ }, ++ "node_modules/mime-types": { ++ "version": "2.1.35", ++ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", ++ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", ++ "license": "MIT", ++ "dependencies": { ++ "mime-db": "1.52.0" ++ }, ++ "engines": { ++ "node": ">= 0.6" ++ } ++ }, ++ "node_modules/mini-svg-data-uri": { ++ "version": "1.4.4", ++ "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", ++ "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", ++ "license": "MIT", ++ "bin": { ++ "mini-svg-data-uri": "cli.js" ++ } ++ }, ++ "node_modules/minimatch": { ++ "version": "3.1.5", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", ++ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", ++ "dev": true, ++ "license": "ISC", ++ "dependencies": { ++ "brace-expansion": "^1.1.7" ++ }, ++ "engines": { ++ "node": "*" ++ } ++ }, ++ "node_modules/ms": { ++ "version": "2.1.3", ++ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", ++ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", ++ "license": "MIT" ++ }, ++ "node_modules/nanoid": { ++ "version": "3.3.15", ++ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", ++ "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", ++ "dev": true, ++ "funding": [ ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/ai" ++ } ++ ], ++ "license": "MIT", ++ "bin": { ++ "nanoid": "bin/nanoid.cjs" ++ }, ++ "engines": { ++ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" ++ } ++ }, ++ "node_modules/natural-compare": { ++ "version": "1.4.0", ++ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", ++ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/node-fetch": { ++ "version": "2.7.0", ++ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", ++ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", ++ "license": "MIT", ++ "dependencies": { ++ "whatwg-url": "^5.0.0" ++ }, ++ "engines": { ++ "node": "4.x || >=6.0.0" ++ }, ++ "peerDependencies": { ++ "encoding": "^0.1.0" ++ }, ++ "peerDependenciesMeta": { ++ "encoding": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/nodemon": { ++ "version": "3.1.14", ++ "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.14.tgz", ++ "integrity": "sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "chokidar": "^3.5.2", ++ "debug": "^4", ++ "ignore-by-default": "^1.0.1", ++ "minimatch": "^10.2.1", ++ "pstree.remy": "^1.1.8", ++ "semver": "^7.5.3", ++ "simple-update-notifier": "^2.0.0", ++ "supports-color": "^5.5.0", ++ "touch": "^3.1.0", ++ "undefsafe": "^2.0.5" ++ }, ++ "bin": { ++ "nodemon": "bin/nodemon.js" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/nodemon" ++ } ++ }, ++ "node_modules/nodemon/node_modules/balanced-match": { ++ "version": "4.0.4", ++ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", ++ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": "18 || 20 || >=22" ++ } ++ }, ++ "node_modules/nodemon/node_modules/brace-expansion": { ++ "version": "5.0.6", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", ++ "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "balanced-match": "^4.0.2" ++ }, ++ "engines": { ++ "node": "18 || 20 || >=22" ++ } ++ }, ++ "node_modules/nodemon/node_modules/has-flag": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", ++ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=4" ++ } ++ }, ++ "node_modules/nodemon/node_modules/minimatch": { ++ "version": "10.2.5", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", ++ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", ++ "dev": true, ++ "license": "BlueOak-1.0.0", ++ "dependencies": { ++ "brace-expansion": "^5.0.5" ++ }, ++ "engines": { ++ "node": "18 || 20 || >=22" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/isaacs" ++ } ++ }, ++ "node_modules/nodemon/node_modules/supports-color": { ++ "version": "5.5.0", ++ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", ++ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "has-flag": "^3.0.0" ++ }, ++ "engines": { ++ "node": ">=4" ++ } ++ }, ++ "node_modules/normalize-path": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", ++ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/object-assign": { ++ "version": "4.1.1", ++ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", ++ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", ++ "license": "MIT", ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/object-hash": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", ++ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", ++ "license": "MIT", ++ "engines": { ++ "node": ">= 6" ++ } ++ }, ++ "node_modules/object-inspect": { ++ "version": "1.13.4", ++ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", ++ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", ++ "license": "MIT", ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/obug": { ++ "version": "2.1.3", ++ "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", ++ "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", ++ "dev": true, ++ "funding": [ ++ "https://github.com/sponsors/sxzz", ++ "https://opencollective.com/debug" ++ ], ++ "license": "MIT", ++ "engines": { ++ "node": ">=12.20.0" ++ } ++ }, ++ "node_modules/once": { ++ "version": "1.4.0", ++ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", ++ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", ++ "license": "ISC", ++ "dependencies": { ++ "wrappy": "1" ++ } ++ }, ++ "node_modules/openai": { ++ "version": "6.38.0", ++ "resolved": "https://registry.npmjs.org/openai/-/openai-6.38.0.tgz", ++ "integrity": "sha512-AoMplt2UalrpgUDMh3L09QWjNRlgJPipclQvA6sYAaeF6nHNBMgmikAZGmcYLn8on4d9sQY9Q8bOLfrBS7Lc8g==", ++ "license": "Apache-2.0", ++ "bin": { ++ "openai": "bin/cli" ++ }, ++ "peerDependencies": { ++ "ws": "^8.18.0", ++ "zod": "^3.25 || ^4.0" ++ }, ++ "peerDependenciesMeta": { ++ "ws": { ++ "optional": true ++ }, ++ "zod": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/optionator": { ++ "version": "0.9.4", ++ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", ++ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "deep-is": "^0.1.3", ++ "fast-levenshtein": "^2.0.6", ++ "levn": "^0.4.1", ++ "prelude-ls": "^1.2.1", ++ "type-check": "^0.4.0", ++ "word-wrap": "^1.2.5" ++ }, ++ "engines": { ++ "node": ">= 0.8.0" ++ } ++ }, ++ "node_modules/p-limit": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", ++ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "yocto-queue": "^0.1.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/p-locate": { ++ "version": "5.0.0", ++ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", ++ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "p-limit": "^3.0.2" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/parent-module": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", ++ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "callsites": "^3.0.0" ++ }, ++ "engines": { ++ "node": ">=6" ++ } ++ }, ++ "node_modules/path-exists": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", ++ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/path-expression-matcher": { ++ "version": "1.5.0", ++ "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", ++ "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", ++ "funding": [ ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/NaturalIntelligence" ++ } ++ ], ++ "license": "MIT", ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/path-key": { ++ "version": "3.1.1", ++ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", ++ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/pathe": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", ++ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/picocolors": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", ++ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", ++ "dev": true, ++ "license": "ISC" ++ }, ++ "node_modules/picomatch": { ++ "version": "4.0.4", ++ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", ++ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=12" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/jonschlinkert" ++ } ++ }, ++ "node_modules/postcss": { ++ "version": "8.5.16", ++ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", ++ "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", ++ "dev": true, ++ "funding": [ ++ { ++ "type": "opencollective", ++ "url": "https://opencollective.com/postcss/" ++ }, ++ { ++ "type": "tidelift", ++ "url": "https://tidelift.com/funding/github/npm/postcss" ++ }, ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/ai" ++ } ++ ], ++ "license": "MIT", ++ "dependencies": { ++ "nanoid": "^3.3.12", ++ "picocolors": "^1.1.1", ++ "source-map-js": "^1.2.1" ++ }, ++ "engines": { ++ "node": "^10 || ^12 || >=14" ++ } ++ }, ++ "node_modules/postcss-selector-parser": { ++ "version": "6.0.10", ++ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", ++ "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", ++ "license": "MIT", ++ "dependencies": { ++ "cssesc": "^3.0.0", ++ "util-deprecate": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">=4" ++ } ++ }, ++ "node_modules/prelude-ls": { ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", ++ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">= 0.8.0" ++ } ++ }, ++ "node_modules/prettier": { ++ "version": "3.1.1", ++ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", ++ "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", ++ "license": "MIT", ++ "bin": { ++ "prettier": "bin/prettier.cjs" ++ }, ++ "engines": { ++ "node": ">=14" ++ }, ++ "funding": { ++ "url": "https://github.com/prettier/prettier?sponsor=1" ++ } ++ }, ++ "node_modules/prettier-plugin-tailwindcss": { ++ "version": "0.7.4", ++ "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.7.4.tgz", ++ "integrity": "sha512-UKii4RjY05SNt/WQi6/NcOn/LsT0/ILLXsxygjbRg5/YZelsSu5jTqorYHPDGq4nZy5q5hpCu+XdGZ1xaJEQgw==", ++ "license": "MIT", ++ "engines": { ++ "node": ">=20.19" ++ }, ++ "peerDependencies": { ++ "@ianvs/prettier-plugin-sort-imports": "*", ++ "@prettier/plugin-hermes": "*", ++ "@prettier/plugin-oxc": "*", ++ "@prettier/plugin-pug": "*", ++ "@shopify/prettier-plugin-liquid": "*", ++ "@trivago/prettier-plugin-sort-imports": "*", ++ "@zackad/prettier-plugin-twig": "*", ++ "prettier": "^3.0", ++ "prettier-plugin-astro": "*", ++ "prettier-plugin-css-order": "*", ++ "prettier-plugin-jsdoc": "*", ++ "prettier-plugin-marko": "*", ++ "prettier-plugin-multiline-arrays": "*", ++ "prettier-plugin-organize-attributes": "*", ++ "prettier-plugin-organize-imports": "*", ++ "prettier-plugin-sort-imports": "*", ++ "prettier-plugin-svelte": "*" ++ }, ++ "peerDependenciesMeta": { ++ "@ianvs/prettier-plugin-sort-imports": { ++ "optional": true ++ }, ++ "@prettier/plugin-hermes": { ++ "optional": true ++ }, ++ "@prettier/plugin-oxc": { ++ "optional": true ++ }, ++ "@prettier/plugin-pug": { ++ "optional": true ++ }, ++ "@shopify/prettier-plugin-liquid": { ++ "optional": true ++ }, ++ "@trivago/prettier-plugin-sort-imports": { ++ "optional": true ++ }, ++ "@zackad/prettier-plugin-twig": { ++ "optional": true ++ }, ++ "prettier-plugin-astro": { ++ "optional": true ++ }, ++ "prettier-plugin-css-order": { ++ "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-svelte": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/prisma": { ++ "version": "5.19.1", ++ "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.19.1.tgz", ++ "integrity": "sha512-c5K9MiDaa+VAAyh1OiYk76PXOme9s3E992D7kvvIOhCrNsBQfy2mP2QAQtX0WNj140IgG++12kwZpYB9iIydNQ==", ++ "dev": true, ++ "hasInstallScript": true, ++ "license": "Apache-2.0", ++ "dependencies": { ++ "@prisma/engines": "5.19.1" ++ }, ++ "bin": { ++ "prisma": "build/index.js" ++ }, ++ "engines": { ++ "node": ">=16.13" ++ }, ++ "optionalDependencies": { ++ "fsevents": "2.3.3" ++ } ++ }, ++ "node_modules/prop-types": { ++ "version": "15.8.1", ++ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", ++ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", ++ "license": "MIT", ++ "dependencies": { ++ "loose-envify": "^1.4.0", ++ "object-assign": "^4.1.1", ++ "react-is": "^16.13.1" ++ } ++ }, ++ "node_modules/proto3-json-serializer": { ++ "version": "2.0.2", ++ "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz", ++ "integrity": "sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "protobufjs": "^7.2.5" ++ }, ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/protobufjs": { ++ "version": "7.5.9", ++ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.9.tgz", ++ "integrity": "sha512-Od4muIm3HW1AouyHF5lONOf1FWo3hY1NbFDoy191X9GzhpgW1clCoaFjfVs2rKJNFYpTNJbje4cbAIDBZJ63ZA==", ++ "hasInstallScript": true, ++ "license": "BSD-3-Clause", ++ "dependencies": { ++ "@protobufjs/aspromise": "^1.1.2", ++ "@protobufjs/base64": "^1.1.2", ++ "@protobufjs/codegen": "^2.0.5", ++ "@protobufjs/eventemitter": "^1.1.0", ++ "@protobufjs/fetch": "^1.1.1", ++ "@protobufjs/float": "^1.0.2", ++ "@protobufjs/inquire": "^1.1.2", ++ "@protobufjs/path": "^1.1.2", ++ "@protobufjs/pool": "^1.1.0", ++ "@protobufjs/utf8": "^1.1.1", ++ "@types/node": ">=13.7.0", ++ "long": "^5.0.0" ++ }, ++ "engines": { ++ "node": ">=12.0.0" ++ } ++ }, ++ "node_modules/pstree.remy": { ++ "version": "1.1.8", ++ "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", ++ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/punycode": { ++ "version": "2.3.1", ++ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", ++ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=6" ++ } ++ }, ++ "node_modules/qs": { ++ "version": "6.15.2", ++ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", ++ "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", ++ "license": "BSD-3-Clause", ++ "dependencies": { ++ "side-channel": "^1.1.0" ++ }, ++ "engines": { ++ "node": ">=0.6" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/react": { ++ "version": "19.2.7", ++ "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", ++ "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", ++ "license": "MIT", ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/react-apexcharts": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-2.1.0.tgz", ++ "integrity": "sha512-xrmeTKRKHh3cvvLc8SasqFjlOgIqGpyHc81qjnRtcjUM0Fu7qEjgVRWGPokGFjqhwRZVgEym8zmuEyYr5LMYIg==", ++ "license": "SEE LICENSE IN LICENSE", ++ "dependencies": { ++ "prop-types": "^15.8.1" ++ }, ++ "peerDependencies": { ++ "apexcharts": ">=5.10.1", ++ "react": ">=16.8.0" ++ } ++ }, ++ "node_modules/react-dom": { ++ "version": "19.2.7", ++ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", ++ "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", ++ "license": "MIT", ++ "dependencies": { ++ "scheduler": "^0.27.0" ++ }, ++ "peerDependencies": { ++ "react": "^19.2.7" ++ } ++ }, ++ "node_modules/react-hook-form": { ++ "version": "7.76.0", ++ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.76.0.tgz", ++ "integrity": "sha512-eKtLGgFeSgkHqQD8J59AMZ9a4uD1D83iSIzt4YlTGD7liDen5rrjcUO1rVIGd9yC1gofryjtHbv+4ny4hkLWlw==", ++ "license": "MIT", ++ "engines": { ++ "node": ">=18.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/react-hook-form" ++ }, ++ "peerDependencies": { ++ "react": "^16.8.0 || ^17 || ^18 || ^19" ++ } ++ }, ++ "node_modules/react-icons": { ++ "version": "5.6.0", ++ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.6.0.tgz", ++ "integrity": "sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==", ++ "license": "MIT", ++ "peerDependencies": { ++ "react": "*" ++ } ++ }, ++ "node_modules/react-is": { ++ "version": "16.13.1", ++ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", ++ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", ++ "license": "MIT" ++ }, ++ "node_modules/react-remove-scroll": { ++ "version": "2.7.2", ++ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", ++ "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", ++ "license": "MIT", ++ "dependencies": { ++ "react-remove-scroll-bar": "^2.3.7", ++ "react-style-singleton": "^2.2.3", ++ "tslib": "^2.1.0", ++ "use-callback-ref": "^1.3.3", ++ "use-sidecar": "^1.1.3" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/react-remove-scroll-bar": { ++ "version": "2.3.8", ++ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", ++ "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", ++ "license": "MIT", ++ "dependencies": { ++ "react-style-singleton": "^2.2.2", ++ "tslib": "^2.0.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/react-router": { ++ "version": "8.1.0", ++ "resolved": "https://registry.npmjs.org/react-router/-/react-router-8.1.0.tgz", ++ "integrity": "sha512-Mdfi61uObuvWNN9OhChOC0HV6YWOIfKRzEWOvCHRSuQg8IM+Nv10edaM/2HE8ZixBpUTdQbruyWqC3sDkkh9vw==", ++ "license": "MIT", ++ "dependencies": { ++ "cookie-es": "^3.1.1" ++ }, ++ "engines": { ++ "node": ">=22.22.0" ++ }, ++ "peerDependencies": { ++ "react": ">=19.2.7", ++ "react-dom": ">=19.2.7" ++ }, ++ "peerDependenciesMeta": { ++ "react-dom": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/react-style-singleton": { ++ "version": "2.2.3", ++ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", ++ "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", ++ "license": "MIT", ++ "dependencies": { ++ "get-nonce": "^1.0.0", ++ "tslib": "^2.0.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/readable-stream": { ++ "version": "3.6.2", ++ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", ++ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", ++ "license": "MIT", ++ "dependencies": { ++ "inherits": "^2.0.3", ++ "string_decoder": "^1.1.1", ++ "util-deprecate": "^1.0.1" ++ }, ++ "engines": { ++ "node": ">= 6" ++ } ++ }, ++ "node_modules/readdirp": { ++ "version": "3.6.0", ++ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", ++ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "picomatch": "^2.2.1" ++ }, ++ "engines": { ++ "node": ">=8.10.0" ++ } ++ }, ++ "node_modules/readdirp/node_modules/picomatch": { ++ "version": "2.3.2", ++ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", ++ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=8.6" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/jonschlinkert" ++ } ++ }, ++ "node_modules/require-directory": { ++ "version": "2.1.1", ++ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", ++ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", ++ "license": "MIT", ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/resolve-from": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", ++ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=4" ++ } ++ }, ++ "node_modules/retry-request": { ++ "version": "7.0.2", ++ "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", ++ "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", ++ "license": "MIT", ++ "dependencies": { ++ "@types/request": "^2.48.8", ++ "extend": "^3.0.2", ++ "teeny-request": "^9.0.0" ++ }, ++ "engines": { ++ "node": ">=14" ++ } ++ }, ++ "node_modules/rolldown": { ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.4.tgz", ++ "integrity": "sha512-IjZYiLxZwpnhwhdBH2ugdTGVSdhCQUmLxLoqyjiL0JxYjyRst+5a0P3xfrTxJ5F638j4Mvvw5FAX5XE6eHpXbA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@oxc-project/types": "=0.138.0", ++ "@rolldown/pluginutils": "^1.0.0" ++ }, ++ "bin": { ++ "rolldown": "bin/cli.mjs" ++ }, ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ }, ++ "optionalDependencies": { ++ "@rolldown/binding-android-arm64": "1.1.4", ++ "@rolldown/binding-darwin-arm64": "1.1.4", ++ "@rolldown/binding-darwin-x64": "1.1.4", ++ "@rolldown/binding-freebsd-x64": "1.1.4", ++ "@rolldown/binding-linux-arm-gnueabihf": "1.1.4", ++ "@rolldown/binding-linux-arm64-gnu": "1.1.4", ++ "@rolldown/binding-linux-arm64-musl": "1.1.4", ++ "@rolldown/binding-linux-ppc64-gnu": "1.1.4", ++ "@rolldown/binding-linux-s390x-gnu": "1.1.4", ++ "@rolldown/binding-linux-x64-gnu": "1.1.4", ++ "@rolldown/binding-linux-x64-musl": "1.1.4", ++ "@rolldown/binding-openharmony-arm64": "1.1.4", ++ "@rolldown/binding-wasm32-wasi": "1.1.4", ++ "@rolldown/binding-win32-arm64-msvc": "1.1.4", ++ "@rolldown/binding-win32-x64-msvc": "1.1.4" ++ } ++ }, ++ "node_modules/rolldown/node_modules/@rolldown/pluginutils": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", ++ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/safe-buffer": { ++ "version": "5.2.1", ++ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", ++ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", ++ "funding": [ ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/feross" ++ }, ++ { ++ "type": "patreon", ++ "url": "https://www.patreon.com/feross" ++ }, ++ { ++ "type": "consulting", ++ "url": "https://feross.org/support" ++ } ++ ], ++ "license": "MIT" ++ }, ++ "node_modules/scheduler": { ++ "version": "0.27.0", ++ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", ++ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", ++ "license": "MIT" ++ }, ++ "node_modules/semver": { ++ "version": "7.8.0", ++ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", ++ "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", ++ "dev": true, ++ "license": "ISC", ++ "bin": { ++ "semver": "bin/semver.js" ++ }, ++ "engines": { ++ "node": ">=10" ++ } ++ }, ++ "node_modules/shebang-command": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", ++ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "shebang-regex": "^3.0.0" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/shebang-regex": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", ++ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/side-channel": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", ++ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", ++ "license": "MIT", ++ "dependencies": { ++ "es-errors": "^1.3.0", ++ "object-inspect": "^1.13.3", ++ "side-channel-list": "^1.0.0", ++ "side-channel-map": "^1.0.1", ++ "side-channel-weakmap": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/side-channel-list": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", ++ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", ++ "license": "MIT", ++ "dependencies": { ++ "es-errors": "^1.3.0", ++ "object-inspect": "^1.13.4" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/side-channel-map": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", ++ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", ++ "license": "MIT", ++ "dependencies": { ++ "call-bound": "^1.0.2", ++ "es-errors": "^1.3.0", ++ "get-intrinsic": "^1.2.5", ++ "object-inspect": "^1.13.3" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/side-channel-weakmap": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", ++ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", ++ "license": "MIT", ++ "dependencies": { ++ "call-bound": "^1.0.2", ++ "es-errors": "^1.3.0", ++ "get-intrinsic": "^1.2.5", ++ "object-inspect": "^1.13.3", ++ "side-channel-map": "^1.0.1" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/siginfo": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", ++ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", ++ "dev": true, ++ "license": "ISC" ++ }, ++ "node_modules/simple-update-notifier": { ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", ++ "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "semver": "^7.5.3" ++ }, ++ "engines": { ++ "node": ">=10" ++ } ++ }, ++ "node_modules/source-map-js": { ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", ++ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", ++ "dev": true, ++ "license": "BSD-3-Clause", ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/stackback": { ++ "version": "0.0.2", ++ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", ++ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/std-env": { ++ "version": "4.1.0", ++ "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", ++ "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/stream-events": { ++ "version": "1.0.5", ++ "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", ++ "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", ++ "license": "MIT", ++ "dependencies": { ++ "stubs": "^3.0.0" ++ } ++ }, ++ "node_modules/stream-shift": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", ++ "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", ++ "license": "MIT" ++ }, ++ "node_modules/string_decoder": { ++ "version": "1.3.0", ++ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", ++ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", ++ "license": "MIT", ++ "dependencies": { ++ "safe-buffer": "~5.2.0" ++ } ++ }, ++ "node_modules/string-width": { ++ "version": "4.2.3", ++ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", ++ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", ++ "license": "MIT", ++ "dependencies": { ++ "emoji-regex": "^8.0.0", ++ "is-fullwidth-code-point": "^3.0.0", ++ "strip-ansi": "^6.0.1" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/strip-ansi": { ++ "version": "6.0.1", ++ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", ++ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", ++ "license": "MIT", ++ "dependencies": { ++ "ansi-regex": "^5.0.1" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/strip-json-comments": { ++ "version": "3.1.1", ++ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", ++ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=8" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/stripe": { ++ "version": "18.1.0", ++ "resolved": "https://registry.npmjs.org/stripe/-/stripe-18.1.0.tgz", ++ "integrity": "sha512-MLDiniPTHqcfIT3anyBPmOEcaiDhYa7/jRaNypQ3Rt2SJnayQZBvVbFghIziUCZdltGAndm/ZxVOSw6uuSCDig==", ++ "license": "MIT", ++ "dependencies": { ++ "qs": "^6.11.0" ++ }, ++ "engines": { ++ "node": ">=12.*" ++ }, ++ "peerDependencies": { ++ "@types/node": ">=12.x.x" ++ }, ++ "peerDependenciesMeta": { ++ "@types/node": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/strnum": { ++ "version": "2.3.0", ++ "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.3.0.tgz", ++ "integrity": "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==", ++ "funding": [ ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/NaturalIntelligence" ++ } ++ ], ++ "license": "MIT" ++ }, ++ "node_modules/stubs": { ++ "version": "3.0.0", ++ "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", ++ "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", ++ "license": "MIT" ++ }, ++ "node_modules/supports-color": { ++ "version": "7.2.0", ++ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", ++ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "has-flag": "^4.0.0" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/tagged-tag": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", ++ "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=20" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/tailwind-merge": { ++ "version": "2.6.1", ++ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.1.tgz", ++ "integrity": "sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==", ++ "license": "MIT", ++ "funding": { ++ "type": "github", ++ "url": "https://github.com/sponsors/dcastil" ++ } ++ }, ++ "node_modules/tailwindcss": { ++ "version": "4.3.2", ++ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz", ++ "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==", ++ "license": "MIT" ++ }, ++ "node_modules/tailwindcss-animate": { ++ "version": "1.0.7", ++ "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", ++ "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", ++ "license": "MIT", ++ "peerDependencies": { ++ "tailwindcss": ">=3.0.0 || insiders" ++ } ++ }, ++ "node_modules/tapable": { ++ "version": "2.3.3", ++ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", ++ "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=6" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/webpack" ++ } ++ }, ++ "node_modules/teeny-request": { ++ "version": "9.0.0", ++ "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", ++ "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", ++ "license": "Apache-2.0", ++ "dependencies": { ++ "http-proxy-agent": "^5.0.0", ++ "https-proxy-agent": "^5.0.0", ++ "node-fetch": "^2.6.9", ++ "stream-events": "^1.0.5", ++ "uuid": "^9.0.0" ++ }, ++ "engines": { ++ "node": ">=14" ++ } ++ }, ++ "node_modules/tinybench": { ++ "version": "2.9.0", ++ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", ++ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/tinyexec": { ++ "version": "1.1.2", ++ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", ++ "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=18" ++ } ++ }, ++ "node_modules/tinyglobby": { ++ "version": "0.2.17", ++ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", ++ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "fdir": "^6.5.0", ++ "picomatch": "^4.0.4" ++ }, ++ "engines": { ++ "node": ">=12.0.0" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/SuperchupuDev" ++ } ++ }, ++ "node_modules/tinyrainbow": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", ++ "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, ++ "node_modules/to-regex-range": { ++ "version": "5.0.1", ++ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", ++ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "is-number": "^7.0.0" ++ }, ++ "engines": { ++ "node": ">=8.0" ++ } ++ }, ++ "node_modules/touch": { ++ "version": "3.1.1", ++ "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", ++ "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", ++ "dev": true, ++ "license": "ISC", ++ "bin": { ++ "nodetouch": "bin/nodetouch.js" ++ } ++ }, ++ "node_modules/tr46": { ++ "version": "0.0.3", ++ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", ++ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", ++ "license": "MIT" ++ }, ++ "node_modules/ts-api-utils": { ++ "version": "2.5.0", ++ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", ++ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=18.12" ++ }, ++ "peerDependencies": { ++ "typescript": ">=4.8.4" ++ } ++ }, ++ "node_modules/tslib": { ++ "version": "2.8.1", ++ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", ++ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", ++ "license": "0BSD" ++ }, ++ "node_modules/type-check": { ++ "version": "0.4.0", ++ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", ++ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "prelude-ls": "^1.2.1" ++ }, ++ "engines": { ++ "node": ">= 0.8.0" ++ } ++ }, ++ "node_modules/type-fest": { ++ "version": "5.6.0", ++ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.6.0.tgz", ++ "integrity": "sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==", ++ "dev": true, ++ "license": "(MIT OR CC0-1.0)", ++ "dependencies": { ++ "tagged-tag": "^1.0.0" ++ }, ++ "engines": { ++ "node": ">=20" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/typescript": { ++ "version": "6.0.3", ++ "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", ++ "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", ++ "dev": true, ++ "license": "Apache-2.0", ++ "bin": { ++ "tsc": "bin/tsc", ++ "tsserver": "bin/tsserver" ++ }, ++ "engines": { ++ "node": ">=14.17" ++ } ++ }, ++ "node_modules/typescript-eslint": { ++ "version": "8.59.3", ++ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.3.tgz", ++ "integrity": "sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@typescript-eslint/eslint-plugin": "8.59.3", ++ "@typescript-eslint/parser": "8.59.3", ++ "@typescript-eslint/typescript-estree": "8.59.3", ++ "@typescript-eslint/utils": "8.59.3" ++ }, ++ "engines": { ++ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/typescript-eslint" ++ }, ++ "peerDependencies": { ++ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", ++ "typescript": ">=4.8.4 <6.1.0" ++ } ++ }, ++ "node_modules/undefsafe": { ++ "version": "2.0.5", ++ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", ++ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/undici-types": { ++ "version": "7.16.0", ++ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", ++ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", ++ "license": "MIT" ++ }, ++ "node_modules/unrun": { ++ "version": "0.3.1", ++ "resolved": "https://registry.npmjs.org/unrun/-/unrun-0.3.1.tgz", ++ "integrity": "sha512-onIck/oNnCaytwths1ZVp1LK2Gq2hPoyFhiHebObuUXqR3S0uHuLLaBK8K6mRRgV7Ptip8AnNvaUsgzwWwBZuA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "rolldown": "^1.0.0" ++ }, ++ "bin": { ++ "unrun": "dist/cli.mjs" ++ }, ++ "engines": { ++ "node": "^22.13.0 || >=24.0.0" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/Gugustinette" ++ }, ++ "peerDependencies": { ++ "synckit": "^0.11.11" ++ }, ++ "peerDependenciesMeta": { ++ "synckit": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/uri-js": { ++ "version": "4.4.1", ++ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", ++ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", ++ "dev": true, ++ "license": "BSD-2-Clause", ++ "dependencies": { ++ "punycode": "^2.1.0" ++ } ++ }, ++ "node_modules/use-callback-ref": { ++ "version": "1.3.3", ++ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", ++ "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", ++ "license": "MIT", ++ "dependencies": { ++ "tslib": "^2.0.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/use-sidecar": { ++ "version": "1.1.3", ++ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", ++ "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", ++ "license": "MIT", ++ "dependencies": { ++ "detect-node-es": "^1.1.0", ++ "tslib": "^2.0.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "peerDependencies": { ++ "@types/react": "*", ++ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" ++ }, ++ "peerDependenciesMeta": { ++ "@types/react": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/use-sync-external-store": { ++ "version": "1.6.0", ++ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", ++ "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", ++ "license": "MIT", ++ "peerDependencies": { ++ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" ++ } ++ }, ++ "node_modules/util-deprecate": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", ++ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", ++ "license": "MIT" ++ }, ++ "node_modules/uuid": { ++ "version": "9.0.1", ++ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", ++ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", ++ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", ++ "funding": [ ++ "https://github.com/sponsors/broofa", ++ "https://github.com/sponsors/ctavan" ++ ], ++ "license": "MIT", ++ "bin": { ++ "uuid": "dist/bin/uuid" ++ } ++ }, ++ "node_modules/vanilla-cookieconsent": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/vanilla-cookieconsent/-/vanilla-cookieconsent-3.1.0.tgz", ++ "integrity": "sha512-/McNRtm/3IXzb9dhqMIcbquoU45SzbN2VB+To4jxEPqMmp7uVniP6BhGLjU8MC7ZCDsNQVOp27fhQTM/ruIXAA==", ++ "license": "MIT" ++ }, ++ "node_modules/vite": { ++ "version": "8.1.2", ++ "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.2.tgz", ++ "integrity": "sha512-6YYPbRXTxx6bRXmOn7XdnQAy5DQNHhDgtjhDHI13oe4pY93kkcdGJWxpGwOm++/Wh0QpQhDrpIoVMrmrsI5AGQ==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "lightningcss": "^1.32.0", ++ "picomatch": "^4.0.4", ++ "postcss": "^8.5.16", ++ "rolldown": "~1.1.3", ++ "tinyglobby": "^0.2.17" ++ }, ++ "bin": { ++ "vite": "bin/vite.js" ++ }, ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ }, ++ "funding": { ++ "url": "https://github.com/vitejs/vite?sponsor=1" ++ }, ++ "optionalDependencies": { ++ "fsevents": "~2.3.3" ++ }, ++ "peerDependencies": { ++ "@types/node": "^20.19.0 || >=22.12.0", ++ "@vitejs/devtools": "^0.3.0", ++ "esbuild": "^0.27.0 || ^0.28.0", ++ "jiti": ">=1.21.0", ++ "less": "^4.0.0", ++ "sass": "^1.70.0", ++ "sass-embedded": "^1.70.0", ++ "stylus": ">=0.54.8", ++ "sugarss": "^5.0.0", ++ "terser": "^5.16.0", ++ "tsx": "^4.8.1", ++ "yaml": "^2.4.2" ++ }, ++ "peerDependenciesMeta": { ++ "@types/node": { ++ "optional": true ++ }, ++ "@vitejs/devtools": { ++ "optional": true ++ }, ++ "esbuild": { ++ "optional": true ++ }, ++ "jiti": { ++ "optional": true ++ }, ++ "less": { ++ "optional": true ++ }, ++ "sass": { ++ "optional": true ++ }, ++ "sass-embedded": { ++ "optional": true ++ }, ++ "stylus": { ++ "optional": true ++ }, ++ "sugarss": { ++ "optional": true ++ }, ++ "terser": { ++ "optional": true ++ }, ++ "tsx": { ++ "optional": true ++ }, ++ "yaml": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/vitest": { ++ "version": "4.1.9", ++ "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.9.tgz", ++ "integrity": "sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@vitest/expect": "4.1.9", ++ "@vitest/mocker": "4.1.9", ++ "@vitest/pretty-format": "4.1.9", ++ "@vitest/runner": "4.1.9", ++ "@vitest/snapshot": "4.1.9", ++ "@vitest/spy": "4.1.9", ++ "@vitest/utils": "4.1.9", ++ "es-module-lexer": "^2.0.0", ++ "expect-type": "^1.3.0", ++ "magic-string": "^0.30.21", ++ "obug": "^2.1.1", ++ "pathe": "^2.0.3", ++ "picomatch": "^4.0.3", ++ "std-env": "^4.0.0-rc.1", ++ "tinybench": "^2.9.0", ++ "tinyexec": "^1.0.2", ++ "tinyglobby": "^0.2.15", ++ "tinyrainbow": "^3.1.0", ++ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", ++ "why-is-node-running": "^2.3.0" ++ }, ++ "bin": { ++ "vitest": "vitest.mjs" ++ }, ++ "engines": { ++ "node": "^20.0.0 || ^22.0.0 || >=24.0.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/vitest" ++ }, ++ "peerDependencies": { ++ "@edge-runtime/vm": "*", ++ "@opentelemetry/api": "^1.9.0", ++ "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", ++ "@vitest/browser-playwright": "4.1.9", ++ "@vitest/browser-preview": "4.1.9", ++ "@vitest/browser-webdriverio": "4.1.9", ++ "@vitest/coverage-istanbul": "4.1.9", ++ "@vitest/coverage-v8": "4.1.9", ++ "@vitest/ui": "4.1.9", ++ "happy-dom": "*", ++ "jsdom": "*", ++ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" ++ }, ++ "peerDependenciesMeta": { ++ "@edge-runtime/vm": { ++ "optional": true ++ }, ++ "@opentelemetry/api": { ++ "optional": true ++ }, ++ "@types/node": { ++ "optional": true ++ }, ++ "@vitest/browser-playwright": { ++ "optional": true ++ }, ++ "@vitest/browser-preview": { ++ "optional": true ++ }, ++ "@vitest/browser-webdriverio": { ++ "optional": true ++ }, ++ "@vitest/coverage-istanbul": { ++ "optional": true ++ }, ++ "@vitest/coverage-v8": { ++ "optional": true ++ }, ++ "@vitest/ui": { ++ "optional": true ++ }, ++ "happy-dom": { ++ "optional": true ++ }, ++ "jsdom": { ++ "optional": true ++ }, ++ "vite": { ++ "optional": false ++ } ++ } ++ }, ++ "node_modules/webidl-conversions": { ++ "version": "3.0.1", ++ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", ++ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", ++ "license": "BSD-2-Clause" ++ }, ++ "node_modules/whatwg-url": { ++ "version": "5.0.0", ++ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", ++ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", ++ "license": "MIT", ++ "dependencies": { ++ "tr46": "~0.0.3", ++ "webidl-conversions": "^3.0.0" ++ } ++ }, ++ "node_modules/which": { ++ "version": "2.0.2", ++ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", ++ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", ++ "dev": true, ++ "license": "ISC", ++ "dependencies": { ++ "isexe": "^2.0.0" ++ }, ++ "bin": { ++ "node-which": "bin/node-which" ++ }, ++ "engines": { ++ "node": ">= 8" ++ } ++ }, ++ "node_modules/why-is-node-running": { ++ "version": "2.3.0", ++ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", ++ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "siginfo": "^2.0.0", ++ "stackback": "0.0.2" ++ }, ++ "bin": { ++ "why-is-node-running": "cli.js" ++ }, ++ "engines": { ++ "node": ">=8" ++ } ++ }, ++ "node_modules/word-wrap": { ++ "version": "1.2.5", ++ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", ++ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=0.10.0" ++ } ++ }, ++ "node_modules/wrap-ansi": { ++ "version": "7.0.0", ++ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", ++ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", ++ "license": "MIT", ++ "dependencies": { ++ "ansi-styles": "^4.0.0", ++ "string-width": "^4.1.0", ++ "strip-ansi": "^6.0.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" ++ } ++ }, ++ "node_modules/wrappy": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", ++ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", ++ "license": "ISC" ++ }, ++ "node_modules/xml-naming": { ++ "version": "0.1.0", ++ "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", ++ "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", ++ "funding": [ ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/NaturalIntelligence" ++ } ++ ], ++ "license": "MIT", ++ "engines": { ++ "node": ">=16.0.0" ++ } ++ }, ++ "node_modules/y18n": { ++ "version": "5.0.8", ++ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", ++ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", ++ "license": "ISC", ++ "engines": { ++ "node": ">=10" ++ } ++ }, ++ "node_modules/yargs": { ++ "version": "17.7.2", ++ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", ++ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", ++ "license": "MIT", ++ "dependencies": { ++ "cliui": "^8.0.1", ++ "escalade": "^3.1.1", ++ "get-caller-file": "^2.0.5", ++ "require-directory": "^2.1.1", ++ "string-width": "^4.2.3", ++ "y18n": "^5.0.5", ++ "yargs-parser": "^21.1.1" ++ }, ++ "engines": { ++ "node": ">=12" ++ } ++ }, ++ "node_modules/yargs-parser": { ++ "version": "21.1.1", ++ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", ++ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", ++ "license": "ISC", ++ "engines": { ++ "node": ">=12" ++ } ++ }, ++ "node_modules/yocto-queue": { ++ "version": "0.1.0", ++ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", ++ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/zod": { ++ "version": "4.4.3", ++ "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", ++ "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", ++ "license": "MIT", ++ "funding": { ++ "url": "https://github.com/sponsors/colinhacks" ++ } ++ } ++ } ++} diff --git a/opensaas-sh/app_diff/package.json.diff b/opensaas-sh/app_diff/package.json.diff new file mode 100644 index 0000000..954f67b --- /dev/null +++ b/opensaas-sh/app_diff/package.json.diff @@ -0,0 +1,32 @@ +--- template/app/package.json ++++ opensaas-sh/app/package.json +@@ -5,14 +5,19 @@ + ".wasp/out/*", + ".wasp/out/sdk/wasp" + ], ++ "scripts": { ++ "generate-llms-txt": "node ./scripts/generate-llms-txt.mjs", ++ "predeploy": "npm run generate-llms-txt", ++ "deploy": "REACT_APP_GOOGLE_ANALYTICS_ID=G-H3LSJCK95H wasp deploy fly deploy", ++ "env:pull": "npx dotenv-vault@latest pull development .env.server", ++ "env:push": "npx dotenv-vault@latest push development .env.server" ++ }, + "dependencies": { + "@aws-sdk/client-s3": "^3.523.0", + "@aws-sdk/s3-presigned-post": "^3.750.0", + "@aws-sdk/s3-request-presigner": "^3.523.0", + "@google-analytics/data": "4.1.0", + "@hookform/resolvers": "^5.1.1", +- "@lemonsqueezy/lemonsqueezy.js": "^3.2.0", +- "@polar-sh/sdk": "^0.34.3", + "@radix-ui/react-accordion": "^1.2.11", + "@radix-ui/react-avatar": "^1.1.10", + "@radix-ui/react-checkbox": "^1.3.2", +@@ -39,6 +44,7 @@ + "react-apexcharts": "2.1.0", + "react-dom": "^19.2.1", + "react-hook-form": "^7.60.0", ++ "react-icons": "^5.5.0", + "react-router": "^8.0.1", + "stripe": "18.1.0", + "tailwind-merge": "^2.2.1", diff --git a/opensaas-sh/app_diff/public/fonts/Satoshi-Black.woff2.copy b/opensaas-sh/app_diff/public/fonts/Satoshi-Black.woff2.copy new file mode 100644 index 0000000..64492d5 Binary files /dev/null and b/opensaas-sh/app_diff/public/fonts/Satoshi-Black.woff2.copy differ diff --git a/opensaas-sh/app_diff/public/fonts/Satoshi-Bold.woff2.copy b/opensaas-sh/app_diff/public/fonts/Satoshi-Bold.woff2.copy new file mode 100644 index 0000000..0a8db7a Binary files /dev/null and b/opensaas-sh/app_diff/public/fonts/Satoshi-Bold.woff2.copy differ diff --git a/opensaas-sh/app_diff/public/fonts/Satoshi-Light.woff2.copy b/opensaas-sh/app_diff/public/fonts/Satoshi-Light.woff2.copy new file mode 100644 index 0000000..cf18cd4 Binary files /dev/null and b/opensaas-sh/app_diff/public/fonts/Satoshi-Light.woff2.copy differ diff --git a/opensaas-sh/app_diff/public/fonts/Satoshi-Medium.woff2.copy b/opensaas-sh/app_diff/public/fonts/Satoshi-Medium.woff2.copy new file mode 100644 index 0000000..ffd0ac9 Binary files /dev/null and b/opensaas-sh/app_diff/public/fonts/Satoshi-Medium.woff2.copy differ diff --git a/opensaas-sh/app_diff/public/fonts/Satoshi-Regular.woff2.copy b/opensaas-sh/app_diff/public/fonts/Satoshi-Regular.woff2.copy new file mode 100644 index 0000000..81c40ab Binary files /dev/null and b/opensaas-sh/app_diff/public/fonts/Satoshi-Regular.woff2.copy differ diff --git a/opensaas-sh/app_diff/public/scripts/posthog.js.diff b/opensaas-sh/app_diff/public/scripts/posthog.js.diff new file mode 100644 index 0000000..4bf46b8 --- /dev/null +++ b/opensaas-sh/app_diff/public/scripts/posthog.js.diff @@ -0,0 +1,9 @@ +--- template/app/public/scripts/posthog.js ++++ opensaas-sh/app/public/scripts/posthog.js +@@ -0,0 +1,5 @@ ++!function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="init capture register register_once register_for_session unregister unregister_for_session getFeatureFlag getFeatureFlagPayload isFeatureEnabled reloadFeatureFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSessionId getSurveys getActiveMatchingSurveys renderSurvey canRenderSurvey identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException loadToolbar get_property getSessionProperty createPersonProfile opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing clear_opt_in_out_capturing debug getPageViewId captureTraceFeedback captureTraceMetric".split(" "),n=0;n b.date.localeCompare(a.date)); ++ return posts; ++} ++ ++function renderLlmsTxt(posts) { ++ const lines = [ ++ "# Open SaaS", ++ "", ++ "> Open SaaS is a free, open-source, full-stack SaaS boilerplate starter kit built on the Wasp framework (React, Node.js, Prisma). It ships with auth, Stripe/Lemon Squeezy/Polar payments, an OpenAI demo app, AWS S3 file uploads, an admin dashboard, email sending, and AI agent rules and skills.", ++ "", ++ "## Site", ++ "- [Homepage](https://opensaas.sh): product overview, features, demo, FAQ, etc.", ++ "- [GitHub repository](https://github.com/wasp-lang/open-saas): source code, issues, and releases", ++ "", ++ "## Documentation", ++ `- [Documentation site](${DOCS_SITE}/)`, ++ `- [LLM-formatted docs index](${DOCS_SITE}/llms.txt): per-guide links to raw markdown sources`, ++ `- [Full LLM-formatted docs](${DOCS_SITE}/llms-full.txt): every guide concatenated into one file`, ++ "", ++ "## Blog", ++ ]; ++ for (const post of posts) { ++ const datePart = post.date ? ` — ${post.date}` : ""; ++ lines.push(`- [${post.title}](${post.url})${datePart}`); ++ } ++ lines.push(""); ++ return lines.join("\n"); ++} ++ ++async function main() { ++ const posts = await collectBlogPosts(); ++ const content = renderLlmsTxt(posts); ++ await writeFile(OUTPUT_FILE, content, "utf8"); ++ console.log( ++ `Wrote ${OUTPUT_FILE} with ${posts.length} blog post${posts.length === 1 ? "" : "s"}.`, ++ ); ++} ++ ++main().catch((err) => { ++ console.error(err); ++ process.exit(1); ++}); diff --git a/opensaas-sh/app_diff/src/admin/dashboards/analytics/RevenueAndProfitChart.tsx.diff b/opensaas-sh/app_diff/src/admin/dashboards/analytics/RevenueAndProfitChart.tsx.diff new file mode 100644 index 0000000..350bb69 --- /dev/null +++ b/opensaas-sh/app_diff/src/admin/dashboards/analytics/RevenueAndProfitChart.tsx.diff @@ -0,0 +1,11 @@ +--- template/app/src/admin/dashboards/analytics/RevenueAndProfitChart.tsx ++++ opensaas-sh/app/src/admin/dashboards/analytics/RevenueAndProfitChart.tsx +@@ -11,7 +11,7 @@ + }, + colors: ["#3C50E0", "#80CAEE"], + chart: { +- fontFamily: "system-ui, sans-serif", ++ fontFamily: "Satoshi, system-ui, sans-serif", + height: 335, + type: "area", + dropShadow: { diff --git a/opensaas-sh/app_diff/src/admin/dashboards/users/UsersTable.tsx.diff b/opensaas-sh/app_diff/src/admin/dashboards/users/UsersTable.tsx.diff new file mode 100644 index 0000000..bed4889 --- /dev/null +++ b/opensaas-sh/app_diff/src/admin/dashboards/users/UsersTable.tsx.diff @@ -0,0 +1,11 @@ +--- template/app/src/admin/dashboards/users/UsersTable.tsx ++++ opensaas-sh/app/src/admin/dashboards/users/UsersTable.tsx +@@ -303,7 +303,7 @@ + +
+

+- {user.paymentProcessorUserId} ++ {user.subscriptionStatus} +

+
+
diff --git a/opensaas-sh/app_diff/src/analytics/providers/plausibleAnalyticsUtils.ts.diff b/opensaas-sh/app_diff/src/analytics/providers/plausibleAnalyticsUtils.ts.diff new file mode 100644 index 0000000..5a64d96 --- /dev/null +++ b/opensaas-sh/app_diff/src/analytics/providers/plausibleAnalyticsUtils.ts.diff @@ -0,0 +1,29 @@ +--- template/app/src/analytics/providers/plausibleAnalyticsUtils.ts ++++ opensaas-sh/app/src/analytics/providers/plausibleAnalyticsUtils.ts +@@ -34,7 +34,7 @@ + + async function getTotalPageViews() { + const response = await fetch( +- `${env.PLAUSIBLE_BASE_URL}/v1/stats/aggregate?site_id=${env.PLAUSIBLE_SITE_ID}&metrics=pageviews`, ++ `${env.PLAUSIBLE_BASE_URL}/v1/stats/aggregate?site_id=${env.PLAUSIBLE_SITE_ID}&metrics=pageviews&with_imported=true`, + { + method: "GET", + headers, +@@ -83,7 +83,7 @@ + } + + async function getPageviewsForDate(date: string) { +- const url = `${env.PLAUSIBLE_BASE_URL}/v1/stats/aggregate?site_id=${env.PLAUSIBLE_SITE_ID}&period=day&date=${date}&metrics=pageviews`; ++ const url = `${env.PLAUSIBLE_BASE_URL}/v1/stats/aggregate?site_id=${env.PLAUSIBLE_SITE_ID}&period=day&date=${date}&metrics=pageviews&with_imported=true`; + const response = await fetch(url, { + method: "GET", + headers, +@@ -96,7 +96,7 @@ + } + + export async function getSources() { +- const url = `${env.PLAUSIBLE_BASE_URL}/v1/stats/breakdown?site_id=${env.PLAUSIBLE_SITE_ID}&property=visit:source&metrics=visitors`; ++ const url = `${env.PLAUSIBLE_BASE_URL}/v1/stats/breakdown?site_id=${env.PLAUSIBLE_SITE_ID}&property=visit:source&metrics=visitors&with_imported=true`; + const response = await fetch(url, { + method: "GET", + headers, diff --git a/opensaas-sh/app_diff/src/auth/auth.wasp.ts.diff b/opensaas-sh/app_diff/src/auth/auth.wasp.ts.diff new file mode 100644 index 0000000..6e95ffc --- /dev/null +++ b/opensaas-sh/app_diff/src/auth/auth.wasp.ts.diff @@ -0,0 +1,52 @@ +--- template/app/src/auth/auth.wasp.ts ++++ opensaas-sh/app/src/auth/auth.wasp.ts +@@ -28,7 +28,7 @@ + const emailAuthMethod: NonNullable = { + fromField: { + name: "Open SaaS App", +- email: "me@example.com", ++ email: "noreply@mg.wasp.sh", + }, + emailVerification: { + clientRoute: "EmailVerificationRoute", +@@ -41,27 +41,20 @@ + userSignupFields: getEmailUserFields, + }; + +-// Plug the following authentication methods in the `authConfig` below to enable them. + // Do note that `email` and `usernameAndPassword` are mutually exclusive. + // @ts-expect-error Demo purposes + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const usernameAndPasswordAuthMethod: NonNullable< + AuthMethods["usernameAndPassword"] + > = {}; +-// @ts-expect-error Demo purposes +-// eslint-disable-next-line @typescript-eslint/no-unused-vars + const googleAuthMethod: NonNullable = { + userSignupFields: getGoogleUserFields, + configFn: getGoogleAuthConfig, + }; +-// @ts-expect-error Demo purposes +-// eslint-disable-next-line @typescript-eslint/no-unused-vars + const gitGubAuthMethod: NonNullable = { + userSignupFields: getGitHubUserFields, + configFn: getGitHubAuthConfig, + }; +-// @ts-expect-error Demo purposes +-// eslint-disable-next-line @typescript-eslint/no-unused-vars + const discordAuthMethod: NonNullable = { + userSignupFields: getDiscordUserFields, + configFn: getDiscordAuthConfig, +@@ -75,9 +68,9 @@ + // (RequestPasswordResetRoute, PasswordResetRoute, EmailVerificationRoute) + email: emailAuthMethod, + // usernameAndPassword: usernameAndPasswordAuthMethod, +- // google: googleAuthMethod, +- // gitHub: gitGubAuthMethod, +- // discord: discordAuthMethod, ++ google: googleAuthMethod, ++ gitHub: gitGubAuthMethod, ++ discord: discordAuthMethod, + }, + onAuthFailedRedirectTo: "/login", + onAuthSucceededRedirectTo: "/demo-app", diff --git a/opensaas-sh/app_diff/src/auth/email-and-pass/emails.ts.diff b/opensaas-sh/app_diff/src/auth/email-and-pass/emails.ts.diff new file mode 100644 index 0000000..4807a3d --- /dev/null +++ b/opensaas-sh/app_diff/src/auth/email-and-pass/emails.ts.diff @@ -0,0 +1,30 @@ +--- template/app/src/auth/email-and-pass/emails.ts ++++ opensaas-sh/app/src/auth/email-and-pass/emails.ts +@@ -6,10 +6,10 @@ + export const getVerificationEmailContent: GetVerificationEmailContentFn = ({ + verificationLink, + }) => ({ +- subject: "Verify your email", +- text: `Click the link below to verify your email: ${verificationLink}`, ++ subject: "Open SaaS - Verify your email", ++ text: `Open SaaS - Click the link to verify your email: ${verificationLink}`, + html: ` +-

Click the link below to verify your email

++

Open SaaS - Click the link to verify your email:

+ Verify email + `, + }); +@@ -17,10 +17,10 @@ + export const getPasswordResetEmailContent: GetPasswordResetEmailContentFn = ({ + passwordResetLink, + }) => ({ +- subject: "Password reset", +- text: `Click the link below to reset your password: ${passwordResetLink}`, ++ subject: "Open SaaS - Password reset", ++ text: `Open SaaS - Click the link to reset your password: ${passwordResetLink}`, + html: ` +-

Click the link below to reset your password

++

Open SaaS - Click the link to reset your password:

+ Reset password + `, + }); diff --git a/opensaas-sh/app_diff/src/auth/userSignupFields.ts.diff b/opensaas-sh/app_diff/src/auth/userSignupFields.ts.diff new file mode 100644 index 0000000..0e10d3b --- /dev/null +++ b/opensaas-sh/app_diff/src/auth/userSignupFields.ts.diff @@ -0,0 +1,68 @@ +--- template/app/src/auth/userSignupFields.ts ++++ opensaas-sh/app/src/auth/userSignupFields.ts +@@ -1,11 +1,6 @@ + import { defineUserSignupFields } from "wasp/auth/providers/types"; +-import { env } from "wasp/server"; + import { z } from "zod"; + +-function isAdminEmail(email: string): boolean { +- return env.ADMIN_EMAILS.includes(email); +-} +- + const emailDataSchema = z.object({ + email: z.string(), + }); +@@ -19,10 +14,6 @@ + const emailData = emailDataSchema.parse(data); + return emailData.email; + }, +- isAdmin: (data) => { +- const emailData = emailDataSchema.parse(data); +- return isAdminEmail(emailData.email); +- }, + }); + + const githubDataSchema = z.object({ +@@ -51,14 +42,6 @@ + const githubData = githubDataSchema.parse(data); + return githubData.profile.login; + }, +- isAdmin: (data) => { +- const githubData = githubDataSchema.parse(data); +- const emailInfo = getGithubEmailInfo(githubData); +- if (!emailInfo.verified) { +- return false; +- } +- return isAdminEmail(emailInfo.email); +- }, + }); + + // We are using the first email from the list of emails returned by GitHub. +@@ -91,13 +74,6 @@ + const googleData = googleDataSchema.parse(data); + return googleData.profile.email; + }, +- isAdmin: (data) => { +- const googleData = googleDataSchema.parse(data); +- if (!googleData.profile.email_verified) { +- return false; +- } +- return isAdminEmail(googleData.profile.email); +- }, + }); + + export function getGoogleAuthConfig() { +@@ -129,13 +105,6 @@ + const discordData = discordDataSchema.parse(data); + return discordData.profile.username; + }, +- isAdmin: (data) => { +- const discordData = discordDataSchema.parse(data); +- if (!discordData.profile.email || !discordData.profile.verified) { +- return false; +- } +- return isAdminEmail(discordData.profile.email); +- }, + }); + + export function getDiscordAuthConfig() { diff --git a/opensaas-sh/app_diff/src/client/App.tsx.diff b/opensaas-sh/app_diff/src/client/App.tsx.diff new file mode 100644 index 0000000..cbda74d --- /dev/null +++ b/opensaas-sh/app_diff/src/client/App.tsx.diff @@ -0,0 +1,55 @@ +--- template/app/src/client/App.tsx ++++ opensaas-sh/app/src/client/App.tsx +@@ -1,4 +1,4 @@ +-import { useEffect, useMemo } from "react"; ++import { useEffect, useMemo, useRef } from "react"; + import { Outlet, useLocation } from "react-router"; + import { routes } from "wasp/client/router"; + import { Toaster } from "../client/components/ui/toaster"; +@@ -17,10 +17,7 @@ + export function App() { + const location = useLocation(); + const isMarketingPage = useMemo(() => { +- return ( +- location.pathname === routes.LandingPageRoute.to || +- location.pathname === routes.PricingPageRoute.to +- ); ++ return location.pathname === routes.LandingPageRoute.to; + }, [location]); + + const navigationItems = isMarketingPage +@@ -38,14 +35,33 @@ + return location.pathname.startsWith(routes.AdminRoute.to); + }, [location]); + ++ const resizeObserverRef = useRef(null); ++ + useEffect(() => { + if (location.hash) { ++ console.log("location ..", location.hash); + const id = location.hash.replace("#", ""); + const element = document.getElementById(id); ++ + if (element) { +- element.scrollIntoView(); ++ // Scroll immediately but watches for size changes (async content loading) and re-scrolls ++ element.scrollIntoView({ behavior: "smooth" }); ++ console.log("element scrolled ..", element); ++ resizeObserverRef.current = new ResizeObserver(() => { ++ element.scrollIntoView({ behavior: "smooth" }); ++ }); ++ resizeObserverRef.current.observe(element); ++ } ++ } else if (location.pathname === "/") { ++ // Only scroll to top when navigating TO homepage from another page ++ if (window.scrollY > 0) { ++ window.scrollTo({ top: 0, behavior: "smooth" }); + } + } ++ ++ return () => { ++ resizeObserverRef.current?.disconnect(); ++ }; + }, [location]); + + return ( diff --git a/opensaas-sh/app_diff/src/client/Main.css.diff b/opensaas-sh/app_diff/src/client/Main.css.diff new file mode 100644 index 0000000..41a2985 --- /dev/null +++ b/opensaas-sh/app_diff/src/client/Main.css.diff @@ -0,0 +1,130 @@ +--- template/app/src/client/Main.css ++++ opensaas-sh/app/src/client/Main.css +@@ -122,6 +122,25 @@ + 0px 2px 4px rgba(0, 0, 0, 0.2), inset 0px 2px 2px #ffffff, + inset 0px -1px 1px rgba(0, 0, 0, 0.1); + --shadow-switch-1: 0px 0px 5px rgba(0, 0, 0, 0.15); ++ --shadow-outer: ++ 0px 1px 3px 0px hsl(var(--background)/0.8) inset, ++ 0px 0.5px 1px 0px hsl(var(--background)/0.8) inset, ++ 0px -1px 3px 0px hsl(var(--primary)/0.3) inset, ++ 0px -0.5px 1px 0px hsl(var(--primary)/0.15) inset, ++ 0px -2px 4.8px 0px hsl(var(--background)/0.05), ++ 0px 1px 2px 0px hsl(var(--background)/0.1), ++ 0px 2px 4px 0px hsl(var(--background)/0.1), ++ 0px 4px 8px 0px hsl(var(--background)/0.15); ++ --shadow-inner: ++ 0px 1px 3px 0px hsl(var(--background)/0.8), ++ 0px 0.5px 1px 0px hsl(var(--background)/0.5), ++ 0px -1px 3px 0px hsl(var(--primary)/0.5), ++ 0px -0.5px 1px 0px hsl(var(--primary)/0.5), ++ 0px -1px 4px 0px hsl(var(--background)/0.06) inset, ++ 0px -2px 4.8px 0px hsl(var(--background)/0.06) inset, ++ 0px 1px 2px 0px hsl(var(--background)/0.06) inset, ++ 0px 2px 4px 0px hsl(var(--background)/0.06) inset, ++ 0px 4px 8px 0px hsl(var(--background)/0.06) inset; + + --drop-shadow-1: 0px 1px 0px #e2e8f0; + --drop-shadow-2: 0px 1px 4px rgba(0, 0, 0, 0.12); +@@ -136,6 +155,8 @@ + --radius-md: calc(var(--radius) - 2px); + --radius-sm: calc(var(--radius) - 4px); + ++ --font-satoshi: "Satoshi", system-ui, sans-serif; ++ + @keyframes rotating { + 0%, + 100% { +@@ -209,6 +230,64 @@ + & > * { + background: hsl(var(--background)); + } ++ ++ /* Radial gradient utilities */ ++ .bg-radial-gradient { ++ background: radial-gradient( ++ circle at 30% 30%, ++ hsl(var(--card-accent) / 0.5) 0%, ++ hsl(var(--accent) / 0.15) 100% ++ ); ++ } ++ ++ .dark .bg-radial-gradient { ++ background: radial-gradient( ++ circle at 30% 30%, ++ hsl(var(--card-subtle) / 0.8) 0%, ++ hsl(var(--card)) 100% ++ ); ++ } ++} ++ ++/* Satoshi Font Family */ ++@font-face { ++ font-family: "Satoshi"; ++ src: url("/fonts/Satoshi-Light.woff2") format("woff2"); ++ font-weight: 300; ++ font-style: normal; ++ font-display: swap; ++} ++ ++@font-face { ++ font-family: "Satoshi"; ++ src: url("/fonts/Satoshi-Regular.woff2") format("woff2"); ++ font-weight: normal; ++ font-style: normal; ++ font-display: swap; ++} ++ ++@font-face { ++ font-family: "Satoshi"; ++ src: url("/fonts/Satoshi-Medium.woff2") format("woff2"); ++ font-weight: 500; ++ font-style: normal; ++ font-display: swap; ++} ++ ++@font-face { ++ font-family: "Satoshi"; ++ src: url("/fonts/Satoshi-Bold.woff2") format("woff2"); ++ font-weight: bold; ++ font-style: normal; ++ font-display: swap; ++} ++ ++@font-face { ++ font-family: "Satoshi"; ++ src: url("/fonts/Satoshi-Black.woff2") format("woff2"); ++ font-weight: 900; ++ font-style: normal; ++ font-display: swap; + } + + @layer base { +@@ -285,6 +364,19 @@ + body { + @apply bg-background text-foreground; + } ++ /* Global typography styles */ ++ h1, ++ h2, ++ h3, ++ h4, ++ h5, ++ h6 { ++ @apply font-satoshi font-black leading-tight; ++ } ++ ++ p { ++ @apply font-mono text-base leading-relaxed; ++ } + } + + /* third-party libraries CSS */ +@@ -330,3 +422,7 @@ + .apexcharts-xaxistooltip-bottom:before { + @apply dark:border-b-muted!; + } ++ ++.navbar-maxwidth-transition { ++ transition: max-width 300ms cubic-bezier(0.4, 0, 0.2, 1); ++} diff --git a/opensaas-sh/app_diff/src/client/components/NavBar/Announcement.tsx.diff b/opensaas-sh/app_diff/src/client/components/NavBar/Announcement.tsx.diff new file mode 100644 index 0000000..fd1438f --- /dev/null +++ b/opensaas-sh/app_diff/src/client/components/NavBar/Announcement.tsx.diff @@ -0,0 +1,46 @@ +--- template/app/src/client/components/NavBar/Announcement.tsx ++++ opensaas-sh/app/src/client/components/NavBar/Announcement.tsx +@@ -1,32 +1,33 @@ +-const ANNOUNCEMENT_URL = "https://github.com/wasp-lang/wasp"; ++const ANNOUNCEMENT_URL = "https:/openvibe.sh"; + + export function Announcement() { ++ + return ( +-
++ + ); diff --git a/opensaas-sh/app_diff/src/client/components/NavBar/NavBar.tsx.diff b/opensaas-sh/app_diff/src/client/components/NavBar/NavBar.tsx.diff new file mode 100644 index 0000000..1d37240 --- /dev/null +++ b/opensaas-sh/app_diff/src/client/components/NavBar/NavBar.tsx.diff @@ -0,0 +1,120 @@ +--- template/app/src/client/components/NavBar/NavBar.tsx ++++ opensaas-sh/app/src/client/components/NavBar/NavBar.tsx +@@ -3,6 +3,7 @@ + import { Link as ReactRouterLink } from "react-router"; + import { useAuth } from "wasp/client/auth"; + import { Link as WaspRouterLink, routes } from "wasp/client/router"; ++import { Button } from "../../../client/components/ui/button"; + import { + Sheet, + SheetContent, +@@ -17,6 +18,7 @@ + import logo from "../../static/logo.webp"; + import { cn } from "../../utils"; + import { DarkModeSwitcher } from "../DarkModeSwitcher"; ++import { RepoInfo } from "../RepoInfo"; + import { Announcement } from "./Announcement"; + + export interface NavigationItem { +@@ -51,7 +53,7 @@ +
+
+- Your SaaS ++ Open SaaS + + + +@@ -113,7 +115,12 @@ + return ( +
+
    +- ++
  • ++ ++
  • ++
  • ++ ++
  • +
+ {isUserLoading ? null : !user ? ( + +-
++
++ Demo App + Log in{" "} + + + +- Your SaaS ++ Open SaaS + + + +@@ -193,9 +201,9 @@ +
+ {isUserLoading ? null : !user ? ( + +-
+- Log in +-
++ +
+ ) : ( +
    +@@ -207,7 +215,14 @@ + )} +
+
+- ++
    ++
  • ++ ++
  • ++
  • ++ ++
  • ++
+
+
+
+@@ -252,7 +267,7 @@ + "size-7": isScrolled, + })} + src={logo} +- alt="Your SaaS App" ++ alt="Open SaaS App" + /> + ); + } diff --git a/opensaas-sh/app_diff/src/client/components/NavBar/constants.ts.diff b/opensaas-sh/app_diff/src/client/components/NavBar/constants.ts.diff new file mode 100644 index 0000000..3e4d497 --- /dev/null +++ b/opensaas-sh/app_diff/src/client/components/NavBar/constants.ts.diff @@ -0,0 +1,19 @@ +--- template/app/src/client/components/NavBar/constants.ts ++++ opensaas-sh/app/src/client/components/NavBar/constants.ts +@@ -8,13 +8,14 @@ + ]; + + export const marketingNavigationItems: NavigationItem[] = [ +- { name: "Features", to: "/#features" }, +- { name: "Pricing", to: routes.PricingPageRoute.to }, ++ { name: "Features", to: "/#auth-feature" }, ++ { name: "Roadmap", to: "/#roadmap" }, + ...staticNavigationItems, + ] as const; + + export const demoNavigationitems: NavigationItem[] = [ + { name: "AI Scheduler", to: routes.DemoAppRoute.to }, + { name: "File Upload", to: routes.FileUploadRoute.to }, ++ { name: "Pricing", to: routes.PricingPageRoute.to }, + ...staticNavigationItems, + ] as const; diff --git a/opensaas-sh/app_diff/src/client/components/RepoInfo.tsx.diff b/opensaas-sh/app_diff/src/client/components/RepoInfo.tsx.diff new file mode 100644 index 0000000..6bb019d --- /dev/null +++ b/opensaas-sh/app_diff/src/client/components/RepoInfo.tsx.diff @@ -0,0 +1,50 @@ +--- template/app/src/client/components/RepoInfo.tsx ++++ opensaas-sh/app/src/client/components/RepoInfo.tsx +@@ -0,0 +1,47 @@ ++import { useEffect, useState } from "react"; ++import { FaGithub } from "react-icons/fa"; ++import { Button } from "../../client/components/ui/button"; ++import { formatNumber } from "../utils"; ++ ++export function RepoInfo() { ++ const [repoInfo, setRepoInfo] = useState(null); ++ const [isLoading, setIsLoading] = useState(true); ++ ++ useEffect(() => { ++ const fetchRepoInfo = async () => { ++ try { ++ setIsLoading(true); ++ const response = await fetch( ++ "https://api.github.com/repos/wasp-lang/open-saas", ++ ); ++ const data = await response.json(); ++ setRepoInfo(data); ++ } catch (error) { ++ console.error("Error fetching repo info", error); ++ } finally { ++ setIsLoading(false); ++ } ++ }; ++ fetchRepoInfo(); ++ }, []); ++ ++ if (isLoading || !repoInfo) { ++ return null; ++ } ++ ++ return ( ++ ++ ++ ++ ); ++} ++ diff --git a/opensaas-sh/app_diff/src/client/components/cookie-consent/Config.ts.diff b/opensaas-sh/app_diff/src/client/components/cookie-consent/Config.ts.diff new file mode 100644 index 0000000..1b76f87 --- /dev/null +++ b/opensaas-sh/app_diff/src/client/components/cookie-consent/Config.ts.diff @@ -0,0 +1,74 @@ +--- template/app/src/client/components/cookie-consent/Config.ts ++++ opensaas-sh/app/src/client/components/cookie-consent/Config.ts +@@ -1,4 +1,5 @@ + import type { CookieConsentConfig } from "vanilla-cookieconsent"; ++import * as CookieConsent from "vanilla-cookieconsent"; + + declare global { + interface Window { +@@ -15,8 +16,9 @@ + disablePageInteraction: false, + hideFromBots: import.meta.env.PROD ? true : false, // Set this to false for dev/headless tests otherwise the modal will not be visible. + mode: "opt-in", +- // Bump the revision field when you add new services +- revision: 0, ++ // Bump the revision field when you add new services. ++ // Keep this in sync with: opensaas-sh/blog/src/components/CookieConsentBanner.astro ++ revision: 2, + + // Default configuration for the cookie. + cookie: { +@@ -50,6 +52,12 @@ + { + name: "_gid", // string: exact cookie name + }, ++ { ++ name: /^__sec__/, // regex: match all REO.dev cookies (https://docs.reo.dev/integrations/tracking-beacon/reo.dev-javascript-cookies-and-consent-guide#key-features-of-reo.dev-cookies) ++ }, ++ { ++ name: /^ph_/, // regex: match all PostHog cookies ++ }, + ], + }, + +@@ -87,6 +95,28 @@ + }, + onReject: () => {}, + }, ++ posthog: { ++ label: "PostHog", ++ onAccept: async () => { ++ try { ++ await CookieConsent.loadScript("/scripts/posthog.js"); ++ } catch (error) { ++ console.error(error); ++ } ++ }, ++ onReject: () => {}, ++ }, ++ reo: { ++ label: "REO.dev", ++ onAccept: async () => { ++ try { ++ await CookieConsent.loadScript("/scripts/reo.js"); ++ } catch (error) { ++ console.error(error); ++ } ++ }, ++ onReject: () => {}, ++ }, + }, + }, + }, +@@ -103,10 +133,7 @@ + acceptNecessaryBtn: "Reject all", + // showPreferencesBtn: 'Manage Individual preferences', // (OPTIONAL) Activates the preferences modal + // TODO: Add your own privacy policy and terms and conditions links below. +- footer: ` +- Privacy Policy +- Terms and Conditions +- `, ++ footer: `Privacy Policy`, + }, + // The showPreferencesBtn activates this modal to manage individual preferences https://cookieconsent.orestbida.com/reference/configuration-reference.html#translation-preferencesmodal + preferencesModal: { diff --git a/opensaas-sh/app_diff/src/client/components/ui/button.tsx.diff b/opensaas-sh/app_diff/src/client/components/ui/button.tsx.diff new file mode 100644 index 0000000..e3afc76 --- /dev/null +++ b/opensaas-sh/app_diff/src/client/components/ui/button.tsx.diff @@ -0,0 +1,31 @@ +--- template/app/src/client/components/ui/button.tsx ++++ opensaas-sh/app/src/client/components/ui/button.tsx +@@ -10,21 +10,26 @@ + variants: { + variant: { + default: +- "bg-primary text-primary-foreground shadow hover:bg-primary/90", ++ "bg-primary text-primary-foreground shadow-outer hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", +- ghost: "hover:bg-accent hover:text-accent-foreground", ++ ghost: "hover:bg-muted hover:text-foreground text-muted-foreground", + link: "text-primary underline-offset-4 hover:underline", ++ selected: "border bg-muted text-muted-foreground", ++ outer: "shadow-outer bg-card text-card-foreground", ++ inner: ++ "shadow-inner bg-secondary-muted text-secondary-muted-foreground", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", ++ iconLg: "h-12 w-12", + }, + }, + defaultVariants: { diff --git a/opensaas-sh/app_diff/src/client/components/ui/card.tsx.diff b/opensaas-sh/app_diff/src/client/components/ui/card.tsx.diff new file mode 100644 index 0000000..9db6ecd --- /dev/null +++ b/opensaas-sh/app_diff/src/client/components/ui/card.tsx.diff @@ -0,0 +1,15 @@ +--- template/app/src/client/components/ui/card.tsx ++++ opensaas-sh/app/src/client/components/ui/card.tsx +@@ -12,7 +12,11 @@ + accent: "bg-card-accent text-card-accent-foreground hover:scale-[1.02]", + faded: "text-card-faded-foreground scale-95 opacity-50", + bento: +- "bg-card-subtle text-card-subtle-foreground hover:scale-[1.02] border-none shadow-none", ++ "bg-card-subtle text-card-subtle-foreground border-none shadow-none hover:shadow-none", ++ bentoHighlight: ++ "bg-card-subtle text-card-subtle-foreground border-none shadow-outer dark:shadow-lg hover:shadow-outer", ++ outer: "bg-card shadow-outer text-card-foreground hover:shadow-outer", ++ inner: "bg-card shadow-inner text-card-foreground hover:shadow-inner", + }, + }, + }, diff --git a/opensaas-sh/app_diff/src/client/head.wasp.ts.diff b/opensaas-sh/app_diff/src/client/head.wasp.ts.diff new file mode 100644 index 0000000..85d0013 --- /dev/null +++ b/opensaas-sh/app_diff/src/client/head.wasp.ts.diff @@ -0,0 +1,42 @@ +--- template/app/src/client/head.wasp.ts ++++ opensaas-sh/app/src/client/head.wasp.ts +@@ -3,24 +3,24 @@ + export const head: App["head"] = [ + "", + +- "", +- "", +- "", ++ "", ++ "", ++ "", + ++ "", + "", +- "", +- "", +- "", +- "", +- "", +- "", ++ "", ++ "", ++ "", ++ "", ++ ++ "", ++ "", ++ "", ++ "", + "", + "", + "", +- // TODO: You can put your Plausible analytics scripts below (https://docs.opensaas.sh/guides/analytics/): +- // NOTE: Plausible does not use Cookies, so you can simply add the scripts here. +- // Google, on the other hand, does, so you must instead add the script dynamically +- // via the Cookie Consent component after the user clicks the "Accept" cookies button. +- "", // for production +- "", // for development ++ ++ "", + ]; diff --git a/opensaas-sh/app_diff/src/client/utils.ts.diff b/opensaas-sh/app_diff/src/client/utils.ts.diff new file mode 100644 index 0000000..e8e0cfd --- /dev/null +++ b/opensaas-sh/app_diff/src/client/utils.ts.diff @@ -0,0 +1,15 @@ +--- template/app/src/client/utils.ts ++++ opensaas-sh/app/src/client/utils.ts +@@ -4,3 +4,12 @@ + export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); + } ++ ++export function formatNumber(number: number) { ++ if (number >= 1_000_000) { ++ return (number / 1_000_000).toFixed(1) + "M"; ++ } ++ if (number >= 1_000) { ++ return (number / 1_000).toFixed(1) + "K"; ++ } ++} diff --git a/opensaas-sh/app_diff/src/env.ts.diff b/opensaas-sh/app_diff/src/env.ts.diff new file mode 100644 index 0000000..27e7a60 --- /dev/null +++ b/opensaas-sh/app_diff/src/env.ts.diff @@ -0,0 +1,20 @@ +--- template/app/src/env.ts ++++ opensaas-sh/app/src/env.ts +@@ -5,8 +5,6 @@ + import { authEnvSchema } from "./auth/env"; + import { demoAiAppEnvSchema } from "./demo-ai-app/env"; + import { fileUploadEnvSchema } from "./file-upload/env"; +-import { lemonSqueezyEnvSchema } from "./payment/lemonSqueezy/env"; +-import { polarEnvSchema } from "./payment/polar/env"; + import { stripeEnvSchema } from "./payment/stripe/env"; + + // Wasp merges this schema with its built-in env var validations and uses it +@@ -20,8 +18,6 @@ + z.object({ + ...authEnvSchema.shape, + ...stripeEnvSchema.shape, +- ...lemonSqueezyEnvSchema.shape, +- ...polarEnvSchema.shape, + ...demoAiAppEnvSchema.shape, + ...fileUploadEnvSchema.shape, + ...plausibleEnvSchema.shape, diff --git a/opensaas-sh/app_diff/src/file-upload/file-upload.wasp.ts.diff b/opensaas-sh/app_diff/src/file-upload/file-upload.wasp.ts.diff new file mode 100644 index 0000000..b096093 --- /dev/null +++ b/opensaas-sh/app_diff/src/file-upload/file-upload.wasp.ts.diff @@ -0,0 +1,28 @@ +--- template/app/src/file-upload/file-upload.wasp.ts ++++ opensaas-sh/app/src/file-upload/file-upload.wasp.ts +@@ -1,4 +1,4 @@ +-import { action, page, query, route, type Spec } from "@wasp.sh/spec"; ++import { action, job, page, query, route, type Spec } from "@wasp.sh/spec"; + + import { FileUploadPage } from "./FileUploadPage" with { type: "ref" }; + import { +@@ -8,6 +8,7 @@ + getAllFilesByUser, + getDownloadFileSignedURL, + } from "./operations" with { type: "ref" }; ++import { deleteFilesJob } from "./workers" with { type: "ref" }; + + export const fileUploadSpec: Spec = [ + route( +@@ -20,4 +21,11 @@ + action(addFileToDb, { entities: ["User", "File"] }), + action(createFileUploadUrl, { entities: ["User", "File"] }), + action(deleteFile, { entities: ["User", "File"] }), ++ job(deleteFilesJob, { ++ executor: "PgBoss", ++ schedule: { ++ cron: "0 5 * * *", // every day at 5am ++ }, ++ entities: ["File"], ++ }), + ]; diff --git a/opensaas-sh/app_diff/src/file-upload/fileUploading.ts.diff b/opensaas-sh/app_diff/src/file-upload/fileUploading.ts.diff new file mode 100644 index 0000000..bd29ef3 --- /dev/null +++ b/opensaas-sh/app_diff/src/file-upload/fileUploading.ts.diff @@ -0,0 +1,33 @@ +--- template/app/src/file-upload/fileUploading.ts ++++ opensaas-sh/app/src/file-upload/fileUploading.ts +@@ -1,4 +1,6 @@ ++import { PrismaClient } from "@prisma/client"; + import ky from "ky"; ++import type { User } from "wasp/entities"; + import { ALLOWED_FILE_TYPES, MAX_FILE_SIZE_BYTES } from "./validation"; + + type AllowedFileTypes = (typeof ALLOWED_FILE_TYPES)[number]; +@@ -55,3 +57,23 @@ + function isFileWithAllowedFileType(file: File): file is FileWithValidType { + return ALLOWED_FILE_TYPES.includes(file.type as AllowedFileTypes); + } ++ ++export async function checkIfUserHasReachedFileUploadLimit({ ++ userId, ++ prismaFileDelegate, ++}: { ++ userId: User["id"]; ++ prismaFileDelegate: PrismaClient["file"]; ++}) { ++ const numberOfFilesByUser = await prismaFileDelegate.count({ ++ where: { ++ user: { ++ id: userId, ++ }, ++ }, ++ }); ++ if (numberOfFilesByUser >= 2) { ++ return true; ++ } ++ return false; ++} diff --git a/opensaas-sh/app_diff/src/file-upload/operations.ts.diff b/opensaas-sh/app_diff/src/file-upload/operations.ts.diff new file mode 100644 index 0000000..51145c9 --- /dev/null +++ b/opensaas-sh/app_diff/src/file-upload/operations.ts.diff @@ -0,0 +1,25 @@ +--- template/app/src/file-upload/operations.ts ++++ opensaas-sh/app/src/file-upload/operations.ts +@@ -7,6 +7,7 @@ + type GetAllFilesByUser, + type GetDownloadFileSignedURL, + } from "wasp/server/operations"; ++import { checkIfUserHasReachedFileUploadLimit } from "./fileUploading"; + + import * as z from "zod"; + import { ensureArgsSchemaOrThrowHttpError } from "../server/validation"; +@@ -37,6 +38,14 @@ + throw new HttpError(401); + } + ++ const userFileLimitReached = await checkIfUserHasReachedFileUploadLimit({ ++ userId: context.user.id, ++ prismaFileDelegate: context.entities.File, ++ }); ++ if (userFileLimitReached) { ++ throw new HttpError(403, "This demo only allows 2 file uploads per user."); ++ } ++ + const { fileType, fileName } = ensureArgsSchemaOrThrowHttpError( + createFileInputSchema, + rawArgs, diff --git a/opensaas-sh/app_diff/src/file-upload/workers.ts.diff b/opensaas-sh/app_diff/src/file-upload/workers.ts.diff new file mode 100644 index 0000000..019061a --- /dev/null +++ b/opensaas-sh/app_diff/src/file-upload/workers.ts.diff @@ -0,0 +1,40 @@ +--- template/app/src/file-upload/workers.ts ++++ opensaas-sh/app/src/file-upload/workers.ts +@@ -0,0 +1,37 @@ ++import type { DeleteFilesJob } from "wasp/server/jobs"; ++import { deleteFileFromS3 } from "./s3Utils"; ++ ++export const deleteFilesJob: DeleteFilesJob = async ( ++ _args, ++ context, ++) => { ++ const dayInMiliseconds = 1000 * 60 * 60 * 24; ++ const sevenDaysAgo = Date.now() - 7 * dayInMiliseconds; ++ const filesToDelete = await context.entities.File.findMany({ ++ where: { ++ createdAt: { ++ lt: new Date(sevenDaysAgo), ++ }, ++ }, ++ select: { s3Key: true, id: true }, ++ }); ++ ++ const deletionResults = await Promise.allSettled( ++ filesToDelete.map(async (file) => { ++ await deleteFileFromS3({ s3Key: file.s3Key }); ++ return file.id; ++ }), ++ ); ++ ++ const successfullyDeletedFromS3Ids = deletionResults ++ .filter((result) => result.status === "fulfilled") ++ .map((result) => result.value); ++ ++ const deletedFiles = await context.entities.File.deleteMany({ ++ where: { ++ id: { in: successfullyDeletedFromS3Ids }, ++ }, ++ }); ++ ++ console.log(`Deleted ${deletedFiles.count} files`); ++}; diff --git a/opensaas-sh/app_diff/src/landing-page/LandingPage.tsx.diff b/opensaas-sh/app_diff/src/landing-page/LandingPage.tsx.diff new file mode 100644 index 0000000..4bc96cf --- /dev/null +++ b/opensaas-sh/app_diff/src/landing-page/LandingPage.tsx.diff @@ -0,0 +1,33 @@ +--- template/app/src/landing-page/LandingPage.tsx ++++ opensaas-sh/app/src/landing-page/LandingPage.tsx +@@ -1,8 +1,10 @@ ++import { Admin, AIReady, Auth, Payments } from "./components/Examples"; + import { ExamplesCarousel } from "./components/ExamplesCarousel"; + import { FAQ } from "./components/FAQ"; + import { FeaturesGrid } from "./components/FeaturesGrid"; + import { Footer } from "./components/Footer"; + import { Hero } from "./components/Hero"; ++import { Roadmap } from "./components/Roadmap"; + import { SchemaMarkup } from "./components/SchemaMarkup"; + import { Testimonials } from "./components/Testimonials"; + import { +@@ -12,7 +14,6 @@ + footerNavigation, + testimonials, + } from "./contentSections"; +-import { AIReady } from "./ExampleHighlightedFeature"; + + export function LandingPage() { + return ( +@@ -22,7 +23,11 @@ + + + ++ ++ ++ + ++ + + + diff --git a/opensaas-sh/app_diff/src/landing-page/components/Examples/AIReady.tsx.diff b/opensaas-sh/app_diff/src/landing-page/components/Examples/AIReady.tsx.diff new file mode 100644 index 0000000..5953d95 --- /dev/null +++ b/opensaas-sh/app_diff/src/landing-page/components/Examples/AIReady.tsx.diff @@ -0,0 +1,26 @@ +--- template/app/src/landing-page/components/Examples/AIReady.tsx ++++ opensaas-sh/app/src/landing-page/components/Examples/AIReady.tsx +@@ -0,0 +1,23 @@ ++import aiReadyDark from "../../../client/static/assets/aiready-dark.webp"; ++import aiReady from "../../../client/static/assets/aiready.webp"; ++import { HighlightedFeature } from "../HighlightedFeature"; ++ ++export function AIReady() { ++ return ( ++ } ++ direction="row-reverse" ++ /> ++ ); ++} ++ ++function AIReadyExample() { ++ return ( ++
++ AI Ready ++ AI Ready ++
++ ); ++} diff --git a/opensaas-sh/app_diff/src/landing-page/components/Examples/Admin.tsx.diff b/opensaas-sh/app_diff/src/landing-page/components/Examples/Admin.tsx.diff new file mode 100644 index 0000000..2e41db1 --- /dev/null +++ b/opensaas-sh/app_diff/src/landing-page/components/Examples/Admin.tsx.diff @@ -0,0 +1,23 @@ +--- template/app/src/landing-page/components/Examples/Admin.tsx ++++ opensaas-sh/app/src/landing-page/components/Examples/Admin.tsx +@@ -0,0 +1,20 @@ ++import admin from "../../../client/static/assets/admin.webp"; ++import { HighlightedFeature } from "../HighlightedFeature"; ++ ++export function Admin() { ++ return ( ++ } ++ /> ++ ); ++} ++ ++function AdminExample() { ++ return ( ++
++ Admin ++
++ ); ++} diff --git a/opensaas-sh/app_diff/src/landing-page/components/Examples/Auth.tsx.diff b/opensaas-sh/app_diff/src/landing-page/components/Examples/Auth.tsx.diff new file mode 100644 index 0000000..aba5775 --- /dev/null +++ b/opensaas-sh/app_diff/src/landing-page/components/Examples/Auth.tsx.diff @@ -0,0 +1,158 @@ +--- template/app/src/landing-page/components/Examples/Auth.tsx ++++ opensaas-sh/app/src/landing-page/components/Examples/Auth.tsx +@@ -0,0 +1,155 @@ ++import { type ComponentType, useState } from "react"; ++import { FaDiscord, FaGithub, FaGoogle, FaSlack } from "react-icons/fa"; ++import { Button } from "../../../client/components/ui/button"; ++import { ++ Card, ++ CardContent, ++ CardHeader, ++} from "../../../client/components/ui/card"; ++import { Input } from "../../../client/components/ui/input"; ++import { DocsUrl } from "../../../shared/common"; ++import { HighlightedFeature } from "../HighlightedFeature"; ++ ++const Provider = { ++ google: { displayName: "Google", icon: FaGoogle }, ++ github: { displayName: "GitHub", icon: FaGithub }, ++ discord: { displayName: "Discord", icon: FaDiscord }, ++ slack: { displayName: "Slack", icon: FaSlack }, ++} as const satisfies Record< ++ string, ++ { displayName: string; icon: ComponentType<{ className?: string }> } ++>; ++ ++type AuthProvider = keyof typeof Provider; ++ ++const providers = Object.entries(Provider) as (readonly [ ++ key: AuthProvider, ++ provider: (typeof Provider)[AuthProvider], ++])[]; ++ ++export function Auth() { ++ const [selectedProviders, setSelectedProviders] = useState< ++ readonly AuthProvider[] ++ >(["google", "github"]); ++ ++ const toggleProvider = (provider: AuthProvider) => { ++ setSelectedProviders((prev) => ++ prev.includes(provider) ++ ? prev.filter((p) => p !== provider) ++ : [...prev, provider], ++ ); ++ }; ++ ++ return ( ++ ++ } ++ highlightedComponent={ ++ ++ } ++ tilt="left" ++ className="h-100" ++ /> ++ ); ++} ++ ++function AuthPlayground({ ++ toggleProvider, ++ selectedProviders, ++}: { ++ toggleProvider: (provider: AuthProvider) => void; ++ selectedProviders: readonly AuthProvider[]; ++}) { ++ return ( ++
++

++ Pre-configured full-stack Auth that you own. ++

++
++ {providers.map(([key, provider]) => { ++ const IconComponent = provider.icon; ++ return ( ++ ++ ); ++ })} ++
++
++ ); ++} ++ ++function Divider() { ++ return ( ++
++
++

Or continue with

++
++
++ ); ++} ++ ++function AuthExample({ ++ selectedProviders, ++}: { ++ selectedProviders: readonly AuthProvider[]; ++}) { ++ return ( ++ ++ ++

Log in to your account

++
++ ++
++
++ {selectedProviders.length > 0 ? ( ++

Log in with

++ ) : null} ++
++ {selectedProviders.map((provider) => { ++ const { icon: IconComponent, displayName } = Provider[provider]; ++ return ( ++ ++ ++ ++ ); ++ })} ++
++
++ {selectedProviders.length > 0 ? : null} ++
++ ++ ++ ++
++
++
++
++ ); ++} diff --git a/opensaas-sh/app_diff/src/landing-page/components/Examples/Payments.tsx.diff b/opensaas-sh/app_diff/src/landing-page/components/Examples/Payments.tsx.diff new file mode 100644 index 0000000..ba288d3 --- /dev/null +++ b/opensaas-sh/app_diff/src/landing-page/components/Examples/Payments.tsx.diff @@ -0,0 +1,24 @@ +--- template/app/src/landing-page/components/Examples/Payments.tsx ++++ opensaas-sh/app/src/landing-page/components/Examples/Payments.tsx +@@ -0,0 +1,21 @@ ++import payments from "../../../client/static/assets/payments.webp"; ++import { HighlightedFeature } from "../HighlightedFeature"; ++ ++export function Payments() { ++ return ( ++ } ++ direction="row-reverse" ++ /> ++ ); ++} ++ ++function PaymentsExample() { ++ return ( ++
++ Payments ++
++ ); ++} diff --git a/opensaas-sh/app_diff/src/landing-page/components/Examples/index.ts.diff b/opensaas-sh/app_diff/src/landing-page/components/Examples/index.ts.diff new file mode 100644 index 0000000..b64debc --- /dev/null +++ b/opensaas-sh/app_diff/src/landing-page/components/Examples/index.ts.diff @@ -0,0 +1,7 @@ +--- template/app/src/landing-page/components/Examples/index.ts ++++ opensaas-sh/app/src/landing-page/components/Examples/index.ts +@@ -0,0 +1,4 @@ ++export { Admin } from "./Admin"; ++export { AIReady } from "./AIReady"; ++export { Auth } from "./Auth"; ++export { Payments } from "./Payments"; diff --git a/opensaas-sh/app_diff/src/landing-page/components/ExamplesCarousel.tsx.diff b/opensaas-sh/app_diff/src/landing-page/components/ExamplesCarousel.tsx.diff new file mode 100644 index 0000000..5ebe7f3 --- /dev/null +++ b/opensaas-sh/app_diff/src/landing-page/components/ExamplesCarousel.tsx.diff @@ -0,0 +1,11 @@ +--- template/app/src/landing-page/components/ExamplesCarousel.tsx ++++ opensaas-sh/app/src/landing-page/components/ExamplesCarousel.tsx +@@ -108,7 +108,7 @@ + ref={containerRef} + className="relative left-1/2 my-16 flex w-screen -translate-x-1/2 flex-col items-center" + > +-

++

+ Used by: +

+
diff --git a/opensaas-sh/app_diff/src/landing-page/components/FeaturesGrid.tsx.diff b/opensaas-sh/app_diff/src/landing-page/components/FeaturesGrid.tsx.diff new file mode 100644 index 0000000..37a7f2f --- /dev/null +++ b/opensaas-sh/app_diff/src/landing-page/components/FeaturesGrid.tsx.diff @@ -0,0 +1,166 @@ +--- template/app/src/landing-page/components/FeaturesGrid.tsx ++++ opensaas-sh/app/src/landing-page/components/FeaturesGrid.tsx +@@ -9,13 +9,15 @@ + import { Feature } from "./Features"; + import { SectionTitle } from "./SectionTitle"; + +-export interface GridFeature extends Omit { ++export interface GridFeature extends Omit { ++ name?: string; + icon?: React.ReactNode; + emoji?: string; + direction?: "col" | "row" | "col-reverse" | "row-reverse"; + align?: "center" | "left"; + size: "small" | "medium" | "large"; + fullWidthIcon?: boolean; ++ highlight?: boolean; + } + + interface FeaturesGridProps { +@@ -59,7 +61,8 @@ + direction = "col", + align = "center", + size = "medium", +- fullWidthIcon = true, ++ fullWidthIcon = false, ++ highlight = false, + }: GridFeature) { + const gridFeatureSizeToClasses: Record = { + small: "col-span-1", +@@ -77,60 +80,98 @@ + "col-reverse": "flex-col-reverse", + }; + ++ const mobileOrderClass = highlight ? "order-last md:order-none" : ""; ++ + const gridFeatureCard = ( + +- ++ + {fullWidthIcon && (icon || emoji) ? ( +-
+- {icon ? ( +- icon +- ) : emoji ? ( +- {emoji} +- ) : null} ++
++
++ {icon ? ( ++
{icon}
++ ) : emoji ? ( ++ {emoji} ++ ) : null} ++
++ {fullWidthIcon && (icon || emoji) && ( ++ ++ {name} ++ ++ )} ++ ++ {description} ++ +
+ ) : ( +
+-
+- {icon ? ( +- icon +- ) : emoji ? ( +- {emoji} +- ) : null} +-
++ {(icon || emoji) && ( ++
++ {icon ? icon : {emoji}} ++
++ )} + + {name} + +
+ )} +- {fullWidthIcon && (icon || emoji) && ( +- {name} ++ {!fullWidthIcon && ( ++ ++ {description} ++ + )} +- +- {description} +- + + + ); +@@ -141,7 +182,7 @@ + href={href} + target="_blank" + rel="noopener noreferrer" +- className={gridFeatureSizeToClasses[size]} ++ className={cn(gridFeatureSizeToClasses[size], mobileOrderClass)} + > + {gridFeatureCard} + diff --git a/opensaas-sh/app_diff/src/landing-page/components/Hero/Hero.tsx.diff b/opensaas-sh/app_diff/src/landing-page/components/Hero/Hero.tsx.diff new file mode 100644 index 0000000..d18261f --- /dev/null +++ b/opensaas-sh/app_diff/src/landing-page/components/Hero/Hero.tsx.diff @@ -0,0 +1,96 @@ +--- template/app/src/landing-page/components/Hero/Hero.tsx ++++ opensaas-sh/app/src/landing-page/components/Hero/Hero.tsx +@@ -0,0 +1,93 @@ ++import { ArrowRight } from "lucide-react"; ++import { Link as ReactRouterLink } from "react-router"; ++import { useAuth } from "wasp/client/auth"; ++import { Link as WaspRouterLink, routes } from "wasp/client/router"; ++import { Button } from "../../../client/components/ui/button"; ++import { DocsUrl, WaspUrl } from "../../../shared/common"; ++import { Orbit } from "./Orbit"; ++ ++export function Hero() { ++ const { data: user } = useAuth(); ++ ++ return ( ++
++ ++ ++
++
++
++
++

++ The free SaaS template with{" "} ++ ++ superpowers ++ ++

++

++ An open-source, feature-rich, React + NodeJS + Prisma starter ++ kit built for the AI era. Powered by ++ ++ {" Wasp =}"} ++ ++

++
++ ++ ++
++
++
++
++
++ ++
++
++
++ ); ++} ++ ++function TopGradient() { ++ return ( ++