diff --git a/.dockerignore b/.dockerignore
index df59db5..afd6a06 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -85,5 +85,3 @@ blob-report
# Content collections output files
.content-collections
-# Output base directory of the documentation
-generated-docs/
diff --git a/.github/workflows/branch-preview.yml b/.github/workflows/branch-preview.yml
deleted file mode 100644
index fb225fe..0000000
--- a/.github/workflows/branch-preview.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-name: ๐ค Branch Preview
-
-concurrency:
- group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
-
-on:
- push:
- branches: [main]
-
-jobs:
- deploy:
- name: ๐ Deploy Branch Preview
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- - uses: forge-42/fly-deploy@v1.0.0-rc.2
- id: deploy
- env:
- FLY_ORG: ${{ vars.FLY_ORG }}
- FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
- FLY_REGION: ${{ vars.FLY_REGION }}
- with:
- app_name: ${{github.event.repository.name}}-${{ github.ref_name }}
- env_vars: |
- APP_ENV=staging
- GITHUB_OWNER=${{github.repository_owner}}
- GITHUB_REPO=${{github.event.repository.name}}
- GITHUB_REPO_URL=https://github.com/${{ github.repository }}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 2dfac97..a53e919 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,10 +1,11 @@
-name: ๐ Validation & Deploy Pipeline
+name: ๐ Validation Pipeline
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
pull_request:
branches: [main]
+
permissions:
actions: write
contents: read
@@ -15,74 +16,112 @@ jobs:
name: โฌฃ Biome lint
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
- - uses: biomejs/setup-biome@v2
- - run: biome ci . --reporter=github
+ - name: โฌ๏ธ Checkout repo
+ uses: actions/checkout@v4
+ - name: Setup Biome
+ uses: biomejs/setup-biome@v2
+ - name: Run Biome
+ run: biome ci .
- typecheck:
- needs: lint
- name: ๐ Type check
+ validate:
+ name: ๐ Validate
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
- - uses: pnpm/action-setup@v4
- - uses: actions/setup-node@v4
+ - name: ๐ Cancel Previous Runs
+ uses: styfle/cancel-workflow-action@0.12.1
+ - name: โฌ๏ธ Checkout repo
+ uses: actions/checkout@v4
+ - name: โ Setup node
+ uses: actions/setup-node@v4
with:
node-version-file: "package.json"
- cache: "pnpm"
+ - name: Install pnpm
+ uses: pnpm/action-setup@v4
+ - name: Install dependencies
+ run: pnpm install
- run: pnpm install --prefer-offline --frozen-lockfile
- - run: pnpm run typecheck
+ - run: pnpm exec playwright install chromium --with-deps
+ - name: ๐ Test
+ run: pnpm run test
+ - name: โ๏ธ Check unused code
+ run: pnpm run check:unused
- check-unused:
- needs: lint
- name: โ๏ธ Check unused code
+ build-docs:
+ name: โฌ๏ธ Build Docs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
+ with:
+ ref: ${{ github.head_ref }}
+ fetch-depth: 0
+
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version-file: "package.json"
- cache: "pnpm"
- - run: pnpm install --prefer-offline --frozen-lockfile
- - run: pnpm run check:unused
+ cache: pnpm
+
+ - name: Install deps
+ run: pnpm install --prefer-offline --frozen-lockfile
- vitest:
- needs: typecheck
- name: โก Unit Tests
+ - name: Generate docs
+ env:
+ APP_ENV: production
+ run: pnpm run generate:docs
+
+ - name: Pack generated docs (tarball)
+ run: |
+ tar -czf docs-generated.tgz generated-docs
+ ls -lh docs-generated.tgz
+
+ - name: Upload generated docs (tgz)
+ uses: actions/upload-artifact@v4
+ with:
+ name: docs-generated-tgz
+ path: docs-generated.tgz
+ if-no-files-found: error
+
+ - name: Upload versions file
+ uses: actions/upload-artifact@v4
+ with:
+ name: docs-versions
+ path: app/utils/versions.ts
+ if-no-files-found: error
+
+ deploy-docs-pr-preview:
+ name: ๐ Deploy Docs
+ needs: [build-docs]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- - uses: pnpm/action-setup@v4
- - uses: actions/setup-node@v4
+
+ - name: Download generated docs (tgz)
+ uses: actions/download-artifact@v4
with:
- node-version-file: "package.json"
- cache: "pnpm"
- - run: pnpm install --prefer-offline --frozen-lockfile
- - run: pnpm exec playwright install chromium --with-deps
- - run: pnpm run test:cov
- - name: "Report Coverage"
- # Only works if you set `reportOnFailure: true` in your vite config as specified above
- if: always()
- uses: davelosert/vitest-coverage-report-action@v2
+ name: docs-generated-tgz
+ path: .
+ - name: Unpack generated docs
+ run: |
+ tar -xzf docs-generated.tgz
+ ls -laR generated-docs | sed -n '1,200p'
+ - name: Download versions file
+ uses: actions/download-artifact@v4
+ with:
+ name: docs-versions
+ path: app/utils/
- deploy:
- needs: [lint, typecheck, check-unused, vitest]
- name: ๐ Deploy PR Preview
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- - uses: forge-42/fly-deploy@v1.0.0-rc.2
- id: deploy
- env:
- FLY_ORG: ${{ vars.FLY_ORG }}
- FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
- FLY_REGION: ${{ vars.FLY_REGION }}
- with:
- app_name: ${{github.event.repository.name}}-${{ github.event.number }}
- env_vars: |
- APP_ENV=staging
- GITHUB_OWNER=${{github.repository_owner}}
- GITHUB_REPO=${{github.event.repository.name}}
- GITHUB_REPO_URL=https://github.com/${{ github.repository }}
+ - uses: forge-42/fly-deploy@v1.0.0-rc.2
+ id: deploy
+ env:
+ FLY_ORG: ${{ vars.FLY_ORG }}
+ FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
+ FLY_REGION: ${{ vars.FLY_REGION }}
+ with:
+ app_name: ${{ github.event.repository.name }}-${{ github.event.number }}
+ use_isolated_workspace: true
+ env_vars: |
+ APP_ENV=production
+ GITHUB_OWNER=${{ github.repository_owner }}
+ GITHUB_REPO=${{ github.event.repository.name }}
+ GITHUB_REPO_URL=https://github.com/${{ github.repository }}
diff --git a/.github/workflows/build-documentation.yml b/.github/workflows/publish-documentation.yml
similarity index 53%
rename from .github/workflows/build-documentation.yml
rename to .github/workflows/publish-documentation.yml
index 2872860..0309b4e 100644
--- a/.github/workflows/build-documentation.yml
+++ b/.github/workflows/publish-documentation.yml
@@ -11,35 +11,72 @@ concurrency:
jobs:
build-docs:
+ name: Build Docs
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
+
- name: Setup pnpm
uses: pnpm/action-setup@v4
+
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version-file: "package.json"
- cache: "pnpm"
+ cache: pnpm
- name: Install deps
run: pnpm install --prefer-offline --frozen-lockfile
- name: Generate docs
- working-directory: docs
+ env:
+ APP_ENV: production
run: pnpm run generate:docs
+ - name: Pack generated docs (tarball)
+ run: |
+ tar -czf docs-generated.tgz generated-docs
+ ls -lh docs-generated.tgz
+ - name: Upload generated docs (tgz)
+ uses: actions/upload-artifact@v4
+ with:
+ name: docs-generated-tgz
+ path: docs-generated.tgz
+ if-no-files-found: error
+
+ - name: Upload versions file
+ uses: actions/upload-artifact@v4
+ with:
+ name: docs-versions
+ path: app/utils/versions.ts
+ if-no-files-found: error
- deploy:
- name: ๐ Deploy Release
+ deploy-docs-on-release:
needs: [build-docs]
+ name: Deploy Docs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
+ - name: Download generated docs (tgz)
+ uses: actions/download-artifact@v4
+ with:
+ name: docs-generated-tgz
+ path: .
+
+ - name: Unpack generated docs into docs/
+ run: |
+ tar -xzf docs-generated.tgz
+ ls -laR generated-docs | sed -n '1,200p'
+ - name: Download versions file
+ uses: actions/download-artifact@v4
+ with:
+ name: docs-versions
+ path: docs/app/utils
+
- uses: forge-42/fly-deploy@v1.0.0-rc.2
id: deploy
env:
@@ -48,6 +85,7 @@ jobs:
FLY_REGION: ${{ vars.FLY_REGION }}
with:
app_name: ${{github.event.repository.name}}-${{ github.ref_name }}
+ use_isolated_workspace: true
env_vars: |
APP_ENV=production
GITHUB_OWNER=${{ github.repository_owner }}
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..9dc8168
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,128 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, religion, or sexual identity
+and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+## Our Standards
+
+Examples of behavior that contributes to a positive environment for our
+community include:
+
+- Demonstrating empathy and kindness toward other people
+- Being respectful of differing opinions, viewpoints, and experiences
+- Giving and gracefully accepting constructive feedback
+- Accepting responsibility and apologizing to those affected by our mistakes,
+ and learning from the experience
+- Focusing on what is best not just for us as individuals, but for the
+ overall community
+
+Examples of unacceptable behavior include:
+
+- The use of sexualized language or imagery, and sexual attention or
+ advances of any kind
+- Trolling, insulting or derogatory comments, and personal or political attacks
+- Public or private harassment
+- Publishing others' private information, such as a physical or email
+ address, without their explicit permission
+- Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Enforcement Responsibilities
+
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
+
+Community leaders have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for moderation
+decisions when appropriate.
+
+## Scope
+
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official e-mail address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the community leaders responsible for enforcement at
+.
+All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series
+of actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or
+permanent ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within
+the community.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 2.0, available at
+https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
+
+Community Impact Guidelines were inspired by [Mozilla's code of conduct
+enforcement ladder](https://github.com/mozilla/diversity).
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see the FAQ at
+https://www.contributor-covenant.org/faq. Translations are available at
+https://www.contributor-covenant.org/translations.
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index 0534ba1..ba5788d 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,51 +1,38 @@
-
# syntax = docker/dockerfile:1.4
-# Base dependencies stage
-ARG NODE_VERSION=22.17.0
+ARG NODE_VERSION=22
FROM node:${NODE_VERSION}-slim AS base
LABEL fly_launch_runtime="Node.js"
-
-# Node.js app lives here
WORKDIR /app
+ENV NODE_ENV=production
-# Set production environment
-ENV NODE_ENV="production"
-
-# Install pnpm
-ARG PNPM_VERSION=10.13.0
+ARG PNPM_VERSION=10.18.0
RUN npm install -g pnpm@$PNPM_VERSION
-
-# Throw-away build stage to reduce size of final image
+# --- Build stage ---
+# We consume the docs generated by the CI
FROM base AS build
-# Install packages needed to build node modules
RUN apt-get update -qq && \
- apt-get install --no-install-recommends -y build-essential node-gyp pkg-config python-is-python3 git
+ apt-get install --no-install-recommends -y build-essential node-gyp pkg-config python-is-python3 && \
+ rm -rf /var/lib/apt/lists/*
-# Install node modules
COPY .npmrc package.json pnpm-lock.yaml ./
-RUN pnpm install --frozen-lockfile --prod=false
+RUN pnpm install --prod=false --frozen-lockfile
+
-# Copy application code
COPY . .
-# Build application
-RUN pnpm run generate:docs
RUN pnpm run build
-# Remove development dependencies
+# Prune dev deps
RUN pnpm prune --prod
-
-# Final stage for app image
+# --- Runtime stage ---
FROM base
-# Copy built application
COPY --from=build /app /app
-# Start the server by default, this can be overwritten at runtime
EXPOSE 3000
-CMD [ "pnpm", "run", "start" ]
+CMD ["pnpm","run","start"]
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index 3a910a1..5a34b88 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2024 Forge 42
+Copyright (c) 2025 Forge 42
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
index a2e38fa..5269a36 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Welcome to Forge 42 Documentation Template
+# Welcome to Documentation Template
This template is designed to support a flexible content structure using `.md` and `.mdx` files organized into folders. It enables deeply nested sections and subsections, making it easy to manage complex documentation with a clear and scalable hierarchy.
@@ -110,3 +110,54 @@ pnpm run dev
6. After you see that everything works with the current content inside the `content` folder, remove those files and add your own
7. Happy coding!
+
+## Features
+
+### Versioned Documentation
+Generate per-tag version folders under `generated-docs/` (for example `v1.0.0/`) to publish and serve multiple doc versions.
+
+**Example:**
+````bash
+pnpm run generate:docs --versions "^1.0.0"
+````
+
+### Local Development Experience
+Run `pnpm run dev` to start the dev server and use the hot-reloading `.content-collections/` workflow for fast iteration. The dev server serves live content from `.content-collections/` (your working tree), so it usually shows only the current workspace docs.
+
+**If you need to preview versioned outputs locally, you have two simple options:**
+
+1. Run the generator and serve the `generated-docs/` output (example: `pnpm run generate:docs --branch main --versions="^1.0.0"`). This produces version folders under `generated-docs/` but disables hot-reloading because the site reads the generated output instead of the live `.content-collections/` folder.
+
+2. Create a PR which produces both the versioned `generated-docs/` artifacts and the current snapshot โ this is useful for previewing how versioned docs and the live snapshot appear together.
+
+**Note:** When running the generator you must pass the default branch via `--branch` (for example `--branch main`) so the script can deterministically build the default-branch snapshot.
+
+
+### Automated Docs Generation
+The `pnpm run generate:docs` script automates:
+- Building the `generated-docs/` folder structure
+- Writing `app/utils/versions.ts` which the site consumes to show available versions
+
+### CI/CD Ready
+Includes example GitHub Actions workflows to:
+- Build documentation
+- Pack the `generated-docs` artifact
+- Deploy preview or release sites
+
+### Docker + Fly Deployment
+Includes `Dockerfile` and sample Fly workflows:
+- CI uploads the generated docs artifact
+- Deploy job unpacks it into the runner workspace
+- Image build includes `generated-docs/`
+
+### Type-Safe and Tested
+Built-in quality tooling:
+- TypeScript (`tsc`) for type checking
+- Biome for linting
+- Vitest for testing
+
+### Accessibility & Performance Focused
+Opinionated UI primitives and tooling optimized for:
+- Accessibility standards
+- Fast page loads
+- Great developer experience
\ No newline at end of file
diff --git a/app/components/backdrop.tsx b/app/components/backdrop.tsx
index b76b818..2e49cf4 100644
--- a/app/components/backdrop.tsx
+++ b/app/components/backdrop.tsx
@@ -1,9 +1,12 @@
import { cn } from "~/utils/css"
-export const Backdrop = ({ onClose }: { onClose: () => void }) => (
+export const Backdrop = ({ onClose, className }: { onClose: () => void; className?: string }) => (
// biome-ignore lint/a11y/useKeyWithClickEvents: We don't need keyboard events for backdrop
{
if (e.target === e.currentTarget) {
onClose()
diff --git a/app/components/code-block/code-block-elements.tsx b/app/components/code-block/code-block-elements.tsx
index 7006da8..3efe019 100644
--- a/app/components/code-block/code-block-elements.tsx
+++ b/app/components/code-block/code-block-elements.tsx
@@ -57,7 +57,7 @@ export const PreElement = ({ lines, className = "", ...props }: PreElementProps)
diff --git a/app/components/code-block/code-block-syntax-highlighter.ts b/app/components/code-block/code-block-syntax-highlighter.ts
index 9c12f56..11980b5 100644
--- a/app/components/code-block/code-block-syntax-highlighter.ts
+++ b/app/components/code-block/code-block-syntax-highlighter.ts
@@ -10,23 +10,25 @@ const MASTER_REGEX = new RegExp(
// whitespace
"\\s+",
// single-line comment
- "//.*?(?=\\n|$)",
+ "\\/\\/[^\\n\\r]*(?=\\n|$)",
// multi-line comment
- "/\\*[\\s\\S]*?\\*/",
+ "\\/\\*[\\s\\S]*?\\*\\/",
// hash comment at start of line
"^\\s*#.*$",
+ // backtick inline code
+ "\\`(?:[^`\\\\]|\\\\.)*\\`",
// strings
"(['\"])(?:(?!\\1)[^\\\\]|\\\\.)*\\1",
// numbers
"\\d+\\.?\\d*",
// identifiers
"[a-zA-Z_$][a-zA-Z0-9_$]*",
- // operators and punctuation
- "===|!==|<=|>=|==|!=|&&|\\|\\||\\+\\+|--|[+\\-*/%=<>!?:(){}\\[\\];,.]|[+\\-*/%]=",
// arrow function
"=>",
+ // operators & punctuation
+ "===|!==|<=|>=|==|!=|&&|\\|\\||\\+\\+|--|[+\\-*%=<>!?:(){}\\[\\];,.]|\\/(?![/*])|[+\\-*/%]=",
].join("|"),
- "g"
+ "gm"
)
const KEYWORDS = [
diff --git a/app/components/command-k/components/results-footer.tsx b/app/components/command-k/components/results-footer.tsx
index 3915e87..4aef83a 100644
--- a/app/components/command-k/components/results-footer.tsx
+++ b/app/components/command-k/components/results-footer.tsx
@@ -15,7 +15,7 @@ export const ResultsFooter = ({
return (
-
+
{t("text.result", { count: resultsCount })}
diff --git a/app/components/command-k/components/search-history.tsx b/app/components/command-k/components/search-history.tsx
index 4deb0e1..e227513 100644
--- a/app/components/command-k/components/search-history.tsx
+++ b/app/components/command-k/components/search-history.tsx
@@ -35,7 +35,7 @@ const ClearHistoryButton = ({ onClear }: Pick
) =>
type="button"
onClick={onClear}
className={cn(
- "flex items-center gap-1 rounded px-2 py-1 text-xs transition-colors",
+ "flex items-center gap-1 rounded px-2 py-1 text-sm",
"text-[var(--color-result-meta)] hover:bg-[var(--color-history-clear-hover-bg)] hover:text-[var(--color-history-clear-hover-text)]"
)}
title="Clear history"
diff --git a/app/components/command-k/components/search-input.tsx b/app/components/command-k/components/search-input.tsx
index da71c9f..5dcaaa6 100644
--- a/app/components/command-k/components/search-input.tsx
+++ b/app/components/command-k/components/search-input.tsx
@@ -35,7 +35,7 @@ export function SearchInput({ value, onChange, placeholder, ref }: SearchInputPr
diff --git a/app/components/command-k/components/search-result.tsx b/app/components/command-k/components/search-result.tsx
index 79b5749..03bf909 100644
--- a/app/components/command-k/components/search-result.tsx
+++ b/app/components/command-k/components/search-result.tsx
@@ -22,7 +22,7 @@ const ResultIcon = ({
return (
@@ -42,7 +42,7 @@ const ResultTitle = ({
}) => (
@@ -52,7 +52,7 @@ const ResultTitle = ({
)
const ResultMetadata = ({ item, matchType }: Pick
) => (
-
+
{item.title}
{matchType === "paragraph" && item.subtitle ? > {item.subtitle} : null}
diff --git a/app/components/command-k/components/trigger-button.tsx b/app/components/command-k/components/trigger-button.tsx
index e95d791..5d1ba8e 100644
--- a/app/components/command-k/components/trigger-button.tsx
+++ b/app/components/command-k/components/trigger-button.tsx
@@ -12,7 +12,7 @@ export const TriggerButton = ({
type="button"
onClick={onOpen}
className={cn(
- "group flex items-center gap-2 rounded-lg border px-2 py-1.5 text-sm shadow-sm transition-all duration-200 xl:px-3 xl:py-2",
+ "group flex items-center gap-2 rounded-lg border px-2 py-1.5 text-sm shadow-sm xl:px-3 xl:py-2",
"border-[var(--color-trigger-border)] bg-[var(--color-trigger-bg)] text-[var(--color-trigger-text)]",
"hover:border-[var(--color-trigger-hover-border)] hover:bg-[var(--color-trigger-hover-bg)] hover:shadow-md",
"focus:border-[var(--color-trigger-focus-border)] focus:outline-none focus:ring-2 focus:ring-[var(--color-trigger-focus-ring)]"
@@ -26,7 +26,7 @@ export const TriggerButton = ({
@@ -34,7 +34,7 @@ export const TriggerButton = ({
diff --git a/app/components/command-k/create-search-index.ts b/app/components/command-k/create-search-index.ts
index bd6997f..f410db0 100644
--- a/app/components/command-k/create-search-index.ts
+++ b/app/components/command-k/create-search-index.ts
@@ -1,4 +1,4 @@
-import type { Page } from "content-collections"
+import type { Page } from "content-collections-types"
import slug from "slug"
import { getPageSlug } from "~/utils/get-page-slug"
diff --git a/app/components/icon-link.tsx b/app/components/icon-link.tsx
index 280ee9e..3d64596 100644
--- a/app/components/icon-link.tsx
+++ b/app/components/icon-link.tsx
@@ -13,7 +13,7 @@ export const IconLink = ({ name, className, ...props }: IconLinkProps) => {
return (
{
href={href}
{...props}
>
-
+
)
}
diff --git a/app/components/logo.tsx b/app/components/logo.tsx
index 86d1eed..7362223 100644
--- a/app/components/logo.tsx
+++ b/app/components/logo.tsx
@@ -7,7 +7,7 @@ export const Logo = ({ children }: { children: ReactNode }) => {
// biome-ignore lint/a11y/useKeyWithClickEvents: we don't need keyboard access for this
navigate(href("/:version?/home"))}
- className="relative block font-semibold font-space text-[var(--color-text-active)] text-lg md:text-2xl xl:text-3xl"
+ className="relative block cursor-pointer font-semibold font-space text-[var(--color-text-active)] text-lg md:text-2xl xl:text-3xl"
>
{children}
diff --git a/app/components/modal.tsx b/app/components/modal.tsx
index f68b779..6c2eef6 100644
--- a/app/components/modal.tsx
+++ b/app/components/modal.tsx
@@ -62,26 +62,37 @@ export const Modal = ({
return () => window.removeEventListener("keydown", onKey)
}, [isOpen, onClose])
+ const handleOverlayPointerDown = (e: React.PointerEvent) => {
+ const root = modalRef.current
+ if (!root) return
+ if (!root.contains(e.target as Node)) onClose()
+ }
+
if (!isOpen) return null
return (
-
-
-
-
e.stopPropagation()}
- onClick={(e) => e.stopPropagation()}
- >
- {children}
+ <>
+
+
+
+
e.stopPropagation()}
+ >
+ {children}
+
-
+ >
)
}
diff --git a/app/components/page-mdx-article.tsx b/app/components/page-mdx-article.tsx
index 0639b00..538cfdb 100644
--- a/app/components/page-mdx-article.tsx
+++ b/app/components/page-mdx-article.tsx
@@ -1,16 +1,16 @@
-import type { Page } from "content-collections"
+import type { Page } from "content-collections-types"
import { Title } from "~/ui/title"
import { MDXWrapper } from "./mdx-wrapper"
export default function PageMdxArticle({ page }: { page: Page }) {
return (
-
+
{page.title}
{page.description && (
-
+
{page.description}
)}
diff --git a/app/components/page-navigation.tsx b/app/components/page-navigation.tsx
index fe3c772..dde6f3d 100644
--- a/app/components/page-navigation.tsx
+++ b/app/components/page-navigation.tsx
@@ -64,7 +64,7 @@ export function PageNavigation({ previous, next }: PageNavigationProps) {
return (
{previous ? :
}
diff --git a/app/components/sidebar/build-breadcrumbs.ts b/app/components/sidebar/build-breadcrumbs.ts
index 8e23ede..3a8ebe5 100644
--- a/app/components/sidebar/build-breadcrumbs.ts
+++ b/app/components/sidebar/build-breadcrumbs.ts
@@ -1,4 +1,4 @@
-import type { Page } from "content-collections"
+import type { Page } from "content-collections-types"
import type { SidebarSection } from "~/utils/create-sidebar-tree"
import { buildDocPathFromSlug } from "~/utils/path-builders"
diff --git a/app/components/sidebar/desktop-sidebar.tsx b/app/components/sidebar/desktop-sidebar.tsx
index eade5e9..e774ff2 100644
--- a/app/components/sidebar/desktop-sidebar.tsx
+++ b/app/components/sidebar/desktop-sidebar.tsx
@@ -5,7 +5,7 @@ import { SidebarContent } from "./sidebar-content"
export const DesktopSidebarPanel = ({ sidebarTree, className }: { sidebarTree: SidebarTree; className: string }) => (
diff --git a/app/components/sidebar/mobile-sidebar.tsx b/app/components/sidebar/mobile-sidebar.tsx
index f08ea8b..d5a5b97 100644
--- a/app/components/sidebar/mobile-sidebar.tsx
+++ b/app/components/sidebar/mobile-sidebar.tsx
@@ -33,7 +33,7 @@ export const MobileSidebarHeader = () => {
return (
-
+
{breadcrumbs.map((item) => (
{item}
))}
@@ -64,7 +64,7 @@ const MobileSidebarCloseButton = () => {
@@ -83,7 +83,7 @@ export const MobileSidebarPanel = ({
return (
{documentationPages.length > 0 && (
-
+
{documentationPages.map((p) => (
)}
-
+
{sections.map((item) => (
))}
diff --git a/app/components/sidebar/sidebar-items.tsx b/app/components/sidebar/sidebar-items.tsx
index 392c328..987812f 100644
--- a/app/components/sidebar/sidebar-items.tsx
+++ b/app/components/sidebar/sidebar-items.tsx
@@ -5,8 +5,8 @@ import { useCurrentVersion } from "~/utils/version-resolvers"
import type { SidebarSection } from "./sidebar"
const getIndentClass = (depth: number) => {
- const indentMap = { 0: "ml-0", 1: "ml-4", 2: "ml-8" }
- return indentMap[depth as keyof typeof indentMap] || "ml-8"
+ const indentMap = { 0: "ml-4", 1: "ml-7", 2: "ml-10" }
+ return indentMap[depth as keyof typeof indentMap] || "ml-10"
}
type DocumentationNavLinkProps = {
@@ -14,9 +14,10 @@ type DocumentationNavLinkProps = {
to: string
depth?: number
onClick?: () => void
+ className?: string
}
-export function DocumentationNavLink({ title, to, depth = 0, onClick }: DocumentationNavLinkProps) {
+export function DocumentationNavLink({ title, to, depth = 0, onClick, className }: DocumentationNavLinkProps) {
const indentClass = getIndentClass(depth)
return (
- `block rounded-md px-3 py-2 text-sm md:text-base ${indentClass}
+ `block rounded-md px-3 py-0.5 text-sm md:text-base ${indentClass} ${className}
${isPending ? "text-[var(--color-text-hover)]" : ""}
${
isActive
@@ -42,23 +43,24 @@ interface SectionItemProps {
item: SidebarSection
depth?: number
onItemClick?: () => void
+ className?: string
}
const SectionTitle = ({ title }: { title: string }) => {
return (
-
+
{title}
)
}
-export const SectionItem = ({ item, depth = 0, onItemClick }: SectionItemProps) => {
+export const SectionItem = ({ item, depth = 0, onItemClick, className = "my-1" }: SectionItemProps) => {
const isTopLevel = depth === 0
const version = useCurrentVersion()
const content = (
{item.documentationPages.length > 0 && (
-
+
{item.documentationPages.map((doc) => (
))}
)}
{item.subsections.length > 0 && (
-
+
{item.subsections.map((subsection) => (
-
+
))}
)}
@@ -85,8 +94,8 @@ export const SectionItem = ({ item, depth = 0, onItemClick }: SectionItemProps)
return (
@@ -94,7 +103,7 @@ export const SectionItem = ({ item, depth = 0, onItemClick }: SectionItemProps)
}
return (
-
+
{content}
diff --git a/app/components/sidebar/tests/build-breadcrumbs.test.ts b/app/components/sidebar/tests/build-breadcrumbs.test.ts
index 6920ede..f1c6451 100644
--- a/app/components/sidebar/tests/build-breadcrumbs.test.ts
+++ b/app/components/sidebar/tests/build-breadcrumbs.test.ts
@@ -1,4 +1,4 @@
-import type { Page } from "content-collections"
+import type { Page } from "content-collections-types"
import type { SidebarSection } from "~/utils/create-sidebar-tree"
import { buildBreadcrumbs } from "../build-breadcrumbs"
diff --git a/app/components/table-of-content.tsx b/app/components/table-of-content.tsx
index 22b0ea2..7fe0809 100644
--- a/app/components/table-of-content.tsx
+++ b/app/components/table-of-content.tsx
@@ -23,7 +23,7 @@ const calculatePadding = (depth: number) => BASE_PADDING + depth * DEPTH_MULTIPL
const getItemClassName = (depth: number, isActive: boolean) => {
return [
- "block py-1.5 text-xs sm:text-sm md:text-base hover:text-[var(--color-text-hover)]",
+ "block py-1.5 text-sm md:text-base hover:text-[var(--color-text-hover)]",
depth === 0 && "font-medium",
isActive ? "text-[var(--color-text-accent)]" : "text-[var(--color-text-active)]",
]
diff --git a/app/library/link/Link.browser.test.tsx b/app/library/link/Link.browser.test.tsx
deleted file mode 100644
index 626d12d..0000000
--- a/app/library/link/Link.browser.test.tsx
+++ /dev/null
@@ -1,164 +0,0 @@
-import { waitFor } from "@testing-library/react"
-import { userEvent } from "@vitest/browser/context"
-import { useLocation } from "react-router"
-import type { StubRouteEntry } from "tests/setup.browser"
-import { Link, type LinkProps } from "./link"
-const getEntries: (linkProps?: LinkProps) => StubRouteEntry[] = (linkProps) => [
- {
- path: "/first",
- Component: () => {
- const url = useLocation()
- return (
- <>
-
- {url.pathname} + {url.search}
-
-
- go
-
- >
- )
- },
- },
- {
- path: "/second",
- Component: () => {
- const url = useLocation()
- return (
- <>
-
- {url.pathname}
- {url.search}
-
-
go
- >
- )
- },
- },
-]
-describe("Link", () => {
- it("if the url is /first and you redirect to /second nothing is added to the url", async ({ renderStub }) => {
- const { getByText } = await renderStub({
- entries: getEntries(),
- props: {
- initialEntries: ["/first"],
- },
- })
- const link = getByText("go")
- await userEvent.click(link)
- const url = getByText("/second")
- expect(url).toBeDefined()
- await waitFor(() => {
- expect(url.element()).toBeDefined()
- expect(url.element()).toHaveTextContent("/second")
- })
- })
-
- it("if the url is /first?a=1 and you redirect to /second without keepSearchParams nothing is added to the url", async ({
- renderStub,
- }) => {
- const { getByText } = await renderStub({
- entries: getEntries(),
- props: {
- initialEntries: ["/first?a=1"],
- },
- })
- const link = getByText("go")
- await userEvent.click(link)
- const url = getByText("/second")
- await waitFor(() => {
- expect(url.element()).toBeDefined()
- expect(url.element()).toHaveTextContent("/second")
- })
- })
-
- it("if the url is /first?a=1 and you redirect to /second with keepSearchParams search params are kept", async ({
- renderStub,
- }) => {
- const { getByText } = await renderStub({
- entries: getEntries({ keepSearchParams: true, to: "/second" }),
- props: {
- initialEntries: ["/first?a=1"],
- },
- })
- const link = getByText("go")
- await userEvent.click(link)
- const url = getByText("/second")
- await waitFor(() => {
- expect(url.element()).toBeDefined()
- expect(url.element()).toHaveTextContent("/second?a=1")
- })
- })
-
- it("if the url is /first?a=1&lng=en and you redirect to /second with keepSearchParams search params and language are kept", async ({
- renderStub,
- }) => {
- const { getByText } = await renderStub({
- entries: getEntries({ keepSearchParams: true, to: "/second" }),
- props: {
- initialEntries: ["/first?a=1&lng=en"],
- },
- })
- const link = getByText("go")
- await userEvent.click(link)
- const url = getByText("/second")
- await waitFor(() => {
- expect(url.element()).toBeDefined()
- expect(url.element()).toHaveTextContent("/second?a=1&lng=en")
- })
- })
-
- it("if the url is /first?a=1&lng=en and you redirect to /second without keepSearchParams language is kept", async ({
- renderStub,
- }) => {
- const { getByText } = await renderStub({
- entries: getEntries({ to: "/second" }),
- props: {
- initialEntries: ["/first?lng=en"],
- },
- })
- const link = getByText("go")
- await userEvent.click(link)
- const url = getByText("/second")
- await waitFor(() => {
- expect(url.element()).toBeDefined()
- expect(url.element()).toHaveTextContent("/second?lng=en")
- })
- })
-
- it("if the url is /first?a=1&lng=en and you redirect to /second with a language override it is changed and search params are removed", async ({
- renderStub,
- }) => {
- const { getByText } = await renderStub({
- entries: getEntries({ to: "/second", language: "bs" }),
- props: {
- initialEntries: ["/first?lng=en"],
- },
- })
- const link = getByText("go")
- await userEvent.click(link)
- const url = getByText("/second")
- await waitFor(() => {
- expect(url.element()).toBeDefined()
- expect(url.element()).toHaveTextContent("/second?lng=bs")
- })
- })
-
- it("if the url is /first?a=1&lng=en and you redirect to /second with a language override it is changed and search params are kept with keepSearchParams", async ({
- renderStub,
- }) => {
- const { getByText } = await renderStub({
- entries: getEntries({ to: "/second", language: "bs", keepSearchParams: true }),
- props: {
- initialEntries: ["/first?a=a&lng=en"],
- },
- })
- const link = getByText("go")
- await userEvent.click(link)
- const url = getByText("/second")
- await waitFor(() => {
- expect(url.element()).toBeDefined()
- expect(url.element()).toHaveTextContent("/second?a=a&lng=bs")
- })
- })
-})
diff --git a/app/routes/$.tsx b/app/routes/$.tsx
index f7767c8..4e266b0 100644
--- a/app/routes/$.tsx
+++ b/app/routes/$.tsx
@@ -1,6 +1,6 @@
import { useTranslation } from "react-i18next"
import { useNavigate } from "react-router"
-import { Link } from "~/library/link"
+import { Link } from "~/ui/link"
import type { Route } from "./+types/$"
export const loader = async ({ params }: Route.LoaderArgs) => {
diff --git a/app/routes/documentation-homepage.tsx b/app/routes/documentation-homepage.tsx
index c4d6872..a6733f3 100644
--- a/app/routes/documentation-homepage.tsx
+++ b/app/routes/documentation-homepage.tsx
@@ -13,8 +13,8 @@ export const meta = ({ data }: Route.MetaArgs) => {
return generateMetaFields({
domain,
path: `/${version}/home`,
- // FIXME Change "Docs Template" to your package name
- title: `${title} ยท Docs Template`,
+ // FIXME change "Docs Template" to your package name
+ title: `${title} ยท Documentation Template`,
description,
})
}
diff --git a/app/routes/documentation-layout.tsx b/app/routes/documentation-layout.tsx
index 390aa1e..a89cebe 100644
--- a/app/routes/documentation-layout.tsx
+++ b/app/routes/documentation-layout.tsx
@@ -23,9 +23,9 @@ export default function DocumentationLayout({ loaderData }: Route.ComponentProps
+ {/* FIXME Replace with your Logo */}
- {/* FIXME Replace with your Logo */}
- DOCS-TEMPLATE
+ Docs Template
@@ -42,7 +42,6 @@ export default function DocumentationLayout({ loaderData }: Route.ComponentProps
- {/* FIXME You can add custom footer component here */}
)
}
diff --git a/app/routes/documentation-page.tsx b/app/routes/documentation-page.tsx
index d94915c..b20193e 100644
--- a/app/routes/documentation-page.tsx
+++ b/app/routes/documentation-page.tsx
@@ -21,7 +21,7 @@ export const meta = ({ data }: Route.MetaArgs) => {
domain,
path: fullPath,
// FIXME change "Docs Template" to your package name
- title: `${page.title} ยท Docs Template`,
+ title: `${page.title} ยท Documentation Template`,
description: page.description,
})
}
diff --git a/app/tailwind.css b/app/tailwind.css
index 161e4b7..a670a12 100644
--- a/app/tailwind.css
+++ b/app/tailwind.css
@@ -5,6 +5,46 @@
--font-dyna-puff: "Dyna Puff", sans-serif;
--font-inter: "Inter", sans-serif;
--font-space: "Space", sans-serif;
+
+ /* Animation Variables */
+ --animation-duration: 40s;
+ --animation-direction: forwards;
+
+ /* Animation Definitions */
+ --animate-scroll: scroll var(--animation-duration, 40s) var(--animation-direction, forwards) linear infinite;
+ --animate-spotlight: spotlight 2s ease .75s 1 forwards;
+ --animate-meteor-effect: meteor 5s linear infinite;
+}
+
+@keyframes scroll {
+ to {
+ transform: translate(calc(-50% - 0.5rem));
+ }
+}
+
+@keyframes meteor {
+ 0% {
+ transform: rotate(215deg) translateX(0);
+ opacity: 1;
+ }
+ 70% {
+ opacity: 1;
+ }
+ 100% {
+ transform: rotate(215deg) translateX(-1900px);
+ opacity: 0;
+ }
+}
+
+@keyframes spotlight {
+ 0% {
+ opacity: 0;
+ transform: translate(-72%, -62%) scale(0.5);
+ }
+ 100% {
+ opacity: 1;
+ transform: translate(-50%, -40%) scale(1);
+ }
}
@layer base {
@@ -25,8 +65,8 @@
--color-background-active: #f3f4f6;
--color-text-accent: #646464;
- --color-code-inline-bg: #f5f5f5;
- --color-code-inline-text: #1f2937;
+ --color-code-inline-text: #04825b;
+ --color-code-inline-bg: #f3f4f6;
--color-code-block-bg: #fcfcfc;
--color-code-block-text: #334155;
@@ -37,7 +77,7 @@
--color-code-keyword: #0369a1;
--color-code-string: #04825b;
--color-code-number: #c84b0a;
- --color-code-comment: #64748b;
+ --color-code-comment: #7f90a7;
--color-code-operator: #be185d;
--color-code-punctuation: #64748b;
--color-code-function: #7c3aed;
@@ -46,7 +86,7 @@
--color-diff-added-border: rgba(34, 197, 94, 0.3);
--color-diff-removed-bg: rgba(239, 68, 68, 0.1);
--color-diff-removed-border: rgba(239, 68, 68, 0.3);
- --color-diff-indicator: #64748b;
+ --color-diff-indicator: #08162b;
--color-info-bg: #eff6ff;
--color-info-border: #bfdbfe;
@@ -135,8 +175,8 @@
--color-background-active: #1a1a1a;
--color-text-accent: #878787;
+ --color-code-inline-text: #34d399;
--color-code-inline-bg: #1a1a1a;
- --color-code-inline-text: #f5f5f5;
--color-code-block-bg: #1a1a1a;
--color-code-block-text: #e2e8f0;
@@ -168,7 +208,7 @@
--color-warning-text: #fbbf24;
--color-warning-icon: #f59e0b;
- --color-modal-backdrop: rgb(15, 15, 15, 0.8);
+ --color-modal-backdrop: rgba(10, 13, 17, 0.5);
--color-modal-bg: rgb(15, 15, 15);
--color-modal-border: #374151;
--color-modal-shadow: rgba(0, 0, 0, 0.5);
@@ -235,21 +275,26 @@
--color-scrollbar-thumb: #e6edf3;
}
- ::-webkit-scrollbar {
- height: 8px;
- width: 8px;
+ .scrollbar::-webkit-scrollbar {
+ height: 5px;
+ width: 4px;
}
- ::-webkit-scrollbar-thumb {
+ .scrollbar::-webkit-scrollbar-thumb {
background-color: var(--color-scrollbar-thumb);
- border-radius: 9999px;
+ /* border-radius: 9999px; */
}
- ::-webkit-scrollbar-track {
+ .scrollbar::-webkit-scrollbar-track {
background-color: var(--color-scrollbar-track);
}
*::-webkit-scrollbar-thumb {
cursor: default;
}
+
+ .prose :not(pre) > code::before,
+ .prose :not(pre) > code::after {
+ content: none !important;
+ }
}
diff --git a/app/ui/accordion.tsx b/app/ui/accordion.tsx
index 04b16cb..bf37dbb 100644
--- a/app/ui/accordion.tsx
+++ b/app/ui/accordion.tsx
@@ -66,7 +66,7 @@ export const AccordionItem = ({
const [isOpen, setIsOpen] = useState(defaultOpen)
const buttonClasses =
- "flex gap-2 items-center w-full p-2 transition-transform duration-200 text-[var(--color-text-normal)] hover:text-[var(--color-text-hover)] hover:cursor-pointer rounded-md"
+ "flex gap-2 items-center w-full px-2 transition-transform duration-200 text-[var(--color-text-normal)] hover:text-[var(--color-text-hover)] hover:cursor-pointer rounded-md"
const iconClasses = "w-4 h-4 transition-transform duration-300"
diff --git a/app/ui/alert.tsx b/app/ui/alert.tsx
index e196583..5ec3905 100644
--- a/app/ui/alert.tsx
+++ b/app/ui/alert.tsx
@@ -53,15 +53,23 @@ export const Alert = ({ children, title, variant, className = "" }: AlertProps)
const defaultTitle = variant === "info" ? t("titles.good_to_know") : t("titles.warning")
return (
-
+
{getIcon()}
-
{title || defaultTitle}
+
+ {title || defaultTitle}
+
diff --git a/app/ui/breadcrumbs.tsx b/app/ui/breadcrumbs.tsx
index 5c3705c..01bbbbd 100644
--- a/app/ui/breadcrumbs.tsx
+++ b/app/ui/breadcrumbs.tsx
@@ -17,7 +17,7 @@ interface BreadcrumbItemProps {
export const BreadcrumbItem = ({ children, href, isActive = false, className }: BreadcrumbItemProps) => {
const classes = cn(
- "text-ellipsis text-start font-medium text-[var(--color-text-normal)] text-sm sm:text-base md:text-lg",
+ "text-ellipsis text-start font-medium text-[var(--color-text-normal)]",
isActive && "pointer-events-none font-semibold text-[var(--color-text-active)]",
className
)
@@ -45,7 +45,7 @@ export const Breadcrumbs = ({ children, className }: BreadcrumbsProps) => {
{items.map((child, index) => (
- {index > 0 && }
+ {index > 0 && }
{child}
))}
diff --git a/app/ui/icon-button.tsx b/app/ui/icon-button.tsx
index b7c7bbf..928750c 100644
--- a/app/ui/icon-button.tsx
+++ b/app/ui/icon-button.tsx
@@ -13,12 +13,12 @@ export const IconButton = ({ name, className, ...props }: IconButtonProps) => {
-
+
)
}
diff --git a/app/ui/inline-code.tsx b/app/ui/inline-code.tsx
index 15ef698..42903f8 100644
--- a/app/ui/inline-code.tsx
+++ b/app/ui/inline-code.tsx
@@ -14,7 +14,7 @@ export const InlineCode = (props: ComponentPropsWithoutRef<"code">) => {
return (
)
}
diff --git a/app/library/link/index.ts b/app/ui/link/index.ts
similarity index 100%
rename from app/library/link/index.ts
rename to app/ui/link/index.ts
diff --git a/app/library/link/link.tsx b/app/ui/link/link.tsx
similarity index 90%
rename from app/library/link/link.tsx
rename to app/ui/link/link.tsx
index c3dd8a0..aff0e34 100644
--- a/app/library/link/link.tsx
+++ b/app/ui/link/link.tsx
@@ -2,7 +2,7 @@ import { Link as ReactRouterLink, type LinkProps as ReactRouterLinkProps } from
import type { Language } from "~/localization/resource"
import { useEnhancedTo } from "./useEnhancedTo"
-export interface LinkProps extends ReactRouterLinkProps {
+interface LinkProps extends ReactRouterLinkProps {
keepSearchParams?: boolean
language?: Language
}
diff --git a/app/library/link/useEnhancedTo.ts b/app/ui/link/useEnhancedTo.ts
similarity index 100%
rename from app/library/link/useEnhancedTo.ts
rename to app/ui/link/useEnhancedTo.ts
diff --git a/app/ui/list-item.tsx b/app/ui/list-item.tsx
index 4639cdc..f93b204 100644
--- a/app/ui/list-item.tsx
+++ b/app/ui/list-item.tsx
@@ -6,7 +6,7 @@ export const ListItem = (props: ComponentPropsWithoutRef<"li">) => {
li]:ml-2 [&>li]:marker:font-medium",
+ "space-y-1 pl-1 text-[var(--color-text-normal)] text-base leading-7 md:text-lg md:leading-8 xl:leading-8 [&>li]:ml-2 [&>li]:marker:font-medium",
props.className
)}
/>
diff --git a/app/ui/ordered-list.tsx b/app/ui/ordered-list.tsx
index 5ab7b2d..d3ff4cb 100644
--- a/app/ui/ordered-list.tsx
+++ b/app/ui/ordered-list.tsx
@@ -17,7 +17,7 @@ export const OrderedList = (props: ComponentPropsWithoutRef<"ol">) => {
li]:ml-2 [&>li]:marker:font-medium ",
+ "list-decimal space-y-1 pl-4 text-[var(--color-text-normal)] [&>li]:ml-2 [&>li]:marker:font-medium",
props.className
)}
/>
diff --git a/app/utils/create-sidebar-tree.ts b/app/utils/create-sidebar-tree.ts
index 093aa4e..127b8d0 100644
--- a/app/utils/create-sidebar-tree.ts
+++ b/app/utils/create-sidebar-tree.ts
@@ -1,4 +1,4 @@
-import type { Page } from "content-collections"
+import type { Page } from "content-collections-types"
import { getContent } from "./load-content"
import type { Version } from "./version-resolvers"
diff --git a/app/utils/get-page-slug.tsx b/app/utils/get-page-slug.tsx
index 6e50da8..b35a9eb 100644
--- a/app/utils/get-page-slug.tsx
+++ b/app/utils/get-page-slug.tsx
@@ -1,4 +1,4 @@
-import type { Page } from "content-collections"
+import type { Page } from "content-collections-types"
export function getPageSlug(page: Page) {
return page._meta.path === "_index" ? "/" : page.slug
diff --git a/app/utils/load-content-collections.ts b/app/utils/load-content-collections.ts
index 97842f5..4f9f1af 100644
--- a/app/utils/load-content-collections.ts
+++ b/app/utils/load-content-collections.ts
@@ -1,17 +1,23 @@
import path, { resolve } from "node:path"
import { pathToFileURL } from "node:url"
-import type { Page } from "content-collections"
-import type { Section } from "content-collections"
+import type { Page } from "content-collections-types"
+import type { Section } from "content-collections-types"
+import { getServerEnv } from "~/env.server"
import type { Version } from "./version-resolvers"
/**
* Load content-collections outputs
* Always read from generated-docs
* If no tags/releases exist โ fallback to main branch (production) or current (development)
- * During development, if generated-docs missing โ tell user to run generate:docs
*/
export async function loadContentCollections(version: Version) {
+ const { NODE_ENV } = getServerEnv()
const projectRoot = process.cwd()
+ // locally we use the actual content-collections source for DX and hot-reloads
+ if (NODE_ENV === "development") {
+ const { allPages, allSections } = await import("content-collections")
+ return { allPages, allSections }
+ }
const genBase = resolve(projectRoot, "generated-docs", version, ".content-collections", "generated")
const pagesPath = pathToFileURL(path.join(genBase, "allPages.js")).href
diff --git a/app/utils/load-content.ts b/app/utils/load-content.ts
index 63c001d..beb44bf 100644
--- a/app/utils/load-content.ts
+++ b/app/utils/load-content.ts
@@ -1,5 +1,5 @@
-import type { Section } from "content-collections"
-import type { Page } from "content-collections"
+import type { Section } from "content-collections-types"
+import type { Page } from "content-collections-types"
import { loadContentCollections } from "~/utils/load-content-collections"
import type { Version } from "~/utils/version-resolvers"
import { versions } from "./versions"
@@ -20,5 +20,6 @@ export async function getContent(version: Version) {
if (!contentForVersion) {
throw new Error(`Content for version "${version}" could not be retrieved.`)
}
- return contentForVersion
+ const { allPages, allSections } = await loadContentCollections(version)
+ return { allPages, allSections }
}
diff --git a/app/utils/versions.ts b/app/utils/versions.ts
index 462dff8..ce1cfd5 100644
--- a/app/utils/versions.ts
+++ b/app/utils/versions.ts
@@ -1,2 +1,2 @@
// Auto-generated file. Do not edit manually.
-export const versions = ["current"] as const
+export const versions = ["latest"] as const
diff --git a/content/01-getting-started.mdx b/content/01-getting-started.mdx
new file mode 100644
index 0000000..63f6f76
--- /dev/null
+++ b/content/01-getting-started.mdx
@@ -0,0 +1,118 @@
+---
+title: "Getting Started"
+summary: "Set up your documentation site"
+description: "Step-by-step guide to setting up and running the documentation template."
+---
+
+## Prerequisites
+
+- **Node.js** >= 22.17.0 and **pnpm** >= 10.18.0 installed
+- **Git** for version control
+- A repository where you want to add documentation
+
+## Installation
+
+### Monorepo Structure (Recommended)
+
+If you're using a monorepo, place the docs-template under a `/docs` folder:
+
+```
+your-monorepo/
+โโโ packages/
+โ โโโ your-package/
+โโโ docs/ # โ Unzip template here
+โ โโโ app/
+โ โโโ content/
+โ โโโ package.json
+โโโ package.json
+```
+
+### Single Repository Structure
+
+For a single repository, unzip the template into a `/docs` folder:
+
+```
+your-repo/
+โโโ src/
+โโโ docs/ # โ Unzip template here
+โ โโโ app/
+โ โโโ content/
+โ โโโ package.json
+โโโ package.json
+```
+
+## Setup Steps
+
+### 1. Install Dependencies
+
+From your repository root (or from inside the `docs/` folder if you unpacked the template there):
+
+```bash
+pnpm install
+```
+
+### 2. Configure Environment Variables
+
+Copy `.env.example` to `.env`.
+
+If you extracted the template into a `docs/` subfolder:
+
+```bash
+cd docs
+cp .env.example .env
+```
+
+If the template is at the repository root, run:
+
+```bash
+cp .env.example .env
+```
+
+Edit `.env` and add your repository details.
+
+These variables enable "Edit this page" and "Report an issue" links.
+
+### 3. Start Development Server
+
+```bash
+pnpm run dev
+```
+
+Your documentation will be available at `http://localhost:4280`
+
+### 4. Test with Sample Content
+
+The template comes with sample content. Browse through it to understand the structure, then replace it with your own documentation.
+
+## Development Workflow
+
+During development, the template uses the `.content-collections` folder (auto-generated) for live reloading. You can edit MDX files and see changes instantly without restarting the server.
+
+### Key Commands
+
+```bash
+# Start dev server
+pnpm run dev
+
+# Build for production
+pnpm run build
+
+# Generate versioned docs (production). Note: the generator requires the default branch to be passed.
+# Example: build the snapshot for the `main` branch and produce versioned output.
+pnpm run generate:docs --branch main
+
+# Generate versioned docs for specific semver tags (example)
+pnpm run generate:docs --branch main --versions "^1.0.0"
+
+# Rebuild content collections
+pnpm run content-collections:build
+```
+
+## Next Steps
+
+1. **Review the sample content** in the `content/` folder
+2. **Understand the project structure** to know where everything lives
+3. **Learn content organization** to structure your documentation properly
+4. **Set up deployment** when ready to go live
+
+Now you're ready to start writing documentation!
diff --git a/content/01-getting-started/01-installation-setup.mdx b/content/01-getting-started/01-installation-setup.mdx
deleted file mode 100644
index 6a71e62..0000000
--- a/content/01-getting-started/01-installation-setup.mdx
+++ /dev/null
@@ -1,96 +0,0 @@
----
-title: Installation & Setup
-description: Step-by-step guide to install and configure the Forge42 Documentation Template
-summary: Installation Guide
----
-
- Documentation for `docs-template` is still under construction. Some sections may be incomplete or change frequently.
-
-
-## Prerequisites
-
-Make sure you have the following installed:
-
-- **Node.js** (>= 22.17.0)
-- **pnpm** (>= 10.13.0)
-- **Git** (for version control)
-
----
-
-## Installation Steps
-
-### 1. Clone the Repository
-
-```bash
-git clone https://github.com/forge42/docs-template my-documentation
-cd my-documentation
-```
-
-### 2. Install Dependencies
-
-```bash
-pnpm install
-```
-
-### 3. Set Up Environment Variables
-
-Copy the example environment file:
-
-```bash
-cp .env.example .env
-```
-
-Then update the `.env` file with your project-specific configuration.
-
-### 4. Generate Documentation
-
-Build the initial docs from the `content/` folder:
-
-```bash
-pnpm run generate:docs
-```
-
-This processes your content and outputs optimized documentation files.
-
-### 5. Start the Development Server
-
-```bash
-pnpm run dev
-```
-
-Your site will now be running at **http://localhost:4280**
-
----
-
-## Project Structure
-
-After installation, your project will look like this:
-
-```
-my-documentation/
-โโโ app/ # React Router application
-โโโ content/ # Your documentation content
-โโโ public/ # Static assets
-โโโ resources/ # Fonts, icons, etc.
-โโโ generated-docs/ # Generated documentation files
-โโโ scripts/ # Build and utility scripts
-โโโ package.json
-โโโ README.md
-```
-
----
-
-## Next Steps
-
-1. **Customize Branding**
- Update logo, colors, and header components in `app/components/`
-
-2. **Add Your Content**
- Replace the example files in `content/` with your own documentation
-
-3. **Prepare for Deployment**
- Configure your hosting provider (e.g. Vercel, Netlify, or GitHub Pages)
-
----
-
-> ๐ก The template ships with sample content so you can quickly understand the structure. You can safely delete or replace these examples once your docs are ready.
diff --git a/content/01-getting-started/02-project-structure.mdx b/content/01-getting-started/02-project-structure.mdx
deleted file mode 100644
index af6b95b..0000000
--- a/content/01-getting-started/02-project-structure.mdx
+++ /dev/null
@@ -1,102 +0,0 @@
----
-title: Project Structure
-summary: Architecture Guide
-description: Minimal map of what matters and where to change it.
----
-
- Documentation for `docs-template` is still under construction. Some sections may be incomplete or change frequently.
-
-
-## 1. HighโLevel Layout
-```
-app/ React Router app (UI + logic)
-content/ Source MDX (edit these)
-generated-docs/ Built output (do NOT edit)
-scripts/ Generation / validation scripts
-```
-
-## 2. Application Essentials (app/)
-Directories:
-- components/ (UI pieces: sidebar, command-k, code-block, etc.)
-- hooks/ (shared React hooks)
-- routes/ (page modules + meta)
-- utils/ (seo, versions, paths, sidebar, contribution links)
-- ui/ (primitive UI elements)
-- tailwind.css (global styles + theme vars)
-- root.tsx (app root)
-
-## 3. Content Rules (content/)
-- Number prefixes (01-, 02-) only control ordering; stripped from URLs.
-- Use index.md files to introduce a section.
-- Nest as needed; keep names short.
-
-Minimal example:
-```
-content/
-โโโ 01-getting-started/
-โ โโโ index.md
-โ โโโ 01-overview.mdx
-โ โโโ 02-project-structure.mdx
-โโโ 02-routing/
- โโโ index.md
- โโโ 01-basic-routing.mdx
- โโโ 02-nested-routes.mdx
-```
-
-## 4. Frontmatter Pattern
-```
----
-title: Clear Title
-summary: Clear Summary
-description: Clear Short Description
----
-```
-
-## 5. Generation Pipeline
-Script: scripts/generate-docs.ts
-Steps:
-1. Scan content/
-2. Emit processed artifacts โ generated-docs/version/.content-collections/generated
-3. Update versions list
-4. Optionally build search index
-Never edit generated-docs/ manually.
-
-## 6. Config Touchpoints
-- content-collections.ts (parsing + schema)
-- app/routes.ts (logical route map)
-- react-router.config.ts (router build)
-- vite.config.ts (build + plugins)
-- fly.toml (deployment example)
-- .github/workflows/ (CI: build + deploy)
-
-## 7. Styling & Theme
-- Tailwind utility-first
-- CSS vars for light/dark in tailwind.css
-- Theme logic: utils/theme.ts
-- Persistence keys: utils/local-storage.ts
-
-## 8. Typical Edit Flow
-1. Resolve FIXMEs (branding, siteName, social image)
-2. Add / edit MDX pages
-3. Run: `pnpm run generate:docs -- --branch main`
-4. Dev server: `pnpm dev`
-5. Review sidebar, search, meta
-6. Commit
-
-## 9. Quick Commands
-```
-pnpm run generate:docs -- --branch main
-pnpm dev
-grep -R "FIXME" -n app/
-```
-
-## 10. Safe vs Caution
-Safe to change:
-- content/**
-- components, routes, utils (non-generated)
-- layout branding + theming
-
-Don't change:
-- generated-docs/** (automatically created files on generate:docs command)
-- version.ts (automatically created file on generate:docs command)
-- path/slug helpers (affects links & search)
diff --git a/content/01-getting-started/index.md b/content/01-getting-started/index.md
deleted file mode 100644
index f921c6e..0000000
--- a/content/01-getting-started/index.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: Getting Started
----
-
-This section covers the basics of setting up and using the documentation template.
\ No newline at end of file
diff --git a/content/02-content-management/01-writing-documentation.mdx b/content/02-content-management/01-writing-documentation.mdx
deleted file mode 100644
index ccd2642..0000000
--- a/content/02-content-management/01-writing-documentation.mdx
+++ /dev/null
@@ -1,156 +0,0 @@
----
-title: Writing Documentation
-description: Learn how to create and organize documentation content using Markdown and MDX
-summary: Content Creation Guide
----
-
- Documentation for `docs-template` is still under construction. Some sections may be incomplete or change frequently.
-
-
-## Content File Types
-
-The template supports two types of content files:
-
-### Markdown Files (`.md`)
-
-Used for simple content and section indexes:
-
-```markdown
----
-title: Getting Started
----
-
-This section covers the basics of using our product.
-```
-
-### MDX Files (`.mdx`)
-
-Used for rich content with React components:
-
-```mdx
----
-title: Advanced Features
-description: Learn about advanced functionality
-summary: Advanced Guide
----
-
-## Interactive Examples
-
-You can embed React components directly in your content.
-```
-
-## Content Structure
-
-### File Organization
-
-Content is organized in a hierarchical structure:
-
-```
-content/
-โโโ _index.mdx # Homepage (required)
-โโโ 01-getting-started/ # Main section
-โ โโโ index.md # Section metadata (required)
-โ โโโ 01-installation.mdx
-โ โโโ 02-setup.mdx
-โโโ 02-features/ # Another section
-โ โโโ index.md
-โ โโโ 01-basic-features.mdx
-โ โโโ 02-advanced/ # Subsection
-โ โโโ index.md # Subsection metadata
-โ โโโ 01-configuration.mdx
-โโโ 03-api-reference.mdx # Standalone page
-```
-
-### Frontmatter
-
-All content files require frontmatter with metadata:
-
-```yaml
----
-title: "Page Title" # Required: Page title
-description: "SEO description" # Optional: Meta description
-summary: "Short description" # Optional: Used in navigation
----
-```
-
-## Code Blocks
-
-Standard markdown code blocks with syntax highlighting:
-
-```typescript
-// This will be syntax highlighted
-function example() {
- return "Hello World"
-}
-```
-
-Diff highlighting for showing changes:
-
-```diff
-- const old = "removed code"
-+ const new = "added code"
- const unchanged = "stays the same"
-```
-
-### Inline Code
-
-Use backticks for `inline code` references.
-
-### Links and Navigation
-
-Standard markdown links work automatically:
-
-```markdown
-[Link to another page](../other-section/page-name)
-[External link](https://example.com)
-```
-
-The template automatically generates:
-- Table of contents from headings
-- Previous/next page navigation
-- Breadcrumb navigation
-
-## Content Processing
-
-### URL Generation
-
-File paths are automatically converted to clean URLs:
-
-- `content/01-getting-started/02-installation.mdx` โ `/getting-started/installation`
-- Number prefixes (`01-`, `02-`) are removed from URLs
-- File extensions are stripped
-
-### Search Integration
-
-All content is automatically indexed for search:
-
-- Page titles and descriptions
-- Heading text
-- Paragraph content
-- Code block content (optional)
-
-Content is processed by `app/components/command-k/create-search-index.ts`.
-
-## Best Practices
-
-### Writing Guidelines
-
-1. **Use Descriptive Titles**: Make headings clear and specific
-2. **Add Descriptions**: Include frontmatter descriptions for SEO
-3. **Structure with Headings**: Use proper heading hierarchy (H2 โ H3 โ H4)
-4. **Link Between Pages**: Create connections between related content
-
-### File Naming
-
-1. **Use Number Prefixes**: `01-`, `02-` for ordering
-2. **Descriptive Names**: `installation.mdx` not `setup.mdx`
-3. **Consistent Casing**: Use kebab-case for file names
-
-### Content Organization
-
-1. **Logical Grouping**: Group related content in sections
-2. **Appropriate Nesting**: Don't go too deep (max 2 levels recommended)
-3. **Index Files**: Always include `index.md` for sections
-
-
-The development server shows content errors in the console to help you fix issues quickly.
\ No newline at end of file
diff --git a/content/02-content-management/02-built-in-components.mdx b/content/02-content-management/02-built-in-components.mdx
deleted file mode 100644
index 2a2e8a5..0000000
--- a/content/02-content-management/02-built-in-components.mdx
+++ /dev/null
@@ -1,193 +0,0 @@
----
-title: Built-in Components
-description: Reference guide for all available components in the template
-summary: Component Reference
----
-
- Documentation for `docs-template` is still under construction. Some sections may be incomplete or change frequently.
-
-
-## Text Components
-
-### Headings
-
-All heading levels are automatically styled and generate anchor links:
-
-```markdown
-# H1 Heading
-## H2 Heading
-### H3 Heading
-#### H4 Heading
-```
-
-**Features:**
-- Automatic anchor link generation
-- Table of contents integration
-- Consistent spacing and typography
-
-### Inline Code
-
-For referencing code, commands, or technical terms:
-
-```mdx
-Install the package using `npm install`.
-```
-
-Install the package using `npm install`.
-
-### Strong Text
-
-For emphasis and important terms:
-
-```mdx
-This is **very important** information.
-```
-
-This is **very important** information.
-
-## Code Components
-
-### Code Blocks
-
-Syntax-highlighted code blocks with copy functionality:
-
-```typescript
-interface User {
- id: string
- name: string
- email: string
-}
-
-function createUser(data: Partial): User {
- return {
- id: generateId(),
- ...data
- } as User
-}
-```
-
-**Features:**
-- Automatic syntax highlighting
-- Copy to clipboard button
-- Line number support
-- Diff highlighting
-
-### Diff Code Blocks
-
-Show code changes with diff highlighting:
-
-```diff
-function oldFunction() {
-- return "old implementation"
-+ return "new implementation"
-}
-
-+ function newFunction() {
-+ return "brand new feature"
-+ }
-```
-
-## List Components
-
-### Ordered Lists
-
-Numbered lists with custom styling:
-
-```markdown
-1. First step
-2. Second step
-3. Third step
-```
-
-1. First step
-2. Second step
-3. Third step
-
-### Unordered Lists
-
-Bullet lists with custom styling:
-
-```markdown
-- Feature one
-- Feature two
-- Feature three
-```
-
-- Feature one
-- Feature two
-- Feature three
-
-## Link Components
-
-### Anchor Links
-
-Enhanced links with proper styling:
-
-```mdx
-Visit our [homepage](/) for more information.
-Check out the [React Router docs](https://reactrouter.com).
-```
-
-Visit our [homepage](/) for more information.
-Check out the [React Router docs](https://reactrouter.com).
-
-**Features:**
-- External link detection
-- Proper styling for internal/external links
-- Accessibility improvements
-
-## Component Implementation
-
-All components are defined in `app/components/mdx-wrapper.tsx`:
-
-```typescript
-export const MDXWrapper = ({ content }: { content: string }) => (
-
-)
-```
-
-## Creating Custom Components
-
-You can add your own components by:
-
-1. **Creating the component** in `app/ui/` or `app/components/`
-2. **Adding it to MDXWrapper** in `app/components/mdx-wrapper.tsx`
-3. **Using it in your content** files
-
-Example custom component:
-
-```typescript
-// app/ui/custom-callout.tsx
-export const CustomCallout = ({ children, type = "info" }) => (
-
- {children}
-
-)
-```
-
-```typescript
-// Add to mdx-wrapper.tsx
-components={{
- // ... existing components
- CustomCallout,
-}}
-```
-
-```mdx
-
-
-This is a custom callout component!
-
-```
-
-Custom components should follow the existing design system for consistency.
\ No newline at end of file
diff --git a/content/02-content-management/index.md b/content/02-content-management/index.md
deleted file mode 100644
index 2127f19..0000000
--- a/content/02-content-management/index.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: Content Management
----
-
-This section covers creating and organizing documentation content using Markdown and MDX.
\ No newline at end of file
diff --git a/content/02-overview/01-project-structure.mdx b/content/02-overview/01-project-structure.mdx
new file mode 100644
index 0000000..95b3aef
--- /dev/null
+++ b/content/02-overview/01-project-structure.mdx
@@ -0,0 +1,163 @@
+---
+title: "Project Structure"
+summary: "Understanding the template organization"
+description: "Learn about the folder structure and key files in the documentation template."
+---
+
+## Folder Overview
+
+```
+docs/
+โโโ .content-collections/ # Auto-generated (dev mode)
+โโโ .github/ # GitHub Actions workflows
+โโโ app/ # React Router application
+โ โโโ components/ # UI components
+โ โโโ hooks/ # React hooks
+โ โโโ routes/ # Route definitions
+โ โโโ utils/ # Utility functions
+โ โโโ routes.ts # Route configuration
+โ โโโ tailwind.css # Tailwind styles
+โโโ content/ # Your documentation (MDX/MD)
+โโโ generated-docs/ # Generated docs (production)
+โโโ public/ # Static assets
+โโโ resources/ # Icons, fonts, assets
+โโโ content-collections.ts # Content config
+โโโ generate-docs.ts # Docs generation script
+โโโ Dockerfile # Docker configuration
+โโโ fly.toml # Fly.io deployment config
+โโโ .env.example # Environment variables template
+โโโ package.json # Dependencies and scripts
+```
+
+## Core Folders
+
+### `app/`
+
+The React Router v7 application that powers your documentation site.
+
+**Key folders:**
+- **`components/`** - Reusable UI components (Command K, Code blocks, Sidebar, MDXWrapper, etc.)
+- **`hooks/`** - Custom React hooks for documentation features
+- **`routes/`** - Route components (homepage, documentation layout, documentation pages)
+- **`utils/`** - Helper functions and utilities
+- **`tailwind.css`** - Global styles and Tailwind configuration
+
+### `resources/`
+
+Static resources used throughout the site:
+- SVG icons
+- Custom fonts
+- Other design assets
+
+Feel free to add your own assets here.
+
+### `content/`
+
+**This is where your documentation lives.** All `.md` and `.mdx` files should be placed here following the content organization structure (see Content Guide).
+
+### `generated-docs/`
+
+**Production-only folder.** Contains processed documentation organized by version:
+- `main/` - Latest docs from main branch (no tags)
+- `v1.0.0/`, `v2.0.0/` - Versioned documentation
+
+This folder is created by the `generate-docs.ts` script and used during production builds.
+
+### `.content-collections/`
+
+**Development-only folder (auto-generated).** Contains processed content for hot reloading. Don't edit this folder manuallyโit's regenerated automatically.
+
+## Key Files
+
+### `package.json`
+
+Contains important scripts:
+
+```json
+{
+ "scripts": {
+ ...
+ "generate:docs": "tsx generate-docs.ts",
+ "content-collections:build": "content-collections build"
+ }
+}
+```
+
+### `content-collections.ts`
+
+Configures how MDX/MD files are processed. Defines:
+- Document schema (frontmatter fields)
+- File patterns to match
+- Content transformations
+
+### `generate-docs.ts`
+
+Script that generates versioned documentation from your git releases. Uses:
+- Git commands to fetch releases/tags
+- Processes and organizes docs by version
+
+### `fly.toml`
+
+Fly.io deployment configuration. Defines:
+- App name
+- Region
+- Build settings
+- Health checks
+- Environment variables
+
+### `Dockerfile`
+
+Docker configuration for building and running the app in production.
+
+### `.env.example`
+
+Template for environment variables:
+
+```env
+GITHUB_REPO_URL=https://github.com/your-org/your-repo
+```
+
+Copy this to `.env` and fill in your values.
+
+### `routes.ts`
+
+React Router configuration file that defines:
+- Route patterns
+- Layout hierarchy
+- Route metadata
+
+## Components You'll Use
+
+### `MDXWrapper`
+
+Wraps your MDX content with styling. Located in `app/components/`.
+
+### Custom MDX Components
+
+Pre-built components you can use in your MDX:
+- `` - Information callouts
+- `` - Warning messages
+
+To use custom components in MDX, pass them to the `components` prop in `MDXContent`.
+
+### Command K
+
+Built-in search component that indexes your documentation automatically.
+
+### Sidebar
+
+Auto-generated from your content structure. Respects the ordering prefixes in your filenames.
+
+## Customization Points
+
+All FIXME comments mark places you'll want to customize:
+- Brand colors in `tailwind.css`
+- Package name references
+- GitHub repository links
+- Site metadata
+
+Find them with:
+
+```bash
+grep -r "FIXME" --include="*.ts" --include="*.tsx" --include="*.css"
+```
diff --git a/content/02-overview/02-content-organization.mdx b/content/02-overview/02-content-organization.mdx
new file mode 100644
index 0000000..7692c5f
--- /dev/null
+++ b/content/02-overview/02-content-organization.mdx
@@ -0,0 +1,242 @@
+---
+title: "Content Organization"
+summary: "How to structure your documentation"
+description: "Learn how to organize your MDX/MD files for optimal documentation structure and navigation."
+---
+
+## Content Structure Rules
+
+The template uses a **prefix-based ordering system** to control how pages appear in the sidebar. This gives you complete control over your documentation hierarchy.
+
+## Naming Convention
+
+All files and folders should follow this pattern:
+
+```
+NN-descriptive-name.mdx
+```
+
+Where:
+- `NN` is a two-digit number (01, 02, 03, etc.)
+- `descriptive-name` describes the content
+- Extension is `.mdx` or `.md`
+
+## File Types
+
+### `.mdx` files
+Full documentation pages with frontmatter and content.
+
+**Required frontmatter:**
+```yaml
+---
+title: "Page Title"
+summary: "Short summary"
+description: "SEO description"
+---
+```
+
+### `.md` files (index files only)
+Section/subsection titles for sidebar navigation.
+
+**Required frontmatter:**
+```yaml
+---
+title: Section Title
+---
+```
+
+**Important:** Regular `index.md` files should only contain frontmatterโno body content.
+
+## Example Structure
+
+Here's a complete example showing all nesting levels:
+
+```
+content/
+โโโ _index.mdx # Homepage (special file)
+โโโ 01-changelog.mdx # Top-level page
+โโโ 02-introduction.mdx # Top-level page
+โโโ 03-getting-started/ # Section
+โ โโโ index.md # Section title
+โ โโโ 01-installation.mdx # Page in section
+โ โโโ 02-quick-start.mdx # Page in section
+โ โโโ 03-configuration.mdx # Page in section
+โโโ 04-core-features/ # Section
+ โโโ index.md # Section title
+ โโโ 01-authentication.mdx # Page in section
+ โโโ 02-data-management/ # Subsection
+ โ โโโ index.md # Subsection title
+ โ โโโ 01-fetching.mdx # Page in subsection
+ โ โโโ 02-caching.mdx # Page in subsection
+ โโโ 03-ui-components/ # Subsection
+ โโโ index.md # Subsection title
+ โโโ 01-buttons.mdx # Page in subsection
+ โโโ 02-forms.mdx # Page in subsection
+```
+
+## Hierarchy Levels
+
+### Level 1: Top-Level Pages
+
+Files directly in `content/`:
+
+```
+content/
+โโโ _index.mdx # Special homepage
+โโโ 01-changelog.mdx # Regular top-level page
+โโโ 02-introduction.mdx # Regular top-level page
+```
+
+### Level 2: Sections
+
+Folders with an `index.md`:
+
+```
+content/
+โโโ 03-getting-started/
+ โโโ index.md # Defines "Getting Started" section
+ โโโ 01-installation.mdx
+ โโโ 02-quick-start.mdx
+```
+
+### Level 3: Subsections
+
+Nested folders with an `index.md`:
+
+```
+content/
+โโโ 04-features/
+ โโโ index.md
+ โโโ 01-data/ # Subsection
+ โโโ index.md # Defines "Data" subsection
+ โโโ 01-fetching.mdx
+ โโโ 02-caching.mdx
+```
+
+## Special Files
+
+### `_index.mdx`
+
+The documentation homepage. Must be named exactly `_index.mdx` (with underscore prefix).
+
+### `index.md`
+
+Section and subsection titles. These should:
+- Only contain frontmatter (title)
+- Not include body content
+- Be present in every section/subsection folder
+
+## MDX Examples
+
+### Full Documentation Page
+
+```mdx
+---
+title: "Getting Started with Authentication"
+summary: "Learn how to implement authentication"
+description: "A comprehensive guide to implementing secure authentication in your application using our auth system."
+---
+
+## Introduction
+
+Authentication is a critical part of any application...
+
+## Basic Setup
+
+First, install the authentication package:
+
+```bash
+npm install @your-org/auth
+```
+
+Then initialize it in your app...
+
+
+Make sure to store your API keys securely!
+
+
+## Next Steps
+
+Now that you have authentication set up, you can...
+```
+
+### Section Index File
+
+```md
+---
+title: Getting Started
+---
+```
+
+That's it! No body content needed.
+
+## Custom Components in MDX
+
+You can use custom React components in your MDX files:
+
+```mdx
+
+This is helpful information for your users.
+
+
+
+Be careful with this configuration!
+
+```
+
+To add more custom components, edit the `MDXContent` component and pass them to the `components` prop.
+
+## Best Practices
+
+1. **Use descriptive names** - `01-installation.mdx` is better than `01-setup.mdx`
+2. **Keep numbering consistent** - Use 01, 02, 03 (not 1, 2, 3)
+3. **Group related content** - Use sections and subsections logically
+4. **Write complete frontmatter** - All three fields help with SEO and navigation
+5. **Start sections at 01** - Each folder's numbering should restart at 01
+
+## Common Mistakes
+
+โ **Missing index.md in sections:**
+```
+content/
+โโโ getting-started/ # Missing index.md
+ โโโ 01-installation.mdx
+```
+
+โ
**Correct:**
+```
+content/
+โโโ 01-getting-started/
+ โโโ index.md # Required!
+ โโโ 01-installation.mdx
+```
+
+โ **Body content in index.md:**
+```md
+---
+title: Getting Started
+---
+
+This section covers... โ Don't do this
+```
+
+โ
**Correct:**
+```md
+---
+title: Getting Started
+---
+```
+
+โ **Inconsistent numbering:**
+```
+01-first.mdx
+2-second.mdx # Missing leading zero
+03-third.mdx
+```
+
+โ
**Correct:**
+```
+01-first.mdx
+02-second.mdx
+03-third.mdx
+```
diff --git a/content/02-overview/03-customization-tips.mdx b/content/02-overview/03-customization-tips.mdx
new file mode 100644
index 0000000..3eaad81
--- /dev/null
+++ b/content/02-overview/03-customization-tips.mdx
@@ -0,0 +1,322 @@
+---
+title: "Customization & Tips"
+summary: "Customize the template to match your brand"
+description: "Learn how to customize styling, components, and features to make the documentation template your own."
+---
+
+## Finding Customization Points
+
+We've marked key customization points with `FIXME` comments throughout the codebase. Find them all:
+
+```bash
+grep -r "FIXME" --include="*.ts" --include="*.tsx" --include="*.css"
+```
+
+These typically take just 2 minutes to update and include:
+- Brand colors
+- Package names
+- Repository URLs
+- Site metadata
+
+## Styling Customization
+
+### Tailwind CSS Configuration
+
+The main styles are in `app/tailwind.css`. This is where you'll customize:
+
+**Brand Colors:**
+```css
+@theme {
+ --color-primary-50: /* your brand color */;
+ --color-primary-100: /* ... */;
+ /* ... */
+ --color-primary-900: /* ... */;
+}
+```
+
+**Typography:**
+```css
+@theme {
+ --font-sans: "Your Font", system-ui, sans-serif;
+ --font-mono: "Your Mono Font", monospace;
+}
+```
+
+**Dark Mode:**
+The template uses Tailwind v4's native dark mode. Customize dark theme colors in the same `@theme` block.
+
+### Component Styling
+
+All components in `app/components/` can be styled. Key components to customize:
+
+- **Sidebar** - Navigation appearance
+- **Command K** - Search modal styling
+- **MDXWrapper** - Content styling
+- **Code blocks** - Syntax highlighting theme
+
+## Adding Custom MDX Components
+
+### 1. Create Your Component
+
+Create a new component in `app/components/`:
+
+```tsx
+// app/components/Callout.tsx
+interface CalloutProps {
+ type: 'info' | 'warning' | 'success';
+ children: React.ReactNode;
+}
+
+export function Callout({ type, children }: CalloutProps) {
+ return (
+
+ {children}
+
+ );
+}
+```
+
+### 2. Register in MDXContent
+
+Find the `MDXContent` component and add your component:
+
+```tsx
+import { Callout } from '~/components/Callout';
+
+
+```
+
+### 3. Use in MDX
+
+```mdx
+
+Your custom component is now available!
+
+```
+
+## Modifying Routes
+
+Routes are defined in `app/routes.ts`. The template uses React Router v7's route configuration.
+
+### Adding a New Top-Level Page
+
+```ts
+// app/routes.ts
+import { type RouteConfig } from "@react-router/dev/routes";
+
+export default [
+ // ... existing routes
+ {
+ path: "/changelog",
+ file: "routes/changelog.tsx",
+ },
+] satisfies RouteConfig;
+```
+
+### Modifying Documentation Layout
+
+The documentation layout is in `app/routes/docs.$version.$.tsx`. This handles:
+- Sidebar rendering
+- Content area
+- Version selection
+- GitHub links
+
+## Configuration Files
+
+### content-collections.ts
+
+This file defines how your MDX files are processed:
+
+```ts
+import { defineCollection, defineConfig } from "@content-collections/core";
+
+const docs = defineCollection({
+ name: "docs",
+ directory: "content",
+ include: "**/*.mdx",
+ schema: (z) => ({
+ title: z.string(),
+ summary: z.string().optional(),
+ description: z.string(),
+ }),
+});
+
+export default defineConfig({
+ collections: [docs],
+});
+```
+
+**Customization ideas:**
+- Add custom frontmatter fields
+- Add different content collections
+- Modify file processing
+
+### generate-docs.ts
+
+This script handles documentation versioning. Key parts you might customize:
+
+- **Git commands** - Change how releases are fetched
+- **File processing** - Modify what gets copied
+- **Version naming** - Change version folder names
+
+## Adding Features
+
+### Custom Search
+
+The Command K component can be extended to search external sources or add custom filters.
+
+### Additional Navigation
+
+Add a footer, header links, or breadcrumbs by modifying the layout components.
+
+## Performance Tips
+
+### 1. Optimize Images
+
+Place images in `public/` or `resources/`:
+
+```mdx
+
+```
+
+Use modern formats (WebP, AVIF) for better performance.
+
+### 2. Code Splitting
+
+React Router v7 automatically code-splits routes. Keep your route components focused and lean.
+
+### 3. Lazy Loading
+
+For heavy components, use React's lazy loading:
+
+```tsx
+import { lazy } from 'react';
+
+const HeavyComponent = lazy(() => import('./HeavyComponent'));
+```
+
+## Content Tips
+
+### 1. Use Descriptive Titles
+
+Good titles improve SEO and navigation:
+- โ "API"
+- โ
"API Reference Guide"
+
+### 2. Write Clear Descriptions
+
+The `description` frontmatter is used for SEO meta tags:
+
+```yaml
+---
+description: "Learn how to authenticate users in your app using OAuth 2.0 and JWT tokens with our authentication library."
+---
+```
+
+### 3. Break Up Long Pages
+
+Instead of one huge page, split into multiple pages in a section:
+
+```
+03-advanced/
+โโโ index.md
+โโโ 01-caching.mdx
+โโโ 02-performance.mdx
+โโโ 03-security.mdx
+```
+
+### 4. Use Visual Aids
+
+Add diagrams, screenshots, and code examples to improve understanding.
+
+## Common Customizations
+
+### Change Primary Color
+
+Edit `app/tailwind.css`:
+
+```css
+@theme {
+ --color-primary-500: #f97316; /* Orange */
+}
+```
+
+### Update Package Name
+
+Search and replace throughout the codebase:
+
+```bash
+grep -r "your-old-package-name" --include="*.ts" --include="*.tsx"
+```
+
+### Add Social Links
+
+Modify the footer or header components to include:
+- GitHub
+- Twitter
+- Discord
+- Slack
+
+### Change Font
+
+1. Add font files to `resources/fonts/`
+2. Update `tailwind.css` or `fonts.ts`:
+
+## Development Workflow Tips
+
+### Hot Reload
+
+The dev server supports hot module replacement. Changes to:
+- MDX files reload instantly
+- React components reload on save
+- Tailwind classes update live
+
+### Content Organization
+
+Keep related files together and use consistent naming:
+
+```
+content/
+โโโ 04-api-reference/
+ โโโ index.md
+ โโโ 01-authentication.mdx
+ โโโ 02-endpoints.mdx
+ โโโ 03-errors.mdx
+```
+
+## Troubleshooting
+
+### Content Not Showing
+
+1. Check file naming follows `NN-name.mdx` format
+2. Verify frontmatter is valid YAML
+3. Run `pnpm run content-collections:build` to rebuild
+
+### Styling Not Applying
+
+1. Check Tailwind classes are valid v4 syntax
+2. Verify `tailwind.css` is imported in `root.tsx`
+3. Clear browser cache
+
+### Build Errors
+
+1. Check for TypeScript errors: `pnpm tsc`
+2. Verify all imports are correct
+3. Check content-collections schema matches your frontmatter
+
+## Getting Help
+
+If you run into issues:
+
+1. Check the FIXME comments for guidance
+2. Review the sample content for examples
+3. Reach out to the Forge 42 team
+
+Happy documenting! ๐
diff --git a/content/02-overview/index.md b/content/02-overview/index.md
new file mode 100644
index 0000000..915847f
--- /dev/null
+++ b/content/02-overview/index.md
@@ -0,0 +1,3 @@
+---
+title: "Overview"
+---
\ No newline at end of file
diff --git a/content/03-advanced-usage/01-deployment-versioning.mdx b/content/03-advanced-usage/01-deployment-versioning.mdx
new file mode 100644
index 0000000..9873c9d
--- /dev/null
+++ b/content/03-advanced-usage/01-deployment-versioning.mdx
@@ -0,0 +1,194 @@
+---
+title: "Deployment & Versioning"
+summary: "Deploy and version your documentation"
+description: "Learn how to deploy your documentation to Fly.io and manage multiple versions using git tags and releases."
+---
+
+## Deployment Overview
+
+The template comes with automated deployment to Fly.io using GitHub Actions. When you push changes or create a release, your documentation is automatically built and deployed.
+
+## Setting Up Fly.io
+
+### 1. Create a Fly.io Account
+
+Sign up at [fly.io](https://fly.io) if you haven't already.
+
+### 2. Install Fly CLI
+
+```bash
+# macOS/Linux
+curl -L https://fly.io/install.sh | sh
+
+# Windows
+powershell -Command "iwr https://fly.io/install.ps1 -useb | iex"
+```
+
+### 3. Login to Fly
+
+```bash
+fly auth login
+```
+
+### 4. Create Your App
+
+From the `docs/` directory:
+
+```bash
+fly apps create your-app-name
+```
+
+### 5. Set Environment Variables
+
+Add your environment variables to Fly:
+
+```bash
+fly secrets set GITHUB_REPO_URL=https://github.com/your-org/your-repo
+```
+
+### 6. Configure fly.toml
+
+Edit `fly.toml` and update the app name:
+
+```toml
+app = "your-app-name" # โ Change this
+
+[build]
+ dockerfile = "Dockerfile"
+
+[http_service]
+ internal_port = 3000
+ force_https = true
+ auto_stop_machines = true
+ auto_start_machines = true
+ min_machines_running = 0
+
+[[vm]]
+ memory = '1gb'
+ cpu_kind = 'shared'
+ cpus = 1
+```
+
+## GitHub Actions Setup
+
+The template includes workflow files for automatic deployment. You need to place them in the **root** of your repository.
+
+### Workflow Location
+
+```
+your-repo/
+โโโ .github/
+โ โโโ workflows/
+โ โโโ ci.yml # PR deployment
+โ โโโ publish-documentation.yml # Release deployment
+โโโ docs/
+โ โโโ ...
+โโโ ...
+```
+
+**Important:** Workflows must be in the **root `.github` folder**, not inside `docs/.github`.
+
+### Required GitHub Secrets
+
+Add these secrets to your GitHub repository (Settings โ Secrets and variables โ Actions):
+
+- `FLY_API_TOKEN` - Your Fly.io API token (get it with `fly tokens create deploy`)
+
+
+## Versioning System
+
+The template supports multiple documentation versions based on your git tags and releases.
+
+### How Versioning Works
+
+1. **Development Mode** (local)
+ - Uses `.content-collections/` folder
+ - No versioning, just live content
+
+2. **Production Mode** (deployed)
+ - Uses `generated-docs/` folder
+ - Organized by version
+
+### Generated Docs Structure
+
+```
+generated-docs/
+โโโ main/ # Latest from main branch (no tags)
+โ โโโ content/
+โโโ v1.0.0/ # Version 1.0.0 docs
+โ โโโ content/
+โโโ v2.0.0/ # Version 2.0.0 docs
+ โโโ content/
+```
+
+### Generating Versioned Docs
+
+#### Without Versions (Latest Only)
+
+```bash
+pnpm run generate:docs
+```
+
+This creates only the `latest/` folder with your latest documentation.
+
+#### With Versions
+
+```bash
+pnpm run generate:docs --versions "semver range or exact tags"
+```
+
+This:
+1. Fetches all git tags from your repository
+2. Checks out each tag
+3. Copies documentation for each version
+4. Organizes everything in `generated-docs/`
+
+### Creating a Versioned Release
+
+To create a new documentation version:
+
+1. **Update your documentation** in the `content/` folder
+2. **Commit and push** your changes
+3. **Create a git tag:**
+
+```bash
+git tag v1.0.0
+git push origin v1.0.0
+```
+
+4. **Create a GitHub release** from that tag
+5. **Automatic deployment** will generate versioned docs
+
+## SEO Configuration
+
+### Robots.txt
+
+By default, the template **prevents indexing** with `x-robots-tag` header. To enable indexing:
+
+1. Remove the header from your CDN/Fly.io configuration
+2. Or modify `robots.txt`
+
+
+### llms.txt
+
+An `llms.txt` file is automatically generated to help AI tools understand your documentation structure.
+
+## Monitoring Your Deployment
+
+### View Logs
+
+```bash
+fly logs
+```
+
+### Check Status
+
+```bash
+fly status
+```
+
+### SSH into Container
+
+```bash
+fly ssh console
+```
diff --git a/content/03-advanced-usage/02-usage-inside-monorepo.mdx b/content/03-advanced-usage/02-usage-inside-monorepo.mdx
new file mode 100644
index 0000000..41edcf0
--- /dev/null
+++ b/content/03-advanced-usage/02-usage-inside-monorepo.mdx
@@ -0,0 +1,65 @@
+---
+title: "Usage inside a monorepo"
+summary: "Add the docs-template into an existing monorepo and run it locally (pnpm workspace, workflows, and content setup)."
+description: "Step-by-step guide for integrating the docs-template into a monorepo: add the `docs/` package to `pnpm-workspace.yaml`, move CI workflows to `.github/workflows`, resolve FIXME markers, replace example content under `docs/content`, and run the local dev server with pnpm."
+---
+
+## Usage inside a monorepo
+
+This page explains the minimal steps to install the docs-template into an existing monorepo and run the documentation locally. The template is designed to be dropped under the `/docs` folder of your repository and wired into pnpm workspaces.
+
+Follow these steps:
+
+1. Create a repository (or use an existing one)
+
+ - You can start from our example stack `@forge42/open-source-stack` or any repo you control. The important part is that you can add a `/docs` folder and control the repository root (where `.github`, `pnpm-workspace.yaml`, etc. live).
+
+2. Download and extract the docs-template into your monorepo
+
+ - Download the `docs-template` files from the main branch (or copy the template contents) and extract them into the repository root inside a `docs/` directory.
+
+ - Make sure your root `pnpm-workspace.yaml` includes the `docs` package so pnpm can hoist and link the docs project. Example snippet:
+
+ ```yaml
+ packages:
+ packages/*
+ test-apps/*
+ + docs
+ onlyBuiltDependencies:
+ '@biomejs/biome'
+ esbuild
+ lefthook
+ ```
+
+
+3. Move or add workflow files to `.github/workflows` in the monorepo root
+
+ - The template includes CI workflows (for example: `ci.yml`, `publish-documentation.yml`, and `pr-close.yml`). Move these into your repository root under `.github/workflows/` so GitHub Actions can find and run them.
+
+ - The workflows use Fly.io and the template `fly.toml` and `Dockerfile`. If you don't use Fly, you can customize the workflows or remove those steps.
+
+4. Check and resolve FIXME comments inside workflows
+
+ - Open the workflow files and search for `FIXME` markers. Resolve those before relying on the workflows.
+
+5. Make sure you have a `/content` folder with documentation pages
+
+ - The template ships with example content in `docs/content` that briefly explains how the template works. Remove those example files and add your own documentation content (for example: `01-getting-started.mdx`, `02-project-structure.mdx`, etc.).
+
+6. Install and run locally
+
+ - From the repository root run:
+
+ ```bash
+ pnpm install
+ pnpm run dev
+ ```
+
+ - After `pnpm run dev` the docs server will start (see terminal output for the local dev URL). Open the URL in your browser to preview the site.
+
+Notes and tips
+
+- If your monorepo already has a `docs/` package, merge carefully to avoid overwriting important files.
+- Keep `fly.toml` and `Dockerfile` at the root of the `docs` package (or where the workflows expect them). If you move them, update the workflow paths accordingly.
+- Verify `pnpm-workspace.yaml` indentation and syntax โ YAML parsing errors can stop workspace linking.
+- If you use a different package manager or CI provider, adapt the commands and workflow steps.
diff --git a/content/03-advanced-usage/index.md b/content/03-advanced-usage/index.md
new file mode 100644
index 0000000..c0e970c
--- /dev/null
+++ b/content/03-advanced-usage/index.md
@@ -0,0 +1,3 @@
+---
+title: "Advanced Usage"
+---
\ No newline at end of file
diff --git a/content/03-customization/01-branding-and-design.mdx b/content/03-customization/01-branding-and-design.mdx
deleted file mode 100644
index dbc3e13..0000000
--- a/content/03-customization/01-branding-and-design.mdx
+++ /dev/null
@@ -1,224 +0,0 @@
----
-title: Branding & Design
-description: Customize the look and feel of your documentation site
-summary: Design Customization
----
-
- Documentation for `docs-template` is still under construction. Some sections may be incomplete or change frequently.
-
-
-## Logo Customization
-
-### Updating the Logo
-
-The main logo is defined in `app/components/logo.tsx`:
-
-```typescript
-export const Logo = ({ children }: { children: React.ReactNode }) => {
- return (
-
-
- F42
-
- {children && (
-
- {children}
-
- )}
-
- )
-}
-```
-
-### Logo Usage
-
-The logo appears in two places:
-
-1. **Homepage** (`app/routes/index.tsx`):
-```typescript
-
- YOUR PROJECT NAME
-
-```
-
-2. **Documentation Layout** (`app/routes/documentation-layout.tsx`):
-```typescript
-
- YOUR PROJECT NAME
-
-```
-
-### Adding a Custom Logo Image
-
-To use an image instead of the text logo:
-
-```typescript
-// app/components/logo.tsx
-export const Logo = ({ children }: { children?: React.ReactNode }) => {
- return (
-
-
- {children}
-
- )
-}
-```
-
-Place your logo file in the `public/` directory.
-
-## Color Theming
-
-### CSS Variables
-
-The template uses CSS variables for theming, defined in `app/tailwind.css`:
-
-```css
-:root {
- --color-background: #fafafa;
- --color-border: #e5e7eb;
- --color-text-normal: #2d3748;
- --color-text-muted: #718096;
- --color-text-active: #000000;
- /* ... more variables */
-}
-
-[data-theme="dark"] {
- --color-background: #0f172a;
- --color-border: #334155;
- --color-text-normal: #cbd5e1;
- --color-text-muted: #64748b;
- --color-text-active: #f1f5f9;
- /* ... dark theme variables */
-}
-```
-
-### Customizing Colors
-
-1. **Update CSS Variables**: Modify colors in `app/tailwind.css`
-2. **Brand Colors**: Update accent colors used throughout the site
-3. **Component Colors**: Some components use specific color classes
-
-Example brand color customization:
-
-```css
-:root {
- /* Update these for your brand */
- --color-primary: #your-brand-color;
- --color-accent: #your-accent-color;
-}
-```
-
-### Gradient Customization
-
-Update gradients used in the logo and buttons:
-
-```typescript
-// From this:
-bg-gradient-to-r from-[#2c8794] to-[#329baa]
-
-// To your colors:
-bg-gradient-to-r from-[#your-color-1] to-[#your-color-2]
-```
-
-## Typography
-
-### Font Configuration
-
-Fonts are configured in `app/tailwind.css`:
-
-```css
-@theme {
- --font-dyna-puff: "Dyna Puff", sans-serif;
- --font-inter: "Inter", sans-serif;
- --font-space: "Space", sans-serif;
-}
-```
-
-### Custom Fonts
-
-To add custom fonts:
-
-1. **Add font files** to `resources/fonts/`
-2. **Update font loading** in `app/root.tsx`
-3. **Configure in Tailwind** in `app/tailwind.css`
-
-## Page Metadata
-
-### Site Title
-
-Update the site title in route meta functions:
-
-```typescript
-// app/routes/index.tsx
-export const meta = ({ data }: Route.MetaArgs) => {
- return generateMetaFields({
- domain,
- path: "/",
- title: "Your Project Name", // Update this
- description: "Your project description",
- })
-}
-```
-
-### Favicon
-
-Replace the favicon files in `public/`:
-- `favicon.ico`
-- `apple-touch-icon.png`
-- `icon-192.png`
-- `icon-512.png`
-
-## Navigation Customization
-
-### Header Links
-
-Add custom header links in `app/routes/documentation-layout.tsx`:
-
-```typescript
-
-
-
-
-
- {/* Add custom links here */}
-
-
- {GITHUB_REPO_URL && }
-
-```
-
-## Homepage Customization
-
-### Hero Section
-
-Update the homepage hero in `app/routes/index.tsx`:
-
-```typescript
-
- Your Project Name
-
-
- Your Tagline
-
-
-```
-
-### Feature Cards
-
-Update feature cards to match your project:
-
-```typescript
-
-
-
Your Feature
-
Description of your feature
-
- {/* Add more feature cards */}
-
-```
-
-Remember to update all text content and links to match your project throughout the codebase.
\ No newline at end of file
diff --git a/content/03-customization/02-configuration-options.mdx b/content/03-customization/02-configuration-options.mdx
deleted file mode 100644
index f39a2a6..0000000
--- a/content/03-customization/02-configuration-options.mdx
+++ /dev/null
@@ -1,236 +0,0 @@
----
-title: Configuration Options
-description: Configure build settings, environment variables, and deployment options
-summary: Configuration Guide
----
-
- Documentation for `docs-template` is still under construction. Some sections may be incomplete or change frequently.
-
-
-## Environment Configuration
-
-### Environment Variables
-
-The template uses environment variables for configuration. Copy `.env.example` to `.env`:
-
-```bash
-cp .env.example .env
-```
-
-Key environment variables:
-
-```bash
-# GitHub Integration
-GITHUB_REPO_URL=https://github.com/yourusername/your-repo
-
-# Domain Configuration
-DOMAIN=https://yourdocs.com
-
-# Development/Production
-NODE_ENV=development
-APP_ENV=development
-```
-
-### Environment File Structure
-
-- `.env` - Local development (not committed)
-- `.env.example` - Example configuration (committed)
-- `.env.test` - Test environment configuration
-
-## Build Configuration
-
-### Vite Configuration
-
-Main build configuration is in `vite.config.ts`:
-
-```typescript
-export default defineConfig
- plugins: [
- tailwindcss(),
- reactRouterDevTools(), // Development tools
- reactRouter(), // React Router v7
- reactRouterHonoServer({
- dev: {
- // Development server configuration
- }
- }),
- contentCollections(), // Content processing
- tsconfigPaths(), // TypeScript path mapping
- iconsSpritesheet({ // Icon generation
- inputDir: "resources/icons",
- outputDir: "app/ui/icon",
- pathToSprite: "~/ui/icon/sprite.svg",
- }),
- ],
-})
-```
-
-### Content Collections Configuration
-
-Content processing is configured in `content-collections.ts`:
-
-```typescript
-const section = defineCollection({
- name: "section",
- directory: "content",
- include: "**/index.md",
- schema: sectionSchema,
- // ... configuration
-})
-
-const page = defineCollection({
- name: "page",
- directory: "content",
- include: "**/**/*.mdx",
- schema: pageSchema,
- // ... configuration with MDX compilation
-})
-```
-
-## Version Management
-
-### Version Configuration
-
-Versions are managed in `app/utils/versions.ts`:
-
-```typescript
-// Auto-generated file. Do not edit manually.
-export const versions = ["current"] as const
-```
-
-This file is auto-generated by the `scripts/generate-docs.ts` script.
-
-### Multi-Version Setup
-
-To support multiple versions:
-
-1. **Tag your releases**:
- ```bash
- git tag v1.0.0
- git tag v1.1.0
- ```
-
-2. **Generate docs for multiple versions**:
- ```bash
- pnpm run generate:docs --versions "v1.0.0,v1.1.0" --branch main
- ```
-
-3. **Version resolution** happens in `app/utils/version-resolvers.ts`
-
-## SEO Configuration
-
-### Meta Tags
-
-SEO configuration is handled by `app/utils/seo.ts`:
-
-```typescript
-export function generateMetaFields({
- domain,
- path,
- title,
- description,
- image,
-}: MetaOptions): MetaFunction {
- return [
- { title },
- { name: "description", content: description },
- { property: "og:title", content: title },
- { property: "og:description", content: description },
- // ... more meta tags
- ]
-}
-```
-
-### Sitemap Generation
-
-Sitemaps are automatically generated:
-
-- `app/routes/sitemap-index[.]xml.ts` - Sitemap index
-- `app/routes/sitemap.$lang[.]xml.ts` - Language-specific sitemaps
-
-### Robots.txt
-
-Robots.txt is generated in `app/routes/robots[.]txt.ts`:
-
-```typescript
-const robotsTxt = generateRobotsTxt([
- {
- userAgent: "*",
- [isProductionDeployment ? "allow" : "disallow"]: ["/"],
- sitemap: [`${domain}/sitemap-index.xml`],
- },
-])
-```
-
-## Search Configuration
-
-### Search Index
-
-Search is configured in `app/components/command-k/create-search-index.ts`:
-
-```typescript
-export async function createSearchIndex(version: Version) {
- const { allPages } = await getContent(version)
-
- // Configure what content to index
- const searchableContent = allPages.map(page => ({
- title: page.title,
- content: stripCodeFences(page.rawMdx),
- // ... indexing configuration
- }))
-}
-```
-
-### Search Features
-
-- **Full-text search** across all content
-- **Keyboard shortcuts** (Cmd/Ctrl + K)
-- **Search history** with local storage
-- **Fuzzy matching** with Fuse.js
-
-## Development Tools
-
-### React Router DevTools
-
-Development tools are configured in `vite.config.ts`:
-
-```typescript
-reactRouterDevTools(), // Add development panel
-```
-
-DevTools are automatically excluded from production builds.
-
-### Code Quality Tools
-
-Configuration files for code quality:
-
-- `biome.json` - Linting and formatting
-- `tsconfig.json` - TypeScript configuration
-- `vitest.config.ts` - Testing configuration
-
-### Docker Configuration
-
-The template includes `Dockerfile` for containerized deployment:
-
-```dockerfile
-# Multi-stage build for optimized production image
-FROM node:18-alpine AS base
-# ... Docker configuration
-```
-
-### Fly.io Configuration
-
-Deployment configuration for Fly.io in `fly.toml`:
-
-```toml
-app = "your-app-name"
-primary_region = "your-region"
-
-[build]
-
-[http_service]
- internal_port = 3000
- # ... Fly.io configuration
-```
-
-Update deployment configurations to match your hosting platform and requirements.
\ No newline at end of file
diff --git a/content/03-customization/index.md b/content/03-customization/index.md
deleted file mode 100644
index 1cfeb2d..0000000
--- a/content/03-customization/index.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: Customization
----
-
-This section covers customizing the appearance and functionality of your documentation site.
\ No newline at end of file
diff --git a/content/04-deployment/01-automation.mdx b/content/04-deployment/01-automation.mdx
deleted file mode 100644
index 75bfd5a..0000000
--- a/content/04-deployment/01-automation.mdx
+++ /dev/null
@@ -1,67 +0,0 @@
----
-title: CI/CD & Automation
-summary: Automation Guide
-description: Fast reference for validation, build and deploy pipeline.
----
-
- Documentation for `docs-template` is still under construction. Some sections may be incomplete or change frequently.
-
-
-## Why
-Automate validation + build + deploy so every PR and release ships safely.
-
-## Triggers
-- Pull request โ validate + preview deploy
-- Push to main โ production deploy
-- Release tag โ versioned docs + production deploy
-## Pipeline Stages
-1. Quality: biome lint, typecheck, unused code scan
-2. Tests: unit (Vitest)
-3. Build: generate docs, build app
-4. Deploy: preview (PR) or production (main/release)
-
-## Secrets / Vars
-Secrets:
-- FLY_API_TOKEN
-
-Variables:
-- FLY_ORG
-- FLY_REGION
-
-## Release Flow
-```bash
-# create and push the tag if you havenโt already
-git tag v1.0.0
-git push origin v1.0.0
-
-# create the release from the tag
-gh release create v1.0.0 --title "v1.0.0" --notes "Initial release of docs-template"
-
-```
-Action:
-- Generates docs for tag
-- Updates versions
-- Deploys
-
-
-## Local PreโPush Checklist
-```bash
-pnpm run lint
-pnpm run typecheck
-pnpm run check:unused
-pnpm run test
-pnpm run generate:docs -- --branch main
-pnpm run build
-```
-
-## Monitor
-- GitHub Actions tab (logs)
-- PR checks (gates)
-- Fly dashboard (deployment status)
-
-## Customizing
-Add steps in `.github/workflows/ci.yml` (extra lint, security scan, alt deployment). Replace Fly deploy step if using another platform.
-
-## Keep In Mind
-- Failing tests block deploy
-- Never edit generated-docs/ manually
\ No newline at end of file
diff --git a/content/04-deployment/index.md b/content/04-deployment/index.md
deleted file mode 100644
index d93db5d..0000000
--- a/content/04-deployment/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
----
-title: Deployment
----
diff --git a/content/05-contribution/01-contribution-guidelines.mdx b/content/05-contribution/01-contribution-guidelines.mdx
deleted file mode 100644
index 244248b..0000000
--- a/content/05-contribution/01-contribution-guidelines.mdx
+++ /dev/null
@@ -1,99 +0,0 @@
----
-title: Contributing Guidelines
-summary: Contribution Guide
-description: Compact guide for improving docs or code.
----
-
-
- Documentation for `docs-template` is still under construction. Some sections may be incomplete or change frequently.
-
-
-## 1. Quick Actions
-- Edit this page โ forks (if needed), opens file, PR.
-- Report an issue โ prefilled page context.
-
-## 2. Fast Workflow
-```bash
-# oneโtime
-git fork + clone
-pnpm install
-
-# generate + dev
-pnpm run generate:docs -- --branch main
-pnpm dev
-```
-Create a branch:
-```bash
-git checkout -b docs/update-installation
-```
-After changes:
-```bash
-pnpm run lint && pnpm run typecheck
-pnpm test
-git commit -m "docs: clarify installation"
-git push -u origin docs/update-installation
-```
-Open PR.
-
-## 3. What To Change
-Content (preferred first contribution):
-- Edit /content/**/*.mdx
-- Keep frontmatter: title, summary, description
-- Use number prefixes only for ordering.
-
-Code:
-- UI: app/components/*
-- Utilities: app/utils/*
-- Keep TypeScript strict and small focused changes.
-
-## 4. Frontmatter Pattern
-```md
----
-title: Clear Title
-summary: One concise line
-description: Short descriptive sentence
----
-```
-
-## 5. Testing (When Code Changes)
-```bash
-pnpm run lint
-pnpm run typecheck
-pnpm test
-```
-Add tests for new utils / non-trivial logic.
-
-## 7. Commit & PR
-Commits (Conventional):
-- docs: update quickstart
-- fix: sidebar active state
-- feat: add dark theme toggle
-
-PR description:
-- What / Why
-- Screenshots (if UI)
-- Follow-up considerations (if any)
-
-## 8. Content Quality Checklist
-- Clear title & summary
-- Description
-- Logical heading order
-- No TODO / FIXME left
-
-## 9. Issues
-Bug report include:
-- Steps
-- Expected vs actual
-- Environment (browser / OS)
-Feature request include:
-- Problem
-- Proposed solution (short)
-- Prior art (optional)
-
-
-## 10. Need Help?
-- Check existing pages
-- Skim recent merged PRs for patterns
-- Open an issue if unsure
-
-Thanks for improving the docsโsmall focused PRs are easiest to review.
\ No newline at end of file
diff --git a/content/05-contribution/index.md b/content/05-contribution/index.md
deleted file mode 100644
index f081874..0000000
--- a/content/05-contribution/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
----
-title: Contribution
----
diff --git a/content/_index.mdx b/content/_index.mdx
index acda966..ac2707b 100644
--- a/content/_index.mdx
+++ b/content/_index.mdx
@@ -1,113 +1,66 @@
---
-title: "Forge42 Docs Template"
-summary: "High-level map and complete guide to configuring, customizing, and deploying the Forge42 Documentation Template."
-description: "Orientation guide for configuring docs, routing, SEO, versioning, deployment, customization, and contributions."
+title: "Documentation Template"
+summary: "Production-ready documentation template"
+description: "A modern documentation template built with React Router v7, Tailwind v4, and content-collections for seamless MDX-based documentation."
---
-
- Documentation for `docs-template` is still under construction. Some sections may be incomplete or change frequently.
-
-Welcome to the official documentation for the **Forge42 Documentation Template**!
-This template provides a modern, scalable solution for building beautiful documentation websites with **React Router v7**, **Content Collections**, and **Tailwind CSS**.
+## Welcome
-It is **productionโready** out of the box, with versioning, search, SEO, collaboration links, and deployment automation.
+This is a production-ready documentation template designed to generate beautiful, versioned documentation for your packages. Built on top of **@forge-42/base-stack**, it combines modern tools for a superior developer experience.
----
-
-## At a Glance
-
-- Perโpage meta tags & SEO defaults
-- Versioned documentation system
-- Dynamic sidebar with previous/next navigation
-- Table of contents with active heading tracking
-- CommandโK search palette
-- Theme support with light/dark mode
-- Easy UI customization (layout & components)
-- Automatic docs build & deployment on GitHub release
-- Collaboration links (โEdit pageโ, โReport an issueโ)
-- Fly.io deployment configuration & CI/CD automation
-
----
+## Tech Stack
-## Quick Start
-
-1. **Clone the repository**
- ```bash
- git clone https://github.com/forge42/docs-template my-docs
- cd my-docs
- ```
+- **React Router v7** (Framework mode)
+- **Tailwind v4** with custom components
+- **React 19** with automatic optimizations
+- **content-collections** for MDX/MD processing
+- **Vite** for blazing-fast builds
+- **Vitest** for testing
-2. **Install dependencies**
- ```bash
- pnpm install
- ```
+## Key Features
-3. **Generate documentation**
- ```bash
- pnpm run generate:docs --versions ">=v1.1.0 <=v2.1.0, v3.2.0"
- ```
+- ๐ **MDX/MD Support** โ Write documentation in Markdown with React components and custom MDX components.
+- ๐จ **Beautiful UI** โ Pre-built components (Command K, code blocks, table-of-contents, sidebar) so docs look polished out of the box.
+- ๐ **Versioning** โ Produce versioned documentation (e.g. `v1.0.0/`) via the generator so you can publish releases side-by-side.
+- ๐ **Automated Docs Generation** โ `scripts/generate-docs.ts` automates building `generated-docs/` and writes `app/utils/versions.ts`. Example:
- or if you don't have releases yet:
+```bash
+pnpm run generate:docs --branch main --versions "^1.0.0"
+```
- ```bash
- pnpm run generate:docs --branch main"
- ```
+- ๐งญ **Local Development Experience** โ Fast iteration using the auto-generated `.content-collections/` folder for hot reloading; run the generator when you want to preview versioned outputs locally.
+- ๐ **SEO & Indexing** โ Automatic sitemap, `robots.txt` and `llms.txt` support to improve search and crawler behavior.
+- โก **Live Reload** โ Hot module replacement during development for instant previews when editing content.
+- ๐ **CI/CD Ready** โ Example GitHub Actions workflows are included to build, pack, and publish `generated-docs/` artifacts for preview and release deployments.
+- ๐ณ **Docker + Fly Deployment** โ Includes `Dockerfile` and `fly.toml` so you can containerize and deploy the generated site easily.
+- โ
**Type-safe & Tested** โ Built with TypeScript, includes `tsc` type checks, `vitest` tests, and Biome linting to keep quality high.
+- โฟ **Accessibility & Performance Focused** โ UI primitives and tooling tuned for accessibility and fast page loads.
+- ๐ **GitHub Links** โ Edit page and report issue links are built into pages to streamline contribution.
-4. **Start development server**
- ```bash
- pnpm run dev
- ```
+## Quick Start
-Visit **[http://localhost:4280](http://localhost:4280)** to preview your site.
+```bash
+# 1. Unzip template under /docs folder
+# 2. Install dependencies
+pnpm install
----
+# 3. Start development server
+pnpm run dev
-## Project Structure
-
-```
-my-docs/
-โโโ app/ # React Router application
-โโโ content/ # Documentation content (Markdown/MDX)
-โโโ public/ # Static assets
-โโโ scripts/ # Build & utility scripts
-โโโ generated-docs/ # Auto-generated docs
-โโโ resources/ # Icons, photos, fonts...
+# 4. Build for production
+pnpm run build
```
----
-
-## Core Features
-
-### Content Management
-- Write in Markdown/MDX with frontmatter
-- Automatic sidebar and navigation generation
-- Built-in rich content components
+## FIXME Notes
-### Search & Navigation
-- Fullโtext search with **Cmd+K / Ctrl+K**
-- Automatic table of contents
-- Previous/next page navigation
+We've left a few `FIXME` comments in the codebase marking small customization points. Run this command to find them all:
-### SEO & Discovery
-- **llms.txt** route for AI crawlers
-- **robots.txt** with sitemap hints
-- **sitemap-index.xml** + perโlanguage `sitemap.xml`
-- Social meta tags (Open Graph / Twitter)
-
-### Collaboration & Contribution
-- Oneโclick links: **Edit page** / **Report issue**
-- Contribution guide included
-
-### Deployment & Automation
-- Example **Fly.io** config
-- Scripted docs generation
-- CI workflow ready for build + deploy
+```bash
+grep -r "FIXME" --include="*.ts" --include="*.tsx" --include="*.css"
+```
-### Customization
-- Update branding, theme, layout shell
-- Extend sidebar, meta builder, and contribution links
-- Tailwind tokens for typography & colors
+These are quick 2-minute changes like updating your package name or branding colors.
----
+## What's Next?
-Built with โค๏ธ by the Forge42 team โ [forge42.dev](https://forge42.dev)
\ No newline at end of file
+Follow the getting started guide to set up your documentation, understand the project structure, and learn how to organize your content effectively.
diff --git a/knip.json b/knip.json
index 7ce5682..b3090e2 100644
--- a/knip.json
+++ b/knip.json
@@ -15,7 +15,6 @@
"@babel/preset-typescript",
"babel-plugin-react-compiler",
"tailwindcss",
- "@tailwindcss/typography",
- "rehype-slug"
+ "@tailwindcss/typography"
]
}
diff --git a/package.json b/package.json
index 2d19c9f..243572a 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@forge42/docs-template",
- "version": "0.0.1",
+ "version": "1.0.0",
"author": "forge-42",
"private": true,
"sideEffects": false,
@@ -11,7 +11,7 @@
"clean": "git clean -fdX --exclude=\"!.env\"",
"script": "tsx scripts/setup.ts",
"build": "react-router build",
- "predev": "run-s typegen verify:docs",
+ "predev": "pnpm run typegen",
"dev": "react-router dev",
"start": "NODE_ENV=production node ./build/server/index.js",
"pretest": "pnpm run typegen",
@@ -28,7 +28,6 @@
"check:unused:fix": "knip --fix",
"typegen": "react-router typegen",
"generate:docs": "npx tsx scripts/generate-docs.ts --branch main",
- "verify:docs": "tsx scripts/verify-docs.ts",
"content-collections:build": "content-collections build"
},
"dependencies": {
@@ -73,15 +72,14 @@
"@types/react-dom": "19.0.3",
"@types/semver": "7.7.0",
"@types/slug": "5.0.9",
- "@vitest/browser": "3.0.5",
- "@vitest/coverage-v8": "3.0.5",
- "@vitest/ui": "3.0.5",
+ "@vitest/browser": "3.2.4",
+ "@vitest/coverage-v8": "3.2.4",
+ "@vitest/ui": "3.2.4",
"babel-plugin-react-compiler": "19.0.0-beta-df7b47d-20241124",
"chalk": "5.4.1",
"happy-dom": "16.8.1",
"knip": "5.43.6",
"lefthook": "1.10.10",
- "npm-run-all": "4.1.5",
"playwright": "1.50.1",
"prompt": "1.3.0",
"react-router-devtools": "5.0.4",
@@ -92,8 +90,8 @@
"vite-plugin-babel": "1.3.0",
"vite-plugin-icons-spritesheet": "3.0.1",
"vite-tsconfig-paths": "5.1.4",
- "vitest": "3.0.5",
- "vitest-browser-react": "0.0.4"
+ "vitest": "3.2.4",
+ "vitest-browser-react": "1.0.1"
},
"packageManager": "pnpm@10.18.0",
"optionalDependencies": {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2debba6..83ecbbb 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -127,14 +127,14 @@ importers:
specifier: 5.0.9
version: 5.0.9
'@vitest/browser':
- specifier: 3.0.5
- version: 3.0.5(@types/node@22.13.1)(playwright@1.50.1)(typescript@5.7.3)(vite@6.2.0(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1))(vitest@3.0.5)
+ specifier: 3.2.4
+ version: 3.2.4(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(playwright@1.50.1)(vite@6.2.0(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1))(vitest@3.2.4)
'@vitest/coverage-v8':
- specifier: 3.0.5
- version: 3.0.5(@vitest/browser@3.0.5)(vitest@3.0.5)
+ specifier: 3.2.4
+ version: 3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4)
'@vitest/ui':
- specifier: 3.0.5
- version: 3.0.5(vitest@3.0.5)
+ specifier: 3.2.4
+ version: 3.2.4(vitest@3.2.4)
babel-plugin-react-compiler:
specifier: 19.0.0-beta-df7b47d-20241124
version: 19.0.0-beta-df7b47d-20241124
@@ -150,9 +150,6 @@ importers:
lefthook:
specifier: 1.10.10
version: 1.10.10
- npm-run-all:
- specifier: 4.1.5
- version: 4.1.5
playwright:
specifier: 1.50.1
version: 1.50.1
@@ -184,11 +181,11 @@ importers:
specifier: 5.1.4
version: 5.1.4(typescript@5.7.3)(vite@6.2.0(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1))
vitest:
- specifier: 3.0.5
- version: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(@vitest/browser@3.0.5)(@vitest/ui@3.0.5)(happy-dom@16.8.1)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(tsx@4.19.2)(yaml@2.8.1)
+ specifier: 3.2.4
+ version: 3.2.4(@types/debug@4.1.12)(@types/node@22.13.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@16.8.1)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(tsx@4.19.2)(yaml@2.8.1)
vitest-browser-react:
- specifier: 0.0.4
- version: 0.0.4(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(@vitest/browser@3.0.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(vitest@3.0.5)
+ specifier: 1.0.1
+ version: 1.0.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(@vitest/browser@3.2.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(vitest@3.2.4)
optionalDependencies:
'@rollup/rollup-linux-x64-gnu':
specifier: ^4.34.3
@@ -1601,6 +1598,9 @@ packages:
'@types/aria-query@5.0.4':
resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
+ '@types/chai@5.2.2':
+ resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==}
+
'@types/cookie@0.6.0':
resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
@@ -1610,6 +1610,9 @@ packages:
'@types/debug@4.1.12':
resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+ '@types/deep-eql@4.0.2':
+ resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
+
'@types/estree-jsx@1.0.5':
resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
@@ -1677,13 +1680,13 @@ packages:
'@ungap/structured-clone@1.3.0':
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
- '@vitest/browser@3.0.5':
- resolution: {integrity: sha512-5WAWJoucuWcGYU5t0HPBY03k9uogbUEIu4pDmZHoB4Dt+6pXqzDbzEmxGjejZSitSYA3k/udYfuotKNxETVA3A==}
+ '@vitest/browser@3.2.4':
+ resolution: {integrity: sha512-tJxiPrWmzH8a+w9nLKlQMzAKX/7VjFs50MWgcAj7p9XQ7AQ9/35fByFYptgPELyLw+0aixTnC4pUWV+APcZ/kw==}
peerDependencies:
playwright: '*'
safaridriver: '*'
- vitest: 3.0.5
- webdriverio: '*'
+ vitest: 3.2.4
+ webdriverio: ^7.0.0 || ^8.0.0 || ^9.0.0
peerDependenciesMeta:
playwright:
optional: true
@@ -1692,51 +1695,48 @@ packages:
webdriverio:
optional: true
- '@vitest/coverage-v8@3.0.5':
- resolution: {integrity: sha512-zOOWIsj5fHh3jjGwQg+P+J1FW3s4jBu1Zqga0qW60yutsBtqEqNEJKWYh7cYn1yGD+1bdPsPdC/eL4eVK56xMg==}
+ '@vitest/coverage-v8@3.2.4':
+ resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==}
peerDependencies:
- '@vitest/browser': 3.0.5
- vitest: 3.0.5
+ '@vitest/browser': 3.2.4
+ vitest: 3.2.4
peerDependenciesMeta:
'@vitest/browser':
optional: true
- '@vitest/expect@3.0.5':
- resolution: {integrity: sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==}
+ '@vitest/expect@3.2.4':
+ resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==}
- '@vitest/mocker@3.0.5':
- resolution: {integrity: sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==}
+ '@vitest/mocker@3.2.4':
+ resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==}
peerDependencies:
msw: ^2.4.9
- vite: ^5.0.0 || ^6.0.0
+ vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0
peerDependenciesMeta:
msw:
optional: true
vite:
optional: true
- '@vitest/pretty-format@3.0.5':
- resolution: {integrity: sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==}
-
'@vitest/pretty-format@3.2.4':
resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==}
- '@vitest/runner@3.0.5':
- resolution: {integrity: sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==}
+ '@vitest/runner@3.2.4':
+ resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==}
- '@vitest/snapshot@3.0.5':
- resolution: {integrity: sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==}
+ '@vitest/snapshot@3.2.4':
+ resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==}
- '@vitest/spy@3.0.5':
- resolution: {integrity: sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==}
+ '@vitest/spy@3.2.4':
+ resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==}
- '@vitest/ui@3.0.5':
- resolution: {integrity: sha512-gw2noso6WI+2PeMVCZFntdATS6xl9qhQcbhkPQ9sOmx/Xn0f4Bx4KDSbD90jpJPF0l5wOzSoGCmKyVR3W612mg==}
+ '@vitest/ui@3.2.4':
+ resolution: {integrity: sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==}
peerDependencies:
- vitest: 3.0.5
+ vitest: 3.2.4
- '@vitest/utils@3.0.5':
- resolution: {integrity: sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==}
+ '@vitest/utils@3.2.4':
+ resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==}
'@web3-storage/multipart-parser@1.0.0':
resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==}
@@ -1767,10 +1767,6 @@ packages:
resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
engines: {node: '>=12'}
- ansi-styles@3.2.1:
- resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
- engines: {node: '>=4'}
-
ansi-styles@4.3.0:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'}
@@ -1799,36 +1795,23 @@ packages:
aria-query@5.3.0:
resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
- array-buffer-byte-length@1.0.2:
- resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
- engines: {node: '>= 0.4'}
-
- arraybuffer.prototype.slice@1.0.4:
- resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
- engines: {node: '>= 0.4'}
-
assertion-error@2.0.1:
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
engines: {node: '>=12'}
+ ast-v8-to-istanbul@0.3.7:
+ resolution: {integrity: sha512-kr1Hy6YRZBkGQSb6puP+D6FQ59Cx4m0siYhAxygMCAgadiWQ6oxAxQXHOMvJx67SJ63jRoVIIg5eXzUbbct1ww==}
+
astring@1.9.0:
resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
hasBin: true
- async-function@1.0.0:
- resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
- engines: {node: '>= 0.4'}
-
async@2.6.4:
resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==}
async@3.2.3:
resolution: {integrity: sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==}
- available-typed-arrays@1.0.7:
- resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
- engines: {node: '>= 0.4'}
-
babel-dead-code-elimination@1.0.10:
resolution: {integrity: sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==}
@@ -1861,9 +1844,6 @@ packages:
boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
- brace-expansion@1.1.12:
- resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
-
brace-expansion@2.0.2:
resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
@@ -1886,18 +1866,6 @@ packages:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
engines: {node: '>=8'}
- call-bind-apply-helpers@1.0.2:
- resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
- engines: {node: '>= 0.4'}
-
- call-bind@1.0.8:
- resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
- engines: {node: '>= 0.4'}
-
- call-bound@1.0.4:
- resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
- engines: {node: '>= 0.4'}
-
callsites@3.1.0:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
@@ -1919,10 +1887,6 @@ packages:
chain-function@1.0.1:
resolution: {integrity: sha512-SxltgMwL9uCko5/ZCLiyG2B7R9fY4pDZUw7hJ4MhirdjBLosoDqkWABi3XMucddHdLiFJMb7PD2MZifZriuMTg==}
- chalk@2.4.2:
- resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
- engines: {node: '>=4'}
-
chalk@5.4.1:
resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==}
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
@@ -1977,16 +1941,10 @@ packages:
collapse-white-space@2.1.0:
resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==}
- color-convert@1.9.3:
- resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
-
color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
- color-name@1.1.3:
- resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
-
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
@@ -2009,9 +1967,6 @@ packages:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
- concat-map@0.0.1:
- resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
-
concat-stream@1.6.2:
resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==}
engines: {'0': node >= 0.8}
@@ -2043,10 +1998,6 @@ packages:
cross-fetch@4.0.0:
resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==}
- cross-spawn@6.0.6:
- resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==}
- engines: {node: '>=4.8'}
-
cross-spawn@7.0.6:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
@@ -2121,18 +2072,6 @@ packages:
resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==}
engines: {node: '>=12'}
- data-view-buffer@1.0.2:
- resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
- engines: {node: '>= 0.4'}
-
- data-view-byte-length@1.0.2:
- resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
- engines: {node: '>= 0.4'}
-
- data-view-byte-offset@1.0.1:
- resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
- engines: {node: '>= 0.4'}
-
date-fns@4.1.0:
resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==}
@@ -2163,14 +2102,6 @@ packages:
defaults@1.0.4:
resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
- define-data-property@1.1.4:
- resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
- engines: {node: '>= 0.4'}
-
- define-properties@1.2.1:
- resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
- engines: {node: '>= 0.4'}
-
defu@6.1.4:
resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
@@ -2215,10 +2146,6 @@ packages:
resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==}
engines: {node: '>=12'}
- dunder-proto@1.0.1:
- resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
- engines: {node: '>= 0.4'}
-
duplexify@3.7.1:
resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==}
@@ -2266,33 +2193,9 @@ packages:
error-ex@1.3.4:
resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
- es-abstract@1.24.0:
- resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==}
- engines: {node: '>= 0.4'}
-
- es-define-property@1.0.1:
- resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
- engines: {node: '>= 0.4'}
-
- es-errors@1.3.0:
- resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
- engines: {node: '>= 0.4'}
-
es-module-lexer@1.7.0:
resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
- es-object-atoms@1.1.1:
- resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
- engines: {node: '>= 0.4'}
-
- es-set-tostringtag@2.1.0:
- resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
- engines: {node: '>= 0.4'}
-
- es-to-primitive@1.3.0:
- resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
- engines: {node: '>= 0.4'}
-
esast-util-from-estree@2.0.0:
resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==}
@@ -2313,10 +2216,6 @@ packages:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
- escape-string-regexp@1.0.5:
- resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
- engines: {node: '>=0.8.0'}
-
escape-string-regexp@4.0.0:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
@@ -2409,10 +2308,6 @@ packages:
flatted@3.3.3:
resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
- for-each@0.3.5:
- resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
- engines: {node: '>= 0.4'}
-
foreground-child@3.3.1:
resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
engines: {node: '>=14'}
@@ -2452,17 +2347,6 @@ packages:
function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
- function.prototype.name@1.1.8:
- resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
- engines: {node: '>= 0.4'}
-
- functions-have-names@1.2.3:
- resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
-
- generator-function@2.0.1:
- resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==}
- engines: {node: '>= 0.4'}
-
gensync@1.0.0-beta.2:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
engines: {node: '>=6.9.0'}
@@ -2471,26 +2355,14 @@ packages:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
- get-intrinsic@1.3.0:
- resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
- engines: {node: '>= 0.4'}
-
get-nonce@1.0.1:
resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
engines: {node: '>=6'}
- get-proto@1.0.1:
- resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
- engines: {node: '>= 0.4'}
-
get-stream@6.0.1:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'}
- get-symbol-description@1.1.0:
- resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
- engines: {node: '>= 0.4'}
-
get-tsconfig@4.10.1:
resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==}
@@ -2510,17 +2382,9 @@ packages:
engines: {node: 20 || >=22}
hasBin: true
- globalthis@1.0.4:
- resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
- engines: {node: '>= 0.4'}
-
globrex@0.1.2:
resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
- gopd@1.2.0:
- resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
- engines: {node: '>= 0.4'}
-
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
@@ -2540,33 +2404,10 @@ packages:
resolution: {integrity: sha512-n0QrmT9lD81rbpKsyhnlz3DgnMZlaOkJPpgi746doA+HvaMC79bdWkwjrNnGJRvDrWTI8iOcJiVTJ5CdT/AZRw==}
engines: {node: '>=18.0.0'}
- has-bigints@1.1.0:
- resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
- engines: {node: '>= 0.4'}
-
- has-flag@3.0.0:
- resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
- engines: {node: '>=4'}
-
has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
- has-property-descriptors@1.0.2:
- resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
-
- has-proto@1.2.0:
- resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
- engines: {node: '>= 0.4'}
-
- has-symbols@1.1.0:
- resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
- engines: {node: '>= 0.4'}
-
- has-tostringtag@1.0.2:
- resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
- engines: {node: '>= 0.4'}
-
hasown@2.0.2:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
@@ -2600,9 +2441,6 @@ packages:
resolution: {integrity: sha512-5qfNQeaIptMaJKyoJ6N/q4gIq0DBp2FCRaLNuUI3LlJKL4S37DY/rLL1uAxA4wrPB39tJ3s+f7kgI79O4ScSug==}
engines: {node: '>=16.9.0'}
- hosted-git-info@2.8.9:
- resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
-
hosted-git-info@6.1.3:
resolution: {integrity: sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -2656,51 +2494,19 @@ packages:
inline-style-parser@0.2.4:
resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==}
- internal-slot@1.1.0:
- resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
- engines: {node: '>= 0.4'}
-
is-alphabetical@2.0.1:
resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
is-alphanumerical@2.0.1:
resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==}
- is-array-buffer@3.0.5:
- resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
- engines: {node: '>= 0.4'}
-
is-arrayish@0.2.1:
resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
- is-async-function@2.1.1:
- resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
- engines: {node: '>= 0.4'}
-
- is-bigint@1.1.0:
- resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
- engines: {node: '>= 0.4'}
-
- is-boolean-object@1.2.2:
- resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
- engines: {node: '>= 0.4'}
-
- is-callable@1.2.7:
- resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
- engines: {node: '>= 0.4'}
-
is-core-module@2.16.1:
resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
engines: {node: '>= 0.4'}
- is-data-view@1.0.2:
- resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
- engines: {node: '>= 0.4'}
-
- is-date-object@1.1.0:
- resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
- engines: {node: '>= 0.4'}
-
is-decimal@2.0.1:
resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
@@ -2715,18 +2521,10 @@ packages:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
- is-finalizationregistry@1.1.1:
- resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
- engines: {node: '>= 0.4'}
-
is-fullwidth-code-point@3.0.0:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
- is-generator-function@1.1.2:
- resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==}
- engines: {node: '>= 0.4'}
-
is-glob@4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
@@ -2738,21 +2536,9 @@ packages:
is-hexadecimal@2.0.1:
resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
- is-map@2.0.3:
- resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
- engines: {node: '>= 0.4'}
-
- is-negative-zero@2.0.3:
- resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
- engines: {node: '>= 0.4'}
-
is-node-process@1.2.0:
resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==}
- is-number-object@1.1.1:
- resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
- engines: {node: '>= 0.4'}
-
is-number@7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
@@ -2764,52 +2550,13 @@ packages:
is-platform@1.0.0:
resolution: {integrity: sha512-AKxe6+dvzAQsDXhhhxGRL9G67q5rKiyTL0BUl5mCyQz2NdvmqWNmMsjoCOIVdyXOYpP6MhkmZ1DPYGkfgv0MpA==}
- is-regex@1.2.1:
- resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
- engines: {node: '>= 0.4'}
-
- is-set@2.0.3:
- resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
- engines: {node: '>= 0.4'}
-
- is-shared-array-buffer@1.0.4:
- resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
- engines: {node: '>= 0.4'}
-
is-stream@2.0.1:
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
engines: {node: '>=8'}
- is-string@1.1.1:
- resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
- engines: {node: '>= 0.4'}
-
- is-symbol@1.1.1:
- resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
- engines: {node: '>= 0.4'}
-
- is-typed-array@1.1.15:
- resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
- engines: {node: '>= 0.4'}
-
- is-weakmap@2.0.2:
- resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
- engines: {node: '>= 0.4'}
-
- is-weakref@1.1.1:
- resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
- engines: {node: '>= 0.4'}
-
- is-weakset@2.0.4:
- resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
- engines: {node: '>= 0.4'}
-
isarray@1.0.0:
resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
- isarray@2.0.5:
- resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
-
isbot@5.1.22:
resolution: {integrity: sha512-RqCFY3cJy3c2y1I+rMn81cfzAR4XJwfPBC+M8kffUjbPzxApzyyv7Tbm1C/gXXq2dSCuD238pKFEWlQMTWsTFw==}
engines: {node: '>=18'}
@@ -2863,6 +2610,9 @@ packages:
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+ js-tokens@9.0.1:
+ resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
+
js-yaml@3.14.1:
resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
hasBin: true
@@ -2876,9 +2626,6 @@ packages:
engines: {node: '>=6'}
hasBin: true
- json-parse-better-errors@1.0.2:
- resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==}
-
json-parse-even-better-errors@2.3.1:
resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
@@ -3036,10 +2783,6 @@ packages:
lite-emit@2.3.0:
resolution: {integrity: sha512-QMPrnwPho7lfkzZUN3a0RJ/oiwpt464eXf6aVh1HGOYh+s7Utu78q3FcFbW59c8TNWWQaz9flKN1cEb8dmxD+g==}
- load-json-file@4.0.0:
- resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==}
- engines: {node: '>=4'}
-
lodash.castarray@4.4.0:
resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==}
@@ -3094,10 +2837,6 @@ packages:
resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==}
engines: {node: '>=16'}
- math-intrinsics@1.1.0:
- resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
- engines: {node: '>= 0.4'}
-
mdast-util-from-markdown@2.0.2:
resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==}
@@ -3137,10 +2876,6 @@ packages:
memoize-one@6.0.0:
resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
- memorystream@0.3.1:
- resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==}
- engines: {node: '>= 0.10.0'}
-
merge-stream@2.0.0:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
@@ -3247,9 +2982,6 @@ packages:
resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==}
engines: {node: 20 || >=22}
- minimatch@3.1.2:
- resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
-
minimatch@9.0.1:
resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==}
engines: {node: '>=16 || 14 >=14.17'}
@@ -3300,9 +3032,6 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
- nice-try@1.0.5:
- resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==}
-
node-fetch@2.7.0:
resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
engines: {node: 4.x || >=6.0.0}
@@ -3323,9 +3052,6 @@ packages:
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
hasBin: true
- normalize-package-data@2.5.0:
- resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
-
normalize-package-data@5.0.0:
resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -3346,11 +3072,6 @@ packages:
resolution: {integrity: sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
- npm-run-all@4.1.5:
- resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==}
- engines: {node: '>= 4'}
- hasBin: true
-
npm-run-path@4.0.1:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
engines: {node: '>=8'}
@@ -3362,22 +3083,10 @@ packages:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
- object-inspect@1.13.4:
- resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
- engines: {node: '>= 0.4'}
-
- object-keys@1.1.1:
- resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
- engines: {node: '>= 0.4'}
-
object-treeify@1.1.33:
resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==}
engines: {node: '>= 10'}
- object.assign@4.1.7:
- resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
- engines: {node: '>= 0.4'}
-
once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
@@ -3388,10 +3097,6 @@ packages:
outvariant@1.4.3:
resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==}
- own-keys@1.0.1:
- resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
- engines: {node: '>= 0.4'}
-
p-limit@6.2.0:
resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==}
engines: {node: '>=18'}
@@ -3413,10 +3118,6 @@ packages:
parse-entities@4.0.2:
resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==}
- parse-json@4.0.0:
- resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==}
- engines: {node: '>=4'}
-
parse-json@5.2.0:
resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
engines: {node: '>=8'}
@@ -3425,10 +3126,6 @@ packages:
resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==}
engines: {node: '>=18'}
- path-key@2.0.1:
- resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==}
- engines: {node: '>=4'}
-
path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
@@ -3447,10 +3144,6 @@ packages:
path-to-regexp@6.3.0:
resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
- path-type@3.0.0:
- resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==}
- engines: {node: '>=4'}
-
path-type@4.0.0:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
@@ -3479,15 +3172,6 @@ packages:
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
engines: {node: '>=12'}
- pidtree@0.3.1:
- resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==}
- engines: {node: '>=0.10'}
- hasBin: true
-
- pify@3.0.0:
- resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==}
- engines: {node: '>=4'}
-
playwright-core@1.50.1:
resolution: {integrity: sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==}
engines: {node: '>=18'}
@@ -3502,10 +3186,6 @@ packages:
resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
engines: {node: '>=4'}
- possible-typed-array-names@1.1.0:
- resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
- engines: {node: '>= 0.4'}
-
postcss-selector-parser@6.0.10:
resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
engines: {node: '>=4'}
@@ -3705,10 +3385,6 @@ packages:
resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==}
engines: {node: '>=0.10.0'}
- read-pkg@3.0.0:
- resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==}
- engines: {node: '>=4'}
-
read@1.0.7:
resolution: {integrity: sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==}
engines: {node: '>=0.8'}
@@ -3734,14 +3410,6 @@ packages:
recma-stringify@1.0.0:
resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==}
- reflect.getprototypeof@1.0.10:
- resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
- engines: {node: '>= 0.4'}
-
- regexp.prototype.flags@1.5.4:
- resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
- engines: {node: '>= 0.4'}
-
rehype-recma@1.0.0:
resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==}
@@ -3833,24 +3501,12 @@ packages:
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
- safe-array-concat@1.1.3:
- resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
- engines: {node: '>=0.4'}
-
safe-buffer@5.1.2:
resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
- safe-push-apply@1.0.0:
- resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
- engines: {node: '>= 0.4'}
-
- safe-regex-test@1.1.0:
- resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
- engines: {node: '>= 0.4'}
-
scheduler@0.25.0:
resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==}
@@ -3858,10 +3514,6 @@ packages:
resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
engines: {node: '>=4'}
- semver@5.7.2:
- resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
- hasBin: true
-
semver@6.3.1:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
@@ -3877,54 +3529,14 @@ packages:
set-cookie-parser@2.7.1:
resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==}
- set-function-length@1.2.2:
- resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
- engines: {node: '>= 0.4'}
-
- set-function-name@2.0.2:
- resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
- engines: {node: '>= 0.4'}
-
- set-proto@1.0.0:
- resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
- engines: {node: '>= 0.4'}
-
- shebang-command@1.2.0:
- resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==}
- engines: {node: '>=0.10.0'}
-
shebang-command@2.0.0:
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
engines: {node: '>=8'}
- shebang-regex@1.0.0:
- resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==}
- engines: {node: '>=0.10.0'}
-
shebang-regex@3.0.0:
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
- shell-quote@1.8.3:
- resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==}
- engines: {node: '>= 0.4'}
-
- side-channel-list@1.0.0:
- resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
- engines: {node: '>= 0.4'}
-
- side-channel-map@1.0.1:
- resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
- engines: {node: '>= 0.4'}
-
- side-channel-weakmap@1.0.2:
- resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
- engines: {node: '>= 0.4'}
-
- side-channel@1.1.0:
- resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
- engines: {node: '>= 0.4'}
-
siginfo@2.0.0:
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
@@ -3997,10 +3609,6 @@ packages:
std-env@3.9.0:
resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==}
- stop-iteration-iterator@1.1.0:
- resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
- engines: {node: '>= 0.4'}
-
stream-shift@1.0.3:
resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==}
@@ -4022,22 +3630,6 @@ packages:
resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==}
engines: {node: '>=16'}
- string.prototype.padend@3.1.6:
- resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==}
- engines: {node: '>= 0.4'}
-
- string.prototype.trim@1.2.10:
- resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
- engines: {node: '>= 0.4'}
-
- string.prototype.trimend@1.0.9:
- resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
- engines: {node: '>= 0.4'}
-
- string.prototype.trimstart@1.0.8:
- resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
- engines: {node: '>= 0.4'}
-
string_decoder@1.1.1:
resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
@@ -4056,10 +3648,6 @@ packages:
resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==}
engines: {node: '>=0.10.0'}
- strip-bom@3.0.0:
- resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
- engines: {node: '>=4'}
-
strip-final-newline@2.0.0:
resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
engines: {node: '>=6'}
@@ -4068,6 +3656,9 @@ packages:
resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==}
engines: {node: '>=14.16'}
+ strip-literal@3.1.0:
+ resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==}
+
style-to-js@1.1.17:
resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==}
@@ -4080,10 +3671,6 @@ packages:
summary@2.1.0:
resolution: {integrity: sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==}
- supports-color@5.5.0:
- resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
- engines: {node: '>=4'}
-
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -4134,8 +3721,8 @@ packages:
resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==}
engines: {node: '>=14.0.0'}
- tinyspy@3.0.2:
- resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
+ tinyspy@4.0.4:
+ resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==}
engines: {node: '>=14.0.0'}
tldts-core@7.0.16:
@@ -4200,22 +3787,6 @@ packages:
type-flag@3.0.0:
resolution: {integrity: sha512-3YaYwMseXCAhBB14RXW5cRQfJQlEknS6i4C8fCfeUdS3ihG9EdccdR9kt3vP73ZdeTGmPb4bZtkDn5XMIn1DLA==}
- typed-array-buffer@1.0.3:
- resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
- engines: {node: '>= 0.4'}
-
- typed-array-byte-length@1.0.3:
- resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
- engines: {node: '>= 0.4'}
-
- typed-array-byte-offset@1.0.4:
- resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
- engines: {node: '>= 0.4'}
-
- typed-array-length@1.0.7:
- resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
- engines: {node: '>= 0.4'}
-
typedarray@0.0.6:
resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
@@ -4224,10 +3795,6 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
- unbox-primitive@1.1.0:
- resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
- engines: {node: '>= 0.4'}
-
undici-types@6.20.0:
resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
@@ -4330,8 +3897,8 @@ packages:
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
- vite-node@3.0.5:
- resolution: {integrity: sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==}
+ vite-node@3.2.4:
+ resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
@@ -4394,32 +3961,32 @@ packages:
yaml:
optional: true
- vitest-browser-react@0.0.4:
- resolution: {integrity: sha512-4uK8zgo5eHlhrBVEPX8ejRt8Bn4gzV6OZFTPdb1en3FtgjEhhst400XkIQHUC875Q90rOO5Tc4zPpCl8YXvoxg==}
- engines: {node: ^18.0.0 || >=20.0.0}
+ vitest-browser-react@1.0.1:
+ resolution: {integrity: sha512-LqiGFCdknrbMoSDWXTCTrPsED3SvdIXIgYOOZyYUNj2dkJusW2eF6NENOlBlxwq+FBQqzNK1X59b+b03pXFpAQ==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
peerDependencies:
- '@types/react': '>18.0.0'
- '@types/react-dom': '>18.0.0'
- '@vitest/browser': '>=2.1.0'
- react: '>18.0.0'
- react-dom: '>18.0.0'
- vitest: '>=2.1.0'
+ '@types/react': ^18.0.0 || ^19.0.0
+ '@types/react-dom': ^18.0.0 || ^19.0.0
+ '@vitest/browser': ^2.1.0 || ^3.0.0 || ^4.0.0-0
+ react: ^18.0.0 || ^19.0.0
+ react-dom: ^18.0.0 || ^19.0.0
+ vitest: ^2.1.0 || ^3.0.0 || ^4.0.0-0
peerDependenciesMeta:
'@types/react':
optional: true
'@types/react-dom':
optional: true
- vitest@3.0.5:
- resolution: {integrity: sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==}
+ vitest@3.2.4:
+ resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
peerDependencies:
'@edge-runtime/vm': '*'
'@types/debug': ^4.1.12
'@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
- '@vitest/browser': 3.0.5
- '@vitest/ui': 3.0.5
+ '@vitest/browser': 3.2.4
+ '@vitest/ui': 3.2.4
happy-dom: '*'
jsdom: '*'
peerDependenciesMeta:
@@ -4462,26 +4029,6 @@ packages:
whatwg-url@5.0.0:
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
- which-boxed-primitive@1.1.1:
- resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
- engines: {node: '>= 0.4'}
-
- which-builtin-type@1.2.1:
- resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
- engines: {node: '>= 0.4'}
-
- which-collection@1.0.2:
- resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
- engines: {node: '>= 0.4'}
-
- which-typed-array@1.1.19:
- resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==}
- engines: {node: '>= 0.4'}
-
- which@1.3.1:
- resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
- hasBin: true
-
which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'}
@@ -4839,10 +4386,12 @@ snapshots:
'@bundled-es-modules/cookie@2.0.1':
dependencies:
cookie: 0.7.2
+ optional: true
'@bundled-es-modules/statuses@1.0.1':
dependencies:
statuses: 2.0.2
+ optional: true
'@clerc/core@0.44.0':
dependencies:
@@ -5228,7 +4777,8 @@ snapshots:
hono: 4.6.20
minimatch: 9.0.5
- '@inquirer/ansi@1.0.0': {}
+ '@inquirer/ansi@1.0.0':
+ optional: true
'@inquirer/confirm@5.1.18(@types/node@22.13.1)':
dependencies:
@@ -5236,6 +4786,7 @@ snapshots:
'@inquirer/type': 3.0.8(@types/node@22.13.1)
optionalDependencies:
'@types/node': 22.13.1
+ optional: true
'@inquirer/core@10.2.2(@types/node@22.13.1)':
dependencies:
@@ -5249,12 +4800,15 @@ snapshots:
yoctocolors-cjs: 2.1.3
optionalDependencies:
'@types/node': 22.13.1
+ optional: true
- '@inquirer/figures@1.0.13': {}
+ '@inquirer/figures@1.0.13':
+ optional: true
'@inquirer/type@3.0.8(@types/node@22.13.1)':
optionalDependencies:
'@types/node': 22.13.1
+ optional: true
'@isaacs/balanced-match@4.0.1': {}
@@ -5343,6 +4897,7 @@ snapshots:
is-node-process: 1.2.0
outvariant: 1.4.3
strict-event-emitter: 0.5.1
+ optional: true
'@noble/ciphers@1.3.0': {}
@@ -5407,14 +4962,17 @@ snapshots:
'@one-ini/wasm@0.1.1': {}
- '@open-draft/deferred-promise@2.2.0': {}
+ '@open-draft/deferred-promise@2.2.0':
+ optional: true
'@open-draft/logger@0.3.0':
dependencies:
is-node-process: 1.2.0
outvariant: 1.4.3
+ optional: true
- '@open-draft/until@2.1.0': {}
+ '@open-draft/until@2.1.0':
+ optional: true
'@pkgjs/parseargs@0.11.0':
optional: true
@@ -5938,6 +5496,10 @@ snapshots:
'@types/aria-query@5.0.4': {}
+ '@types/chai@5.2.2':
+ dependencies:
+ '@types/deep-eql': 4.0.2
+
'@types/cookie@0.6.0': {}
'@types/d3-hierarchy@1.1.11': {}
@@ -5946,6 +5508,8 @@ snapshots:
dependencies:
'@types/ms': 2.1.0
+ '@types/deep-eql@4.0.2': {}
+
'@types/estree-jsx@1.0.5':
dependencies:
'@types/estree': 1.0.8
@@ -5995,7 +5559,8 @@ snapshots:
'@types/slug@5.0.9': {}
- '@types/statuses@2.0.6': {}
+ '@types/statuses@2.0.6':
+ optional: true
'@types/text-table@0.2.5': {}
@@ -6005,31 +5570,30 @@ snapshots:
'@ungap/structured-clone@1.3.0': {}
- '@vitest/browser@3.0.5(@types/node@22.13.1)(playwright@1.50.1)(typescript@5.7.3)(vite@6.2.0(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1))(vitest@3.0.5)':
+ '@vitest/browser@3.2.4(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(playwright@1.50.1)(vite@6.2.0(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1))(vitest@3.2.4)':
dependencies:
'@testing-library/dom': 10.4.1
'@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1)
- '@vitest/mocker': 3.0.5(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(vite@6.2.0(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1))
- '@vitest/utils': 3.0.5
+ '@vitest/mocker': 3.2.4(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(vite@6.2.0(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1))
+ '@vitest/utils': 3.2.4
magic-string: 0.30.19
- msw: 2.11.3(@types/node@22.13.1)(typescript@5.7.3)
sirv: 3.0.2
tinyrainbow: 2.0.0
- vitest: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(@vitest/browser@3.0.5)(@vitest/ui@3.0.5)(happy-dom@16.8.1)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(tsx@4.19.2)(yaml@2.8.1)
+ vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.13.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@16.8.1)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(tsx@4.19.2)(yaml@2.8.1)
ws: 8.18.3
optionalDependencies:
playwright: 1.50.1
transitivePeerDependencies:
- - '@types/node'
- bufferutil
- - typescript
+ - msw
- utf-8-validate
- vite
- '@vitest/coverage-v8@3.0.5(@vitest/browser@3.0.5)(vitest@3.0.5)':
+ '@vitest/coverage-v8@3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4)':
dependencies:
'@ampproject/remapping': 2.3.0
'@bcoe/v8-coverage': 1.0.2
+ ast-v8-to-istanbul: 0.3.7
debug: 4.4.3
istanbul-lib-coverage: 3.2.2
istanbul-lib-report: 3.0.1
@@ -6040,65 +5604,63 @@ snapshots:
std-env: 3.9.0
test-exclude: 7.0.1
tinyrainbow: 2.0.0
- vitest: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(@vitest/browser@3.0.5)(@vitest/ui@3.0.5)(happy-dom@16.8.1)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(tsx@4.19.2)(yaml@2.8.1)
+ vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.13.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@16.8.1)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(tsx@4.19.2)(yaml@2.8.1)
optionalDependencies:
- '@vitest/browser': 3.0.5(@types/node@22.13.1)(playwright@1.50.1)(typescript@5.7.3)(vite@6.2.0(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1))(vitest@3.0.5)
+ '@vitest/browser': 3.2.4(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(playwright@1.50.1)(vite@6.2.0(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1))(vitest@3.2.4)
transitivePeerDependencies:
- supports-color
- '@vitest/expect@3.0.5':
+ '@vitest/expect@3.2.4':
dependencies:
- '@vitest/spy': 3.0.5
- '@vitest/utils': 3.0.5
+ '@types/chai': 5.2.2
+ '@vitest/spy': 3.2.4
+ '@vitest/utils': 3.2.4
chai: 5.3.3
tinyrainbow: 2.0.0
- '@vitest/mocker@3.0.5(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(vite@6.2.0(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1))':
+ '@vitest/mocker@3.2.4(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(vite@6.2.0(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1))':
dependencies:
- '@vitest/spy': 3.0.5
+ '@vitest/spy': 3.2.4
estree-walker: 3.0.3
magic-string: 0.30.19
optionalDependencies:
msw: 2.11.3(@types/node@22.13.1)(typescript@5.7.3)
vite: 6.2.0(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1)
- '@vitest/pretty-format@3.0.5':
- dependencies:
- tinyrainbow: 2.0.0
-
'@vitest/pretty-format@3.2.4':
dependencies:
tinyrainbow: 2.0.0
- '@vitest/runner@3.0.5':
+ '@vitest/runner@3.2.4':
dependencies:
- '@vitest/utils': 3.0.5
+ '@vitest/utils': 3.2.4
pathe: 2.0.3
+ strip-literal: 3.1.0
- '@vitest/snapshot@3.0.5':
+ '@vitest/snapshot@3.2.4':
dependencies:
- '@vitest/pretty-format': 3.0.5
+ '@vitest/pretty-format': 3.2.4
magic-string: 0.30.19
pathe: 2.0.3
- '@vitest/spy@3.0.5':
+ '@vitest/spy@3.2.4':
dependencies:
- tinyspy: 3.0.2
+ tinyspy: 4.0.4
- '@vitest/ui@3.0.5(vitest@3.0.5)':
+ '@vitest/ui@3.2.4(vitest@3.2.4)':
dependencies:
- '@vitest/utils': 3.0.5
+ '@vitest/utils': 3.2.4
fflate: 0.8.2
flatted: 3.3.3
pathe: 2.0.3
sirv: 3.0.2
tinyglobby: 0.2.15
tinyrainbow: 2.0.0
- vitest: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(@vitest/browser@3.0.5)(@vitest/ui@3.0.5)(happy-dom@16.8.1)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(tsx@4.19.2)(yaml@2.8.1)
+ vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.13.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@16.8.1)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(tsx@4.19.2)(yaml@2.8.1)
- '@vitest/utils@3.0.5':
+ '@vitest/utils@3.2.4':
dependencies:
- '@vitest/pretty-format': 3.0.5
+ '@vitest/pretty-format': 3.2.4
loupe: 3.2.1
tinyrainbow: 2.0.0
@@ -6122,10 +5684,6 @@ snapshots:
ansi-regex@6.2.2: {}
- ansi-styles@3.2.1:
- dependencies:
- color-convert: 1.9.3
-
ansi-styles@4.3.0:
dependencies:
color-convert: 2.0.1
@@ -6150,37 +5708,22 @@ snapshots:
dependencies:
dequal: 2.0.3
- array-buffer-byte-length@1.0.2:
- dependencies:
- call-bound: 1.0.4
- is-array-buffer: 3.0.5
+ assertion-error@2.0.1: {}
- arraybuffer.prototype.slice@1.0.4:
+ ast-v8-to-istanbul@0.3.7:
dependencies:
- array-buffer-byte-length: 1.0.2
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.24.0
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
- is-array-buffer: 3.0.5
-
- assertion-error@2.0.1: {}
+ '@jridgewell/trace-mapping': 0.3.31
+ estree-walker: 3.0.3
+ js-tokens: 9.0.1
astring@1.9.0: {}
- async-function@1.0.0: {}
-
async@2.6.4:
dependencies:
lodash: 4.17.21
async@3.2.3: {}
- available-typed-arrays@1.0.7:
- dependencies:
- possible-typed-array-names: 1.1.0
-
babel-dead-code-elimination@1.0.10:
dependencies:
'@babel/core': 7.28.4
@@ -6221,11 +5764,6 @@ snapshots:
boolbase@1.0.0: {}
- brace-expansion@1.1.12:
- dependencies:
- balanced-match: 1.0.2
- concat-map: 0.0.1
-
brace-expansion@2.0.2:
dependencies:
balanced-match: 1.0.2
@@ -6250,23 +5788,6 @@ snapshots:
cac@6.7.14: {}
- call-bind-apply-helpers@1.0.2:
- dependencies:
- es-errors: 1.3.0
- function-bind: 1.1.2
-
- call-bind@1.0.8:
- 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
-
- call-bound@1.0.4:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- get-intrinsic: 1.3.0
-
callsites@3.1.0: {}
camelcase@8.0.0: {}
@@ -6285,12 +5806,6 @@ snapshots:
chain-function@1.0.1: {}
- chalk@2.4.2:
- dependencies:
- ansi-styles: 3.2.1
- escape-string-regexp: 1.0.5
- supports-color: 5.5.0
-
chalk@5.4.1: {}
character-entities-html4@2.1.0: {}
@@ -6311,13 +5826,15 @@ snapshots:
clean-stack@2.2.0: {}
- cli-width@4.1.0: {}
+ cli-width@4.1.0:
+ optional: true
cliui@8.0.1:
dependencies:
string-width: 4.2.3
strip-ansi: 6.0.1
wrap-ansi: 7.0.0
+ optional: true
clone@1.0.4:
optional: true
@@ -6328,16 +5845,10 @@ snapshots:
collapse-white-space@2.1.0: {}
- color-convert@1.9.3:
- dependencies:
- color-name: 1.1.3
-
color-convert@2.0.1:
dependencies:
color-name: 1.1.4
- color-name@1.1.3: {}
-
color-name@1.1.4: {}
colors@1.0.3: {}
@@ -6350,8 +5861,6 @@ snapshots:
commander@4.1.1: {}
- concat-map@0.0.1: {}
-
concat-stream@1.6.2:
dependencies:
buffer-from: 1.1.2
@@ -6368,7 +5877,8 @@ snapshots:
convert-source-map@2.0.0: {}
- cookie@0.7.2: {}
+ cookie@0.7.2:
+ optional: true
cookie@1.0.2: {}
@@ -6388,14 +5898,6 @@ snapshots:
transitivePeerDependencies:
- encoding
- cross-spawn@6.0.6:
- dependencies:
- nice-try: 1.0.5
- path-key: 2.0.1
- semver: 5.7.2
- shebang-command: 1.2.0
- which: 1.3.1
-
cross-spawn@7.0.6:
dependencies:
path-key: 3.1.1
@@ -6464,24 +5966,6 @@ snapshots:
d3-selection: 3.0.0
d3-transition: 3.0.1(d3-selection@3.0.0)
- data-view-buffer@1.0.2:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- is-data-view: 1.0.2
-
- data-view-byte-length@1.0.2:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- is-data-view: 1.0.2
-
- data-view-byte-offset@1.0.1:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- is-data-view: 1.0.2
-
date-fns@4.1.0: {}
debug@4.4.3:
@@ -6503,18 +5987,6 @@ snapshots:
clone: 1.0.4
optional: true
- define-data-property@1.1.4:
- dependencies:
- es-define-property: 1.0.1
- es-errors: 1.3.0
- gopd: 1.2.0
-
- define-properties@1.2.1:
- dependencies:
- define-data-property: 1.1.4
- has-property-descriptors: 1.0.2
- object-keys: 1.1.1
-
defu@6.1.4: {}
dequal@2.0.3: {}
@@ -6555,12 +6027,6 @@ snapshots:
dotenv@16.6.1: {}
- dunder-proto@1.0.1:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- es-errors: 1.3.0
- gopd: 1.2.0
-
duplexify@3.7.1:
dependencies:
end-of-stream: 1.4.5
@@ -6615,86 +6081,8 @@ snapshots:
dependencies:
is-arrayish: 0.2.1
- es-abstract@1.24.0:
- dependencies:
- array-buffer-byte-length: 1.0.2
- arraybuffer.prototype.slice: 1.0.4
- available-typed-arrays: 1.0.7
- call-bind: 1.0.8
- call-bound: 1.0.4
- data-view-buffer: 1.0.2
- data-view-byte-length: 1.0.2
- data-view-byte-offset: 1.0.1
- es-define-property: 1.0.1
- es-errors: 1.3.0
- es-object-atoms: 1.1.1
- es-set-tostringtag: 2.1.0
- es-to-primitive: 1.3.0
- function.prototype.name: 1.1.8
- get-intrinsic: 1.3.0
- get-proto: 1.0.1
- get-symbol-description: 1.1.0
- globalthis: 1.0.4
- gopd: 1.2.0
- has-property-descriptors: 1.0.2
- has-proto: 1.2.0
- has-symbols: 1.1.0
- hasown: 2.0.2
- internal-slot: 1.1.0
- is-array-buffer: 3.0.5
- is-callable: 1.2.7
- is-data-view: 1.0.2
- is-negative-zero: 2.0.3
- is-regex: 1.2.1
- is-set: 2.0.3
- is-shared-array-buffer: 1.0.4
- is-string: 1.1.1
- is-typed-array: 1.1.15
- is-weakref: 1.1.1
- math-intrinsics: 1.1.0
- object-inspect: 1.13.4
- object-keys: 1.1.1
- object.assign: 4.1.7
- own-keys: 1.0.1
- regexp.prototype.flags: 1.5.4
- safe-array-concat: 1.1.3
- safe-push-apply: 1.0.0
- safe-regex-test: 1.1.0
- set-proto: 1.0.0
- stop-iteration-iterator: 1.1.0
- string.prototype.trim: 1.2.10
- string.prototype.trimend: 1.0.9
- string.prototype.trimstart: 1.0.8
- typed-array-buffer: 1.0.3
- typed-array-byte-length: 1.0.3
- typed-array-byte-offset: 1.0.4
- typed-array-length: 1.0.7
- unbox-primitive: 1.1.0
- which-typed-array: 1.1.19
-
- es-define-property@1.0.1: {}
-
- es-errors@1.3.0: {}
-
es-module-lexer@1.7.0: {}
- es-object-atoms@1.1.1:
- dependencies:
- es-errors: 1.3.0
-
- es-set-tostringtag@2.1.0:
- dependencies:
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
- has-tostringtag: 1.0.2
- hasown: 2.0.2
-
- es-to-primitive@1.3.0:
- dependencies:
- is-callable: 1.2.7
- is-date-object: 1.1.0
- is-symbol: 1.1.1
-
esast-util-from-estree@2.0.0:
dependencies:
'@types/estree-jsx': 1.0.5
@@ -6767,8 +6155,6 @@ snapshots:
escalade@3.2.0: {}
- escape-string-regexp@1.0.5: {}
-
escape-string-regexp@4.0.0: {}
escape-string-regexp@5.0.0: {}
@@ -6866,10 +6252,6 @@ snapshots:
flatted@3.3.3: {}
- for-each@0.3.5:
- dependencies:
- is-callable: 1.2.7
-
foreground-child@3.3.1:
dependencies:
cross-spawn: 7.0.6
@@ -6900,51 +6282,15 @@ snapshots:
function-bind@1.1.2: {}
- function.prototype.name@1.1.8:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- define-properties: 1.2.1
- functions-have-names: 1.2.3
- hasown: 2.0.2
- is-callable: 1.2.7
-
- functions-have-names@1.2.3: {}
-
- generator-function@2.0.1: {}
-
gensync@1.0.0-beta.2: {}
- get-caller-file@2.0.5: {}
-
- get-intrinsic@1.3.0:
- 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
+ get-caller-file@2.0.5:
+ optional: true
get-nonce@1.0.1: {}
- get-proto@1.0.1:
- dependencies:
- dunder-proto: 1.0.1
- es-object-atoms: 1.1.1
-
get-stream@6.0.1: {}
- get-symbol-description@1.1.0:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
-
get-tsconfig@4.10.1:
dependencies:
resolve-pkg-maps: 1.0.0
@@ -6973,18 +6319,12 @@ snapshots:
package-json-from-dist: 1.0.1
path-scurry: 2.0.0
- globalthis@1.0.4:
- dependencies:
- define-properties: 1.2.1
- gopd: 1.2.0
-
globrex@0.1.2: {}
- gopd@1.2.0: {}
-
graceful-fs@4.2.11: {}
- graphql@16.11.0: {}
+ graphql@16.11.0:
+ optional: true
gray-matter@4.0.3:
dependencies:
@@ -7007,26 +6347,8 @@ snapshots:
webidl-conversions: 7.0.0
whatwg-mimetype: 3.0.0
- has-bigints@1.1.0: {}
-
- has-flag@3.0.0: {}
-
has-flag@4.0.0: {}
- has-property-descriptors@1.0.2:
- dependencies:
- es-define-property: 1.0.1
-
- has-proto@1.2.0:
- dependencies:
- dunder-proto: 1.0.1
-
- has-symbols@1.1.0: {}
-
- has-tostringtag@1.0.2:
- dependencies:
- has-symbols: 1.1.0
-
hasown@2.0.2:
dependencies:
function-bind: 1.1.2
@@ -7086,7 +6408,8 @@ snapshots:
he@1.2.0: {}
- headers-polyfill@4.0.3: {}
+ headers-polyfill@4.0.3:
+ optional: true
hoist-non-react-statics@3.3.2:
dependencies:
@@ -7094,8 +6417,6 @@ snapshots:
hono@4.6.20: {}
- hosted-git-info@2.8.9: {}
-
hosted-git-info@6.1.3:
dependencies:
lru-cache: 7.18.3
@@ -7143,12 +6464,6 @@ snapshots:
inline-style-parser@0.2.4: {}
- internal-slot@1.1.0:
- dependencies:
- es-errors: 1.3.0
- hasown: 2.0.2
- side-channel: 1.1.0
-
is-alphabetical@2.0.1: {}
is-alphanumerical@2.0.1:
@@ -7156,48 +6471,12 @@ snapshots:
is-alphabetical: 2.0.1
is-decimal: 2.0.1
- is-array-buffer@3.0.5:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- get-intrinsic: 1.3.0
-
is-arrayish@0.2.1: {}
- is-async-function@2.1.1:
- dependencies:
- async-function: 1.0.0
- call-bound: 1.0.4
- get-proto: 1.0.1
- has-tostringtag: 1.0.2
- safe-regex-test: 1.1.0
-
- is-bigint@1.1.0:
- dependencies:
- has-bigints: 1.1.0
-
- is-boolean-object@1.2.2:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
- is-callable@1.2.7: {}
-
is-core-module@2.16.1:
dependencies:
hasown: 2.0.2
- is-data-view@1.0.2:
- dependencies:
- call-bound: 1.0.4
- get-intrinsic: 1.3.0
- is-typed-array: 1.1.15
-
- is-date-object@1.1.0:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
is-decimal@2.0.1: {}
is-deflate@1.0.0: {}
@@ -7206,20 +6485,8 @@ snapshots:
is-extglob@2.1.1: {}
- is-finalizationregistry@1.1.1:
- dependencies:
- call-bound: 1.0.4
-
is-fullwidth-code-point@3.0.0: {}
- is-generator-function@1.1.2:
- dependencies:
- call-bound: 1.0.4
- generator-function: 2.0.1
- get-proto: 1.0.1
- has-tostringtag: 1.0.2
- safe-regex-test: 1.1.0
-
is-glob@4.0.3:
dependencies:
is-extglob: 2.1.1
@@ -7228,16 +6495,8 @@ snapshots:
is-hexadecimal@2.0.1: {}
- is-map@2.0.3: {}
-
- is-negative-zero@2.0.3: {}
-
- is-node-process@1.2.0: {}
-
- is-number-object@1.1.1:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
+ is-node-process@1.2.0:
+ optional: true
is-number@7.0.0: {}
@@ -7245,51 +6504,10 @@ snapshots:
is-platform@1.0.0: {}
- is-regex@1.2.1:
- dependencies:
- call-bound: 1.0.4
- gopd: 1.2.0
- has-tostringtag: 1.0.2
- hasown: 2.0.2
-
- is-set@2.0.3: {}
-
- is-shared-array-buffer@1.0.4:
- dependencies:
- call-bound: 1.0.4
-
is-stream@2.0.1: {}
- is-string@1.1.1:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
- is-symbol@1.1.1:
- dependencies:
- call-bound: 1.0.4
- has-symbols: 1.1.0
- safe-regex-test: 1.1.0
-
- is-typed-array@1.1.15:
- dependencies:
- which-typed-array: 1.1.19
-
- is-weakmap@2.0.2: {}
-
- is-weakref@1.1.1:
- dependencies:
- call-bound: 1.0.4
-
- is-weakset@2.0.4:
- dependencies:
- call-bound: 1.0.4
- get-intrinsic: 1.3.0
-
isarray@1.0.0: {}
- isarray@2.0.5: {}
-
isbot@5.1.22: {}
isexe@2.0.0: {}
@@ -7343,6 +6561,8 @@ snapshots:
js-tokens@4.0.0: {}
+ js-tokens@9.0.1: {}
+
js-yaml@3.14.1:
dependencies:
argparse: 1.0.10
@@ -7354,8 +6574,6 @@ snapshots:
jsesc@3.0.2: {}
- json-parse-better-errors@1.0.2: {}
-
json-parse-even-better-errors@2.3.1: {}
json-parse-even-better-errors@3.0.2: {}
@@ -7487,13 +6705,6 @@ snapshots:
lite-emit@2.3.0: {}
- load-json-file@4.0.0:
- dependencies:
- graceful-fs: 4.2.11
- parse-json: 4.0.0
- pify: 3.0.0
- strip-bom: 3.0.0
-
lodash.castarray@4.4.0: {}
lodash.isplainobject@4.0.6: {}
@@ -7538,8 +6749,6 @@ snapshots:
markdown-extensions@2.0.0: {}
- math-intrinsics@1.1.0: {}
-
mdast-util-from-markdown@2.0.2:
dependencies:
'@types/mdast': 4.0.4
@@ -7667,8 +6876,6 @@ snapshots:
memoize-one@6.0.0: {}
- memorystream@0.3.1: {}
-
merge-stream@2.0.0: {}
merge2@1.4.1: {}
@@ -7897,10 +7104,6 @@ snapshots:
dependencies:
'@isaacs/brace-expansion': 5.0.0
- minimatch@3.1.2:
- dependencies:
- brace-expansion: 1.1.12
-
minimatch@9.0.1:
dependencies:
brace-expansion: 2.0.2
@@ -7948,15 +7151,15 @@ snapshots:
typescript: 5.7.3
transitivePeerDependencies:
- '@types/node'
+ optional: true
mute-stream@0.0.8: {}
- mute-stream@2.0.0: {}
+ mute-stream@2.0.0:
+ optional: true
nanoid@3.3.11: {}
- nice-try@1.0.5: {}
-
node-fetch@2.7.0:
dependencies:
whatwg-url: 5.0.0
@@ -7972,13 +7175,6 @@ snapshots:
dependencies:
abbrev: 2.0.0
- normalize-package-data@2.5.0:
- dependencies:
- hosted-git-info: 2.8.9
- resolve: 1.22.10
- semver: 5.7.2
- validate-npm-package-license: 3.0.4
-
normalize-package-data@5.0.0:
dependencies:
hosted-git-info: 6.1.3
@@ -8006,18 +7202,6 @@ snapshots:
npm-package-arg: 10.1.0
semver: 7.7.2
- npm-run-all@4.1.5:
- dependencies:
- ansi-styles: 3.2.1
- chalk: 2.4.2
- cross-spawn: 6.0.6
- memorystream: 0.3.1
- minimatch: 3.1.2
- pidtree: 0.3.1
- read-pkg: 3.0.0
- shell-quote: 1.8.3
- string.prototype.padend: 3.1.6
-
npm-run-path@4.0.1:
dependencies:
path-key: 3.1.1
@@ -8028,21 +7212,8 @@ snapshots:
object-assign@4.1.1: {}
- object-inspect@1.13.4: {}
-
- object-keys@1.1.1: {}
-
object-treeify@1.1.33: {}
- object.assign@4.1.7:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- define-properties: 1.2.1
- es-object-atoms: 1.1.1
- has-symbols: 1.1.0
- object-keys: 1.1.1
-
once@1.4.0:
dependencies:
wrappy: 1.0.2
@@ -8051,13 +7222,8 @@ snapshots:
dependencies:
mimic-fn: 2.1.0
- outvariant@1.4.3: {}
-
- own-keys@1.0.1:
- dependencies:
- get-intrinsic: 1.3.0
- object-keys: 1.1.1
- safe-push-apply: 1.0.0
+ outvariant@1.4.3:
+ optional: true
p-limit@6.2.0:
dependencies:
@@ -8085,11 +7251,6 @@ snapshots:
is-decimal: 2.0.1
is-hexadecimal: 2.0.1
- parse-json@4.0.0:
- dependencies:
- error-ex: 1.3.4
- json-parse-better-errors: 1.0.2
-
parse-json@5.2.0:
dependencies:
'@babel/code-frame': 7.27.1
@@ -8099,8 +7260,6 @@ snapshots:
parse-ms@4.0.0: {}
- path-key@2.0.1: {}
-
path-key@3.1.1: {}
path-parse@1.0.7: {}
@@ -8115,11 +7274,8 @@ snapshots:
lru-cache: 11.2.2
minipass: 7.1.2
- path-to-regexp@6.3.0: {}
-
- path-type@3.0.0:
- dependencies:
- pify: 3.0.0
+ path-to-regexp@6.3.0:
+ optional: true
path-type@4.0.0: {}
@@ -8141,10 +7297,6 @@ snapshots:
picomatch@4.0.3: {}
- pidtree@0.3.1: {}
-
- pify@3.0.0: {}
-
playwright-core@1.50.1: {}
playwright@1.50.1:
@@ -8155,8 +7307,6 @@ snapshots:
pluralize@8.0.0: {}
- possible-typed-array-names@1.1.0: {}
-
postcss-selector-parser@6.0.10:
dependencies:
cssesc: 3.0.0
@@ -8379,12 +7529,6 @@ snapshots:
react@19.0.0: {}
- read-pkg@3.0.0:
- dependencies:
- load-json-file: 4.0.0
- normalize-package-data: 2.5.0
- path-type: 3.0.0
-
read@1.0.7:
dependencies:
mute-stream: 0.0.8
@@ -8430,26 +7574,6 @@ snapshots:
unified: 11.0.5
vfile: 6.0.3
- reflect.getprototypeof@1.0.10:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.24.0
- es-errors: 1.3.0
- es-object-atoms: 1.1.1
- get-intrinsic: 1.3.0
- get-proto: 1.0.1
- which-builtin-type: 1.2.1
-
- regexp.prototype.flags@1.5.4:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-errors: 1.3.0
- get-proto: 1.0.1
- gopd: 1.2.0
- set-function-name: 2.0.2
-
rehype-recma@1.0.0:
dependencies:
'@types/estree': 1.0.8
@@ -8525,7 +7649,8 @@ snapshots:
react-i18next: 15.4.0(i18next@24.2.2(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react-router: 7.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
- require-directory@2.1.1: {}
+ require-directory@2.1.1:
+ optional: true
resolve-from@4.0.0: {}
@@ -8539,7 +7664,8 @@ snapshots:
retry@0.12.0: {}
- rettime@0.7.0: {}
+ rettime@0.7.0:
+ optional: true
reusify@1.1.0: {}
@@ -8577,29 +7703,10 @@ snapshots:
dependencies:
queue-microtask: 1.2.3
- safe-array-concat@1.1.3:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- get-intrinsic: 1.3.0
- has-symbols: 1.1.0
- isarray: 2.0.5
-
safe-buffer@5.1.2: {}
safe-buffer@5.2.1: {}
- safe-push-apply@1.0.0:
- dependencies:
- es-errors: 1.3.0
- isarray: 2.0.5
-
- safe-regex-test@1.1.0:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- is-regex: 1.2.1
-
scheduler@0.25.0: {}
section-matter@1.0.0:
@@ -8607,8 +7714,6 @@ snapshots:
extend-shallow: 2.0.1
kind-of: 6.0.3
- semver@5.7.2: {}
-
semver@6.3.1: {}
semver@7.7.2: {}
@@ -8619,70 +7724,12 @@ snapshots:
set-cookie-parser@2.7.1: {}
- set-function-length@1.2.2:
- dependencies:
- define-data-property: 1.1.4
- es-errors: 1.3.0
- function-bind: 1.1.2
- get-intrinsic: 1.3.0
- gopd: 1.2.0
- has-property-descriptors: 1.0.2
-
- set-function-name@2.0.2:
- dependencies:
- define-data-property: 1.1.4
- es-errors: 1.3.0
- functions-have-names: 1.2.3
- has-property-descriptors: 1.0.2
-
- set-proto@1.0.0:
- dependencies:
- dunder-proto: 1.0.1
- es-errors: 1.3.0
- es-object-atoms: 1.1.1
-
- shebang-command@1.2.0:
- dependencies:
- shebang-regex: 1.0.0
-
shebang-command@2.0.0:
dependencies:
shebang-regex: 3.0.0
- shebang-regex@1.0.0: {}
-
shebang-regex@3.0.0: {}
- shell-quote@1.8.3: {}
-
- side-channel-list@1.0.0:
- dependencies:
- es-errors: 1.3.0
- object-inspect: 1.13.4
-
- side-channel-map@1.0.1:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
- object-inspect: 1.13.4
-
- side-channel-weakmap@1.0.2:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
- object-inspect: 1.13.4
- side-channel-map: 1.0.1
-
- side-channel@1.1.0:
- dependencies:
- es-errors: 1.3.0
- object-inspect: 1.13.4
- side-channel-list: 1.0.0
- side-channel-map: 1.0.1
- side-channel-weakmap: 1.0.2
-
siginfo@2.0.0: {}
signal-exit@3.0.7: {}
@@ -8734,20 +7781,17 @@ snapshots:
stackback@0.0.2: {}
- statuses@2.0.2: {}
+ statuses@2.0.2:
+ optional: true
std-env@3.9.0: {}
- stop-iteration-iterator@1.1.0:
- dependencies:
- es-errors: 1.3.0
- internal-slot: 1.1.0
-
stream-shift@1.0.3: {}
stream-slice@0.1.2: {}
- strict-event-emitter@0.5.1: {}
+ strict-event-emitter@0.5.1:
+ optional: true
string-width@4.2.3:
dependencies:
@@ -8767,36 +7811,6 @@ snapshots:
emoji-regex: 10.5.0
strip-ansi: 7.1.2
- string.prototype.padend@3.1.6:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.24.0
- es-object-atoms: 1.1.1
-
- string.prototype.trim@1.2.10:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- define-data-property: 1.1.4
- define-properties: 1.2.1
- es-abstract: 1.24.0
- es-object-atoms: 1.1.1
- has-property-descriptors: 1.0.2
-
- string.prototype.trimend@1.0.9:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- define-properties: 1.2.1
- es-object-atoms: 1.1.1
-
- string.prototype.trimstart@1.0.8:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-object-atoms: 1.1.1
-
string_decoder@1.1.1:
dependencies:
safe-buffer: 5.1.2
@@ -8816,12 +7830,14 @@ snapshots:
strip-bom-string@1.0.0: {}
- strip-bom@3.0.0: {}
-
strip-final-newline@2.0.0: {}
strip-json-comments@5.0.1: {}
+ strip-literal@3.1.0:
+ dependencies:
+ js-tokens: 9.0.1
+
style-to-js@1.1.17:
dependencies:
style-to-object: 1.0.9
@@ -8834,10 +7850,6 @@ snapshots:
summary@2.1.0: {}
- supports-color@5.5.0:
- dependencies:
- has-flag: 3.0.0
-
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
@@ -8878,13 +7890,15 @@ snapshots:
tinyrainbow@2.0.0: {}
- tinyspy@3.0.2: {}
+ tinyspy@4.0.4: {}
- tldts-core@7.0.16: {}
+ tldts-core@7.0.16:
+ optional: true
tldts@7.0.16:
dependencies:
tldts-core: 7.0.16
+ optional: true
to-regex-range@5.0.1:
dependencies:
@@ -8897,6 +7911,7 @@ snapshots:
tough-cookie@6.0.0:
dependencies:
tldts: 7.0.16
+ optional: true
tr46@0.0.3: {}
@@ -8926,50 +7941,10 @@ snapshots:
type-flag@3.0.0: {}
- typed-array-buffer@1.0.3:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- is-typed-array: 1.1.15
-
- typed-array-byte-length@1.0.3:
- dependencies:
- call-bind: 1.0.8
- for-each: 0.3.5
- gopd: 1.2.0
- has-proto: 1.2.0
- is-typed-array: 1.1.15
-
- typed-array-byte-offset@1.0.4:
- dependencies:
- available-typed-arrays: 1.0.7
- call-bind: 1.0.8
- for-each: 0.3.5
- gopd: 1.2.0
- has-proto: 1.2.0
- is-typed-array: 1.1.15
- reflect.getprototypeof: 1.0.10
-
- typed-array-length@1.0.7:
- dependencies:
- call-bind: 1.0.8
- for-each: 0.3.5
- gopd: 1.2.0
- is-typed-array: 1.1.15
- possible-typed-array-names: 1.1.0
- reflect.getprototypeof: 1.0.10
-
typedarray@0.0.6: {}
typescript@5.7.3: {}
- unbox-primitive@1.1.0:
- dependencies:
- call-bound: 1.0.4
- has-bigints: 1.1.0
- has-symbols: 1.1.0
- which-boxed-primitive: 1.1.1
-
undici-types@6.20.0: {}
undici@6.22.0: {}
@@ -9013,7 +7988,8 @@ snapshots:
universalify@2.0.1: {}
- until-async@3.0.2: {}
+ until-async@3.0.2:
+ optional: true
update-browserslist-db@1.1.3(browserslist@4.26.3):
dependencies:
@@ -9086,7 +8062,7 @@ snapshots:
- tsx
- yaml
- vite-node@3.0.5(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1):
+ vite-node@3.2.4(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1):
dependencies:
cac: 6.7.14
debug: 4.4.3
@@ -9144,43 +8120,46 @@ snapshots:
tsx: 4.19.2
yaml: 2.8.1
- vitest-browser-react@0.0.4(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(@vitest/browser@3.0.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(vitest@3.0.5):
+ vitest-browser-react@1.0.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(@vitest/browser@3.2.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(vitest@3.2.4):
dependencies:
- '@vitest/browser': 3.0.5(@types/node@22.13.1)(playwright@1.50.1)(typescript@5.7.3)(vite@6.2.0(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1))(vitest@3.0.5)
+ '@vitest/browser': 3.2.4(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(playwright@1.50.1)(vite@6.2.0(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1))(vitest@3.2.4)
react: 19.0.0
react-dom: 19.0.0(react@19.0.0)
- vitest: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(@vitest/browser@3.0.5)(@vitest/ui@3.0.5)(happy-dom@16.8.1)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(tsx@4.19.2)(yaml@2.8.1)
+ vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.13.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@16.8.1)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(tsx@4.19.2)(yaml@2.8.1)
optionalDependencies:
'@types/react': 19.0.8
'@types/react-dom': 19.0.3(@types/react@19.0.8)
- vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(@vitest/browser@3.0.5)(@vitest/ui@3.0.5)(happy-dom@16.8.1)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(tsx@4.19.2)(yaml@2.8.1):
+ vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.13.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@16.8.1)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(tsx@4.19.2)(yaml@2.8.1):
dependencies:
- '@vitest/expect': 3.0.5
- '@vitest/mocker': 3.0.5(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(vite@6.2.0(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1))
+ '@types/chai': 5.2.2
+ '@vitest/expect': 3.2.4
+ '@vitest/mocker': 3.2.4(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(vite@6.2.0(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1))
'@vitest/pretty-format': 3.2.4
- '@vitest/runner': 3.0.5
- '@vitest/snapshot': 3.0.5
- '@vitest/spy': 3.0.5
- '@vitest/utils': 3.0.5
+ '@vitest/runner': 3.2.4
+ '@vitest/snapshot': 3.2.4
+ '@vitest/spy': 3.2.4
+ '@vitest/utils': 3.2.4
chai: 5.3.3
debug: 4.4.3
expect-type: 1.2.2
magic-string: 0.30.19
pathe: 2.0.3
+ picomatch: 4.0.3
std-env: 3.9.0
tinybench: 2.9.0
tinyexec: 0.3.2
+ tinyglobby: 0.2.15
tinypool: 1.1.1
tinyrainbow: 2.0.0
vite: 6.2.0(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1)
- vite-node: 3.0.5(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1)
+ vite-node: 3.2.4(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/debug': 4.1.12
'@types/node': 22.13.1
- '@vitest/browser': 3.0.5(@types/node@22.13.1)(playwright@1.50.1)(typescript@5.7.3)(vite@6.2.0(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1))(vitest@3.0.5)
- '@vitest/ui': 3.0.5(vitest@3.0.5)
+ '@vitest/browser': 3.2.4(msw@2.11.3(@types/node@22.13.1)(typescript@5.7.3))(playwright@1.50.1)(vite@6.2.0(@types/node@22.13.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)(yaml@2.8.1))(vitest@3.2.4)
+ '@vitest/ui': 3.2.4(vitest@3.2.4)
happy-dom: 16.8.1
transitivePeerDependencies:
- jiti
@@ -9218,51 +8197,6 @@ snapshots:
tr46: 0.0.3
webidl-conversions: 3.0.1
- which-boxed-primitive@1.1.1:
- dependencies:
- is-bigint: 1.1.0
- is-boolean-object: 1.2.2
- is-number-object: 1.1.1
- is-string: 1.1.1
- is-symbol: 1.1.1
-
- which-builtin-type@1.2.1:
- dependencies:
- call-bound: 1.0.4
- function.prototype.name: 1.1.8
- has-tostringtag: 1.0.2
- is-async-function: 2.1.1
- is-date-object: 1.1.0
- is-finalizationregistry: 1.1.1
- is-generator-function: 1.1.2
- is-regex: 1.2.1
- is-weakref: 1.1.1
- isarray: 2.0.5
- which-boxed-primitive: 1.1.1
- which-collection: 1.0.2
- which-typed-array: 1.1.19
-
- which-collection@1.0.2:
- dependencies:
- is-map: 2.0.3
- is-set: 2.0.3
- is-weakmap: 2.0.2
- is-weakset: 2.0.4
-
- which-typed-array@1.1.19:
- dependencies:
- available-typed-arrays: 1.0.7
- call-bind: 1.0.8
- call-bound: 1.0.4
- for-each: 0.3.5
- get-proto: 1.0.1
- gopd: 1.2.0
- has-tostringtag: 1.0.2
-
- which@1.3.1:
- dependencies:
- isexe: 2.0.0
-
which@2.0.2:
dependencies:
isexe: 2.0.0
@@ -9294,6 +8228,7 @@ snapshots:
ansi-styles: 4.3.0
string-width: 4.2.3
strip-ansi: 6.0.1
+ optional: true
wrap-ansi@7.0.0:
dependencies:
@@ -9313,7 +8248,8 @@ snapshots:
xtend@4.0.2: {}
- y18n@5.0.8: {}
+ y18n@5.0.8:
+ optional: true
yallist@3.1.1: {}
@@ -9321,7 +8257,8 @@ snapshots:
yaml@2.8.1: {}
- yargs-parser@21.1.1: {}
+ yargs-parser@21.1.1:
+ optional: true
yargs@17.7.2:
dependencies:
@@ -9332,10 +8269,12 @@ snapshots:
string-width: 4.2.3
y18n: 5.0.8
yargs-parser: 21.1.1
+ optional: true
yocto-queue@1.2.1: {}
- yoctocolors-cjs@2.1.3: {}
+ yoctocolors-cjs@2.1.3:
+ optional: true
yoctocolors@1.0.0: {}
diff --git a/scripts/generate-docs.ts b/scripts/generate-docs.ts
index 2cf0e63..bf9090f 100644
--- a/scripts/generate-docs.ts
+++ b/scripts/generate-docs.ts
@@ -5,7 +5,10 @@ import { join, resolve } from "node:path"
import { parseArgs } from "node:util"
import chalk from "chalk"
import semver from "semver"
-import { getServerEnv } from "~/env.server"
+
+const contentDir = "content"
+const workspaceRoot = process.cwd()
+const outputDir = resolve(workspaceRoot, "generated-docs")
type RunOpts = { cwd?: string; inherit?: boolean }
function run(cmd: string, opts: RunOpts = {}) {
@@ -31,11 +34,15 @@ const resetDir = (p: string) => {
ensureDir(p)
}
-const contentDir = "content"
-const outputDir = "generated-docs"
-const APP_ENV = getServerEnv().APP_ENV as "development" | "production"
-const currentDocsWorkspace = process.cwd()
-const docsRelative = run("git rev-parse --show-prefix", { cwd: currentDocsWorkspace }).replace(/\/?$/, "")
+let repoRoot = workspaceRoot
+let workspaceRelativePath = ""
+try {
+ repoRoot = run("git rev-parse --show-toplevel")
+ // biome-ignore lint/style/useTemplate:
+ workspaceRelativePath = repoRoot === workspaceRoot ? "" : workspaceRoot.replace(repoRoot + "/", "")
+} catch {
+ workspaceRelativePath = ""
+}
const allTags = () => run("git tag --list").split("\n").filter(Boolean)
@@ -51,25 +58,60 @@ function resolveTagsFromSpec(spec: string) {
return matched.sort(semver.rcompare)
}
+function hasLocalRef(ref: string) {
+ try {
+ run(`git show-ref --verify --quiet ${ref}`)
+ return true
+ } catch {
+ return false
+ }
+}
+
function buildDocs(sourceDir: string, outDir: string) {
- if (!existsSync(sourceDir)) throw new Error(`Docs workspace not found: ${sourceDir}`)
+ if (!existsSync(sourceDir)) {
+ throw new Error(
+ `โ Documentation workspace not found at: ${sourceDir}
+ Cannot build documentation without a valid workspace directory.`
+ )
+ }
+ // biome-ignore lint/suspicious/noConsole: TODO remove this
+ console.log(chalk.cyan(`Building docs from: ${sourceDir} โ ${outDir}`))
const docsContentDir = resolve(sourceDir, contentDir)
if (!existsSync(docsContentDir)) {
- throw new Error(`Docs content directory "${contentDir}" not found at ${docsContentDir}`)
+ throw new Error(
+ `โ Content directory "${contentDir}" not found at: ${docsContentDir}
+ Cannot build documentation without content files.
+ Please ensure you have a "${contentDir}/" directory with your documentation content.`
+ )
}
- resetDir(outDir)
+ const packageJsonPath = resolve(sourceDir, "package.json")
+ if (!existsSync(packageJsonPath)) {
+ throw new Error(
+ `โ package.json not found at: ${packageJsonPath}
+ Cannot build documentation without package.json.
+ Please ensure your workspace has a valid package.json file.`
+ )
+ }
+ resetDir(outDir)
run("pnpm run content-collections:build", { cwd: sourceDir, inherit: true })
const ccSrc = resolve(sourceDir, ".content-collections")
const ccDest = join(outDir, ".content-collections")
- if (!existsSync(ccSrc)) throw new Error(`Build output missing at ${ccSrc}`)
+ if (!existsSync(ccSrc)) {
+ throw new Error(
+ `โ Build output missing at: ${ccSrc}
+ Content collections build failed or did not produce output.
+ Please check the build logs above for errors.`
+ )
+ }
resetDir(ccDest)
cpSync(ccSrc, ccDest, { recursive: true })
- // biome-ignore lint/suspicious/noConsole: keep console log for debugging
+
+ // biome-ignore lint/suspicious/noConsole: keep for debugging
console.log(chalk.green(`โ Built docs โ ${ccDest}`))
}
@@ -79,98 +121,130 @@ function buildRef(ref: string, labelForOutDir: string) {
const worktreePath = resolve(tmpBase, safeLabel)
run(`git worktree add --detach "${worktreePath}" "${ref}"`, {
- cwd: currentDocsWorkspace,
+ cwd: workspaceRoot,
inherit: true,
})
try {
- const docsWorkspace = docsRelative ? resolve(worktreePath, docsRelative) : worktreePath
-
- if (existsSync(resolve(docsWorkspace, "package.json"))) {
- run("pnpm install --frozen-lockfile", { cwd: docsWorkspace, inherit: true })
- }
-
- if (existsSync(resolve(worktreePath, "package.json"))) {
- run("pnpm install --frozen-lockfile", { cwd: worktreePath, inherit: true })
+ const rootPkg = existsSync(resolve(worktreePath, "package.json"))
+ const rootLock = existsSync(resolve(worktreePath, "pnpm-lock.yaml"))
+ if (rootPkg) {
+ run(`pnpm install ${rootLock ? "--frozen-lockfile" : "--no-frozen-lockfile"}`, {
+ cwd: worktreePath,
+ inherit: true,
+ })
}
+ const sourceDir = workspaceRelativePath ? resolve(worktreePath, workspaceRelativePath) : worktreePath
const outDir = resolve(outputDir, labelForOutDir)
- buildDocs(docsWorkspace, outDir)
+ buildDocs(sourceDir, outDir)
} finally {
run(`git worktree remove "${worktreePath}" --force`, {
- cwd: currentDocsWorkspace,
+ cwd: workspaceRoot,
inherit: true,
})
rmSync(tmpBase, { recursive: true, force: true })
}
}
+function buildBranch(branch: string, labelForOutDir: string) {
+ run(`git fetch --tags --prune origin ${branch}`, {
+ cwd: workspaceRoot,
+ inherit: true,
+ })
+ const localRef = `refs/heads/${branch}`
+ const targetRef = hasLocalRef(localRef) ? localRef : `origin/${branch}`
+ return buildRef(targetRef, labelForOutDir)
+}
+
function buildTag(tag: string) {
return buildRef(`refs/tags/${tag}`, tag)
}
-function buildSpecifiedTags(spec: string, envLabel: "dev" | "prod"): string[] {
- const tags = resolveTagsFromSpec(spec)
- if (!tags.length) {
- throw new Error(
- `No tags matched spec "${spec}". Nothing to build in ${envLabel === "dev" ? "development" : "production"}.`
- )
+function getCurrentBranch(): string {
+ try {
+ return run("git rev-parse --abbrev-ref HEAD")
+ } catch {
+ throw new Error("Failed to get current branch")
}
- // biome-ignore lint/suspicious/noConsole: keep console log for debugging
- console.log(chalk.cyan(`(${envLabel}) Building docs for tags: ${tags.join(", ")}`))
- for (const tag of tags) buildTag(tag)
- return tags
}
-;(async () => {
+
+function isOnDefaultBranch(defaultBranch: string): boolean {
+ const currentBranch = getCurrentBranch()
+ return currentBranch === defaultBranch
+}
+
+function parseCliArgs() {
const { values } = parseArgs({
args: process.argv.slice(2),
options: {
- versions: { type: "string" }, // optional
- branch: { type: "string" }, // required
+ versions: { type: "string" },
+ branch: { type: "string" },
},
})
- const branch = (values.branch as string | undefined)?.trim()
- if (!branch) {
+ const defaultBranch = (values.branch as string | undefined)?.trim()
+ if (!defaultBranch) {
throw new Error(
- "Missing required argument: --branch \n" +
- 'Example: tsx scripts/generate-docs.ts --branch main --versions "v3.3.3, v3.4.4"'
+ "โ Missing required --branch flag.\n" +
+ " Please specify the default branch name (e.g., --branch main)\n" +
+ " Example: pnpm run generate:docs --branch main"
)
}
- const hasVersions = typeof values.versions === "string" && values.versions.trim().length > 0
- let builtVersions: string[] = []
-
- if (!hasVersions && APP_ENV === "development") {
- // DEV + no --versions => build current workspace โ generated-docs/current
- // biome-ignore lint/suspicious/noConsole: keep console log for debugging
- console.log(chalk.cyan(`(dev) Building docs from current workspace: ${currentDocsWorkspace} โ current`))
- buildDocs(currentDocsWorkspace, join(outputDir, "current"))
- builtVersions = ["current"]
- } else if (!hasVersions && APP_ENV === "production") {
- // PROD + no --versions => build content from default branch only
- // biome-ignore lint/suspicious/noConsole: keep console log for debugging
- console.log(chalk.cyan(`(prod) Building docs from '${branch}' branch only โ ${branch}`))
- buildRef(`refs/heads/${branch}`, branch)
- builtVersions = [branch]
+ const versionsSpec = (values.versions as string | undefined)?.trim() || undefined
+
+ return { defaultBranch, versionsSpec }
+}
+
+function buildLatestVersion(onDefaultBranch: boolean, defaultBranch: string) {
+ if (onDefaultBranch) {
+ buildBranch(defaultBranch, "latest")
} else {
- builtVersions = buildSpecifiedTags(values.versions as string, APP_ENV === "development" ? "dev" : "prod")
+ buildDocs(workspaceRoot, join(outputDir, "latest"))
}
+}
+function writeVersionsFile(versions: string[]) {
const versionsFile = resolve("app/utils/versions.ts")
- writeFileSync(
- versionsFile,
- `// Auto-generated file. Do not edit manually.
-export const versions = ${JSON.stringify(builtVersions, null, 2)} as const
-`
- )
+ const content = `// Auto-generated file. Do not edit manually.\nexport const versions = ${JSON.stringify(versions, null, 2)} as const\n`
- // biome-ignore lint/suspicious/noConsole: keep console log for debugging
- console.log(chalk.green(`โ Wrote versions.ts โ ${versionsFile}`))
- // biome-ignore lint/suspicious/noConsole: keep console log for debugging
+ writeFileSync(versionsFile, content)
+}
+
+async function main() {
+ const { defaultBranch, versionsSpec } = parseCliArgs()
+
+ const onDefaultBranch = isOnDefaultBranch(defaultBranch)
+
+ let builtVersions: string[]
+
+ if (versionsSpec) {
+ const tags = resolveTagsFromSpec(versionsSpec)
+ if (tags.length === 0) {
+ throw new Error(`No tags matched spec "${versionsSpec}".`)
+ }
+
+ // biome-ignore lint/suspicious/noConsole: keep for debugging
+ console.log(chalk.cyan(`Building tags: ${tags.join(", ")}`))
+ for (const tag of tags) {
+ buildTag(tag)
+ }
+
+ buildLatestVersion(onDefaultBranch, defaultBranch)
+ builtVersions = ["latest", ...tags]
+ } else {
+ buildLatestVersion(onDefaultBranch, defaultBranch)
+ builtVersions = ["latest"]
+ }
+
+ writeVersionsFile(builtVersions)
+ // biome-ignore lint/suspicious/noConsole: keep for debugging
console.log(chalk.green("โ
Done"))
-})().catch((e) => {
- // biome-ignore lint/suspicious/noConsole: keep console error for debugging
- console.error(chalk.red("โ Build failed:"), e)
+}
+
+main().catch((error) => {
+ // biome-ignore lint/suspicious/noConsole: keep for debugging
+ console.error(chalk.red("โ Build failed:"), error)
process.exit(1)
})
diff --git a/scripts/verify-docs.ts b/scripts/verify-docs.ts
deleted file mode 100644
index 190be13..0000000
--- a/scripts/verify-docs.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { existsSync } from "node:fs"
-import { resolve } from "node:path"
-import chalk from "chalk"
-
-const base = resolve("generated-docs")
-
-if (!existsSync(base)) {
- // biome-ignore lint/suspicious/noConsole: keep console error for debugging
- console.error(
- chalk.red(
- "โ No generated-docs found. Please run `pnpm run generate:docs` at least once before starting the app.\n"
- )
- )
- process.exit(1)
-}
-// biome-ignore lint/suspicious/noConsole: keep console log for debugging
-console.log(chalk.green("โ
generated-docs folder found."))
diff --git a/tsconfig.json b/tsconfig.json
index ebe0fea..3eccfdd 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -17,7 +17,8 @@
"baseUrl": ".",
"paths": {
"~/*": ["./app/*"],
- "content-collections": ["./content-collections.ts"]
+ "content-collections": [".content-collections/generated"],
+ "content-collections-types": ["./content-collections.ts"]
},
"rootDirs": [".", "./.react-router/types"],
"plugins": [{ "name": "@react-router/dev" }],
diff --git a/vite.config.ts b/vite.config.ts
index 017f819..7c712d4 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -8,7 +8,7 @@ import babel from "vite-plugin-babel"
import { iconsSpritesheet } from "vite-plugin-icons-spritesheet"
import tsconfigPaths from "vite-tsconfig-paths"
-export default defineConfig({
+export default defineConfig(({ mode }) => ({
plugins: [
tailwindcss(),
// Run the react-compiler on .tsx files only when bundling
@@ -37,11 +37,13 @@ export default defineConfig({
withTypes: true,
formatter: "biome",
}),
- contentCollections(),
+ // Only load content-collections plugin in development
+ // In production, we load pre-generated docs from generated-docs/
+ ...(mode === "development" ? [contentCollections()] : []),
],
server: {
open: true,
// biome-ignore lint/nursery/noProcessEnv: Its ok to use process.env here
port: Number(process.env.PORT || 4280),
},
-})
+}))