From e443e5a5f4150d7412d8a0d1c9188b1ae77325e6 Mon Sep 17 00:00:00 2001 From: Andrei Ivascu <7030530+aivascu@users.noreply.github.com> Date: Mon, 31 Aug 2026 20:16:20 +0300 Subject: [PATCH 1/6] Replace the Jekyll docs site with Nuxt Content, DocFX API generation, and GitHub Pages Actions. Ship guides as Nuxt Content, generate API reference from pinned NuGet packages at build time, and deploy to autofixture.com on every merge to master. --- .devcontainer/Dockerfile | 63 - .devcontainer/devcontainer.json | 26 - .github/actions/build-site/action.yml | 68 + .github/workflows/ci.yml | 24 + .github/workflows/deploy.yml | 47 + .gitignore | 31 +- CNAME | 2 +- DEPLOYMENT.md | 119 + Gemfile | 24 - Gemfile.lock | 215 - _config.yml | 291 - _data/navigation.yml | 17 - _docs/anonymous-variables.md | 122 - _docs/fixture-customization.md | 68 - _docs/quick-start.md | 184 - _includes/head/custom.html | 5 - _pages/home.md | 61 - api-gen/lib/catalog.mjs | 98 + api-gen/lib/nuget.mjs | 101 + api-gen/lib/page-artifacts.mjs | 386 + api-gen/lib/postprocess.mjs | 216 + api-gen/lib/version.mjs | 11 + api-gen/packages.json | 175 + api-gen/readme.md | 73 + api-gen/run.mjs | 280 + assets/css/main.scss | 16 - assets/images/logo.svg | 103 - assets/images/logo200x200.png | Bin 14319 -> 0 bytes favicon-16x16.png | Bin 1142 -> 0 bytes favicon-32x32.png | Bin 1443 -> 0 bytes favicon.ico | Bin 15086 -> 0 bytes index.html | 4 - justfile | 41 + manifest.json | 13 - readme.md | 75 +- site/.gitignore | 24 + site/app/app.config.ts | 8 + site/app/app.vue | 212 + site/app/assets/css/main.css | 150 + site/app/components/ApiPackageSelect.vue | 34 + site/app/components/ApiPageContent.vue | 30 + site/app/components/ApiVersionSelect.vue | 42 + site/app/components/AppLogo.vue | 62 + site/app/components/LandingCodeBlock.vue | 33 + site/app/composables/useApiCatalog.ts | 55 + site/app/composables/useApiContext.ts | 57 + site/app/composables/useApiNavigation.ts | 55 + site/app/composables/useApiPage.ts | 19 + site/app/composables/useApiSearchSections.ts | 51 + site/app/layouts/api.vue | 36 + site/app/layouts/default.vue | 3 + site/app/layouts/docs.vue | 30 + site/app/middleware/api-normalize.ts | 11 + site/app/pages/api/[...slug].vue | 89 + site/app/pages/docs/[...slug].vue | 64 + site/app/pages/docs/index.vue | 9 + site/app/pages/index.vue | 259 + site/app/types/api-catalog.ts | 21 + site/app/types/api-page.ts | 24 + site/app/types/api-toc.ts | 5 + site/content.config.ts | 22 + .../docs/1.get-started/.navigation.yml | 2 + .../docs/1.get-started/1.introduction.md | 72 + .../docs/1.get-started/2.installation.md | 57 + .../docs/1.get-started/3.first-test.md | 51 + .../1.get-started/4.refactoring-a-test.md | 249 + .../docs/2.fundamentals/.navigation.yml | 2 + .../2.fundamentals/1.fixture-and-create.md | 57 + .../docs/2.fundamentals/2.build-dsl.md | 66 + .../docs/2.fundamentals/3.customizations.md | 132 + .../docs/2.fundamentals/4.specimen-graphs.md | 40 + .../docs/2.fundamentals/5.behaviors.md | 63 + .../6.customizations-catalog.md | 111 + site/content/docs/3.how-to/.navigation.yml | 2 + site/content/docs/3.how-to/1.collections.md | 152 + site/content/docs/3.how-to/2.circular-refs.md | 52 + .../docs/3.how-to/3.register-freeze-inject.md | 56 + .../docs/3.how-to/4.data-annotations.md | 38 + .../content/docs/4.extensions/.navigation.yml | 2 + site/content/docs/4.extensions/1.idioms.md | 193 + .../docs/4.extensions/2.seed-extensions.md | 102 + .../docs/5.integrations/.navigation.yml | 2 + .../content/docs/5.integrations/0.overview.md | 31 + site/content/docs/5.integrations/1.xunit3.md | 281 + site/content/docs/5.integrations/2.automoq.md | 219 + site/content/docs/5.integrations/4.nunit4.md | 278 + .../docs/5.integrations/6.autonsubstitute.md | 205 + .../docs/5.integrations/9.autofakeiteasy.md | 190 + site/content/docs/6.advanced/.navigation.yml | 2 + site/content/docs/6.advanced/0.overview.md | 18 + .../docs/6.advanced/1.specimen-pipeline.md | 208 + .../2.specimen-builders-and-specifications.md | 138 + site/content/docs/7.reference/.navigation.yml | 2 + site/content/docs/7.reference/1.packages.md | 46 + .../docs/7.reference/2.api-reference.md | 27 + .../content/docs/7.reference/3.cheat-sheet.md | 199 + site/content/docs/7.reference/4.faq.md | 156 + .../docs/7.reference/5.compatibility.md | 38 + .../docs/7.reference/6.v4-to-v5-migration.md | 56 + .../docs/7.reference/7.previous-versions.md | 64 + site/content/index.md | 8 + site/nuxt.config.ts | 107 + site/package-lock.json | 16244 ++++++++++++++++ site/package.json | 26 + site/public/CNAME | 1 + site/public/dotnet-foundation.svg | 1 + site/public/favicon.ico | Bin 0 -> 4286 bytes site/public/favicon.svg | 7 + site/public/icon.svg | 7 + site/public/images/fixture-pipeline.png | Bin 0 -> 97176 bytes site/public/logo.svg | 15 + site/readme.md | 21 + site/server/api/highlight-code.post.ts | 11 + .../middleware/api-canonical-redirect.ts | 22 + site/server/routes/api-render.get.ts | 12 + site/server/utils/apiPaths.ts | 30 + site/server/utils/apiSlugIndex.ts | 13 + site/server/utils/highlightCode.ts | 42 + site/server/utils/loadApiPage.ts | 30 + site/server/utils/renderApiMarkdown.ts | 90 + site/tsconfig.json | 18 + 121 files changed, 23468 insertions(+), 1260 deletions(-) delete mode 100644 .devcontainer/Dockerfile delete mode 100644 .devcontainer/devcontainer.json create mode 100644 .github/actions/build-site/action.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/deploy.yml create mode 100644 DEPLOYMENT.md delete mode 100644 Gemfile delete mode 100644 Gemfile.lock delete mode 100644 _config.yml delete mode 100644 _data/navigation.yml delete mode 100644 _docs/anonymous-variables.md delete mode 100644 _docs/fixture-customization.md delete mode 100644 _docs/quick-start.md delete mode 100644 _includes/head/custom.html delete mode 100644 _pages/home.md create mode 100644 api-gen/lib/catalog.mjs create mode 100644 api-gen/lib/nuget.mjs create mode 100644 api-gen/lib/page-artifacts.mjs create mode 100644 api-gen/lib/postprocess.mjs create mode 100644 api-gen/lib/version.mjs create mode 100644 api-gen/packages.json create mode 100644 api-gen/readme.md create mode 100644 api-gen/run.mjs delete mode 100644 assets/css/main.scss delete mode 100644 assets/images/logo.svg delete mode 100644 assets/images/logo200x200.png delete mode 100644 favicon-16x16.png delete mode 100644 favicon-32x32.png delete mode 100644 favicon.ico delete mode 100644 index.html create mode 100644 justfile delete mode 100644 manifest.json create mode 100644 site/.gitignore create mode 100644 site/app/app.config.ts create mode 100644 site/app/app.vue create mode 100644 site/app/assets/css/main.css create mode 100644 site/app/components/ApiPackageSelect.vue create mode 100644 site/app/components/ApiPageContent.vue create mode 100644 site/app/components/ApiVersionSelect.vue create mode 100644 site/app/components/AppLogo.vue create mode 100644 site/app/components/LandingCodeBlock.vue create mode 100644 site/app/composables/useApiCatalog.ts create mode 100644 site/app/composables/useApiContext.ts create mode 100644 site/app/composables/useApiNavigation.ts create mode 100644 site/app/composables/useApiPage.ts create mode 100644 site/app/composables/useApiSearchSections.ts create mode 100644 site/app/layouts/api.vue create mode 100644 site/app/layouts/default.vue create mode 100644 site/app/layouts/docs.vue create mode 100644 site/app/middleware/api-normalize.ts create mode 100644 site/app/pages/api/[...slug].vue create mode 100644 site/app/pages/docs/[...slug].vue create mode 100644 site/app/pages/docs/index.vue create mode 100644 site/app/pages/index.vue create mode 100644 site/app/types/api-catalog.ts create mode 100644 site/app/types/api-page.ts create mode 100644 site/app/types/api-toc.ts create mode 100644 site/content.config.ts create mode 100644 site/content/docs/1.get-started/.navigation.yml create mode 100644 site/content/docs/1.get-started/1.introduction.md create mode 100644 site/content/docs/1.get-started/2.installation.md create mode 100644 site/content/docs/1.get-started/3.first-test.md create mode 100644 site/content/docs/1.get-started/4.refactoring-a-test.md create mode 100644 site/content/docs/2.fundamentals/.navigation.yml create mode 100644 site/content/docs/2.fundamentals/1.fixture-and-create.md create mode 100644 site/content/docs/2.fundamentals/2.build-dsl.md create mode 100644 site/content/docs/2.fundamentals/3.customizations.md create mode 100644 site/content/docs/2.fundamentals/4.specimen-graphs.md create mode 100644 site/content/docs/2.fundamentals/5.behaviors.md create mode 100644 site/content/docs/2.fundamentals/6.customizations-catalog.md create mode 100644 site/content/docs/3.how-to/.navigation.yml create mode 100644 site/content/docs/3.how-to/1.collections.md create mode 100644 site/content/docs/3.how-to/2.circular-refs.md create mode 100644 site/content/docs/3.how-to/3.register-freeze-inject.md create mode 100644 site/content/docs/3.how-to/4.data-annotations.md create mode 100644 site/content/docs/4.extensions/.navigation.yml create mode 100644 site/content/docs/4.extensions/1.idioms.md create mode 100644 site/content/docs/4.extensions/2.seed-extensions.md create mode 100644 site/content/docs/5.integrations/.navigation.yml create mode 100644 site/content/docs/5.integrations/0.overview.md create mode 100644 site/content/docs/5.integrations/1.xunit3.md create mode 100644 site/content/docs/5.integrations/2.automoq.md create mode 100644 site/content/docs/5.integrations/4.nunit4.md create mode 100644 site/content/docs/5.integrations/6.autonsubstitute.md create mode 100644 site/content/docs/5.integrations/9.autofakeiteasy.md create mode 100644 site/content/docs/6.advanced/.navigation.yml create mode 100644 site/content/docs/6.advanced/0.overview.md create mode 100644 site/content/docs/6.advanced/1.specimen-pipeline.md create mode 100644 site/content/docs/6.advanced/2.specimen-builders-and-specifications.md create mode 100644 site/content/docs/7.reference/.navigation.yml create mode 100644 site/content/docs/7.reference/1.packages.md create mode 100644 site/content/docs/7.reference/2.api-reference.md create mode 100644 site/content/docs/7.reference/3.cheat-sheet.md create mode 100644 site/content/docs/7.reference/4.faq.md create mode 100644 site/content/docs/7.reference/5.compatibility.md create mode 100644 site/content/docs/7.reference/6.v4-to-v5-migration.md create mode 100644 site/content/docs/7.reference/7.previous-versions.md create mode 100644 site/content/index.md create mode 100644 site/nuxt.config.ts create mode 100644 site/package-lock.json create mode 100644 site/package.json create mode 100644 site/public/CNAME create mode 100644 site/public/dotnet-foundation.svg create mode 100644 site/public/favicon.ico create mode 100644 site/public/favicon.svg create mode 100644 site/public/icon.svg create mode 100644 site/public/images/fixture-pipeline.png create mode 100644 site/public/logo.svg create mode 100644 site/readme.md create mode 100644 site/server/api/highlight-code.post.ts create mode 100644 site/server/middleware/api-canonical-redirect.ts create mode 100644 site/server/routes/api-render.get.ts create mode 100644 site/server/utils/apiPaths.ts create mode 100644 site/server/utils/apiSlugIndex.ts create mode 100644 site/server/utils/highlightCode.ts create mode 100644 site/server/utils/loadApiPage.ts create mode 100644 site/server/utils/renderApiMarkdown.ts create mode 100644 site/tsconfig.json diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index 0cae282..0000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1,63 +0,0 @@ -FROM debian:10 - -# This Dockerfile adds a non-root 'vscode' user with sudo access. However, for Linux, -# this user's GID/UID must match your local user UID/GID to avoid permission issues -# with bind mounts. Update USER_UID / USER_GID if yours is not 1000. See -# https://aka.ms/vscode-remote/containers/non-root-user for details. -ARG USERNAME=vscode -ARG USER_UID=1000 -ARG USER_GID=$USER_UID - -# Set default locale for the environment -ENV LC_ALL C.UTF-8 -ENV LANG en_US.UTF-8 -ENV LANGUAGE en_US.UTF-8 - -EXPOSE 4000 - -# Configure apt and install packages -RUN apt-get update \ - && export DEBIAN_FRONTEND=noninteractive \ - && apt-get -y install --no-install-recommends apt-utils dialog 2>&1 \ - # - # Install vim, git, process tools, lsb-release - && apt-get install -y \ - locales \ - git \ - openssh-client \ - less \ - # - # Install ruby - make \ - build-essential \ - ruby \ - ruby-full \ - zlib1g-dev \ - liblzma-dev \ - # - # Configures the locales - && dpkg-reconfigure locales \ - && locale-gen C.UTF-8 \ - && /usr/sbin/update-locale LANG=C.UTF-8 \ - # - # Install needed default locale for Makefly - && echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen \ - && locale-gen \ - # - # Install jekyll - && gem install \ - bundler \ - jekyll \ - # - # Create a non-root user to use if preferred - see https://aka.ms/vscode-remote/containers/non-root-user. - && groupadd --gid $USER_GID $USERNAME \ - && useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME \ - # [Optional] Add sudo support for the non-root user - && apt-get install -y sudo \ - && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME\ - && chmod 0440 /etc/sudoers.d/$USERNAME \ - # - # Clean up - && apt-get autoremove -y \ - && apt-get clean -y \ - && rm -rf /var/lib/apt/lists/* diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index 75f32a7..0000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,26 +0,0 @@ -// For format details, see https://aka.ms/vscode-remote/devcontainer.json or this file's README at: -// https://github.com/microsoft/vscode-dev-containers/tree/v0.128.0/containers/jekyll -{ - "name": "Jekyll", - "dockerFile": "Dockerfile", - // Set *default* container specific settings.json values on container create. - "settings": { - "terminal.integrated.shell.linux": "/bin/bash" - }, - // Add the IDs of extensions you want installed when the container is created. - "extensions": [ - "editorconfig.editorconfig", - "davidanson.vscode-markdownlint", - "bierner.github-markdown-preview", - "yzhang.markdown-all-in-one", - "mhutchie.git-graph", - "eamodio.gitlens", - "streetsidesoftware.code-spell-checker" - ], - // Use 'forwardPorts' to make a list of ports inside the container available locally. - "forwardPorts": [4000], - // Use 'postCreateCommand' to run commands after the container is created. - "postCreateCommand": "bundle install", - // Uncomment to connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root. - "remoteUser": "vscode" -} diff --git a/.github/actions/build-site/action.yml b/.github/actions/build-site/action.yml new file mode 100644 index 0000000..0187fd6 --- /dev/null +++ b/.github/actions/build-site/action.yml @@ -0,0 +1,68 @@ +name: Build documentation site +description: Generate API markdown with DocFX, then statically generate the Nuxt site + +inputs: + node-version: + description: Node.js version + required: false + default: '22' + dotnet-version: + description: .NET SDK version + required: false + default: '8.0.x' + +runs: + using: composite + steps: + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ inputs.dotnet-version }} + + - name: Install DocFX + shell: bash + run: | + dotnet tool install -g docfx + echo "$HOME/.dotnet/tools" >> "$GITHUB_PATH" + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ inputs.node-version }} + cache: npm + cache-dependency-path: site/package-lock.json + + - name: Cache NuGet packages for API generation + uses: actions/cache@v4 + with: + path: api-gen/packages-cache + key: api-nuget-${{ hashFiles('api-gen/packages.json') }} + restore-keys: | + api-nuget- + + - name: Generate API markdown + shell: bash + run: node api-gen/run.mjs prepare + + - name: Install site dependencies + shell: bash + run: npm ci + working-directory: site + + - name: Generate static site + shell: bash + run: npm run generate + working-directory: site + + - name: Ensure CNAME in site output + shell: bash + run: | + mkdir -p site/.output/public + if [ -f site/public/CNAME ]; then + cp site/public/CNAME site/.output/public/CNAME + elif [ -f CNAME ]; then + cp CNAME site/.output/public/CNAME + else + echo "Missing CNAME for GitHub Pages custom domain" >&2 + exit 1 + fi diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..69cf664 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,24 @@ +name: CI + +on: + pull_request: + branches: + - master + +concurrency: + group: ci-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + build: + name: Build site + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Build documentation site + uses: ./.github/actions/build-site diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..ae24b2e --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,47 @@ +name: Deploy + +on: + push: + branches: + - master + workflow_dispatch: + +concurrency: + group: pages + cancel-in-progress: false + +permissions: + contents: read + pages: write + id-token: write + +jobs: + build: + name: Build site + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Pages + uses: actions/configure-pages@v5 + + - name: Build documentation site + uses: ./.github/actions/build-site + + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v4 + with: + path: site/.output/public + + deploy: + name: Deploy to GitHub Pages + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index d8274c5..3f15dbf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,29 @@ -_site -.sass-cache -.jekyll-metadata +############### +# API generator +############### +api-gen/repos/ +api-gen/packages-cache/ +api-gen/out/ +api-gen/docfx.json + +############### +# Nuxt site +############### +site/node_modules/ +site/.nuxt/ +site/.output/ +site/dist/ +site/.data/ +site/content/api/ +site/public/api-markdown/ +site/public/api-meta/ +site/public/api-catalog.json + +############### +# OS / IDE +############### +node_modules/ *.swp +.vs/ +.DS_Store +*.log diff --git a/CNAME b/CNAME index 4b21d0a..f75d768 100644 --- a/CNAME +++ b/CNAME @@ -1 +1 @@ -autofixture.io \ No newline at end of file +autofixture.com diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md new file mode 100644 index 0000000..d6321a5 --- /dev/null +++ b/DEPLOYMENT.md @@ -0,0 +1,119 @@ +# Deployment runbook + +How we build and publish https://autofixture.com from this repo using **GitHub Pages + GitHub Actions** (Option A). + +## Architecture (short) + +| Stage | What happens | +|-------|----------------| +| API gen | `node api-gen/run.mjs prepare` downloads pinned NuGet packages, runs DocFX, writes markdown + meta into `site/public/` (not committed) | +| Site | `npm run generate` in `site/` prerenders docs + API routes to `site/.output/public` | +| Host | `actions/upload-pages-artifact` + `actions/deploy-pages` publish that folder | + +Custom domain: `site/public/CNAME` → `autofixture.com` (must be in the uploaded artifact root). + +## Workflows + +| Workflow | File | When | Purpose | +|----------|------|------|---------| +| **CI** | `.github/workflows/ci.yml` | Pull requests to `master` | Same build as production; no deploy | +| **Deploy** | `.github/workflows/deploy.yml` | Push to `master`, or manual `workflow_dispatch` | Build + publish to Pages | + +Shared build steps live in `.github/actions/build-site/`. + +## One-time repo setup + +Do this once (org admin / repo admin): + +1. Open **Settings → Pages**. +2. Under **Build and deployment → Source**, choose **GitHub Actions** (not “Deploy from a branch”). +3. Confirm custom domain is **`autofixture.com`** (already set in Pages; keep `CNAME` files in sync). +4. After the first successful Actions deploy and DNS is correct, enable **Enforce HTTPS**. +5. Optional: under **Environments → github-pages**, require reviewers if you want a human gate before production publishes. + +No deploy secrets are required for public NuGet + public Pages. + +## Everyday deploy + +1. Open a PR → **CI** must pass (build only). +2. Merge to **`master`** → **Deploy** runs automatically. +3. Check the Actions run, then open https://autofixture.com (or the `page_url` from the deploy job). + +Manual republish (same commit, no code change): + +```bash +gh workflow run Deploy --repo AutoFixture/AutoFixture.github.io +``` + +Or: Actions → **Deploy** → **Run workflow**. + +## Local parity + +Approximate what CI does: + +```bash +# Needs: Node 22+, .NET SDK 8+, DocFX (`dotnet tool install -g docfx`) +node api-gen/run.mjs prepare +npm ci --prefix site +npm run generate --prefix site +# Static output: site/.output/public +``` + +Or with just: + +```bash +just prepare-api +just site-install +just site-generate +``` + +Preview the static output: + +```bash +npx --prefix site serve site/.output/public +``` + +## Rollback + +GitHub Pages keeps recent deployments. Options: + +1. **Re-run** a previous successful **Deploy** workflow run (Actions → that run → Re-run all jobs), if the commit still matches what you want. +2. **Revert** the bad commit on `master` and push (triggers a new good deploy). +3. Checkout an older commit and use **workflow_dispatch** only if you temporarily point the workflow at that ref (prefer revert for clarity). + +## Updating API package versions + +Versions are pinned in `api-gen/packages.json`. To refresh API docs after a NuGet release: + +1. Edit versions in `api-gen/packages.json`. +2. Run `node api-gen/run.mjs prepare` locally and spot-check. +3. PR → merge → Deploy regenerates API in CI (no generated files in git). + +## DNS / domain notes + +- **Canonical:** `autofixture.com` → GitHub Pages (`A`/`AAAA` + `www` CNAME to `autofixture.github.io`). +- **Aliases:** `autofixture.io`, `.net`, `.org` → permanent redirect to `https://autofixture.com/` (Namecheap URL Redirect is HTTP-only; HTTPS redirects planned via Cloudflare DNS later). +- One custom domain per Pages site. Keep both `CNAME` (repo root) and `site/public/CNAME` equal to `autofixture.com` so Actions deploys do not overwrite Pages back to an old domain. + +## Troubleshooting + +| Symptom | Likely cause | What to try | +|---------|--------------|-------------| +| Deploy fails: Pages source | Still on “Deploy from a branch” | Switch Source to **GitHub Actions** | +| 403 on deploy | Missing `pages: write` / `id-token: write` | Check `deploy.yml` permissions | +| Missing / wrong domain | `CNAME` not in artifact or still `.io` | Ensure `site/public/CNAME` is `autofixture.com` | +| DocFX not found | Tool not on PATH | Composite action installs DocFX and adds `~/.dotnet/tools` | +| Slow builds | Cold NuGet cache | Wait for `api-gen/packages-cache` cache hit on next run | +| API page empty after client nav | Server route not available on static host | Prefer full page load / prerendered routes; open an issue if a route was not prerendered | +| HTTPS cert pending | New custom domain | Wait for Let’s Encrypt; then Enforce HTTPS | + +## Go-live checklist (first Actions deploy) + +- [ ] Pages source set to **GitHub Actions** +- [ ] Pages custom domain is **`autofixture.com`** + Enforce HTTPS +- [ ] `CNAME` and `site/public/CNAME` are `autofixture.com` +- [ ] PR CI green on a test PR +- [ ] Merge to `master` (or `workflow_dispatch`) succeeds +- [ ] https://autofixture.com serves the Nuxt site (not the old Jekyll site) +- [ ] Spot-check `/docs/...` and a few `/api/...` deep links +- [ ] Confirm `.io` / `.net` / `.org` redirect to `.com` (HTTPS via Cloudflare later if needed) diff --git a/Gemfile b/Gemfile deleted file mode 100644 index 4545271..0000000 --- a/Gemfile +++ /dev/null @@ -1,24 +0,0 @@ -source "https://rubygems.org" - -# Hello! This is where you manage which Jekyll version is used to run. -# When you want to use a different version, change it below, save the -# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: -# -# bundle exec jekyll serve -# -# This will help ensure the proper Jekyll version is running. -# Happy Jekylling! - -# To upgrade, run `bundle update`. - -gem "kramdown", ">= 2.3.0" -gem "nokogiri", ">= 1.11.1" - -gem "github-pages", group: :jekyll_plugins - -# If you have any other plugins, put them here! -group :jekyll_plugins do - gem "jekyll-include-cache" -end - -gem 'wdm', '>= 0.1.0' if Gem.win_platform? diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index 60323e6..0000000 --- a/Gemfile.lock +++ /dev/null @@ -1,215 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - activesupport (6.0.6.1) - concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 0.7, < 2) - minitest (~> 5.1) - tzinfo (~> 1.1) - zeitwerk (~> 2.2, >= 2.2.2) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.11.1) - colorator (1.1.0) - commonmarker (0.17.13) - ruby-enum (~> 0.5) - concurrent-ruby (1.2.0) - dnsruby (1.61.5) - simpleidn (~> 0.1) - em-websocket (0.5.2) - eventmachine (>= 0.12.9) - http_parser.rb (~> 0.6.0) - ethon (0.12.0) - ffi (>= 1.3.0) - eventmachine (1.2.7) - execjs (2.7.0) - faraday (1.3.0) - faraday-net_http (~> 1.0) - multipart-post (>= 1.2, < 3) - ruby2_keywords - faraday-net_http (1.0.1) - ffi (1.14.2) - forwardable-extended (2.6.0) - gemoji (3.0.1) - github-pages (217) - github-pages-health-check (= 1.17.2) - jekyll (= 3.9.0) - jekyll-avatar (= 0.7.0) - jekyll-coffeescript (= 1.1.1) - jekyll-commonmark-ghpages (= 0.1.6) - jekyll-default-layout (= 0.1.4) - jekyll-feed (= 0.15.1) - jekyll-gist (= 1.5.0) - jekyll-github-metadata (= 2.13.0) - jekyll-mentions (= 1.6.0) - jekyll-optional-front-matter (= 0.3.2) - jekyll-paginate (= 1.1.0) - jekyll-readme-index (= 0.3.0) - jekyll-redirect-from (= 0.16.0) - jekyll-relative-links (= 0.6.1) - jekyll-remote-theme (= 0.4.3) - jekyll-sass-converter (= 1.5.2) - jekyll-seo-tag (= 2.7.1) - jekyll-sitemap (= 1.4.0) - jekyll-titles-from-headings (= 0.5.3) - jemoji (= 0.12.0) - kramdown (= 2.3.1) - kramdown-parser-gfm (= 1.1.0) - liquid (= 4.0.3) - mercenary (~> 0.3) - minima (= 2.5.1) - nokogiri (>= 1.10.4, < 2.0) - rouge (= 3.26.0) - terminal-table (~> 1.4) - github-pages-health-check (1.17.2) - addressable (~> 2.3) - dnsruby (~> 1.60) - octokit (~> 4.0) - public_suffix (>= 2.0.2, < 5.0) - typhoeus (~> 1.3) - html-pipeline (2.14.0) - activesupport (>= 2) - nokogiri (>= 1.4) - http_parser.rb (0.6.0) - i18n (0.9.5) - concurrent-ruby (~> 1.0) - jekyll (3.9.0) - addressable (~> 2.4) - colorator (~> 1.0) - em-websocket (~> 0.5) - i18n (~> 0.7) - jekyll-sass-converter (~> 1.0) - jekyll-watch (~> 2.0) - kramdown (>= 1.17, < 3) - liquid (~> 4.0) - mercenary (~> 0.3.3) - pathutil (~> 0.9) - rouge (>= 1.7, < 4) - safe_yaml (~> 1.0) - jekyll-avatar (0.7.0) - jekyll (>= 3.0, < 5.0) - jekyll-coffeescript (1.1.1) - coffee-script (~> 2.2) - coffee-script-source (~> 1.11.1) - jekyll-commonmark (1.3.1) - commonmarker (~> 0.14) - jekyll (>= 3.7, < 5.0) - jekyll-commonmark-ghpages (0.1.6) - commonmarker (~> 0.17.6) - jekyll-commonmark (~> 1.2) - rouge (>= 2.0, < 4.0) - jekyll-default-layout (0.1.4) - jekyll (~> 3.0) - jekyll-feed (0.15.1) - jekyll (>= 3.7, < 5.0) - jekyll-gist (1.5.0) - octokit (~> 4.2) - jekyll-github-metadata (2.13.0) - jekyll (>= 3.4, < 5.0) - octokit (~> 4.0, != 4.4.0) - jekyll-include-cache (0.2.1) - jekyll (>= 3.7, < 5.0) - jekyll-mentions (1.6.0) - html-pipeline (~> 2.3) - jekyll (>= 3.7, < 5.0) - jekyll-optional-front-matter (0.3.2) - jekyll (>= 3.0, < 5.0) - jekyll-paginate (1.1.0) - jekyll-readme-index (0.3.0) - jekyll (>= 3.0, < 5.0) - jekyll-redirect-from (0.16.0) - jekyll (>= 3.3, < 5.0) - jekyll-relative-links (0.6.1) - jekyll (>= 3.3, < 5.0) - jekyll-remote-theme (0.4.3) - addressable (~> 2.0) - jekyll (>= 3.5, < 5.0) - jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) - rubyzip (>= 1.3.0, < 3.0) - jekyll-sass-converter (1.5.2) - sass (~> 3.4) - jekyll-seo-tag (2.7.1) - jekyll (>= 3.8, < 5.0) - jekyll-sitemap (1.4.0) - jekyll (>= 3.7, < 5.0) - jekyll-titles-from-headings (0.5.3) - jekyll (>= 3.3, < 5.0) - jekyll-watch (2.2.1) - listen (~> 3.0) - jemoji (0.12.0) - gemoji (~> 3.0) - html-pipeline (~> 2.2) - jekyll (>= 3.0, < 5.0) - kramdown (2.3.1) - rexml - kramdown-parser-gfm (1.1.0) - kramdown (~> 2.0) - liquid (4.0.3) - listen (3.4.1) - rb-fsevent (~> 0.10, >= 0.10.3) - rb-inotify (~> 0.9, >= 0.9.10) - mercenary (0.3.6) - mini_portile2 (2.8.1) - minima (2.5.1) - jekyll (>= 3.5, < 5.0) - jekyll-feed (~> 0.9) - jekyll-seo-tag (~> 2.1) - minitest (5.17.0) - multipart-post (2.1.1) - nokogiri (1.14.3) - mini_portile2 (~> 2.8.0) - racc (~> 1.4) - octokit (4.20.0) - faraday (>= 0.9) - sawyer (~> 0.8.0, >= 0.5.3) - pathutil (0.16.2) - forwardable-extended (~> 2.6) - public_suffix (3.1.1) - racc (1.6.2) - rb-fsevent (0.10.4) - rb-inotify (0.10.1) - ffi (~> 1.0) - rexml (3.2.5) - rouge (3.26.0) - ruby-enum (0.9.0) - i18n - ruby2_keywords (0.0.4) - rubyzip (2.3.0) - safe_yaml (1.0.5) - sass (3.7.4) - sass-listen (~> 4.0.0) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - sawyer (0.8.2) - addressable (>= 2.3.5) - faraday (> 0.8, < 2.0) - simpleidn (0.2.1) - unf (~> 0.1.4) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) - thread_safe (0.3.6) - typhoeus (1.4.0) - ethon (>= 0.9.0) - tzinfo (1.2.11) - thread_safe (~> 0.1) - unf (0.1.4) - unf_ext - unf_ext (0.0.7.7) - unicode-display_width (1.7.0) - zeitwerk (2.6.6) - -PLATFORMS - ruby - -DEPENDENCIES - github-pages - jekyll-include-cache - kramdown (>= 2.3.0) - nokogiri (>= 1.11.1) - -BUNDLED WITH - 2.1.4 diff --git a/_config.yml b/_config.yml deleted file mode 100644 index e3922d5..0000000 --- a/_config.yml +++ /dev/null @@ -1,291 +0,0 @@ -# Welcome to Jekyll! -# -# This config file is meant for settings that affect your entire site, values -# which you are expected to set up once and rarely need to edit after that. -# For technical reasons, this file is *NOT* reloaded automatically when you use -# `jekyll serve`. If you change this file, please restart the server process. - -# Theme Settings -# -# Review documentation to determine if you should use `theme` or `remote_theme` -# https://mmistakes.github.io/minimal-mistakes/docs/quick-start-guide/#installing-the-theme - -remote_theme : "mmistakes/minimal-mistakes@4.15.1" -minimal_mistakes_skin : "default" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise" - -# Site Settings -locale : "en-US" -title : "AutoFixture" -title_separator : "-" -name : "AutoFixture" -description : "AutoFixture library documentation" -url : "https://autofixture.io" # the base hostname & protocol for your site e.g. "https://mmistakes.github.io" -baseurl : # the subpath of your site, e.g. "/blog" -repository : "AutoFixture/AutoFixture" # GitHub username/repo-name e.g. "mmistakes/minimal-mistakes" -teaser : # "/assets/images/logo200x200.png" # path of fallback teaser image, e.g. "/assets/images/500x300.png" -# breadcrumbs : false # true, false (default) -words_per_minute : 200 -comments: - provider : # false (default), "disqus", "discourse", "facebook", "google-plus", "staticman", "staticman_v2" "custom" - disqus: - shortname : # https://help.disqus.com/customer/portal/articles/466208-what-s-a-shortname- - discourse: - server : # https://meta.discourse.org/t/embedding-discourse-comments-via-javascript/31963 , e.g.: meta.discourse.org - facebook: - # https://developers.facebook.com/docs/plugins/comments - appid : - num_posts : # 5 (default) - colorscheme : # "light" (default), "dark" -staticman: - allowedFields : # ['name', 'email', 'url', 'message'] - branch : # "master" - commitMessage : # "New comment." - filename : # comment-{@timestamp} - format : # "yml" - moderation : # true - path : # "/_data/comments/{options.slug}" (default) - requiredFields : # ['name', 'email', 'message'] - transforms: - email : # "md5" - generatedFields: - date: - type : # "date" - options: - format : # "iso8601" (default), "timestamp-seconds", "timestamp-milliseconds" -reCaptcha: - siteKey : - secret : -atom_feed: - path : # blank (default) uses feed.xml -search : # true, false (default) -search_full_content : # true, false (default) -search_provider : # lunr (default), algolia, google -algolia: - application_id : # YOUR_APPLICATION_ID - index_name : # YOUR_INDEX_NAME - search_only_api_key : # YOUR_SEARCH_ONLY_API_KEY - powered_by : # true (default), false -google: - search_engine_id : # YOUR_SEARCH_ENGINE_ID - instant_search : # false (default), true -# SEO Related -google_site_verification : -bing_site_verification : -yandex_site_verification : -naver_site_verification : - -# Social Sharing -twitter: - username : "autofixture" -facebook: - username : - app_id : - publisher : -og_image : "/assets/images/logo200x200.png" # Open Graph/Twitter default site image -# For specifying social profiles -# - https://developers.google.com/structured-data/customize/social-profiles -social: - type : # Person or Organization (defaults to Person) - name : # If the user or organization name differs from the site's name - links: # An array of links to social media profiles - -# Analytics -analytics: - provider : false # false (default), "google", "google-universal", "custom" - google: - tracking_id : - anonymize_ip : # true, false (default) - - -# Site Author -author: - name : "Your Name" - avatar : # path of avatar image, e.g. "/assets/images/bio-photo.jpg" - bio : "I am an amazing person." - location : "Somewhere" - email : - uri : - home : # null (default), "absolute or relative url to link to author home" - bitbucket : - codepen : - dribbble : - flickr : - facebook : - foursquare : - github : "https://github.com/AutoFixture/AutoFixture" - gitlab : - google_plus : - keybase : - instagram : - lastfm : - linkedin : # "john-doe-12345678" (the last part of your profile url, e.g. https://www.linkedin.com/in/john-doe-12345678) - pinterest : - soundcloud : - stackoverflow : # "123456/username" (the last part of your profile url, e.g. https://stackoverflow.com/users/123456/username) - steam : # "steamId" (the last part of your profile url, e.g. https://steamcommunity.com/id/steamId/) - tumblr : - twitter : - vine : - weibo : - xing : - youtube : # "https://youtube.com/c/MichaelRoseDesign" - - -# Reading Files -include: - - .htaccess - - ["_pages"] -exclude: - - "*.sublime-project" - - "*.sublime-workspace" - - vendor - - .asset-cache - - .bundle - - .jekyll-assets-cache - - .sass-cache - - assets/js/plugins - - assets/js/_main.js - - assets/js/vendor - - Capfile - - CHANGELOG - - config - - Gemfile - - Gruntfile.js - - gulpfile.js - - LICENSE - - log - - node_modules - - package.json - - Rakefile - - README - - tmp - - /docs # ignore Minimal Mistakes /docs - - /test # ignore Minimal Mistakes /test -keep_files: - - .git - - .svn -encoding: "utf-8" -markdown_ext: "markdown,mkdown,mkdn,mkd,md" - - -# Conversion -markdown: kramdown -highlighter: rouge -lsi: false -excerpt_separator: "\n\n" -incremental: false - - -# Markdown Processing -kramdown: - input: GFM - hard_wrap: false - auto_ids: true - footnote_nr: 1 - entity_output: as_char - toc_levels: 1..6 - smart_quotes: lsquo,rsquo,ldquo,rdquo - enable_coderay: false - -# Sass/SCSS -sass: - sass_dir: _sass - style: compressed # http://sass-lang.com/documentation/file.SASS_REFERENCE.html#output_style - - -# Outputting -permalink: /:categories/:title/ -paginate: 5 # amount of posts to show -paginate_path: /page:num/ -timezone: # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - - -# Plugins (previously gems:) -plugins: - - jekyll-paginate - - jekyll-sitemap - - jekyll-gist - - jekyll-feed - - jemoji - - jekyll-include-cache - -# mimic GitHub Pages with --safe -whitelist: - - jekyll-paginate - - jekyll-sitemap - - jekyll-gist - - jekyll-feed - - jemoji - - -# Archives -# Type -# - GitHub Pages compatible archive pages built with Liquid ~> type: liquid (default) -# - Jekyll Archives plugin archive pages ~> type: jekyll-archives -# Path (examples) -# - Archive page should exist at path when using Liquid method or you can -# expect broken links (especially with breadcrumbs enabled) -# - /tags/my-awesome-tag/index.html ~> path: /tags/ -# - path: /categories/ -# - path: / -category_archive: - type: liquid - path: /categories/ -tag_archive: - type: liquid - path: /tags/ -# https://github.com/jekyll/jekyll-archives -# jekyll-archives: -# enabled: -# - categories -# - tags -# layouts: -# category: archive-taxonomy -# tag: archive-taxonomy -# permalinks: -# category: /categories/:name/ -# tag: /tags/:name/ - - -# HTML Compression -# - http://jch.penibelst.de/ -compress_html: - clippings: all - ignore: - envs: development - -# Collections -collections: - docs: - output: true - permalink: /:collection/:path/ - pages: - output: true - permalink: /:collection/:path/ - -# Defaults -defaults: - # _posts - - scope: - path: "" - type: posts - values: - layout: single - author_profile: true - read_time: false - comments: false - share: true - related: true - # _docs - - scope: - path: "" - type: docs - values: - layout: single - author_profile: false - read_time: false - comments: false - share: false - related: false - sidebar: - nav: "docs" diff --git a/_data/navigation.yml b/_data/navigation.yml deleted file mode 100644 index 899070f..0000000 --- a/_data/navigation.yml +++ /dev/null @@ -1,17 +0,0 @@ -main: - - title: ' Documentation' - url: /docs/quick-start/ - - title: ' GitHub' - url: https://github.com/AutoFixture/AutoFixture/ - - title: ' NuGet' - url: https://www.nuget.org/profiles/AutoFixture/ - -docs: - - title: "Quick-Start Guide" - url: /docs/quick-start/ - - title: "Fixture core" - children: - - title: "Anonymous variables" - url: /docs/anonymous-variables/ - - title: "Fixture customization" - url: /docs/fixture-customization/ diff --git a/_docs/anonymous-variables.md b/_docs/anonymous-variables.md deleted file mode 100644 index 29f205f..0000000 --- a/_docs/anonymous-variables.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -layout: single -title: "Anonymous variables" -classes: wide ---- - -## Basic types - -To ask AutoFixture for an object use the `Create()` method. AutoFixture is capable of primitive types creation: - -```c# -var fixture = new Fixture(); - -// Basic types -fixture.Create(); -fixture.Create(); -fixture.Create(); - -// Numeric types -fixture.Create(); -fixture.Create(); -fixture.Create(); -fixture.Create(); -``` - -The most popular BCL types are supported as well: - -```c# -fixture.Create(); -fixture.Create(); -fixture.Create(); -fixture.Create(); -fixture.Create(); -fixture.Create(); // All types are supported as nullable. -fixture.Create(); -fixture.Create>(); -fixture.Create>(); -``` - -AutoFixture uses different strategies for different types. The primitive and popular BCL types are supported directly, however it's not possible to support all the types this way. Therefore, for the unknown types the generic approach is applied: - -- Look for a public constructor or a static factory method (static method returning an instance of the current type). -- Resolve the constructor arguments and activate instance. -- Fill the writable public properties and fields (enabled by default; might be disabled via `fixture.OmitAutoProperties = true`) with generated values. - -See example: - -```c# -public class Identity -{ - public Guid Id { get; } - - public Identity(Guid id) - { - Id = id; - } -} - -public class Entity -{ - public Identity Id { get; } - public string Value { get; set; } - - public Entity(Identity id) - { - Id = id; - } -} - -[Fact] -public void CreateComplexType() -{ - var fixture = new Fixture(); - - var entity = fixture.Create(); - - Assert.NotNull(entity.Id); - Assert.NotEqual(default, entity.Id.Id); - Assert.NotNull(entity.Value); -} -``` - -In the sample above the whole object tree was recursively initialized with the generated values. - -## Collections and sequences - -AutoFixture recognizes the most popular collection and sequence types and returns non-empty results: - -```c# -fixture.Create>(); -fixture.Create(); -fixture.Create>(); -fixture.Create>(); -fixture.Create>(); -fixture.Create>(); -fixture.Create>(); -fixture.Create>(); -fixture.Create>(); -``` - -By default generated collections contain _many_ elements. The "many" size is controlled globally by the `fixture.RepeatCount` property. Currently the default is 3, but it's better to not rely on the exact value. If you need sequences with the exact number of elements, use the `CreateMany()` extension method. - -### CreateMany<T>() - -AutoFixture ships with the `CreateMany()` extension method to make it simpler create sequences: - -```c# -IEnumerable manyNumbers = fixture.CreateMany(); -IEnumerable fiveNumbers = fixture.CreateMany(count: 5); -``` - -If you write a test where the number of items does matter, it's always better to be explicit and use the `CreateMany()` method. - -## Summary - -Usually AutoFixture tries to return the most expected value you might want to get. For instance, we try to avoid return of exceptional values as usually your code doesn't expect that: - -- `null` value for the reference types -- empty strings -- throw exception in the generated delegates or tasks - -As result the deeply initialized graph usually suits for the most scenarios. For the cases when it doesn't, please use the customization feature described in the further sections. diff --git a/_docs/fixture-customization.md b/_docs/fixture-customization.md deleted file mode 100644 index bf41ddb..0000000 --- a/_docs/fixture-customization.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -layout: single -title: "Fixture customization" -classes: wide ---- - -AutoFixture is designed around the 80-20 (Pareto) principle. It is expected that the default `Fixture` instance will be able to create specimens witout too much trouble, in most cases. However there are situations, where AutoFixture needs some extra help. - -- When a class consumes an interface, the default `Fixture` will not be able to create an instance. (Solved with AutoMocking Customizations) -- When the API has circular references, Fixture might enter an infinite recursion. -- When constructors accept only arguments that don't fit with the default specimens created by the `Fixture`. - -To address these special cases, AutoFixture offers extension points, allowing client code to customize the default behavior. - -AutoFixture also offers an idiomatic way to encapsulate these customizations and also keep the code DRY, called _Customizations_. This concept corresponds closely to modularization APIs of seveal well-known DI containers, like Castle Windsor's _Installers_ or Autofac's _Modules_. - -## Implementing customizations - -Customizations are simply implementations of the `ICustomization` interface, that requires clients to implement a single method `Customize`. The method receives a single argument, which is the `Fixture` instance itself. - -```csharp -public interface ICustomization -{ - void Customize(IFixture fixture); -} -``` - -Anything that can be done using the `Fixture` instance can also be done with the `IFixture` instance passed in the customization. - -## Using customizations - -Customizing AutoFixture using _Customizations_ is a simple and straight-forward process. All that is necessary is to provide the `Fixture` an implementation of the `ICustomization` interface, using the `Customize` method. - -```csharp -var fixture = new Fixture() - .Customize(new AutoMoqCustomization()); -``` - -In the example above, the `Fixture` instance is customized by the client code using the `AutoMoqCustomization` provided in the [AutoFixture.AutoMoq](https://www.nuget.org/packages/AutoFixture.AutoMoq/) package. Note that almost every extension library provided by AutoFixture offers at least one Customization. - -## Reusing customizations - -By design customizations are intended to be small in scope, reusable and composable. Whenever implementing a custom customization, it is recommended to adhere to the DRY principle and avoid defining all the configuration inside a single customization instance. - -To be able to use multiple atomic customizations it is recommended to use the composite pattern. For convenience AutoFixture offers the `CompositeCustomization` class that implements the composite pattern for the `ICustomization` interface. - -```csharp -var fixture = new Fixture() - .Customize(new CompositeCustomization( - new AutoMoqCustomization(), - new NullRecursionCustomization(), - new CustomersCustomization() - )); -``` - -Composite customizations can also be implemented by inheriting from `CompositeCustomization`. This offers the benefit of having descriptive names for sets of related customizations. - -```csharp -class DomainCustomization : CompositeCustomization -{ - public DomainCustomization() - : base( - new CustomersCustomization(), - new AddressCustomization()) - { - } -} -``` diff --git a/_docs/quick-start.md b/_docs/quick-start.md deleted file mode 100644 index ac2f14a..0000000 --- a/_docs/quick-start.md +++ /dev/null @@ -1,184 +0,0 @@ ---- -layout: single -title: "Quick Start" -classes: wide ---- - -## Installing AutoFixture - -To add AutoFixture to your project you'll need to install the package from NuGet, using either the command line or the package manager in your IDE. - -Here are some examples on how you can install the AutoFixture NuGet package. - -### .NET CLI - -```sh -> dotnet add package AutoFixture --version 4.13.0 -``` - -### Package Manager - -```ps -PM> Install-Package AutoFixture -Version 4.13.0 -``` - -### Project File - -```xml - - - - -``` - -## Using AutoFixture - -Now that the package is installed in your project, let's see how AutoFixture can help you write easier to understand and maintain unit-tests. - -We will start from a *typical example* of a unit-test and refactor it to showcase most of the AutoFixture features. - -```csharp -[Fact] -public void IntroductoryTest() -{ - // Arrange - var someDto = new ClientDto - { - Id = 291293, - Name = "John Doe", - Age = 42 - }; - var mailComposerMock = new Mock(); - mailComposerMock - .Setup(c => c.Compose(It.IsAny())) - .Returns(new EmptyMail()); - var repositoryMock = new Mock(); - var loggerMock = new Mock(); - var sut = new MyService( - mailComposerMock.Object, - repositoryMock.Object, - loggerMock.Object - ); - - // Act - var result = sut.SendEmail(someDto); - - // Assert - Assert.Equal(expectedNumber, result); -} -``` - -Right from the start we can notice that there is a lot going on in the `// Arrange` phase of the test. This will likely create a lot of work for anyone maintaining the code-base. Let's see how we can improve the test. - -### Generating test data - -First, we will introduce the `Fixture` class, that represents the entry point into AutoFixture, at the `// Arrange` phase: - -```csharp -var fixture = new Fixture(); -``` - -Next, we will use the fixture instance, to create our test data. To do this, we will replace the instantiation of the `ClientDto` class, with the following statement: - -```csharp -var someDto = fixture.Create(); -``` - -As you can see we do not set explicitly any inline values on the `someDto` instance. That is because AutoFixture will by default, take care of providing data to the constructor and will fill in the data, all the public properties. - -### Generating mocks - -So far we have saved a few lines of code by generating our test data. Let's optimize the test further by getting rid of the mock instantiations. - -To do this we will have to customize our fixture instance. Since we use `Moq` as our mocking framework we will use the `AutoFixture.AutoMoq` package to provide us with the necessary customization. - -```csharp -var fixture = new Fixture().Customize(new AutoMoqCustomization()); -``` - -Now AutoFixture will be able to create mocks as well as instances of Abstract types and interfaces. - -Since our mocks will now be auto-generated we can go straight on and generate our SUT instance. - -```csharp -var sut = fixture.Create(); -``` - -### Freezing values - -The `sut` instance generates fine, but there is an issue now. We still have to provide the behavior to our `mailComposerMock` to maintain feature parity for our tests. - -Luckily we can tell our fixture to "freeze" a particular type. This means that every time we request an instance of a frozen type, we will get the same instance. You can think of it as registering a singleton instance in an IoC container. - -```csharp -var mailComposerMock = fixture.Freeze>(); -``` - -So far our code looks like this: - -```csharp -[Fact] -public void IntroductoryTest() -{ - // Arrange - var fixture = new Fixture() - .Customize(new AutoMoqCustomization()); - var someDto = fixture.Create(); - var mailComposerMock = fixture.Freeze>(); - mailComposerMock - .Setup(c => c.Compose(It.IsAny())) - .Returns(new EmptyMail()); - var sut = fixture.Create(); - - // Act - var result = sut.SendEmail(someDto); - - // Assert - Assert.Equal(expectedNumber, result); -} -``` - -This is a significant improvement over the code we had initially. Let's go on and improve it further. - -### Injecting test data - -Wouldn't it be nice if we could get rid of the boilerplate code for customizing our feature and explicitly requesting instances? - -We can actually do this, by injecting our test data, directly into our test. -To do this, we'll have to first update our test, from a `[Fact]` to a `[Theory]`. - -Next we'll make use of AutoFixture's `[AutoData]` attribute and extend it contain our customizations. - -```csharp -public class AutoDomainDataAttribute : AutoDataAttribute -{ - public AutoDomainDataAttribute() - :base(() => new Fixture().Customize(new AutoMoqCustomization())) - { - } -} -``` - -Now we're ready to use the attribute in order to inject the test data into our test. - -```csharp -[Theory] -[AutoDomainData] -public void IntroductoryTest( - [Frozen] Mock mailComposerMock, - MyService sut, ClientDto someDto, EmptyMail mail) -{ - // Arrange - mailComposerMock - .Setup(c => c.Compose(It.IsAny())) - .Returns(mail); - - // Act - var result = sut.SendEmail(ClientDto); - - // Assert - Assert.Equal(expectedNumber, result); -} -``` - -There we are, this is much more maintainable and easier to read. diff --git a/_includes/head/custom.html b/_includes/head/custom.html deleted file mode 100644 index 7cd9183..0000000 --- a/_includes/head/custom.html +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/_pages/home.md b/_pages/home.md deleted file mode 100644 index 8283dbe..0000000 --- a/_pages/home.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -layout: splash -title: "Home" -permalink: / ---- - -## Overview - -AutoFixture is a tool designed to make Test-Driven Development more productive and unit tests more refactoring-safe. It does so by removing the need for hand-coding anonymous variables as part of a test's Arrange phase: - -```c# -[Fact] -public void IntroductoryTest() -{ - // Arrange - Fixture fixture = new Fixture(); - - int expectedNumber = fixture.Create(); - MyClass sut = fixture.Create(); - // Act - int result = sut.Echo(expectedNumber); - // Assert - Assert.Equal(expectedNumber, result); -} -``` - -This example illustrates the basic principle of AutoFixture: it can create values of virtually any type without the need for you to explicitly define which values should be used. - -AutoFixture offers integration with **xUnit** and **NUnit** making your unit tests even more concise: - -```c# -[Theory, AutoData] -public void IntroductoryTest(int expectedNumber, MyClass sut) -{ - int result = sut.Echo(expectedNumber); - Assert.Equal(expectedNumber, result); -} -``` - -AutoFixture also provides integration with popular mocking libraries (**NSubstitute**, **Moq**, **FakeItEasy**). See AutoFixture + xUnit + NSubstitute in action: - -```c# -[Theory, AutoNSubstituteData] // Notice, AutoNSubstituteData __is not__ provided out of the box. -public void IntroductoryTest(int expectedNumber, INumberSource numberSource, MyClass sut) -{ - numberSource.Number.Returns(expectedNumber); - - int result = sut.Echo(numberSource); - - Assert.Equal(expectedNumber, result); -} -``` - - -## Integration Libraries - -Additionally we provides a wide selection of integration libraries, that will help you take the most of AutoFixture, by integrating it with your unit-testing and mocking frameworks. - -Currently we support most popular unit-testing and mocking frameworks in the .NET ecosystem (e.g. **xUnit**, **NUnit**, **Moq**, **NSubstitute** and more). - -## Idiomatic assertions diff --git a/api-gen/lib/catalog.mjs b/api-gen/lib/catalog.mjs new file mode 100644 index 0000000..f56a19c --- /dev/null +++ b/api-gen/lib/catalog.mjs @@ -0,0 +1,98 @@ +import fs from 'node:fs' +import path from 'node:path' +import { toVersionSegment } from './version.mjs' +function walkMetaFiles(root) { + /** @type {string[]} */ + const files = [] + if (!fs.existsSync(root)) return files + + for (const entry of fs.readdirSync(root, { withFileTypes: true })) { + const full = path.join(root, entry.name) + if (entry.isDirectory()) { + files.push(...walkMetaFiles(full)) + continue + } + if (entry.name === 'meta.json') { + files.push(full) + } + } + + return files +} + +function compareVersions(left, right) { + const leftParts = left.split(/[.-]/).map((part) => Number.parseInt(part, 10) || 0) + const rightParts = right.split(/[.-]/).map((part) => Number.parseInt(part, 10) || 0) + const length = Math.max(leftParts.length, rightParts.length) + + for (let index = 0; index < length; index += 1) { + const delta = (leftParts[index] ?? 0) - (rightParts[index] ?? 0) + if (delta !== 0) return delta + } + + return 0 +} + +export function buildApiCatalog(outRoot) { + /** @type {Map} */ + const packages = new Map() + + for (const metaPath of walkMetaFiles(outRoot)) { + const meta = JSON.parse(fs.readFileSync(metaPath, 'utf8')) + const packageId = String(meta.packageId || '').toLowerCase() + const version = String(meta.version || '').trim() + const versionSegment = String(meta.versionSegment || toVersionSegment(version)).trim() + if (!packageId || !version || !versionSegment) continue + + const entry = packages.get(packageId) ?? { + id: packageId, + name: String(meta.package || packageId), + nugetId: String(meta.nugetId || meta.package || packageId), + primary: false, + versions: [], + } + + entry.primary = entry.primary || Boolean(meta.primary) + entry.name = String(meta.package || entry.name) + entry.nugetId = String(meta.nugetId || meta.package || entry.nugetId) + + entry.versions.push({ + version, + versionSegment, + line: meta.line ? String(meta.line) : undefined, + }) + packages.set(packageId, entry) + } + + for (const pkg of packages.values()) { + pkg.versions.sort((a, b) => compareVersions(b.version, a.version)) + const latest = pkg.versions[0] + if (latest) { + pkg.defaultVersion = latest.version + pkg.defaultVersionSegment = latest.versionSegment + pkg.versions = pkg.versions.map((item, index) => ({ + ...item, + isLatest: index === 0, + })) + } + } + + const packageList = [...packages.values()].sort((a, b) => a.name.localeCompare(b.name)) + const primary = packageList.find((entry) => entry.primary) ?? packageList[0] + const defaultPath = primary?.defaultVersionSegment + ? `/api/${primary.id}/${primary.defaultVersionSegment}` + : '/api' + + return { + defaultPath, + packages: packageList, + } +} + +export function writeApiCatalog(outRoot, catalogPath) { + const catalog = buildApiCatalog(outRoot) + fs.mkdirSync(path.dirname(catalogPath), { recursive: true }) + fs.writeFileSync(catalogPath, `${JSON.stringify(catalog, null, 2)}\n`) + console.log(`Wrote ${catalogPath} (${catalog.packages.length} package(s))`) + return catalog +} diff --git a/api-gen/lib/nuget.mjs b/api-gen/lib/nuget.mjs new file mode 100644 index 0000000..d44f05f --- /dev/null +++ b/api-gen/lib/nuget.mjs @@ -0,0 +1,101 @@ +import { execSync } from 'node:child_process' +import fs from 'node:fs' +import path from 'node:path' + +const NUGET_PACKAGE_URL = 'https://www.nuget.org/api/v2/package' + +export function nugetIdForPackage(pkg) { + return pkg.nugetId || pkg.name +} + +export function packageCacheDir(cacheRoot, pkg) { + const nugetId = nugetIdForPackage(pkg) + return path.join(cacheRoot, nugetId, pkg.version) +} + +export function libDirForPackage(packageDir, targetFramework) { + return path.join(packageDir, 'lib', targetFramework) +} + +function listTargetFrameworks(packageDir) { + const libRoot = path.join(packageDir, 'lib') + if (!fs.existsSync(libRoot)) return [] + + return fs.readdirSync(libRoot, { withFileTypes: true }) + .filter((entry) => entry.isDirectory()) + .map((entry) => entry.name) +} + +function extractNupkg(nupkgPath, destination) { + fs.mkdirSync(destination, { recursive: true }) + execSync(`tar -xf "${nupkgPath}" -C "${destination}"`, { stdio: 'inherit' }) +} + +export async function ensureNuGetPackage(cacheRoot, pkg) { + const nugetId = nugetIdForPackage(pkg) + const packageDir = packageCacheDir(cacheRoot, pkg) + const targetFramework = pkg.targetFramework || 'netstandard2.0' + let libDir = libDirForPackage(packageDir, targetFramework) + + if (fs.existsSync(libDir)) { + return { packageDir, libDir, nugetId } + } + + const extractedMarker = path.join(packageDir, '.extracted') + const nupkgPath = path.join(packageDir, `${nugetId}.${pkg.version}.nupkg`) + + fs.mkdirSync(packageDir, { recursive: true }) + + if (!fs.existsSync(nupkgPath)) { + const url = `${NUGET_PACKAGE_URL}/${nugetId}/${pkg.version}` + console.log(`Downloading ${nugetId} ${pkg.version}...`) + const response = await fetch(url) + if (!response.ok) { + throw new Error(`Failed to download ${nugetId} ${pkg.version}: HTTP ${response.status}`) + } + const buffer = Buffer.from(await response.arrayBuffer()) + fs.writeFileSync(nupkgPath, buffer) + } + + if (!fs.existsSync(extractedMarker)) { + console.log(`Extracting ${path.basename(nupkgPath)}...`) + extractNupkg(nupkgPath, packageDir) + fs.writeFileSync(extractedMarker, '') + } + + libDir = libDirForPackage(packageDir, targetFramework) + if (!fs.existsSync(libDir)) { + const available = listTargetFrameworks(packageDir) + throw new Error( + `Target framework ${targetFramework} not found for ${nugetId} ${pkg.version}. Available: ${available.join(', ') || 'none'}`, + ) + } + + return { packageDir, libDir, nugetId } +} + +export function resolveAssemblyFile(libDir, pkg) { + const nugetId = nugetIdForPackage(pkg) + + /** @type {string[]} */ + const preferredNames = [] + if (pkg.assemblyName) preferredNames.push(`${pkg.assemblyName}.dll`) + preferredNames.push(`${nugetId}.dll`) + + for (const fileName of preferredNames) { + const exact = path.join(libDir, fileName) + if (fs.existsSync(exact)) return fileName + + const match = fs.readdirSync(libDir).find( + (entry) => entry.toLowerCase() === fileName.toLowerCase(), + ) + if (match) return match + } + + const dlls = fs.readdirSync(libDir).filter((entry) => entry.toLowerCase().endsWith('.dll')) + if (dlls.length === 1) return dlls[0] + + throw new Error( + `Could not resolve assembly in ${libDir}. Set assemblyName in packages.json. Found: ${dlls.join(', ') || 'none'}`, + ) +} diff --git a/api-gen/lib/page-artifacts.mjs b/api-gen/lib/page-artifacts.mjs new file mode 100644 index 0000000..34c8fd5 --- /dev/null +++ b/api-gen/lib/page-artifacts.mjs @@ -0,0 +1,386 @@ +import fs from 'node:fs' +import path from 'node:path' + +const HEADING_RE = /^(#{1,6})\s+(.*)$/ + +/** DocFX member sub-headings — repeated under each member; excluded from sidebar TOC. */ +export const MEMBER_SUBSECTION_LABELS = new Set([ + 'Parameters', + 'Returns', + 'Remarks', + 'Property Value', + 'See Also', + 'Type Parameters', + 'Exceptions', + 'Examples', + 'Field Value', + 'Event Type', + 'Derived', +]) + +function stripHtml(value) { + return value + .replace(/<[^>]+>/g, '') + .replace(/\\([\\`*_{}[\]()#+\-.!])/g, '$1') + .trim() +} + +function slugify(value) { + return value + .toLowerCase() + .replace(/[^\w\s-]/g, '') + .replace(/\s+/g, '-') + .replace(/-+/g, '-') + .replace(/^-|-$/g, '') +} + +function stripFrontmatter(markdown) { + return markdown.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/, '') +} + +function parseHeadingLine(line) { + const match = line.match(HEADING_RE) + if (!match) return null + + const depth = match[1].length + const raw = match[2] + const idMatch = raw.match(/ 1 && stack[stack.length - 1].depth >= heading.depth) { + stack.pop() + } + + stack[stack.length - 1].children.push(node) + + if (heading.depth < 4) { + node.children = [] + stack.push({ depth: heading.depth, children: node.children }) + } + } + + for (const node of walkTocNodes(root)) { + if (!node.children?.length) { + delete node.children + } + } + + return root +} + +function shouldIncludeInToc(heading) { + if (heading.depth < 2 || heading.depth > 4 || !heading.text) return false + if (heading.depth === 4 && MEMBER_SUBSECTION_LABELS.has(heading.text)) return false + return true +} + +/** + * Adds unique anchor ids to repeated member sub-headings (Parameters, Returns, …). + * @param {string} markdown + */ +export function annotateMemberHeadingIds(markdown) { + const lines = markdown.split(/\r?\n/) + /** @type {string | null} */ + let memberId = null + + return lines.map((line) => { + const match = line.match(HEADING_RE) + if (!match) return line + + const depth = match[1].length + const raw = match[2] + + if (depth === 2) { + memberId = null + return line + } + + if (depth === 3) { + memberId = raw.match(/ ${text}` + } + } + + return line + }).join('\n') +} + +function* walkTocNodes(nodes) { + for (const node of nodes) { + yield node + if (node.children?.length) { + yield* walkTocNodes(node.children) + } + } +} + +function splitSections(markdown) { + const lines = markdown.split(/\r?\n/) + /** @type {{ heading: ReturnType | null, lines: string[] }[]} */ + const sections = [{ heading: null, lines: [] }] + + for (const line of lines) { + const heading = parseHeadingLine(line) + if (heading) { + sections.push({ heading, lines: [line] }) + continue + } + sections[sections.length - 1].lines.push(line) + } + + return sections +} + +function plainTextFromLines(lines) { + return stripHtml( + lines + .join('\n') + .replace(/```[\s\S]*?```/g, ' ') + .replace(/\[([^\]]*)\]\([^)]*\)/g, '$1') + .replace(/\s+/g, ' ') + .trim(), + ) +} + +/** + * @param {string} markdown + * @param {string} pagePath + */ +export function extractPageArtifacts(markdown, pagePath) { + const body = stripFrontmatter(markdown) + const lines = body.split(/\r?\n/) + const headings = lines.map(parseHeadingLine).filter(Boolean) + const pageHeading = headings.find((heading) => heading.depth === 1) + const title = pageHeading?.text || pagePath.split('/').pop() || 'API' + + return { + title, + tocLinks: buildTocTree(headings), + searchSections: buildSearchSections(body, pagePath, title), + } +} + +/** + * @param {string} markdown + * @param {string} pagePath + * @param {string} pageTitle + */ +function buildSearchSections(markdown, pagePath, pageTitle) { + /** @type {{ id: string, title: string, content: string, titles: string[], level: number }[]} */ + const sections = [] + const parts = splitSections(markdown) + const pageText = plainTextFromLines(parts.flatMap((part) => part.lines)) + + sections.push({ + id: pagePath, + title: pageTitle, + content: pageText.slice(0, 240), + titles: [], + level: 1, + }) + + /** @type {string[]} */ + const ancestors = [] + + for (const part of parts) { + if (!part.heading || part.heading.depth < 2) continue + + ancestors[part.heading.depth - 2] = part.heading.text + ancestors.length = part.heading.depth - 1 + + const content = plainTextFromLines(part.lines.slice(1)) + if (!content) continue + + sections.push({ + id: `${pagePath}#${part.heading.id}`, + title: part.heading.text, + content: content.slice(0, 240), + titles: ancestors.slice(0, -1).filter(Boolean), + level: part.heading.depth, + }) + } + + return sections +} + +/** + * @param {string} packageDir + * @param {string} packageId + * @param {string} versionSegment + */ +export function writePageArtifacts(packageDir, packageId, versionSegment) { + /** @type {{ id: string, title: string, content: string, titles: string[], level: number }[]} */ + const searchSections = [] + + const pagesDir = path.join(packageDir, 'pages') + fs.mkdirSync(pagesDir, { recursive: true }) + + for (const entry of fs.readdirSync(packageDir, { withFileTypes: true })) { + if (!entry.isFile() || !entry.name.toLowerCase().endsWith('.md')) continue + + const slug = entry.name.replace(/\.md$/i, '').toLowerCase() + const markdown = fs.readFileSync(path.join(packageDir, entry.name), 'utf8') + const pagePath = slug === 'index' + ? `/api/${packageId}/${versionSegment}` + : `/api/${packageId}/${versionSegment}/${slug}` + + const artifacts = extractPageArtifacts(markdown, pagePath) + fs.writeFileSync( + path.join(pagesDir, `${slug}.json`), + `${JSON.stringify({ path: pagePath, title: artifacts.title, tocLinks: artifacts.tocLinks }, null, 2)}\n`, + ) + + searchSections.push(...artifacts.searchSections) + } + + fs.writeFileSync( + path.join(packageDir, 'search.json'), + `${JSON.stringify(searchSections, null, 2)}\n`, + ) +} + +/** + * @param {string} outRoot + */ +export function buildPageIndex(outRoot) { + /** @type {Map} */ + const index = new Map() + + for (const metaPath of walkMetaFiles(outRoot)) { + const packageDir = path.dirname(metaPath) + const meta = JSON.parse(fs.readFileSync(metaPath, 'utf8')) + const packageId = String(meta.packageId || '').toLowerCase() + const versionSegment = String(meta.versionSegment || '').trim() + if (!packageId || !versionSegment) continue + + const primary = Boolean(meta.primary) + + for (const entry of fs.readdirSync(packageDir, { withFileTypes: true })) { + if (!entry.isFile() || !entry.name.toLowerCase().endsWith('.md')) continue + const slug = entry.name.replace(/\.md$/i, '').toLowerCase() + if (slug === 'index') continue + + const pagePath = `/api/${packageId}/${versionSegment}/${slug}` + const list = index.get(slug) ?? [] + list.push({ packageId, versionSegment, path: pagePath, primary }) + index.set(slug, list) + } + } + + return index +} + +/** + * @param {string} slug + * @param {string} packageId + * @param {string} versionSegment + * @param {string} packageDir + * @param {ReturnType} pageIndex + */ +export function resolvePagePath(slug, packageId, versionSegment, packageDir, pageIndex) { + const localFile = path.join(packageDir, `${slug}.md`) + if (fs.existsSync(localFile)) { + return `/api/${packageId}/${versionSegment}/${slug}` + } + + const candidates = pageIndex.get(slug) ?? [] + if (!candidates.length) { + return `/api/${packageId}/${versionSegment}/${slug}` + } + + const preferred = candidates.find((entry) => entry.primary) + ?? candidates.find((entry) => entry.packageId === packageId) + ?? candidates[0] + + return preferred.path +} + +/** + * @param {string} outRoot + * @param {string} indexPath + */ +export function writeSlugIndex(outRoot, indexPath) { + /** @type {Record} */ + const slugIndex = {} + const pageIndex = buildPageIndex(outRoot) + + for (const [slug, candidates] of pageIndex.entries()) { + const preferred = candidates.find((entry) => entry.primary) ?? candidates[0] + slugIndex[slug] = preferred.path + } + + fs.mkdirSync(path.dirname(indexPath), { recursive: true }) + fs.writeFileSync(indexPath, `${JSON.stringify(slugIndex, null, 2)}\n`) +} + +/** + * @param {string} outRoot + * @param {string} routesPath + */ +export function writeRoutesManifest(outRoot, routesPath) { + /** @type {string[]} */ + const routes = [] + + for (const metaPath of walkMetaFiles(outRoot)) { + const packageDir = path.dirname(metaPath) + const rel = path.relative(outRoot, packageDir).replace(/\\/g, '/') + const [packageId, versionSegment] = rel.split('/') + if (!packageId || !versionSegment) continue + + routes.push(`/api/${packageId}/${versionSegment}`) + + for (const entry of fs.readdirSync(packageDir, { withFileTypes: true })) { + if (!entry.isFile() || !entry.name.toLowerCase().endsWith('.md')) continue + const slug = entry.name.replace(/\.md$/i, '').toLowerCase() + if (slug === 'index') continue + routes.push(`/api/${packageId}/${versionSegment}/${slug}`) + } + } + + fs.mkdirSync(path.dirname(routesPath), { recursive: true }) + fs.writeFileSync(routesPath, `${JSON.stringify([...new Set(routes)].sort(), null, 2)}\n`) +} + +function walkMetaFiles(root) { + /** @type {string[]} */ + const files = [] + if (!fs.existsSync(root)) return files + + for (const entry of fs.readdirSync(root, { withFileTypes: true })) { + const full = path.join(root, entry.name) + if (entry.isDirectory()) { + files.push(...walkMetaFiles(full)) + continue + } + if (entry.name === 'meta.json') { + files.push(full) + } + } + + return files +} diff --git a/api-gen/lib/postprocess.mjs b/api-gen/lib/postprocess.mjs new file mode 100644 index 0000000..937999d --- /dev/null +++ b/api-gen/lib/postprocess.mjs @@ -0,0 +1,216 @@ +import fs from 'node:fs' +import path from 'node:path' +import { toVersionSegment } from './version.mjs' +import { writePageArtifacts, writeRoutesManifest, writeSlugIndex, buildPageIndex, resolvePagePath, annotateMemberHeadingIds } from './page-artifacts.mjs' + +function walkDirs(dir) { + /** @type {string[]} */ + const result = [] + if (!fs.existsSync(dir)) return result + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const full = path.join(dir, entry.name) + if (entry.isDirectory()) { + result.push(full, ...walkDirs(full)) + } + } + return result +} + +function parseDocFxToc(text) { + const lines = text + .split(/\r?\n/) + .filter((line) => line.trim() && !line.startsWith('###')) + + /** @type {{ name: string, href?: string, items?: any[] }[]} */ + const root = [] + /** @type {{ indent: number, items: any[] }[]} */ + const listStack = [{ indent: -1, items: root }] + /** @type {{ name: string, href?: string, items?: any[] } | null} */ + let currentNode = null + + for (const line of lines) { + const indent = line.match(/^ */)[0].length + const trimmed = line.trim() + + if (trimmed.startsWith('- name:')) { + while (listStack.length > 1 && indent < listStack[listStack.length - 1].indent) { + listStack.pop() + } + currentNode = { name: trimmed.slice('- name:'.length).trim() } + listStack[listStack.length - 1].items.push(currentNode) + continue + } + + if (trimmed.startsWith('href:')) { + if (currentNode) currentNode.href = trimmed.slice('href:'.length).trim() + continue + } + + if (trimmed === 'items:') { + if (!currentNode) continue + currentNode.items = [] + listStack.push({ indent, items: currentNode.items }) + } + } + + return root +} + +function hrefToPath(href, packageId, versionSegment, packageDir, pageIndex) { + if (!href) return null + const file = href.split('#')[0] + if (!file.toLowerCase().endsWith('.md')) return null + const slug = file + .replace(/^\.\//, '') + .replace(/\.md$/i, '') + .toLowerCase() + const hash = href.includes('#') ? href.slice(href.indexOf('#')) : '' + return `${resolvePagePath(slug, packageId, versionSegment, packageDir, pageIndex)}${hash}` +} + +/** DocFX section labels in toc.yml — grouping headers, not pages. */ +const SECTION_LABELS = new Set(['Classes', 'Interfaces', 'Enums', 'Structs', 'Delegates']) + +function groupDocFxSections(nodes) { + /** @type {typeof nodes} */ + const result = [] + /** @type {typeof nodes[0] | null} */ + let section = null + + for (const node of nodes) { + const isLabel = !node.href && !node.items?.length && SECTION_LABELS.has(node.name) + if (isLabel) { + section = { name: node.name, items: [] } + result.push(section) + continue + } + + if (section) { + section.items.push(node) + } else { + result.push(node) + } + } + + return result +} + +function mapToc(nodes, packageId, versionSegment, packageDir, pageIndex) { + return nodes.map((node) => { + /** @type {{ title: string, path?: string, children?: any[] }} */ + const mapped = { title: node.name } + const route = hrefToPath(node.href, packageId, versionSegment, packageDir, pageIndex) + if (route) mapped.path = route + const childNodes = node.items?.length ? groupDocFxSections(node.items) : [] + if (childNodes.length) { + mapped.children = mapToc(childNodes, packageId, versionSegment, packageDir, pageIndex) + } + return mapped + }) +} + +function repairBrokenMarkdownLinks(content) { + return content.replace( + /\[([^\]/\[]+)(\/api\/[^\s,\]\\]+)/g, + '[$1]($2)', + ) +} + +function rewriteMarkdownLinks(content, packageId, versionSegment, packageDir, pageIndex) { + function linkFor(file, hash = '') { + const slug = String(file).replace(/\.md$/i, '').toLowerCase() + return `${resolvePagePath(slug, packageId, versionSegment, packageDir, pageIndex)}${hash || ''}` + } + + return repairBrokenMarkdownLinks(content) + .replace( + /\]\((?:\.\/)?([^)\s#]+\.md)(#[^)\s]*)?\)/gi, + (_match, file, hash = '') => `](${linkFor(file, hash)})`, + ) + .replace( + /\(([A-Za-z0-9_.-]+\.md)(#[^)\s]*)?\)/gi, + (_match, file, hash = '') => `(${linkFor(file, hash)})`, + ) + .replace( + /]*\bhref="([^"]+)"[^>]*><\/xref>/gi, + (_match, href) => { + const name = String(href).split('.').pop() || href + return `\`${name}\`` + }, + ) +} + +function readPackageMeta(dir) { + const metaPath = path.join(dir, 'meta.json') + if (!fs.existsSync(metaPath)) return null + + const meta = JSON.parse(fs.readFileSync(metaPath, 'utf8')) + const packageId = String(meta.packageId || '').toLowerCase() + const version = String(meta.version || '').trim() + const versionSegment = String(meta.versionSegment || toVersionSegment(version)).trim() + if (!packageId || !version || !versionSegment) return null + + return { packageId, version, versionSegment } +} + +function processPackageDir(outRoot, dir, pageIndex) { + const rel = path.relative(outRoot, dir).replace(/\\/g, '/') + const parts = rel.split('/').filter(Boolean) + if (parts.length !== 2) return false + + const meta = readPackageMeta(dir) + if (!meta) return false + + const { packageId, versionSegment } = meta + const tocPath = path.join(dir, 'toc.yml') + if (!fs.existsSync(tocPath)) return false + + const toc = parseDocFxToc(fs.readFileSync(tocPath, 'utf8')) + const mapped = [ + { + title: 'Overview', + path: `/api/${packageId}/${versionSegment}`, + }, + ...mapToc(toc, packageId, versionSegment, dir, pageIndex), + ] + fs.writeFileSync(path.join(dir, 'toc.json'), `${JSON.stringify(mapped, null, 2)}\n`) + + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + if (!entry.isFile() || !entry.name.toLowerCase().endsWith('.md')) continue + const filePath = path.join(dir, entry.name) + const original = fs.readFileSync(filePath, 'utf8') + const updated = annotateMemberHeadingIds( + rewriteMarkdownLinks(original, packageId, versionSegment, dir, pageIndex), + ).replace(/See the \[table of contents\]\(\.\/toc\.yml\)\.\r?\n?/i, '') + if (updated !== original) { + fs.writeFileSync(filePath, updated) + } + } + + writePageArtifacts(dir, packageId, versionSegment) + + console.log(`Post-processed ${rel} (${mapped.length} top-level toc entries)`) + return true +} + +export function postprocessOut(outRoot) { + if (!fs.existsSync(outRoot)) { + throw new Error(`Missing ${outRoot}. Run: node api-gen/run.mjs generate`) + } + + const pageIndex = buildPageIndex(outRoot) + + let count = 0 + for (const dir of [outRoot, ...walkDirs(outRoot)]) { + if (processPackageDir(outRoot, dir, pageIndex)) count += 1 + } + + if (count === 0) { + throw new Error('No package/version folders with meta.json and toc.yml found under api-gen/out') + } + + writeRoutesManifest(outRoot, path.join(outRoot, 'routes.json')) + writeSlugIndex(outRoot, path.join(outRoot, 'slug-index.json')) + + return count +} diff --git a/api-gen/lib/version.mjs b/api-gen/lib/version.mjs new file mode 100644 index 0000000..2778f19 --- /dev/null +++ b/api-gen/lib/version.mjs @@ -0,0 +1,11 @@ +export function toVersionSegment(version) { + return String(version).trim().replace(/\./g, '-') +} + +export function versionPaths(packageId, version) { + const segment = toVersionSegment(version) + return { + segment, + root: `/api/${packageId}/${segment}`, + } +} diff --git a/api-gen/packages.json b/api-gen/packages.json new file mode 100644 index 0000000..adea775 --- /dev/null +++ b/api-gen/packages.json @@ -0,0 +1,175 @@ +{ + "packages": [ + { + "id": "autofixture", + "name": "AutoFixture", + "nugetId": "AutoFixture", + "version": "5.0.0-rc.1", + "line": "v5", + "primary": true, + "targetFramework": "netstandard2.0" + }, + { + "id": "xunit3", + "name": "AutoFixture.Xunit3", + "nugetId": "AutoFixture.Xunit3", + "version": "5.0.0-rc.1", + "line": "v5", + "targetFramework": "net8.0" + }, + { + "id": "nunit4", + "name": "AutoFixture.NUnit4", + "nugetId": "AutoFixture.NUnit4", + "version": "5.0.0-rc.1", + "line": "v5", + "targetFramework": "net8.0" + }, + { + "id": "automoq", + "name": "AutoFixture.AutoMoq", + "nugetId": "AutoFixture.AutoMoq", + "version": "5.0.0-rc.1", + "line": "v5", + "targetFramework": "netstandard2.0" + }, + { + "id": "autonsubstitute", + "name": "AutoFixture.AutoNSubstitute", + "nugetId": "AutoFixture.AutoNSubstitute", + "version": "5.0.0-rc.1", + "line": "v5", + "targetFramework": "netstandard2.0" + }, + { + "id": "autofakeiteasy", + "name": "AutoFixture.AutoFakeItEasy", + "nugetId": "AutoFixture.AutoFakeItEasy", + "version": "5.0.0-rc.1", + "line": "v5", + "targetFramework": "net8.0" + }, + { + "id": "seedextensions", + "name": "AutoFixture.SeedExtensions", + "nugetId": "AutoFixture.SeedExtensions", + "version": "5.0.0-rc.1", + "line": "v5", + "targetFramework": "net8.0" + }, + { + "id": "idioms", + "name": "AutoFixture.Idioms", + "nugetId": "AutoFixture.Idioms", + "version": "5.0.0-rc.1", + "line": "v5", + "targetFramework": "net8.0" + }, + { + "id": "autofixture", + "name": "AutoFixture", + "nugetId": "AutoFixture", + "version": "4.18.1", + "line": "v4", + "targetFramework": "netstandard2.0" + }, + { + "id": "xunit", + "name": "AutoFixture.xUnit", + "nugetId": "AutoFixture.xUnit", + "version": "4.18.1", + "line": "v4", + "targetFramework": "net452", + "assemblyName": "AutoFixture.Xunit" + }, + { + "id": "xunit2", + "name": "AutoFixture.xUnit2", + "nugetId": "AutoFixture.xUnit2", + "version": "4.18.1", + "line": "v4", + "targetFramework": "netstandard2.0" + }, + { + "id": "nunit2", + "name": "AutoFixture.NUnit2", + "nugetId": "AutoFixture.NUnit2", + "version": "4.18.1", + "line": "v4", + "targetFramework": "net452" + }, + { + "id": "nunit3", + "name": "AutoFixture.NUnit3", + "nugetId": "AutoFixture.NUnit3", + "version": "4.18.1", + "line": "v4", + "targetFramework": "netstandard2.0" + }, + { + "id": "automoq", + "name": "AutoFixture.AutoMoq", + "nugetId": "AutoFixture.AutoMoq", + "version": "4.18.1", + "line": "v4", + "targetFramework": "netstandard2.0" + }, + { + "id": "autonsubstitute", + "name": "AutoFixture.AutoNSubstitute", + "nugetId": "AutoFixture.AutoNSubstitute", + "version": "4.18.1", + "line": "v4", + "targetFramework": "netstandard2.0" + }, + { + "id": "autofakeiteasy", + "name": "AutoFixture.AutoFakeItEasy", + "nugetId": "AutoFixture.AutoFakeItEasy", + "version": "4.18.1", + "line": "v4", + "targetFramework": "netstandard2.0" + }, + { + "id": "seedextensions", + "name": "AutoFixture.SeedExtensions", + "nugetId": "AutoFixture.SeedExtensions", + "version": "4.18.1", + "line": "v4", + "targetFramework": "netstandard2.0" + }, + { + "id": "idioms", + "name": "AutoFixture.Idioms", + "nugetId": "AutoFixture.Idioms", + "version": "4.18.1", + "line": "v4", + "targetFramework": "netstandard2.0" + }, + { + "id": "idioms-fscheck", + "name": "AutoFixture.Idioms.FsCheck", + "nugetId": "AutoFixture.Idioms.FsCheck", + "version": "4.18.1", + "line": "v4", + "targetFramework": "netstandard2.0" + }, + { + "id": "autofoq", + "name": "AutoFixture.AutoFoq", + "nugetId": "AutoFixture.AutoFoq", + "version": "4.18.1", + "line": "v4", + "targetFramework": "netstandard2.0" + }, + { + "id": "autorhinomocks", + "name": "AutoFixture.AutoRhinoMocks", + "nugetId": "AutoFixture.AutoRhinoMocks", + "version": "4.18.1", + "line": "v4", + "targetFramework": "net452", + "assemblyName": "AutoFixture.AutoRhinoMock" + } + ] +} diff --git a/api-gen/readme.md b/api-gen/readme.md new file mode 100644 index 0000000..ef021f0 --- /dev/null +++ b/api-gen/readme.md @@ -0,0 +1,73 @@ +# API markdown generator + +Uses DocFX `metadata` with `outputFormat: markdown` against NuGet package assemblies. All automation is Node.js (`api-gen/run.mjs`). + +## Prerequisites + +- [.NET SDK](https://dotnet.microsoft.com/download) (for DocFX) +- [DocFX](https://dotnet.github.io/docfx/): `dotnet tool install -g docfx` +- Node.js +- [just](https://github.com/casey/just#installation) (optional wrapper) + +On **Linux/WSL**, dotnet global tools are not always on `PATH`. Add this to `~/.bashrc`: + +```bash +export PATH="$PATH:$HOME/.dotnet/tools" +``` + +Then verify: `docfx --version` + +## Commands (from repo root) + +```bash +node api-gen/run.mjs prepare # generate + sync into site/public/ +just prepare-api # same via just +just clean-api # delete generated output and NuGet cache +``` + +Output layout after sync: + +| Path | Contents | +|------|----------| +| `site/public/api-markdown/{packageId}/{version}/` | Raw DocFX markdown (`.md`) | +| `site/public/api-meta/{packageId}/{version}/` | `toc.json`, `search.json`, `pages/{slug}.json` | +| `site/public/api-meta/routes.json` | All API routes for prerender | +| `site/public/api-catalog.json` | Package/version picker data | + +Configure packages in `api-gen/packages.json`. Each entry is one package version (same `id` groups versions in the UI). Generated routes use `/api/{packageId}/{versionSegment}/...`. + +Packages are downloaded from nuget.org into `api-gen/packages-cache/` and DocFX reads the `.dll` plus companion `.xml` documentation file from the chosen target framework folder. + +Required fields per package: + +| Field | Purpose | +|-------|---------| +| `id` | URL slug | +| `name` | Display name | +| `nugetId` | NuGet package id (defaults to `name`) | +| `version` | Pinned NuGet version | +| `line` | UI grouping (`v4` / `v5`) | +| `targetFramework` | TFM folder under `lib/` (for example `netstandard2.0`, `net8.0`, `net452`) | +| `assemblyName` | Optional when the DLL name differs from the NuGet id | + +Currently generated packages (URL slug → NuGet name): + +| Slug | NuGet package | v5 | v4 | +|------|---------------|----|----| +| `autofixture` | AutoFixture | yes | yes | +| `xunit3` | AutoFixture.Xunit3 | yes | — | +| `nunit4` | AutoFixture.NUnit4 | yes | — | +| `xunit` | AutoFixture.xUnit | — | yes | +| `xunit2` | AutoFixture.xUnit2 | — | yes | +| `nunit2` | AutoFixture.NUnit2 | — | yes | +| `nunit3` | AutoFixture.NUnit3 | — | yes | +| `automoq` | AutoFixture.AutoMoq | yes | yes | +| `autonsubstitute` | AutoFixture.AutoNSubstitute | yes | yes | +| `autofakeiteasy` | AutoFixture.AutoFakeItEasy | yes | yes | +| `seedextensions` | AutoFixture.SeedExtensions | yes | yes | +| `idioms` | AutoFixture.Idioms | yes | yes | +| `idioms-fscheck` | AutoFixture.Idioms.FsCheck | — | yes | +| `autofoq` | AutoFixture.AutoFoq | — | yes | +| `autorhinomocks` | AutoFixture.AutoRhinoMocks | — | yes | + +v5 is pinned to `5.0.0-rc.1`; v4 is pinned to `4.18.1`. diff --git a/api-gen/run.mjs b/api-gen/run.mjs new file mode 100644 index 0000000..20d8bb6 --- /dev/null +++ b/api-gen/run.mjs @@ -0,0 +1,280 @@ +import { execSync } from 'node:child_process' +import fs from 'node:fs' +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import { postprocessOut } from './lib/postprocess.mjs' +import { writeApiCatalog } from './lib/catalog.mjs' +import { toVersionSegment } from './lib/version.mjs' +import { ensureNuGetPackage, nugetIdForPackage, resolveAssemblyFile } from './lib/nuget.mjs' + +const apiGenRoot = path.dirname(fileURLToPath(import.meta.url)) +const repoRoot = path.resolve(apiGenRoot, '..') +const outRoot = path.join(apiGenRoot, 'out') +const packagesCacheRoot = path.join(apiGenRoot, 'packages-cache') +const packagesPath = path.join(apiGenRoot, 'packages.json') +const docfxPath = path.join(apiGenRoot, 'docfx.json') +const siteApiMarkdown = path.join(repoRoot, 'site/public/api-markdown') +const siteApiMeta = path.join(repoRoot, 'site/public/api-meta') +const siteApiCatalog = path.join(repoRoot, 'site/public/api-catalog.json') + +function loadPackages() { + return JSON.parse(fs.readFileSync(packagesPath, 'utf8')).packages +} + +function writeDocfxConfig(pkg, versionSegment, libDir, assemblyFile) { + const metadataEntry = { + src: [ + { + files: [assemblyFile], + src: path.relative(apiGenRoot, libDir).replace(/\\/g, '/'), + }, + ], + dest: `out/${pkg.id}/${versionSegment}`, + outputFormat: 'markdown', + namespaceLayout: 'flattened', + memberLayout: 'samePage', + } + + fs.writeFileSync(docfxPath, `${JSON.stringify({ metadata: [metadataEntry] }, null, 2)}\n`) +} + +function writePackageMeta(pkg, version, versionSegment, outDir) { + fs.mkdirSync(outDir, { recursive: true }) + + const meta = { + package: pkg.name, + packageId: pkg.id, + line: pkg.line, + version, + versionSegment, + primary: Boolean(pkg.primary), + nugetId: nugetIdForPackage(pkg), + } + + fs.writeFileSync(path.join(outDir, 'meta.json'), `${JSON.stringify(meta, null, 2)}\n`) + + const index = [ + `# ${pkg.name}`, + '', + `API reference for **${pkg.name}** \`${version}\`.`, + '', + ].join('\n') + + fs.writeFileSync(path.join(outDir, 'index.md'), index) + console.log(`Wrote meta for ${pkg.id}/${versionSegment}`) +} + +function resolveDocfxCommand() { + const home = process.env.HOME || process.env.USERPROFILE || '' + const candidates = [ + 'docfx', + home ? path.join(home, '.dotnet/tools/docfx') : null, + home ? path.join(home, '.dotnet/tools/docfx.exe') : null, + ].filter(Boolean) + + for (const candidate of candidates) { + try { + execSync(`"${candidate}" --version`, { + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'ignore'], + }) + return candidate + } catch { + // try next candidate + } + } + + throw new Error( + [ + 'DocFX not found.', + '', + 'Install (requires .NET SDK):', + ' dotnet tool install -g docfx', + '', + 'On Linux/WSL, add dotnet tools to PATH (add to ~/.bashrc to persist):', + ' export PATH="$PATH:$HOME/.dotnet/tools"', + '', + 'Verify:', + ' docfx --version', + '', + 'Then rerun:', + ' node api-gen/run.mjs prepare', + ].join('\n'), + ) +} + +function runDocfxMetadata() { + const docfx = resolveDocfxCommand() + execSync(`"${docfx}" metadata docfx.json`, { cwd: apiGenRoot, stdio: 'inherit' }) +} + +async function generatePackage(pkg) { + if (!pkg.version) { + throw new Error(`Package ${pkg.id} (${pkg.line}) is missing a pinned version`) + } + + const version = String(pkg.version).replace(/^v/, '') + const versionSegment = toVersionSegment(version) + const outDir = path.join(outRoot, pkg.id, versionSegment) + const { libDir } = await ensureNuGetPackage(packagesCacheRoot, pkg) + const assemblyFile = resolveAssemblyFile(libDir, pkg) + + console.log(`Using ${path.join(path.relative(apiGenRoot, libDir), assemblyFile)}`) + writeDocfxConfig(pkg, versionSegment, libDir, assemblyFile) + runDocfxMetadata() + writePackageMeta(pkg, version, versionSegment, outDir) +} + +async function generateAll() { + const packages = loadPackages() + if (!packages.length) { + throw new Error('No packages configured in api-gen/packages.json') + } + + removeIfExists(outRoot) + + for (const pkg of packages) { + console.log(`Generating ${pkg.id} ${pkg.line} (${pkg.version})...`) + await generatePackage(pkg) + } + + postprocessOut(outRoot) +} + +function copyDirectoryContents(source, destination) { + fs.mkdirSync(destination, { recursive: true }) + for (const entry of fs.readdirSync(source, { withFileTypes: true })) { + const from = path.join(source, entry.name) + const to = path.join(destination, entry.name) + if (entry.isDirectory()) { + copyDirectoryContents(from, to) + } else { + fs.copyFileSync(from, to) + } + } +} + +function removeIfExists(target) { + if (fs.existsSync(target)) { + fs.rmSync(target, { recursive: true, force: true }) + } +} + +function walkFiles(root, fileName) { + /** @type {string[]} */ + const files = [] + if (!fs.existsSync(root)) return files + + for (const entry of fs.readdirSync(root, { withFileTypes: true })) { + const full = path.join(root, entry.name) + if (entry.isDirectory()) { + files.push(...walkFiles(full, fileName)) + } else if (entry.name === fileName) { + files.push(full) + } + } + + return files +} + +function syncPackageDir(sourceDir, markdownDir, metaDir) { + fs.mkdirSync(markdownDir, { recursive: true }) + fs.mkdirSync(metaDir, { recursive: true }) + + for (const entry of fs.readdirSync(sourceDir, { withFileTypes: true })) { + if (!entry.isFile()) continue + + const from = path.join(sourceDir, entry.name) + if (entry.name.toLowerCase().endsWith('.md')) { + fs.copyFileSync(from, path.join(markdownDir, entry.name)) + continue + } + + if (entry.name === 'meta.json' || entry.name === 'toc.json' || entry.name === 'search.json') { + fs.copyFileSync(from, path.join(metaDir, entry.name)) + } + } + + const pagesSource = path.join(sourceDir, 'pages') + if (fs.existsSync(pagesSource)) { + copyDirectoryContents(pagesSource, path.join(metaDir, 'pages')) + } +} + +function syncAll() { + if (!fs.existsSync(outRoot)) { + throw new Error(`Missing ${outRoot}. Run: node api-gen/run.mjs generate`) + } + + if (!walkFiles(outRoot, 'toc.json').length) { + postprocessOut(outRoot) + } + + removeIfExists(siteApiMarkdown) + removeIfExists(siteApiMeta) + + for (const metaPath of walkFiles(outRoot, 'meta.json')) { + const sourceDir = path.dirname(metaPath) + const rel = path.relative(outRoot, sourceDir).replace(/\\/g, '/') + syncPackageDir( + sourceDir, + path.join(siteApiMarkdown, rel), + path.join(siteApiMeta, rel), + ) + } + + const routesSource = path.join(outRoot, 'routes.json') + if (fs.existsSync(routesSource)) { + fs.mkdirSync(siteApiMeta, { recursive: true }) + fs.copyFileSync(routesSource, path.join(siteApiMeta, 'routes.json')) + } + + const slugIndexSource = path.join(outRoot, 'slug-index.json') + if (fs.existsSync(slugIndexSource)) { + fs.mkdirSync(siteApiMeta, { recursive: true }) + fs.copyFileSync(slugIndexSource, path.join(siteApiMeta, 'slug-index.json')) + } + + writeApiCatalog(outRoot, siteApiCatalog) + console.log(`Synced markdown -> ${path.relative(repoRoot, siteApiMarkdown)}`) + console.log(`Synced meta/search/pages -> ${path.relative(repoRoot, siteApiMeta)}`) +} + +function cleanAll() { + removeIfExists(outRoot) + removeIfExists(packagesCacheRoot) + removeIfExists(siteApiMarkdown) + removeIfExists(siteApiMeta) + removeIfExists(siteApiCatalog) + console.log('Removed generated API output') +} + +const command = process.argv[2] || 'prepare' + +try { + switch (command) { + case 'generate': + await generateAll() + break + case 'sync': + syncAll() + break + case 'prepare': + await generateAll() + syncAll() + break + case 'postprocess': + postprocessOut(outRoot) + break + case 'clean': + cleanAll() + break + default: + console.error(`Unknown command: ${command}`) + console.error('Usage: node api-gen/run.mjs [generate|sync|prepare|postprocess|clean]') + process.exit(1) + } +} catch (error) { + console.error(error instanceof Error ? error.message : error) + process.exit(1) +} diff --git a/assets/css/main.scss b/assets/css/main.scss deleted file mode 100644 index 8951e08..0000000 --- a/assets/css/main.scss +++ /dev/null @@ -1,16 +0,0 @@ ---- -# Only the main Sass file needs front matter (the dashes are enough) ---- - -@charset "utf-8"; - -@import "minimal-mistakes/skins/{{ site.minimal_mistakes_skin | default: 'default' }}"; // skin -@import "minimal-mistakes"; // main partials - -.page__content { - font-size: 16px; -} - -nav.pagination { - display: none; -} diff --git a/assets/images/logo.svg b/assets/images/logo.svg deleted file mode 100644 index b80cbbd..0000000 --- a/assets/images/logo.svg +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/logo200x200.png b/assets/images/logo200x200.png deleted file mode 100644 index 32a82c5d19774c5ae7c44b9b37ccb569c4a049cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14319 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 NDHeR1`78KA{vVHc@E!mF diff --git a/index.html b/index.html deleted file mode 100644 index a69ec90..0000000 --- a/index.html +++ /dev/null @@ -1,4 +0,0 @@ ---- -layout: home -author_profile: true ---- \ No newline at end of file diff --git a/justfile b/justfile new file mode 100644 index 0000000..881e301 --- /dev/null +++ b/justfile @@ -0,0 +1,41 @@ +# AutoFixture documentation tasks +# Install: https://github.com/casey/just#installation + +# List available recipes +default: + @just --list + +# Generate API markdown from configured packages +generate-api: + node api-gen/run.mjs generate + +# Copy generated API markdown into the Nuxt content tree +sync-api: + node api-gen/run.mjs sync + +# Generate API markdown and sync into the site +prepare-api: + node api-gen/run.mjs prepare + +# Rewrite API markdown links and emit toc.json (safe to re-run on existing out/) +postprocess-api: + node api-gen/run.mjs postprocess + +# Install site dependencies +site-install: + npm install --prefix site + +# Run the Nuxt dev server +site-dev: + npm run dev --prefix site + +# Statically generate the site (same as CI; run prepare-api first) +site-generate: + npm run generate --prefix site + +# Prepare API docs and generate the static site (CI parity) +site-build: prepare-api site-install site-generate + +# Remove generated markdown and cached NuGet packages +clean-api: + node api-gen/run.mjs clean diff --git a/manifest.json b/manifest.json deleted file mode 100644 index 3ae232d..0000000 --- a/manifest.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "", - "icons": [ - { - "src": "/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" -} diff --git a/readme.md b/readme.md index cc88a24..a11ddad 100644 --- a/readme.md +++ b/readme.md @@ -1,44 +1,31 @@ -# AutoFixture Documentation - -This is the official AutoFixture documentation repository. You can find the deployed version of the documentation at [AutoFixture.github.io](https://autofixture.github.io). - -## Contributing - -### Environment Setup - -Before you start contributing the documentation, it is recommented you setup a local environment where the changes could be tested. - -There are a couple of ways to setup the local development environment: - -- [Developing inside Docker](https://github.com/AutoFixture/AutoFixture.github.io/wiki/Docker-Environment-Setup) -- [Developing locally](https://github.com/AutoFixture/AutoFixture.github.io/wiki/Local-Environment-Setup) - -## Roadmap 🚧 - -> :warning: There is currently an ongoing effort to document AutoFixture. -> Any contributions to the documentation are welcome. - -- [x] Overview -- [x] Quick Start guide -- [x] Fixture creation -- [x] Fixture customization - - [ ] Customize - - [ ] Build -- [ ] Freeze and Inject features -- [ ] Testing frameworks integration - - [ ] xUnit - - [ ] NUnit -- [ ] Mocking framework integration - - [ ] Moq - - [ ] NSubstitute - - [ ] FakeItEasy - - [ ] Foq -- [ ] Idioms - - [ ] Assertions - - [ ] FsCheck -- [ ] Internal library design and philosophy - - [ ] Customizations - - [ ] Behaviors - - [ ] Specimen Builders - - [ ] Generators -- [ ] Document upcoming deprecations +# AutoFixture documentation + +Nuxt Content site for guides + DocFX-generated API reference rendered outside Nuxt Content. + +| Folder | Purpose | +|--------|---------| +| `api-gen/` | DocFX metadata → markdown and search/nav artifacts | +| `site/` | Nuxt app (docs in Content; API from static markdown + server render) | + +## Generate API markdown + +```bash +node api-gen/run.mjs prepare # generate + copy into site/public/api-markdown and api-meta +just site-install +just site-dev # start dev server (stop it first if you just ran prepare) +``` + +Or via just: `just prepare-api` + +API content is generated locally and not committed. Run `prepare` before starting the dev server. + +Needs [DocFX](https://dotnet.github.io/docfx/), [Node.js](https://nodejs.org/), and optionally [just](https://github.com/casey/just#installation). + +## CI / deploy + +- **CI** (PRs to `master`): build only — `.github/workflows/ci.yml` +- **Deploy** (push to `master` or manual): build + GitHub Pages — `.github/workflows/deploy.yml` + +See [DEPLOYMENT.md](./DEPLOYMENT.md) for the full runbook (Pages setup, rollback, DNS, troubleshooting). + +Custom domain: `site/public/CNAME` → `autofixture.com`. diff --git a/site/.gitignore b/site/.gitignore new file mode 100644 index 0000000..4a7f73a --- /dev/null +++ b/site/.gitignore @@ -0,0 +1,24 @@ +# Nuxt dev/build outputs +.output +.data +.nuxt +.nitro +.cache +dist + +# Node dependencies +node_modules + +# Logs +logs +*.log + +# Misc +.DS_Store +.fleet +.idea + +# Local env files +.env +.env.* +!.env.example diff --git a/site/app/app.config.ts b/site/app/app.config.ts new file mode 100644 index 0000000..20cc746 --- /dev/null +++ b/site/app/app.config.ts @@ -0,0 +1,8 @@ +export default defineAppConfig({ + ui: { + colors: { + primary: 'green', + neutral: 'zinc', + }, + }, +}) diff --git a/site/app/app.vue b/site/app/app.vue new file mode 100644 index 0000000..2e3f640 --- /dev/null +++ b/site/app/app.vue @@ -0,0 +1,212 @@ + + + diff --git a/site/app/assets/css/main.css b/site/app/assets/css/main.css new file mode 100644 index 0000000..9a87948 --- /dev/null +++ b/site/app/assets/css/main.css @@ -0,0 +1,150 @@ +@import "tailwindcss"; +@import "@nuxt/ui"; + +:root { + --ui-container: 100rem; +} + +@theme static { + --font-sans: "Public Sans", ui-sans-serif, system-ui, sans-serif; + + /* Cooler emerald lean vs warm lime #84d239 */ + --color-green-50: #eefcf1; + --color-green-100: #d8f7df; + --color-green-200: #b3eec0; + --color-green-300: #7fe096; + --color-green-400: #5ad46f; + --color-green-500: #3fc455; + --color-green-600: #2fa344; + --color-green-700: #27813a; + --color-green-800: #236632; + --color-green-900: #1f542b; + --color-green-950: #0d2f18; +} + +/* Neutral zinc charcoal — no green tint on surfaces */ +.dark { + --ui-bg: #09090b; + --ui-bg-muted: #18181b; + --ui-bg-elevated: #18181b; + --ui-bg-accented: #27272a; + --ui-border: #27272a; + --ui-border-muted: #27272a; + --ui-border-accented: #3f3f46; +} + +.prose-docs :where(pre) { + overflow-x: auto; + padding: 0.85rem 1rem; + border-radius: 0.5rem; +} + +.landing-code :where(pre) { + overflow-x: auto; + margin: 0; + padding: 1rem; + border-radius: 0; + background: transparent !important; + font-size: 0.875rem; + line-height: 1.625; +} + +.landing-code :where(code) { + font-size: inherit; +} + +/* Shiki dual themes — sync with Nuxt UI color mode (html.dark) */ +html:not(.dark) :where(.shiki, .shiki span) { + color: var(--shiki-light) !important; + background-color: var(--shiki-light-bg) !important; +} + +html.dark :where(.shiki, .shiki span) { + color: var(--shiki-dark) !important; + background-color: var(--shiki-dark-bg) !important; +} + +.prose-docs :where(code) { + font-size: 0.92em; +} + +.fixture-pipeline-diagram { + display: block; + margin-inline: auto; + max-width: min(100%, 28rem); + height: auto; +} + +.prose-api { + max-width: none; + line-height: 1.65; + color: var(--ui-text); +} + +.prose-api :where(h1, h2, h3, h4) { + scroll-margin-top: 5rem; + font-weight: 600; + letter-spacing: -0.01em; +} + +.prose-api :where(h1) { + font-size: 1.875rem; + margin-bottom: 1rem; +} + +.prose-api :where(h2) { + font-size: 1.35rem; + margin-top: 2rem; + margin-bottom: 0.75rem; +} + +.prose-api :where(h3, h4) { + font-size: 1.1rem; + margin-top: 1.5rem; + margin-bottom: 0.5rem; +} + +.prose-api :where(p, ul, ol, dl) { + margin: 0.75rem 0; +} + +.prose-api :where(a) { + color: var(--ui-primary); + text-decoration: underline; + text-underline-offset: 2px; +} + +.prose-api :where(code:not(pre code)) { + font-size: 0.92em; + padding: 0.12em 0.35em; + border-radius: 0.35rem; + background: var(--ui-bg-muted); +} + +.prose-api :where(table) { + width: 100%; + border-collapse: collapse; + font-size: 0.925rem; +} + +.prose-api :where(th, td) { + border: 1px solid var(--ui-border); + padding: 0.5rem 0.75rem; + vertical-align: top; +} + +.prose-api :where(thead th) { + background: var(--ui-bg-muted); +} + +.prose-api .api-table-wrap { + overflow-x: auto; + margin: 1rem 0; +} + +.prose-api .api-code-block :where(pre) { + overflow-x: auto; + border-radius: 0.5rem; + padding: 0.85rem 1rem; + margin: 1rem 0; +} diff --git a/site/app/components/ApiPackageSelect.vue b/site/app/components/ApiPackageSelect.vue new file mode 100644 index 0000000..46c4086 --- /dev/null +++ b/site/app/components/ApiPackageSelect.vue @@ -0,0 +1,34 @@ + + + diff --git a/site/app/components/ApiPageContent.vue b/site/app/components/ApiPageContent.vue new file mode 100644 index 0000000..83f252d --- /dev/null +++ b/site/app/components/ApiPageContent.vue @@ -0,0 +1,30 @@ + + + diff --git a/site/app/components/ApiVersionSelect.vue b/site/app/components/ApiVersionSelect.vue new file mode 100644 index 0000000..524e3bb --- /dev/null +++ b/site/app/components/ApiVersionSelect.vue @@ -0,0 +1,42 @@ + + + diff --git a/site/app/components/AppLogo.vue b/site/app/components/AppLogo.vue new file mode 100644 index 0000000..102c87e --- /dev/null +++ b/site/app/components/AppLogo.vue @@ -0,0 +1,62 @@ + + + diff --git a/site/app/components/LandingCodeBlock.vue b/site/app/components/LandingCodeBlock.vue new file mode 100644 index 0000000..fb70ea4 --- /dev/null +++ b/site/app/components/LandingCodeBlock.vue @@ -0,0 +1,33 @@ + + + diff --git a/site/app/composables/useApiCatalog.ts b/site/app/composables/useApiCatalog.ts new file mode 100644 index 0000000..bfa0032 --- /dev/null +++ b/site/app/composables/useApiCatalog.ts @@ -0,0 +1,55 @@ +import type { ApiCatalog, ApiCatalogPackage } from '~/types/api-catalog' + +const emptyCatalog: ApiCatalog = { + defaultPath: '/api/autofixture/5-0-0-rc-1', + packages: [], +} + +async function loadApiCatalog(): Promise { + if (import.meta.server) { + try { + const { readFile } = await import('node:fs/promises') + const { join } = await import('node:path') + const raw = await readFile(join(process.cwd(), 'public/api-catalog.json'), 'utf8') + return JSON.parse(raw) as ApiCatalog + } catch { + return emptyCatalog + } + } + + const response = await fetch('/api-catalog.json') + if (!response.ok) return emptyCatalog + return response.json() as Promise +} + +export function useApiCatalog() { + const { data: catalog, status } = useAsyncData('api-catalog', loadApiCatalog) + + const packages = computed(() => catalog.value?.packages ?? []) + + function findPackage(packageId: string | null | undefined): ApiCatalogPackage | undefined { + if (!packageId) return undefined + return packages.value.find((entry) => entry.id === packageId.toLowerCase()) + } + + function defaultApiPath(): string { + if (catalog.value?.defaultPath) { + return catalog.value.defaultPath + } + + const main = packages.value.find((entry) => entry.primary) ?? packages.value[0] + if (!main) return emptyCatalog.defaultPath + return `/api/${main.id}/${main.defaultVersionSegment}` + } + + const hasMultiplePackages = computed(() => packages.value.length > 1) + + return { + catalog, + status, + packages, + hasMultiplePackages, + findPackage, + defaultApiPath, + } +} diff --git a/site/app/composables/useApiContext.ts b/site/app/composables/useApiContext.ts new file mode 100644 index 0000000..f662acc --- /dev/null +++ b/site/app/composables/useApiContext.ts @@ -0,0 +1,57 @@ +import type { ApiCatalogPackage } from '~/types/api-catalog' + +export function useApiContext() { + const route = useRoute() + const { findPackage } = useApiCatalog() + + const apiPackageId = computed(() => + route.path.match(/^\/api\/([^/]+)\/([^/]+)/i)?.[1]?.toLowerCase() ?? null, + ) + + const apiVersion = computed(() => + route.path.match(/^\/api\/([^/]+)\/([^/]+)/i)?.[2] ?? null, + ) + + const currentPackage = computed(() => findPackage(apiPackageId.value)) + + const typeSlugPath = computed(() => { + if (!apiPackageId.value || !apiVersion.value) return '' + const prefix = `/api/${apiPackageId.value}/${apiVersion.value}` + if (route.path === prefix || route.path === `${prefix}/`) return '' + return route.path.slice(prefix.length) + }) + + function pathFor(packageEntry: ApiCatalogPackage, versionSegment: string): string { + return `/api/${packageEntry.id}/${versionSegment}${typeSlugPath.value}` + } + + function navigateToPackage(packageId: string) { + const packageEntry = findPackage(packageId) + if (!packageEntry) return + return navigateTo(`/api/${packageEntry.id}/${packageEntry.defaultVersionSegment}`) + } + + function navigateToVersion(versionSegment: string) { + const packageEntry = currentPackage.value + if (!packageEntry) return + + const currentLine = packageEntry.versions.find((entry) => entry.versionSegment === apiVersion.value)?.line + const targetLine = packageEntry.versions.find((entry) => entry.versionSegment === versionSegment)?.line + const keepTypeSlug = currentLine && targetLine && currentLine === targetLine + + const path = keepTypeSlug + ? pathFor(packageEntry, versionSegment) + : `/api/${packageEntry.id}/${versionSegment}` + + return navigateTo(path) + } + + return { + apiPackageId, + apiVersion, + currentPackage, + typeSlugPath, + navigateToPackage, + navigateToVersion, + } +} diff --git a/site/app/composables/useApiNavigation.ts b/site/app/composables/useApiNavigation.ts new file mode 100644 index 0000000..68b0cd9 --- /dev/null +++ b/site/app/composables/useApiNavigation.ts @@ -0,0 +1,55 @@ +import type { ContentNavigationItem } from '@nuxt/content' +import type { ApiTocNode } from '~/types/api-toc' + +function mapTocToNavigation(nodes: ApiTocNode[]): ContentNavigationItem[] { + return nodes.map((node) => { + const item: ContentNavigationItem = { + title: node.title, + path: node.path, + } + if (node.children?.length) { + item.children = mapTocToNavigation(node.children) + } + return item + }) +} + +async function loadApiToc(packageId: string, versionSegment: string): Promise { + if (import.meta.server) { + const { readFile } = await import('node:fs/promises') + const { join } = await import('node:path') + const file = join(process.cwd(), 'public', 'api-meta', packageId, versionSegment, 'toc.json') + return JSON.parse(await readFile(file, 'utf8')) as ApiTocNode[] + } + + return $fetch(`/api-meta/${packageId}/${versionSegment}/toc.json`) +} + +export function useApiNavigation( + packageId: MaybeRefOrGetter, + versionSegment: MaybeRefOrGetter, +) { + const packageIdRef = toRef(packageId) + const versionSegmentRef = toRef(versionSegment) + + const { data: toc } = useAsyncData( + () => { + const id = packageIdRef.value + const version = versionSegmentRef.value + return id && version ? `api-nav-${id}-${version}` : 'api-nav-empty' + }, + () => { + const id = packageIdRef.value + const version = versionSegmentRef.value + if (!id || !version) { + return Promise.resolve([] as ApiTocNode[]) + } + return loadApiToc(id, version) + }, + { watch: [packageIdRef, versionSegmentRef] }, + ) + + const navigation = computed(() => mapTocToNavigation(toc.value ?? [])) + + return { toc, navigation } +} diff --git a/site/app/composables/useApiPage.ts b/site/app/composables/useApiPage.ts new file mode 100644 index 0000000..e8112a4 --- /dev/null +++ b/site/app/composables/useApiPage.ts @@ -0,0 +1,19 @@ +import type { ApiRenderResponse } from '~/types/api-page' + +export function useApiPage(path: MaybeRefOrGetter) { + const pathRef = toRef(path) + + return useAsyncData( + () => `api-page-${pathRef.value}`, + async (): Promise => { + try { + return await $fetch('/api-render', { + query: { path: pathRef.value }, + }) + } catch { + return null + } + }, + { watch: [pathRef] }, + ) +} diff --git a/site/app/composables/useApiSearchSections.ts b/site/app/composables/useApiSearchSections.ts new file mode 100644 index 0000000..a9aafa7 --- /dev/null +++ b/site/app/composables/useApiSearchSections.ts @@ -0,0 +1,51 @@ +import type { ApiSearchSection } from '~/types/api-page' + +export function useApiSearchSections( + packageId: MaybeRefOrGetter, + versionSegment: MaybeRefOrGetter, +) { + const packageIdRef = toRef(packageId) + const versionSegmentRef = toRef(versionSegment) + const { open } = useContentSearch() + + const searchUrl = computed(() => { + const id = packageIdRef.value + const version = versionSegmentRef.value + return id && version ? `/api-meta/${id}/${version}/search.json` : null + }) + + const searchCacheKey = computed(() => { + const url = searchUrl.value + return url ? `api-search-${url}` : 'api-search-empty' + }) + + async function loadSearchSections() { + const url = searchUrl.value + if (!url) { + return [] + } + + const sections = await $fetch(url) + return sections.map((section) => ({ + id: section.id, + title: section.title, + content: section.content, + titles: section.titles, + level: section.level, + })) + } + + const { data: files, status, execute } = useLazyAsyncData( + searchCacheKey, + loadSearchSections, + { server: false, immediate: false, watch: [searchUrl] }, + ) + + watch([open, searchUrl], ([isOpen, url]) => { + if (isOpen && url) { + execute() + } + }) + + return { files, status } +} diff --git a/site/app/layouts/api.vue b/site/app/layouts/api.vue new file mode 100644 index 0000000..f2592d0 --- /dev/null +++ b/site/app/layouts/api.vue @@ -0,0 +1,36 @@ + + + diff --git a/site/app/layouts/default.vue b/site/app/layouts/default.vue new file mode 100644 index 0000000..ba4672f --- /dev/null +++ b/site/app/layouts/default.vue @@ -0,0 +1,3 @@ + diff --git a/site/app/layouts/docs.vue b/site/app/layouts/docs.vue new file mode 100644 index 0000000..d2bd886 --- /dev/null +++ b/site/app/layouts/docs.vue @@ -0,0 +1,30 @@ + + + diff --git a/site/app/middleware/api-normalize.ts b/site/app/middleware/api-normalize.ts new file mode 100644 index 0000000..04e2f90 --- /dev/null +++ b/site/app/middleware/api-normalize.ts @@ -0,0 +1,11 @@ +export default defineNuxtRouteMiddleware((to) => { + if (!to.path.startsWith('/api/')) return + + const normalized = to.path.toLowerCase().replace(/\/$/, '') + if (to.path === normalized) return + + return navigateTo( + { path: normalized, hash: to.hash, query: to.query }, + { replace: true }, + ) +}) diff --git a/site/app/pages/api/[...slug].vue b/site/app/pages/api/[...slug].vue new file mode 100644 index 0000000..343ad9f --- /dev/null +++ b/site/app/pages/api/[...slug].vue @@ -0,0 +1,89 @@ + + + diff --git a/site/app/pages/docs/[...slug].vue b/site/app/pages/docs/[...slug].vue new file mode 100644 index 0000000..2c5f2a9 --- /dev/null +++ b/site/app/pages/docs/[...slug].vue @@ -0,0 +1,64 @@ + + + diff --git a/site/app/pages/docs/index.vue b/site/app/pages/docs/index.vue new file mode 100644 index 0000000..ffc8272 --- /dev/null +++ b/site/app/pages/docs/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/site/app/pages/index.vue b/site/app/pages/index.vue new file mode 100644 index 0000000..43d2e0c --- /dev/null +++ b/site/app/pages/index.vue @@ -0,0 +1,259 @@ + + + + + diff --git a/site/app/types/api-catalog.ts b/site/app/types/api-catalog.ts new file mode 100644 index 0000000..8e7543a --- /dev/null +++ b/site/app/types/api-catalog.ts @@ -0,0 +1,21 @@ +export type ApiCatalogVersion = { + version: string + versionSegment: string + line?: string + isLatest?: boolean +} + +export type ApiCatalogPackage = { + id: string + name: string + nugetId?: string + primary?: boolean + defaultVersion: string + defaultVersionSegment: string + versions: ApiCatalogVersion[] +} + +export type ApiCatalog = { + defaultPath: string + packages: ApiCatalogPackage[] +} diff --git a/site/app/types/api-page.ts b/site/app/types/api-page.ts new file mode 100644 index 0000000..e4b537e --- /dev/null +++ b/site/app/types/api-page.ts @@ -0,0 +1,24 @@ +export type ApiPageTocLink = { + id: string + text: string + depth: number + children?: ApiPageTocLink[] +} + +export type ApiPageMeta = { + path: string + title: string + tocLinks: ApiPageTocLink[] +} + +export type ApiSearchSection = { + id: string + title: string + content: string + titles: string[] + level: number +} + +export type ApiRenderResponse = ApiPageMeta & { + html: string +} diff --git a/site/app/types/api-toc.ts b/site/app/types/api-toc.ts new file mode 100644 index 0000000..c278501 --- /dev/null +++ b/site/app/types/api-toc.ts @@ -0,0 +1,5 @@ +export type ApiTocNode = { + title: string + path?: string + children?: ApiTocNode[] +} diff --git a/site/content.config.ts b/site/content.config.ts new file mode 100644 index 0000000..da5f7d1 --- /dev/null +++ b/site/content.config.ts @@ -0,0 +1,22 @@ +import { defineCollection, defineContentConfig, z } from '@nuxt/content' + +export default defineContentConfig({ + collections: { + content: defineCollection({ + type: 'page', + source: { + include: '*.md', + }, + }), + docs: defineCollection({ + type: 'page', + source: { + include: 'docs/**/{*.md,.navigation.yml}', + prefix: '/docs', + }, + schema: z.object({ + description: z.string().optional(), + }), + }), + }, +}) diff --git a/site/content/docs/1.get-started/.navigation.yml b/site/content/docs/1.get-started/.navigation.yml new file mode 100644 index 0000000..f8ed6da --- /dev/null +++ b/site/content/docs/1.get-started/.navigation.yml @@ -0,0 +1,2 @@ +title: Get started +icon: i-lucide-rocket diff --git a/site/content/docs/1.get-started/1.introduction.md b/site/content/docs/1.get-started/1.introduction.md new file mode 100644 index 0000000..2d1e549 --- /dev/null +++ b/site/content/docs/1.get-started/1.introduction.md @@ -0,0 +1,72 @@ +--- +title: Introduction +description: AutoFixture creates anonymous test data so you write less arrange code in unit tests. +--- + +AutoFixture helps you write unit tests with less hand-written setup. A **fixture** creates anonymous values during the arrange phase — strings, nested objects, and the system under test (SUT) — so you can focus on behavior instead of inventing test data. + +## In this tutorial + +Work through these topics in order: + +1. **Introduction** — you are here +2. [Installation](/docs/get-started/installation) — add the NuGet package and verify restore +3. [Your first test](/docs/get-started/first-test) — use `Fixture.Create` in a unit test +4. [Refactoring a test](/docs/get-started/refactoring-a-test) — shrink messy service arrange with AutoMoq and `Build` + +## Example scenario + +You are testing a `ShippingLabelFormatter` that builds a multi-line label from a customer. The test should verify that the label includes the customer's name and city. You do not care about specific values like `"Jane Doe"` or `"Copenhagen"` — any valid customer is fine. + +## Example + +```csharp +var fixture = new Fixture(); +var customer = fixture.Create(); +var sut = fixture.Create(); + +var label = sut.Format(customer); + +Assert.Contains(customer.Name, label); +Assert.Contains(customer.Address.City, label); +``` + +## How it works + +- `new Fixture()` — starts the data generator for this test +- `Create()` — builds a `Customer` with an anonymous name and nested `Address` +- `Create()` — creates the SUT without a manual `new` +- The asserts read from the object graph AutoFixture created, not from hard-coded strings + +When constructors or dependencies change, you often change less arrange code than with hand-built objects. + +## Example types + +The test above uses these types: + +```csharp +public class Address +{ + public string Street { get; set; } = string.Empty; + public string City { get; set; } = string.Empty; +} + +public sealed class Customer(string name, Address address) +{ + public string Name { get; } = name; + public Address Address { get; } = address; +} + +public sealed class ShippingLabelFormatter +{ + public string Format(Customer customer) => + $"{customer.Name}\n{customer.Address.Street}\n{customer.Address.City}"; +} +``` + +## Next steps + +- [Install AutoFixture](/docs/get-started/installation) +- [Write your first test](/docs/get-started/first-test) +- [Refactoring a test](/docs/get-started/refactoring-a-test) +- [Browse the API reference](/api) diff --git a/site/content/docs/1.get-started/2.installation.md b/site/content/docs/1.get-started/2.installation.md new file mode 100644 index 0000000..eb4f877 --- /dev/null +++ b/site/content/docs/1.get-started/2.installation.md @@ -0,0 +1,57 @@ +--- +title: Installation +description: Install AutoFixture 5.0.0-rc.1 from NuGet for .NET 8 and later test projects. +--- + +Add AutoFixture to your test project from NuGet. Pin the version so everyone on the team uses the same release. + +## Prerequisites + +- [.NET 8 SDK](https://dotnet.microsoft.com/download) or later +- An existing test project (xUnit.net 3, NUnit 4, or plain test class library) + +## Install AutoFixture + +Add the core package to your test project: + +```xml + +``` + +Or with the .NET CLI: + +```bash +dotnet add package AutoFixture --version 5.0.0-rc.1 +``` + +## Verify installation + +After restore, confirm you can create a fixture and generate a value: + +```csharp +var fixture = new Fixture(); +var value = fixture.Create(); +Assert.NotEqual(default, value); +``` + +If this passes, AutoFixture is ready to use in your tests. + +## Optional packages + +| Package | When you need it | +|---------|------------------| +| [AutoFixture.Xunit3](/docs/integrations/xunit3) | xUnit.net 3 test projects | +| [AutoFixture.NUnit4](/docs/integrations/nunit4) | NUnit 4 test projects | +| [AutoFixture.AutoMoq](/docs/integrations/automoq) | Moq mocks | +| [AutoFixture.AutoNSubstitute](/docs/integrations/autonsubstitute) | NSubstitute substitutes | +| [AutoFixture.AutoFakeItEasy](/docs/integrations/autofakeiteasy) | FakeItEasy fakes | +| [AutoFixture.SeedExtensions](/docs/extensions/seed-extensions) | Seeded `Create` / `CreateMany` / `Freeze` overloads | +| [AutoFixture.Idioms](/docs/extensions/idioms) | Guard-clause and idiom assertions | + +See the [integrations overview](/docs/integrations) and full [package list](/docs/reference/packages). + +## Next steps + +- [Introduction](/docs/get-started/introduction) +- [Your first test](/docs/get-started/first-test) +- [FAQ](/docs/reference/faq) diff --git a/site/content/docs/1.get-started/3.first-test.md b/site/content/docs/1.get-started/3.first-test.md new file mode 100644 index 0000000..efc931d --- /dev/null +++ b/site/content/docs/1.get-started/3.first-test.md @@ -0,0 +1,51 @@ +--- +title: Your first test +description: Use Fixture.Create to build anonymous arrange data in a simple unit test. +--- + +This page walks through a small unit test where AutoFixture replaces hand-written arrange values. You use `new Fixture()` directly inside the test method. + +## Example scenario + +You are testing `LineTotalCalculator.Calculate`, which returns `quantity × unitPrice`. The test should verify the line total matches that product. You need a quantity, a unit price, and a calculator instance for the arrange step, but the exact values do not matter. + +## Example + +```csharp +var fixture = new Fixture(); +var quantity = fixture.Create(); +var unitPrice = fixture.Create(); +var sut = fixture.Create(); + +var total = sut.Calculate(quantity, unitPrice); + +Assert.Equal(quantity * unitPrice, total); +``` + +## How it works + +- `new Fixture()` — creates a data generator local to this test +- `Create()` and `Create()` — anonymous operands (quantity and unit price) +- `Create()` — builds the calculator (no manual `new` when the type has a simple constructor) +- `sut` — the system under test (SUT); the instance under test +- `Assert.Equal(quantity * unitPrice, total)` — expected value comes from the operands you arranged, not from re-running production code + +Use `new Fixture()` when a single test needs one-off anonymous data. When many tests share the same customizations, consider a fixture factory or xUnit.net 3 [AutoData](/docs/integrations/xunit3). + +## Example types + +The test above uses this type: + +```csharp +public class LineTotalCalculator +{ + public decimal Calculate(int quantity, decimal unitPrice) => + quantity * unitPrice; +} +``` + +## Next steps + +- [Introduction](/docs/get-started/introduction) +- [Refactoring a test](/docs/get-started/refactoring-a-test) +- [Fixture and Create](/docs/fundamentals/fixture-and-create) diff --git a/site/content/docs/1.get-started/4.refactoring-a-test.md b/site/content/docs/1.get-started/4.refactoring-a-test.md new file mode 100644 index 0000000..cc7d3ed --- /dev/null +++ b/site/content/docs/1.get-started/4.refactoring-a-test.md @@ -0,0 +1,249 @@ +--- +title: Refactoring a test +description: Replace verbose arrange code with AutoFixture when a service test needs nested data and injected dependencies. +--- + +Real service tests often need a system under test (SUT) with injected dependencies and a valid domain object before the service accepts the call. This page starts with a hand-written example, then refactors it in two steps. + +## Prerequisites + +- .NET 8+ test project +- [AutoFixture](/docs/get-started/installation) in your test project +- [AutoFixture.AutoMoq](/docs/integrations/automoq) plus an explicit **Moq** reference — AutoMoq's own Moq dependency is kept low for compatibility, so add the latest Moq yourself for current features and fixes + +## Example scenario + +You are testing `ShippingLabelService.CreateLabel`. The service loads an order from a repository, validates the order is shippable, asks a rate calculator for total weight, and returns a multi-line label. + +The test should verify the label includes the customer's name, destination country, and total weight in kilograms. You do not care about product price, billing zip codes, or most address fields — but the service still requires them to be populated. + +## Example types + +The service and its dependencies: + +```csharp +public interface ICommerceOrderRepository +{ + Order? GetById(uint id); +} + +public interface IShippingRateCalculator +{ + double CalculateTotalWeightKg(Order order); +} + +public class ShippingRateCalculator : IShippingRateCalculator +{ + public double CalculateTotalWeightKg(Order order) => + order.OrderLines.Sum(line => line.Product.Weight * line.Quantity); +} + +public class ShippingLabelService( + ICommerceOrderRepository orders, + IShippingRateCalculator rateCalculator) +{ + public string CreateLabel(uint orderId) + { + var order = orders.GetById(orderId) + ?? throw new InvalidOperationException("Order not found."); + + // Validates line items, shipping address, billing address, then: + var weightKg = rateCalculator.CalculateTotalWeightKg(order); + var address = order.ShippingAddress; + return $"{address.Name}\n{address.Street}\n{address.Zip} {address.Country}\nWeight: {weightKg:F1} kg"; + } +} +``` + +The order graph the service validates: + +```csharp +public class Order +{ + public Order(uint id) + { + Id = id; + OrderLines = new List(); + } + + public uint Id { get; private set; } + + public IList OrderLines { get; private set; } + + public ShippingAddress ShippingAddress { get; set; } = new(); + + public ShippingAddress BillingAddress { get; set; } = new(); +} + +public class ShippingAddress +{ + public string Name { get; set; } = string.Empty; + public string Street { get; set; } = string.Empty; + public string Zip { get; set; } = string.Empty; + public string Country { get; set; } = string.Empty; +} +``` + +`OrderLine` and `Product` are also part of the commerce model. The test pins product weight and line quantity because the weight assert depends on them; other product fields stay anonymous. + +## The classic approach + +A typical hand-written test wires the full graph and constructs the service manually: + +```csharp +const uint orderId = 1001; + +var product = new Product(501) +{ + Price = 24.99m, + Weight = 1.25 +}; +var line = new OrderLine(product) { Quantity = 2 }; + +var order = new Order(orderId); +order.ShippingAddress = new ShippingAddress +{ + Name = "Jane Doe", + Street = "742 Evergreen Terrace", + Zip = "12345", + Country = "Denmark" +}; +order.BillingAddress = new ShippingAddress +{ + Name = "Jane Doe", + Street = "742 Evergreen Terrace", + Zip = "12345", + Country = "Denmark" +}; +order.OrderLines.Add(line); + +var orderRepository = new Mock(); +orderRepository + .Setup(r => r.GetById(orderId)) + .Returns(order); + +var rateCalculator = new Mock(); +rateCalculator + .Setup(c => c.CalculateTotalWeightKg(order)) + .Returns(2.5); + +var sut = new ShippingLabelService( + orderRepository.Object, + rateCalculator.Object); + +var label = sut.CreateLabel(orderId); + +Assert.Contains("Jane Doe", label); +Assert.Contains("Denmark", label); +Assert.Contains("2.5", label); +``` + +This works, but it has drawbacks: + +- **Arrange dominates the test** — most lines exist only to satisfy validation, not to express what you are verifying +- **Repeated data** — shipping and billing addresses are duplicated even though the assertion only reads the shipping label +- **Incidental values** — product id, price, and street names add noise when the test cares about name, country, and weight on the label +- **Manual SUT wiring** — `new ShippingLabelService(...)` repeats constructor parameters you will repeat in every test for this service + +## Step 1 — refactor the service dependencies + +Install [AutoFixture.AutoMoq](/docs/integrations/automoq) and an explicit latest **Moq** reference if you have not already (do not rely only on AutoMoq's low transitive Moq dependency), then customize the fixture so AutoFixture creates the service without `new ShippingLabelService(...)`. Mock only collaborators that cross a process boundary. + +`ICommerceOrderRepository` loads data from storage — mock it. `ShippingRateCalculator` only sums order line weights in memory; it does not call databases, HTTP APIs, or the file system. In a **classicist** unit test, keep that kind of collaborator real and mock I/O at the edge. + +```csharp +const uint orderId = 1001; + +// ... build product, order, addresses, and order lines by hand ... + +var fixture = new Fixture().Customize(new AutoMoqCustomization()); + +var orderRepository = fixture.Freeze>(); +orderRepository + .Setup(r => r.GetById(orderId)) + .Returns(order); + +var rateCalculator = fixture.Freeze(); +fixture.Inject(rateCalculator); + +var sut = fixture.Create(); + +var label = sut.CreateLabel(orderId); + +// ... Assert.Contains for name, country, and "2.5" ... +``` + +The order graph is still built by hand, but you drop manual SUT construction and the rate-calculator mock setup. AutoMoq supplies the repository mock; `Freeze` + `Inject` register the real calculator as `IShippingRateCalculator`. + +**What improved:** less constructor noise; weight on the label now comes from real calculator logic instead of a hard-coded mock return value. + +**What is still painful:** the order, addresses, product, and repository `.Setup` block are unchanged. + +## Step 2 — refactor the test data + +Generate anonymous specimens where values do not matter. Use `Build` only for fields the test or service rules require: + +```csharp +var fixture = new Fixture().Customize(new AutoMoqCustomization()); + +var orderRepository = fixture.Freeze>(); +var rateCalculator = fixture.Freeze(); +fixture.Inject(rateCalculator); + +var shippingAddress = fixture.Build() + .With(a => a.Name, "Jane Doe") + .With(a => a.Country, "Denmark") + .Create(); + +var product = fixture.Build() + .With(p => p.Weight, 1.25) + .Create(); + +var line = fixture.Build() + .FromFactory(() => new OrderLine(product)) + .With(l => l.Quantity, 2u) + .Create(); + +var order = fixture.Build() + .Do(o => o.OrderLines.Add(line)) + .With(o => o.ShippingAddress, shippingAddress) + .With(o => o.BillingAddress, shippingAddress) + .Create(); + +orderRepository.Setup(r => r.GetById(order.Id)).Returns(order); + +var sut = fixture.Create(); +var label = sut.CreateLabel(order.Id); + +Assert.Contains("Jane Doe", label); +Assert.Contains("Denmark", label); +Assert.Contains("2.5", label); +``` + +Pin values the assertion depends on (`Weight` and `Quantity` → `2.5` kg). Do not re-call `CalculateTotalWeightKg` in the assert — that only proves the SUT and the assert used the same collaborator. Assert a known expected result from known inputs instead. + +**What improved:** + +- **Pin only what matters** — name and country for the destination; weight and quantity for the kg line on the label +- **Reuse one address** — billing and shipping share the same instance instead of duplicating five fields +- **Anonymous filler** — order id, street, zip, and product id come from AutoFixture +- **Known expected value** — `Assert.Contains("2.5", label)` matches the classic example + +## How it works + +- `AutoMoqCustomization` — creates Moq mocks for interface constructor parameters you do not replace +- `Freeze>()` — one shared mock instance for setup and verification +- `Freeze()` + `Inject()` — freeze a concrete type and supply it wherever the interface is requested +- `Create()` — anonymous values for properties the test does not care about +- `Build()` + `With` / `Do` / `FromFactory` — pin properties, add items to read-only collections, or control construction +- `FromFactory` — required when a type needs a constructor argument you already built (here, `OrderLine(Product)`); AutoFixture cannot invent that graph from `Create()` alone if you need a specific product instance + +Plain `Create()` still fails here because the service validates line items, addresses, and weight. `Build` lets you satisfy those rules without a fully manual graph. + +## Next steps + +- [Introduction](/docs/get-started/introduction) +- [Integrations overview](/docs/integrations) +- [AutoMoq](/docs/integrations/automoq) +- [Build DSL](/docs/fundamentals/build-dsl) +- [Register, Freeze, and Inject](/docs/how-to/register-freeze-inject) diff --git a/site/content/docs/2.fundamentals/.navigation.yml b/site/content/docs/2.fundamentals/.navigation.yml new file mode 100644 index 0000000..0b32e95 --- /dev/null +++ b/site/content/docs/2.fundamentals/.navigation.yml @@ -0,0 +1,2 @@ +title: Fundamentals +icon: i-lucide-layers diff --git a/site/content/docs/2.fundamentals/1.fixture-and-create.md b/site/content/docs/2.fundamentals/1.fixture-and-create.md new file mode 100644 index 0000000..c1d9c82 --- /dev/null +++ b/site/content/docs/2.fundamentals/1.fixture-and-create.md @@ -0,0 +1,57 @@ +--- +title: Fixture and Create +description: Learn how Fixture.Create generates anonymous specimens for types you request. +--- + +`Fixture` is the main entry point. Call `Create()` to get an anonymous instance of `T`. + +## Example scenario + +You are testing code that needs a `ClientDto` with a name and age. The exact values do not matter — you only need a populated object for the arrange step. + +## Example + +```csharp +var fixture = new Fixture(); + +var number = fixture.Create(); +var text = fixture.Create(); +var dto = fixture.Create(); + +Assert.NotEqual(default, number); +Assert.False(string.IsNullOrEmpty(text)); +Assert.False(string.IsNullOrEmpty(dto.Name)); +``` + +Use `CreateMany(count)` when you need several values: + +```csharp +var values = fixture.CreateMany(3).ToList(); + +Assert.Equal(3, values.Count); +Assert.True(values.Distinct().Count() > 1); +``` + +## How it works + +- `new Fixture()` — starts a fresh generator for this test +- `Create()` — resolves `T` through AutoFixture's [specimen pipeline](/docs/advanced/specimen-pipeline) (constructor, properties, nested types) +- `CreateMany(count)` — returns an enumerable of distinct anonymous values +- **Different each call** — successive `Create()` calls usually return different values, which helps avoid tests that pass only for one hard-coded number +- **Same value twice** — use `FromSeed` in [Customizations](/docs/fundamentals/customizations) or `Freeze` in [Register, Freeze, and Inject](/docs/how-to/register-freeze-inject) when a test needs repeatability or one shared instance + +See also [Collections](/docs/how-to/collections). + +## Next steps + +- [Build DSL](/docs/fundamentals/build-dsl) +- [Customizations](/docs/fundamentals/customizations) +- [Specimen graphs](/docs/fundamentals/specimen-graphs) +- [Collections](/docs/how-to/collections) +- [Data annotations](/docs/how-to/data-annotations) +- [Your first test](/docs/get-started/first-test) + +## API + +- [`Fixture`](/api/autofixture/5-0-0-rc-1/autofixture.fixture) +- [`IFixture.Create`](/api/autofixture/5-0-0-rc-1/autofixture.ifixture#create) diff --git a/site/content/docs/2.fundamentals/2.build-dsl.md b/site/content/docs/2.fundamentals/2.build-dsl.md new file mode 100644 index 0000000..1444be4 --- /dev/null +++ b/site/content/docs/2.fundamentals/2.build-dsl.md @@ -0,0 +1,66 @@ +--- +title: Build DSL +description: Use Build, With, Without, and OmitAutoProperties to control anonymous object creation. +--- + +When `Create` is too coarse, `Build()` returns a composer you can configure before calling `Create()`. + +## Example scenario + +You are testing a component that reads `ClientDto.Name` and `ClientDto.Age`. You need to pin specific values for those properties while AutoFixture fills the rest — or leave some properties at their defaults. + +## Example + +**With** — set property values: + +```csharp +var fixture = new Fixture(); +var expectedName = fixture.Create(); + +var client = fixture.Build() + .With(dto => dto.Name, expectedName) + .With(dto => dto.Age, 42) + .Create(); + +Assert.Equal(expectedName, client.Name); +Assert.Equal(42, client.Age); +``` + +**Without** — skip auto assignment: + +```csharp +var client = fixture.Build() + .Without(dto => dto.Age) + .Create(); + +Assert.Equal(default, client.Age); +``` + +**OmitAutoProperties** — empty shell: + +```csharp +var client = fixture.Build() + .OmitAutoProperties() + .Create(); + +Assert.Equal(string.Empty, client.Name); +Assert.Equal(default, client.Age); +``` + +## How it works + +- `Build()` — returns an `IPostprocessComposer` you chain before `Create()` +- `With` — overrides a property value on the final specimen +- `Without` — leaves a property at its default instead of auto-assigning +- `OmitAutoProperties` — skips all property assignment; only constructor parameters are filled + +Use `Build` when business rules or test assertions require specific property values. See [Refactoring a test](/docs/get-started/refactoring-a-test) for a graph constraint example. + +## Next steps + +- [Customizations](/docs/fundamentals/customizations) +- [Collections](/docs/how-to/collections) + +## API + +- [`Fixture.Build`](/api/autofixture/5-0-0-rc-1/autofixture.fixture#build) diff --git a/site/content/docs/2.fundamentals/3.customizations.md b/site/content/docs/2.fundamentals/3.customizations.md new file mode 100644 index 0000000..7ec1ab1 --- /dev/null +++ b/site/content/docs/2.fundamentals/3.customizations.md @@ -0,0 +1,132 @@ +--- +title: Customizations +description: Register factories and Customize composers to control how AutoFixture creates specimens. +--- + +Customizations change how AutoFixture builds specific types. Use `Register` when you want to replace creation entirely. Use `Customize` when you want to adjust how a type is built — the same [Build DSL](/docs/fundamentals/build-dsl) you use for one-off specimens also works here, but applies to **every** `Create()` on the fixture. + +## Example scenario + +You need every `ClientDto` in a test to use a known age, or you need a type with multiple constructors to always be built a certain way. + +## Example + +**Register** — replace the factory for a type: + +```csharp +var fixture = new Fixture(); +fixture.Register(() => new ClientDto { Name = "registered", Age = 30 }); + +var client = fixture.Create(); + +Assert.Equal("registered", client.Name); +Assert.Equal(30, client.Age); +``` + +**Customize with `With`** — fixture-wide default for one property: + +```csharp +var fixture = new Fixture(); +fixture.Customize(composer => composer.With(dto => dto.Age, 21)); + +var client = fixture.Create(); + +Assert.Equal(21, client.Age); +Assert.False(string.IsNullOrEmpty(client.Name)); +``` + +Other properties stay anonymous; only `Age` is pinned for every `Create()`. + +**Customize with `Without`** — leave a property at its default: + +```csharp +fixture.Customize(composer => composer.Without(dto => dto.Age)); + +var client = fixture.Create(); + +Assert.Equal(default, client.Age); +Assert.False(string.IsNullOrEmpty(client.Name)); +``` + +**Customize with `OmitAutoProperties`** — constructor only, no auto-filled properties: + +```csharp +fixture.Customize(composer => composer.OmitAutoProperties()); + +var client = fixture.Create(); + +Assert.Equal(string.Empty, client.Name); +Assert.Equal(default, client.Age); +``` + +**Customize with `FromFactory`** — always construct the type your way: + +```csharp +fixture.Customize(composer => + composer.FromFactory(() => new MultiCtorProduct("widget", 9.99m))); + +var product = fixture.Create(); + +Assert.Equal("widget", product.Name); +Assert.Equal(9.99m, product.Price); +``` + +AutoFixture skips its normal constructor selection and calls your factory every time. Use this when you need a specific constructor, or when creation depends on objects you control. + +**Customize with `FromSeed`** — map AutoFixture's seed to a value: + +```csharp +fixture.Customize(composer => composer.FromSeed(seed => seed * 10)); + +var first = fixture.Create(); +var second = fixture.Create(); + +Assert.Equal(0, first); +Assert.Equal(first, second); +``` + +Bare `Create()` uses `default(int)` as the seed, so both calls return `0`. With [Seed extensions](/docs/extensions/seed-extensions), `Create(5)` returns `50`. Ints inside object graphs often use string seeds (property or parameter names), so this rule may not apply there — the default random generator still runs. + +### `FromFactory` vs `FromSeed` + +| | `FromFactory` | `FromSeed` | +| --- | --- | --- | +| Input | Your factory — no seed | A seed from AutoFixture's pipeline | +| Control | You own construction entirely | You transform seed → value | +| Typical use | Pick a constructor, wire known dependencies | Repeatable values from seed context | +| Close to | `Register` (always your code) | Seed-aware rule, not full replacement | + +`FromFactory(() => new OrderLine(product))` is right when you must pass a specific `product`. `FromSeed(seed => seed * 10)` is right when you want a deterministic function of whatever seed AutoFixture supplies for that request. + +You can chain composer methods — for example `With` and `Without` together — the same way you chain `fixture.Build()`. + +## Customize vs Build + +| | `Customize(...)` | `Build().Create()` | +| --- | --- | --- | +| Scope | Every `Create()` on the fixture | One specimen | +| Customizations on fixture | Applied | Bypassed | +| Typical use | Shared defaults across a test class or fixture factory | One test with specific constraints | + +For graph constraints (`Do`, `FromFactory`) or a single pinned object, prefer `Build`. For team-wide or test-class defaults, prefer `Customize` or an [ICustomization](/docs/fundamentals/customizations-catalog) implementation. + +## How it works + +- `Register(Func)` — replaces the default factory for `T` +- `Customize(Func, ISpecimenBuilder>)` — wraps the composer pipeline for `T`; pass the same methods as [Build DSL](/docs/fundamentals/build-dsl): `With`, `Without`, `Do`, `FromFactory`, `FromSeed`, `OmitAutoProperties`, and others +- `FromFactory` — ignores normal creation and calls your factory for every request for `T` +- `FromSeed` — maps a seed to a value when the request carries a compatible seed (see the `FromSeed` example above) + +See also [Register, Freeze, and Inject](/docs/how-to/register-freeze-inject) and [Customizations catalog](/docs/fundamentals/customizations-catalog). + +## Next steps + +- [Advanced overview](/docs/advanced/overview) +- [Specimen pipeline](/docs/advanced/specimen-pipeline) +- [Specimen graphs](/docs/fundamentals/specimen-graphs) +- [Register, Freeze, and Inject](/docs/how-to/register-freeze-inject) + +## API + +- [`IFixture.Register`](/api/autofixture/5-0-0-rc-1/autofixture.ifixture#register) +- [`IFixture.Customize`](/api/autofixture/5-0-0-rc-1/autofixture.ifixture#customize) diff --git a/site/content/docs/2.fundamentals/4.specimen-graphs.md b/site/content/docs/2.fundamentals/4.specimen-graphs.md new file mode 100644 index 0000000..54b8b96 --- /dev/null +++ b/site/content/docs/2.fundamentals/4.specimen-graphs.md @@ -0,0 +1,40 @@ +--- +title: Specimen graphs +description: AutoFixture builds nested object graphs automatically from constructor and property dependencies. +--- + +When you call `Create()` on a complex type, AutoFixture fills constructor parameters and properties with anonymous values, including nested types. + +## Example scenario + +You are testing code that reads `Person.Name` and `Person.HomeAddress.City`. You need a fully wired object graph without manually constructing `Address` and assigning it to `Person`. + +## Example + +```csharp +var fixture = new Fixture(); +var person = fixture.Create(); + +Assert.False(string.IsNullOrEmpty(person.Name)); +Assert.False(string.IsNullOrEmpty(person.HomeAddress.Street)); +Assert.False(string.IsNullOrEmpty(person.HomeAddress.City)); +``` + +A `Person` with an `Address` property gets both objects populated without manual wiring. + +## How it works + +AutoFixture walks constructor parameters and writable properties, creating specimens for each dependency. Nested reference types become part of the same graph in one `Create` call. + +Some graphs have business rules (collections, circular references, interfaces). When `Create` fails, use [Build DSL](/docs/fundamentals/build-dsl), [Register, Freeze, and Inject](/docs/how-to/register-freeze-inject), or [Circular references](/docs/how-to/circular-refs). + +For how AutoFixture wires **builders and specifications** inside the kernel, see [Specimen builders and specifications](/docs/advanced/specimen-builders-and-specifications). + +## Next steps + +- [Advanced overview](/docs/advanced/overview) +- [Specimen pipeline](/docs/advanced/specimen-pipeline) +- [Specimen builders and specifications](/docs/advanced/specimen-builders-and-specifications) +- [Collections](/docs/how-to/collections) +- [Circular references](/docs/how-to/circular-refs) +- [Build DSL](/docs/fundamentals/build-dsl) diff --git a/site/content/docs/2.fundamentals/5.behaviors.md b/site/content/docs/2.fundamentals/5.behaviors.md new file mode 100644 index 0000000..aecb64b --- /dev/null +++ b/site/content/docs/2.fundamentals/5.behaviors.md @@ -0,0 +1,63 @@ +--- +title: Behaviors +description: Control recursion, constructor choice, and specimen policies with behaviors and attributes. +--- + +Behaviors change how AutoFixture handles edge cases like circular graphs and multi-constructor types. + +## Example scenario + +You have a `TreeNode` type where each node references a parent, causing circular graphs. You also have `MultiCtorProduct` with both a parameterless and a greedy constructor — and you need to pick which one AutoFixture uses in xUnit.net 3 or NUnit 4 theories. + +## Example + +**Recursion** — default `ThrowingRecursionBehavior` throws on circular graphs: + +```csharp +var fixture = new Fixture(); + +Assert.ThrowsAny(() => fixture.Create()); +``` + +Switch to `OmitOnRecursionBehavior` to omit recursive properties instead. See [Circular references](/docs/how-to/circular-refs). + +### Modest and Greedy + +Pick constructor greediness per parameter in theories (same attributes exist for [xUnit.net 3](/docs/integrations/xunit3) and [NUnit 4](/docs/integrations/nunit4)): + +```csharp +[Theory, AutoData] +public void ModestAttribute_UsesParameterlessConstructor([Modest] MultiCtorProduct product) +{ + Assert.Equal("default", product.Name); + Assert.Equal(0m, product.Price); +} + +[Theory, AutoData] +public void GreedyAttribute_UsesFullestConstructor([Greedy] MultiCtorProduct product) +{ + Assert.False(string.IsNullOrEmpty(product.Name)); + Assert.NotEqual(0m, product.Price); +} +``` + +## How it works + +- **Behaviors** — global policies on the fixture (recursion, omitting properties, etc.) +- **Modest** — prefers the constructor with fewest parameters +- **Greedy** — prefers the constructor with most parameters + +Requires [xUnit.net 3](/docs/integrations/xunit3) or [NUnit 4](/docs/integrations/nunit4) for `Modest` and `Greedy` attributes. + +## Next steps + +- [Circular references](/docs/how-to/circular-refs) +- [xUnit.net 3](/docs/integrations/xunit3) +- [NUnit 4](/docs/integrations/nunit4) + +## API + +- [`ThrowingRecursionBehavior`](/api/autofixture/5-0-0-rc-1/autofixture.throwingrecursionbehavior) +- [`OmitOnRecursionBehavior`](/api/autofixture/5-0-0-rc-1/autofixture.omitonrecursionbehavior) +- [`ModestAttribute`](/api/xunit3/5-0-0-rc-1/autofixture.xunit3.modestattribute) (also on [NUnit 4](/api/nunit4/5-0-0-rc-1/autofixture.nunit4.modestattribute)) +- [`GreedyAttribute`](/api/xunit3/5-0-0-rc-1/autofixture.xunit3.greedyattribute) (also on [NUnit 4](/api/nunit4/5-0-0-rc-1/autofixture.nunit4.greedyattribute)) diff --git a/site/content/docs/2.fundamentals/6.customizations-catalog.md b/site/content/docs/2.fundamentals/6.customizations-catalog.md new file mode 100644 index 0000000..d73ad35 --- /dev/null +++ b/site/content/docs/2.fundamentals/6.customizations-catalog.md @@ -0,0 +1,111 @@ +--- +title: Customizations catalog +description: Package reusable fixture setup with ICustomization, CompositeCustomization, and team profiles. +--- + +When several tests share the same fixture setup — AutoMoq, string prefixes, behaviors — package that setup as **ICustomization** types instead of repeating `Register` and `Customize` calls in every test. + +## Example scenario + +Your team uses AutoMoq for mocks and a string prefix rule for readable test output. You want both customizations applied whenever a test creates a new fixture. + +## ICustomization + +The interface has one method — apply your setup to a fixture: + +```csharp +public interface ICustomization +{ + void Customize(IFixture fixture); +} +``` + +Implement it with the same APIs you use inline: `Register`, `Customize`, `Behaviors.Add`, and so on. + +```csharp +public sealed class StringPrefixCustomization : ICustomization +{ + public void Customize(IFixture fixture) + { + fixture.Customize(composer => composer + .FromSeed(seed => $"doc-{seed}")); + } +} +``` + +```csharp +var fixture = new Fixture().Customize(new StringPrefixCustomization()); + +var text = fixture.Create(); + +Assert.StartsWith("doc-", text); +``` + +See [Customizations](/docs/fundamentals/customizations) for `Register`, `With`, `FromFactory`, and `FromSeed`. + +Built-in packages ship their own implementations — for example [`AutoMoqCustomization`](/docs/integrations/automoq) and [`NoAutoPropertiesCustomization`](/api/autofixture/5-0-0-rc-1/autofixture.noautopropertiescustomization). + +## CompositeCustomization + +Run several customizations in one call. Each child runs in order on the same fixture: + +```csharp +var fixture = new Fixture().Customize( + new CompositeCustomization( + new AutoMoqCustomization(), + new StringPrefixCustomization())); + +var text = fixture.Create(); +var service = fixture.Create(); + +Assert.StartsWith("doc-", text); +Assert.NotNull(service); +``` + +Order matters when later customizations override earlier ones. + +## Subclass CompositeCustomization + +For a fixed team profile, subclass and pass the bundle to the base constructor: + +```csharp +public sealed class TeamFixtureCustomization : CompositeCustomization +{ + public TeamFixtureCustomization() + : base( + new AutoMoqCustomization(), + new StringPrefixCustomization()) + { + } +} +``` + +```csharp +var fixture = new Fixture().Customize(new TeamFixtureCustomization()); + +var service = fixture.Create(); + +Assert.NotNull(service); +Assert.StartsWith("doc-", fixture.Create()); +``` + +One type name documents the standard test fixture for your project. Reuse it from a [custom AutoData attribute](/docs/integrations/xunit3#custom-autodata-attribute). + +## How it works + +- **`ICustomization`** — encapsulates fixture setup in `Customize(IFixture fixture)` +- **`CompositeCustomization`** — runs multiple `ICustomization` instances in order; it is itself an `ICustomization` +- **Subclassing `CompositeCustomization`** — names a fixed bundle of customizations for reuse across tests and test attributes + +## Next steps + +- [Customizations](/docs/fundamentals/customizations) +- [AutoMoq](/docs/integrations/automoq) +- [AutoNSubstitute](/docs/integrations/autonsubstitute) +- [AutoFakeItEasy](/docs/integrations/autofakeiteasy) +- [Custom AutoData attribute](/docs/integrations/xunit3#custom-autodata-attribute) + +## API + +- [`ICustomization`](/api/autofixture/5-0-0-rc-1/autofixture.icustomization) +- [`CompositeCustomization`](/api/autofixture/5-0-0-rc-1/autofixture.compositecustomization) diff --git a/site/content/docs/3.how-to/.navigation.yml b/site/content/docs/3.how-to/.navigation.yml new file mode 100644 index 0000000..f9f8af8 --- /dev/null +++ b/site/content/docs/3.how-to/.navigation.yml @@ -0,0 +1,2 @@ +title: How-to guides +icon: i-lucide-book-open diff --git a/site/content/docs/3.how-to/1.collections.md b/site/content/docs/3.how-to/1.collections.md new file mode 100644 index 0000000..761ec07 --- /dev/null +++ b/site/content/docs/3.how-to/1.collections.md @@ -0,0 +1,152 @@ +--- +title: Collections +description: Create arrays, lists, and sequences, assign collection properties with With, and populate existing collections with AddManyTo. +--- + +AutoFixture can produce standalone collections (`Create()`, `CreateMany(5)`), assign a collection to a writable property with `With`, or append items to an `ICollection` you already hold with `AddManyTo`. + +## Example scenario + +You are testing code that sums a list of integers, reads tags from a writable list property, or needs an order with populated lines before your service accepts it. + +## Create arrays and lists + +`Create` fills arrays and lists with anonymous elements: + +```csharp +var fixture = new Fixture(); + +var tags = fixture.Create(); +var scores = fixture.Create>(); + +Assert.NotEmpty(tags); +Assert.NotEmpty(scores); +Assert.All(tags, tag => Assert.False(string.IsNullOrEmpty(tag))); +``` + +AutoFixture picks a default length based on [`RepeatCount`](/api/autofixture/5-0-0-rc-1/autofixture.fixture#repeatcount). + +## CreateMany + +When you need a specific number of distinct values, use `CreateMany(count)`: + +```csharp +var values = fixture.CreateMany(5).ToList(); + +Assert.Equal(5, values.Count); +Assert.True(values.Distinct().Count() > 1); +``` + +`CreateMany` returns a lazy `IEnumerable` — call `.ToList()` or `.ToArray()` when you need a fixed collection. Values are distinct by default for primitive types. See also [Fixture and Create](/docs/fundamentals/fixture-and-create). + +The [Seed extensions](/docs/extensions/seed-extensions) package adds seeded overloads such as `CreateMany("Item", 3)` for readable string prefixes. + +## Assign collection properties with With + +When a property is assignable, create the collection and assign it with `With`: + +```csharp +public sealed class TagBag +{ + public List Labels { get; set; } = []; +} +``` + +```csharp +var tags = fixture.Build() + .With(b => b.Labels, fixture.CreateMany().ToList()) + .Create(); + +Assert.Equal(fixture.RepeatCount, tags.Labels.Count); +``` + +For arrays: + +```csharp +public sealed class ScoreBatch +{ + public int[] Values { get; set; } = []; +} +``` + +```csharp +var batch = fixture.Build() + .With(b => b.Values, fixture.CreateMany().ToArray()) + .Create(); + +Assert.Equal(fixture.RepeatCount, batch.Values.Length); +``` + +## AddManyTo on an existing collection + +[`AddManyTo`](/api/autofixture/5-0-0-rc-1/autofixture.collectionfiller) appends anonymous items to an `ICollection` you already have. By default it adds [`RepeatCount`](/api/autofixture/5-0-0-rc-1/autofixture.fixture#repeatcount) items: + +```csharp +var lines = new List(); +fixture.AddManyTo(lines); + +Assert.Equal(fixture.RepeatCount, lines.Count); +``` + +Pass an explicit count or factory when you need control: + +```csharp +fixture.AddManyTo(lines, 3); + +fixture.AddManyTo(lines, () => fixture.Build() + .With(l => l.Quantity, 1u) + .Create()); +``` + +## Read-only collection properties + +Some types expose a collection through a read-only property — the list is created in the constructor and cannot be replaced with `With`. Plain `Create()` leaves `OrderLines` empty unless you enable [`ReadonlyCollectionPropertiesBehavior`](/api/autofixture/5-0-0-rc-1/autofixture.readonlycollectionpropertiesbehavior): + +```csharp +var fixture = new Fixture(); +fixture.Behaviors.Add(new ReadonlyCollectionPropertiesBehavior()); + +var order = fixture.Create(); + +Assert.Equal(fixture.RepeatCount, order.OrderLines.Count); +``` + +The behavior calls `Add` on read-only properties that implement `ICollection`. Item count follows [`RepeatCount`](/api/autofixture/5-0-0-rc-1/autofixture.fixture#repeatcount). + +For a single order without enabling the behavior globally: + +```csharp +var order = fixture.Build() + .Do(o => fixture.AddManyTo(o.OrderLines)) + .Create(); + +Assert.Equal(fixture.RepeatCount, order.OrderLines.Count); +``` + +To add one specific item, use `Do` — see [Refactoring a test](/docs/get-started/refactoring-a-test). + +## How it works + +- **`Create()` / `Create>()`** — standalone collections filled in one call +- **`CreateMany(count)`** — lazy sequence of distinct specimens +- **`With(..., CreateMany().ToList())`** — assigns a populated collection during the build +- **`AddManyTo(collection)`** — appends items to an existing `ICollection` +- **`ReadonlyCollectionPropertiesBehavior`** — fills read-only `ICollection` properties via `Add` +- **`Build` + `Do` + `AddManyTo`** — populate one specimen's read-only collection without a global behavior + +When nested graphs fail validation, combine these with [Specimen graphs](/docs/fundamentals/specimen-graphs) and [Build DSL](/docs/fundamentals/build-dsl). + +## Next steps + +- [Specimen graphs](/docs/fundamentals/specimen-graphs) +- [Build DSL](/docs/fundamentals/build-dsl) +- [Data annotations](/docs/how-to/data-annotations) +- [Refactoring a test](/docs/get-started/refactoring-a-test) +- [Seed extensions](/docs/extensions/seed-extensions) + +## API + +- [`ReadonlyCollectionPropertiesBehavior`](/api/autofixture/5-0-0-rc-1/autofixture.readonlycollectionpropertiesbehavior) +- [`CollectionFiller.AddManyTo`](/api/autofixture/5-0-0-rc-1/autofixture.collectionfiller) +- [`Fixture.RepeatCount`](/api/autofixture/5-0-0-rc-1/autofixture.fixture#repeatcount) +- [`CreateMany` extension](/api/autofixture/5-0-0-rc-1/autofixture.specimenfactory-1#createmany) diff --git a/site/content/docs/3.how-to/2.circular-refs.md b/site/content/docs/3.how-to/2.circular-refs.md new file mode 100644 index 0000000..ecf8f62 --- /dev/null +++ b/site/content/docs/3.how-to/2.circular-refs.md @@ -0,0 +1,52 @@ +--- +title: Circular references +description: Handle parent-child graphs that reference each other using OmitOnRecursionBehavior. +--- + +By default AutoFixture throws when it detects a circular object graph. + +## Example scenario + +`TreeNode` has a `Parent` property that points back to another node. A plain `Create()` triggers infinite recursion detection. + +## Example + +Default behavior throws: + +```csharp +var fixture = new Fixture(); + +Assert.ThrowsAny(() => fixture.Create()); +``` + +Replace the default throwing behavior to omit recursive properties: + +```csharp +fixture.Behaviors + .OfType() + .ToList() + .ForEach(b => fixture.Behaviors.Remove(b)); +fixture.Behaviors.Add(new OmitOnRecursionBehavior()); + +var node = fixture.Create(); + +Assert.NotNull(node); +``` + +## How it works + +- `ThrowingRecursionBehavior` — default; fails fast on cycles +- `OmitOnRecursionBehavior` — stops recursion and leaves the recursive property unset +- Remove the throwing behavior before adding the omit behavior + +See also [Behaviors](/docs/fundamentals/behaviors). + +## Next steps + +- [Behaviors](/docs/fundamentals/behaviors) +- [Specimen graphs](/docs/fundamentals/specimen-graphs) + +## API + +- [`ThrowingRecursionBehavior`](/api/autofixture/5-0-0-rc-1/autofixture.throwingrecursionbehavior) +- [`OmitOnRecursionBehavior`](/api/autofixture/5-0-0-rc-1/autofixture.omitonrecursionbehavior) diff --git a/site/content/docs/3.how-to/3.register-freeze-inject.md b/site/content/docs/3.how-to/3.register-freeze-inject.md new file mode 100644 index 0000000..79cf4e2 --- /dev/null +++ b/site/content/docs/3.how-to/3.register-freeze-inject.md @@ -0,0 +1,56 @@ +--- +title: Register, Freeze, and Inject +description: Three ways to supply known instances or factories to a fixture. +--- + +Use **Inject** when you already have the object. Use **Freeze** when AutoFixture should create it once and reuse it. Use **Register** when you control how each request is built. + +## Example scenario + +You are testing code that resolves the same `ClientDto` from multiple places in an object graph. You need one shared instance — or a factory that always returns a known string. + +## Example + +**Register** — factory for a type: + +```csharp +var fixture = new Fixture(); +fixture.Register(() => "registered"); + +Assert.Equal("registered", fixture.Create()); +``` + +**Freeze** — one shared instance: + +```csharp +var frozen = fixture.Freeze(); + +var resolved = fixture.Create(); + +Assert.Same(frozen, resolved); +``` + +**Inject** — exact instance: + +```csharp +var injected = new ClientDto { Name = "injected", Age = 1 }; +fixture.Inject(injected); + +Assert.Same(injected, fixture.Create()); +``` + +## How it works + +- `Register(Func)` — replaces how `T` is created on every request +- `Freeze()` — creates `T` once, then injects that instance so later requests on this fixture reuse it +- `Inject(T)` — supplies a specific instance for all later requests of that type on this fixture + +See [Customizations](/docs/fundamentals/customizations). + +## Next steps + +- [Customizations](/docs/fundamentals/customizations) +- [AutoMoq](/docs/integrations/automoq) +- [AutoNSubstitute](/docs/integrations/autonsubstitute) +- [AutoFakeItEasy](/docs/integrations/autofakeiteasy) +- [FAQ](/docs/reference/faq) diff --git a/site/content/docs/3.how-to/4.data-annotations.md b/site/content/docs/3.how-to/4.data-annotations.md new file mode 100644 index 0000000..356d0ec --- /dev/null +++ b/site/content/docs/3.how-to/4.data-annotations.md @@ -0,0 +1,38 @@ +--- +title: Data annotations +description: AutoFixture honors System.ComponentModel.DataAnnotations constraints when generating strings. +--- + +When properties use validation attributes, generators respect them. + +## Example scenario + +`ValidatedProfile` has `[Required]` and `[StringLength]` constraints on its properties. Your test needs specimens that satisfy those rules so validation logic is not the thing being tested. + +## Example + +```csharp +var fixture = new Fixture(); + +var profile = fixture.Create(); + +Assert.False(string.IsNullOrEmpty(profile.Name)); +Assert.InRange(profile.Code.Length, 1, ValidatedProfile.CodeMaxLength); +``` + +## How it works + +Supported attributes include `[Required]`, `[StringLength]`, `[Range]`, and others handled by AutoFixture's data annotation relays. + +Generated values stay within declared constraints so tests focus on behavior, not invalid input. + +## Next steps + +- [Fixture and Create](/docs/fundamentals/fixture-and-create) +- [Build DSL](/docs/fundamentals/build-dsl) +- [Collections](/docs/how-to/collections) +- [Cheat sheet](/docs/reference/cheat-sheet) + +## API + +- [DataAnnotations namespace](/api/autofixture/5-0-0-rc-1/autofixture.dataannotations) diff --git a/site/content/docs/4.extensions/.navigation.yml b/site/content/docs/4.extensions/.navigation.yml new file mode 100644 index 0000000..116c5d6 --- /dev/null +++ b/site/content/docs/4.extensions/.navigation.yml @@ -0,0 +1,2 @@ +title: Extensions +icon: i-lucide-puzzle diff --git a/site/content/docs/4.extensions/1.idioms.md b/site/content/docs/4.extensions/1.idioms.md new file mode 100644 index 0000000..2bf7307 --- /dev/null +++ b/site/content/docs/4.extensions/1.idioms.md @@ -0,0 +1,193 @@ +--- +title: Idioms +description: Use AutoFixture.Idioms to verify guard clauses and other coding idioms in your API. +--- + +The **AutoFixture.Idioms** package provides assertions that use AutoFixture to exercise constructors, methods, and properties — so you do not write the same boilerplate tests by hand. + +## Prerequisites + +- .NET 8+ test project +- [AutoFixture](/docs/get-started/installation) 5.0.0-rc.1 + +## Install + +```xml + +``` + +## Example scenario + +You are hardening a public API. You want to verify guard clauses, constructor initialization, writable properties, and equality comparers without one repetitive test per member. + +## Guard clauses + +[`GuardClauseAssertion`](/api/idioms/5-0-0-rc-1/autofixture.idioms.guardclauseassertion) invokes members with null and invalid inputs and checks that the right exceptions are thrown. + +Constructor: + +```csharp +var fixture = new Fixture(); +var assertion = new GuardClauseAssertion(fixture); +var constructor = typeof(GuardedOrderProcessor).GetConstructors().Single(); + +var exception = Record.Exception(() => assertion.Verify(constructor)); + +Assert.Null(exception); +``` + +Method: + +```csharp +var method = typeof(GuardedOrderProcessor).GetMethod(nameof(GuardedOrderProcessor.Process)); + +var exception = Record.Exception(() => assertion.Verify(method!)); + +Assert.Null(exception); +``` + +Sweep a whole type: + +```csharp +var exception = Record.Exception(() => assertion.Verify(typeof(GuardedOrderProcessor))); + +Assert.Null(exception); +``` + +Pass an `Assembly`, `Type`, or individual `ConstructorInfo` / `MethodInfo` / `PropertyInfo` to `Verify` depending on how much of the surface you want to check. + +## Constructor-initialized members + +[`ConstructorInitializedMemberAssertion`](/api/idioms/5-0-0-rc-1/autofixture.idioms.constructorinitializedmemberassertion) checks that a read-only property or field holds the value passed to the matching constructor parameter: + +```csharp +var fixture = new Fixture(); +var assertion = new ConstructorInitializedMemberAssertion(fixture); +var store = typeof(GuardedOrderProcessor).GetProperty(nameof(GuardedOrderProcessor.Store)); + +var exception = Record.Exception(() => assertion.Verify(store!)); + +Assert.Null(exception); +``` + +## Writable properties + +[`WritablePropertyAssertion`](/api/idioms/5-0-0-rc-1/autofixture.idioms.writablepropertyassertion) assigns a value through the setter and checks that the getter returns the same value: + +```csharp +var fixture = new Fixture(); +var assertion = new WritablePropertyAssertion(fixture); +var name = typeof(Person).GetProperty(nameof(Person.Name)); + +var exception = Record.Exception(() => assertion.Verify(name!)); + +Assert.Null(exception); +``` + +Read-only properties are skipped automatically. + +## Equality comparers + +[`EqualityComparerAssertion`](/api/idioms/5-0-0-rc-1/autofixture.idioms.equalitycomparerassertion) exercises `IEqualityComparer` implementations for null handling, symmetry, transitivity, and consistent `GetHashCode`: + +```csharp +var fixture = new Fixture(); +var assertion = new EqualityComparerAssertion(fixture); + +var exception = Record.Exception(() => assertion.Verify(typeof(ProductCodeComparer))); + +Assert.Null(exception); +``` + +## Composite assertions + +[`CompositeIdiomaticAssertion`](/api/idioms/5-0-0-rc-1/autofixture.idioms.compositeidiomaticassertion) runs several `IIdiomaticAssertion` instances against the same target. [`EqualityComparerAssertion`](/api/idioms/5-0-0-rc-1/autofixture.idioms.equalitycomparerassertion) is itself a composite of the individual equality-comparer checks. + +Combine built-in assertions for a type: + +```csharp +var fixture = new Fixture(); +var assertion = new CompositeIdiomaticAssertion( + new GuardClauseAssertion(fixture), + new ConstructorInitializedMemberAssertion(fixture)); + +var exception = Record.Exception(() => assertion.Verify(typeof(GuardedOrderProcessor))); + +Assert.Null(exception); +``` + +Each child assertion receives the same `Verify` call — constructor, method, property, type, or assembly. + +## Custom assertions + +Implement [`IIdiomaticAssertion`](/api/idioms/5-0-0-rc-1/autofixture.idioms.iidiomaticassertion) directly, or subclass [`IdiomaticAssertion`](/api/idioms/5-0-0-rc-1/autofixture.idioms.idiomaticassertion) and override the `Verify` overloads you need. The base class walks assemblies, types, and members for you. + +This example encodes a team rule — exactly one public constructor, and AutoFixture must be able to construct the type: + +```csharp +using System.Reflection; +using AutoFixture.Kernel; +using AutoFixture.Idioms; + +public sealed class SinglePublicConstructorAssertion(ISpecimenBuilder builder) : IdiomaticAssertion +{ + public ISpecimenBuilder Builder { get; } = builder ?? throw new ArgumentNullException(nameof(builder)); + + public override void Verify(Type type) + { + if (type is null) + throw new ArgumentNullException(nameof(type)); + + var constructors = type.GetConstructors(); + if (constructors.Length != 1) + { + throw new InvalidOperationException( + $"Type '{type.FullName}' must expose exactly one public constructor, but found {constructors.Length}."); + } + + _ = new SpecimenContext(Builder).Resolve(type); + } +} +``` + +Use it like any built-in assertion: + +```csharp +var fixture = new Fixture(); +var assertion = new SinglePublicConstructorAssertion(fixture); + +var exception = Record.Exception(() => assertion.Verify(typeof(GuardedOrderProcessor))); + +Assert.Null(exception); +``` + +Add your custom assertion to a [`CompositeIdiomaticAssertion`](/api/idioms/5-0-0-rc-1/autofixture.idioms.compositeidiomaticassertion) when you want it in a standard API sweep. + +## How it works + +- **`GuardClauseAssertion`** — null/invalid inputs on constructors and methods must throw +- **`ConstructorInitializedMemberAssertion`** — constructor parameters flow into matching members +- **`WritablePropertyAssertion`** — setter/getter round-trip for writable properties +- **`EqualityComparerAssertion`** — composite checks for custom `IEqualityComparer` types +- **`CompositeIdiomaticAssertion`** — runs multiple assertions against the same reflection target +- **Custom `IdiomaticAssertion`** — override selected `Verify` overloads for team-specific rules +- **`Verify(...)` overloads** — target a single member, a type, or an entire assembly + +All assertions take an `ISpecimenBuilder` (usually `new Fixture()`) to create the arguments and owners they need. + +## Next steps + +- [Advanced overview](/docs/advanced/overview) +- [Customizations](/docs/fundamentals/customizations) +- [Seed extensions](/docs/extensions/seed-extensions) + +## API + +- [AutoFixture.Idioms package](/api/idioms/5-0-0-rc-1) +- [`GuardClauseAssertion`](/api/idioms/5-0-0-rc-1/autofixture.idioms.guardclauseassertion) +- [`ConstructorInitializedMemberAssertion`](/api/idioms/5-0-0-rc-1/autofixture.idioms.constructorinitializedmemberassertion) +- [`WritablePropertyAssertion`](/api/idioms/5-0-0-rc-1/autofixture.idioms.writablepropertyassertion) +- [`EqualityComparerAssertion`](/api/idioms/5-0-0-rc-1/autofixture.idioms.equalitycomparerassertion) +- [`CompositeIdiomaticAssertion`](/api/idioms/5-0-0-rc-1/autofixture.idioms.compositeidiomaticassertion) +- [`IIdiomaticAssertion`](/api/idioms/5-0-0-rc-1/autofixture.idioms.iidiomaticassertion) +- [`IdiomaticAssertion`](/api/idioms/5-0-0-rc-1/autofixture.idioms.idiomaticassertion) diff --git a/site/content/docs/4.extensions/2.seed-extensions.md b/site/content/docs/4.extensions/2.seed-extensions.md new file mode 100644 index 0000000..ccd54c3 --- /dev/null +++ b/site/content/docs/4.extensions/2.seed-extensions.md @@ -0,0 +1,102 @@ +--- +title: Seed extensions +description: Influence generated values with seeded Create, CreateMany, and Freeze overloads from AutoFixture.SeedExtensions. +--- + +The **AutoFixture.SeedExtensions** package adds seed-aware `Create`, `CreateMany`, and `Freeze` overloads. Seeds are generic (`Create(T seed)`), not string-only — string seeds are the most common case because AutoFixture turns them into readable prefixes by default. + +## Prerequisites + +- .NET 8+ test project +- [AutoFixture](/docs/get-started/installation) 5.0.0-rc.1 + +## Install + +```xml + +``` + +## Example scenario + +You are testing code that displays generated labels. Random strings are hard to read in failure output — you want values that start with a known prefix but stay anonymous. Or you customize numeric creation with `FromSeed` and need to pass an explicit seed into `Create`. + +## Create with a seed + +```csharp +var fixture = new Fixture(); + +var result = fixture.Create("SeedPrefix"); + +Assert.StartsWith("SeedPrefix", result); +``` + +## CreateMany with a seed + +Without a count, AutoFixture uses [`RepeatCount`](/api/autofixture/5-0-0-rc-1/autofixture.fixture#repeatcount): + +```csharp +var results = fixture.CreateMany("Item").ToList(); + +Assert.Equal(fixture.RepeatCount, results.Count); +Assert.All(results, item => Assert.StartsWith("Item", item)); +``` + +Pass an explicit count when you need a fixed length: + +```csharp +var results = fixture.CreateMany("Item", 3).ToList(); + +Assert.Equal(3, results.Count); +Assert.All(results, item => Assert.StartsWith("Item", item)); +``` + +## Freeze with a seed + +`Freeze(seed)` creates a seeded value and freezes it so later requests for that type reuse the same instance: + +```csharp +var frozen = fixture.Freeze("Frozen"); + +var again = fixture.Create("Something else"); + +Assert.Equal(frozen, again); +``` + +The seed shapes the first value. After that, Freeze pins that instance — a different seed on a later `Create` does not create a new string. To inject a known value without seeding, use [`Inject`](/docs/how-to/register-freeze-inject) instead. + +## Seeds beyond strings + +With [Customizations](/docs/fundamentals/customizations) `FromSeed`, an explicit seed drives non-string types too: + +```csharp +fixture.Customize(composer => composer.FromSeed(seed => seed * 10)); + +var value = fixture.Create(5); + +Assert.Equal(50, value); +``` + +Bare `Create()` still uses `default(int)` as the seed (`0`). Seeded overloads only matter when generators honor the seed — by default that is mainly strings; for other types you customize with `FromSeed`. + +## How it works + +- **`Create(seed)`** — one specimen, potentially influenced by the seed +- **`CreateMany(seed)`** — seeded sequence of length `RepeatCount` +- **`CreateMany(seed, count)`** — seeded sequence of fixed length +- **`Freeze(seed)`** — create from seed, then reuse that instance +- Seeds are `T` values; string seeds become readable prefixes by default + +See also [Customizations](/docs/fundamentals/customizations) for `FromSeed` and [Register, Freeze, and Inject](/docs/how-to/register-freeze-inject) for unseeded Freeze/Inject. + +## Next steps + +- [Collections](/docs/how-to/collections) +- [Customizations](/docs/fundamentals/customizations) +- [Register, Freeze, and Inject](/docs/how-to/register-freeze-inject) +- [Idioms](/docs/extensions/idioms) + +## API + +- [AutoFixture.SeedExtensions package](/api/seedextensions/5-0-0-rc-1) +- [`CreateSeedExtensions`](/api/seedextensions/5-0-0-rc-1/autofixture.createseedextensions) +- [`FreezeSeedExtensions`](/api/seedextensions/5-0-0-rc-1/autofixture.freezeseedextensions) diff --git a/site/content/docs/5.integrations/.navigation.yml b/site/content/docs/5.integrations/.navigation.yml new file mode 100644 index 0000000..1b57262 --- /dev/null +++ b/site/content/docs/5.integrations/.navigation.yml @@ -0,0 +1,2 @@ +title: Integrations +icon: i-lucide-plug diff --git a/site/content/docs/5.integrations/0.overview.md b/site/content/docs/5.integrations/0.overview.md new file mode 100644 index 0000000..e6a0cc7 --- /dev/null +++ b/site/content/docs/5.integrations/0.overview.md @@ -0,0 +1,31 @@ +--- +title: Overview +description: Third-party test frameworks and libraries that AutoFixture integrates with on v5. +--- + +AutoFixture ships extension packages that connect to tools you already use in .NET test projects. Each guide below covers the third-party library, what AutoFixture adds, and how to install both sides. + +Pick the test framework you use, then add a mocking library if your tests need substitutes for interfaces or abstract types. + +## Test frameworks + +These libraries run your tests. AutoFixture extensions add `[AutoData]`, `[InlineAutoData]`, and related attributes so method parameters become anonymous specimens. + +- [xUnit.net 3](/docs/integrations/xunit3) +- [NUnit 4](/docs/integrations/nunit4) + +## Mocking libraries + +These libraries create test doubles. AutoFixture extensions register them as residue collectors so interfaces and abstract dependencies resolve to mocks, fakes, or substitutes when AutoFixture builds object graphs. + +- [Moq](/docs/integrations/automoq) +- [NSubstitute](/docs/integrations/autonsubstitute) +- [FakeItEasy](/docs/integrations/autofakeiteasy) + +## Related + +- [Custom AutoData attribute](/docs/integrations/xunit3#custom-autodata-attribute) — share fixture setup (for example AutoMoq) across xUnit.net 3 theories +- [NUnit 4 custom attributes](/docs/integrations/nunit4#custom-autodata-attribute) — the same pattern for NUnit 4 tests +- [AutoFixture integration packages](/docs/reference/packages) — NuGet packages that wrap the libraries above +- [v4 to v5 migration](/docs/reference/v4-to-v5-migration) — map older xUnit.net and NUnit integration packages to v5 +- [FAQ](/docs/reference/faq) — interfaces, Freeze, AutoData, and other common failures diff --git a/site/content/docs/5.integrations/1.xunit3.md b/site/content/docs/5.integrations/1.xunit3.md new file mode 100644 index 0000000..fff24cf --- /dev/null +++ b/site/content/docs/5.integrations/1.xunit3.md @@ -0,0 +1,281 @@ +--- +title: xUnit.net 3 +description: Use AutoData, InlineAutoData, and parameter attributes with xUnit.net 3 test projects. +--- + +`[AutoData]` turns test method parameters into anonymous specimens so you skip manual arrange setup. + +## Prerequisites + +- .NET 8+ test project +- [AutoFixture](/docs/get-started/installation) 5.0.0-rc.1 +- xUnit.net 3 + +## Install + +```xml + + + +``` + +Pin matching versions of **AutoFixture** and **AutoFixture.Xunit3** in the same project. + +## Example scenario + +You are testing `MyClass.Echo`, which returns its input. The test needs an integer and a `MyClass` instance — but the exact values do not matter. Later tests freeze collaborators, pick constructors, or share fixture setup across theories. + +## AutoData + +```csharp +[Theory, AutoData] +public void AutoData_ProvidesTestParameters(int expectedNumber, MyClass sut) +{ + var result = sut.Echo(expectedNumber); + + Assert.Equal(expectedNumber, result); +} +``` + +## InlineAutoData + +Mix explicit values with generated ones. Explicit arguments fill parameters left-to-right; AutoFixture generates the rest: + +```csharp +[Theory] +[InlineAutoData("alpha")] +[InlineAutoData("alpha", "beta")] +public void InlineAutoData_MixesExplicitAndGeneratedValues(string first, string second) +{ + Assert.Equal("alpha", first); + Assert.False(string.IsNullOrEmpty(second)); +} +``` + +## Parameter attributes + +Apply attributes on theory parameters to customize how that parameter (and later parameters) are created. + +### Frozen + +Without `[Frozen]`, each parameter of the same type gets its own anonymous instance. [`[Frozen]`](/api/xunit3/5-0-0-rc-1/autofixture.xunit3.frozenattribute) tells AutoFixture: create this parameter once, then reuse that same instance for later requests of a matching type. + +```csharp +[Theory, AutoData] +public void Frozen_SharesSameInstance([Frozen] string first, string second) +{ + Assert.Equal(first, second); +} +``` + +Only parameters that come **after** the frozen one reuse it. Earlier parameters of the same type stay independent. + +### Frozen with Matching + +By default, freeze matches the **exact type** only (`Matching.ExactType`). A frozen `InMemoryOrderRepository` would not satisfy an `IOrderRepository` constructor parameter. + +Use [`Matching`](/api/xunit3/5-0-0-rc-1/autofixture.xunit3.matching) to widen what the frozen value can satisfy: + +```csharp +[Theory, AutoData] +public void Frozen_ByImplementedInterfaces_InjectsConcreteIntoInterface( + [Frozen(Matching.ImplementedInterfaces)] InMemoryOrderRepository repository, + OrderService sut, + Order order) +{ + sut.PlaceOrder(order); + + Assert.Contains(order, repository.Saved); +} +``` + +`OrderService` needs `IOrderRepository`. With `Matching.ImplementedInterfaces`, the frozen concrete repository is also used wherever that interface is requested — so `sut` and `repository` share one instance and you can assert on `repository.Saved`. + +| Flag | Matches requests for… | +| --- | --- | +| `ExactType` | The same type as the parameter (default) | +| `DirectBaseType` | The parameter's immediate base type | +| `ImplementedInterfaces` | Interfaces the parameter type implements | +| `ParameterName` | A constructor/method parameter with the same name | +| `PropertyName` | A property with the same name | +| `FieldName` | A field with the same name | +| `MemberName` | Parameter, property, or field with the same name | + +Combine flags with `|`, for example `Matching.ExactType | Matching.ImplementedInterfaces`. + +### Modest and Greedy + +When a type has several constructors, AutoFixture must pick one. For `MultiCtorProduct` that means: parameterless, name-only, or name + price. + +- **`[Modest]`** — prefer the constructor with the **fewest** parameters (most modest). Here that is the parameterless constructor, so you get the hard-coded defaults `"default"` / `0m`. +- **`[Greedy]`** — prefer the constructor with the **most** parameters (greediest). Here that is `(string name, decimal price)`, so AutoFixture generates anonymous values for both. + +```csharp +[Theory, AutoData] +public void ModestAttribute_UsesParameterlessConstructor([Modest] MultiCtorProduct product) +{ + Assert.Equal("default", product.Name); + Assert.Equal(0m, product.Price); +} + +[Theory, AutoData] +public void GreedyAttribute_UsesFullestConstructor([Greedy] MultiCtorProduct product) +{ + Assert.False(string.IsNullOrEmpty(product.Name)); + Assert.NotEqual(0m, product.Price); +} +``` + +You can combine attributes on one parameter, for example `[Frozen][Greedy]`. See also [Behaviors](/docs/fundamentals/behaviors). + +### NoAutoProperties + +By default, after construction AutoFixture assigns anonymous values to writable public properties. [`[NoAutoProperties]`](/api/xunit3/5-0-0-rc-1/autofixture.xunit3.noautopropertiesattribute) turns that off for the parameter's type — the instance is created, but properties keep their type defaults (here `string.Empty` for `Name`). + +```csharp +[Theory, AutoData] +public void NoAutoProperties_LeavesWritablePropertiesUnset([NoAutoProperties] Person person) +{ + Assert.Equal(string.Empty, person.Name); +} +``` + +### FavorArrays, FavorLists, and FavorEnumerables + +Like Modest/Greedy, these change **which constructor** is chosen when a type overloads constructors that take different collection shapes: + +- **`[FavorArrays]`** — prefer a constructor that takes an array (`T[]`) +- **`[FavorLists]`** — prefer a constructor that takes `IList` +- **`[FavorEnumerables]`** — prefer a constructor that takes `IEnumerable` + +Use them when the type exposes several collection constructors and the default choice is not the one your test needs. + +### Custom parameter attribute + +Subclass [`CustomizeAttribute`](/api/xunit3/5-0-0-rc-1/autofixture.xunit3.customizeattribute) and return an `ICustomization` from `GetCustomization`. AutoFixture applies it when resolving that parameter: + +```csharp +using System.Reflection; +using AutoFixture; +using AutoFixture.Xunit3; + +public sealed class NamedAttribute(string name) : CustomizeAttribute +{ + public override ICustomization GetCustomization(ParameterInfo parameter) + { + ArgumentNullException.ThrowIfNull(parameter); + + return new NamedCustomization(name); + } + + private sealed class NamedCustomization(string value) : ICustomization + { + public void Customize(IFixture fixture) => fixture.Inject(value); + } +} + +[Theory, AutoData] +public void CustomParameterAttribute_InjectsConfiguredValue([Named("widget")] string name) +{ + Assert.Equal("widget", name); +} +``` + +`[Named("widget")]` injects the fixed string `"widget"` for that parameter instead of an anonymous value. Use custom attributes for team-specific rules that do not already exist as built-ins. Combine with `[Frozen]` when later parameters should reuse the same value. + +## Custom AutoData attribute + +When tests need the same fixture setup (for example AutoMoq), define a custom attribute instead of repeating `Customize` in every test. + +Add [AutoMoq](/docs/integrations/automoq) when the factory uses `AutoMoqCustomization`. + +```csharp +public class AutoMoqDataAttribute : AutoDataAttribute +{ + public AutoMoqDataAttribute() + : base(() => new Fixture().Customize(new AutoMoqCustomization())) + { + } +} + +[Theory, AutoMoqData] +public void CustomAutoData_UsesFixtureFactory(OrderService service, Order order) +{ + Assert.NotNull(service); + + var exception = Record.Exception(() => service.PlaceOrder(order)); + + Assert.Null(exception); +} +``` + +Subclass `AutoDataAttribute` and pass a factory `Func` to the base constructor. The factory runs once per test case and supplies the configured fixture; parameters are resolved from that fixture. + +## Custom InlineAutoData attribute + +Subclass [`InlineAutoDataAttribute`](/api/xunit3/5-0-0-rc-1/autofixture.xunit3.inlineautodataattribute) the same way — pass a fixture factory plus the inline values: + +```csharp +public class InlineAutoMoqDataAttribute : InlineAutoDataAttribute +{ + public InlineAutoMoqDataAttribute(params object[] values) + : base(() => new Fixture().Customize(new AutoMoqCustomization()), values) + { + } +} + +[Theory] +[InlineAutoMoqData(42)] +public void CustomInlineAutoData_MixesExplicitValuesWithCustomFixture( + int orderId, + OrderService service, + string productName) +{ + Assert.Equal(42, orderId); + Assert.NotNull(service); + Assert.False(string.IsNullOrEmpty(productName)); + + var exception = Record.Exception(() => + service.PlaceOrder(new Order(orderId, productName))); + + Assert.Null(exception); +} +``` + +Explicit values still fill parameters left-to-right; AutoFixture fills the rest from the customized fixture. + +## How it works + +- **`[AutoData]`** — xUnit creates test cases with anonymous parameters +- **`[InlineAutoData(...)]`** — explicit inline values fill parameters left-to-right; AutoFixture generates the rest +- **`[Frozen]` / `[Frozen(Matching...)]`** — create once; reuse for later matching requests (exact type, interfaces, names, …) +- **`[Modest]` / `[Greedy]`** — fewest vs most constructor parameters +- **`[NoAutoProperties]`** — construct without filling writable properties +- **`[FavorArrays]` / `[FavorLists]` / `[FavorEnumerables]`** — prefer constructors that take that collection shape +- **Custom `CustomizeAttribute`** — return an `ICustomization` for that parameter +- Subclass `AutoDataAttribute` or `InlineAutoDataAttribute` to share fixture setup across theories + +## Next steps + +- [Integrations overview](/docs/integrations) +- [NUnit 4](/docs/integrations/nunit4) +- [AutoMoq](/docs/integrations/automoq) +- [Behaviors](/docs/fundamentals/behaviors) +- [Register, Freeze, and Inject](/docs/how-to/register-freeze-inject) +- [Previous versions](/docs/reference/previous-versions) +- [FAQ](/docs/reference/faq) + +## API + +- [AutoFixture.Xunit3 package](/api/xunit3/5-0-0-rc-1) +- [`AutoDataAttribute`](/api/xunit3/5-0-0-rc-1/autofixture.xunit3.autodataattribute) +- [`InlineAutoDataAttribute`](/api/xunit3/5-0-0-rc-1/autofixture.xunit3.inlineautodataattribute) +- [`FrozenAttribute`](/api/xunit3/5-0-0-rc-1/autofixture.xunit3.frozenattribute) +- [`Matching`](/api/xunit3/5-0-0-rc-1/autofixture.xunit3.matching) +- [`ModestAttribute`](/api/xunit3/5-0-0-rc-1/autofixture.xunit3.modestattribute) +- [`GreedyAttribute`](/api/xunit3/5-0-0-rc-1/autofixture.xunit3.greedyattribute) +- [`NoAutoPropertiesAttribute`](/api/xunit3/5-0-0-rc-1/autofixture.xunit3.noautopropertiesattribute) +- [`FavorArraysAttribute`](/api/xunit3/5-0-0-rc-1/autofixture.xunit3.favorarraysattribute) +- [`FavorListsAttribute`](/api/xunit3/5-0-0-rc-1/autofixture.xunit3.favorlistsattribute) +- [`FavorEnumerablesAttribute`](/api/xunit3/5-0-0-rc-1/autofixture.xunit3.favorenumerablesattribute) +- [`CustomizeAttribute`](/api/xunit3/5-0-0-rc-1/autofixture.xunit3.customizeattribute) diff --git a/site/content/docs/5.integrations/2.automoq.md b/site/content/docs/5.integrations/2.automoq.md new file mode 100644 index 0000000..381a91c --- /dev/null +++ b/site/content/docs/5.integrations/2.automoq.md @@ -0,0 +1,219 @@ +--- +title: AutoMoq +description: Moq integration — let AutoFixture create Moq mocks for interfaces and abstract types automatically. +--- + +AutoMoq turns interface and abstract dependencies into Moq mocks when AutoFixture builds object graphs. + +## Prerequisites + +- .NET 8+ test project +- [AutoFixture](/docs/get-started/installation) 5.0.0-rc.1 +- Moq + +## Install + +Install **AutoFixture.AutoMoq** and add an explicit **Moq** package reference in the same test project. + +AutoMoq depends on Moq, but that dependency version stays intentionally low so AutoMoq remains compatible with a wide range of Moq releases. If you rely only on the transitive Moq reference, you may get an older Moq without the latest features and fixes. Reference the **latest Moq** yourself alongside AutoMoq. + +```xml + + + +``` + +Pin **matching versions** of AutoFixture and AutoFixture.AutoMoq. Do not mix v4 and v5 AutoFixture packages in the same project. Keep your explicit Moq reference on the newest available version when you update packages. + +## Example scenario + +You are testing `OrderService`, which depends on `IOrderRepository`. The test should verify that placing an order calls `Save` on the repository — without hand-writing a mock setup for every test. Other tests need mock methods to return fixture values, or Moq-backed delegates. + +## Basic usage + +```csharp +var fixture = new Fixture().Customize(new AutoMoqCustomization()); +var repository = fixture.Freeze>(); + +var service = fixture.Create(); + +var order = fixture.Create(); +service.PlaceOrder(order); + +repository.Verify(r => r.Save(order), Times.Once); +``` + +`Create()` injects a mock `IOrderRepository`. `Freeze>()` keeps one mock instance so you can verify calls. + +Combine with [xUnit.net 3](/docs/integrations/xunit3) via a [custom AutoData attribute](/docs/integrations/xunit3#custom-autodata-attribute) when tests use `[AutoData]`. + +## Mock wrappers and interface requests + +AutoMoq registers builders for both `Mock` and the mocked type `T` (interfaces and abstract classes). Prefer freezing the mock when you need `Setup` / `Verify`: + +```csharp +var fixture = new Fixture().Customize(new AutoMoqCustomization()); +var repository = fixture.Freeze>(); + +var service = fixture.Create(); +``` + +Freezing the interface works too — the relay returns `mock.Object`, and you can recover the mock with `Mock.Get`: + +```csharp +var fixture = new Fixture().Customize(new AutoMoqCustomization()); +var repository = fixture.Freeze(); + +var service = fixture.Create(); +var order = fixture.Create(); +service.PlaceOrder(order); + +Mock.Get(repository).Verify(r => r.Save(order), Times.Once); +``` + +`Create>()` builds a configured `Mock` when you want the wrapper without freezing. + +## Configuration options + +[`AutoMoqCustomization`](/api/automoq/5-0-0-rc-1/autofixture.automoq.automoqcustomization) exposes properties you set before calling `Customize`. Defaults are all off / default relay: + +| Property | Default | Effect | +| --- | --- | --- | +| `ConfigureMembers` | `false` | When `true`, mock members return values from the fixture | +| `GenerateDelegates` | `false` | When `true`, Moq creates delegates (`Func`, `Action`, …) | +| `Relay` | `MockRelay` | Residue collector that turns interface/abstract requests into mocks | + +```csharp +var fixture = new Fixture().Customize(new AutoMoqCustomization +{ + ConfigureMembers = true, + GenerateDelegates = true +}); +``` + +### ConfigureMembers + +With the default (`ConfigureMembers = false`), Moq uses its usual loose defaults — methods return `default` unless you set them up: + +```csharp +public interface IGreeter +{ + string Greet(); +} +``` + +```csharp +var fixture = new Fixture().Customize(new AutoMoqCustomization()); + +var greeter = fixture.Create(); + +Assert.Null(greeter.Greet()); +``` + +With `ConfigureMembers = true`, AutoFixture sets up mock members so calls return specimens from the fixture (and stubs overridable properties like real properties): + +```csharp +var fixture = new Fixture().Customize(new AutoMoqCustomization +{ + ConfigureMembers = true +}); +var order = fixture.Freeze(); + +var repository = fixture.Create(); + +Assert.Same(order, repository.GetById(1)); +``` + +Use `ConfigureMembers` when the SUT reads from collaborators and you want anonymous return values without writing `Setup` for every member. Prefer the default when you only care about verifying calls (as in the basic `Verify` example). + +The older `AutoConfiguredMoqCustomization` type is obsolete — use `new AutoMoqCustomization { ConfigureMembers = true }` instead. + +`ConfigureMembers` does **not** set up every member. AutoMoq skips: + +- Generic methods (Moq cannot anticipate type arguments) +- Methods with `ref` parameters +- Sealed methods +- Void methods without `out` parameters + +For those cases, set up the mock yourself — for example with [`ReturnsUsingFixture`](#returnsusingfixture). + +### ReturnsUsingFixture + +[`ReturnsUsingFixture`](/api/automoq/5-0-0-rc-1/autofixture.automoq.mocktype) is a Moq `Setup` extension that returns the next specimen of the member's return type from the fixture. Use it for members `ConfigureMembers` cannot cover (especially generics): + +```csharp +public interface IConverter +{ + T Convert(string value); +} +``` + +```csharp +var fixture = new Fixture().Customize(new AutoMoqCustomization()); +var converter = fixture.Freeze>(); +var expected = fixture.Freeze(); + +converter.Setup(c => c.Convert("10.0")).ReturnsUsingFixture(fixture); + +Assert.Equal(expected, converter.Object.Convert("10.0")); +``` + +### GenerateDelegates + +By default, AutoFixture's own kernel creates delegates. With `GenerateDelegates = true`, Moq creates them instead — useful when you want mockable or auto-configured delegates: + +```csharp +var fixture = new Fixture().Customize(new AutoMoqCustomization +{ + GenerateDelegates = true, + ConfigureMembers = true +}); +var expected = fixture.Freeze(); + +var format = fixture.Create>(); + +Assert.Equal(expected, format(42)); +``` + +Without `ConfigureMembers`, the Moq delegate still exists but return values stay at Moq defaults unless you set them up. + +### Relay + +`Relay` is the specimen builder added to `fixture.ResidueCollectors`. The default [`MockRelay`](/api/automoq/5-0-0-rc-1/autofixture.automoq.mockrelay) answers requests for interfaces and abstract types with Moq mocks. + +Most tests leave the default. Replace it only when you need a custom residue collector — for example a `MockRelay` with a different request specification: + +```csharp +var fixture = new Fixture().Customize(new AutoMoqCustomization +{ + Relay = new MockRelay(new ExactTypeSpecification(typeof(IOrderRepository))) +}); +``` + +That example would mock only `IOrderRepository` requests that match the specification you supply; other abstractions follow the rest of the fixture pipeline. + +## How it works + +- **`AutoMoqCustomization`** — registers Moq mock creation and a residue collector for abstractions +- **`ConfigureMembers`** — auto-setup mock members from the fixture (with known gaps — see above) +- **`ReturnsUsingFixture`** — manual Moq setup that pulls return values from the fixture +- **`GenerateDelegates`** — create delegates with Moq instead of the AutoFixture kernel +- **`Relay`** — residue collector (default `MockRelay`) for interface/abstract requests +- **`Freeze>()` / `Freeze()`** — one shared mock (or `mock.Object`) for setup and verification + +## Next steps + +- [Integrations overview](/docs/integrations) +- [AutoMoq](/docs/integrations/automoq) +- [AutoNSubstitute](/docs/integrations/autonsubstitute) +- [AutoFakeItEasy](/docs/integrations/autofakeiteasy) +- [Custom AutoData attribute](/docs/integrations/xunit3#custom-autodata-attribute) +- [Register, Freeze, and Inject](/docs/how-to/register-freeze-inject) +- [FAQ](/docs/reference/faq) + +## API + +- [AutoFixture.AutoMoq package](/api/automoq/5-0-0-rc-1) +- [`AutoMoqCustomization`](/api/automoq/5-0-0-rc-1/autofixture.automoq.automoqcustomization) +- [`MockRelay`](/api/automoq/5-0-0-rc-1/autofixture.automoq.mockrelay) +- [`MockType.ReturnsUsingFixture`](/api/automoq/5-0-0-rc-1/autofixture.automoq.mocktype) diff --git a/site/content/docs/5.integrations/4.nunit4.md b/site/content/docs/5.integrations/4.nunit4.md new file mode 100644 index 0000000..bfddca4 --- /dev/null +++ b/site/content/docs/5.integrations/4.nunit4.md @@ -0,0 +1,278 @@ +--- +title: NUnit 4 +description: Use AutoData, InlineAutoData, and parameter attributes with NUnit 4 test projects. +--- + +`[AutoData]` turns test method parameters into anonymous specimens so you skip manual arrange setup. Works like [xUnit.net 3](/docs/integrations/xunit3), but uses NUnit's `[Test]` attribute. + +## Prerequisites + +- .NET 8+ test project +- [AutoFixture](/docs/get-started/installation) 5.0.0-rc.1 +- NUnit 4 + +## Install + +```xml + + + +``` + +Pin matching versions of **AutoFixture** and **AutoFixture.NUnit4** in the same project. + +## Example scenario + +You are testing `MyClass.Echo` with NUnit. The test needs an integer and a `MyClass` instance without manual arrange code. Later tests freeze collaborators, pick constructors, or share fixture setup across tests. + +## AutoData + +```csharp +[Test, AutoData] +public void AutoData_ProvidesTestParameters(int expectedNumber, MyClass sut) +{ + var result = sut.Echo(expectedNumber); + + Assert.That(result, Is.EqualTo(expectedNumber)); +} +``` + +## InlineAutoData + +Mix explicit values with generated ones. Explicit arguments fill parameters left-to-right; AutoFixture generates the rest. Apply one or more `[InlineAutoData]` attributes on a `[Test]` method: + +```csharp +[Test] +[InlineAutoData("alpha")] +[InlineAutoData("alpha", "beta")] +public void InlineAutoData_MixesExplicitAndGeneratedValues(string first, string second) +{ + Assert.That(first, Is.EqualTo("alpha")); + Assert.That(second, Is.Not.Null.And.Not.Empty); +} +``` + +## Parameter attributes + +Apply attributes on test parameters to customize how that parameter (and later parameters) are created. + +### Frozen + +Without `[Frozen]`, each parameter of the same type gets its own anonymous instance. [`[Frozen]`](/api/nunit4/5-0-0-rc-1/autofixture.nunit4.frozenattribute) tells AutoFixture: create this parameter once, then reuse that same instance for later requests of a matching type. + +```csharp +[Test, AutoData] +public void Frozen_SharesSameInstance([Frozen] string first, string second) +{ + Assert.That(second, Is.EqualTo(first)); +} +``` + +Only parameters that come **after** the frozen one reuse it. Earlier parameters of the same type stay independent. + +### Frozen with Matching + +By default, freeze matches the **exact type** only (`Matching.ExactType`). A frozen `InMemoryOrderRepository` would not satisfy an `IOrderRepository` constructor parameter. + +Use [`Matching`](/api/nunit4/5-0-0-rc-1/autofixture.nunit4.matching) to widen what the frozen value can satisfy: + +```csharp +[Test, AutoData] +public void Frozen_ByImplementedInterfaces_InjectsConcreteIntoInterface( + [Frozen(Matching.ImplementedInterfaces)] InMemoryOrderRepository repository, + OrderService sut, + Order order) +{ + sut.PlaceOrder(order); + + Assert.That(repository.Saved, Does.Contain(order)); +} +``` + +`OrderService` needs `IOrderRepository`. With `Matching.ImplementedInterfaces`, the frozen concrete repository is also used wherever that interface is requested — so `sut` and `repository` share one instance and you can assert on `repository.Saved`. + +| Flag | Matches requests for… | +| --- | --- | +| `ExactType` | The same type as the parameter (default) | +| `DirectBaseType` | The parameter's immediate base type | +| `ImplementedInterfaces` | Interfaces the parameter type implements | +| `ParameterName` | A constructor/method parameter with the same name | +| `PropertyName` | A property with the same name | +| `FieldName` | A field with the same name | +| `MemberName` | Parameter, property, or field with the same name | + +Combine flags with `|`, for example `Matching.ExactType | Matching.ImplementedInterfaces`. + +### Modest and Greedy + +When a type has several constructors, AutoFixture must pick one. For `MultiCtorProduct` that means: parameterless, name-only, or name + price. + +- **`[Modest]`** — prefer the constructor with the **fewest** parameters (most modest). Here that is the parameterless constructor, so you get the hard-coded defaults `"default"` / `0m`. +- **`[Greedy]`** — prefer the constructor with the **most** parameters (greediest). Here that is `(string name, decimal price)`, so AutoFixture generates anonymous values for both. + +```csharp +[Test, AutoData] +public void ModestAttribute_UsesParameterlessConstructor([Modest] MultiCtorProduct product) +{ + Assert.That(product.Name, Is.EqualTo("default")); + Assert.That(product.Price, Is.EqualTo(0m)); +} + +[Test, AutoData] +public void GreedyAttribute_UsesFullestConstructor([Greedy] MultiCtorProduct product) +{ + Assert.That(product.Name, Is.Not.Null.And.Not.Empty); + Assert.That(product.Price, Is.Not.EqualTo(0m)); +} +``` + +You can combine attributes on one parameter, for example `[Frozen][Greedy]`. See also [Behaviors](/docs/fundamentals/behaviors). + +### NoAutoProperties + +By default, after construction AutoFixture assigns anonymous values to writable public properties. [`[NoAutoProperties]`](/api/nunit4/5-0-0-rc-1/autofixture.nunit4.noautopropertiesattribute) turns that off for the parameter's type — the instance is created, but properties keep their type defaults (here `string.Empty` for `Name`). + +```csharp +[Test, AutoData] +public void NoAutoProperties_LeavesWritablePropertiesUnset([NoAutoProperties] Person person) +{ + Assert.That(person.Name, Is.EqualTo(string.Empty)); +} +``` + +### FavorArrays, FavorLists, and FavorEnumerables + +Like Modest/Greedy, these change **which constructor** is chosen when a type overloads constructors that take different collection shapes: + +- **`[FavorArrays]`** — prefer a constructor that takes an array (`T[]`) +- **`[FavorLists]`** — prefer a constructor that takes `IList` +- **`[FavorEnumerables]`** — prefer a constructor that takes `IEnumerable` + +Use them when the type exposes several collection constructors and the default choice is not the one your test needs. + +### Custom parameter attribute + +Subclass [`CustomizeAttribute`](/api/nunit4/5-0-0-rc-1/autofixture.nunit4.customizeattribute) and return an `ICustomization` from `GetCustomization`. AutoFixture applies it when resolving that parameter: + +```csharp +using System.Reflection; +using AutoFixture; +using AutoFixture.NUnit4; + +public sealed class NamedAttribute(string name) : CustomizeAttribute +{ + public override ICustomization GetCustomization(ParameterInfo parameter) + { + ArgumentNullException.ThrowIfNull(parameter); + + return new NamedCustomization(name); + } + + private sealed class NamedCustomization(string value) : ICustomization + { + public void Customize(IFixture fixture) => fixture.Inject(value); + } +} + +[Test, AutoData] +public void CustomParameterAttribute_InjectsConfiguredValue([Named("widget")] string name) +{ + Assert.That(name, Is.EqualTo("widget")); +} +``` + +`[Named("widget")]` injects the fixed string `"widget"` for that parameter instead of an anonymous value. Use custom attributes for team-specific rules that do not already exist as built-ins. Combine with `[Frozen]` when later parameters should reuse the same value. + +## Custom AutoData attribute + +When tests need the same fixture setup (for example AutoMoq), define a custom attribute instead of repeating `Customize` in every test. + +Add [AutoMoq](/docs/integrations/automoq) when the factory uses `AutoMoqCustomization`. + +```csharp +public class AutoMoqDataAttribute : AutoDataAttribute +{ + public AutoMoqDataAttribute() + : base(() => new Fixture().Customize(new AutoMoqCustomization())) + { + } +} + +[Test, AutoMoqData] +public void CustomAutoData_UsesFixtureFactory(OrderService service, Order order) +{ + Assert.That(service, Is.Not.Null); + + Assert.That(() => service.PlaceOrder(order), Throws.Nothing); +} +``` + +Subclass `AutoDataAttribute` and pass a factory `Func` to the base constructor. The factory runs once per test case and supplies the configured fixture; parameters are resolved from that fixture. + +## Custom InlineAutoData attribute + +Subclass [`InlineAutoDataAttribute`](/api/nunit4/5-0-0-rc-1/autofixture.nunit4.inlineautodataattribute) the same way — pass a fixture factory plus the inline values: + +```csharp +public class InlineAutoMoqDataAttribute : InlineAutoDataAttribute +{ + public InlineAutoMoqDataAttribute(params object[] values) + : base(() => new Fixture().Customize(new AutoMoqCustomization()), values) + { + } +} + +[Test] +[InlineAutoMoqData(42)] +public void CustomInlineAutoData_MixesExplicitValuesWithCustomFixture( + int orderId, + OrderService service, + string productName) +{ + Assert.That(orderId, Is.EqualTo(42)); + Assert.That(service, Is.Not.Null); + Assert.That(productName, Is.Not.Null.And.Not.Empty); + + Assert.That(() => service.PlaceOrder(new Order(orderId, productName)), Throws.Nothing); +} +``` + +Explicit values still fill parameters left-to-right; AutoFixture fills the rest from the customized fixture. + +## How it works + +- **`[AutoData]`** — NUnit `[Test]` methods get anonymous parameters from AutoFixture +- **`[InlineAutoData(...)]`** — explicit inline values fill parameters left-to-right; AutoFixture generates the rest +- **`[Frozen]` / `[Frozen(Matching...)]`** — create once; reuse for later matching requests (exact type, interfaces, names, …) +- **`[Modest]` / `[Greedy]`** — fewest vs most constructor parameters +- **`[NoAutoProperties]`** — construct without filling writable properties +- **`[FavorArrays]` / `[FavorLists]` / `[FavorEnumerables]`** — prefer constructors that take that collection shape +- **Custom `CustomizeAttribute`** — return an `ICustomization` for that parameter +- Subclass `AutoDataAttribute` or `InlineAutoDataAttribute` to share fixture setup across tests + +Migrating from NUnit 3? See [Previous versions](/docs/reference/previous-versions). + +## Next steps + +- [Integrations overview](/docs/integrations) +- [AutoMoq](/docs/integrations/automoq) +- [Behaviors](/docs/fundamentals/behaviors) +- [Register, Freeze, and Inject](/docs/how-to/register-freeze-inject) +- [xUnit.net 3](/docs/integrations/xunit3) +- [Previous versions](/docs/reference/previous-versions) +- [FAQ](/docs/reference/faq) + +## API + +- [AutoFixture.NUnit4 package](/api/nunit4/5-0-0-rc-1) +- [`AutoDataAttribute`](/api/nunit4/5-0-0-rc-1/autofixture.nunit4.autodataattribute) +- [`InlineAutoDataAttribute`](/api/nunit4/5-0-0-rc-1/autofixture.nunit4.inlineautodataattribute) +- [`FrozenAttribute`](/api/nunit4/5-0-0-rc-1/autofixture.nunit4.frozenattribute) +- [`Matching`](/api/nunit4/5-0-0-rc-1/autofixture.nunit4.matching) +- [`ModestAttribute`](/api/nunit4/5-0-0-rc-1/autofixture.nunit4.modestattribute) +- [`GreedyAttribute`](/api/nunit4/5-0-0-rc-1/autofixture.nunit4.greedyattribute) +- [`NoAutoPropertiesAttribute`](/api/nunit4/5-0-0-rc-1/autofixture.nunit4.noautopropertiesattribute) +- [`FavorArraysAttribute`](/api/nunit4/5-0-0-rc-1/autofixture.nunit4.favorarraysattribute) +- [`FavorListsAttribute`](/api/nunit4/5-0-0-rc-1/autofixture.nunit4.favorlistsattribute) +- [`FavorEnumerablesAttribute`](/api/nunit4/5-0-0-rc-1/autofixture.nunit4.favorenumerablesattribute) +- [`CustomizeAttribute`](/api/nunit4/5-0-0-rc-1/autofixture.nunit4.customizeattribute) diff --git a/site/content/docs/5.integrations/6.autonsubstitute.md b/site/content/docs/5.integrations/6.autonsubstitute.md new file mode 100644 index 0000000..eb9a4bb --- /dev/null +++ b/site/content/docs/5.integrations/6.autonsubstitute.md @@ -0,0 +1,205 @@ +--- +title: AutoNSubstitute +description: NSubstitute integration — create substitutes automatically with AutoNSubstituteCustomization. +--- + +AutoNSubstitute turns interface and abstract dependencies into NSubstitute substitutes when AutoFixture builds object graphs. + +## Prerequisites + +- .NET 8+ test project +- [AutoFixture](/docs/get-started/installation) 5.0.0-rc.1 +- NSubstitute + +## Install + +Install **AutoFixture.AutoNSubstitute** and add an explicit **NSubstitute** package reference in the same test project. + +Pin **matching versions** of AutoFixture and AutoFixture.AutoNSubstitute. Reference the **latest NSubstitute** yourself when you update packages. + +```xml + + + +``` + +## Example scenario + +You are testing `OrderService` with an `IOrderRepository` dependency. You want NSubstitute to create the substitute and verify `Save` was called. Other tests need substitute methods to return fixture values, or NSubstitute-backed delegates. + +## Basic usage + +```csharp +var fixture = new Fixture().Customize(new AutoNSubstituteCustomization()); +var repository = fixture.Freeze(); + +var service = fixture.Create(); +var order = fixture.Create(); + +service.PlaceOrder(order); + +repository.Received(1).Save(order); +``` + +`Create()` injects a substitute `IOrderRepository`. `Freeze()` keeps one substitute so you can assert with `Received`. + +NSubstitute has no separate wrapper type like Moq's `Mock`. Freeze or create the interface (or abstract type) directly — the specimen *is* the substitute. + +Combine with [xUnit.net 3](/docs/integrations/xunit3) via a [custom AutoData attribute](/docs/integrations/xunit3#custom-autodata-attribute) when tests use `[AutoData]`. + +## SubstituteAttribute + +[`[Substitute]`](/api/autonsubstitute/5-0-0-rc-1/autofixture.autonsubstitute.substituteattribute) marks an AutoData parameter, property, or field so AutoFixture creates an NSubstitute substitute of that type — even when the type is a concrete class AutoFixture would otherwise construct. + +Use a custom AutoData attribute that applies `AutoNSubstituteCustomization`: + +```csharp +public class AutoNSubstituteDataAttribute : AutoDataAttribute +{ + public AutoNSubstituteDataAttribute() + : base(() => new Fixture().Customize(new AutoNSubstituteCustomization())) + { + } +} +``` + +```csharp +public class Calculator +{ + public virtual int Add(int a, int b) => a + b; +} +``` + +```csharp +[Theory, AutoNSubstituteData] +public void SubstituteAttribute_CreatesSubstituteForConcreteParameter( + [Substitute] Calculator calculator) +{ + calculator.Add(1, 2).Returns(42); + + Assert.Equal(42, calculator.Add(1, 2)); +} +``` + +Without `[Substitute]`, AutoFixture builds a real `Calculator` and `.Returns` does not apply. Interfaces and abstract types already become substitutes through the residue collector, so the attribute is most useful for concrete types with virtual members. + +## Configuration options + +[`AutoNSubstituteCustomization`](/api/autonsubstitute/5-0-0-rc-1/autofixture.autonsubstitute.autonsubstitutecustomization) exposes properties you set before calling `Customize`. Defaults are all off / default relay: + +| Property | Default | Effect | +| --- | --- | --- | +| `ConfigureMembers` | `false` | When `true`, substitute members return values from the fixture | +| `GenerateDelegates` | `false` | When `true`, NSubstitute creates delegates (`Func`, `Action`, …) | +| `Relay` | `SubstituteRelay` | Residue collector that turns interface/abstract requests into substitutes | + +```csharp +var fixture = new Fixture().Customize(new AutoNSubstituteCustomization +{ + ConfigureMembers = true, + GenerateDelegates = true +}); +``` + +### ConfigureMembers + +With the default (`ConfigureMembers = false`), NSubstitute uses its usual defaults — methods return type defaults unless you configure them: + +```csharp +public interface IGreeter +{ + string Greet(); +} +``` + +```csharp +var fixture = new Fixture().Customize(new AutoNSubstituteCustomization()); + +var greeter = fixture.Create(); + +Assert.Equal(string.Empty, greeter.Greet()); +``` + +With `ConfigureMembers = true`, AutoFixture configures substitute members so calls return specimens from the fixture: + +```csharp +var fixture = new Fixture().Customize(new AutoNSubstituteCustomization +{ + ConfigureMembers = true +}); +var order = fixture.Freeze(); + +var repository = fixture.Create(); + +Assert.Same(order, repository.GetById(1)); +``` + +Use `ConfigureMembers` when the SUT reads from collaborators and you want anonymous return values without configuring every member. Prefer the default when you only care about verifying calls (as in the basic `Received` example). + +The older `AutoConfiguredNSubstituteCustomization` type is obsolete — use `new AutoNSubstituteCustomization { ConfigureMembers = true }` instead. + +`ConfigureMembers` covers most virtual members, including generics. It does **not** configure: + +- Methods inherited from `object` (`Equals`, `GetHashCode`, `ToString`) — NSubstitute limitation +- Members that are not overridable (sealed / non-virtual on concrete types) + +Repeated calls with the same arguments return the same specimen by default. Configure those members with NSubstitute when you need different behavior. + +### GenerateDelegates + +By default, AutoFixture's own kernel creates delegates. With `GenerateDelegates = true`, NSubstitute creates them instead — useful when you want substitute or auto-configured delegates: + +```csharp +var fixture = new Fixture().Customize(new AutoNSubstituteCustomization +{ + GenerateDelegates = true, + ConfigureMembers = true +}); +var expected = fixture.Freeze(); + +var format = fixture.Create>(); + +Assert.Equal(expected, format(42)); +``` + +Without `ConfigureMembers`, the NSubstitute delegate still exists but return values stay at NSubstitute defaults unless you configure them. + +### Relay + +`Relay` is the specimen builder added to `fixture.ResidueCollectors`. The default [`SubstituteRelay`](/api/autonsubstitute/5-0-0-rc-1/autofixture.autonsubstitute.substituterelay) answers requests for interfaces and abstract types with NSubstitute substitutes. + +Most tests leave the default. Replace it only when you need a custom residue collector — for example a `SubstituteRelay` with a different request specification: + +```csharp +var fixture = new Fixture().Customize(new AutoNSubstituteCustomization +{ + Relay = new SubstituteRelay(new ExactTypeSpecification(typeof(IOrderRepository))) +}); +``` + +That example would substitute only `IOrderRepository` requests that match the specification you supply; other abstractions follow the rest of the fixture pipeline. + +## How it works + +- **`AutoNSubstituteCustomization`** — registers NSubstitute substitute creation and a residue collector for abstractions +- **`[Substitute]`** — force a substitute for an AutoData parameter/property/field +- **`ConfigureMembers`** — auto-configure substitute members from the fixture (with known gaps — see above) +- **`GenerateDelegates`** — create delegates with NSubstitute instead of the AutoFixture kernel +- **`Relay`** — residue collector (default `SubstituteRelay`) for interface/abstract requests +- **`Freeze()`** — one shared substitute for setup and verification + +## Next steps + +- [Integrations overview](/docs/integrations) +- [AutoMoq](/docs/integrations/automoq) +- [AutoFakeItEasy](/docs/integrations/autofakeiteasy) +- [Custom AutoData attribute](/docs/integrations/xunit3#custom-autodata-attribute) +- [Register, Freeze, and Inject](/docs/how-to/register-freeze-inject) +- [FAQ](/docs/reference/faq) + +## API + +- [AutoFixture.AutoNSubstitute package](/api/autonsubstitute/5-0-0-rc-1) +- [`AutoNSubstituteCustomization`](/api/autonsubstitute/5-0-0-rc-1/autofixture.autonsubstitute.autonsubstitutecustomization) +- [`SubstituteRelay`](/api/autonsubstitute/5-0-0-rc-1/autofixture.autonsubstitute.substituterelay) +- [`SubstituteAttribute`](/api/autonsubstitute/5-0-0-rc-1/autofixture.autonsubstitute.substituteattribute) diff --git a/site/content/docs/5.integrations/9.autofakeiteasy.md b/site/content/docs/5.integrations/9.autofakeiteasy.md new file mode 100644 index 0000000..1f67926 --- /dev/null +++ b/site/content/docs/5.integrations/9.autofakeiteasy.md @@ -0,0 +1,190 @@ +--- +title: AutoFakeItEasy +description: FakeItEasy integration — use fakes with AutoFixture.AutoFakeItEasy on v5. +--- + +AutoFakeItEasy turns interface and abstract dependencies into FakeItEasy fakes when AutoFixture builds object graphs. + +## Prerequisites + +- .NET 8+ test project +- [AutoFixture](/docs/get-started/installation) 5.0.0-rc.1 +- FakeItEasy + +## Install + +Install **AutoFixture.AutoFakeItEasy** and add an explicit **FakeItEasy** package reference in the same test project. + +Pin **matching versions** of AutoFixture and AutoFixture.AutoFakeItEasy. Reference the **latest FakeItEasy** yourself when you update packages. + +```xml + + + +``` + +## Example scenario + +You are testing `OrderService` with FakeItEasy. You need a fake `IOrderRepository` injected into the service and want to assert `Save` was called. Other tests need fake methods to return fixture values, or FakeItEasy-backed delegates. + +## Basic usage + +```csharp +var fixture = new Fixture().Customize(new AutoFakeItEasyCustomization()); +var repository = fixture.Freeze(); + +var service = fixture.Create(); +var order = fixture.Create(); + +service.PlaceOrder(order); + +A.CallTo(() => repository.Save(order)).MustHaveHappenedOnceExactly(); +``` + +`Create()` injects a fake `IOrderRepository`. `Freeze()` keeps one fake so you can assert with `A.CallTo`. + +Combine with [xUnit.net 3](/docs/integrations/xunit3) via a [custom AutoData attribute](/docs/integrations/xunit3#custom-autodata-attribute) when tests use `[AutoData]`. + +## Fake wrappers and interface requests + +AutoFakeItEasy registers builders for both `Fake` and the faked type `T` (interfaces and abstract classes). Freezing the interface is usually enough for `A.CallTo`: + +```csharp +var fixture = new Fixture().Customize(new AutoFakeItEasyCustomization()); +var repository = fixture.Freeze(); + +var service = fixture.Create(); +``` + +Freeze or create `Fake` when you need the FakeItEasy wrapper (for example `FakedObject` or rules on the fake): + +```csharp +var fixture = new Fixture().Customize(new AutoFakeItEasyCustomization()); +var repository = fixture.Freeze>(); + +var service = fixture.Create(); +var order = fixture.Create(); +service.PlaceOrder(order); + +A.CallTo(() => repository.FakedObject.Save(order)).MustHaveHappenedOnceExactly(); +``` + +`Create>()` builds a configured `Fake` when you want the wrapper without freezing. + +## Configuration options + +[`AutoFakeItEasyCustomization`](/api/autofakeiteasy/5-0-0-rc-1/autofixture.autofakeiteasy.autofakeiteasycustomization) exposes properties you set before calling `Customize`. Defaults are all off / default relay: + +| Property | Default | Effect | +| --- | --- | --- | +| `ConfigureMembers` | `false` | When `true`, fake members return values from the fixture | +| `GenerateDelegates` | `false` | When `true`, FakeItEasy creates delegates (`Func`, `Action`, …) | +| `Relay` | `FakeItEasyRelay` | Residue collector that turns interface/abstract requests into fakes | + +```csharp +var fixture = new Fixture().Customize(new AutoFakeItEasyCustomization +{ + ConfigureMembers = true, + GenerateDelegates = true +}); +``` + +### ConfigureMembers + +With the default (`ConfigureMembers = false`), FakeItEasy uses its usual defaults — methods return type defaults unless you configure them: + +```csharp +public interface IGreeter +{ + string Greet(); +} +``` + +```csharp +var fixture = new Fixture().Customize(new AutoFakeItEasyCustomization()); + +var greeter = fixture.Create(); + +Assert.Equal(string.Empty, greeter.Greet()); +``` + +With `ConfigureMembers = true`, AutoFixture configures fake members so calls return specimens from the fixture: + +```csharp +var fixture = new Fixture().Customize(new AutoFakeItEasyCustomization +{ + ConfigureMembers = true +}); +var order = fixture.Freeze(); + +var repository = fixture.Create(); + +Assert.Same(order, repository.GetById(1)); +``` + +Use `ConfigureMembers` when the SUT reads from collaborators and you want anonymous return values without configuring every member. Prefer the default when you only care about verifying calls (as in the basic `A.CallTo` example). + +`ConfigureMembers` sets up virtual members (including `out` / `ref` where FakeItEasy allows it) and can assign sealed members from the fixture. It does **not** configure: + +- Non-virtual instance members that FakeItEasy cannot intercept +- Static members +- Members that are not overridable in a way FakeItEasy can fake + +Configure those members with FakeItEasy when you need explicit return values. + +### GenerateDelegates + +By default, AutoFixture's own kernel creates delegates. With `GenerateDelegates = true`, FakeItEasy creates them instead — useful when you want fake or auto-configured delegates: + +```csharp +var fixture = new Fixture().Customize(new AutoFakeItEasyCustomization +{ + GenerateDelegates = true, + ConfigureMembers = true +}); +var expected = fixture.Freeze(); + +var format = fixture.Create>(); + +Assert.Equal(expected, format(42)); +``` + +Without `ConfigureMembers`, the FakeItEasy delegate still exists but return values stay at FakeItEasy defaults unless you configure them. + +### Relay + +`Relay` is the specimen builder added to `fixture.ResidueCollectors`. The default `FakeItEasyRelay` answers requests for interfaces and abstract types with FakeItEasy fakes. + +Most tests leave the default. Replace it only when you need a custom residue collector — for example a `FakeItEasyRelay` with a different request specification: + +```csharp +var fixture = new Fixture().Customize(new AutoFakeItEasyCustomization +{ + Relay = new FakeItEasyRelay(new ExactTypeSpecification(typeof(IOrderRepository))) +}); +``` + +That example would fake only `IOrderRepository` requests that match the specification you supply; other abstractions follow the rest of the fixture pipeline. + +## How it works + +- **`AutoFakeItEasyCustomization`** — registers FakeItEasy fake creation and a residue collector for abstractions +- **`ConfigureMembers`** — auto-configure fake members from the fixture (with known gaps — see above) +- **`GenerateDelegates`** — create delegates with FakeItEasy instead of the AutoFixture kernel +- **`Relay`** — residue collector (default `FakeItEasyRelay`) for interface/abstract requests +- **`Freeze()` / `Freeze>()`** — one shared fake (or FakeItEasy wrapper) for setup and verification + +## Next steps + +- [Integrations overview](/docs/integrations) +- [AutoMoq](/docs/integrations/automoq) +- [AutoNSubstitute](/docs/integrations/autonsubstitute) +- [Custom AutoData attribute](/docs/integrations/xunit3#custom-autodata-attribute) +- [Register, Freeze, and Inject](/docs/how-to/register-freeze-inject) +- [FAQ](/docs/reference/faq) + +## API + +- [AutoFixture.AutoFakeItEasy package](/api/autofakeiteasy/5-0-0-rc-1) +- [`AutoFakeItEasyCustomization`](/api/autofakeiteasy/5-0-0-rc-1/autofixture.autofakeiteasy.autofakeiteasycustomization) +- [`FakeItEasyRelay`](/api/autofakeiteasy/5-0-0-rc-1/autofixture.autofakeiteasy.fakeiteasyrelay) diff --git a/site/content/docs/6.advanced/.navigation.yml b/site/content/docs/6.advanced/.navigation.yml new file mode 100644 index 0000000..33d0e96 --- /dev/null +++ b/site/content/docs/6.advanced/.navigation.yml @@ -0,0 +1,2 @@ +title: Advanced +icon: i-lucide-cog diff --git a/site/content/docs/6.advanced/0.overview.md b/site/content/docs/6.advanced/0.overview.md new file mode 100644 index 0000000..a73af93 --- /dev/null +++ b/site/content/docs/6.advanced/0.overview.md @@ -0,0 +1,18 @@ +--- +title: Overview +description: How AutoFixture resolves Create requests through the kernel — pipeline, builders, and request specifications. +--- + +Most tests only need [Fixture and Create](/docs/fundamentals/fixture-and-create), [Build DSL](/docs/fundamentals/build-dsl), and [Customizations](/docs/fundamentals/customizations). The articles here explain **how that works inside** `Fixture` — useful when you extend AutoFixture, debug unexpected specimens, or wire custom `ISpecimenBuilder` nodes. + +## In this section + +1. [Specimen pipeline](/docs/advanced/specimen-pipeline) — behaviors, customizations, engine, and residue collectors +2. [Specimen builders and specifications](/docs/advanced/specimen-builders-and-specifications) — `ISpecimenBuilder`, `IRequestSpecification`, and graph composition + +## Related + +- [Specimen graphs](/docs/fundamentals/specimen-graphs) — nested **objects** produced by `Create()` (not the kernel graph) +- [Customizations catalog](/docs/fundamentals/customizations-catalog) — reusable `ICustomization` types +- [Idioms](/docs/extensions/idioms) — guard-clause and idiom assertions +- [Seed extensions](/docs/extensions/seed-extensions) — seeded `Create` / `CreateMany` / `Freeze` diff --git a/site/content/docs/6.advanced/1.specimen-pipeline.md b/site/content/docs/6.advanced/1.specimen-pipeline.md new file mode 100644 index 0000000..fa36f6c --- /dev/null +++ b/site/content/docs/6.advanced/1.specimen-pipeline.md @@ -0,0 +1,208 @@ +--- +title: Specimen pipeline +description: How Fixture resolves Create requests through behaviors, customizations, the engine, and residue collectors. +--- + +AutoFixture is built around an extensible **kernel**. Most tests use the `Fixture` class — a façade over that kernel — to create anonymous values (specimens). The kernel lives in the `AutoFixture.Kernel` namespace; everyday tests usually only need `AutoFixture`. + +## Fixture layout + +`Fixture` packages kernel components in a fixed order. When you call `Create()`, the request flows through these layers: + +Fixture pipeline: behaviors wrap customizations, engine, and residue collectors + +| Layer | Role | +| --- | --- | +| **Behaviors** | Decorators that wrap the whole pipeline — for example recursion guarding and tracing | +| **Customizations** | Your `ISpecimenBuilder` nodes; first match wins, before the default engine | +| **Engine** | Built-in specimen builders for primitives, collections, reflection-based construction, and auto-properties | +| **Residue collectors** | Fallback builders for requests the engine cannot satisfy — for example interfaces (AutoMoq mocks them here) | + +A default `Fixture` starts with an empty `Customizations` collection. The middle **engine** block is wired in the constructor and handles well-known types such as `int` and `string`, plus complex types via reflection. + +### Customizations + +Add `ISpecimenBuilder` instances to `Customizations` to intercept requests before the engine runs. The first builder that returns a specimen wins; the rest are skipped. + +**Register** — replace creation for a type: + +```csharp +var fixture = new Fixture(); +fixture.Register(() => new ClientDto { Name = "registered", Age = 30 }); + +var client = fixture.Create(); + +Assert.Equal("registered", client.Name); +``` + +**Customize** — adjust how a type is built on every `Create()`: + +```csharp +var fixture = new Fixture(); +fixture.Customize(composer => composer.With(dto => dto.Age, 21)); + +var client = fixture.Create(); + +Assert.Equal(21, client.Age); +``` + +Both `Register` and `Customize` append builders to `fixture.Customizations`. For reusable setup across tests, implement [ICustomization](/docs/fundamentals/customizations-catalog) and call `fixture.Customize(new MyCustomization())`. + +**Add a specimen builder manually** — implement `ISpecimenBuilder` and append it when `Register` or `Customize` are not enough: + +```csharp +var fixture = new Fixture(); +fixture.Customizations.Add(new FixedIntBuilder()); + +var value = fixture.Create(); + +Assert.Equal(42, value); + +public sealed class FixedIntBuilder : ISpecimenBuilder +{ + public object Create(object request, ISpecimenContext context) + { + if (request is not Type type || type != typeof(int)) + { + return NoSpecimen.Instance; + } + + return 42; + } +} +``` + +Return `NoSpecimen.Instance` when your builder does not handle the request — the pipeline continues to the next builder. Any other return value (including `null`) satisfies the request. + +See [Customizations](/docs/fundamentals/customizations) for `FromFactory`, `Without`, and other composer methods. For specification-gated builders, see [Specimen builders and specifications](/docs/advanced/specimen-builders-and-specifications). + +### Residue collectors + +Some requests cannot be satisfied by the engine alone — for example an interface type has no public constructor. After the engine declines, builders in `ResidueCollectors` get a chance to handle those leftovers before AutoFixture throws. + +**Add a residue collector manually** — same `ISpecimenBuilder` contract, but registered on `ResidueCollectors` so it runs only after the engine: + +```csharp +var fixture = new Fixture(); +fixture.ResidueCollectors.Add(new InMemoryOrderRepositoryBuilder()); + +var repository = fixture.Create(); + +Assert.IsType(repository); + +public sealed class InMemoryOrderRepositoryBuilder : ISpecimenBuilder +{ + public object Create(object request, ISpecimenContext context) + { + if (request is not Type type || type != typeof(IOrderRepository)) + { + return NoSpecimen.Instance; + } + + return new InMemoryOrderRepository(); + } +} +``` + +Residue collectors suit abstractions the engine cannot construct — interfaces, abstract classes, delegates. [AutoMoq](/docs/integrations/automoq) adds one that returns Moq mocks; you can add your own test doubles the same way. + +### Behaviors + +A behavior is a decorator around the entire pipeline. It can observe or change requests and specimens going in and out. Recursion policies such as `ThrowingRecursionBehavior` and `OmitOnRecursionBehavior` are behaviors. + +By default, circular graphs throw. Swap the throwing behavior for one that omits recursive properties: + +```csharp +var fixture = new Fixture(); + +fixture.Behaviors + .OfType() + .ToList() + .ForEach(b => fixture.Behaviors.Remove(b)); +fixture.Behaviors.Add(new OmitOnRecursionBehavior()); + +var node = fixture.Create(); + +Assert.NotNull(node); +``` + +Remove the default behavior before adding a replacement — behaviors stack as decorators, and the throwing policy runs first unless you remove it. + +See [Behaviors](/docs/fundamentals/behaviors) and [Circular references](/docs/how-to/circular-refs) for more policies and xUnit.net 3 attributes. + +## How a request is resolved + +The kernel uses a **chain of responsibility**: many `ISpecimenBuilder` nodes in sequence; the first one that produces a specimen satisfies the request. + +### Requests + +Every creation starts with `ISpecimenBuilder.Create`: + +```csharp +public interface ISpecimenBuilder +{ + object Create(object request, ISpecimenContext context); +} +``` + +A **request** can be any object. In the usual case it is a `Type` — `Create()` eventually requests `typeof(ClientDto)`. Building one object often triggers subsidiary requests for constructor parameters (`ParameterInfo`), properties (`PropertyInfo`), or custom request types. + +### Handling requests + +Builders are typically grouped in a `CompositeSpecimenBuilder`. The composite asks each child in order until one returns a specimen. + +`null` is a valid specimen. To decline a request, a builder must return `NoSpecimen.Instance`: + +```csharp +return NoSpecimen.Instance; +``` + +Any other return value — including `null` — ends the chain and becomes the result. + +### Specimen context + +`Create` also receives an `ISpecimenContext`: + +```csharp +public interface ISpecimenContext +{ + object Resolve(object request); +} +``` + +A builder uses `context.Resolve` to create dependent specimens. For example, a constructor invoker resolves each `ParameterInfo` to get argument values, then invokes the constructor. Each `Resolve` call runs the full chain again for that sub-request — recursively, until the graph is complete. + +### Relays + +A **relay** is an `ISpecimenBuilder` that handles one request by issuing a different request to the context and wrapping the result. `ArrayRelay`, for instance, handles array requests by resolving multiple element specimens and returning an array. Prefer relays over calling `Activator.CreateInstance` directly when extending the kernel. + +## Relating this to your tests + +| What you do | Where it plugs in | +| --- | --- | +| `fixture.Create()` | Enters the pipeline with a type request | +| `fixture.Register(...)` | Adds a customization builder | +| `fixture.Customize(...)` | Adds a typed composer builder to customizations | +| `fixture.Customize(new MyCustomization())` | Applies an [ICustomization](/docs/fundamentals/customizations-catalog) | +| `fixture.Customizations.Add(...)` | Low-level — append any `ISpecimenBuilder` before the engine | +| `fixture.ResidueCollectors.Add(...)` | Low-level — append a fallback builder after the engine | +| `fixture.Behaviors.Add(...)` | Wraps the whole graph | +| AutoMoq customization | Adds builders to customizations and residue collectors for interfaces | +| `fixture.Build()` | One-off pipeline for a single specimen (bypasses fixture customizations) | + +When `Create` fails or behaves unexpectedly, knowing this flow helps: check whether a customization intercepted the request, whether the engine could construct the type, or whether a behavior blocked recursion. + +## Next steps + +- [Overview](/docs/advanced/overview) +- [Specimen builders and specifications](/docs/advanced/specimen-builders-and-specifications) +- [Specimen graphs](/docs/fundamentals/specimen-graphs) +- [Customizations](/docs/fundamentals/customizations) +- [Behaviors](/docs/fundamentals/behaviors) + +## API + +- [`Fixture`](/api/autofixture/5-0-0-rc-1/autofixture.fixture) +- [`ISpecimenBuilder`](/api/autofixture/5-0-0-rc-1/autofixture.kernel.ispecimenbuilder) +- [`ISpecimenContext`](/api/autofixture/5-0-0-rc-1/autofixture.kernel.ispecimencontext) +- [`NoSpecimen`](/api/autofixture/5-0-0-rc-1/autofixture.kernel.nospecimen) diff --git a/site/content/docs/6.advanced/2.specimen-builders-and-specifications.md b/site/content/docs/6.advanced/2.specimen-builders-and-specifications.md new file mode 100644 index 0000000..3abb615 --- /dev/null +++ b/site/content/docs/6.advanced/2.specimen-builders-and-specifications.md @@ -0,0 +1,138 @@ +--- +title: Specimen builders and specifications +description: How ISpecimenBuilder nodes and IRequestSpecification filters compose into AutoFixture's kernel graph. +--- + +AutoFixture resolves every `Create` call through a **graph of specimen builders**. Each node answers one question: *given this request, can I produce a specimen?* + +This article is about that **kernel graph** — builders, specifications, and how they connect. It is not about nested object graphs produced by `Create()`; see [Specimen graphs](/docs/fundamentals/specimen-graphs) for that. + +## What is a specimen builder? + +A **specimen builder** implements `ISpecimenBuilder`: + +```csharp +public interface ISpecimenBuilder +{ + object Create(object request, ISpecimenContext context); +} +``` + +- **Request** — what AutoFixture is trying to create. Often a `Type` (`typeof(ClientDto)`), but also `ParameterInfo`, `PropertyInfo`, or custom objects. +- **Context** — `ISpecimenContext.Resolve` creates dependent specimens (constructor arguments, property values, nested types). +- **Result** — a specimen, or `NoSpecimen.Instance` to decline and let the next builder try. + +Builders form a **chain of responsibility**. `CompositeSpecimenBuilder` runs children in order until one returns a specimen. See [Specimen pipeline](/docs/advanced/specimen-pipeline) for where customizations, the engine, and residue collectors sit in the full layout. + +## The specification pattern + +A **request specification** (`IRequestSpecification`) decides whether a request matches a rule: + +```csharp +public interface IRequestSpecification +{ + bool IsSatisfiedBy(object request); +} +``` + +This is the [Specification pattern](https://en.wikipedia.org/wiki/Specification_pattern) applied to specimen **requests**, not to domain objects. Specifications answer: *should this builder handle this request?* + +AutoFixture ships many built-in specifications, including: + +| Specification | Matches | +| --- | --- | +| [`ExactTypeSpecification`](/api/autofixture/5-0-0-rc-1/autofixture.kernel.exacttypespecification) | A `Type` request equal to a target type | +| [`ParameterSpecification`](/api/autofixture/5-0-0-rc-1/autofixture.kernel.parameterspecification) | A constructor parameter by type and name | +| [`PropertySpecification`](/api/autofixture/5-0-0-rc-1/autofixture.kernel.propertyspecification) | A writable property by type and name | +| [`AbstractTypeSpecification`](/api/autofixture/5-0-0-rc-1/autofixture.kernel.abstracttypespecification) | Interface or abstract class `Type` requests | +| [`AndRequestSpecification`](/api/autofixture/5-0-0-rc-1/autofixture.kernel.andrequestspecification) | All of several specifications | + +You can implement `IRequestSpecification` when built-in filters are not enough. + +## Specifications plus builders as a graph + +Most kernel nodes combine **filter + action**: + +| Node | Role | +| --- | --- | +| [`FilteringSpecimenBuilder`](/api/autofixture/5-0-0-rc-1/autofixture.kernel.filteringspecimenbuilder) | Runs an inner builder only when a specification matches | +| [`CompositeSpecimenBuilder`](/api/autofixture/5-0-0-rc-1/autofixture.kernel.compositespecimenbuilder) | Tries child builders in order | +| [`TypeRelay`](/api/autofixture/5-0-0-rc-1/autofixture.kernel.typerelay) | Maps one `Type` request to another (uses `ExactTypeSpecification` internally) | +| [`FixedBuilder`](/api/autofixture/5-0-0-rc-1/autofixture.kernel.fixedbuilder) | Always returns the same specimen | + +`Fixture` wires these into a deep graph at startup — `CompositeSpecimenBuilder` chains for dictionaries and lists, `TypeRelay` nodes in residue collectors for `IList<>`, `FilteringSpecimenBuilder` nodes for invariant culture, and more. Your `Customizations.Add` calls append nodes to the front of that graph. + +Think of it as a **graph of specification-gated builders**: each edge is *if specification matches, run this builder (which may call `context.Resolve` and trigger more of the graph)*. + +## Example scenario + +You are testing `PricingService`, which depends on `IOrderRepository` and a `currency` string constructor parameter. You want a concrete in-memory repository and a fixed currency code without hand-writing the service in every test. + +## Example + +**Built-in relay** — map interface `Type` requests to a concrete class: + +```csharp +var fixture = new Fixture(); +fixture.Customizations.Add( + new TypeRelay(typeof(IOrderRepository), typeof(InMemoryOrderRepository))); +``` + +**Built-in specification + builder** — pin the `currency` parameter: + +```csharp +fixture.Customizations.Add( + new FilteringSpecimenBuilder( + new FixedBuilder("EUR"), + new ParameterSpecification(typeof(string), "currency"))); +``` + +**Custom specification** — only handle `decimal` property requests named `MinimumOrderAmount`: + +```csharp +fixture.Customizations.Add( + new FilteringSpecimenBuilder( + new FixedBuilder(25m), + new MinimumOrderAmountPropertySpecification())); + +var service = fixture.Create(); + +Assert.IsType(service.Repository); +Assert.Equal("EUR", service.Currency); +Assert.Equal(25m, service.MinimumOrderAmount); + +public sealed class MinimumOrderAmountPropertySpecification : IRequestSpecification +{ + public bool IsSatisfiedBy(object request) + { + return request is PropertyInfo property + && property.PropertyType == typeof(decimal) + && property.Name == nameof(PricingService.MinimumOrderAmount); + } +} +``` + +`TypeRelay` and `FilteringSpecimenBuilder` are composed with built-in specifications. `MinimumOrderAmountPropertySpecification` is custom, but plugs into the same graph shape. + +## How it works + +- Every `Create()` enters the graph with a `Type` request; reflection triggers subsidiary requests for parameters and properties. +- `FilteringSpecimenBuilder` returns `NoSpecimen.Instance` when the specification fails — the composite moves to the next sibling. +- `TypeRelay` does not construct directly; it calls `context.Resolve` for the target type, re-entering the graph. +- Customizations prepend nodes; residue collectors append fallbacks after the engine. Same builder types, different positions. + +Prefer [Register](/docs/fundamentals/customizations), [Customize](/docs/fundamentals/customizations), and [Build DSL](/docs/fundamentals/build-dsl) when they express your rule. Reach for specification-gated builders when you need precise control over **which requests** in the graph are affected. + +## Next steps + +- [Overview](/docs/advanced/overview) +- [Specimen pipeline](/docs/advanced/specimen-pipeline) +- [Customizations](/docs/fundamentals/customizations) + +## API + +- [`ISpecimenBuilder`](/api/autofixture/5-0-0-rc-1/autofixture.kernel.ispecimenbuilder) +- [`IRequestSpecification`](/api/autofixture/5-0-0-rc-1/autofixture.kernel.irequestspecification) +- [`FilteringSpecimenBuilder`](/api/autofixture/5-0-0-rc-1/autofixture.kernel.filteringspecimenbuilder) +- [`TypeRelay`](/api/autofixture/5-0-0-rc-1/autofixture.kernel.typerelay) +- [Kernel namespace](/api/autofixture/5-0-0-rc-1/autofixture.kernel) diff --git a/site/content/docs/7.reference/.navigation.yml b/site/content/docs/7.reference/.navigation.yml new file mode 100644 index 0000000..db3038d --- /dev/null +++ b/site/content/docs/7.reference/.navigation.yml @@ -0,0 +1,2 @@ +title: Reference +icon: i-lucide-library diff --git a/site/content/docs/7.reference/1.packages.md b/site/content/docs/7.reference/1.packages.md new file mode 100644 index 0000000..8a65d13 --- /dev/null +++ b/site/content/docs/7.reference/1.packages.md @@ -0,0 +1,46 @@ +--- +title: NuGet packages +description: AutoFixture packages on NuGet for v5 and v4, with API reference links. +--- + +New projects should use **v5** (`5.0.0-rc.1`). v4 packages remain available for existing codebases. + +## v5 packages + +| Package | NuGet | API | +|---------|-------|-----| +| AutoFixture | [AutoFixture 5.0.0-rc.1](https://www.nuget.org/packages/AutoFixture/5.0.0-rc.1) | [/api/autofixture/5-0-0-rc-1](/api/autofixture/5-0-0-rc-1) | +| AutoFixture.Xunit3 | [AutoFixture.Xunit3 5.0.0-rc.1](https://www.nuget.org/packages/AutoFixture.Xunit3/5.0.0-rc.1) | [/api/xunit3/5-0-0-rc-1](/api/xunit3/5-0-0-rc-1) | +| AutoFixture.NUnit4 | [AutoFixture.NUnit4 5.0.0-rc.1](https://www.nuget.org/packages/AutoFixture.NUnit4/5.0.0-rc.1) | [/api/nunit4/5-0-0-rc-1](/api/nunit4/5-0-0-rc-1) | +| AutoFixture.AutoMoq | [AutoFixture.AutoMoq 5.0.0-rc.1](https://www.nuget.org/packages/AutoFixture.AutoMoq/5.0.0-rc.1) | [/api/automoq/5-0-0-rc-1](/api/automoq/5-0-0-rc-1) | +| AutoFixture.AutoNSubstitute | [AutoFixture.AutoNSubstitute 5.0.0-rc.1](https://www.nuget.org/packages/AutoFixture.AutoNSubstitute/5.0.0-rc.1) | [/api/autonsubstitute/5-0-0-rc-1](/api/autonsubstitute/5-0-0-rc-1) | +| AutoFixture.AutoFakeItEasy | [AutoFixture.AutoFakeItEasy 5.0.0-rc.1](https://www.nuget.org/packages/AutoFixture.AutoFakeItEasy/5.0.0-rc.1) | [/api/autofakeiteasy/5-0-0-rc-1](/api/autofakeiteasy/5-0-0-rc-1) | +| AutoFixture.SeedExtensions | [AutoFixture.SeedExtensions 5.0.0-rc.1](https://www.nuget.org/packages/AutoFixture.SeedExtensions/5.0.0-rc.1) | [/api/seedextensions/5-0-0-rc-1](/api/seedextensions/5-0-0-rc-1) | +| AutoFixture.Idioms | [AutoFixture.Idioms 5.0.0-rc.1](https://www.nuget.org/packages/AutoFixture.Idioms/5.0.0-rc.1) | [/api/idioms/5-0-0-rc-1](/api/idioms/5-0-0-rc-1) | + +## v4 packages + +| Package | NuGet | API | +|---------|-------|-----| +| AutoFixture | [AutoFixture 4.18.1](https://www.nuget.org/packages/AutoFixture/4.18.1) | [/api/autofixture/4-18-1](/api/autofixture/4-18-1) | +| AutoFixture.xUnit | [AutoFixture.xUnit 4.18.1](https://www.nuget.org/packages/AutoFixture.xUnit/4.18.1) | [/api/xunit/4-18-1](/api/xunit/4-18-1) | +| AutoFixture.xUnit2 | [AutoFixture.xUnit2 4.18.1](https://www.nuget.org/packages/AutoFixture.xUnit2/4.18.1) | [/api/xunit2/4-18-1](/api/xunit2/4-18-1) | +| AutoFixture.NUnit2 | [AutoFixture.NUnit2 4.18.1](https://www.nuget.org/packages/AutoFixture.NUnit2/4.18.1) | [/api/nunit2/4-18-1](/api/nunit2/4-18-1) | +| AutoFixture.NUnit3 | [AutoFixture.NUnit3 4.18.1](https://www.nuget.org/packages/AutoFixture.NUnit3/4.18.1) | [/api/nunit3/4-18-1](/api/nunit3/4-18-1) | +| AutoFixture.AutoMoq | [AutoFixture.AutoMoq 4.18.1](https://www.nuget.org/packages/AutoFixture.AutoMoq/4.18.1) | [/api/automoq/4-18-1](/api/automoq/4-18-1) | +| AutoFixture.AutoNSubstitute | [AutoFixture.AutoNSubstitute 4.18.1](https://www.nuget.org/packages/AutoFixture.AutoNSubstitute/4.18.1) | [/api/autonsubstitute/4-18-1](/api/autonsubstitute/4-18-1) | +| AutoFixture.AutoFakeItEasy | [AutoFixture.AutoFakeItEasy 4.18.1](https://www.nuget.org/packages/AutoFixture.AutoFakeItEasy/4.18.1) | [/api/autofakeiteasy/4-18-1](/api/autofakeiteasy/4-18-1) | +| AutoFixture.SeedExtensions | [AutoFixture.SeedExtensions 4.18.1](https://www.nuget.org/packages/AutoFixture.SeedExtensions/4.18.1) | [/api/seedextensions/4-18-1](/api/seedextensions/4-18-1) | +| AutoFixture.Idioms | [AutoFixture.Idioms 4.18.1](https://www.nuget.org/packages/AutoFixture.Idioms/4.18.1) | [/api/idioms/4-18-1](/api/idioms/4-18-1) | +| AutoFixture.Idioms.FsCheck | [AutoFixture.Idioms.FsCheck 4.18.1](https://www.nuget.org/packages/AutoFixture.Idioms.FsCheck/4.18.1) | [/api/idioms-fscheck/4-18-1](/api/idioms-fscheck/4-18-1) | +| AutoFixture.AutoFoq | [AutoFixture.AutoFoq 4.18.1](https://www.nuget.org/packages/AutoFixture.AutoFoq/4.18.1) | [/api/autofoq/4-18-1](/api/autofoq/4-18-1) | +| AutoFixture.AutoRhinoMocks | [AutoFixture.AutoRhinoMocks 4.18.1](https://www.nuget.org/packages/AutoFixture.AutoRhinoMocks/4.18.1) | [/api/autorhinomocks/4-18-1](/api/autorhinomocks/4-18-1) | + +See [v4 to v5 migration](/docs/reference/v4-to-v5-migration) when upgrading. + +## Related + +- [Compatibility](/docs/reference/compatibility) +- [Cheat sheet](/docs/reference/cheat-sheet) +- [FAQ](/docs/reference/faq) +- [API reference](/docs/reference/api-reference) diff --git a/site/content/docs/7.reference/2.api-reference.md b/site/content/docs/7.reference/2.api-reference.md new file mode 100644 index 0000000..8ef1e97 --- /dev/null +++ b/site/content/docs/7.reference/2.api-reference.md @@ -0,0 +1,27 @@ +--- +title: API reference +description: Browse AutoFixture API documentation generated from NuGet assemblies. +--- + +The API reference is generated from published NuGet packages. It covers types, methods, and extension points for each package and version. + +## Browse + +Start at the default v5 AutoFixture package: + +[**AutoFixture 5.0.0-rc.1 API**](/api/autofixture/5-0-0-rc-1) + +Or open [/api](/api) to land on the latest primary package. + +## Package picker + +Use the package and version selectors in the API layout to switch between: + +- Core **AutoFixture** and extension packages (AutoFixture.Xunit3, AutoMoq, Idioms, …) +- **v5** and **v4** versions of the same package id + +## Related + +- [NuGet packages](/docs/reference/packages) +- [Cheat sheet](/docs/reference/cheat-sheet) +- [FAQ](/docs/reference/faq) diff --git a/site/content/docs/7.reference/3.cheat-sheet.md b/site/content/docs/7.reference/3.cheat-sheet.md new file mode 100644 index 0000000..8642442 --- /dev/null +++ b/site/content/docs/7.reference/3.cheat-sheet.md @@ -0,0 +1,199 @@ +--- +title: Cheat sheet +description: Dense copy-paste reference for common AutoFixture v5 tasks. +--- + +Quick copy-paste snippets for everyday AutoFixture work. Assume: + +```csharp +var fixture = new Fixture(); +``` + +Each block links to the full guide when you need more context. + +## Create + +```csharp +var number = fixture.Create(); +var text = fixture.Create(); +var dto = fixture.Create(); +var many = fixture.CreateMany(5).ToList(); +``` + +Seeded strings need **AutoFixture.SeedExtensions**: + +```csharp +var labeled = fixture.Create("Name"); // starts with "Name" +var items = fixture.CreateMany("Item", 3); // three prefixed strings +``` + +→ [Fixture and Create](/docs/fundamentals/fixture-and-create) · [Seed extensions](/docs/extensions/seed-extensions) + +## Build (one object) + +```csharp +// Pin properties +var client = fixture.Build() + .With(x => x.Name, "Ada") + .With(x => x.Age, 42) + .Create(); + +// Leave a property at its default +var sparse = fixture.Build() + .Without(x => x.Age) + .Create(); + +// Skip all property assignment +var shell = fixture.Build() + .OmitAutoProperties() + .Create(); + +// Mutate after construction +var trimmed = fixture.Build() + .Do(x => x.Name = x.Name.Trim()) + .Create(); +``` + +→ [Build DSL](/docs/fundamentals/build-dsl) + +## Supply known values + +```csharp +fixture.Register(() => "fixed"); // factory for every request +var shared = fixture.Freeze(); // create once, reuse +fixture.Inject(new ClientDto { Name = "x", Age = 1 }); // exact instance +``` + +| Method | When | +| --- | --- | +| `Register` | You control *how* each request is built | +| `Freeze` | AutoFixture creates it once; later requests on this fixture reuse it | +| `Inject` | You already have the instance | + +→ [Register, Freeze, and Inject](/docs/how-to/register-freeze-inject) + +## Collections + +```csharp +var tags = fixture.Create(); +var scores = fixture.Create>(); +var five = fixture.CreateMany(5).ToList(); + +var list = new List(); +fixture.AddManyTo(list); // uses RepeatCount +fixture.AddManyTo(list, 3); // exact count + +var form = fixture.Build() + .With(x => x.Labels, fixture.CreateMany().ToList()) + .Create(); +``` + +→ [Collections](/docs/how-to/collections) + +## Customize the fixture + +Per-type rules that apply to later `Create` calls: + +```csharp +fixture.Customize(c => c.With(x => x.Age, 21)); +fixture.Customize(c => c.Without(x => x.Age)); +fixture.Customize(c => c.OmitAutoProperties()); +``` + +Package customizations: + +```csharp +fixture.Customize(new AutoMoqCustomization()); +fixture.Customize(new AutoMoqCustomization { ConfigureMembers = true }); +fixture.Customize(new AutoNSubstituteCustomization()); +fixture.Customize(new AutoFakeItEasyCustomization()); +``` + +→ [Customizations](/docs/fundamentals/customizations) · [Customizations catalog](/docs/fundamentals/customizations-catalog) + +## Circular references + +Default: throw. Omit the nested loop instead: + +```csharp +fixture.Behaviors + .OfType() + .ToList() + .ForEach(b => fixture.Behaviors.Remove(b)); +fixture.Behaviors.Add(new OmitOnRecursionBehavior()); +``` + +→ [Circular references](/docs/how-to/circular-refs) · [Behaviors](/docs/fundamentals/behaviors) + +## AutoData + +```csharp +[Theory, AutoData] +public void AutoData_FillsParameters(int n, string s, ClientDto dto) { } + +[Theory] +[InlineAutoData("fixed")] +public void InlineAutoData_MixesExplicitAndGenerated(string first, string second) { } + +[Theory, AutoData] +public void Frozen_SharesInstance([Frozen] string a, string b) { } + +[Theory, AutoData] +public void Frozen_IntoInterface( + [Frozen(Matching.ImplementedInterfaces)] InMemoryOrderRepository repo, + OrderService sut) { } +``` + +Custom AutoData that includes AutoMoq: + +```csharp +public class AutoMoqDataAttribute : AutoDataAttribute +{ + public AutoMoqDataAttribute() + : base(() => new Fixture().Customize(new AutoMoqCustomization())) { } +} +``` + +→ [xUnit.net 3](/docs/integrations/xunit3) · [NUnit 4](/docs/integrations/nunit4) + +## Auto-mocking + +```csharp +// Moq — freeze Mock for Verify +fixture.Customize(new AutoMoqCustomization()); +var mock = fixture.Freeze>(); +var sut = fixture.Create(); + +// Moq — members return fixture values +fixture.Customize(new AutoMoqCustomization { ConfigureMembers = true }); + +// Moq — generic / skipped members +mock.Setup(m => m.Convert("10")).ReturnsUsingFixture(fixture); + +// NSubstitute / FakeItEasy — freeze the interface +fixture.Customize(new AutoNSubstituteCustomization()); +var sub = fixture.Freeze(); + +fixture.Customize(new AutoFakeItEasyCustomization()); +var fake = fixture.Freeze(); +``` + +→ [AutoMoq](/docs/integrations/automoq) · [AutoNSubstitute](/docs/integrations/autonsubstitute) · [AutoFakeItEasy](/docs/integrations/autofakeiteasy) + +## Task index + +| I want to… | Go to | +| --- | --- | +| Understand `Create` | [Fixture and Create](/docs/fundamentals/fixture-and-create) | +| Override properties | [Build DSL](/docs/fundamentals/build-dsl) | +| Share or pin instances | [Register, Freeze, Inject](/docs/how-to/register-freeze-inject) | +| Fill lists / arrays | [Collections](/docs/how-to/collections) | +| Honor data annotations | [Data annotations](/docs/how-to/data-annotations) | +| Fix circular graphs | [Circular references](/docs/how-to/circular-refs) | +| Prefix generated strings | [Seed extensions](/docs/extensions/seed-extensions) | +| Use `[AutoData]` | [xUnit.net 3](/docs/integrations/xunit3) / [NUnit 4](/docs/integrations/nunit4) | +| Mock interfaces | [AutoMoq](/docs/integrations/automoq) / [AutoNSubstitute](/docs/integrations/autonsubstitute) / [AutoFakeItEasy](/docs/integrations/autofakeiteasy) | +| Guard-clause assertions | [Idioms](/docs/extensions/idioms) | +| Troubleshoot common errors | [FAQ](/docs/reference/faq) | +| See every NuGet package | [Packages](/docs/reference/packages) | +| Browse types | [API reference](/docs/reference/api-reference) | diff --git a/site/content/docs/7.reference/4.faq.md b/site/content/docs/7.reference/4.faq.md new file mode 100644 index 0000000..39a2073 --- /dev/null +++ b/site/content/docs/7.reference/4.faq.md @@ -0,0 +1,156 @@ +--- +title: FAQ +description: Answers to questions people actually ask about AutoFixture. +--- + +## Why does `Create` throw `ObjectCreationException`? + +AutoFixture could not finish the object graph. The exception (often `ObjectCreationExceptionWithPath`) usually means one of these: + +| Cause | What to do | +| --- | --- | +| Interface or abstract type | Add [AutoMoq](/docs/integrations/automoq), [AutoNSubstitute](/docs/integrations/autonsubstitute), or [AutoFakeItEasy](/docs/integrations/autofakeiteasy) — or [`Register`](/docs/how-to/register-freeze-inject) a concrete type | +| Circular reference | Replace the default recursion behavior — see [below](#how-do-i-deal-with-circular-references) | +| Property / constructor AutoFixture cannot satisfy | Use [Build DSL](/docs/fundamentals/build-dsl) (`With` / `Without` / `Do`) or a [customization](/docs/fundamentals/customizations) | + +Read the request path in the exception — it shows which type failed. + +## What’s the difference between `Freeze`, `Inject`, and `Register`? + +All three change how later requests for a type are resolved: + +| Method | Meaning | +| --- | --- | +| `Freeze()` | AutoFixture **creates** `T` once, then reuses that instance | +| `Inject(instance)` | You **supply** the instance; every request gets that same object | +| `Register(() => …)` | You supply a **factory**; AutoFixture calls it for each request | + +```csharp +var frozen = fixture.Freeze(); // AF creates, then reuses +fixture.Inject(new ClientDto { Name = "x" }); // you own the instance +fixture.Register(() => DateTime.UtcNow.Date); // factory each time +``` + +→ [Register, Freeze, and Inject](/docs/how-to/register-freeze-inject) + +## How do I deal with circular references? + +By default AutoFixture **throws** when it detects a loop (for example `Session` → `Language` → `Sessions`). That is intentional. + +To omit the recursive property instead: + +```csharp +fixture.Behaviors + .OfType() + .ToList() + .ForEach(b => fixture.Behaviors.Remove(b)); +fixture.Behaviors.Add(new OmitOnRecursionBehavior()); +``` + +For a single object, `Build` + `Without` can skip the back-reference without changing fixture-wide behavior. + +→ [Circular references](/docs/how-to/circular-refs) + +## Why can’t AutoFixture create my interface? + +AutoFixture builds **concrete** types. It does not invent implementations for interfaces or abstract classes. + +```csharp +fixture.Customize(new AutoMoqCustomization()); +var service = fixture.Create(); // IOrderRepository becomes a Moq mock +``` + +Use the same idea with NSubstitute or FakeItEasy. For `[AutoData]`, put the customization in a [custom AutoData attribute](#how-do-i-share-fixture-setup-across-many-tests). + +→ [Integrations overview](/docs/integrations) + +## How do I get mocks into `[AutoData]` parameters? + +Plain `[AutoData]` has no mocking. Subclass `AutoDataAttribute` so the fixture includes AutoMoq (or another library), then freeze the mock (or the interface): + +```csharp +public class AutoMoqDataAttribute : AutoDataAttribute +{ + public AutoMoqDataAttribute() + : base(() => new Fixture().Customize(new AutoMoqCustomization())) + { + } +} + +[Theory, AutoMoqData] +public void Test( + [Frozen] Mock repository, + OrderService sut, + Order order) +{ + sut.PlaceOrder(order); + repository.Verify(r => r.Save(order), Times.Once); +} +``` + +→ [xUnit.net 3 — custom AutoData](/docs/integrations/xunit3#custom-autodata-attribute) · [AutoMoq](/docs/integrations/automoq) + +## How do I share fixture setup across many tests? + +Don’t repeat `new Fixture().Customize(...)` in every test. One custom AutoData attribute holds your team conventions (auto-mocking, recursion behavior, date factories, …): + +```csharp +public class DefaultAutoDataAttribute : AutoDataAttribute +{ + public DefaultAutoDataAttribute() + : base(() => new Fixture() + .Customize(new AutoMoqCustomization { ConfigureMembers = true })) + { + } +} +``` + +Use `[DefaultAutoData]` (and a matching InlineAutoData subclass) on theories. + +→ [Custom AutoData attribute](/docs/integrations/xunit3#custom-autodata-attribute) + +## I froze an interface — why isn’t my SUT using it? + +Freezing works when the SUT requests the **same type** you froze (or a matching type with `[Frozen(Matching…)]`). Library differences: + +- **Moq** — prefer `Freeze>()`. Freezing the interface freezes `mock.Object`; use `Mock.Get(repo)` if you need `Verify`. See [AutoMoq wrappers](/docs/integrations/automoq#mock-wrappers-and-interface-requests). +- **NSubstitute / FakeItEasy** — freeze the **interface** (there is no `Mock` wrapper). That instance is what the SUT receives. + +With `[Frozen]` on AutoData, parameter **order** matters: freeze first, then create the SUT. For a concrete type that should satisfy an interface constructor parameter, use `[Frozen(Matching.ImplementedInterfaces)]`. + +→ [Frozen](/docs/integrations/xunit3#frozen) + +## How do I fill a get-only / read-only collection? + +`With` needs a writable property. For a list exposed with a private setter (or get-only `IList` filled in the constructor), mutate after create: + +```csharp +var order = fixture.Build() + .Do(o => fixture.AddManyTo(o.OrderLines)) + .Create(); +``` + +→ [Collections](/docs/how-to/collections) + +## I’m on AutoFixture 4 — what changes in v5? + +Pin **matching** v5 packages together. Test integrations move to **AutoFixture.Xunit3** / **AutoFixture.NUnit4** and target **.NET 8+**. Core APIs (`Fixture`, `Create`, `Build`, `Customize`) stay familiar. + +→ [v4 to v5 migration](/docs/reference/v4-to-v5-migration) + +## Is AutoFixture a DI container? Can I use it in production? + +**No.** AutoFixture generates anonymous test data. It is not an application composition root and is not meant for production runtime. + +For tests that need interfaces, pair it with a mocking library ([AutoMoq](/docs/integrations/automoq), and so on) — still only in the test project. + +## Generated values are noisy in failure messages — can I make them readable? + +Use **AutoFixture.SeedExtensions** for prefixed strings, or customize how a type is created: + +```csharp +var name = fixture.Create("Customer"); // e.g. "Customer3f2a…" +fixture.Customize(c => c.FromSeed(seed => seed)); // stable ints when seeded +``` + +→ [Seed extensions](/docs/extensions/seed-extensions) diff --git a/site/content/docs/7.reference/5.compatibility.md b/site/content/docs/7.reference/5.compatibility.md new file mode 100644 index 0000000..bd6190c --- /dev/null +++ b/site/content/docs/7.reference/5.compatibility.md @@ -0,0 +1,38 @@ +--- +title: Compatibility +description: Supported .NET versions and package lines for AutoFixture v5 and v4. +--- + +## v5 (recommended) + +| Component | Version | TFM (target framework moniker) | +|-----------|---------|--------------------------------| +| AutoFixture | 5.0.0-rc.1 | netstandard2.0 | +| AutoFixture.Xunit3 | 5.0.0-rc.1 | net8.0 | +| AutoFixture.NUnit4 | 5.0.0-rc.1 | net8.0 | +| AutoFixture.AutoMoq | 5.0.0-rc.1 | netstandard2.0 | +| AutoFixture.AutoNSubstitute | 5.0.0-rc.1 | netstandard2.0 | +| AutoFixture.AutoFakeItEasy | 5.0.0-rc.1 | net8.0 | +| AutoFixture.SeedExtensions | 5.0.0-rc.1 | net8.0 | +| AutoFixture.Idioms | 5.0.0-rc.1 | net8.0 | +| Test projects | — | **net8.0** or later recommended | + +Xunit3, NUnit4, AutoFakeItEasy, SeedExtensions, and Idioms require a **net8.0+** test project. Core AutoFixture, AutoMoq, and AutoNSubstitute also work from netstandard2.0 consumers. + +Verify restore: + +```csharp +var fixture = new Fixture(); +var value = fixture.Create(); +Assert.NotEqual(default, value); +``` + +## v4 (maintenance) + +AutoFixture 4.18.1 targets older test frameworks (xUnit 2, NUnit 3, .NET Framework 4.5.2). Use v4 packages only when you cannot upgrade test projects yet. + +## Mixing versions + +Do not mix v4 and v5 AutoFixture packages in the same test project. Pin one line across core and extension packages. + +See [v4 to v5 migration](/docs/reference/v4-to-v5-migration) and the full [package list](/docs/reference/packages). diff --git a/site/content/docs/7.reference/6.v4-to-v5-migration.md b/site/content/docs/7.reference/6.v4-to-v5-migration.md new file mode 100644 index 0000000..4555146 --- /dev/null +++ b/site/content/docs/7.reference/6.v4-to-v5-migration.md @@ -0,0 +1,56 @@ +--- +title: v4 to v5 migration +description: Upgrade AutoFixture test projects from 4.18.1 to 5.0.0-rc.1. +--- + +## 1. Pin v5 packages together + +Upgrade core and extensions in one step: + +| v4 (4.18.1) | v5 (5.0.0-rc.1) | +|-------------|-----------------| +| AutoFixture | AutoFixture | +| AutoFixture.xUnit2 | AutoFixture.Xunit3 | +| AutoFixture.NUnit3 | AutoFixture.NUnit4 | +| AutoFixture.AutoMoq | AutoFixture.AutoMoq | +| AutoFixture.AutoNSubstitute | AutoFixture.AutoNSubstitute | +| AutoFixture.AutoFakeItEasy | AutoFixture.AutoFakeItEasy | +| AutoFixture.Idioms | AutoFixture.Idioms | +| AutoFixture.SeedExtensions | AutoFixture.SeedExtensions | + +Do not mix v4 and v5 assemblies in the same project. + +## 2. Target .NET 8+ for test projects + +xUnit.net 3 and NUnit 4 integrations target **net8.0**. Move test projects from .NET Framework or older .NET versions when possible. + +## 3. Update test attributes + +| v4 | v5 | +|----|-----| +| `using AutoFixture.Xunit2` | `using AutoFixture.Xunit3` | +| `using AutoFixture.NUnit3` | `using AutoFixture.NUnit4` | +| xUnit 2.x runner | xunit.v3 | +| NUnit 3.x | NUnit 4.x | + +Core APIs (`Fixture`, `Create`, `Build`, `Customize`, `Register`) stay familiar. + +## 4. Verify restore + +```csharp +var fixture = new Fixture(); +var value = fixture.Create(); +Assert.NotEqual(default, value); +``` + +Load integration assemblies you use (AutoFixture.Xunit3, AutoFixture.AutoMoq, AutoFixture.Idioms, AutoFixture.SeedExtensions, etc.) in the same test project. + +## 5. API reference URLs + +v5 links use `/api/{packageId}/5-0-0-rc-1/...`. v4 docs remain at `/api/{packageId}/4-18-1/...`. + +## Related + +- [Compatibility](/docs/reference/compatibility) +- [NuGet packages](/docs/reference/packages) +- [Previous versions](/docs/reference/previous-versions) diff --git a/site/content/docs/7.reference/7.previous-versions.md b/site/content/docs/7.reference/7.previous-versions.md new file mode 100644 index 0000000..c5a422a --- /dev/null +++ b/site/content/docs/7.reference/7.previous-versions.md @@ -0,0 +1,64 @@ +--- +title: Previous versions +description: v4 integration packages and their v5 replacements. +--- + +Use this page when you maintain tests on AutoFixture **4.18.1** or need to map legacy integration packages to v5. + +## xUnit.net 2 (v4) + +| v4 | v5 | +|----|-----| +| AutoFixture.xUnit2 4.18.1 | [AutoFixture.Xunit3](/docs/integrations/xunit3) 5.0.0-rc.1 | +| AutoFixture.xUnit 4.18.1 | [AutoFixture.Xunit3](/docs/integrations/xunit3) 5.0.0-rc.1 | +| xUnit 2.x | xunit.v3 2.x | + +API reference: [/api/xunit2/4-18-1](/api/xunit2/4-18-1) + +Before `[AutoData]` attributes, tests often used a manual fixture: + +```csharp +var fixture = new Fixture(); +var sut = fixture.Create(); +var expected = fixture.Create(); + +var result = sut.Echo(expected); + +Assert.Equal(expected, result); +``` + +## NUnit 2 and 3 (v4) + +| v4 | v5 | +|----|-----| +| AutoFixture.NUnit3 4.18.1 | [AutoFixture.NUnit4](/docs/integrations/nunit4) 5.0.0-rc.1 | +| AutoFixture.NUnit2 4.18.1 | [AutoFixture.NUnit4](/docs/integrations/nunit4) (requires .NET 8+) | +| NUnit 3.x | NUnit 4.x | + +API reference: [/api/nunit3/4-18-1](/api/nunit3/4-18-1) + +Modern equivalent: + +```csharp +[Test, AutoData] +public void AutoData_WorksAsStandInForLegacyNUnit3Package(int expectedNumber, MyClass sut) +{ + var result = sut.Echo(expectedNumber); + + Assert.That(result, Is.EqualTo(expectedNumber)); +} +``` + +## Other v4-only packages + +| Package | API | +|---------|-----| +| AutoFixture.Idioms.FsCheck 4.18.1 | [/api/idioms-fscheck/4-18-1](/api/idioms-fscheck/4-18-1) | +| AutoFixture.AutoFoq 4.18.1 | [/api/autofoq/4-18-1](/api/autofoq/4-18-1) | +| AutoFixture.AutoRhinoMocks 4.18.1 | [/api/autorhinomocks/4-18-1](/api/autorhinomocks/4-18-1) | + +## Related + +- [Migrate from v4 to v5](/docs/reference/v4-to-v5-migration) +- [NuGet packages](/docs/reference/packages) +- [Compatibility](/docs/reference/compatibility) diff --git a/site/content/index.md b/site/content/index.md new file mode 100644 index 0000000..2d9f069 --- /dev/null +++ b/site/content/index.md @@ -0,0 +1,8 @@ +--- +title: AutoFixture +description: AutoFixture makes unit tests more productive by creating anonymous test data for .NET. +--- + +# AutoFixture + +See the [home page](/) for the product overview. diff --git a/site/nuxt.config.ts b/site/nuxt.config.ts new file mode 100644 index 0000000..1ee718f --- /dev/null +++ b/site/nuxt.config.ts @@ -0,0 +1,107 @@ +import { readFileSync } from 'node:fs' +import { join } from 'node:path' + +function readDefaultApiPath() { + try { + const catalogPath = join(process.cwd(), 'public/api-catalog.json') + const catalog = JSON.parse(readFileSync(catalogPath, 'utf8')) as { defaultPath?: string } + return catalog.defaultPath ?? '/api/autofixture/5-0-0-rc-1' + } catch { + return '/api/autofixture/5-0-0-rc-1' + } +} + +function readApiPrerenderRoutes() { + try { + const routesPath = join(process.cwd(), 'public/api-meta/routes.json') + return JSON.parse(readFileSync(routesPath, 'utf8')) as string[] + } catch { + return [] + } +} + +export default defineNuxtConfig({ + modules: [ + '@nuxt/ui', + '@nuxt/content', + '@nuxt/fonts', + ], + css: ['~/assets/css/main.css'], + fonts: { + families: [ + { name: 'Public Sans', provider: 'google', weights: [400, 500, 600, 700] }, + { name: 'Plus Jakarta Sans', provider: 'google', weights: [600, 700] }, + ], + }, + app: { + head: { + title: 'AutoFixture', + meta: [ + { + name: 'description', + content: 'AutoFixture makes unit tests more productive by creating anonymous test data for .NET.', + }, + ], + link: [ + { rel: 'icon', type: 'image/svg+xml', href: '/favicon.svg' }, + ], + }, + }, + nitro: { + prerender: { + crawlLinks: true, + routes: ['/', ...readApiPrerenderRoutes()], + }, + }, + routeRules: { + '/docs': { redirect: '/docs/get-started/introduction' }, + '/docs/get-started': { redirect: '/docs/get-started/introduction' }, + '/docs/integrations': { redirect: '/docs/integrations/overview' }, + '/docs/integrations/custom-autodata-attribute': { redirect: '/docs/integrations/xunit3#custom-autodata-attribute' }, + '/docs/advanced': { redirect: '/docs/advanced/overview' }, + '/docs/fundamentals/specimen-pipeline': { redirect: '/docs/advanced/specimen-pipeline' }, + '/docs/fundamentals/specimen-builder-graphs': { redirect: '/docs/advanced/specimen-builders-and-specifications' }, + '/docs/extensions/kernel': { redirect: '/docs/advanced/specimen-builders-and-specifications' }, + '/docs/advanced/kernel': { redirect: '/docs/advanced/specimen-builders-and-specifications' }, + '/docs/fundamentals/stable-vs-random': { redirect: '/docs/fundamentals/customizations' }, + '/docs/how-to/arrays-lists': { redirect: '/docs/how-to/collections' }, + '/docs/how-to/set-property': { redirect: '/docs/fundamentals/build-dsl' }, + '/docs/how-to/exclude-property': { redirect: '/docs/fundamentals/build-dsl' }, + '/docs/how-to/commerce-graphs': { redirect: '/docs/how-to/collections' }, + '/docs/how-to/create-many': { redirect: '/docs/how-to/collections#createmany' }, + '/docs/how-to/choose-constructor': { redirect: '/docs/fundamentals/customizations' }, + '/docs/how-to/fixture-subclass': { redirect: '/docs/fundamentals/customizations-catalog' }, + '/docs/how-to/value-objects': { redirect: '/docs/fundamentals/fixture-and-create' }, + '/docs/intro': { redirect: '/docs/get-started/introduction' }, + '/api': { redirect: readDefaultApiPath() }, + '/api/autofixture-xunit3/**': { redirect: '/api/xunit3/**' }, + }, + content: { + build: { + markdown: { + highlight: { + theme: { + default: 'light-plus', + dark: 'dark-plus', + }, + langs: [ + 'json', + 'js', + 'ts', + 'html', + 'css', + 'vue', + 'shell', + 'bash', + 'xml', + 'mdc', + 'md', + 'yaml', + 'csharp', + ], + }, + }, + }, + }, + compatibilityDate: '2024-04-03', +}) diff --git a/site/package-lock.json b/site/package-lock.json new file mode 100644 index 0000000..dc1c9f3 --- /dev/null +++ b/site/package-lock.json @@ -0,0 +1,16244 @@ +{ + "name": "site", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "site", + "dependencies": { + "@nuxt/content": "^3.15.2", + "@nuxt/fonts": "^0.14.0", + "@nuxt/ui": "^4.11.0", + "better-sqlite3": "^13.0.3", + "markdown-it": "^14.1.0", + "nuxt": "^4.5.2", + "shiki": "^3.4.0", + "vue": "^3.5.41", + "vue-router": "^5.2.0" + }, + "devDependencies": { + "@iconify-json/lucide": "^1.2.127", + "@types/markdown-it": "^14.1.2" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-14.2.1.tgz", + "integrity": "sha512-HmdFw9CDYqM6B25pqGBpNeLCKvGPlIx1EbLrVL0zPvj50CJQUHyBNBw45Muk0kEIkogo1VZvOKHajdMuAzSxRg==", + "license": "MIT", + "dependencies": { + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 20" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + }, + "peerDependencies": { + "@types/json-schema": "^7.0.15" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/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/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.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==", + "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==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", + "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-syntax-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bomb.sh/tab": { + "version": "0.0.19", + "resolved": "https://registry.npmjs.org/@bomb.sh/tab/-/tab-0.0.19.tgz", + "integrity": "sha512-dTRfo9Q9B+lbLG3JCu8a/AGQSfD2XXcFcnakQzVjSOX+VvR/s9zpsH8TlqV3iHqazniRn1Ypwd1hcRlXcu/4BA==", + "license": "MIT", + "bin": { + "tab": "dist/bin/cli.mjs" + }, + "peerDependencies": { + "cac": "^6.7.14", + "citty": "^0.1.6 || ^0.2.0", + "commander": "^13.1.0 || ^14.0.0 || ^15.0.0" + }, + "peerDependenciesMeta": { + "cac": { + "optional": true + }, + "citty": { + "optional": true + }, + "commander": { + "optional": true + } + } + }, + "node_modules/@capsizecss/unpack": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.1.tgz", + "integrity": "sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@clack/core": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.4.3.tgz", + "integrity": "sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==", + "license": "MIT", + "dependencies": { + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" + } + }, + "node_modules/@clack/prompts": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.7.0.tgz", + "integrity": "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==", + "license": "MIT", + "dependencies": { + "@clack/core": "1.4.3", + "fast-string-width": "^3.0.2", + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" + } + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.2.tgz", + "integrity": "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==", + "license": "MIT OR Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@colordx/core": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@colordx/core/-/core-5.6.0.tgz", + "integrity": "sha512-EDlcg/Hmlj1WuFh/Os9YhA+A2aasB2XlgwFfGePUDuW7fVHC07HBi5AFIMx0Ct1eM8kHM9NRyOtZ0MuVYa8xvg==", + "license": "MIT" + }, + "node_modules/@dxup/nuxt": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@dxup/nuxt/-/nuxt-0.5.10.tgz", + "integrity": "sha512-54Vehb7LmR7qYpC6KFwjDTSm6CB1CayBu+JXdHrPLrIjjr5xAgb43jvgOU+mnB+tsRh414fSsEy0QjBMKILQ8g==", + "license": "MIT", + "dependencies": { + "@dxup/unimport": "^0.1.2", + "@nuxt/kit": "^4.5.2", + "@vue/compiler-dom": "^3.5.41", + "chokidar": "^5.0.0", + "knitwork": "^1.3.0", + "magic-string": "^1.2.2", + "pathe": "^2.0.3", + "tinyglobby": "^0.2.17", + "unplugin": "^3.3.0" + } + }, + "node_modules/@dxup/unimport": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@dxup/unimport/-/unimport-0.1.2.tgz", + "integrity": "sha512-/B8YJGPzaYq1NbsQmwgP8EZqg40NpTw4ZB3suuI0TplbxKHeK94jeaawLmVhCv+YwUnOpiWEz9U6SeThku/8JQ==", + "license": "MIT" + }, + "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==", + "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==", + "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==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@floating-ui/vue": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@floating-ui/vue/-/vue-1.1.11.tgz", + "integrity": "sha512-HzHKCNVxnGS35r9fCHBc3+uCnjw9IWIlCPL683cGgM9Kgj2BiAl8x1mS7vtvP6F9S/e/q4O6MApwSHj8hNLGfw==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.6", + "@floating-ui/utils": "^0.2.11", + "vue-demi": ">=0.13.0" + } + }, + "node_modules/@floating-ui/vue/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@iconify-json/lucide": { + "version": "1.2.127", + "resolved": "https://registry.npmjs.org/@iconify-json/lucide/-/lucide-1.2.127.tgz", + "integrity": "sha512-7KuCCpkly00kefna4wEnCr8l2HFRkbn4mD4zRib8wCSbrBmnR/l57ExpU6j5jv/Bo+qHpWuHpDtcqceQ0ptArw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/collections": { + "version": "1.0.730", + "resolved": "https://registry.npmjs.org/@iconify/collections/-/collections-1.0.730.tgz", + "integrity": "sha512-vuSS1r5FVWH5Oo6vEnAYvCd4u13sr95s0uDjfOaSFdF15EvLAaUKA2yDpufc5KbFLBVvwzE5pIFt0dIM2kjYWA==", + "license": "MIT", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.4.tgz", + "integrity": "sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/types": "^2.0.0", + "import-meta-resolve": "^4.2.0" + } + }, + "node_modules/@iconify/vue": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@iconify/vue/-/vue-5.0.1.tgz", + "integrity": "sha512-aumwwooJlFJ5H5qYWB6ZTAyM0C8hpfcSVLB9/a3qnH1GGvIJ+FEbpEs4s/HfErYe/M5qZeLjwmESR5fFm3lXEw==", + "license": "MIT", + "dependencies": { + "@iconify/types": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/cyberalien" + }, + "peerDependencies": { + "vue": ">=3.0.0" + } + }, + "node_modules/@internationalized/date": { + "version": "3.12.3", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.3.tgz", + "integrity": "sha512-fuLX+3ZKLsxI73y8b01EG/WjHb6gE6weCqlfawPO27kBWGMh9G1yH6Csv1uU7/cac9H2GHmOMt6CjmuQ1aia4Q==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@internationalized/number": { + "version": "3.6.7", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.7.tgz", + "integrity": "sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@ioredis/commands": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.10.0.tgz", + "integrity": "sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "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==", + "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==", + "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==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "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==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "license": "MIT" + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.3.tgz", + "integrity": "sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==", + "license": "BSD-3-Clause", + "dependencies": { + "consola": "^3.2.3", + "detect-libc": "^2.0.0", + "https-proxy-agent": "^7.0.5", + "node-fetch": "^2.6.7", + "nopt": "^8.0.0", + "semver": "^7.5.3", + "tar": "^7.4.0" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.3.tgz", + "integrity": "sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nuxt/cli": { + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/@nuxt/cli/-/cli-3.37.0.tgz", + "integrity": "sha512-Zj9NwHjEBzVrgezsgMFjpMhNqwNgROk9DzNi/dyfk1mCbXIRigV11br2xOl0Satek30bmv7oZAfMtCnDe6Ip0Q==", + "license": "MIT", + "dependencies": { + "@bomb.sh/tab": "^0.0.19", + "@clack/prompts": "^1.7.0", + "c12": "^3.3.4", + "citty": "^0.2.2", + "confbox": "^0.2.4", + "consola": "^3.4.2", + "debug": "^4.4.3", + "defu": "^6.1.7", + "exsolve": "^1.1.0", + "fuse.js": "^7.4.2", + "fzf": "^0.5.2", + "giget": "^3.3.0", + "jiti": "^2.7.0", + "listhen": "^1.10.0", + "nypm": "^0.6.8", + "ofetch": "^1.5.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^2.1.0", + "pkg-types": "^2.3.1", + "scule": "^1.3.0", + "semver": "^7.8.5", + "srvx": "^0.11.22", + "std-env": "^4.2.0", + "tinyclip": "^0.1.15", + "tinyexec": "^1.2.4", + "ufo": "^1.6.4", + "youch": "^4.1.1" + }, + "bin": { + "nuxi": "bin/nuxi.mjs", + "nuxi-ng": "bin/nuxi.mjs", + "nuxt": "bin/nuxi.mjs", + "nuxt-cli": "bin/nuxi.mjs" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + }, + "peerDependencies": { + "@nuxt/schema": "^4.4.6" + }, + "peerDependenciesMeta": { + "@nuxt/schema": { + "optional": true + } + } + }, + "node_modules/@nuxt/content": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@nuxt/content/-/content-3.16.0.tgz", + "integrity": "sha512-UdPZafE7fyXBJSKOY8b9B84f7YM5Kp48q8vGKxDLaGHOnhuRCOaM/mmOkJUjurSwbJDK9DD1thpIUg+CFHPNeA==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^4.5.2", + "@nuxtjs/mdc": "^0.23.1", + "@shikijs/langs": "^4.4.3", + "@sqlite.org/sqlite-wasm": "3.53.0-build1", + "@standard-schema/spec": "^1.1.0", + "@webcontainer/env": "^1.1.1", + "c12": "^3.3.4", + "chokidar": "^5.0.0", + "consola": "^3.4.2", + "db0": "^0.4.0", + "defu": "^6.1.7", + "destr": "^2.0.5", + "git-url-parse": "^16.1.0", + "h3": "^1.15.11", + "hookable": "^5.5.3", + "isomorphic-git": "^1.41.9", + "jiti": "^2.7.0", + "json-schema-to-typescript-lite": "^15.0.0", + "mdast-util-to-hast": "^13.2.1", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.2", + "micromark-util-character": "^2.1.1", + "micromark-util-chunked": "^2.0.1", + "micromark-util-resolve-all": "^2.0.1", + "micromark-util-sanitize-uri": "^2.0.1", + "micromatch": "^4.0.8", + "minimark": "^0.2.0", + "minimatch": "^10.2.6", + "nuxt-component-meta": "0.18.0", + "nypm": "^0.6.9", + "ohash": "^2.0.12", + "pathe": "^2.0.3", + "pkg-types": "^2.3.1", + "remark-mdc": "^3.11.1", + "scule": "^1.3.0", + "shiki": "^4.4.3", + "slugify": "^1.6.9", + "socket.io-client": "^4.8.3", + "std-env": "^4.2.0", + "tinyglobby": "^0.2.17", + "ufo": "^1.6.4", + "unctx": "^3.0.1", + "unified": "^11.0.5", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.1.0", + "unplugin": "^3.3.0", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.25.2" + }, + "engines": { + "node": ">= 20.19.0" + }, + "peerDependencies": { + "@electric-sql/pglite": "*", + "@libsql/client": "*", + "@valibot/to-json-schema": "^1.5.0", + "better-sqlite3": "^12.5.0 || ^13.0.0", + "sqlite3": "*", + "valibot": "^1.2.0" + }, + "peerDependenciesMeta": { + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@valibot/to-json-schema": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "valibot": { + "optional": true + } + } + }, + "node_modules/@nuxt/content/node_modules/@shikijs/engine-oniguruma": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.3.tgz", + "integrity": "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@nuxt/content/node_modules/shiki": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.4.3.tgz", + "integrity": "sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.4.3", + "@shikijs/engine-javascript": "4.4.3", + "@shikijs/engine-oniguruma": "4.4.3", + "@shikijs/langs": "4.4.3", + "@shikijs/themes": "4.4.3", + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@nuxt/devalue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nuxt/devalue/-/devalue-2.0.2.tgz", + "integrity": "sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==", + "license": "MIT" + }, + "node_modules/@nuxt/devtools": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@nuxt/devtools/-/devtools-3.4.2.tgz", + "integrity": "sha512-Nidg0/zB710cyK89ltTkv66hMfPlIPlKA+Yb67bIrAkNm5PoTwQ1goHdFWHIAGZ9nTadcVTzATwMwa56nvl/Wg==", + "license": "MIT", + "dependencies": { + "@nuxt/devtools-kit": "3.4.2", + "@nuxt/devtools-wizard": "3.4.2", + "@nuxt/kit": "^4.5.1", + "@vue/devtools-core": "^8.2.1", + "@vue/devtools-kit": "^8.2.1", + "birpc": "^4.0.0", + "consola": "^3.4.2", + "destr": "^2.0.5", + "error-stack-parser-es": "^2.0.1", + "execa": "^8.0.1", + "fast-npm-meta": "^2.2.0", + "get-port-please": "^3.2.0", + "hookable": "^6.1.1", + "image-meta": "^0.2.2", + "is-installed-globally": "^1.0.0", + "launch-editor": "^2.14.1", + "local-pkg": "^1.2.1", + "magicast": "^0.5.4", + "nypm": "^0.6.9", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^2.1.0", + "pkg-types": "^2.3.1", + "semver": "^7.8.5", + "simple-git": "^3.36.0", + "sirv": "^3.0.2", + "structured-clone-es": "^2.0.1", + "tinyglobby": "^0.2.17", + "unstorage": "^1.17.5", + "vite-plugin-inspect": "^11.4.1", + "vite-plugin-vue-tracer": "^1.4.0", + "which": "^6.0.1", + "ws": "^8.21.1" + }, + "bin": { + "devtools": "cli.mjs" + }, + "peerDependencies": { + "@vitejs/devtools": "*", + "vite": ">=6.0" + }, + "peerDependenciesMeta": { + "@vitejs/devtools": { + "optional": true + } + } + }, + "node_modules/@nuxt/devtools-kit": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@nuxt/devtools-kit/-/devtools-kit-3.4.2.tgz", + "integrity": "sha512-TPPbmH9xrExagYxfCe6JgtbHmgchfgDdA656Yws18rn8I/oCvB+gcw3kTWBBp2sC9ipZPXsgbsW/yZnVnGNBiA==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^4.5.1", + "execa": "^8.0.1" + }, + "peerDependencies": { + "vite": ">=6.0" + } + }, + "node_modules/@nuxt/devtools-wizard": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@nuxt/devtools-wizard/-/devtools-wizard-3.4.2.tgz", + "integrity": "sha512-U2G8fw7KW1rdECyJDho5N14z8hSllpTk430KG1QPLjrv5w3pDksZ+YcpITd0u762Vw3gq3Arpg65Bk6U4ua6aQ==", + "license": "MIT", + "dependencies": { + "@clack/prompts": "^1.7.0", + "consola": "^3.4.2", + "diff": "^8.0.4", + "execa": "^8.0.1", + "magicast": "^0.5.4", + "pathe": "^2.0.3", + "pkg-types": "^2.3.1", + "semver": "^7.8.5" + }, + "bin": { + "devtools-wizard": "cli.mjs" + } + }, + "node_modules/@nuxt/devtools/node_modules/hookable": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.1.tgz", + "integrity": "sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==", + "license": "MIT" + }, + "node_modules/@nuxt/fonts": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@nuxt/fonts/-/fonts-0.14.0.tgz", + "integrity": "sha512-4uXQl9fa5F4ibdgU8zomoOcyMdnwgdem+Pi8JEqeDYI5yPR32Kam6HnuRr47dTb97CstaepAvXPWQUUHMtjsFQ==", + "license": "MIT", + "dependencies": { + "@nuxt/devtools-kit": "^3.2.1", + "@nuxt/kit": "^4.2.2", + "consola": "^3.4.2", + "defu": "^6.1.4", + "fontless": "^0.2.1", + "h3": "^1.15.5", + "magic-regexp": "^0.10.0", + "ofetch": "^1.5.1", + "pathe": "^2.0.3", + "sirv": "^3.0.2", + "tinyglobby": "^0.2.15", + "ufo": "^1.6.3", + "unifont": "^0.7.4", + "unplugin": "^3.0.0", + "unstorage": "^1.17.4" + } + }, + "node_modules/@nuxt/icon": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@nuxt/icon/-/icon-2.5.1.tgz", + "integrity": "sha512-zBP72Po7BS+tXzoeDRA/Y9TTY77OIcNCyzfgXsOmep7zZShTEoe4p1WZBXce/9oJDK3YXmbYC3ILQ7XvqM4/XA==", + "license": "MIT", + "dependencies": { + "@iconify/collections": "^1.0.727", + "@iconify/types": "^2.0.0", + "@iconify/utils": "^3.1.4", + "@iconify/vue": "^5.0.1", + "@nuxt/devtools-kit": "^3.4.2", + "@nuxt/kit": "^4.5.2", + "consola": "^3.4.2", + "local-pkg": "^1.2.1", + "mlly": "^1.8.2", + "ohash": "^2.0.12", + "picomatch": "^4.0.5", + "std-env": "^4.2.0", + "tinyglobby": "^0.2.17", + "ufo": "^1.6.4" + } + }, + "node_modules/@nuxt/icon/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nuxt/kit": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-4.5.2.tgz", + "integrity": "sha512-l66LU9DcJYjmNwqwAj2I5UGRrUbnG2DOKGChnN70zIGtn0eq/z87gi/FRgha6eMb9/FmB1PFHgtx6PWVml1C2Q==", + "license": "MIT", + "dependencies": { + "c12": "^3.3.4", + "consola": "^3.4.2", + "defu": "^6.1.7", + "destr": "^2.0.5", + "errx": "^0.1.2", + "exsolve": "^1.1.1", + "ignore": "^7.0.6", + "jiti": "^2.7.0", + "klona": "^2.0.6", + "mlly": "^1.8.2", + "nostics": "^1.2.0", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "pkg-types": "^2.3.1", + "rc9": "^3.0.1", + "scule": "^1.3.0", + "tinyglobby": "^0.2.17", + "ufo": "^1.6.4", + "unctx": "^3.0.0", + "untyped": "^2.0.0", + "verkit": "^0.3.1" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@nuxt/nitro-server": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@nuxt/nitro-server/-/nitro-server-4.5.2.tgz", + "integrity": "sha512-sx/vtT8D1WIRUOMuKQz/9z8nZb7jgVWc6HWwlkXKDjYZ84otPFtYCozKqhXWv6xf3JxJvge/RUAOwh9Z7P4nQQ==", + "license": "MIT", + "dependencies": { + "@nuxt/devalue": "^2.0.2", + "@nuxt/kit": "4.5.2", + "@unhead/vue": "^3.3.1", + "@vue/shared": "^3.5.40", + "consola": "^3.4.2", + "defu": "^6.1.7", + "destr": "^2.0.5", + "devalue": "^5.9.0", + "errx": "^0.1.2", + "escape-string-regexp": "^5.0.0", + "exsolve": "^1.1.1", + "h3": "^1.15.11", + "impound": "^1.1.6", + "klona": "^2.0.6", + "mocked-exports": "^0.1.1", + "nitropack": "^2.13.4", + "nostics": "^1.2.0", + "nypm": "^0.6.9", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "rou3": "^0.9.1", + "std-env": "^4.2.0", + "ufo": "^1.6.4", + "unctx": "^3.0.0", + "unstorage": "^1.17.5", + "vue": "^3.5.40", + "vue-bundle-renderer": "^2.3.1", + "vue-devtools-stub": "^0.1.0" + }, + "engines": { + "node": "^22.19.0 || ^24.11.0 || >=26.0.0" + }, + "peerDependencies": { + "@babel/plugin-proposal-decorators": "^7.25.0 || ^8.0.0", + "@babel/plugin-syntax-typescript": "^7.25.0 || ^8.0.0", + "@rollup/plugin-babel": "^6.0.0 || ^7.0.0", + "nuxt": "^4.5.2" + }, + "peerDependenciesMeta": { + "@babel/plugin-proposal-decorators": { + "optional": true + }, + "@babel/plugin-syntax-typescript": { + "optional": true + }, + "@rollup/plugin-babel": { + "optional": true + } + } + }, + "node_modules/@nuxt/schema": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-4.5.2.tgz", + "integrity": "sha512-h9g1kt9O2iU9nX6HDFu9gvwtpn+8oSJX0RSTWRBnEx/Pkz+WlOHtjuS0SbkTAXw5aT1+H1GysWVwNTjJfBY/0w==", + "license": "MIT", + "dependencies": { + "@vue/shared": "^3.5.40", + "defu": "^6.1.7", + "nostics": "^1.2.0", + "pathe": "^2.0.3", + "pkg-types": "^2.3.1", + "std-env": "^4.2.0" + }, + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/@nuxt/telemetry": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@nuxt/telemetry/-/telemetry-2.8.0.tgz", + "integrity": "sha512-zAwXY24KYvpLTmiV+osagd2EHkfs5IF+7oDZYTQoit5r0kPlwaCNlzHp5I/wUAWT4LBw6lG8gZ6bWidAdv/erQ==", + "license": "MIT", + "dependencies": { + "citty": "^0.2.1", + "consola": "^3.4.2", + "ofetch": "^2.0.0-alpha.3", + "rc9": "^3.0.0", + "std-env": "^4.0.0" + }, + "bin": { + "nuxt-telemetry": "bin/nuxt-telemetry.mjs" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "@nuxt/kit": ">=3.0.0" + } + }, + "node_modules/@nuxt/telemetry/node_modules/ofetch": { + "version": "2.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-2.0.0-alpha.3.tgz", + "integrity": "sha512-zpYTCs2byOuft65vI3z43Dd6iSdFbOZZLb9/d21aCpx2rGastVU9dOCv0lu4ykc1Ur1anAYjDi3SUvR0vq50JA==", + "license": "MIT" + }, + "node_modules/@nuxt/ui": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@nuxt/ui/-/ui-4.11.0.tgz", + "integrity": "sha512-gDs67/fWk3kipcEV4Pc5h1VnZD1glfWfINmJU7s3qpkxxRTkfkPxnUszXG664whNWcoqucS1WgZ/rNjZa3pTMw==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.8.0", + "@iconify/vue": "^5.0.1", + "@internationalized/date": "^3.12.3", + "@internationalized/number": "^3.6.7", + "@nuxt/fonts": "^0.14.0", + "@nuxt/icon": "^2.5.0", + "@nuxt/kit": "^4.5.2", + "@nuxt/schema": "^4.5.2", + "@nuxtjs/color-mode": "^4.0.1", + "@standard-schema/spec": "^1.1.0", + "@tailwindcss/postcss": "^4.3.3", + "@tailwindcss/vite": "^4.3.3", + "@tanstack/vue-table": "^8.21.3", + "@tanstack/vue-virtual": "^3.13.35", + "@tiptap/core": "^3.29.2", + "@tiptap/extension-bubble-menu": "^3.29.2", + "@tiptap/extension-code": "^3.29.2", + "@tiptap/extension-collaboration": "^3.29.2", + "@tiptap/extension-drag-handle": "^3.29.2", + "@tiptap/extension-drag-handle-vue-3": "^3.29.2", + "@tiptap/extension-floating-menu": "^3.29.2", + "@tiptap/extension-horizontal-rule": "^3.29.2", + "@tiptap/extension-image": "^3.29.2", + "@tiptap/extension-mention": "^3.29.2", + "@tiptap/extension-node-range": "^3.29.2", + "@tiptap/extension-placeholder": "^3.29.2", + "@tiptap/markdown": "^3.29.2", + "@tiptap/pm": "^3.29.2", + "@tiptap/starter-kit": "^3.29.2", + "@tiptap/suggestion": "^3.29.2", + "@tiptap/vue-3": "^3.29.2", + "@unhead/vue": "^3.3.2", + "@vueuse/core": "^14.4.0", + "@vueuse/integrations": "^14.4.0", + "@vueuse/shared": "^14.4.0", + "colortranslator": "^5.0.0", + "consola": "^3.4.2", + "defu": "^6.1.7", + "embla-carousel-auto-height": "^8.6.0", + "embla-carousel-auto-scroll": "^8.6.0", + "embla-carousel-autoplay": "^8.6.0", + "embla-carousel-class-names": "^8.6.0", + "embla-carousel-fade": "^8.6.0", + "embla-carousel-vue": "^8.6.0", + "embla-carousel-wheel-gestures": "^8.1.0", + "fuse.js": "^7.5.0", + "hookable": "^6.1.1", + "knitwork": "^1.3.0", + "magic-string": "^1.2.0", + "mlly": "^1.8.2", + "motion-v": "^2.4.0", + "ohash": "^2.0.12", + "pathe": "^2.0.3", + "reka-ui": "2.10.3", + "scule": "^1.3.0", + "tailwind-merge": "^3.6.0", + "tailwind-variants": "^3.2.2", + "tailwindcss": "^4.3.3", + "tinyglobby": "^0.2.17", + "ufo": "^1.6.4", + "unplugin": "^3.3.0", + "unplugin-auto-import": "^21.1.0", + "unplugin-vue-components": "^32.1.0", + "vaul-vue": "0.4.1", + "vue-component-type-helpers": "^3.3.10" + }, + "bin": { + "nuxt-ui": "cli/index.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@inertiajs/vue3": "^2.0.7 || ^3.0.0", + "@internationalized/date": "^3.0.0", + "@internationalized/number": "^3.0.0", + "@nuxt/content": "^3.0.0", + "@tiptap/core": "^3", + "@tiptap/extension-bubble-menu": "^3", + "@tiptap/extension-code": "^3", + "@tiptap/extension-collaboration": "^3", + "@tiptap/extension-drag-handle": "^3", + "@tiptap/extension-drag-handle-vue-3": "^3", + "@tiptap/extension-floating-menu": "^3", + "@tiptap/extension-horizontal-rule": "^3", + "@tiptap/extension-image": "^3", + "@tiptap/extension-mention": "^3", + "@tiptap/extension-node-range": "^3", + "@tiptap/extension-placeholder": "^3", + "@tiptap/markdown": "^3", + "@tiptap/pm": "^3", + "@tiptap/starter-kit": "^3", + "@tiptap/suggestion": "^3", + "@tiptap/vue-3": "^3", + "ai": "^6 || ^7", + "joi": "^18.0.0", + "superstruct": "^2.0.0", + "tailwindcss": "^4.0.0", + "typescript": "^5.6.3 || ^6.0.0 || ^7.0.0", + "valibot": "^1.0.0", + "vue-router": "^4.5.0 || ^5.0.0", + "yup": "^1.7.0", + "zod": "^3.24.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@inertiajs/vue3": { + "optional": true + }, + "@internationalized/date": { + "optional": true + }, + "@internationalized/number": { + "optional": true + }, + "@nuxt/content": { + "optional": true + }, + "ai": { + "optional": true + }, + "joi": { + "optional": true + }, + "superstruct": { + "optional": true + }, + "valibot": { + "optional": true + }, + "vue-router": { + "optional": true + }, + "yup": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/@nuxt/ui/node_modules/hookable": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.1.tgz", + "integrity": "sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==", + "license": "MIT" + }, + "node_modules/@nuxt/vite-builder": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@nuxt/vite-builder/-/vite-builder-4.5.2.tgz", + "integrity": "sha512-fC8KUs5F1VpSEjTIjmx5pdflciMlp3FDCubx3AXElvRPLtBAPmyB69kmqVFjRnVQ8+vRHNyI7iBHUg9Se8srLA==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "4.5.2", + "@vitejs/plugin-vue": "^6.0.8", + "@vitejs/plugin-vue-jsx": "^5.1.6", + "autoprefixer": "^10.5.4", + "consola": "^3.4.2", + "cssnano": "^8.0.2", + "defu": "^6.1.7", + "escape-string-regexp": "^5.0.0", + "exsolve": "^1.1.1", + "generic-names": "^4.0.0", + "get-port-please": "^3.2.0", + "jiti": "^2.7.0", + "js-tokens": "^10.0.0", + "knitwork": "^1.3.0", + "mlly": "^1.8.2", + "mocked-exports": "^0.1.1", + "nypm": "^0.6.9", + "pathe": "^2.0.3", + "pkg-types": "^2.3.1", + "postcss": "^8.5.25", + "rolldown-string": "^0.3.1", + "seroval": "^1.6.2", + "std-env": "^4.2.0", + "ufo": "^1.6.4", + "unenv": "^2.0.0-rc.24", + "vite": "^8.2.0", + "vite-node": "^6.0.0", + "vite-plugin-checker": "^0.14.5", + "vue-bundle-renderer": "^2.3.1" + }, + "engines": { + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + }, + "peerDependencies": { + "@babel/plugin-proposal-decorators": "^7.25.0 || ^8.0.0", + "@babel/plugin-syntax-jsx": "^7.25.0 || ^8.0.0", + "nuxt": "4.5.2", + "rolldown": "^1.0.0", + "rollup-plugin-visualizer": "^6.0.0 || ^7.0.1", + "vue": "^3.3.4" + }, + "peerDependenciesMeta": { + "@babel/plugin-proposal-decorators": { + "optional": true + }, + "@babel/plugin-syntax-jsx": { + "optional": true + }, + "rolldown": { + "optional": true + }, + "rollup-plugin-visualizer": { + "optional": true + } + } + }, + "node_modules/@nuxtjs/color-mode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@nuxtjs/color-mode/-/color-mode-4.0.1.tgz", + "integrity": "sha512-eiA7hWXi5zNHaYKyJFCGF6i0wFZtuvR7KDXZ6jiSvwxjCpRFwphrw0MOSmNfArTSSsT1wpW+/2H92cejeVfUlg==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^4.4.6", + "exsolve": "^1.0.8", + "pathe": "^2.0.3", + "pkg-types": "^2.3.1", + "semver": "^7.8.1" + } + }, + "node_modules/@nuxtjs/mdc": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@nuxtjs/mdc/-/mdc-0.23.1.tgz", + "integrity": "sha512-H+e/eO/Uj5Apb3YwFQs3X0e6HsIPYEm++/lEDFGuQCvPxUh89idhsZRnYQ5EQgAMge5uTS2hmSYIH4mX8xj+Hw==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^4.5.1", + "@shikijs/core": "^4.4.2", + "@shikijs/engine-javascript": "^4.4.2", + "@shikijs/langs": "^4.4.2", + "@shikijs/themes": "^4.4.2", + "@shikijs/transformers": "^4.4.2", + "@types/hast": "^3.0.5", + "@types/mdast": "^4.0.4", + "@vue/compiler-core": "^3.5.41", + "consola": "^3.4.2", + "debug": "^4.4.3", + "defu": "^6.1.7", + "destr": "^2.0.5", + "detab": "^3.0.2", + "github-slugger": "^2.0.0", + "hast-util-format": "^1.1.0", + "hast-util-to-mdast": "^10.1.2", + "hast-util-to-string": "^3.0.1", + "mdast-util-to-hast": "^13.2.1", + "micromark-util-sanitize-uri": "^2.0.1", + "parse5": "^8.0.1", + "pathe": "^2.0.3", + "property-information": "^7.2.0", + "rehype-external-links": "^3.0.0", + "rehype-minify-whitespace": "^6.0.2", + "rehype-raw": "^7.0.0", + "rehype-remark": "^10.0.1", + "rehype-slug": "^6.0.0", + "rehype-sort-attribute-values": "^5.0.1", + "rehype-sort-attributes": "^5.0.1", + "remark-emoji": "^5.0.2", + "remark-gfm": "^4.0.1", + "remark-mdc": "^3.11.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-stringify": "^11.0.0", + "scule": "^1.3.0", + "shiki": "^4.4.2", + "ufo": "^1.6.4", + "unified": "^11.0.5", + "unist-builder": "^4.0.0", + "unist-util-visit": "^5.1.0", + "unwasm": "^0.5.3", + "vfile": "^6.0.3" + } + }, + "node_modules/@nuxtjs/mdc/node_modules/@shikijs/engine-oniguruma": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.3.tgz", + "integrity": "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@nuxtjs/mdc/node_modules/shiki": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.4.3.tgz", + "integrity": "sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.4.3", + "@shikijs/engine-javascript": "4.4.3", + "@shikijs/engine-oniguruma": "4.4.3", + "@shikijs/langs": "4.4.3", + "@shikijs/themes": "4.4.3", + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@oxc-parser/binding-wasm32-wasi": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.139.0.tgz", + "integrity": "sha512-rNU0pO+/CVPC2qZ+xtX5R2cOje9Q75q3UkfgwUCPlplqxMv6Iffd5tMPGVMCLGnPINxPlmi0WPsW94HltbYvfQ==", + "cpu": [ + "wasm32" + ], + "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/@oxc-project/types": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", + "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@parcel/watcher-wasm": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.6.0.tgz", + "integrity": "sha512-dtjbDxKSDPQ8AmA+pS4OFaHE1FKrjtGpLGBxw85uKFkRorjNbvDM/aFPgqosu40wprbp1xw2ZSxIKqghCUHe2w==", + "bundleDependencies": [ + "napi-wasm" + ], + "license": "MIT", + "dependencies": { + "is-glob": "^4.0.3", + "napi-wasm": "^1.1.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-wasm/node_modules/napi-wasm": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@parcel/watcher-wasm/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@poppinss/colors": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", + "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", + "license": "MIT", + "dependencies": { + "kleur": "^4.1.5" + } + }, + "node_modules/@poppinss/dumper": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.7.0.tgz", + "integrity": "sha512-0UTYalzk2t6S4rA2uHOz5bSSW2CHdv4vggJI6Alg90yvl0UgXs6XSXpH96OH+bRkX4J/06djv29pqXJ0lq5Kag==", + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@sindresorhus/is": "^7.0.2", + "supports-color": "^10.0.0" + } + }, + "node_modules/@poppinss/dumper/node_modules/@sindresorhus/is": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@poppinss/exception": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", + "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.6.tgz", + "integrity": "sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.6.tgz", + "integrity": "sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.6.tgz", + "integrity": "sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.6.tgz", + "integrity": "sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.6.tgz", + "integrity": "sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.6.tgz", + "integrity": "sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.6.tgz", + "integrity": "sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.6.tgz", + "integrity": "sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.6.tgz", + "integrity": "sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.6.tgz", + "integrity": "sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.6.tgz", + "integrity": "sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.6.tgz", + "integrity": "sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.6.tgz", + "integrity": "sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.6.tgz", + "integrity": "sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.6.tgz", + "integrity": "sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@rollup/plugin-alias": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-6.0.0.tgz", + "integrity": "sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==", + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "rollup": ">=4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "29.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-29.0.3.tgz", + "integrity": "sha512-ZaOxZceP7SOUW7Lqw5IRVweSQYWaeIPnXIGLiB690EBA3FGJTO40EEr2L5yZplJWsgTCogILRSpcAe7+U0Otdg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "fdir": "^6.2.0", + "is-reference": "1.2.1", + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0 || 14 >= 14.17" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/plugin-inject": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", + "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-inject/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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz", + "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.3.tgz", + "integrity": "sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace/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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-1.0.0.tgz", + "integrity": "sha512-FnCxhTBx6bMOYQrar6C8h3scPt8/JwIzw3+AJ2K++6guogH5fYaIFia+zZuhqv0eo1RN7W1Pz630SyvLbDjhtQ==", + "license": "MIT", + "dependencies": { + "serialize-javascript": "^7.0.3", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.1.tgz", + "integrity": "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.1.tgz", + "integrity": "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.1.tgz", + "integrity": "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.1.tgz", + "integrity": "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.1.tgz", + "integrity": "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.1.tgz", + "integrity": "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.1.tgz", + "integrity": "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.1.tgz", + "integrity": "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.1.tgz", + "integrity": "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.1.tgz", + "integrity": "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.1.tgz", + "integrity": "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.1.tgz", + "integrity": "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.1.tgz", + "integrity": "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.1.tgz", + "integrity": "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.1.tgz", + "integrity": "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.1.tgz", + "integrity": "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.1.tgz", + "integrity": "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz", + "integrity": "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.1.tgz", + "integrity": "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.1.tgz", + "integrity": "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.1.tgz", + "integrity": "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.1.tgz", + "integrity": "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.1.tgz", + "integrity": "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.1.tgz", + "integrity": "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.1.tgz", + "integrity": "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.3.tgz", + "integrity": "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==", + "license": "MIT", + "dependencies": { + "@shikijs/primitive": "4.4.3", + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5", + "hast-util-to-html": "^9.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.3.tgz", + "integrity": "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.6" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", + "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/engine-oniguruma/node_modules/@shikijs/types": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", + "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/langs": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.3.tgz", + "integrity": "sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/primitive": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.3.tgz", + "integrity": "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/themes": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.3.tgz", + "integrity": "sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/transformers": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-4.4.3.tgz", + "integrity": "sha512-oJSARV6NaWd+rnNJbtnpAdj3Zg0ZVyzsnMgb3vi3HA+35y8lBWUCpOnWsmyiXZIikY+x1BDqrQUgmxfzWh7Jvw==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.4.3", + "@shikijs/types": "4.4.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/types": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.3.tgz", + "integrity": "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@simple-git/args-pathspec": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@simple-git/args-pathspec/-/args-pathspec-1.0.3.tgz", + "integrity": "sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==", + "license": "MIT" + }, + "node_modules/@simple-git/argv-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@simple-git/argv-parser/-/argv-parser-1.1.1.tgz", + "integrity": "sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==", + "license": "MIT", + "dependencies": { + "@simple-git/args-pathspec": "^1.0.3" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, + "node_modules/@speed-highlight/core": { + "version": "1.2.24", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.24.tgz", + "integrity": "sha512-qeW2e1l78afw8VhRPfPQ1Gjj+KU5XFQ/OFV5ti6eTa9bruO7mJyZtA4vw0ofqmA3tKCkROE9xLk3VZoeRc98nw==", + "license": "CC0-1.0" + }, + "node_modules/@sqlite.org/sqlite-wasm": { + "version": "3.53.0-build1", + "resolved": "https://registry.npmjs.org/@sqlite.org/sqlite-wasm/-/sqlite-wasm-3.53.0-build1.tgz", + "integrity": "sha512-PfWPWN2n+/37doa8oh2/oUXk4OOsRYZsxc1W1sDXIGb/Pu5Yrb+f2eyYpgQMGITVX7HVgxhs9P18Rc6I97ym/g==", + "license": "Apache-2.0", + "workspaces": [ + "demos/*" + ], + "engines": { + "node": ">=22" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", + "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.24.1", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "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/@tailwindcss/node/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" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/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" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/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" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/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" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/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" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/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" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/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" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/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" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/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" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/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" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/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" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "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.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.3.tgz", + "integrity": "sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "postcss": "^8.5.16", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz", + "integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.17.8", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.17.8.tgz", + "integrity": "sha512-BfEvehNpOT75r5Ksc5xW6NZuXujTfb7nlSEyVu4XHG3gdxNg1KqXruWbDewXOUaUYIo4oRbSfkjIajz4MAT8tA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/vue-table": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/vue-table/-/vue-table-8.21.3.tgz", + "integrity": "sha512-rusRyd77c5tDPloPskctMyPLFEQUeBzxdQ+2Eow4F7gDPlPOB1UnnhzfpdvqZ8ZyX2rRNGmqNnQWm87OI2OQPw==", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.21.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "vue": ">=3.2" + } + }, + "node_modules/@tanstack/vue-virtual": { + "version": "3.13.36", + "resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.13.36.tgz", + "integrity": "sha512-gKpExv4RbB9luVG+SucTXoqPZv/gzu/Yvz6BNO+8kpNxJ2x+I/ulryzl5W9BRciahZGp5Tls3Dp5XP1ztVGbMw==", + "license": "MIT", + "dependencies": { + "@tanstack/virtual-core": "3.17.8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.0.0" + } + }, + "node_modules/@tiptap/core": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.30.5.tgz", + "integrity": "sha512-3O7N0FyKIfuLV+xrdWyDM3V5eUY/q2CgLjhhMwOAbM1Pu7VPp9VP+TpEYOdH8aRyB+h1vj5hX5A747D8ZrPfHA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/pm": "3.30.5" + } + }, + "node_modules/@tiptap/extension-blockquote": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-3.30.5.tgz", + "integrity": "sha512-8pf1ZDrl6XlVPUee/2YlWZPFSF7yqsJEX6WLW41x06MT1dapG3Qudcns0znj6kYsX8JXTJ+Mhegy4z19bvTtRg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5", + "@tiptap/pm": "3.30.5" + } + }, + "node_modules/@tiptap/extension-bold": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-3.30.5.tgz", + "integrity": "sha512-MLZS+s/BJiJbv2C2M3G4FQGn43kPwYUUr2TiW3afSn+dRkEZlDxx5CwZYbe1PEt2+VX/SIifn945Oqr3s0axSA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5" + } + }, + "node_modules/@tiptap/extension-bubble-menu": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-3.30.5.tgz", + "integrity": "sha512-redcmBInVwmipjF/WEVcNwCUJgJygUv8leidfRb/jBSAwx7GgnQWPr2HVQDk9zeTt3ykWld2NRdrk94Crjymow==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5", + "@tiptap/pm": "3.30.5" + } + }, + "node_modules/@tiptap/extension-bullet-list": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-3.30.5.tgz", + "integrity": "sha512-66OGw4suO0Gr/4QAEiSvVi0eSvEqStvu1moHUSvUlwvEqnuB0ME2w9HuRogPElzWdrYLzbBA47mlCi9Veva0ew==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extension-list": "3.30.5" + } + }, + "node_modules/@tiptap/extension-code": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-3.30.5.tgz", + "integrity": "sha512-0dCt8eBo4sMtw+LjUu+0GF0JrTlREROdWoy8TM5kFPxJ5ZU2LKDiROXDPwXStaaoFFR/aStLH9xSpdz7cHUiUA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5" + } + }, + "node_modules/@tiptap/extension-code-block": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.30.5.tgz", + "integrity": "sha512-SvkNoOio2xBy9AtSMyFKMp88MTUvyIXsGCnuz71INV2wHdH4VfRPoQLT6e077LpTCa9w6LHyTKtbZA4HYOp7wg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5", + "@tiptap/pm": "3.30.5" + } + }, + "node_modules/@tiptap/extension-collaboration": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration/-/extension-collaboration-3.30.5.tgz", + "integrity": "sha512-LIw2JCPhAI7mWEfaPzct2WYAmSMuv4QPRQqX6AGtg6EcqLUj2N39ds6kBg5jgC7g8vGUNs8/lj5C/9SW0YrDyw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5", + "@tiptap/pm": "3.30.5", + "@tiptap/y-tiptap": "^3.0.7", + "yjs": "^13" + } + }, + "node_modules/@tiptap/extension-document": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.30.5.tgz", + "integrity": "sha512-4mKoD3bBr5W2AQ2Y/7amOqcVw0eqJbUwRtwvxypeo5Hi0PB9O5Ev8P05c3EUTo10bllqdKYXGeCU5AcgdQsHWQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5" + } + }, + "node_modules/@tiptap/extension-drag-handle": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-drag-handle/-/extension-drag-handle-3.30.5.tgz", + "integrity": "sha512-gCqZK31AkJ5qdvYcE/5zOsThKdHGNv4bNQHq/jAVikWOjsfF/3jE2XDc7SF+CTCgXZK4ssUg2H29RIhHVzESyA==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.6.13" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5", + "@tiptap/extension-collaboration": "3.30.5", + "@tiptap/extension-node-range": "3.30.5", + "@tiptap/pm": "3.30.5", + "@tiptap/y-tiptap": "^3.0.7" + } + }, + "node_modules/@tiptap/extension-drag-handle-vue-3": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-drag-handle-vue-3/-/extension-drag-handle-vue-3-3.30.5.tgz", + "integrity": "sha512-+cOFesVWeyHflOR85GEmHt/lijUJfrjRyqa3yl4mmtLOWfWYKYCNXd0SxIDOvQYH0xMzZ3uAPUgWyO5cZMDemg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extension-drag-handle": "3.30.5", + "@tiptap/pm": "3.30.5", + "@tiptap/vue-3": "3.30.5", + "vue": "^3.0.0" + } + }, + "node_modules/@tiptap/extension-dropcursor": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-3.30.5.tgz", + "integrity": "sha512-gJxn9PMUee8zazQBYqbOZiI7zTFXPVJ15AzTnLfUu4eDtPieMwtpgcjhCt4bZlp37drLm+Li76wWLirb7iLxsw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extensions": "3.30.5" + } + }, + "node_modules/@tiptap/extension-floating-menu": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-3.30.5.tgz", + "integrity": "sha512-gTjGPWUpGn8IoW533TciZJZC/81LmBgU7zee+aRMRF3ix3K2z1pJjl6knDvrRQA6Kom+yWFaiueqGNXkrk38XQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.0.0", + "@tiptap/core": "3.30.5", + "@tiptap/pm": "3.30.5" + } + }, + "node_modules/@tiptap/extension-gapcursor": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-3.30.5.tgz", + "integrity": "sha512-h3m2ZA1XXLAfdHwdtG0MZnf0KWbNyP8xTI3RUlTDR5apmKmYVBaeocOJwTcFFZ92gPKqxYKyhteZqYtHOCZGJA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extensions": "3.30.5" + } + }, + "node_modules/@tiptap/extension-hard-break": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-3.30.5.tgz", + "integrity": "sha512-PcL4Z8l/DlauwZUJg0jf6SXKk6/YOXJtd8yYzqHrmCLRoY4kAa7+TxUhc/lWhuitUiOZ8+nB8V/NNM+WR6mRaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5" + } + }, + "node_modules/@tiptap/extension-heading": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-3.30.5.tgz", + "integrity": "sha512-x7e7+p1bWXvwz6vqONPP1SVB73V0gZP7LIDL/5KMnxWLjahMTabgVPgjV30kz7GsOEgUYtEf7eCyGVGNNWL5Dg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5" + } + }, + "node_modules/@tiptap/extension-horizontal-rule": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-3.30.5.tgz", + "integrity": "sha512-s5t2xM6wPYRJl2cqYplc7Ze8m8xddk4DP2v0aLFcUuD100D1B5eJbxsiwLK6wBAzNwiuVjd486RnmUpcswaXhQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5", + "@tiptap/pm": "3.30.5" + } + }, + "node_modules/@tiptap/extension-image": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-3.30.5.tgz", + "integrity": "sha512-fETBsbSTaf5MLCGZaffHRRAFYUHeDIeITbnm7Q5Il+/LlX7PEiBZGKVyD/M3bIMpxhkyB0UlryIYGhC5LjN1Aw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5" + } + }, + "node_modules/@tiptap/extension-italic": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-3.30.5.tgz", + "integrity": "sha512-Fu9EuSRlHQNGES7UhY4mQod3yUKnWwxsGlPuDJURfwju/Ug04Jz8iRuERZBPcRgLNkwKDmbDsWUZF72RRIL2Uw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5" + } + }, + "node_modules/@tiptap/extension-link": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.30.5.tgz", + "integrity": "sha512-zsQ+q83HpCYOMTNzdjb12dggE7sZMp0aqQJhArdavSTl8hLbVY/u3qJN88t25IEwAKVK0pcTJfWWA2QFl8bjAQ==", + "license": "MIT", + "dependencies": { + "linkifyjs": "^4.3.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5", + "@tiptap/pm": "3.30.5" + } + }, + "node_modules/@tiptap/extension-list": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list/-/extension-list-3.30.5.tgz", + "integrity": "sha512-CHThihH+7TA0TfwtmA+eTXP1MAsA/+p011olJHg8Rilj5xA+L+0IFkjhN16JnZkBgSA4MnfEv15UMNfRaNpuVg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5", + "@tiptap/pm": "3.30.5" + } + }, + "node_modules/@tiptap/extension-list-item": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-3.30.5.tgz", + "integrity": "sha512-N0fKUyQkPQBvVB48imjfIfdexU9VsAX1RydajYP2xAt+QOJ8KHVmXv1EGTp+v7pGdZMLdls1cSZ2f352vW3aWQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extension-list": "3.30.5" + } + }, + "node_modules/@tiptap/extension-list-keymap": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-keymap/-/extension-list-keymap-3.30.5.tgz", + "integrity": "sha512-3pLR2yo29uhowaGMbD8v71XpgdNmqotBg1NXlyTMVFzxELj+VjjeLLTqSguR/iWDUbHXNzIsfMEgpRnNMO//8w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extension-list": "3.30.5" + } + }, + "node_modules/@tiptap/extension-mention": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-mention/-/extension-mention-3.30.5.tgz", + "integrity": "sha512-UFLZbue+GanPQgdDFbLWKnzd+ivWSSsfaFQGI2jj5jS6SNaMk0yAr5djiAmZEDMVfP3HmHpDwim9ZGzShYQPiQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5", + "@tiptap/pm": "3.30.5", + "@tiptap/suggestion": "3.30.5" + } + }, + "node_modules/@tiptap/extension-node-range": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-node-range/-/extension-node-range-3.30.5.tgz", + "integrity": "sha512-c66LBRn6d/t2sY8WqS0nlNxPIgyrHGesnoHbR3RhkliSb7+pf3e2b5Osxxjlx3sAziKdwpwuXcmyCoR98Iv/xg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5", + "@tiptap/pm": "3.30.5" + } + }, + "node_modules/@tiptap/extension-ordered-list": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-3.30.5.tgz", + "integrity": "sha512-bUGUnSAgjZhoUWBtr+1wRJHF3NnNvuKQr6sQ8le1tJ2yvLq448ZsSZjZGvTNeLsy3GDKBoMJ0rqLUK34+nM3hg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extension-list": "3.30.5" + } + }, + "node_modules/@tiptap/extension-paragraph": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.30.5.tgz", + "integrity": "sha512-GrNNlAImfQhYRtGE95YNAjcTclUUMPHs9JeE9vMgfcoKcOmZ6GsbWUdN0hA55xqwGaUjnroOVtf77K9z1EbkJQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5" + } + }, + "node_modules/@tiptap/extension-placeholder": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-3.30.5.tgz", + "integrity": "sha512-WgkX4ImAAeV+Qe7ATJ+Gio2MmKWON1CKpCKPHWgCObaoMEaSmdoxXPmI9wXMuM+AJydJepp4n7U/V4TVts14rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extensions": "3.30.5" + } + }, + "node_modules/@tiptap/extension-strike": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-3.30.5.tgz", + "integrity": "sha512-r8IbWUm4YXNCkmc6h6dzuREQIGbO0x9z9l3GfQPUR3LxFtGssDLngE4dFXHRt/ejLWKEauy6clklf7LawtvYzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5" + } + }, + "node_modules/@tiptap/extension-text": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.30.5.tgz", + "integrity": "sha512-pOgj4mIGFlw4NUdA6PCTFP/MHrYWnOYiZRYeu0I3/Yo3iN4Am/CgYBLl8PWsNh+YPO2hA2DWs7ZMke9D2j5R+g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5" + } + }, + "node_modules/@tiptap/extension-underline": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.30.5.tgz", + "integrity": "sha512-u12G/WW2uFRY95BzrSAU9RW002K+7lFpSCL6fb7Puh8yLhek3lddOtAx0P+NI/PyMKtcoVMtBxoi+0mwVM7NPQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5" + } + }, + "node_modules/@tiptap/extensions": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.30.5.tgz", + "integrity": "sha512-5x3OiCYBvXz0G5OGM8f7ka++1dh9EXdNRZ8IcMcEd+QwW4RPwvmJ2EjheA1eRRyMlcbNU7T+4IRlBXURlTetEA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5", + "@tiptap/pm": "3.30.5" + } + }, + "node_modules/@tiptap/markdown": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/markdown/-/markdown-3.30.5.tgz", + "integrity": "sha512-0yDt0AsiNHY0ZzlvELmzOmjfo55eJKV1euRYQp0aI5XPh+2YOdOm8cZqlhdHpJrN0wdrP/nVGxumsNmC/dqx4Q==", + "license": "MIT", + "dependencies": { + "marked": "^17.0.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.30.5", + "@tiptap/pm": "3.30.5" + } + }, + "node_modules/@tiptap/pm": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.30.5.tgz", + "integrity": "sha512-gufkLkW2tA6PZPjivYxDiGzTIIftwqhmYI6lvvKu2S4FbhcysJgMAe/GXVSywzCRVVex9SrvCe6RFYrqnwRitQ==", + "license": "MIT", + "dependencies": { + "prosemirror-changeset": "^2.4.1", + "prosemirror-commands": "^1.7.1", + "prosemirror-dropcursor": "^1.8.2", + "prosemirror-gapcursor": "^1.4.1", + "prosemirror-history": "^1.5.0", + "prosemirror-inputrules": "^1.5.1", + "prosemirror-keymap": "^1.2.3", + "prosemirror-model": "^1.25.11", + "prosemirror-schema-list": "^1.5.1", + "prosemirror-state": "^1.4.4", + "prosemirror-tables": "^1.8.5", + "prosemirror-transform": "^1.12.0", + "prosemirror-view": "^1.41.9" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/@tiptap/starter-kit": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-3.30.5.tgz", + "integrity": "sha512-cmDRvukpoqjQjhE96q+l3tCLNZZcJKehxK+00Sp9F4XbKecfM2QpZ2TRHh3vi8qhCeDQNyMoCqfNaqznIjLjIQ==", + "license": "MIT", + "dependencies": { + "@tiptap/core": "3.30.5", + "@tiptap/extension-blockquote": "3.30.5", + "@tiptap/extension-bold": "3.30.5", + "@tiptap/extension-bullet-list": "3.30.5", + "@tiptap/extension-code": "3.30.5", + "@tiptap/extension-code-block": "3.30.5", + "@tiptap/extension-document": "3.30.5", + "@tiptap/extension-dropcursor": "3.30.5", + "@tiptap/extension-gapcursor": "3.30.5", + "@tiptap/extension-hard-break": "3.30.5", + "@tiptap/extension-heading": "3.30.5", + "@tiptap/extension-horizontal-rule": "3.30.5", + "@tiptap/extension-italic": "3.30.5", + "@tiptap/extension-link": "3.30.5", + "@tiptap/extension-list": "3.30.5", + "@tiptap/extension-list-item": "3.30.5", + "@tiptap/extension-list-keymap": "3.30.5", + "@tiptap/extension-ordered-list": "3.30.5", + "@tiptap/extension-paragraph": "3.30.5", + "@tiptap/extension-strike": "3.30.5", + "@tiptap/extension-text": "3.30.5", + "@tiptap/extension-underline": "3.30.5", + "@tiptap/extensions": "3.30.5", + "@tiptap/pm": "3.30.5" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/@tiptap/suggestion": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-3.30.5.tgz", + "integrity": "sha512-kXlsY2GyXlVpYKp6uSedvvfACC4Phd0I8/Gp1/7ts8fYLlkVfGco6kgqOKHxT6HcUF1pGshxkDh9lfRCakkQEA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.0.0", + "@tiptap/core": "3.30.5", + "@tiptap/pm": "3.30.5" + } + }, + "node_modules/@tiptap/vue-3": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@tiptap/vue-3/-/vue-3-3.30.5.tgz", + "integrity": "sha512-YRHacQy09nFcokAScICxJ6pWr5daWbsLJuBiMo+DJQlr1XLi6o/zFhh3eR9+DKluL4OY3IZDYBYZfDs7YZtJNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "optionalDependencies": { + "@tiptap/extension-bubble-menu": "^3.30.5", + "@tiptap/extension-floating-menu": "^3.30.5" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.0.0", + "@tiptap/core": "3.30.5", + "@tiptap/pm": "3.30.5", + "vue": "^3.0.0" + } + }, + "node_modules/@tiptap/y-tiptap": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@tiptap/y-tiptap/-/y-tiptap-3.0.9.tgz", + "integrity": "sha512-7/El8NQ8R5V5MkdrOUdfj9IgZacpt0H071xNimX7B0AnYiWiKefQnMKd41neQYzo2MOXbWdN3iZ+7Z7BruzOSA==", + "license": "MIT", + "peer": true, + "dependencies": { + "lib0": "^0.2.100" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "prosemirror-model": "^1.7.1", + "prosemirror-state": "^1.2.3", + "prosemirror-view": "^1.9.10", + "y-protocols": "^1.0.1", + "yjs": "^13.5.38" + } + }, + "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==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.2.0.tgz", + "integrity": "sha512-NoQ2yGlLWj4wpxMs+TYmRKk3thDrQ97agr7sFqfLsAlvoS8SNQuTrlObhFqG9iugdTtgOE9jpJ6FNM4ZGsa5xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/parse-path": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/parse-path/-/parse-path-7.0.3.tgz", + "integrity": "sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==", + "license": "MIT" + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz", + "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==", + "license": "ISC" + }, + "node_modules/@unhead/bundler": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@unhead/bundler/-/bundler-3.4.0.tgz", + "integrity": "sha512-RnsCYynvDiUwmZ/U7TkFwFLr6yTRXVFJlZFj3ehi+m6M4f+GWL/O+6BTQzaHdz59zg2UHHejQvwuXvcL7dj0Dw==", + "license": "MIT", + "dependencies": { + "magic-string": "^1.1.0", + "oxc-walker": "^1.1.1", + "unplugin": "^3.3.0" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "@unhead/cli": "^3.4.0", + "@vitejs/devtools-kit": "^0.4.1", + "esbuild": ">=0.17.0", + "lightningcss": ">=1.20.0", + "oxc-parser": ">=0.98.0", + "rolldown": ">=1.0.0", + "unhead": "^3.4.0", + "vite": ">=6.4.2", + "webpack": ">=5.0.0" + }, + "peerDependenciesMeta": { + "@unhead/cli": { + "optional": true + }, + "@vitejs/devtools-kit": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "oxc-parser": { + "optional": true + }, + "rolldown": { + "optional": true + }, + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@unhead/vue": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-3.4.0.tgz", + "integrity": "sha512-fSnDS9d++bqR4t1z6+zFN7bQB5F0+5nwvE4yHW7BGRfEmssCP4fel0GprooUgoLkzx+FcAWMwVIakyaeErSRBA==", + "license": "MIT", + "dependencies": { + "@unhead/bundler": "3.4.0", + "hookable": "^6.1.1", + "unhead": "3.4.0", + "unplugin": "^3.3.0" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "vite": ">=6.4.2", + "vue": ">=3.5.18", + "webpack": ">=5.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@unhead/vue/node_modules/hookable": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.1.tgz", + "integrity": "sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==", + "license": "MIT" + }, + "node_modules/@vercel/nft": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-1.11.0.tgz", + "integrity": "sha512-m1QFg+U+3yPOnP1xSYJ73UIRxLOXdts1JOhiOiyPYqEsALgrXFFINvgUaD6R6iNvaBFAjHllBCbkfx4FuOdpaA==", + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^2.0.0", + "@rollup/pluginutils": "^5.1.3", + "acorn": "^8.6.0", + "acorn-import-attributes": "^1.9.5", + "async-sema": "^3.1.1", + "bindings": "^1.4.0", + "estree-walker": "2.0.2", + "glob": "^13.0.0", + "graceful-fs": "^4.2.9", + "node-gyp-build": "^4.2.2", + "picomatch": "^4.0.4", + "resolve-from": "^5.0.0" + }, + "bin": { + "nft": "out/cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vercel/nft/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.8.tgz", + "integrity": "sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew==", + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-5.1.6.tgz", + "integrity": "sha512-YXvi4as2clxt6DFw5+a0tTA97ntiQXm/raR8ofNj3aNwwdlVGTiG2gp7EvfZW17P50acL/9bP0ccF4XnqNmlgA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-syntax-typescript": "^7.29.7", + "@babel/plugin-transform-typescript": "^7.29.7", + "@rolldown/pluginutils": "^1.0.1", + "@vue/babel-plugin-jsx": "^2.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue-macros/common": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-3.1.4.tgz", + "integrity": "sha512-/5Fv+6DgIcM9ajY05ZmKBv+LMX1M9A0X+IUwDRVdt67ciw8OV9bvG2r34p3RiEadlsQybjhKPRKNXDC8Bp23cw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-sfc": "^3.5.22", + "ast-kit": "^2.1.2", + "local-pkg": "^1.1.2", + "magic-string-ast": "^1.0.2", + "unplugin-utils": "^0.3.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/vue-macros" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.2.25" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-2.0.1.tgz", + "integrity": "sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==", + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-2.0.1.tgz", + "integrity": "sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@vue/babel-helper-vue-transform-on": "2.0.1", + "@vue/babel-plugin-resolve-type": "2.0.1", + "@vue/shared": "^3.5.22" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-2.0.1.tgz", + "integrity": "sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.4", + "@vue/compiler-sfc": "^3.5.22" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.42.tgz", + "integrity": "sha512-2Ye1ilMtKXxl8qZUrQ5j0CdgenFp/HFQmta6rfRyfEsTG69L6Wk+tWuNoHYHMx9E8tF2Slvdg1FuwDvAXdy1LQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/shared": "3.5.42", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.42.tgz", + "integrity": "sha512-qbhQZEFmycr+ni/qyuccS4sucNN7VAbDfbkvNxWOX2VfgFm90MNs3/UhRNKoPMEIVn0F8gdlYjLPvqxHwHeQOA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.42", + "@vue/shared": "3.5.42" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.42.tgz", + "integrity": "sha512-fkCAFB4okcAANGMThboWnScp/gzWjU0ZSkVnjTIiplmMDq2uq0tIB3j+xVu4rhv5rvOgBySCysudmbMd6xRRqw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/compiler-core": "3.5.42", + "@vue/compiler-dom": "3.5.42", + "@vue/compiler-ssr": "3.5.42", + "@vue/shared": "3.5.42", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.19", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-sfc/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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.42.tgz", + "integrity": "sha512-xmLk3wLkbizPAiLyomjgFFosf2ys9b5Ghb+oh/k2tnvipNz8OFrQOiTcWCzyK7MpBp9KkyGtfvgfLUivbmuGYA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.42", + "@vue/shared": "3.5.42" + } + }, + "node_modules/@vue/devtools-api": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.2.1.tgz", + "integrity": "sha512-6u4vXBlIBAC1wMplIZgpyPn7uh/s4Bf6F5bMzvLv+EdJ0aHs/+4B7Ygv864EStQSjRbsRzTko/kUG1A1IejQ3A==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.2.1" + } + }, + "node_modules/@vue/devtools-core": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-8.2.1.tgz", + "integrity": "sha512-s/VfAY9oDTb/kFEWmy461jaFde2MIV1RO/gi1vwM+PAZBZ/Pc2Ndu3BNBdZUze8QDUuyYvElbEEGA83syjJfzA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.2.1", + "@vue/devtools-shared": "^8.2.1" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.2.1.tgz", + "integrity": "sha512-FIGIuq3AWReEpbAHY/cRGeHDfI0qOb8OCQ3YjbEAX04uaxIDbGc9rhkbVcG7rnfHPXE3RsU5KrWOu9V/okd8AQ==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.2.1", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "perfect-debounce": "^2.0.0" + } + }, + "node_modules/@vue/devtools-kit/node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.2.1.tgz", + "integrity": "sha512-Fkac7lUdGReh6pVOi3AYPRGe82LQqRmAfThW7RRligOAP0ZA/Z1z9XLHDM9dv34pV2HRc79DK8uKPeG2fLnA/g==", + "license": "MIT" + }, + "node_modules/@vue/language-core": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.3.11.tgz", + "integrity": "sha512-QJmpliwAVpC/OxubIByPAhNzsQPRc8/gxlN2qnVzVfIMjMDz/9RnXRFoetjz5yEgXVXyp4LqhXq3V53PjmNzFw==", + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "@vue/compiler-dom": "^3.5.0", + "@vue/shared": "^3.5.0", + "alien-signals": "^3.2.1", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1", + "picomatch": "^4.0.4" + } + }, + "node_modules/@vue/language-core/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.42.tgz", + "integrity": "sha512-TzNNfKpb7hDxbQltwAut8VDQA5YP+BuRlxntHUuRjyKwlMvmAPbs3unhCvieijifY6vFfVBwsS7wG/C7uq+bEQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.42" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.42.tgz", + "integrity": "sha512-9uACtuHs7vJGkm5Bp3xu4xRDLFTIYy5DgxpToVjqGIAhAEKwQfsaLvKINhM6nFVp6bZPRFGdDqd1g52MqKsotA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.42", + "@vue/shared": "3.5.42" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.42.tgz", + "integrity": "sha512-rsCmhiWLaRxGltLwhlCWyYkFn7WAbKRh0q17eZ1A6Dq6eqc2ACQ61IIryxz0LrsvCzHSilLA9JHovVwM8CNE2g==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.42", + "@vue/runtime-core": "3.5.42", + "@vue/shared": "3.5.42", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.42.tgz", + "integrity": "sha512-2++5dUyYS4gvo7xQXSECUDhB7TS0aOl5SeVfC5qSq1Jgfhjvegw1zqhwTIR3imZ+QYPJQw9gfcFvXGAjGZ7ajQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.42", + "@vue/runtime-dom": "3.5.42", + "@vue/shared": "3.5.42" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.42.tgz", + "integrity": "sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==", + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.4.0.tgz", + "integrity": "sha512-X4WHz1HlCzCBoYXesUkifzzWBAcZgXG8Fi5iNPQg/epdzOB3gu8Fawj3hvuwYR1nGcXGnvxwYYcUC/71++svtQ==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "14.4.0", + "@vueuse/shared": "14.4.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/integrations": { + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-14.4.0.tgz", + "integrity": "sha512-oJz9qTgczvA7L1nXQFRU7h8tQbOCoiceqvMMhT9XYMyOGTqLJ2rEa09PON+nD2t48sZUfeOmg4eaWJXV4sZb/w==", + "license": "MIT", + "dependencies": { + "@vueuse/core": "14.4.0", + "@vueuse/shared": "14.4.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7 || ^8", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7 || ^8", + "vue": "^3.5.0" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.4.0.tgz", + "integrity": "sha512-swx/255R6JyHZFJhx845iz5CRWDZdCfvkZOpACWc5+c5WHcG24mv8gUT1WIdFQaHt6dq79rvILd9QnCWiyVm9g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.4.0.tgz", + "integrity": "sha512-JRgY90Sz8DDtPMsaDflvPMp9xYk69JZAmbuDvAquUVXKr2gEjqtzGNTTthLfckH0BzBqvnu31gb4a8TGLRe79g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@webcontainer/env": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webcontainer/env/-/env-1.1.1.tgz", + "integrity": "sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==", + "license": "MIT" + }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "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.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "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/alien-signals": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.2.1.tgz", + "integrity": "sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g==", + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.3.1.tgz", + "integrity": "sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "license": "MIT", + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/archiver-utils/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/archiver-utils/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/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/archiver-utils/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/archiver-utils/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.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/ast-kit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz", + "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "pathe": "^2.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/ast-walker-scope": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.9.0.tgz", + "integrity": "sha512-IJdzo2vLiElBxKzwS36VsCue/62d6IdWjnPB2v3nuPKeWGynp6FF/CYoLa5i/3jXH/z97ZDdsXz6abpgM6w07A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.2", + "@babel/types": "^7.29.0", + "ast-kit": "^2.2.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/async-lock": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", + "license": "MIT" + }, + "node_modules/async-sema": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", + "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.5.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.4.tgz", + "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.6", + "caniuse-lite": "^1.0.30001806", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/b4a": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", + "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/bare-events": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.2.tgz", + "integrity": "sha512-AIPKioV7/Y/8KfZ3AAhjPJxLLbY49S64Ym5DakZlUg75qQiTgUq9hEJoEwa4eUezPUlXRy/i5NpsKvo9jgKmoA==", + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.8.1.tgz", + "integrity": "sha512-N1nnXdHZAOSstz0XiHikGS4HGMH4CnSwhqWdGQQMqqdvp4Jybm9sE3R1WVnpWVd4SFkc8ryPDBLViNLwiEqECg==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.28.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.1.1.tgz", + "integrity": "sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==", + "license": "Apache-2.0" + }, + "node_modules/bare-stream": { + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.4.tgz", + "integrity": "sha512-PcrQ8lVLbiJscNm1Kez+Yp4Gy4AHGcN1lzwjvf5NybWen7VvEgUfyfnXYJ2zNqWnzOfCb1Abq6lH8ti0syQszA==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.8.1", + "streamx": "^2.25.0", + "teex": "^1.0.1" + }, + "peerDependencies": { + "bare-abort-controller": "*", + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + }, + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.5.2.tgz", + "integrity": "sha512-L13PCJzKG8RGvx8V1/DdMi12ERhC3tprr7/8a94BxpmnRsFqxh5XZNdhtMxu5HPkRshYOOWRGY8lDP7ZhpG9Cg==", + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "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/baseline-browser-mapping": { + "version": "2.11.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz", + "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/better-sqlite3": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-13.0.3.tgz", + "integrity": "sha512-RbOBxmLBG8uvFUc15X9+9SFemKcQ0WBuISBVkpuiaUB2qblC8UWlHEjdWVoZ8AdhSwmoEgsiXKfopX0CQxaACQ==", + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.0.0" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/birpc": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-4.2.0.tgz", + "integrity": "sha512-KxgKcZPfrtzJDDALHPguGpGJUrzdgpymyiQQgzFjWreHMOpWrnFNVREr5J48x2DBh8ZVioscrV1SBkDipGiX+Q==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/c12": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.3.4.tgz", + "integrity": "sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==", + "license": "MIT", + "dependencies": { + "chokidar": "^5.0.0", + "confbox": "^0.2.4", + "defu": "^6.1.6", + "dotenv": "^17.3.1", + "exsolve": "^1.0.8", + "giget": "^3.2.0", + "jiti": "^2.6.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^2.1.0", + "pkg-types": "^2.3.0", + "rc9": "^3.0.1" + }, + "peerDependencies": { + "magicast": "*" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/caniuse-api": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-4.0.0.tgz", + "integrity": "sha512-B0hQ1OLyJuHTQSOWXvwibWqM6DCoqJdvBA6X1S/53bd4XU7LJ1yurIPlrsouol3mw1jh9pGI4ivubSpmJeIqCA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/citty": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz", + "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==", + "license": "MIT" + }, + "node_modules/clean-git-ref": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", + "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==", + "license": "Apache-2.0" + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz", + "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colortranslator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/colortranslator/-/colortranslator-5.0.0.tgz", + "integrity": "sha512-Z3UPUKasUVDFCDYAjP2fmlVRf1jFHJv1izAmPjiOa0OCIw1W7iC8PZ2GsoDa8uZv+mKyWopxxStT9q05+27h7w==", + "license": "Apache-2.0" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "license": "MIT" + }, + "node_modules/compatx": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/compatx/-/compatx-0.2.0.tgz", + "integrity": "sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==", + "license": "MIT" + }, + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/compress-commons/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/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/cookie-es": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz", + "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/croner": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/croner/-/croner-10.0.1.tgz", + "integrity": "sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==", + "funding": [ + { + "type": "other", + "url": "https://paypal.me/hexagonpp" + }, + { + "type": "github", + "url": "https://github.com/sponsors/hexagon" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-select": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", + "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^7.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "nth-check": "^2.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", + "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-8.0.10.tgz", + "integrity": "sha512-aMlBsvQW5g1b8vfPnkuy5Bk7g/jyRsf5eMpbhe4nKnePx+n2IrC0L6dFqnd3r4/OGNIYGEHfAt09oywi84fWKQ==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^8.0.10", + "lilconfig": "^3.1.3" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/cssnano-preset-default": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-8.0.10.tgz", + "integrity": "sha512-34uq3q7OXgmfxXn+MHTgIqysCLH7zRZZUMAwrBiO09F5/KLVD33iDFNRRUNYStKdj0SaAIUVr6Akao2Fpp0aVA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.8", + "cssnano-utils": "^6.0.4", + "postcss-calc": "^10.1.1", + "postcss-colormin": "^8.0.5", + "postcss-convert-values": "^8.0.4", + "postcss-discard-comments": "^8.0.4", + "postcss-discard-duplicates": "^8.0.4", + "postcss-discard-empty": "^8.0.5", + "postcss-discard-overridden": "^8.0.4", + "postcss-merge-longhand": "^8.0.4", + "postcss-merge-rules": "^8.0.5", + "postcss-minify-font-values": "^8.0.4", + "postcss-minify-gradients": "^8.0.6", + "postcss-minify-params": "^8.0.4", + "postcss-minify-selectors": "^8.0.5", + "postcss-normalize-charset": "^8.0.5", + "postcss-normalize-display-values": "^8.0.4", + "postcss-normalize-positions": "^8.0.4", + "postcss-normalize-repeat-style": "^8.0.4", + "postcss-normalize-string": "^8.0.4", + "postcss-normalize-timing-functions": "^8.0.4", + "postcss-normalize-unicode": "^8.0.4", + "postcss-normalize-url": "^8.0.4", + "postcss-normalize-whitespace": "^8.0.5", + "postcss-ordered-values": "^8.0.5", + "postcss-reduce-initial": "^8.0.5", + "postcss-reduce-transforms": "^8.0.4", + "postcss-svgo": "^8.0.6", + "postcss-unique-selectors": "^8.0.4" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/cssnano-utils": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-6.0.4.tgz", + "integrity": "sha512-j1z2mW4MqtcGM4I8TxXAdOXUifp1DZ5/bZnyYnCpHlzQ/ilCj2voLxE0aqEKnBDA5hF6HahSY13JU8kyZ1s8Mg==", + "license": "MIT", + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "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==", + "license": "MIT" + }, + "node_modules/db0": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/db0/-/db0-0.4.0.tgz", + "integrity": "sha512-2aitWuWdOGUGQdO8oiSdQIRXpiQmYt6CnB1WoAQ1HtBkk26JyvUnSFnT477fG/8n6+QabQUKJDP3KH8njHoocw==", + "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/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz", + "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "license": "MIT" + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/detab": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/detab/-/detab-3.0.2.tgz", + "integrity": "sha512-7Bp16Bk8sk0Y6gdXiCtnpGbghn8atnTJdd/82aWvS5ESnlcNvgUc10U2NYS0PAiDSGjWiI8qs/Cv1b2uSGdQ8w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.9.2.tgz", + "integrity": "sha512-po4PAY5c53tw5XMocSnf8A/5OHhbbUftpr93aEN6BBoAdntUmK7vu7wOATqvt7cXO7m1Cl4gMVn6p7n6n4mj0w==", + "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==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff3": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", + "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==", + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-prop": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-10.2.0.tgz", + "integrity": "sha512-BTJ9aZYL3vCfZlZOBLy9v8TUqWGQ0pzFnygKwFZt5udj6viBoFIBviKPUoZLDCPn1FoXffv6McQFDenrm5Krfw==", + "license": "MIT", + "dependencies": { + "type-fest": "^5.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.416", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.416.tgz", + "integrity": "sha512-K6bvB2BjnNrugtIih6ewlbBI9DXa976jIdiIlRLHhBoEI9a4JaQjjHyF+A1IQI543aQYR4LnmOrT/K5fZj0aPA==", + "license": "ISC" + }, + "node_modules/embla-carousel": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", + "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==", + "license": "MIT" + }, + "node_modules/embla-carousel-auto-height": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-auto-height/-/embla-carousel-auto-height-8.6.0.tgz", + "integrity": "sha512-/HrJQOEM6aol/oF33gd2QlINcXy3e19fJWvHDuHWp2bpyTa+2dm9tVVJak30m2Qy6QyQ6Fc8DkImtv7pxWOJUQ==", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "node_modules/embla-carousel-auto-scroll": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-auto-scroll/-/embla-carousel-auto-scroll-8.6.0.tgz", + "integrity": "sha512-WT9fWhNXFpbQ6kP+aS07oF5IHYLZ1Dx4DkwgCY8Hv2ZyYd2KMCPfMV1q/cA3wFGuLO7GMgKiySLX90/pQkcOdQ==", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "node_modules/embla-carousel-autoplay": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-autoplay/-/embla-carousel-autoplay-8.6.0.tgz", + "integrity": "sha512-OBu5G3nwaSXkZCo1A6LTaFMZ8EpkYbwIaH+bPqdBnDGQ2fh4+NbzjXjs2SktoPNKCtflfVMc75njaDHOYXcrsA==", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "node_modules/embla-carousel-class-names": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-class-names/-/embla-carousel-class-names-8.6.0.tgz", + "integrity": "sha512-l1hm1+7GxQ+zwdU2sea/LhD946on7XO2qk3Xq2XWSwBaWfdgchXdK567yzLtYSHn4sWYdiX+x4nnaj+saKnJkw==", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "node_modules/embla-carousel-fade": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-fade/-/embla-carousel-fade-8.6.0.tgz", + "integrity": "sha512-qaYsx5mwCz72ZrjlsXgs1nKejSrW+UhkbOMwLgfRT7w2LtdEB03nPRI06GHuHv5ac2USvbEiX2/nAHctcDwvpg==", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "node_modules/embla-carousel-reactive-utils": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.6.0.tgz", + "integrity": "sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "node_modules/embla-carousel-vue": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-vue/-/embla-carousel-vue-8.6.0.tgz", + "integrity": "sha512-v8UO5UsyLocZnu/LbfQA7Dn2QHuZKurJY93VUmZYP//QRWoCWOsionmvLLAlibkET3pGPs7++03VhJKbWD7vhQ==", + "license": "MIT", + "dependencies": { + "embla-carousel": "8.6.0", + "embla-carousel-reactive-utils": "8.6.0" + }, + "peerDependencies": { + "vue": "^3.2.37" + } + }, + "node_modules/embla-carousel-wheel-gestures": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/embla-carousel-wheel-gestures/-/embla-carousel-wheel-gestures-8.1.0.tgz", + "integrity": "sha512-J68jkYrxbWDmXOm2n2YHl+uMEXzkGSKjWmjaEgL9xVvPb3HqVmg6rJSKfI3sqIDVvm7mkeTy87wtG/5263XqHQ==", + "license": "MIT", + "dependencies": { + "wheel-gestures": "^2.2.5" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "embla-carousel": "^8.0.0 || ~8.0.0-rc03" + } + }, + "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/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" + }, + "node_modules/emoticon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io-client": { + "version": "6.6.6", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.6.tgz", + "integrity": "sha512-iY6QdftLQ9pyiPoX082bpf/u1UewnOaJrtJIF9T0++QB34lZrj0uP+Q/bj8AlUsAxqhnkTV2BS8SBZSxOmoV5Q==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.21.0", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-stack-parser-es": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-2.0.1.tgz", + "integrity": "sha512-J36ntO+rMQVRuR/umlmxmfLi4TpWwtmTnHoJoXTiC2xDNazs0VDPKcX6pbhZMDd2HFtH9isMBJXMdbki+A++Pg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/errx": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/errx/-/errx-0.1.2.tgz", + "integrity": "sha512-chfpPHmCerdo/rXr/nNvPZRkV4WwDRwzwnsJ0Uzz3tVi8Z41tDctRjduYy1138ii77AFlts1qvWtX3g/Acg91Q==", + "license": "MIT" + }, + "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.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exsolve": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz", + "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==", + "license": "MIT" + }, + "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-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-npm-meta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/fast-npm-meta/-/fast-npm-meta-2.2.0.tgz", + "integrity": "sha512-99jPl8JkCSCa4VlboNU1XuL98ijm74Pm9CGo6H4BoMVoVh1uhguQcvwLgXDT8Vkl2qj/UEQ0J9gD8beHjTFk1w==", + "license": "MIT", + "dependencies": { + "cac": "^7.0.0" + }, + "bin": { + "fast-npm-meta": "dist/cli.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/fast-npm-meta/node_modules/cac": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cac/-/cac-7.0.0.tgz", + "integrity": "sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==", + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/fast-string-truncated-width": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", + "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "license": "MIT" + }, + "node_modules/fast-string-width": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", + "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "license": "MIT", + "dependencies": { + "fast-string-truncated-width": "^3.0.2" + } + }, + "node_modules/fast-wrap-ansi": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", + "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", + "license": "MIT", + "dependencies": { + "fast-string-width": "^3.0.2" + } + }, + "node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-6.0.1.tgz", + "integrity": "sha512-/3FfIa8mbrg3xE7+wAhWeV+bd7L2Mof+xtZb5dRDKZ+wDvYJK4WDYeIOuOhre5Yv5aQObZrlbRmk3RTSiuQBtw==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/fnv1a-64": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/fnv1a-64/-/fnv1a-64-0.1.2.tgz", + "integrity": "sha512-mJbcILTPybAR1jdOwt/lVv8N2cffeJFFP+gVbSAwLEx1ujXH27RpPd8Rokec/KX9c76UYIB6Co+H4lQzxPnJfA==", + "license": "MIT" + }, + "node_modules/fontaine": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/fontaine/-/fontaine-0.8.0.tgz", + "integrity": "sha512-eek1GbzOdWIj9FyQH/emqW1aEdfC3lYRCHepzwlFCm5T77fBSRSyNRKE6/antF1/B1M+SfJXVRQTY9GAr7lnDg==", + "license": "MIT", + "dependencies": { + "@capsizecss/unpack": "^4.0.0", + "css-tree": "^3.1.0", + "magic-regexp": "^0.10.0", + "magic-string": "^0.30.21", + "pathe": "^2.0.3", + "ufo": "^1.6.1", + "unplugin": "^2.3.10" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/fontaine/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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/fontaine/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/fontaine/node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/fontkitten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.3.tgz", + "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==", + "license": "MIT", + "dependencies": { + "tiny-inflate": "^1.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/fontless": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fontless/-/fontless-0.2.1.tgz", + "integrity": "sha512-mUWZ8w91/mw2KEcZ6gHNoNNmsAq9Wiw2IypIux5lM03nhXm+WSloXGUNuRETNTLqZexMgpt7Aj/v63qqrsWraQ==", + "license": "MIT", + "dependencies": { + "consola": "^3.4.2", + "css-tree": "^3.1.0", + "defu": "^6.1.4", + "esbuild": "^0.27.0", + "fontaine": "0.8.0", + "jiti": "^2.6.1", + "lightningcss": "^1.30.2", + "magic-string": "^0.30.21", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "ufo": "^1.6.1", + "unifont": "^0.7.4", + "unstorage": "^1.17.1" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/fontless/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/fontless/node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" + } + }, + "node_modules/fontless/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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/framer-motion": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-13.1.1.tgz", + "integrity": "sha512-B/xn2TPS4f61cEBLFjiYlQFnBZUW1YVj/LM+C+N4OP8Rs95VLEI2ot/RlfBg111la/EiyECFaJJi/A3FWA8MUA==", + "license": "MIT", + "dependencies": { + "motion-dom": "^13.1.1", + "motion-utils": "^13.0.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuse.js": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.5.0.tgz", + "integrity": "sha512-sQtrEfA+ez/3G0cCZecF70oqpCRttCexYUG4mUrtWL49ULUzUyxokt5kyqwtKzj1270RaKih+hcP3qLcumccow==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/krisk" + } + }, + "node_modules/fzf": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fzf/-/fzf-0.5.2.tgz", + "integrity": "sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==", + "license": "BSD-3-Clause" + }, + "node_modules/generic-names": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", + "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", + "license": "MIT", + "dependencies": { + "loader-utils": "^3.2.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port-please": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.2.0.tgz", + "integrity": "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==", + "license": "MIT" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/giget": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/giget/-/giget-3.3.1.tgz", + "integrity": "sha512-r+mvuDjrjMpsdw46Kmeydb8bdHm7wOKw8wNBtTndkjbPjgAp5oUJUxRE76wZFknxIPokfWvep2qSXK37aXE6zg==", + "license": "MIT", + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/git-up": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-8.1.1.tgz", + "integrity": "sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==", + "license": "MIT", + "dependencies": { + "is-ssh": "^1.4.0", + "parse-url": "^9.2.0" + } + }, + "node_modules/git-url-parse": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-16.1.0.tgz", + "integrity": "sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==", + "license": "MIT", + "dependencies": { + "git-up": "^8.1.0" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, + "node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "license": "MIT", + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "16.2.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.4.tgz", + "integrity": "sha512-c8B/VNLmxRcmqqenRA9t+9IyOjf9+V6lTxPaUJLqOCONdQkWZ0ETYgX0qbtJqPsgCNusT9MZ5Jeidw8Eb9tn2g==", + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.5", + "is-path-inside": "^4.0.0", + "micromatch": "^4.0.8", + "slash": "^5.1.0", + "unicorn-magic": "^0.4.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/gzip-size": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-7.0.0.tgz", + "integrity": "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/h3": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz", + "integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==", + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.3", + "crossws": "^0.3.5", + "defu": "^6.1.6", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.4", + "radix3": "^1.1.2", + "ufo": "^1.6.3", + "uncrypto": "^0.1.3" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-embedded": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-format": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz", + "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "html-whitespace-sensitive-tag-names": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-heading-rank": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz", + "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-body-ok-link": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", + "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-minify-whitespace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", + "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/hast-util-raw/node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-mdast": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/hast-util-to-mdast/-/hast-util-to-mdast-10.1.2.tgz", + "integrity": "sha512-FiCRI7NmOvM4y+f5w32jPRzcxDIz+PUqDwEqn1A+1q2cdp3B8Gx7aVrXORdOKjMNDQsD1ogOr896+0jJHW1EFQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "hast-util-to-text": "^4.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-minify-whitespace": "^6.0.0", + "trim-trailing-lines": "^2.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==", + "license": "MIT" + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-whitespace-sensitive-tag-names": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", + "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-shutdown": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz", + "integrity": "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==", + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "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/httpxy": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/httpxy/-/httpxy-0.5.5.tgz", + "integrity": "sha512-uDjmnPyp1q4Sgzf3w+J/Fc6UqcCEj0x4Wjp7OqK5dGhNeDgpyrAmnS6ey8QWrX3SWDon2DMKf9sBa5X9+CVyMA==", + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.7.tgz", + "integrity": "sha512-dML0wP6oak21rsNYCJpJB6O1BJIEwNpGrTw0URPfAk4hm0e3pRfCtzkfB6olBcXcVlU2rouCyz7lCyRB0OMVCA==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-meta": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/image-meta/-/image-meta-0.2.2.tgz", + "integrity": "sha512-3MOLanc3sb3LNGWQl1RlQlNWURE5g32aUphrDyFeCsxBTk08iE3VNe4CwsUZ0Qs1X+EfX0+r29Sxdpza4B+yRA==", + "license": "MIT" + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/impound": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/impound/-/impound-1.2.0.tgz", + "integrity": "sha512-hbFh2WURN+XQ364SbblzubhEEj/B3qZCe80l/EHXPWM6/kZP2mvOllxwRBBWNxe4gLbqXZL0fxOZwoDCSlJZQw==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "es-module-lexer": "^2.0.0", + "pathe": "^2.0.3", + "unplugin": "^3.0.0", + "unplugin-utils": "^0.3.1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ioredis": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.11.1.tgz", + "integrity": "sha512-ehuGcf94bQXhfagULNXrJdfnWO38v070jxSx/qE87Kjzmu2fU7ro5EFAb+OPituLqgfyuQaym5DlrNydW2sJ9A==", + "license": "MIT", + "dependencies": { + "@ioredis/commands": "1.10.0", + "cluster-key-slot": "1.1.1", + "debug": "4.4.3", + "denque": "2.1.0", + "redis-errors": "1.2.0", + "redis-parser": "3.0.0", + "standard-as-callback": "2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", + "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", + "license": "MIT", + "dependencies": { + "global-directory": "^4.0.1", + "is-path-inside": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-ssh": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", + "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", + "license": "MIT", + "dependencies": { + "protocols": "^2.0.1" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/isomorphic-git": { + "version": "1.41.9", + "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.41.9.tgz", + "integrity": "sha512-WOh4ujm5mznHphzQvwj9bVj+pQpV0oZ8H4lAnh4dSaie+lN/lJ2rb6rNOOcP+2m4z8IOQp186TkEULD28NMBJg==", + "license": "MIT", + "dependencies": { + "async-lock": "^1.4.1", + "clean-git-ref": "^2.0.1", + "crc-32": "^1.2.0", + "diff3": "0.0.3", + "ignore": "^5.1.4", + "minimisted": "^2.0.0", + "pako": "^1.0.10", + "pify": "^4.0.1", + "readable-stream": "^4.0.0", + "sha.js": "^2.4.12", + "simple-get": "^4.0.1" + }, + "bin": { + "isogit": "cli.cjs" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/isomorphic-git/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/isomorphic.js": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", + "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", + "license": "MIT", + "peer": true, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "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==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-schema-to-typescript-lite": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript-lite/-/json-schema-to-typescript-lite-15.0.0.tgz", + "integrity": "sha512-5mMORSQm9oTLyjM4mWnyNBi2T042Fhg1/0gCIB6X8U/LVpM2A+Nmj2yEyArqVouDmFThDxpEXcnTgSrjkGJRFA==", + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^14.1.1", + "@types/json-schema": "^7.0.15" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/knitwork": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/knitwork/-/knitwork-1.3.0.tgz", + "integrity": "sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw==", + "license": "MIT" + }, + "node_modules/launch-editor": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz", + "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.4" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lib0": { + "version": "0.2.117", + "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.117.tgz", + "integrity": "sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw==", + "license": "MIT", + "peer": true, + "dependencies": { + "isomorphic.js": "^0.2.4" + }, + "bin": { + "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js", + "0gentesthtml": "bin/gentesthtml.js", + "0serve": "bin/0serve.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "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.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/linkify-it": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", + "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/linkifyjs": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.3.3.tgz", + "integrity": "sha512-P8aEP5U/D1/IlTY2OeYsErdwh9bGuLE30NcXtKEjgdHcahveQoQwM2yZNsioQHsWFz0P7KKudisbrzCgR0sDHg==", + "license": "MIT" + }, + "node_modules/listhen": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.10.1.tgz", + "integrity": "sha512-6nt/86SkqUQSLW1ofz8MxC6RhRMqOl3ONISe6qqvJ3xj09aJWQx6DhgSZpugs3PX4PXdOas/WD6A9jx6J2N19A==", + "license": "MIT", + "dependencies": { + "@parcel/watcher-wasm": "^2.5.6", + "citty": "^0.2.2", + "consola": "^3.4.2", + "crossws": "^0.4.10", + "defu": "^6.1.7", + "get-port-please": "^3.2.0", + "h3": "^1.15.11", + "http-shutdown": "^1.2.2", + "jiti": "^2.7.0", + "node-forge": "^1.4.0", + "pathe": "^2.0.3", + "std-env": "^4.2.0", + "tinyclip": "^0.1.15", + "ufo": "^1.6.4", + "untun": "^0.2.2", + "uqr": "^0.1.3" + }, + "bin": { + "listen": "bin/listhen.mjs", + "listhen": "bin/listhen.mjs" + }, + "peerDependencies": { + "@parcel/watcher": "^2.5.6" + }, + "peerDependenciesMeta": { + "@parcel/watcher": { + "optional": true + } + } + }, + "node_modules/listhen/node_modules/crossws": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.4.12.tgz", + "integrity": "sha512-aypfsr6t0uNvkqaZc6zvBfXzC6pLI0/sIulpkV6RwCVtZqG5ebBzv4weImKK0VNCj91Wl9F5j7p5WU4MNrybng==", + "license": "MIT", + "peerDependencies": { + "srvx": ">=0.11.5" + }, + "peerDependenciesMeta": { + "srvx": { + "optional": true + } + } + }, + "node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/local-pkg": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz", + "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-regexp": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/magic-regexp/-/magic-regexp-0.10.0.tgz", + "integrity": "sha512-Uly1Bu4lO1hwHUW0CQeSWuRtzCMNO00CmXtS8N6fyvB3B979GOEEeAkiTUDsmbYLAbvpUS/Kt5c4ibosAzVyVg==", + "license": "MIT", + "dependencies": { + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12", + "mlly": "^1.7.2", + "regexp-tree": "^0.1.27", + "type-level-regexp": "~0.1.17", + "ufo": "^1.5.4", + "unplugin": "^2.0.0" + } + }, + "node_modules/magic-regexp/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/magic-regexp/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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magic-regexp/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/magic-regexp/node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/magic-string": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.2.3.tgz", + "integrity": "sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magic-string-ast": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-1.0.3.tgz", + "integrity": "sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==", + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.19" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/magic-string-ast/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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.4.tgz", + "integrity": "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "source-map-js": "^1.2.1" + } + }, + "node_modules/markdown-it": { + "version": "14.3.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.1.tgz", + "integrity": "sha512-4Ej49aYTDFIQ+uBkfX8GBvJGccoARxxPep+7aWTs55ozbjQJpW9M26Fe53vnGgvLeVzva/amzjQQaQu9w0vMhA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.5.0", + "linkify-it": "^5.0.2", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.6.tgz", + "integrity": "sha512-gB0gkNafnonOw0obSTEGZTT86IuhILt2Wfx0mWH/1Au83kybTayroZ/V6nS25mN7u8ASy+5fMhgB3XPNrOZdmA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "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/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.1.0.tgz", + "integrity": "sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==", + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", + "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==", + "funding": [ + "https://github.com/sponsors/broofa" + ], + "license": "MIT", + "bin": { + "mime": "bin/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimark": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/minimark/-/minimark-0.2.0.tgz", + "integrity": "sha512-AmtWU9pO0C2/3AM2pikaVhJ//8E5rOpJ7+ioFQfjIq+wCsBeuZoxPd97hBFZ9qrI7DMHZudwGH3r8A7BMnsIew==", + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimisted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", + "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mlly": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/mocked-exports": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/mocked-exports/-/mocked-exports-0.1.1.tgz", + "integrity": "sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA==", + "license": "MIT" + }, + "node_modules/motion-dom": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-13.1.1.tgz", + "integrity": "sha512-XSf8VYWSB6G/0IY3rWVbyLcxWXtAVHkN1PQE2agTaCv3u8RGvbwu56TyyR/MNzBqqNavEBTZzErcxI1TxBrjcA==", + "license": "MIT", + "dependencies": { + "motion-utils": "^13.0.0" + } + }, + "node_modules/motion-utils": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-13.0.0.tgz", + "integrity": "sha512-7DnN7TmbLcYXcG4RVadXIihWlyuM9afoUww8Y5Agg431kGKiuL2/OMyP4mJ5wLz+pvN3t5ySClLOaVXJ+wekRQ==", + "license": "MIT" + }, + "node_modules/motion-v": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/motion-v/-/motion-v-2.4.0.tgz", + "integrity": "sha512-kRDGMAZk3nvdjEO36Wo6pezSEIStGXGhVFiwo1QkUDsUg8mB5igjYPXyece8wtu2DrHhmFfA6Y1nOz07+5QH4A==", + "license": "MIT", + "dependencies": { + "framer-motion": "^13.1.0", + "hey-listen": "^1.0.8", + "motion-dom": "^13.0.0", + "motion-utils": "^13.0.0" + }, + "peerDependencies": { + "@vueuse/core": ">=10.0.0", + "vue": ">=3.0.0" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "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/nanotar": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/nanotar/-/nanotar-0.3.0.tgz", + "integrity": "sha512-Kv2JYYiCzt16Kt5QwAc9BFG89xfPNBx+oQL4GQXD9nLqPkZBiNaqaCWtwnbk/q7UVsTYevvM1b0UF8zmEI4pCg==", + "license": "MIT" + }, + "node_modules/nitropack": { + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/nitropack/-/nitropack-2.13.4.tgz", + "integrity": "sha512-tX7bT6zxNeMwkc6hxHiZeUoTOjVrcjoh1Z3cmxOlodIqjl4HISgqfGOmkWSayky3Nv9Z5+KQH52F8nmXJY5AAA==", + "license": "MIT", + "dependencies": { + "@cloudflare/kv-asset-handler": "^0.4.2", + "@rollup/plugin-alias": "^6.0.0", + "@rollup/plugin-commonjs": "^29.0.2", + "@rollup/plugin-inject": "^5.0.5", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^16.0.3", + "@rollup/plugin-replace": "^6.0.3", + "@rollup/plugin-terser": "^1.0.0", + "@vercel/nft": "^1.5.0", + "archiver": "^7.0.1", + "c12": "^3.3.4", + "chokidar": "^5.0.0", + "citty": "^0.2.2", + "compatx": "^0.2.0", + "confbox": "^0.2.4", + "consola": "^3.4.2", + "cookie-es": "^2.0.1", + "croner": "^10.0.1", + "crossws": "^0.3.5", + "db0": "^0.3.4", + "defu": "^6.1.7", + "destr": "^2.0.5", + "dot-prop": "^10.1.0", + "esbuild": "^0.28.0", + "escape-string-regexp": "^5.0.0", + "etag": "^1.8.1", + "exsolve": "^1.0.8", + "globby": "^16.2.0", + "gzip-size": "^7.0.0", + "h3": "^1.15.11", + "hookable": "^5.5.3", + "httpxy": "^0.5.1", + "ioredis": "^5.10.1", + "jiti": "^2.6.1", + "klona": "^2.0.6", + "knitwork": "^1.3.0", + "listhen": "^1.9.1", + "magic-string": "^0.30.21", + "magicast": "^0.5.2", + "mime": "^4.1.0", + "mlly": "^1.8.2", + "node-fetch-native": "^1.6.7", + "node-mock-http": "^1.0.4", + "ofetch": "^1.5.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^2.1.0", + "pkg-types": "^2.3.1", + "pretty-bytes": "^7.1.0", + "radix3": "^1.1.2", + "rollup": "^4.60.2", + "rollup-plugin-visualizer": "^7.0.1", + "scule": "^1.3.0", + "semver": "^7.7.4", + "serve-placeholder": "^2.0.2", + "serve-static": "^2.2.1", + "source-map": "^0.7.6", + "std-env": "^4.1.0", + "ufo": "^1.6.4", + "ultrahtml": "^1.6.0", + "uncrypto": "^0.1.3", + "unctx": "^2.5.0", + "unenv": "2.0.0-rc.24", + "unimport": "^6.2.0", + "unplugin-utils": "^0.3.1", + "unstorage": "^1.17.5", + "untyped": "^2.0.0", + "unwasm": "^0.5.3", + "youch": "^4.1.1", + "youch-core": "^0.3.3" + }, + "bin": { + "nitro": "dist/cli/index.mjs", + "nitropack": "dist/cli/index.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "xml2js": "^0.6.2" + }, + "peerDependenciesMeta": { + "xml2js": { + "optional": true + } + } + }, + "node_modules/nitropack/node_modules/cookie-es": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-2.0.1.tgz", + "integrity": "sha512-aVf4A4hI2w70LnF7GG+7xDQUkliwiXWXFvTjkip4+b64ygDQ2sJPRSKFDHbxn8o0xu9QzPkMuuiWIXyFSE2slA==", + "license": "MIT" + }, + "node_modules/nitropack/node_modules/db0": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/db0/-/db0-0.3.4.tgz", + "integrity": "sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==", + "license": "MIT", + "peerDependencies": { + "@electric-sql/pglite": "*", + "@libsql/client": "*", + "better-sqlite3": "*", + "drizzle-orm": "*", + "mysql2": "*", + "sqlite3": "*" + }, + "peerDependenciesMeta": { + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "drizzle-orm": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "sqlite3": { + "optional": true + } + } + }, + "node_modules/nitropack/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/nitropack/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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/nitropack/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/nitropack/node_modules/unctx": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.5.0.tgz", + "integrity": "sha512-p+Rz9x0R7X+CYDkT+Xg8/GhpcShTlU8n+cf9OtOEf7zEQsNcCZO1dPKNRDqvUTaq+P32PMMkxWHwfrxkqfqAYg==", + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21", + "unplugin": "^2.3.11" + } + }, + "node_modules/nitropack/node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/node-addon-api": { + "version": "8.9.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.2.tgz", + "integrity": "sha512-VijLXbi3UACN69I0JVXJsX4tjACjNoQDgv2gTF6sx2wWEi8tkSg2eX8p5gSIFi8z2+DL3oHmY6OyKce38SDolg==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-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/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, + "node_modules/node-forge": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", + "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-mock-http": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.5.tgz", + "integrity": "sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz", + "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "license": "ISC", + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nostics": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/nostics/-/nostics-1.2.0.tgz", + "integrity": "sha512-FGqEfhQjrvo1lL8KFifdTQiNwwQHJxC1jtYE1Rc54qF/jxONUNL+kC9gS1krX8Q65PgrQ5fCqH/I4NhWBvdSqg==", + "license": "MIT" + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nuxt": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-4.5.2.tgz", + "integrity": "sha512-tR3fcqeHlHmmkLMpIg3V7Y+1ltr302lW8djMw/iy+myfo7QSSz+BVJDuQhg5j73b9oteSyBfOKTDYTgvMtj6TA==", + "license": "MIT", + "dependencies": { + "@dxup/nuxt": "^0.5.6", + "@nuxt/cli": "^3.37.0", + "@nuxt/devtools": "^3.4.1", + "@nuxt/kit": "4.5.2", + "@nuxt/nitro-server": "4.5.2", + "@nuxt/schema": "4.5.2", + "@nuxt/telemetry": "^2.8.0", + "@nuxt/vite-builder": "4.5.2", + "@unhead/vue": "^3.3.1", + "@vue/shared": "^3.5.40", + "chokidar": "^5.0.0", + "compatx": "^0.2.0", + "consola": "^3.4.2", + "cookie-es": "^3.1.1", + "defu": "^6.1.7", + "devalue": "^5.9.0", + "errx": "^0.1.2", + "escape-string-regexp": "^5.0.0", + "exsolve": "^1.1.1", + "fnv1a-64": "^0.1.2", + "hookable": "^6.1.1", + "ignore": "^7.0.6", + "impound": "^1.1.6", + "jiti": "^2.7.0", + "klona": "^2.0.6", + "knitwork": "^1.3.0", + "magic-string": "^1.1.0", + "mlly": "^1.8.2", + "nanotar": "^0.3.0", + "nostics": "^1.2.0", + "nypm": "^0.6.9", + "object-identity": "^0.2.3", + "ofetch": "^1.5.1", + "ohash": "^2.0.11", + "on-change": "^6.0.2", + "oxc-walker": "^1.1.1", + "pathe": "^2.0.3", + "perfect-debounce": "^2.1.0", + "picomatch": "^4.0.5", + "pkg-types": "^2.3.1", + "rolldown-string": "^0.3.1", + "rou3": "^0.9.1", + "scule": "^1.3.0", + "std-env": "^4.2.0", + "tinyglobby": "^0.2.17", + "ufo": "^1.6.4", + "ultrahtml": "^1.7.0", + "uncrypto": "^0.1.3", + "unctx": "^3.0.0", + "undici": "^8.10.0", + "unhead": "^3.3.1", + "unimport": "^6.4.0", + "unplugin": "^3.3.0", + "unrouting": "^0.2.2", + "untyped": "^2.0.0", + "verkit": "^0.3.1", + "vue": "^3.5.40", + "vue-component-type-helpers": "^3.3.9", + "vue-router": "^5.2.0" + }, + "bin": { + "nuxi": "bin/nuxt.mjs", + "nuxt": "bin/nuxt.mjs" + }, + "engines": { + "node": "^22.19.0 || ^24.11.0 || >=26.0.0" + }, + "peerDependencies": { + "@parcel/watcher": "^2.1.0", + "@types/node": ">=18.12.0", + "rolldown": "~1.2.1" + }, + "peerDependenciesMeta": { + "@parcel/watcher": { + "optional": true + }, + "@types/node": { + "optional": true + } + } + }, + "node_modules/nuxt-component-meta": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/nuxt-component-meta/-/nuxt-component-meta-0.18.0.tgz", + "integrity": "sha512-Lo++ctinehNtQvU1SdYdIfYvhUqFtP5nOQsMvbrpFYh53TqwoS97BrS/tjWQe68cfXQaerzhKPFY1Xb1EH4mJg==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^4.4.8", + "citty": "^0.2.2", + "defu": "^6.1.7", + "jiti": "^2.7.0", + "magic-string": "^0.30.21", + "mlly": "^1.8.2", + "ohash": "^2.0.11", + "oxc-parser": "^0.139.0", + "oxc-walker": "^1.0.0", + "pathe": "^2.0.3", + "scule": "^1.3.0", + "typescript": "^5.9.3", + "ufo": "^1.6.4", + "unplugin": "^2.3.11", + "vue-component-meta": "^3.3.7" + }, + "bin": { + "nuxt-component-meta": "bin/nuxt-component-meta.mjs" + } + }, + "node_modules/nuxt-component-meta/node_modules/@oxc-parser/binding-android-arm-eabi": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.139.0.tgz", + "integrity": "sha512-22EsXTA3Vc7OvrF4bfT48PFln2UbxkVgrp/Tm32qLw76Dv7SmcInfClJe6yPYamnli6HiqasnESZ5ezN+X4ybg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-component-meta/node_modules/@oxc-parser/binding-android-arm64": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.139.0.tgz", + "integrity": "sha512-uASQkZV+CUQ6xXvoMzDQyfhd8OMusdv2FyCPfAi5ZDYptesapJlw7erhpGi1Lc+U8QjQV2JUrIh7d/3su2LzmQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-component-meta/node_modules/@oxc-parser/binding-darwin-arm64": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.139.0.tgz", + "integrity": "sha512-vuQOv2WF5pZCkdSPEExul98o853M3MCR24DpWsGrUoPJu5KcnGE34kLXY2yFwBwZwT+eN1x40Tt4q6ZzlEdNUA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-component-meta/node_modules/@oxc-parser/binding-darwin-x64": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.139.0.tgz", + "integrity": "sha512-zxZB8ChS+7XactZhcyxQ292P/DNiiBaPPKYiVUlb3RC0V/hme5bokNubjcmEmbW9uTfmqLTpveAdkbe66H3pGg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-component-meta/node_modules/@oxc-parser/binding-freebsd-x64": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.139.0.tgz", + "integrity": "sha512-iw2MsoCPBQwdJqywRAGsF1jEAcGoZ+DeG2LVzt5pdUvRHqajsMF46BH0rHiWoWtMwcMSia+oQYga7fHo7u7Bcw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-component-meta/node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.139.0.tgz", + "integrity": "sha512-SwjD/k3Y5bwGJWOH313VyaDrAuaYg1Pe+4AAXCgUKvSO5IHkj+mZ0oFcOWmB5nTuOM3uwdT+leL8h4OnFlI5hw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-component-meta/node_modules/@oxc-parser/binding-linux-arm-musleabihf": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.139.0.tgz", + "integrity": "sha512-qbeygDkcvailKFhphb2YGMMXsaZIynHlPtoOrcx4NZB/tRbUKraCCMbw8dPeFtEKasfS2qWh1VnReY+Lcys1zA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-component-meta/node_modules/@oxc-parser/binding-linux-arm64-gnu": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.139.0.tgz", + "integrity": "sha512-SrlL02KeImKlvx/9rCeopOLH7qKI3rqKKEguK6KBwVwEGLhV/A47dW4DNigf6/LFhrwoovaiayEQryjYAI86dQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-component-meta/node_modules/@oxc-parser/binding-linux-arm64-musl": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.139.0.tgz", + "integrity": "sha512-u9e884ChAVRmIZ1jr/m46S96FoDQnruFjISLi4Y0i6Wu/JUUmIiw7+umLyXILJsPfUuqnN5BJLe23t07+Y6+IA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-component-meta/node_modules/@oxc-parser/binding-linux-ppc64-gnu": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.139.0.tgz", + "integrity": "sha512-Z9tU2b3GJfAXOdirQmz4gZQkQkVjy53i77gf91l0733MQKa/qtk73KQQE2GzDtMqim+HyjpzvemmqzBtH2IJUA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-component-meta/node_modules/@oxc-parser/binding-linux-riscv64-gnu": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.139.0.tgz", + "integrity": "sha512-RyUbr7hzPK84YDWKs77PRYk9VBwWbsbuYsQzQWiSmLnARXTg2zntLPGfCH/1wpfUYdmGkp/6SsqTXSsYdw9Jgw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-component-meta/node_modules/@oxc-parser/binding-linux-riscv64-musl": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.139.0.tgz", + "integrity": "sha512-dcQhjtcDvtR8BgkUpt03Yz5SzxdzYvTigenIJOEsiSX6G2t6yybEMxGWjp0dOuYGror0BaqcZfTyXR58amCEig==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-component-meta/node_modules/@oxc-parser/binding-linux-s390x-gnu": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.139.0.tgz", + "integrity": "sha512-iuGrxysV4rGUymdKpn7bgZQ6Vix8Bi/6D/rp71HYIzphq6NKrsBhsGOYsSZte+uBFL43tXh7Xr7TM72sGliJNA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-component-meta/node_modules/@oxc-parser/binding-linux-x64-gnu": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.139.0.tgz", + "integrity": "sha512-NxJdZZyaa2JLLvNfH/iJQXfCNfKcPMylwY4ObMpBVmW4Nq+RyUpVVQXrMMelcQ6rwx3nuhF1Iga8n+eoAKGCIA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-component-meta/node_modules/@oxc-parser/binding-linux-x64-musl": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.139.0.tgz", + "integrity": "sha512-ePxBvvtzISmSsJ0RIj8FNikSCn58i1jtccj7XR4U9Li4iSzhkFyYlnJ51cQTUwkairz8WMTD4SpKoot8RyTnQA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-component-meta/node_modules/@oxc-parser/binding-openharmony-arm64": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.139.0.tgz", + "integrity": "sha512-b/c2+mPXMOxG5x16n8yf9cjor/ntQQScmYnSmLEWIWJ4rfXd5dokMxx0kliSLA+YAGq6DD3K9BWi+aFXHiiV1w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-component-meta/node_modules/@oxc-parser/binding-win32-arm64-msvc": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.139.0.tgz", + "integrity": "sha512-JPEmfncZfqAFiGsAN6UZSMIBqnG8wn8buywRacFOWjP+9dZwcs03SsBp4tmyjM/4l/VoH/IuThrW1Jof3OyQUw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-component-meta/node_modules/@oxc-parser/binding-win32-ia32-msvc": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.139.0.tgz", + "integrity": "sha512-c06dWBwEnFHof5JN7T9/ts23uATXS9czPEBO60d4xnjH2Am29Bo7OGKdVHRmcWQnw0OBxlTg9fIEXAvtcwOBfw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-component-meta/node_modules/@oxc-parser/binding-win32-x64-msvc": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.139.0.tgz", + "integrity": "sha512-bI3/44urQjW/D495JPXe+c9d+4Q+ONi3DvDNnzwRZYTWHZ3hAlFdmirYK4mzhTfCZiAly02EbMYir7QGU+9O2Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/nuxt-component-meta/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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/nuxt-component-meta/node_modules/oxc-parser": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.139.0.tgz", + "integrity": "sha512-cf1TKZN+zc0lwqigeyXKzKVk5+vNRe99Or2+wVJsXLdlhJgC+gsIniYDfj/ZEBzCJ8Xm21ZG6YtMbR262CcS2w==", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "^0.139.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-parser/binding-android-arm-eabi": "0.139.0", + "@oxc-parser/binding-android-arm64": "0.139.0", + "@oxc-parser/binding-darwin-arm64": "0.139.0", + "@oxc-parser/binding-darwin-x64": "0.139.0", + "@oxc-parser/binding-freebsd-x64": "0.139.0", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.139.0", + "@oxc-parser/binding-linux-arm-musleabihf": "0.139.0", + "@oxc-parser/binding-linux-arm64-gnu": "0.139.0", + "@oxc-parser/binding-linux-arm64-musl": "0.139.0", + "@oxc-parser/binding-linux-ppc64-gnu": "0.139.0", + "@oxc-parser/binding-linux-riscv64-gnu": "0.139.0", + "@oxc-parser/binding-linux-riscv64-musl": "0.139.0", + "@oxc-parser/binding-linux-s390x-gnu": "0.139.0", + "@oxc-parser/binding-linux-x64-gnu": "0.139.0", + "@oxc-parser/binding-linux-x64-musl": "0.139.0", + "@oxc-parser/binding-openharmony-arm64": "0.139.0", + "@oxc-parser/binding-wasm32-wasi": "0.139.0", + "@oxc-parser/binding-win32-arm64-msvc": "0.139.0", + "@oxc-parser/binding-win32-ia32-msvc": "0.139.0", + "@oxc-parser/binding-win32-x64-msvc": "0.139.0" + } + }, + "node_modules/nuxt-component-meta/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/nuxt-component-meta/node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/nuxt/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/nuxt/node_modules/hookable": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.1.tgz", + "integrity": "sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==", + "license": "MIT" + }, + "node_modules/nuxt/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/nypm": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.9.tgz", + "integrity": "sha512-zxlE2yvSWZWmHcNdT3+5zV2lrCogeE9YOklHrR3dFjqutq5wO7GFDYLFDRXLsYnJzwvy/im9fYoxePvS0VTW0w==", + "license": "MIT", + "dependencies": { + "citty": "^0.2.2", + "pathe": "^2.0.3", + "tinyexec": "^1.2.4" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/object-identity": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/object-identity/-/object-identity-0.2.3.tgz", + "integrity": "sha512-2J8Joz2Tf7aaylhqFvIUJHNgpuGR38Hh75Voq9GzTbStBxJUaOtN0K1aOd3cV5qp+ij1pMqRbPrGCGMOyX303w==", + "license": "MIT" + }, + "node_modules/obug": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/ohash": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.12.tgz", + "integrity": "sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==", + "license": "MIT" + }, + "node_modules/on-change": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/on-change/-/on-change-6.0.2.tgz", + "integrity": "sha512-08+12qcOVEA0fS9g/VxKS27HaT94nRutUT77J2dr8zv/unzXopvhBuF8tNLWsoLQ5IgrQ6eptGeGqUYat82U1w==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sindresorhus/on-change?sponsor=1" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oniguruma-parser": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", + "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", + "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/open": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.2.tgz", + "integrity": "sha512-RWqF+pBSkqecEvCKOn8QYhaNdRMJDZRIrlS/7rTDdLHaPcfXGCZ/h8zb413NfvdeAV0MR7T1yJcA34/q+CSm1Q==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.5.1", + "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", + "is-inside-container": "^1.0.0", + "powershell-utils": "^0.2.1", + "wsl-utils": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/orderedmap": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", + "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", + "license": "MIT" + }, + "node_modules/oxc-walker": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/oxc-walker/-/oxc-walker-1.1.1.tgz", + "integrity": "sha512-Hwd7dq28zu/Er99+bpWp16CGwFrhyalJh0W3JOB7XpPvgWo3MqMi2ksWGKuzzA9zt50mJ2pIUwR5lpAdZ9ACNQ==", + "license": "MIT", + "peerDependencies": { + "@oxc-project/types": ">=0.98.0", + "oxc-parser": ">=0.98.0", + "rolldown": ">=1.0.0" + }, + "peerDependenciesMeta": { + "@oxc-project/types": { + "optional": true + }, + "oxc-parser": { + "optional": true + }, + "rolldown": { + "optional": true + } + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/package-manager-detector": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", + "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==", + "license": "MIT" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-path": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz", + "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==", + "license": "MIT", + "dependencies": { + "protocols": "^2.0.0" + } + }, + "node_modules/parse-url": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-9.2.0.tgz", + "integrity": "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==", + "license": "MIT", + "dependencies": { + "@types/parse-path": "^7.0.0", + "parse-path": "^7.0.0" + }, + "engines": { + "node": ">=14.13.0" + } + }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "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==", + "license": "ISC" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-types": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.4", + "exsolve": "^1.0.8", + "pathe": "^2.0.3" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "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.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz", + "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12 || ^20.9 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.38" + } + }, + "node_modules/postcss-colormin": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-8.0.5.tgz", + "integrity": "sha512-U/N+7tkHgHoD24NB6q9k9uFcRfVJRdzVSit0fM0T2L6fvnpUoTIAYgzkyjD56LHEoCoPNfkMcfTB47SW/lNegQ==", + "license": "MIT", + "dependencies": { + "@colordx/core": "^5.6.0", + "browserslist": "^4.28.8", + "caniuse-api": "^4.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-convert-values": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-8.0.4.tgz", + "integrity": "sha512-ifBmAJBfpDymi7r/CqxYRJWlG+BLdVmusUC/kFPOqH/+TitdBeHA68CYqY79wXL+iQnqg6e4LGHA2Mte14X6Ig==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.8", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-discard-comments": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-8.0.4.tgz", + "integrity": "sha512-SU1uLYRQPKLJJmqEmqzu+Ze+9xDurBm7m/LOzXG/ANBAfAGLjbQF+oIyZnf3jV3F155q5rRMYXsoTNEJsPyHng==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.1.5" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-8.0.4.tgz", + "integrity": "sha512-/ugMYYTE+IpHpTmwz6/S8w+blCz9pZNroUgadTdlbPnHoLLWis9QvwmoyWui2mOgFzuRM6Me7AnoGU3i0Ua2ng==", + "license": "MIT", + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-discard-empty": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-8.0.5.tgz", + "integrity": "sha512-im0QtfNFa6V3SGPrfqzrWYuhzSz1ztWORKsuhZHQbWdKMh0DiNj3pmqBnABbhdKjyeW6nZ1oZYGh4dMc3biyaw==", + "license": "MIT", + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-8.0.4.tgz", + "integrity": "sha512-NqupxmnSSfWPJJDYbQk1qXWRwr+lw4Kyp/LSOjqwTpy/vSwo34EVXYKywgemSWpgh39P7Cs/G+tqynbRlXoJhw==", + "license": "MIT", + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-8.0.4.tgz", + "integrity": "sha512-ammolHhMvuTz/L9YN/ge1SWbUDcD3Y9o2gXlo3S6H4MCJHheyVPwcI/LAnSuNT4gcUmSF9pNTXo7+3M/2MFPAQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^8.0.4" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-merge-rules": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-8.0.5.tgz", + "integrity": "sha512-jz+QaKz4VhjsqTVsJMRuH+EvrX1F9l6kYFuF8g6geVxFoYnPEZN4G+zqCb6zhxOIcc2aeAo38XEl2pOIZi2gBw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.8", + "caniuse-api": "^4.0.0", + "cssnano-utils": "^6.0.4", + "postcss-selector-parser": "^7.1.5" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-8.0.4.tgz", + "integrity": "sha512-wZZgJ87U5WbQCEM0EOY/oM7M1a+sqW6vrOClGC9lNbsY0HYmbMFvFuukBn8PzF+ikKmaT0QB+uSAHTRLzMkD+A==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-8.0.6.tgz", + "integrity": "sha512-NsqlG34WSO44NOHVT6m6ZWpN80fK2l5Zt73PMDXBJKT6fO6GPnI0NBi6xIVFr/naej3ukVUlIFQGxb7JGaa9Zg==", + "license": "MIT", + "dependencies": { + "@colordx/core": "^5.6.0", + "cssnano-utils": "^6.0.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-minify-params": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-8.0.4.tgz", + "integrity": "sha512-TDx9O/ni7KazRK32pVvoo3MjExyVxWE0949vB2XZ0oHnxdAtQFHa9oG21wWkvsOL3osjiOVejwDLe6a0d0EuSw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.8", + "cssnano-utils": "^6.0.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-8.0.5.tgz", + "integrity": "sha512-i+PlhVCaPa7xevjhpActH2PrP27kDNSuuFf/ZGk8YrIcd1pd3Mfcfiv8H7dbY1/vz7U+QparioAtJaFV+IEwQg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.8", + "caniuse-api": "^4.0.0", + "cssesc": "^3.0.0", + "postcss-selector-parser": "^7.1.5" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-8.0.5.tgz", + "integrity": "sha512-l0L1rIe9YHbLaf4xfL2pkkQV3gq/QIy8D0bjsaHYdGVgR+eQk7IBp3dUdIKe6XuG7DzFiCwJn248nvAFAi5CjA==", + "license": "MIT", + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-8.0.4.tgz", + "integrity": "sha512-F8DGtzelJDV6S5mhcugc+EJ8sXI+kFv2PBedkfMWqd8mvTE4qyy3kva6AQwjy2+L2lZ9TGTkSumdq+n3EhGeAw==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-8.0.4.tgz", + "integrity": "sha512-anOMhqe6Z0OP4jvchK1v1hIG08kO7rsp8uHrxT2+XaKp8wbvVcUO3QHUzRmQDazWUPtRzy1h2UlixyJenF42sg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-8.0.4.tgz", + "integrity": "sha512-vY8+k+/bFT7B8gzlHVye8FxBTMEpUAQxAgb4UYFAGGsKmXfwEvc7VPs+kpFNrTeqVKAvVh8+VVhZ+f3S4TWJPg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-normalize-string": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-8.0.4.tgz", + "integrity": "sha512-dWnV1frIV1XUlSYzJudceAbQ7PGyho9EgVHQXMcAoog6Nwnet3G9rz8IXcCb0EF2eefmpYG9hDT9+yWJOxc5zw==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-8.0.4.tgz", + "integrity": "sha512-VANJsokAWdQ03ZJwmcdEKXJjVHRtMgalB/BgbCgN3CRTdbwB5TXlSDRmdShSCxpnZs8WLAm0mPa//p5o5D/ZTg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-8.0.4.tgz", + "integrity": "sha512-SxVEoFdYed0bxxwZwAXnaAZ2lzNb5jtiQvYWyMIEqnGOzCuztWpVO8LvsqpOfUIacOb6oYaWi7WOAZR36OhYqw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.8", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-normalize-url": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-8.0.4.tgz", + "integrity": "sha512-JKZW8KRHkLEYkUb/55n3knDUMZeyvxlTv7ZA82bcHiCjL81b0Yyf9fIUBAYKZ6ucDgKfCDM78xhXuteVlk/o9Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-8.0.5.tgz", + "integrity": "sha512-xuFovful3vVIA9fWWmAL2pG1Qr95Udj2MrLgjU50C6r+Xnh3s6t2BN1xXQ8lnCOCAtzMvMpPWYlnAh4nSv5VEQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-ordered-values": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-8.0.5.tgz", + "integrity": "sha512-aDL7nPR7w1foUqo4rN6QY1Kr45+SYELnmUg5taZehh7FfFdxQmUjbuOOBuffIXjiHV45zqgFHCb4azsWW19jyw==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^6.0.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-8.0.5.tgz", + "integrity": "sha512-Bh5d7zjH1Ai9LzJ1qULUZIaC18cniD+wA6gFlOPglMxJRC7meXbuPvpJ/zHQGg5QKwQgit++XQhDTiEIhCk8Ow==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.8", + "caniuse-api": "^4.0.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-8.0.4.tgz", + "integrity": "sha512-ZGU7/R0GmjE3x2mOGB0g9Ohx74X+JjYX62RB5IBYLOe6R0fuHGZ76HtTY2CdM5NE8Yey/ew5clEf8iZQnjDjWA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz", + "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-8.0.6.tgz", + "integrity": "sha512-auQHNmduFFHzz1sWYM3sroW7IDMzxshlLjnwAALfkrAgPegHFats+jMK6BRCcdIulxPmqXFSQvgoAX4vw8I59g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^4.1.0" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-8.0.4.tgz", + "integrity": "sha512-Sby0EtmD1mlvcZSWP5eXjxhxVgvXE5QVRzd+8NH0IbF+lYQIM57ybwAvJYYtI/fexMgCWcRnDETovjKOcLJb8w==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.1.5" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/powershell-utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.1.tgz", + "integrity": "sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-bytes": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-7.1.2.tgz", + "integrity": "sha512-spZIOSORH9joSPGN0L/tYfvINH+xbOpnI3kdcEkq0mzGMjFvDZzyRVbqEOV0wACF0gggdKE9RWO2mosGsBh/Rg==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proper-lockfile/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/prosemirror-changeset": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.4.2.tgz", + "integrity": "sha512-ViYrjMSg3YFiXwIhKaluu+/mi3Yrxt6AR8ri14ulTaGcZtXO1CThl7A2gv79qx5fQnOw8woKwyBU2u+9PVCm3w==", + "license": "MIT", + "dependencies": { + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-commands": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.2.tgz", + "integrity": "sha512-q6Q6szxqdu9Xd6EcdKsqXghu5nQdZTpB4Q9yd04WRc7/jt763e/rT60Owh0L1GYY+T46o5rD+9lEN36dZS43tw==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.10.2" + } + }, + "node_modules/prosemirror-dropcursor": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.3.tgz", + "integrity": "sha512-FoYbsJR8gK+DGlqhNoE29Loa38eIZPzQRIb1VMaDNBoo4OLP6vVof/jR8qFY/6XvUd6Dhug8MDCHl2a/h8RTfQ==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "node_modules/prosemirror-gapcursor": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.4.1.tgz", + "integrity": "sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "node_modules/prosemirror-history": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.5.0.tgz", + "integrity": "sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.31.0", + "rope-sequence": "^1.3.0" + } + }, + "node_modules/prosemirror-inputrules": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.1.tgz", + "integrity": "sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-keymap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz", + "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "node_modules/prosemirror-model": { + "version": "1.25.11", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.11.tgz", + "integrity": "sha512-QWg9RhnpLlogAmp3p96uEFrE5txQpFynd4vhBAELkwgOCWQs/X0yCzB3/hrHqiPwf91RG5KyWq6553zs9JqIOQ==", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-schema-list": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz", + "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.7.3" + } + }, + "node_modules/prosemirror-state": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz", + "integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" + } + }, + "node_modules/prosemirror-tables": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.5.tgz", + "integrity": "sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.2.3", + "prosemirror-model": "^1.25.4", + "prosemirror-state": "^1.4.4", + "prosemirror-transform": "^1.10.5", + "prosemirror-view": "^1.41.4" + } + }, + "node_modules/prosemirror-transform": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.12.0.tgz", + "integrity": "sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.21.0" + } + }, + "node_modules/prosemirror-view": { + "version": "1.42.3", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.42.3.tgz", + "integrity": "sha512-oTN7EtH+CpwxU9NrwEYWd0UZ4JUx7l048l5A2Xppm4p/60isZYLnth9QVQmC3VRIvdrIWCxwZSd+Uz791G31/w==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.25.8", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/protocols": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", + "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", + "license": "MIT" + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", + "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/rc9": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-3.0.1.tgz", + "integrity": "sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==", + "license": "MIT", + "dependencies": { + "defu": "^6.1.6", + "destr": "^2.0.5" + } + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "license": "MIT", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/rehype-external-links": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz", + "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-is-element": "^3.0.0", + "is-absolute-url": "^4.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-minify-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/rehype-minify-whitespace/-/rehype-minify-whitespace-6.0.2.tgz", + "integrity": "sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-remark": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-remark/-/rehype-remark-10.0.1.tgz", + "integrity": "sha512-EmDndlb5NVwXGfUa4c9GPK+lXeItTilLhE6ADSaQuHr4JUlKw9MidzGzx4HpqZrNCt6vnHmEifXQiiA+CEnjYQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "hast-util-to-mdast": "^10.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-slug": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz", + "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "github-slugger": "^2.0.0", + "hast-util-heading-rank": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-sort-attribute-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-sort-attribute-values/-/rehype-sort-attribute-values-5.0.1.tgz", + "integrity": "sha512-lU3ABJO5frbUgV132YS6SL7EISf//irIm9KFMaeu5ixHfgWf6jhe+09Uf/Ef8pOYUJWKOaQJDRJGCXs6cNsdsQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-sort-attributes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-sort-attributes/-/rehype-sort-attributes-5.0.1.tgz", + "integrity": "sha512-Bxo+AKUIELcnnAZwJDt5zUDDRpt4uzhfz9d0PVGhcxYWsbFj5Cv35xuWxu5r1LeYNFNhgGqsr9Q2QiIOM/Qctg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/reka-ui": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/reka-ui/-/reka-ui-2.10.3.tgz", + "integrity": "sha512-nJGZbwcha8AcP2wbnjodfzsciTKBqp1mIzepC9Pi2xDI/YK3++ej3vpJOSPyxqrkq1Oorj4K+BdJkbVCV6x6ag==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.6.13", + "@floating-ui/vue": "^1.1.6", + "@internationalized/date": "^3.5.0", + "@internationalized/number": "^3.5.0", + "@tanstack/vue-virtual": "^3.12.0", + "@vueuse/core": "^14.1.0", + "@vueuse/shared": "^14.1.0", + "aria-hidden": "^1.2.4", + "defu": "^6.1.5", + "ohash": "^2.0.11" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/zernonia" + }, + "peerDependencies": { + "vue": ">= 3.4.0" + } + }, + "node_modules/remark-emoji": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-5.0.2.tgz", + "integrity": "sha512-IyIqGELcyK5AVdLFafoiNww+Eaw/F+rGrNSXoKucjo95uL267zrddgxGM83GN1wFIb68pyDuAsY3m5t2Cav1pQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.4", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.3", + "unified": "^11.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdc": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/remark-mdc/-/remark-mdc-3.11.1.tgz", + "integrity": "sha512-bjH7Q1OO1BSXVPmUxYIrGH2dUAZkizNY3i9WJUEcIFLowZAEjLTT7fUAH2vH0Tpkeh+/MrzwFFmeWcZ66QLh7A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.4", + "@types/unist": "^3.0.3", + "flat": "^6.0.1", + "mdast-util-from-markdown": "^2.0.3", + "mdast-util-to-markdown": "^2.1.2", + "micromark": "^4.0.2", + "micromark-core-commonmark": "^2.0.3", + "micromark-factory-space": "^2.0.1", + "micromark-factory-whitespace": "^2.0.1", + "micromark-util-character": "^2.1.1", + "micromark-util-types": "^2.0.2", + "parse-entities": "^4.0.2", + "scule": "^1.3.0", + "stringify-entities": "^4.0.4", + "unified": "^11.0.5", + "unist-util-visit": "^5.1.0", + "unist-util-visit-parents": "^6.0.2", + "yaml": "^2.9.0" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rolldown": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.6.tgz", + "integrity": "sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.147.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.6", + "@rolldown/binding-android-arm64": "1.2.6", + "@rolldown/binding-darwin-arm64": "1.2.6", + "@rolldown/binding-darwin-x64": "1.2.6", + "@rolldown/binding-freebsd-x64": "1.2.6", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.6", + "@rolldown/binding-linux-arm64-gnu": "1.2.6", + "@rolldown/binding-linux-arm64-musl": "1.2.6", + "@rolldown/binding-linux-ppc64-gnu": "1.2.6", + "@rolldown/binding-linux-s390x-gnu": "1.2.6", + "@rolldown/binding-linux-x64-gnu": "1.2.6", + "@rolldown/binding-linux-x64-musl": "1.2.6", + "@rolldown/binding-openharmony-arm64": "1.2.6", + "@rolldown/binding-win32-arm64-msvc": "1.2.6", + "@rolldown/binding-win32-x64-msvc": "1.2.6" + } + }, + "node_modules/rolldown-string": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/rolldown-string/-/rolldown-string-0.3.1.tgz", + "integrity": "sha512-dv8GOXkYqUQdI0rsXB8hmzO95pKWSuX2eg5/JSJa9czfEVIFuKNR7ZJDfat8LlmD35RAhWY+evS7/wXXqFDfSg==", + "license": "MIT", + "dependencies": { + "magic-string": "^1.0.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "rolldown": "*" + }, + "peerDependenciesMeta": { + "rolldown": { + "optional": true + } + } + }, + "node_modules/rolldown/node_modules/@oxc-project/types": { + "version": "0.147.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.147.0.tgz", + "integrity": "sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/rollup": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.1.tgz", + "integrity": "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.1", + "@rollup/rollup-android-arm64": "4.63.1", + "@rollup/rollup-darwin-arm64": "4.63.1", + "@rollup/rollup-darwin-x64": "4.63.1", + "@rollup/rollup-freebsd-arm64": "4.63.1", + "@rollup/rollup-freebsd-x64": "4.63.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.1", + "@rollup/rollup-linux-arm-musleabihf": "4.63.1", + "@rollup/rollup-linux-arm64-gnu": "4.63.1", + "@rollup/rollup-linux-arm64-musl": "4.63.1", + "@rollup/rollup-linux-loong64-gnu": "4.63.1", + "@rollup/rollup-linux-loong64-musl": "4.63.1", + "@rollup/rollup-linux-ppc64-gnu": "4.63.1", + "@rollup/rollup-linux-ppc64-musl": "4.63.1", + "@rollup/rollup-linux-riscv64-gnu": "4.63.1", + "@rollup/rollup-linux-riscv64-musl": "4.63.1", + "@rollup/rollup-linux-s390x-gnu": "4.63.1", + "@rollup/rollup-linux-x64-gnu": "4.63.1", + "@rollup/rollup-linux-x64-musl": "4.63.1", + "@rollup/rollup-openbsd-x64": "4.63.1", + "@rollup/rollup-openharmony-arm64": "4.63.1", + "@rollup/rollup-win32-arm64-msvc": "4.63.1", + "@rollup/rollup-win32-ia32-msvc": "4.63.1", + "@rollup/rollup-win32-x64-gnu": "4.63.1", + "@rollup/rollup-win32-x64-msvc": "4.63.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-visualizer": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-7.1.1.tgz", + "integrity": "sha512-ThaGiHTU8XW02OkK80TrTHATraJmM9OAduU4otal+7gyXLpYEtmGBLfx5kW+EHvvLwn03YGW2NnwKUIqsYlJAA==", + "license": "MIT", + "dependencies": { + "open": "^11.0.0", + "picomatch": "^4.0.5", + "source-map": "^0.8.0", + "yargs": "^18.1.0" + }, + "bin": { + "rollup-plugin-visualizer": "dist/bin/cli.js" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "rolldown": "1.x || ^1.0.0-beta || ^1.0.0-rc", + "rollup": "2.x || 3.x || 4.x" + }, + "peerDependenciesMeta": { + "rolldown": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0.tgz", + "integrity": "sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/rope-sequence": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", + "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", + "license": "MIT" + }, + "node_modules/rou3": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/rou3/-/rou3-0.9.2.tgz", + "integrity": "sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ==", + "license": "MIT" + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/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/sax": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serialize-javascript": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.1.1.tgz", + "integrity": "sha512-k3CMsaIvvdSwm8oLB4MXSl0wH2/cwlH7xGcnRd2DaeRmBkbzYmyT8j0tsX60DwD1eRwHTpNpH8ljKu9oUT1MeQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/seroval": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.6.4.tgz", + "integrity": "sha512-LErWMNS2RRFdu2RMA5u/PA59/IWs0XsikyEXGQ2/36iEWFrdG0ABmg17E17cikrv76891kOAMq3TkTFXpwAHXw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/serve-placeholder": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/serve-placeholder/-/serve-placeholder-2.0.2.tgz", + "integrity": "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==", + "license": "MIT", + "dependencies": { + "defu": "^6.1.4" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", + "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shiki": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.23.0.tgz", + "integrity": "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.23.0", + "@shikijs/engine-javascript": "3.23.0", + "@shikijs/engine-oniguruma": "3.23.0", + "@shikijs/langs": "3.23.0", + "@shikijs/themes": "3.23.0", + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/shiki/node_modules/@shikijs/core": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.23.0.tgz", + "integrity": "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/shiki/node_modules/@shikijs/engine-javascript": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.23.0.tgz", + "integrity": "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + } + }, + "node_modules/shiki/node_modules/@shikijs/langs": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz", + "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0" + } + }, + "node_modules/shiki/node_modules/@shikijs/themes": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz", + "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0" + } + }, + "node_modules/shiki/node_modules/@shikijs/types": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", + "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-git": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.36.0.tgz", + "integrity": "sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==", + "license": "MIT", + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "@simple-git/args-pathspec": "^1.0.3", + "@simple-git/argv-parser": "^1.1.0", + "debug": "^4.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/slugify": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.9.tgz", + "integrity": "sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/smob": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.6.2.tgz", + "integrity": "sha512-RQsvleCbF8cVHEv+xuDGaA4pOizFqJ0GgjtMSRo6oP8pnN7WsigHgVGey6aILRBKv4W2YOMHLqbKdnB6hpB9fw==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/socket.io-client": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz", + "integrity": "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.7.tgz", + "integrity": "sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/srvx": { + "version": "0.11.22", + "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.11.22.tgz", + "integrity": "sha512-LqZxxBDMKuMAZzFzJnDCkFOrs9MZQZr0LvHiO/SuSZVdQaXD7xQ5UWTUxheJrQPve1qk9MG2B/yttUvJxw8egQ==", + "license": "MIT", + "bin": { + "srvx": "bin/srvx.mjs" + }, + "engines": { + "node": ">=20.16.0" + } + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", + "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", + "license": "MIT" + }, + "node_modules/streamx": { + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.1.tgz", + "integrity": "sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA==", + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "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": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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/string-width-cjs/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/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/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/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-4.0.0.tgz", + "integrity": "sha512-PaqAvfUZKBwc/SLmNZtHmzK+v19Z4O4eS3cKPeGvbIv/U3pnyEq4Tuw3/4v/FwfM8VQaEawsyCcOQ0P+kpwWWw==", + "license": "MIT", + "dependencies": { + "js-tokens": "^10.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/structured-clone-es": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/structured-clone-es/-/structured-clone-es-2.0.1.tgz", + "integrity": "sha512-10ZL5r77LhknxlP1FBiCW+VdnuWOEFLdSS2SKtjyEV+L4qP1hUEIMIZW94LC3jKxRmT/Dj7KkD1mqh/IY6lhKQ==", + "license": "ISC" + }, + "node_modules/stylehacks": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-8.0.4.tgz", + "integrity": "sha512-irgZeyYBFVkb8k7yTRQ9No/bTniTGqzptGVMG1/Mj3N2YnI8nIozzY1pcok4i01NfrCSqvc0PdQB6O6kr6dJHw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.8", + "postcss-selector-parser": "^7.1.5" + }, + "engines": { + "node": "^22.11.0 || ^24.11.0 || >=26.0" + }, + "peerDependencies": { + "postcss": "^8.5.26" + } + }, + "node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svgo": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.1.0.tgz", + "integrity": "sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==", + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^6.0.0", + "css-tree": "^3.0.1", + "css-what": "^7.0.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "1.6.1" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tailwind-merge": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwind-variants": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-3.3.1.tgz", + "integrity": "sha512-4pAvwUtM4HKBiRZftncAbpn6V9Hhwoa5Fl7O2u5zbp7Z5Cvu+/o/6+176WY3WCEES209543quG8zFIcXCsc5Jw==", + "license": "MIT", + "engines": { + "node": ">=16.9.x", + "pnpm": ">=7.x" + }, + "peerDependencies": { + "tailwind-merge": ">=3.0.0", + "tailwindcss": "*" + }, + "peerDependenciesMeta": { + "tailwind-merge": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/tailwindcss": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar-stream": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.1.tgz", + "integrity": "sha512-nqsEO8zLZJvrOMdEwkA0QdCLFbetHMn95Zqu4fKwX+hkaTWJPZZOrxx/PwtxoK0MMGQmBQNRW3CPs8IFYQz4cQ==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "bare-fs": "^4.5.5", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/terser": { + "version": "5.51.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.51.2.tgz", + "integrity": "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tinyclip": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.15.tgz", + "integrity": "sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==", + "license": "MIT", + "engines": { + "node": "^16.14.0 || >= 17.3.0" + } + }, + "node_modules/tinyexec": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", + "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", + "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==", + "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/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-buffer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "license": "MIT", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trim-trailing-lines": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-2.1.0.tgz", + "integrity": "sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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-fest": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.8.0.tgz", + "integrity": "sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==", + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-level-regexp": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/type-level-regexp/-/type-level-regexp-0.1.17.tgz", + "integrity": "sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg==", + "license": "MIT" + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "license": "MIT" + }, + "node_modules/ultrahtml": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.7.0.tgz", + "integrity": "sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==", + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" + }, + "node_modules/unctx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/unctx/-/unctx-3.0.1.tgz", + "integrity": "sha512-5RAt2etv7g362RXyd33R82gm9u/kbtQlpoaOs9Bgm4E32GRMJ0xjbZyvdxUTmiuHk3V1IQb1aUNrp5IWY+JaWw==", + "license": "MIT", + "peerDependencies": { + "magic-string": ">=0.30.21", + "oxc-parser": ">=0.140.0", + "rolldown": "^1.1.5", + "unplugin": "^3.3.0" + }, + "peerDependenciesMeta": { + "magic-string": { + "optional": true + }, + "oxc-parser": { + "optional": true + }, + "rolldown": { + "optional": true + }, + "unplugin": { + "optional": true + } + } + }, + "node_modules/undici": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.0.tgz", + "integrity": "sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==", + "license": "MIT", + "engines": { + "node": ">=22.19.0" + } + }, + "node_modules/unenv": { + "version": "2.0.0-rc.24", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", + "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3" + } + }, + "node_modules/unhead": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/unhead/-/unhead-3.4.0.tgz", + "integrity": "sha512-OlgpyYjY+NkFyQCaMihg2uTFbbvyr5lZr6TokS68VdFTXJ5jo4JwFtGR8PwKy/wRpjbQYgKF7ZYO+pbRgxtSmw==", + "license": "MIT", + "dependencies": { + "hookable": "^6.1.1", + "unplugin": "^3.3.0" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "vite": ">=6.4.2" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/unhead/node_modules/hookable": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.1.tgz", + "integrity": "sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==", + "license": "MIT" + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", + "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unifont": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.5.tgz", + "integrity": "sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.1.0", + "ohash": "^2.0.11", + "undici": "^8.0.0" + } + }, + "node_modules/unimport": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-6.4.0.tgz", + "integrity": "sha512-JJOOuNMFq8b4ZPBKwQUxEcba4MplskDzYI1Lvrf8rJfWphZTWvPNXWa493qsPngHUmub89w6C7j+SeLWTE/UIQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.18.0", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "local-pkg": "^1.2.1", + "magic-string": "^1.1.0", + "mlly": "^1.8.2", + "pathe": "^2.0.3", + "picomatch": "^4.0.5", + "pkg-types": "^2.3.1", + "scule": "^1.3.0", + "strip-literal": "^4.0.0", + "tinyglobby": "^0.2.17", + "unplugin": "^3.3.0", + "unplugin-utils": "^0.3.2" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "oxc-parser": "*", + "rolldown": "^1.0.0" + }, + "peerDependenciesMeta": { + "oxc-parser": { + "optional": true + }, + "rolldown": { + "optional": true + } + } + }, + "node_modules/unimport/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/unimport/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unist-builder": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-4.0.0.tgz", + "integrity": "sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unplugin": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.3.0.tgz", + "integrity": "sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "picomatch": "^4.0.4", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@farmfe/core": "*", + "@rspack/core": "*", + "bun-types-no-globals": "*", + "esbuild": "*", + "rolldown": "*", + "rollup": "*", + "unloader": "*", + "vite": "*", + "webpack": "*" + }, + "peerDependenciesMeta": { + "@farmfe/core": { + "optional": true + }, + "@rspack/core": { + "optional": true + }, + "bun-types-no-globals": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "rolldown": { + "optional": true + }, + "rollup": { + "optional": true + }, + "unloader": { + "optional": true + }, + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/unplugin-auto-import": { + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-21.1.0.tgz", + "integrity": "sha512-EzrSqWIBulEqCuP7idADXH+tVKYrbwKlR5+r/lOWik0o+Ksny1kitmtryHGNSv7puzzORlcIwT/x2JStiszlHA==", + "license": "MIT", + "dependencies": { + "local-pkg": "^1.2.1", + "magic-string": "^1.1.0", + "picomatch": "^4.0.5", + "unimport": "^6.4.0", + "unplugin": "^3.3.0", + "unplugin-utils": "^0.3.2" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^4.0.0", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } + } + }, + "node_modules/unplugin-auto-import/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.2.tgz", + "integrity": "sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==", + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-utils/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unplugin-vue-components": { + "version": "32.1.0", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-32.1.0.tgz", + "integrity": "sha512-YiUkSxuRjab18XFOrX5VsIxXzccrfmHVGsGeJgSgklb829DQmCy9E4vvDUE4tuvZZdxyFJZX0Oc4TPnnxiiMyg==", + "license": "MIT", + "dependencies": { + "chokidar": "^5.0.0", + "local-pkg": "^1.2.0", + "magic-string": "^0.30.21", + "mlly": "^1.8.2", + "obug": "^2.1.1", + "picomatch": "^4.0.4", + "tinyglobby": "^0.2.16", + "unplugin": "^3.0.0", + "unplugin-utils": "^0.3.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2 || ^4.0.0", + "vue": "^3.0.0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-components/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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/unplugin-vue-components/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unplugin/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unrouting": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/unrouting/-/unrouting-0.2.3.tgz", + "integrity": "sha512-8wOFT/fBh8YeeDr1aVmkXCqYVTMbQ6vzfNzwzybKmSfXdRhGCq1Y2B1e9YeB0JEf85gbvSwJHAMu3D2IEcLGKA==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^5.0.0", + "ufo": "^1.6.3" + } + }, + "node_modules/unstorage": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz", + "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.10", + "lru-cache": "^11.2.7", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/unstorage/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/untun": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/untun/-/untun-0.2.2.tgz", + "integrity": "sha512-+NnOJcSiEtYsVgJmXUzQbJeRAFXJC4yPJYuh6kF9B0Rm6zunXcs/3GZOTllyocSbUDIxD6Bj7e/4ATw7sph1Sw==", + "license": "MIT", + "bin": { + "untun": "dist/cli.mjs" + } + }, + "node_modules/untyped": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/untyped/-/untyped-2.0.0.tgz", + "integrity": "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==", + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "defu": "^6.1.4", + "jiti": "^2.4.2", + "knitwork": "^1.2.0", + "scule": "^1.3.0" + }, + "bin": { + "untyped": "dist/cli.mjs" + } + }, + "node_modules/untyped/node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/unwasm": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/unwasm/-/unwasm-0.5.3.tgz", + "integrity": "sha512-keBgTSfp3r6+s9ZcSma+0chwxQdmLbB5+dAD9vjtB21UTMYuKAxHXCU1K2CbCtnP09EaWeRvACnXk0EJtUx+hw==", + "license": "MIT", + "dependencies": { + "exsolve": "^1.0.8", + "knitwork": "^1.3.0", + "magic-string": "^0.30.21", + "mlly": "^1.8.0", + "pathe": "^2.0.3", + "pkg-types": "^2.3.0" + } + }, + "node_modules/unwasm/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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", + "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uqr": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.3.tgz", + "integrity": "sha512-0rjE8iEJe4YmT9TOhwsZtqCMRLc5DXZUI2UEYUUg63ikBkqqE5EYWaI0etFe/5KUcmcYwLih2RND1kq+hrUJXA==", + "license": "MIT" + }, + "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/vaul-vue": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/vaul-vue/-/vaul-vue-0.4.1.tgz", + "integrity": "sha512-A6jOWOZX5yvyo1qMn7IveoWN91mJI5L3BUKsIwkg6qrTGgHs1Sb1JF/vyLJgnbN1rH4OOOxFbtqL9A46bOyGUQ==", + "dependencies": { + "@vueuse/core": "^10.8.0", + "reka-ui": "^2.0.0", + "vue": "^3.4.5" + }, + "peerDependencies": { + "reka-ui": "^2.0.0", + "vue": "^3.3.0" + } + }, + "node_modules/vaul-vue/node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "license": "MIT" + }, + "node_modules/vaul-vue/node_modules/@vueuse/core": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz", + "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.11.1", + "@vueuse/shared": "10.11.1", + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vaul-vue/node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vaul-vue/node_modules/@vueuse/metadata": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz", + "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vaul-vue/node_modules/@vueuse/shared": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz", + "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==", + "license": "MIT", + "dependencies": { + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vaul-vue/node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/verkit": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/verkit/-/verkit-0.3.2.tgz", + "integrity": "sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==", + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", + "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.4.0 || ^0.5.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/vite-dev-rpc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vite-dev-rpc/-/vite-dev-rpc-2.0.0.tgz", + "integrity": "sha512-yKwbTwdHKSD2k/aGqyWpPHepo45OQc8lH3/6IfT4ZqeKE26ooKvi4WIEKzqWav8v+9Is8u1k8q54hvOmqASazA==", + "license": "MIT", + "dependencies": { + "birpc": "^4.0.0", + "vite-hot-client": "^2.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0 || ^8.0.0" + } + }, + "node_modules/vite-hot-client": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-2.2.0.tgz", + "integrity": "sha512-76Zs9zrHbH7M7wqeyooGQKdX+yg0pQ0xuQ1PbFp4z5a0Lzn2e5IPFoCswnmqZ4GiwqB4Jo3WcDAMO9jARTJl8w==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 || ^8.0.0" + } + }, + "node_modules/vite-node": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-6.0.0.tgz", + "integrity": "sha512-oj4PVrT+pDh6GYf5wfUXkcZyekYS8kKPfLPXVl8qe324Ec6l4K2DUKNadRbZ3LQl0qGcDz+PyOo7ZAh00Y+JjQ==", + "license": "MIT", + "dependencies": { + "cac": "^7.0.0", + "es-module-lexer": "^2.0.0", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "vite": "^8.0.0" + }, + "bin": { + "vite-node": "dist/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://opencollective.com/antfu" + } + }, + "node_modules/vite-node/node_modules/cac": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cac/-/cac-7.0.0.tgz", + "integrity": "sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==", + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/vite-plugin-checker": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.14.5.tgz", + "integrity": "sha512-c9lQ92eisUO+F7Fd93aelojmiOS+NQpPgQ1XR2LTQHox1/laZf4yAoQj+L3RA9Vgh10e2nFd9b8r2LLyYZsbpA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "chokidar": "^5.0.0", + "npm-run-path": "^6.0.0", + "picocolors": "^1.1.1", + "picomatch": "^4.0.4", + "proper-lockfile": "^4.1.2", + "tiny-invariant": "^1.3.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@biomejs/biome": ">=2.4.12", + "eslint": ">=9.39.4", + "meow": "^13.2.0 || ^14.0.0", + "optionator": "^0.9.4", + "oxlint": ">=1", + "stylelint": ">=16.26.1", + "typescript": "*", + "vite": ">=5.4.21", + "vue-tsc": "~2.2.10 || ^3.0.0" + }, + "peerDependenciesMeta": { + "@biomejs/biome": { + "optional": true + }, + "eslint": { + "optional": true + }, + "meow": { + "optional": true + }, + "optionator": { + "optional": true + }, + "oxlint": { + "optional": true + }, + "stylelint": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/vite-plugin-checker/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-checker/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-checker/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vite-plugin-checker/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-inspect": { + "version": "11.4.1", + "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-11.4.1.tgz", + "integrity": "sha512-ShOFe2PURXGvRS5OrgmOLZOCwDTD7dEBVt0tMpFPKb9AsvqXKCRGM8QgKrUbRbJYFXScHvDPpGRd28rYidC0tA==", + "license": "MIT", + "dependencies": { + "ansis": "^4.3.0", + "error-stack-parser-es": "^1.0.5", + "obug": "^2.1.1", + "ohash": "^2.0.11", + "open": "^11.0.0", + "perfect-debounce": "^2.1.0", + "sirv": "^3.0.2", + "unplugin-utils": "^0.3.1", + "vite-dev-rpc": "^2.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0-0 || ^8.0.0-0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/vite-plugin-inspect/node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vite-plugin-vue-tracer": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-tracer/-/vite-plugin-vue-tracer-1.5.0.tgz", + "integrity": "sha512-G2aQ676fLBPnYhRi5lsARoL4hbtc/sx6fVzO7p44AB+1xQXo2UuiRgv7K26UdijrNzmuQprmJ121n3rdjBk1CA==", + "license": "MIT", + "dependencies": { + "estree-walker": "^3.0.3", + "exsolve": "^1.1.1", + "magic-string": "^1.1.0", + "pathe": "^2.0.3", + "source-map-js": "^1.2.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0", + "vue": "^3.5.0" + } + }, + "node_modules/vite-plugin-vue-tracer/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vscode-uri": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.2.0.tgz", + "integrity": "sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==", + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.42.tgz", + "integrity": "sha512-4RyHQTbQvOPs3MfvUO1Sg0YRrKNnA0mAVtvpd12Tg1fKDN7OHBUl1IqSn8zGJjK9nI3NkNp8cgTpVrSZC5TTcA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.42", + "@vue/compiler-sfc": "3.5.42", + "@vue/runtime-dom": "3.5.42", + "@vue/server-renderer": "3.5.42", + "@vue/shared": "3.5.42" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-bundle-renderer": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/vue-bundle-renderer/-/vue-bundle-renderer-2.3.2.tgz", + "integrity": "sha512-BtazFw0lm3N/ZE4+tre2g8G+c5wolfizu+e5jxZAcao0gcy5KJei9Yopl1svDato2poeFldVLfmLMk57Sg8rLg==", + "license": "MIT", + "dependencies": { + "ufo": "^1.6.4" + } + }, + "node_modules/vue-component-meta": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/vue-component-meta/-/vue-component-meta-3.3.11.tgz", + "integrity": "sha512-fskQZaIFOifwB4x+/J24795yvezOJ1TKaqn97/4PHybyvXpDNdcKn3oTcPrw6HnNoZWe343A+TiCFOcFv1/SuQ==", + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.28", + "@vue/language-core": "3.3.11", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-component-type-helpers": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.3.11.tgz", + "integrity": "sha512-LwcxzeliO9fkQcpJG0PoX8X5kmAhKmH9wkpDLxNabwzkQ9Zeib2YVHwFV4pcWmMLfXVfjr/dSV+DaJ3cIPgSNA==", + "license": "MIT" + }, + "node_modules/vue-devtools-stub": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/vue-devtools-stub/-/vue-devtools-stub-0.1.0.tgz", + "integrity": "sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==", + "license": "MIT" + }, + "node_modules/vue-router": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.3.0.tgz", + "integrity": "sha512-a2PBXX9yfkS58JzSJALUffgDa09lEzKmCcEnLaepoIr88L+9hEnsgEQkcadJGID+vtHa0gFpVo064zmylA9fcg==", + "license": "MIT", + "dependencies": { + "@vue-macros/common": "^3.1.3", + "@vue/devtools-api": "^8.1.5", + "ast-walker-scope": "^0.9.0", + "chokidar": "^5.0.0", + "confbox": "^0.2.4", + "local-pkg": "^1.2.1", + "magic-string": "^0.30.21", + "mlly": "^1.8.2", + "muggle-string": "^0.4.1", + "nostics": "^1.1.4", + "pathe": "^2.0.3", + "picomatch": "^4.0.5", + "scule": "^1.3.0", + "tinyglobby": "^0.2.17", + "unplugin": "^3.3.0", + "unplugin-utils": "^0.3.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@pinia/colada": ">=0.21.2", + "@vue/compiler-sfc": "^3.5.34 || ^4.0.0", + "pinia": "^3.0.4 || ^4.0.2", + "vite": "^7.3.0 || ^8.0.0", + "vue": "^3.5.34 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@pinia/colada": { + "optional": true + }, + "@vue/compiler-sfc": { + "optional": true + }, + "pinia": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/vue-router/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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/vue-router/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "license": "MIT" + }, + "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/wheel-gestures": { + "version": "2.2.48", + "resolved": "https://registry.npmjs.org/wheel-gestures/-/wheel-gestures-2.2.48.tgz", + "integrity": "sha512-f+Gy33Oa5Z14XY9679Zze+7VFhbsQfBFXodnU2x589l4kxGM9L5Y8zETTmcMR5pWOPQyRv4Z0lNax6xCO0NSlA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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/ws": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-1.0.0.tgz", + "integrity": "sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/y-protocols": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.7.tgz", + "integrity": "sha512-YSVsLoXxO67J6eE/nV4AtFtT3QEotZf5sK5BHxFBXso7VDUT3Tx07IfA6hsu5Q5OmBdMkQVmFZ9QOA7fikWvnw==", + "license": "MIT", + "peer": true, + "dependencies": { + "lib0": "^0.2.85" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "yjs": "^13.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/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz", + "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==", + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^8.2.1", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yjs": { + "version": "13.6.32", + "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.32.tgz", + "integrity": "sha512-lfiJIIC4Xayt5ItynE407ehlE03pCjeOc4hkR4yxxvvNJ4kuiN25B0g+Qp8XagYz361LLL7DCzR5bvFJ81QKtQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "lib0": "^0.2.99" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, + "node_modules/youch": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.1.tgz", + "integrity": "sha512-mxW3qiSnl+GRxXsaUMzv2Mbada1Y8CDltET9UxejDQe6DBYlSekghl5U5K0ReAikcHDi0G1vKZEmmo/NWAGKLA==", + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.6", + "@poppinss/dumper": "^0.7.0", + "@speed-highlight/core": "^1.2.14", + "cookie-es": "^3.0.1", + "youch-core": "^0.3.3" + } + }, + "node_modules/youch-core": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz", + "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", + "license": "MIT", + "dependencies": { + "@poppinss/exception": "^1.2.2", + "error-stack-parser-es": "^1.0.5" + } + }, + "node_modules/youch-core/node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/youch/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/zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/site/package.json b/site/package.json new file mode 100644 index 0000000..f3dcbf2 --- /dev/null +++ b/site/package.json @@ -0,0 +1,26 @@ +{ + "name": "site", + "private": true, + "type": "module", + "scripts": { + "build": "nuxt build", + "dev": "nuxt dev --port 3000", + "generate": "nuxt generate", + "preview": "nuxt preview" + }, + "dependencies": { + "@nuxt/content": "^3.15.2", + "@nuxt/fonts": "^0.14.0", + "@nuxt/ui": "^4.11.0", + "better-sqlite3": "^13.0.3", + "markdown-it": "^14.1.0", + "nuxt": "^4.5.2", + "shiki": "^3.4.0", + "vue": "^3.5.41", + "vue-router": "^5.2.0" + }, + "devDependencies": { + "@iconify-json/lucide": "^1.2.127", + "@types/markdown-it": "^14.1.2" + } +} diff --git a/site/public/CNAME b/site/public/CNAME new file mode 100644 index 0000000..f75d768 --- /dev/null +++ b/site/public/CNAME @@ -0,0 +1 @@ +autofixture.com diff --git a/site/public/dotnet-foundation.svg b/site/public/dotnet-foundation.svg new file mode 100644 index 0000000..ff0f681 --- /dev/null +++ b/site/public/dotnet-foundation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/public/favicon.ico b/site/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..18993ad91cfd43e03b074dd0b5cc3f37ab38e49c GIT binary patch literal 4286 zcmeHLOKuuL5PjK%MHWVi6lD zOGiREbCw`xmFozJ^aNatJY>w+g ze6a2@u~m#^BZm@8wco9#Crlli0uLb^3E$t2-WIc^#(?t)*@`UpuofJ(Uyh@F>b3Ph z$D^m8Xq~pTkGJ4Q`Q2)te3mgkWYZ^Ijq|hkiP^9`De={bQQ%heZC$QU2UpP(-tbl8 zPWD2abEew;oat@w`uP3J^YpsgT%~jT(Dk%oU}sa$7|n6hBjDj`+I;RX(>)%lm_7N{+B7Mu%H?422lE%MBJH!!YTN2oT7xr>>N-8OF$C&qU^ z>vLsa{$0X%q1fjOe3P1mCv#lN{xQ4_*HCSAZjTb1`}mlc+9rl8$B3OP%VT@mch_~G z7Y+4b{r>9e=M+7vSI;BgB?ryZDY4m>&wcHSn81VH1N~`0gvwH{ z8dv#hG|OK`>1;j7tM#B)Z7zDN?{6=dUal}$e + AutoFixture + + + + + diff --git a/site/public/icon.svg b/site/public/icon.svg new file mode 100644 index 0000000..583e7c4 --- /dev/null +++ b/site/public/icon.svg @@ -0,0 +1,7 @@ + + AutoFixture + + + + + diff --git a/site/public/images/fixture-pipeline.png b/site/public/images/fixture-pipeline.png new file mode 100644 index 0000000000000000000000000000000000000000..555e725caa899f644fcafee4670fbd1f6ac13b5b GIT binary patch literal 97176 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 literal 0 HcmV?d00001 diff --git a/site/public/logo.svg b/site/public/logo.svg new file mode 100644 index 0000000..5c10962 --- /dev/null +++ b/site/public/logo.svg @@ -0,0 +1,15 @@ + + + + + + AutoFixture + diff --git a/site/readme.md b/site/readme.md new file mode 100644 index 0000000..0ecda09 --- /dev/null +++ b/site/readme.md @@ -0,0 +1,21 @@ +# Site + +Nuxt Content app for AutoFixture docs. + +## Setup + +```bash +just site-install +just prepare-api # generate + copy API markdown into content/api +just site-dev +``` + +## Routes + +| Path | Content | +|------|---------| +| `/` | Home | +| `/docs/**` | Guides (Getting Started section; docs layout) | +| `/api/{package}/{line}/**` | Generated API reference | + +On API pages, the header banner shows the docs line (`v5`) and the concrete package version from `index.md` frontmatter. diff --git a/site/server/api/highlight-code.post.ts b/site/server/api/highlight-code.post.ts new file mode 100644 index 0000000..c354b9c --- /dev/null +++ b/site/server/api/highlight-code.post.ts @@ -0,0 +1,11 @@ +export default defineEventHandler(async (event) => { + const body = await readBody<{ code?: string, lang?: string }>(event) + + if (!body?.code) { + throw createError({ statusCode: 400, statusMessage: 'Missing code' }) + } + + return { + html: await highlightCode(body.code, body.lang ?? 'text'), + } +}) diff --git a/site/server/middleware/api-canonical-redirect.ts b/site/server/middleware/api-canonical-redirect.ts new file mode 100644 index 0000000..7771dab --- /dev/null +++ b/site/server/middleware/api-canonical-redirect.ts @@ -0,0 +1,22 @@ +import { existsSync } from 'node:fs' +import { apiMarkdownFile, parseApiRoutePath } from '../utils/apiPaths' +import { readApiSlugIndex } from '../utils/apiSlugIndex' + +export default defineEventHandler(async (event) => { + const url = getRequestURL(event) + const path = url.pathname.toLowerCase().replace(/\/$/, '') + const parsed = parseApiRoutePath(path) + + if (!parsed || parsed.slug === 'index') return + + if (existsSync(apiMarkdownFile(parsed.packageId, parsed.versionSegment, parsed.slug))) { + return + } + + const slugIndex = await readApiSlugIndex() + const canonical = slugIndex[parsed.slug] + + if (!canonical || canonical === path) return + + return sendRedirect(event, `${canonical}${url.hash}`, 302) +}) diff --git a/site/server/routes/api-render.get.ts b/site/server/routes/api-render.get.ts new file mode 100644 index 0000000..95e9312 --- /dev/null +++ b/site/server/routes/api-render.get.ts @@ -0,0 +1,12 @@ +import { loadApiPage } from '../utils/loadApiPage' + +export default defineEventHandler(async (event) => { + const path = String(getQuery(event).path || '') + const page = await loadApiPage(path) + + if (!page) { + throw createError({ statusCode: 404, statusMessage: 'API page not found' }) + } + + return page +}) diff --git a/site/server/utils/apiPaths.ts b/site/server/utils/apiPaths.ts new file mode 100644 index 0000000..2ae260f --- /dev/null +++ b/site/server/utils/apiPaths.ts @@ -0,0 +1,30 @@ +import { join } from 'node:path' + +const API_PATH_RE = /^\/api\/([^/]+)\/([^/]+)(?:\/(.*))?$/i + +export function parseApiRoutePath(path: string) { + const normalized = path.toLowerCase().replace(/\/$/, '') + const match = normalized.match(API_PATH_RE) + if (!match) return null + + const packageId = match[1]!.toLowerCase() + const versionSegment = match[2]! + const slug = match[3]?.replace(/\/$/, '') || 'index' + + return { + packageId, + versionSegment, + slug, + pagePath: slug === 'index' + ? `/api/${packageId}/${versionSegment}` + : `/api/${packageId}/${versionSegment}/${slug}`, + } +} + +export function apiMarkdownFile(packageId: string, versionSegment: string, slug: string) { + return join(process.cwd(), 'public', 'api-markdown', packageId, versionSegment, `${slug}.md`) +} + +export function apiPageMetaFile(packageId: string, versionSegment: string, slug: string) { + return join(process.cwd(), 'public', 'api-meta', packageId, versionSegment, 'pages', `${slug}.json`) +} diff --git a/site/server/utils/apiSlugIndex.ts b/site/server/utils/apiSlugIndex.ts new file mode 100644 index 0000000..cdbb8de --- /dev/null +++ b/site/server/utils/apiSlugIndex.ts @@ -0,0 +1,13 @@ +import { readFile } from 'node:fs/promises' +import { join } from 'node:path' + +let slugIndexPromise: Promise> | null = null + +export async function readApiSlugIndex(): Promise> { + if (!slugIndexPromise) { + slugIndexPromise = readFile(join(process.cwd(), 'public/api-meta/slug-index.json'), 'utf8') + .then((content) => JSON.parse(content) as Record) + .catch(() => ({})) + } + return slugIndexPromise +} diff --git a/site/server/utils/highlightCode.ts b/site/server/utils/highlightCode.ts new file mode 100644 index 0000000..e8c62e1 --- /dev/null +++ b/site/server/utils/highlightCode.ts @@ -0,0 +1,42 @@ +import { createHighlighter, type Highlighter } from 'shiki' + +const SHIKI_LIGHT_THEME = 'light-plus' +const SHIKI_DARK_THEME = 'dark-plus' + +const LANGS = ['csharp', 'json', 'js', 'ts', 'html', 'css', 'vue', 'shell', 'bash', 'xml', 'yaml', 'md', 'text'] as const + +let highlighterPromise: Promise | null = null + +async function getHighlighter() { + if (!highlighterPromise) { + highlighterPromise = createHighlighter({ + themes: [SHIKI_LIGHT_THEME, SHIKI_DARK_THEME], + langs: [...LANGS], + }) + } + return highlighterPromise +} + +function normalizeLang(lang: string) { + const value = lang.trim().toLowerCase() + if (value === 'cs') return 'csharp' + if (value === 'csproj') return 'xml' + return LANGS.includes(value as typeof LANGS[number]) ? value : 'text' +} + +export async function getCodeHighlighter() { + return getHighlighter() +} + +export { normalizeLang } + +export async function highlightCode(code: string, lang = 'text') { + const highlighter = await getHighlighter() + return highlighter.codeToHtml(code.trimEnd(), { + lang: normalizeLang(lang), + themes: { + light: SHIKI_LIGHT_THEME, + dark: SHIKI_DARK_THEME, + }, + }) +} diff --git a/site/server/utils/loadApiPage.ts b/site/server/utils/loadApiPage.ts new file mode 100644 index 0000000..774ac8e --- /dev/null +++ b/site/server/utils/loadApiPage.ts @@ -0,0 +1,30 @@ +import { readFile } from 'node:fs/promises' +import type { ApiPageMeta, ApiRenderResponse } from '~/types/api-page' +import { apiMarkdownFile, apiPageMetaFile, parseApiRoutePath } from './apiPaths' +import { renderApiMarkdown } from './renderApiMarkdown' + +export async function loadApiPage(path: string): Promise { + const parsed = parseApiRoutePath(path) + if (!parsed) return null + + const { packageId, versionSegment, slug, pagePath } = parsed + + let markdown: string + let meta: ApiPageMeta + + try { + markdown = await readFile(apiMarkdownFile(packageId, versionSegment, slug), 'utf8') + meta = JSON.parse(await readFile(apiPageMetaFile(packageId, versionSegment, slug), 'utf8')) as ApiPageMeta + } catch { + return null + } + + if (meta.path !== pagePath) return null + + const html = await renderApiMarkdown(markdown) + + return { + ...meta, + html, + } +} diff --git a/site/server/utils/renderApiMarkdown.ts b/site/server/utils/renderApiMarkdown.ts new file mode 100644 index 0000000..ffba475 --- /dev/null +++ b/site/server/utils/renderApiMarkdown.ts @@ -0,0 +1,90 @@ +import MarkdownIt from 'markdown-it' +import { getCodeHighlighter, normalizeLang } from './highlightCode' + +const SHIKI_LIGHT_THEME = 'light-plus' +const SHIKI_DARK_THEME = 'dark-plus' + +function stripHtml(value: string) { + return value + .replace(/<[^>]+>/g, '') + .replace(/\\([\\`*_{}[\]()#+\-.!])/g, '$1') + .trim() +} + +function slugify(value: string) { + return value + .toLowerCase() + .replace(/[^\w\s-]/g, '') + .replace(/\s+/g, '-') + .replace(/-+/g, '-') + .replace(/^-|-$/g, '') +} + +function headingId(content: string) { + const idMatch = content.match(/ { + const token = tokens[idx]! + const inlineToken = tokens[idx + 1] + + if (inlineToken?.type === 'inline') { + const id = headingId(inlineToken.content) + if (id) { + token.attrSet('id', id) + } + } + + return defaultHeadingOpen + ? defaultHeadingOpen(tokens, idx, options, env, self) + : self.renderToken(tokens, idx, options) + } +} + +function normalizeHeadingAnchors(html: string) { + return html.replace( + /<(h[1-6])\s+id="([^"]+)">\s*<\/a>\s*/gi, + '<$1 id="$2">', + ) +} + +function stripFrontmatter(markdown: string) { + return markdown.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/, '') +} + +export async function renderApiMarkdown(markdown: string) { + const highlighter = await getCodeHighlighter() + const md = new MarkdownIt({ + html: true, + linkify: true, + typographer: false, + }) + + configureHeadingIds(md) + + md.renderer.rules.fence = (tokens, idx) => { + const token = tokens[idx]! + const lang = normalizeLang(token.info || 'text') + const code = token.content.replace(/\n$/, '') + const html = highlighter.codeToHtml(code, { + lang, + themes: { + light: SHIKI_LIGHT_THEME, + dark: SHIKI_DARK_THEME, + }, + }) + + return `
${html}
` + } + + md.renderer.rules.table_open = () => '
' + md.renderer.rules.table_close = () => '
' + + return normalizeHeadingAnchors(md.render(stripFrontmatter(markdown))) +} diff --git a/site/tsconfig.json b/site/tsconfig.json new file mode 100644 index 0000000..307b213 --- /dev/null +++ b/site/tsconfig.json @@ -0,0 +1,18 @@ +{ + // https://nuxt.com/docs/guide/concepts/typescript + "files": [], + "references": [ + { + "path": "./.nuxt/tsconfig.app.json" + }, + { + "path": "./.nuxt/tsconfig.server.json" + }, + { + "path": "./.nuxt/tsconfig.shared.json" + }, + { + "path": "./.nuxt/tsconfig.node.json" + } + ] +} From 4f223b0305483048601f70889cbfbd3493279ac3 Mon Sep 17 00:00:00 2001 From: Andrei Ivascu <7030530+aivascu@users.noreply.github.com> Date: Mon, 31 Aug 2026 20:25:39 +0300 Subject: [PATCH 2/6] Fix NuGet package extraction on Linux CI. Use unzip for .nupkg (ZIP) archives because GNU tar on Ubuntu cannot extract them; keep tar as a fallback for other platforms. --- api-gen/lib/nuget.mjs | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/api-gen/lib/nuget.mjs b/api-gen/lib/nuget.mjs index d44f05f..3bdbdda 100644 --- a/api-gen/lib/nuget.mjs +++ b/api-gen/lib/nuget.mjs @@ -28,7 +28,32 @@ function listTargetFrameworks(packageDir) { function extractNupkg(nupkgPath, destination) { fs.mkdirSync(destination, { recursive: true }) - execSync(`tar -xf "${nupkgPath}" -C "${destination}"`, { stdio: 'inherit' }) + + // .nupkg is a ZIP. GNU tar (Linux CI) cannot extract zip; Windows/macOS tar often can. + /** @type {Array<() => void>} */ + const attempts = process.platform === 'win32' + ? [ + () => execSync(`tar -xf "${nupkgPath}" -C "${destination}"`, { stdio: 'inherit' }), + ] + : [ + () => execSync(`unzip -o -q "${nupkgPath}" -d "${destination}"`, { stdio: 'inherit' }), + () => execSync(`tar -xf "${nupkgPath}" -C "${destination}"`, { stdio: 'inherit' }), + ] + + /** @type {unknown} */ + let lastError + for (const attempt of attempts) { + try { + attempt() + return + } catch (error) { + lastError = error + } + } + + throw lastError instanceof Error + ? lastError + : new Error(`Failed to extract ${nupkgPath}`) } export async function ensureNuGetPackage(cacheRoot, pkg) { From 939173393a61865adbe9172cff6877e39582d075 Mon Sep 17 00:00:00 2001 From: Andrei Ivascu <7030530+aivascu@users.noreply.github.com> Date: Mon, 31 Aug 2026 20:31:45 +0300 Subject: [PATCH 3/6] Fix API page 404s on Linux by lowercasing markdown filenames. DocFX emits PascalCase .md files while routes and loaders use lowercase slugs; that only worked on case-insensitive disks. Sync to lowercase names and resolve files case-insensitively as a fallback. --- api-gen/run.mjs | 3 ++- site/server/utils/apiPaths.ts | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/api-gen/run.mjs b/api-gen/run.mjs index 20d8bb6..d8c95fc 100644 --- a/api-gen/run.mjs +++ b/api-gen/run.mjs @@ -186,7 +186,8 @@ function syncPackageDir(sourceDir, markdownDir, metaDir) { const from = path.join(sourceDir, entry.name) if (entry.name.toLowerCase().endsWith('.md')) { - fs.copyFileSync(from, path.join(markdownDir, entry.name)) + // URLs and loaders use lowercase slugs; keep filenames lowercase for Linux CI. + fs.copyFileSync(from, path.join(markdownDir, entry.name.toLowerCase())) continue } diff --git a/site/server/utils/apiPaths.ts b/site/server/utils/apiPaths.ts index 2ae260f..a934df8 100644 --- a/site/server/utils/apiPaths.ts +++ b/site/server/utils/apiPaths.ts @@ -1,3 +1,4 @@ +import { existsSync, readdirSync } from 'node:fs' import { join } from 'node:path' const API_PATH_RE = /^\/api\/([^/]+)\/([^/]+)(?:\/(.*))?$/i @@ -21,10 +22,22 @@ export function parseApiRoutePath(path: string) { } } +function resolveFile(dir: string, fileName: string) { + const exact = join(dir, fileName) + if (existsSync(exact)) return exact + + if (!existsSync(dir)) return exact + + const match = readdirSync(dir).find(entry => entry.toLowerCase() === fileName.toLowerCase()) + return match ? join(dir, match) : exact +} + export function apiMarkdownFile(packageId: string, versionSegment: string, slug: string) { - return join(process.cwd(), 'public', 'api-markdown', packageId, versionSegment, `${slug}.md`) + const dir = join(process.cwd(), 'public', 'api-markdown', packageId, versionSegment) + return resolveFile(dir, `${slug}.md`) } export function apiPageMetaFile(packageId: string, versionSegment: string, slug: string) { - return join(process.cwd(), 'public', 'api-meta', packageId, versionSegment, 'pages', `${slug}.json`) + const dir = join(process.cwd(), 'public', 'api-meta', packageId, versionSegment, 'pages') + return resolveFile(dir, `${slug}.json`) } From 9e469d903eeec4d4cde9aa4fee73f40cdf122712 Mon Sep 17 00:00:00 2001 From: Andrei Ivascu <7030530+aivascu@users.noreply.github.com> Date: Mon, 31 Aug 2026 20:40:00 +0300 Subject: [PATCH 4/6] Remove leftover docs paths and unused site assets. Drop the unused Content collection stub, empty /docs index page, and unused public SVGs/ICO; clear the legacy content/api ignore and make clean remove that folder. --- .gitignore | 1 - api-gen/run.mjs | 2 ++ justfile | 4 ++-- site/app/pages/docs/index.vue | 9 --------- site/content.config.ts | 6 ------ site/content/index.md | 8 -------- site/nuxt.config.ts | 18 ++++++------------ site/package-lock.json | 4 ++-- site/package.json | 2 +- site/public/favicon.ico | Bin 4286 -> 0 bytes site/public/icon.svg | 7 ------- site/public/logo.svg | 15 --------------- site/readme.md | 8 ++++---- 13 files changed, 17 insertions(+), 67 deletions(-) delete mode 100644 site/app/pages/docs/index.vue delete mode 100644 site/content/index.md delete mode 100644 site/public/favicon.ico delete mode 100644 site/public/icon.svg delete mode 100644 site/public/logo.svg diff --git a/.gitignore b/.gitignore index 3f15dbf..25b9ae1 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,6 @@ site/.nuxt/ site/.output/ site/dist/ site/.data/ -site/content/api/ site/public/api-markdown/ site/public/api-meta/ site/public/api-catalog.json diff --git a/api-gen/run.mjs b/api-gen/run.mjs index d8c95fc..27661d2 100644 --- a/api-gen/run.mjs +++ b/api-gen/run.mjs @@ -247,6 +247,8 @@ function cleanAll() { removeIfExists(siteApiMarkdown) removeIfExists(siteApiMeta) removeIfExists(siteApiCatalog) + // Legacy path from an earlier Content-based sync; safe no-op if absent + removeIfExists(path.join(repoRoot, 'site/content/api')) console.log('Removed generated API output') } diff --git a/justfile b/justfile index 881e301..1a850d2 100644 --- a/justfile +++ b/justfile @@ -9,11 +9,11 @@ default: generate-api: node api-gen/run.mjs generate -# Copy generated API markdown into the Nuxt content tree +# Copy generated API markdown into site/public/api-markdown sync-api: node api-gen/run.mjs sync -# Generate API markdown and sync into the site +# Generate API markdown and sync into site/public prepare-api: node api-gen/run.mjs prepare diff --git a/site/app/pages/docs/index.vue b/site/app/pages/docs/index.vue deleted file mode 100644 index ffc8272..0000000 --- a/site/app/pages/docs/index.vue +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/site/content.config.ts b/site/content.config.ts index da5f7d1..6264bee 100644 --- a/site/content.config.ts +++ b/site/content.config.ts @@ -2,12 +2,6 @@ import { defineCollection, defineContentConfig, z } from '@nuxt/content' export default defineContentConfig({ collections: { - content: defineCollection({ - type: 'page', - source: { - include: '*.md', - }, - }), docs: defineCollection({ type: 'page', source: { diff --git a/site/content/index.md b/site/content/index.md deleted file mode 100644 index 2d9f069..0000000 --- a/site/content/index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: AutoFixture -description: AutoFixture makes unit tests more productive by creating anonymous test data for .NET. ---- - -# AutoFixture - -See the [home page](/) for the product overview. diff --git a/site/nuxt.config.ts b/site/nuxt.config.ts index 1ee718f..9db8b77 100644 --- a/site/nuxt.config.ts +++ b/site/nuxt.config.ts @@ -85,23 +85,17 @@ export default defineNuxtConfig({ dark: 'dark-plus', }, langs: [ - 'json', - 'js', - 'ts', - 'html', - 'css', - 'vue', - 'shell', - 'bash', + 'csharp', 'xml', - 'mdc', - 'md', + 'bash', + 'shell', + 'json', 'yaml', - 'csharp', + 'md', ], }, }, }, }, - compatibilityDate: '2024-04-03', + compatibilityDate: '2025-08-01', }) diff --git a/site/package-lock.json b/site/package-lock.json index dc1c9f3..5a4317b 100644 --- a/site/package-lock.json +++ b/site/package-lock.json @@ -1,10 +1,10 @@ { - "name": "site", + "name": "autofixture-docs", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "site", + "name": "autofixture-docs", "dependencies": { "@nuxt/content": "^3.15.2", "@nuxt/fonts": "^0.14.0", diff --git a/site/package.json b/site/package.json index f3dcbf2..6cedbcd 100644 --- a/site/package.json +++ b/site/package.json @@ -1,5 +1,5 @@ { - "name": "site", + "name": "autofixture-docs", "private": true, "type": "module", "scripts": { diff --git a/site/public/favicon.ico b/site/public/favicon.ico deleted file mode 100644 index 18993ad91cfd43e03b074dd0b5cc3f37ab38e49c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmeHLOKuuL5PjK%MHWVi6lD zOGiREbCw`xmFozJ^aNatJY>w+g ze6a2@u~m#^BZm@8wco9#Crlli0uLb^3E$t2-WIc^#(?t)*@`UpuofJ(Uyh@F>b3Ph z$D^m8Xq~pTkGJ4Q`Q2)te3mgkWYZ^Ijq|hkiP^9`De={bQQ%heZC$QU2UpP(-tbl8 zPWD2abEew;oat@w`uP3J^YpsgT%~jT(Dk%oU}sa$7|n6hBjDj`+I;RX(>)%lm_7N{+B7Mu%H?422lE%MBJH!!YTN2oT7xr>>N-8OF$C&qU^ z>vLsa{$0X%q1fjOe3P1mCv#lN{xQ4_*HCSAZjTb1`}mlc+9rl8$B3OP%VT@mch_~G z7Y+4b{r>9e=M+7vSI;BgB?ryZDY4m>&wcHSn81VH1N~`0gvwH{ z8dv#hG|OK`>1;j7tM#B)Z7zDN?{6=dUal}$e - AutoFixture - - - - - diff --git a/site/public/logo.svg b/site/public/logo.svg deleted file mode 100644 index 5c10962..0000000 --- a/site/public/logo.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - AutoFixture - diff --git a/site/readme.md b/site/readme.md index 0ecda09..232e846 100644 --- a/site/readme.md +++ b/site/readme.md @@ -6,7 +6,7 @@ Nuxt Content app for AutoFixture docs. ```bash just site-install -just prepare-api # generate + copy API markdown into content/api +just prepare-api # generate + copy API markdown into public/api-markdown just site-dev ``` @@ -15,7 +15,7 @@ just site-dev | Path | Content | |------|---------| | `/` | Home | -| `/docs/**` | Guides (Getting Started section; docs layout) | -| `/api/{package}/{line}/**` | Generated API reference | +| `/docs/**` | Guides (Get started section; docs layout) | +| `/api/{package}/{version}/**` | Generated API reference | -On API pages, the header banner shows the docs line (`v5`) and the concrete package version from `index.md` frontmatter. +API markdown is generated into `public/api-markdown` (not Nuxt Content). On API pages, the header shows the package and version from the API catalog. From 44f911526e158cf04e110db41ab179bdab6da0d7 Mon Sep 17 00:00:00 2001 From: Andrei Ivascu <7030530+aivascu@users.noreply.github.com> Date: Mon, 31 Aug 2026 20:44:19 +0300 Subject: [PATCH 5/6] Bump GitHub Actions to current majors for Node 24 runtimes. Update checkout, setup-node, setup-dotnet, cache, and Pages deploy actions so CI stops relying on deprecated Node 20 action runtimes. --- .github/actions/build-site/action.yml | 6 +++--- .github/workflows/ci.yml | 2 +- .github/workflows/deploy.yml | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/actions/build-site/action.yml b/.github/actions/build-site/action.yml index 0187fd6..fbd3aeb 100644 --- a/.github/actions/build-site/action.yml +++ b/.github/actions/build-site/action.yml @@ -15,7 +15,7 @@ runs: using: composite steps: - name: Setup .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v6 with: dotnet-version: ${{ inputs.dotnet-version }} @@ -26,14 +26,14 @@ runs: echo "$HOME/.dotnet/tools" >> "$GITHUB_PATH" - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v7 with: node-version: ${{ inputs.node-version }} cache: npm cache-dependency-path: site/package-lock.json - name: Cache NuGet packages for API generation - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: api-gen/packages-cache key: api-nuget-${{ hashFiles('api-gen/packages.json') }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 69cf664..0cd2483 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Build documentation site uses: ./.github/actions/build-site diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index ae24b2e..1ba52ef 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -21,16 +21,16 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Setup Pages - uses: actions/configure-pages@v5 + uses: actions/configure-pages@v6 - name: Build documentation site uses: ./.github/actions/build-site - name: Upload Pages artifact - uses: actions/upload-pages-artifact@v4 + uses: actions/upload-pages-artifact@v5 with: path: site/.output/public @@ -44,4 +44,4 @@ jobs: steps: - name: Deploy id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v5 From 1d9abe4dc465b9bd0383e7ab3d73f2da896a0191 Mon Sep 17 00:00:00 2001 From: Andrei Ivascu <7030530+aivascu@users.noreply.github.com> Date: Mon, 31 Aug 2026 20:46:54 +0300 Subject: [PATCH 6/6] Fix broken CreateMany API link in collections guide. Point the prerendered docs link at SpecimenFactory instead of the non-existent specimenfactory-1 slug. --- site/content/docs/3.how-to/1.collections.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/content/docs/3.how-to/1.collections.md b/site/content/docs/3.how-to/1.collections.md index 761ec07..0741ebd 100644 --- a/site/content/docs/3.how-to/1.collections.md +++ b/site/content/docs/3.how-to/1.collections.md @@ -149,4 +149,4 @@ When nested graphs fail validation, combine these with [Specimen graphs](/docs/f - [`ReadonlyCollectionPropertiesBehavior`](/api/autofixture/5-0-0-rc-1/autofixture.readonlycollectionpropertiesbehavior) - [`CollectionFiller.AddManyTo`](/api/autofixture/5-0-0-rc-1/autofixture.collectionfiller) - [`Fixture.RepeatCount`](/api/autofixture/5-0-0-rc-1/autofixture.fixture#repeatcount) -- [`CreateMany` extension](/api/autofixture/5-0-0-rc-1/autofixture.specimenfactory-1#createmany) +- [`CreateMany` extension](/api/autofixture/5-0-0-rc-1/autofixture.specimenfactory#createmany)