From 22fa0245e46c62399dbfcb7c810e3466f27459e7 Mon Sep 17 00:00:00 2001 From: enixCode <58286681+enixCode@users.noreply.github.com> Date: Sat, 30 May 2026 00:38:56 +0200 Subject: [PATCH 01/10] feat(docs): scaffold Fumadocs static-export site (WIP) Foundation for migrating docs from VitePress to a Mintlify-style Fumadocs site (the look identified across the ecosystem). - Scaffolded under website/ (Next.js 16 + fumadocs-mdx + Tailwind), static template (output: export), Orama static search. - Configured for GitHub Pages: basePath /light-runner, trailingSlash, images.unoptimized, so the export serves under the project sub-path. - Removed the AI-chat integration the scaffolder forces (openrouter route, component, layout wiring, deps): a server route is incompatible with static export and unwanted. - next build produces a clean static export (12/12 pages). Remaining (not in this commit): port the landing + 5 guides to MDX, wire the typedoc API reference, theme to the light-process palette, add the Pages deploy workflow, and remove the old VitePress docs. build with cc --- website/.gitignore | 26 + website/README.md | 47 + website/content/docs/index.mdx | 13 + website/content/docs/test.mdx | 17 + website/eslint.config.mjs | 15 + website/next.config.mjs | 16 + website/package-lock.json | 11909 ++++++++++++++++ website/package.json | 46 + website/postcss.config.mjs | 7 + website/source.config.ts | 23 + website/src/app/(home)/layout.tsx | 6 + website/src/app/(home)/page.tsx | 16 + website/src/app/api/search/route.ts | 9 + website/src/app/docs/[[...slug]]/page.tsx | 63 + website/src/app/docs/layout.tsx | 11 + website/src/app/global.css | 12 + website/src/app/layout.tsx | 17 + website/src/app/llms-full.txt/route.ts | 10 + .../app/llms.mdx/docs/[[...slug]]/route.ts | 23 + website/src/app/llms.txt/route.ts | 8 + website/src/app/og/docs/[...slug]/route.tsx | 28 + website/src/components/markdown.tsx | 116 + website/src/components/mdx.tsx | 15 + website/src/components/provider.tsx | 8 + website/src/components/search.tsx | 46 + website/src/components/ui/button.tsx | 29 + website/src/lib/cn.ts | 1 + website/src/lib/layout.shared.tsx | 12 + website/src/lib/shared.ts | 11 + website/src/lib/source.ts | 36 + website/tsconfig.json | 45 + 31 files changed, 12641 insertions(+) create mode 100644 website/.gitignore create mode 100644 website/README.md create mode 100644 website/content/docs/index.mdx create mode 100644 website/content/docs/test.mdx create mode 100644 website/eslint.config.mjs create mode 100644 website/next.config.mjs create mode 100644 website/package-lock.json create mode 100644 website/package.json create mode 100644 website/postcss.config.mjs create mode 100644 website/source.config.ts create mode 100644 website/src/app/(home)/layout.tsx create mode 100644 website/src/app/(home)/page.tsx create mode 100644 website/src/app/api/search/route.ts create mode 100644 website/src/app/docs/[[...slug]]/page.tsx create mode 100644 website/src/app/docs/layout.tsx create mode 100644 website/src/app/global.css create mode 100644 website/src/app/layout.tsx create mode 100644 website/src/app/llms-full.txt/route.ts create mode 100644 website/src/app/llms.mdx/docs/[[...slug]]/route.ts create mode 100644 website/src/app/llms.txt/route.ts create mode 100644 website/src/app/og/docs/[...slug]/route.tsx create mode 100644 website/src/components/markdown.tsx create mode 100644 website/src/components/mdx.tsx create mode 100644 website/src/components/provider.tsx create mode 100644 website/src/components/search.tsx create mode 100644 website/src/components/ui/button.tsx create mode 100644 website/src/lib/cn.ts create mode 100644 website/src/lib/layout.shared.tsx create mode 100644 website/src/lib/shared.ts create mode 100644 website/src/lib/source.ts create mode 100644 website/tsconfig.json diff --git a/website/.gitignore b/website/.gitignore new file mode 100644 index 0000000..9e429e4 --- /dev/null +++ b/website/.gitignore @@ -0,0 +1,26 @@ +# deps +/node_modules + +# generated content +.source + +# test & build +/coverage +/.next/ +/out/ +/build +*.tsbuildinfo + +# misc +.DS_Store +*.pem +/.pnp +.pnp.js +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# others +.env*.local +.vercel +next-env.d.ts \ No newline at end of file diff --git a/website/README.md b/website/README.md new file mode 100644 index 0000000..d88119e --- /dev/null +++ b/website/README.md @@ -0,0 +1,47 @@ +# website + +This is a Next.js application generated with +[Create Fumadocs](https://github.com/fuma-nama/fumadocs). + +It is a Next.js app with [Static Export](https://nextjs.org/docs/app/guides/static-exports) configured. + +Run development server: + +```bash +npm run dev +# or +pnpm dev +# or +yarn dev +``` + +Open http://localhost:3000 with your browser to see the result. + +## Explore + +In the project, you can see: + +- `lib/source.ts`: Code for content source adapter, [`loader()`](https://fumadocs.dev/docs/headless/source-api) provides the interface to access your content. +- `lib/layout.shared.tsx`: Shared options for layouts, optional but preferred to keep. + +| Route | Description | +| ------------------------- | ------------------------------------------------------ | +| `app/(home)` | The route group for your landing page and other pages. | +| `app/docs` | The documentation layout and pages. | +| `app/api/search/route.ts` | The Route Handler for search. | + +### Fumadocs MDX + +A `source.config.ts` config file has been included, you can customise different options like frontmatter schema. + +Read the [Introduction](https://fumadocs.dev/docs/mdx) for further details. + +## Learn More + +To learn more about Next.js and Fumadocs, take a look at the following +resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js + features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. +- [Fumadocs](https://fumadocs.dev) - learn about Fumadocs diff --git a/website/content/docs/index.mdx b/website/content/docs/index.mdx new file mode 100644 index 0000000..1ede18e --- /dev/null +++ b/website/content/docs/index.mdx @@ -0,0 +1,13 @@ +--- +title: Hello World +description: Your first document +--- + +Welcome to the docs! You can start writing documents in `/content/docs`. + +## What is Next? + + + + + diff --git a/website/content/docs/test.mdx b/website/content/docs/test.mdx new file mode 100644 index 0000000..f475f4a --- /dev/null +++ b/website/content/docs/test.mdx @@ -0,0 +1,17 @@ +--- +title: Components +description: Components +--- + +## Code Block + +```js +console.log('Hello World'); +``` + +## Cards + + + + + diff --git a/website/eslint.config.mjs b/website/eslint.config.mjs new file mode 100644 index 0000000..c1477b5 --- /dev/null +++ b/website/eslint.config.mjs @@ -0,0 +1,15 @@ +import { defineConfig, globalIgnores } from 'eslint/config'; +import nextVitals from 'eslint-config-next/core-web-vitals'; + +const eslintConfig = defineConfig([ + ...nextVitals, + globalIgnores([ + '.next/**', + 'out/**', + 'build/**', + 'next-env.d.ts', + '.source/**', + ]), +]); + +export default eslintConfig; \ No newline at end of file diff --git a/website/next.config.mjs b/website/next.config.mjs new file mode 100644 index 0000000..13b7a6b --- /dev/null +++ b/website/next.config.mjs @@ -0,0 +1,16 @@ +import { createMDX } from 'fumadocs-mdx/next'; + +const withMDX = createMDX(); + +/** @type {import('next').NextConfig} */ +const config = { + output: 'export', + // Project site served under https://enixcode.github.io/light-runner/. + basePath: '/light-runner', + trailingSlash: true, + // Static export cannot use the Next image optimizer. + images: { unoptimized: true }, + reactStrictMode: true, +}; + +export default withMDX(config); diff --git a/website/package-lock.json b/website/package-lock.json new file mode 100644 index 0000000..3a1a357 --- /dev/null +++ b/website/package-lock.json @@ -0,0 +1,11909 @@ +{ + "name": "website", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "website", + "version": "0.0.0", + "hasInstallScript": true, + "dependencies": { + "@ai-sdk/react": "^3.0.193", + "@openrouter/ai-sdk-provider": "^2.9.0", + "@orama/orama": "^3.1.18", + "@radix-ui/react-presence": "^1.1.5", + "ai": "^6.0.191", + "class-variance-authority": "^0.7.1", + "flexsearch": "^0.8.212", + "fumadocs-core": "16.9.3", + "fumadocs-mdx": "15.0.10", + "fumadocs-ui": "16.9.3", + "hast-util-to-jsx-runtime": "^2.3.6", + "lucide-react": "^1.17.0", + "next": "16.2.6", + "react": "^19.2.6", + "react-dom": "^19.2.6", + "remark": "^15.0.1", + "remark-gfm": "^4.0.1", + "remark-rehype": "^11.1.2", + "tailwind-merge": "^3.6.0", + "unist-util-visit": "^5.1.0", + "zod": "^4.4.3" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4.3.0", + "@types/hast": "^3.0.4", + "@types/mdx": "^2.0.13", + "@types/node": "^25.9.1", + "@types/react": "^19.2.15", + "@types/react-dom": "^19.2.3", + "eslint": "^9.39.4", + "eslint-config-next": "16.2.6", + "postcss": "^8.5.15", + "serve": "^14.2.6", + "tailwindcss": "^4.3.0", + "typescript": "^6.0.3" + } + }, + "node_modules/@ai-sdk/gateway": { + "version": "3.0.121", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.121.tgz", + "integrity": "sha512-uY248djJRxa5W68MHiyqO8WLdOeKQoRClGg7PVX/VPhVW8SJNM7/l5DcrA5WAM3YfQrLyNkgZa2VOu8T0t8LUw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.10", + "@ai-sdk/provider-utils": "4.0.27", + "@vercel/oidc": "3.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.10.tgz", + "integrity": "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "4.0.27", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz", + "integrity": "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.10", + "@standard-schema/spec": "^1.1.0", + "eventsource-parser": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/react": { + "version": "3.0.195", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-3.0.195.tgz", + "integrity": "sha512-+yIH84d4bBNzLKfaDDf4EocEH0XQKKNwNShxbrz5xAiJMNIPnWVWT9cyrSerYaGH3iNVS/g2io42PE4HNbc4RA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider-utils": "4.0.27", + "ai": "6.0.193", + "swr": "^2.2.5", + "throttleit": "2.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18 || ~19.0.1 || ~19.1.2 || ^19.2.1" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", + "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", + "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", + "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", + "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", + "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", + "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", + "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", + "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", + "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", + "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", + "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", + "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", + "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", + "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", + "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", + "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", + "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", + "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", + "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", + "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", + "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", + "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", + "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", + "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", + "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", + "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", + "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.6" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, + "node_modules/@fumadocs/tailwind": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@fumadocs/tailwind/-/tailwind-0.0.5.tgz", + "integrity": "sha512-ENKPWUDRmriccsrUDE4bDBq3FNr/ms3BP2rWlsAEMV1yP23pcCaan+ceGfeBUsAQjw7sj9Q3R4Kl3g/TCStPzQ==", + "license": "MIT", + "peerDependencies": { + "@tailwindcss/oxide": "^4.0.0", + "tailwindcss": "^4.0.0" + }, + "peerDependenciesMeta": { + "@tailwindcss/oxide": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@next/env": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.6.tgz", + "integrity": "sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.6.tgz", + "integrity": "sha512-Z8l6o4JWKUl755x4R+wogD86KPeU+Ckw4K+SYG4kHeOJtRenDeK+OSbGcqZpDtbwn9DsJVdir2UxmwXuinUbUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.6.tgz", + "integrity": "sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.6.tgz", + "integrity": "sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.6.tgz", + "integrity": "sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.6.tgz", + "integrity": "sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.6.tgz", + "integrity": "sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.6.tgz", + "integrity": "sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.6.tgz", + "integrity": "sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.6.tgz", + "integrity": "sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@openrouter/ai-sdk-provider": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@openrouter/ai-sdk-provider/-/ai-sdk-provider-2.9.0.tgz", + "integrity": "sha512-Seva+NCa0WUQnJIUE5GzHsUv1WTIeyqwz0ELl2VtS6NP+eF+77yCXGFVOMbvoCM7QMjlnhv7931e89R+8pJdcQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "ai": "^6.0.0", + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", + "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@orama/orama": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/@orama/orama/-/orama-3.1.18.tgz", + "integrity": "sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA==", + "license": "Apache-2.0", + "engines": { + "node": ">= 20.0.0" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", + "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", + "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", + "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", + "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", + "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", + "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@shikijs/core": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.1.0.tgz", + "integrity": "sha512-jLJtSJeuFffqX6/inRE1zqU5aFv2hrszvYgq3OjbAgFRZiWv7abKMDdQzYxuSDfmUPQozZvI/kuy6VMTvnvqTQ==", + "license": "MIT", + "dependencies": { + "@shikijs/primitive": "4.1.0", + "@shikijs/types": "4.1.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.1.0.tgz", + "integrity": "sha512-YquhawCUgaBfhsS72e2Y/dI59gCBNPHu3fEO/tvLaXrTssxZrY5ddjtNLTwndrMgPo8b3IscE+xoICDzpTmlFQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.1.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.6" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.1.0.tgz", + "integrity": "sha512-axLpjVs45YBvvINa+dJF+NPW+KtFkNXsFr4SDw2BMj9GdeMnGxVB9PQb2xXlJYovslt/nz6giedAyOANkfc7hg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.1.0", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/langs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.1.0.tgz", + "integrity": "sha512-nwOMruEkbgdZfQ/b8CgpNBVOpvG1k0N5tbmgiFeqsan401+x3ILqlzZJowSla4Agmq4hG2Uf2wh5jLTEhR8VSg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/primitive": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.1.0.tgz", + "integrity": "sha512-zx2/2Uwj2q9X3KSyYREEhXO23xBw5WUhP4orK2lE4r+t9JGITmEe0JH+wPmJhqHpOT2bRRs6lAL945+LDvOAGw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.1.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/themes": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.1.0.tgz", + "integrity": "sha512-emCcTnUM7yO2wltYbaxm+yLvcCI4+h8XBKc4KmJ7EZUXoSGjcCHifkI//R4OFit9ewpg7H2/9tjOuXrT2v/Knw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.1.0.tgz", + "integrity": "sha512-3EQWX54fMpniOrDblzAhiwiJwpiTMW6+B9DWyUd9ska483tbayFYuw47UxwuPknI31bKnySfVQ/QW+jFL4rFdA==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.0.tgz", + "integrity": "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.21.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.0" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.0.tgz", + "integrity": "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==", + "devOptional": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.0", + "@tailwindcss/oxide-darwin-arm64": "4.3.0", + "@tailwindcss/oxide-darwin-x64": "4.3.0", + "@tailwindcss/oxide-freebsd-x64": "4.3.0", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.0", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.0", + "@tailwindcss/oxide-linux-x64-musl": "4.3.0", + "@tailwindcss/oxide-wasm32-wasi": "4.3.0", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.0" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.0.tgz", + "integrity": "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.0.tgz", + "integrity": "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.0.tgz", + "integrity": "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.0.tgz", + "integrity": "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.0.tgz", + "integrity": "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.0.tgz", + "integrity": "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.0.tgz", + "integrity": "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.0.tgz", + "integrity": "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.0.tgz", + "integrity": "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.0.tgz", + "integrity": "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.10.0", + "@emnapi/runtime": "^1.10.0", + "@emnapi/wasi-threads": "^1.2.1", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.0.tgz", + "integrity": "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.0.tgz", + "integrity": "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.0.tgz", + "integrity": "sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.3.0", + "@tailwindcss/oxide": "4.3.0", + "postcss": "^8.5.10", + "tailwindcss": "4.3.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/react": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.15.tgz", + "integrity": "sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "devOptional": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.0.tgz", + "integrity": "sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/type-utils": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.60.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.0.tgz", + "integrity": "sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.0.tgz", + "integrity": "sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.60.0", + "@typescript-eslint/types": "^8.60.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz", + "integrity": "sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz", + "integrity": "sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.0.tgz", + "integrity": "sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.0.tgz", + "integrity": "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz", + "integrity": "sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.60.0", + "@typescript-eslint/tsconfig-utils": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.0.tgz", + "integrity": "sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz", + "integrity": "sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", + "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", + "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", + "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", + "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", + "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", + "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", + "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", + "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", + "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", + "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", + "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", + "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", + "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", + "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", + "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", + "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", + "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-openharmony-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", + "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", + "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", + "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", + "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", + "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vercel/oidc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.2.0.tgz", + "integrity": "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==", + "license": "Apache-2.0", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@zeit/schemas": { + "version": "2.36.0", + "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.36.0.tgz", + "integrity": "sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ai": { + "version": "6.0.193", + "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.193.tgz", + "integrity": "sha512-VQOTOse8+X8kMtg61DNSXlYJzwOW4NjMLDJNk/qxClWsFe4oiyFJDHGGG1oezfGcFzuYuQe/8Z7r4kwiZWh2YQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@ai-sdk/gateway": "3.0.121", + "@ai-sdk/provider": "3.0.10", + "@ai-sdk/provider-utils": "4.0.27", + "@opentelemetry/api": "^1.9.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.4.tgz", + "integrity": "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.32", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.32.tgz", + "integrity": "sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/boxen": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", + "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.0", + "chalk": "^5.0.1", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/clipboardy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", + "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "arch": "^2.2.0", + "execa": "^5.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", + "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.364", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.364.tgz", + "integrity": "sha512-G/dYE3+AYhyHwzTwg8UbnXf7zqMERYh7l2jJ3QujhFsH8agSYwtnGAR2aZ7f0AakIKJXd5En/Hre4igIUrdlYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.22.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.22.1.tgz", + "integrity": "sha512-6QEuw3zoX1SJQc7b87aBXke/no+mG2bTBgw29gWMQonLmpEkWoCAVkl+M49e48AZlWzxiDzDZzYdp6kobcyLww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz", + "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.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", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esbuild": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", + "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.0", + "@esbuild/android-arm": "0.28.0", + "@esbuild/android-arm64": "0.28.0", + "@esbuild/android-x64": "0.28.0", + "@esbuild/darwin-arm64": "0.28.0", + "@esbuild/darwin-x64": "0.28.0", + "@esbuild/freebsd-arm64": "0.28.0", + "@esbuild/freebsd-x64": "0.28.0", + "@esbuild/linux-arm": "0.28.0", + "@esbuild/linux-arm64": "0.28.0", + "@esbuild/linux-ia32": "0.28.0", + "@esbuild/linux-loong64": "0.28.0", + "@esbuild/linux-mips64el": "0.28.0", + "@esbuild/linux-ppc64": "0.28.0", + "@esbuild/linux-riscv64": "0.28.0", + "@esbuild/linux-s390x": "0.28.0", + "@esbuild/linux-x64": "0.28.0", + "@esbuild/netbsd-arm64": "0.28.0", + "@esbuild/netbsd-x64": "0.28.0", + "@esbuild/openbsd-arm64": "0.28.0", + "@esbuild/openbsd-x64": "0.28.0", + "@esbuild/openharmony-arm64": "0.28.0", + "@esbuild/sunos-x64": "0.28.0", + "@esbuild/win32-arm64": "0.28.0", + "@esbuild/win32-ia32": "0.28.0", + "@esbuild/win32-x64": "0.28.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-next": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.2.6.tgz", + "integrity": "sha512-z2ELYSkyrrJ6cuunTU8vhsT/RpouPkjaSah06nVW6Rg2Hpg0Vs8s497/e5s8G8qtdp4ccsiovz5P1rv+5VSW2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "16.2.6", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^7.0.0", + "globals": "16.4.0", + "typescript-eslint": "^8.46.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.13.0.tgz", + "integrity": "sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", + "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz", + "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/flexsearch": { + "version": "0.8.212", + "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.8.212.tgz", + "integrity": "sha512-wSyJr1GUWoOOIISRu+X2IXiOcVfg9qqBRyCPRUdLMIGJqPzMo+jMRlvE83t14v1j0dRMEaBbER/adQjp6Du2pw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/ts-thomas" + }, + { + "type": "paypal", + "url": "https://www.paypal.com/donate/?hosted_button_id=GEVR88FC9BWRW" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/flexsearch" + }, + { + "type": "patreon", + "url": "https://patreon.com/user?u=96245532" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/ts-thomas" + } + ], + "license": "Apache-2.0", + "peer": true + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/framer-motion": { + "version": "12.40.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.40.0.tgz", + "integrity": "sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.40.0", + "motion-utils": "^12.39.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fumadocs-core": { + "version": "16.9.3", + "resolved": "https://registry.npmjs.org/fumadocs-core/-/fumadocs-core-16.9.3.tgz", + "integrity": "sha512-8RVzKnzBJR5o+tJCccY28ntekfMQYBoYiz7alnYb/d9YJc+XpnsINzTl63lQ1eBMZ9gdhm2MqRtgUjh/8rUrbw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@orama/orama": "^3.1.18", + "estree-util-value-to-estree": "^3.5.0", + "github-slugger": "^2.0.0", + "hast-util-to-estree": "^3.1.3", + "hast-util-to-jsx-runtime": "^2.3.6", + "js-yaml": "^4.1.1", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-markdown": "^2.1.2", + "remark": "^15.0.1", + "remark-gfm": "^4.0.1", + "remark-rehype": "^11.1.2", + "scroll-into-view-if-needed": "^3.1.0", + "shiki": "^4.1.0", + "tinyglobby": "^0.2.16", + "unified": "^11.0.5", + "unist-util-visit": "^5.1.0", + "vfile": "^6.0.3" + }, + "peerDependencies": { + "@mdx-js/mdx": "*", + "@mixedbread/sdk": "0.x.x", + "@orama/core": "1.x.x", + "@oramacloud/client": "2.x.x", + "@tanstack/react-router": "1.x.x", + "@types/estree-jsx": "*", + "@types/hast": "*", + "@types/mdast": "*", + "@types/react": "*", + "algoliasearch": "5.x.x", + "flexsearch": "*", + "lucide-react": "*", + "next": "16.x.x", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-router": "7.x.x", + "waku": "*", + "zod": "4.x.x" + }, + "peerDependenciesMeta": { + "@mdx-js/mdx": { + "optional": true + }, + "@mixedbread/sdk": { + "optional": true + }, + "@orama/core": { + "optional": true + }, + "@oramacloud/client": { + "optional": true + }, + "@tanstack/react-router": { + "optional": true + }, + "@types/estree-jsx": { + "optional": true + }, + "@types/hast": { + "optional": true + }, + "@types/mdast": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "algoliasearch": { + "optional": true + }, + "flexsearch": { + "optional": true + }, + "lucide-react": { + "optional": true + }, + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-router": { + "optional": true + }, + "waku": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/fumadocs-mdx": { + "version": "15.0.10", + "resolved": "https://registry.npmjs.org/fumadocs-mdx/-/fumadocs-mdx-15.0.10.tgz", + "integrity": "sha512-kH3S7ESS9yXTAaCkA8dDugsCK/MbnpgyZ5qBEL7cWoavV0O/T4+4YTYFkvNknz7cw+T/r+OG0p2BvlVhkk4fww==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.1.1", + "@standard-schema/spec": "^1.1.0", + "chokidar": "^5.0.0", + "esbuild": "^0.28.0", + "estree-util-value-to-estree": "^3.5.0", + "js-yaml": "^4.1.1", + "mdast-util-mdx": "^3.0.0", + "picocolors": "^1.1.1", + "picomatch": "^4.0.4", + "tinyexec": "^1.2.2", + "tinyglobby": "^0.2.16", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.1.0", + "vfile": "^6.0.3", + "zod": "^4.4.3" + }, + "bin": { + "fumadocs-mdx": "bin.js" + }, + "peerDependencies": { + "@types/mdast": "*", + "@types/mdx": "*", + "@types/react": "*", + "fumadocs-core": "^16.7.0", + "mdast-util-directive": "*", + "next": "^15.3.0 || ^16.0.0", + "react": "^19.2.0", + "rolldown": "*", + "vite": "7.x.x || 8.x.x" + }, + "peerDependenciesMeta": { + "@types/mdast": { + "optional": true + }, + "@types/mdx": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "mdast-util-directive": { + "optional": true + }, + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "rolldown": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/fumadocs-ui": { + "version": "16.9.3", + "resolved": "https://registry.npmjs.org/fumadocs-ui/-/fumadocs-ui-16.9.3.tgz", + "integrity": "sha512-eoVKj1H+ATut0su+WIoPWBLRqzPMGD0hekIBr4GopWvUg1lS997HL4kP+Leyf+3CYlZtFgyXb6ylbvRLFtEj6Q==", + "license": "MIT", + "dependencies": { + "@fumadocs/tailwind": "0.0.5", + "@radix-ui/react-accordion": "^1.2.12", + "@radix-ui/react-collapsible": "^1.1.12", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-direction": "^1.1.1", + "@radix-ui/react-navigation-menu": "^1.2.14", + "@radix-ui/react-popover": "^1.1.15", + "@radix-ui/react-presence": "^1.1.5", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-tabs": "^1.1.13", + "class-variance-authority": "^0.7.1", + "lucide-react": "^1.17.0", + "motion": "^12.40.0", + "next-themes": "^0.4.6", + "react-remove-scroll": "^2.7.2", + "rehype-raw": "^7.0.0", + "scroll-into-view-if-needed": "^3.1.0", + "shiki": "^4.1.0", + "tailwind-merge": "^3.6.0", + "unist-util-visit": "^5.1.0" + }, + "peerDependencies": { + "@takumi-rs/image-response": "*", + "@types/mdx": "*", + "@types/react": "*", + "fumadocs-core": "16.9.3", + "next": "16.x.x", + "react": "^19.2.0", + "react-dom": "^19.2.0" + }, + "peerDependenciesMeta": { + "@takumi-rs/image-response": { + "optional": true + }, + "@types/mdx": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "next": { + "optional": true + } + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-port-reachable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz", + "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.17.0.tgz", + "integrity": "sha512-9FA9evdox/JQL5PT57fdA1x/yg8T7knJ98+zjTL3UfKza6pflQUUh3XtaQIHKvnsJw1lmsEyHVlt5jchYxOQ5w==", + "license": "ISC", + "peer": true, + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/motion": { + "version": "12.40.0", + "resolved": "https://registry.npmjs.org/motion/-/motion-12.40.0.tgz", + "integrity": "sha512-yjrHUrBFW6kQvjJwRsoiPSAhC5tRwRqNGJWmiJ4CrGnbKp0V88AdzkhBmDoqIsIPfarOe0Uddd37Xq43/gIocA==", + "license": "MIT", + "dependencies": { + "framer-motion": "^12.40.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/motion-dom": { + "version": "12.40.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.40.0.tgz", + "integrity": "sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.39.0" + } + }, + "node_modules/motion-utils": { + "version": "12.39.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.39.0.tgz", + "integrity": "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/next/-/next-16.2.6.tgz", + "integrity": "sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@next/env": "16.2.6", + "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.9.19", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.2.6", + "@next/swc-darwin-x64": "16.2.6", + "@next/swc-linux-arm64-gnu": "16.2.6", + "@next/swc-linux-arm64-musl": "16.2.6", + "@next/swc-linux-x64-gnu": "16.2.6", + "@next/swc-linux-x64-musl": "16.2.6", + "@next/swc-win32-arm64-msvc": "16.2.6", + "@next/swc-win32-x64-msvc": "16.2.6", + "sharp": "^0.34.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-releases": { + "version": "2.0.46", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.46.tgz", + "integrity": "sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oniguruma-parser": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", + "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", + "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", + "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz", + "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.6" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz", + "integrity": "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serve": { + "version": "14.2.6", + "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.6.tgz", + "integrity": "sha512-QEjUSA+sD4Rotm1znR8s50YqA3kYpRGPmtd5GlFxbaL9n/FdUNbqMhxClqdditSk0LlZyA/dhud6XNRTOC9x2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@zeit/schemas": "2.36.0", + "ajv": "8.18.0", + "arg": "5.0.2", + "boxen": "7.0.0", + "chalk": "5.0.1", + "chalk-template": "0.4.0", + "clipboardy": "3.0.0", + "compression": "1.8.1", + "is-port-reachable": "4.0.0", + "serve-handler": "6.1.7", + "update-check": "1.5.4" + }, + "bin": { + "serve": "build/main.js" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/serve-handler": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.7.tgz", + "integrity": "sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "mime-types": "2.1.18", + "minimatch": "3.1.5", + "path-is-inside": "1.0.2", + "path-to-regexp": "3.3.0", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/serve/node_modules/chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/serve/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.1.0.tgz", + "integrity": "sha512-l/ABZPUR5v70jI10EzqfMS/I96vjSGv2y0ihUV+WYFzv0EfvW4s54m0Lg8wCrrL+2IkwBzFTuxkZjPf8b2NX9Q==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.1.0", + "@shikijs/engine-javascript": "4.1.0", + "@shikijs/engine-oniguruma": "4.1.0", + "@shikijs/langs": "4.1.0", + "@shikijs/themes": "4.1.0", + "@shikijs/types": "4.1.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swr": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.4.1.tgz", + "integrity": "sha512-2CC6CiKQtEwaEeNiqWTAw9PGykW8SR5zZX8MZk6TeAvEAnVS7Visz8WzphqgtQ8v2xz/4Q5K+j+SeMaKXeeQIA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/tailwind-merge": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", + "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==", + "devOptional": true, + "license": "MIT", + "peer": true + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/throttleit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", + "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tinyexec": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.3.tgz", + "integrity": "sha512-g62dB+w1/OEFnPvmX0yd/HnetYITOL+1nJW7kitOycOeAvmbWC/nu0fwmmQ/kupNojqExzyC/T++pST/jRJ2mQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.60.0.tgz", + "integrity": "sha512-9f65qWLZdAW9m1JaxBDUHcqRUfL8bkxxXL7XxEfI+F09q56PkBvIfCjLF3yInsDM/BBmwkqmCQdCZe/RYlIWEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.60.0", + "@typescript-eslint/parser": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/utils": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "dev": true, + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unrs-resolver": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz", + "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.4" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.12.2", + "@unrs/resolver-binding-android-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-x64": "1.12.2", + "@unrs/resolver-binding-freebsd-x64": "1.12.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", + "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-musl": "1.12.2", + "@unrs/resolver-binding-openharmony-arm64": "1.12.2", + "@unrs/resolver-binding-wasm32-wasi": "1.12.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-check": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz", + "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.21.tgz", + "integrity": "sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/website/package.json b/website/package.json new file mode 100644 index 0000000..978a1ec --- /dev/null +++ b/website/package.json @@ -0,0 +1,46 @@ +{ + "name": "website", + "version": "0.0.0", + "private": true, + "scripts": { + "build": "next build", + "dev": "next dev", + "start": "serve out", + "types:check": "fumadocs-mdx && next typegen && tsc --noEmit", + "postinstall": "fumadocs-mdx", + "lint": "eslint" + }, + "dependencies": { + "@orama/orama": "^3.1.18", + "fumadocs-core": "16.9.3", + "fumadocs-mdx": "15.0.10", + "fumadocs-ui": "16.9.3", + "lucide-react": "^1.17.0", + "next": "16.2.6", + "react": "^19.2.6", + "react-dom": "^19.2.6", + "tailwind-merge": "^3.6.0", + "flexsearch": "^0.8.212", + "zod": "^4.4.3", + "class-variance-authority": "^0.7.1", + "remark": "^15.0.1", + "remark-gfm": "^4.0.1", + "remark-rehype": "^11.1.2", + "hast-util-to-jsx-runtime": "^2.3.6", + "unist-util-visit": "^5.1.0" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4.3.0", + "@types/mdx": "^2.0.13", + "@types/node": "^25.9.1", + "@types/react": "^19.2.15", + "@types/react-dom": "^19.2.3", + "postcss": "^8.5.15", + "serve": "^14.2.6", + "tailwindcss": "^4.3.0", + "typescript": "^6.0.3", + "eslint-config-next": "16.2.6", + "eslint": "^9.39.4", + "@types/hast": "^3.0.4" + } +} \ No newline at end of file diff --git a/website/postcss.config.mjs b/website/postcss.config.mjs new file mode 100644 index 0000000..297374d --- /dev/null +++ b/website/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + '@tailwindcss/postcss': {}, + }, +}; + +export default config; diff --git a/website/source.config.ts b/website/source.config.ts new file mode 100644 index 0000000..a35628a --- /dev/null +++ b/website/source.config.ts @@ -0,0 +1,23 @@ +import { defineConfig, defineDocs } from 'fumadocs-mdx/config'; +import { metaSchema, pageSchema } from 'fumadocs-core/source/schema'; + +// You can customize Zod schemas for frontmatter and `meta.json` here +// see https://fumadocs.dev/docs/mdx/collections +export const docs = defineDocs({ + dir: 'content/docs', + docs: { + schema: pageSchema, + postprocess: { + includeProcessedMarkdown: true, + }, + }, + meta: { + schema: metaSchema, + }, +}); + +export default defineConfig({ + mdxOptions: { + // MDX options + }, +}); diff --git a/website/src/app/(home)/layout.tsx b/website/src/app/(home)/layout.tsx new file mode 100644 index 0000000..77379fa --- /dev/null +++ b/website/src/app/(home)/layout.tsx @@ -0,0 +1,6 @@ +import { HomeLayout } from 'fumadocs-ui/layouts/home'; +import { baseOptions } from '@/lib/layout.shared'; + +export default function Layout({ children }: LayoutProps<'/'>) { + return {children}; +} diff --git a/website/src/app/(home)/page.tsx b/website/src/app/(home)/page.tsx new file mode 100644 index 0000000..c936084 --- /dev/null +++ b/website/src/app/(home)/page.tsx @@ -0,0 +1,16 @@ +import Link from 'next/link'; + +export default function HomePage() { + return ( +
+

Hello World

+

+ You can open{' '} + + /docs + {' '} + and see the documentation. +

+
+ ); +} diff --git a/website/src/app/api/search/route.ts b/website/src/app/api/search/route.ts new file mode 100644 index 0000000..aaaff7f --- /dev/null +++ b/website/src/app/api/search/route.ts @@ -0,0 +1,9 @@ +import { source } from '@/lib/source'; +import { createFromSource } from 'fumadocs-core/search/server'; + +export const revalidate = false; + +export const { staticGET: GET } = createFromSource(source, { + // https://docs.orama.com/docs/orama-js/supported-languages + language: 'english', +}); diff --git a/website/src/app/docs/[[...slug]]/page.tsx b/website/src/app/docs/[[...slug]]/page.tsx new file mode 100644 index 0000000..53ce219 --- /dev/null +++ b/website/src/app/docs/[[...slug]]/page.tsx @@ -0,0 +1,63 @@ +import { getPageImage, getPageMarkdownUrl, source } from '@/lib/source'; +import { + DocsBody, + DocsDescription, + DocsPage, + DocsTitle, + MarkdownCopyButton, + ViewOptionsPopover, +} from 'fumadocs-ui/layouts/docs/page'; +import { notFound } from 'next/navigation'; +import { getMDXComponents } from '@/components/mdx'; +import type { Metadata } from 'next'; +import { createRelativeLink } from 'fumadocs-ui/mdx'; +import { gitConfig } from '@/lib/shared'; + +export default async function Page(props: PageProps<'/docs/[[...slug]]'>) { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + const MDX = page.data.body; + const markdownUrl = getPageMarkdownUrl(page).url; + + return ( + + {page.data.title} + {page.data.description} +
+ + +
+ + + +
+ ); +} + +export async function generateStaticParams() { + return source.generateParams(); +} + +export async function generateMetadata(props: PageProps<'/docs/[[...slug]]'>): Promise { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + return { + title: page.data.title, + description: page.data.description, + openGraph: { + images: getPageImage(page).url, + }, + }; +} diff --git a/website/src/app/docs/layout.tsx b/website/src/app/docs/layout.tsx new file mode 100644 index 0000000..a373143 --- /dev/null +++ b/website/src/app/docs/layout.tsx @@ -0,0 +1,11 @@ +import { source } from '@/lib/source'; +import { DocsLayout } from 'fumadocs-ui/layouts/docs'; +import { baseOptions } from '@/lib/layout.shared'; + +export default function Layout({ children }: LayoutProps<'/docs'>) { + return ( + + {children} + + ); +} diff --git a/website/src/app/global.css b/website/src/app/global.css new file mode 100644 index 0000000..f86f3c9 --- /dev/null +++ b/website/src/app/global.css @@ -0,0 +1,12 @@ +@import 'tailwindcss'; +@import 'fumadocs-ui/css/neutral.css'; +@import 'fumadocs-ui/css/preset.css'; + +html { + scrollbar-gutter: stable; +} + +html > body[data-scroll-locked] { + margin-right: 0px !important; + --removed-body-scroll-bar-size: 0px !important; +} diff --git a/website/src/app/layout.tsx b/website/src/app/layout.tsx new file mode 100644 index 0000000..fffc0a5 --- /dev/null +++ b/website/src/app/layout.tsx @@ -0,0 +1,17 @@ +import { Inter } from 'next/font/google'; +import { Provider } from '@/components/provider'; +import './global.css'; + +const inter = Inter({ + subsets: ['latin'], +}); + +export default function Layout({ children }: LayoutProps<'/'>) { + return ( + + + {children} + + + ); +} diff --git a/website/src/app/llms-full.txt/route.ts b/website/src/app/llms-full.txt/route.ts new file mode 100644 index 0000000..d494d2c --- /dev/null +++ b/website/src/app/llms-full.txt/route.ts @@ -0,0 +1,10 @@ +import { getLLMText, source } from '@/lib/source'; + +export const revalidate = false; + +export async function GET() { + const scan = source.getPages().map(getLLMText); + const scanned = await Promise.all(scan); + + return new Response(scanned.join('\n\n')); +} diff --git a/website/src/app/llms.mdx/docs/[[...slug]]/route.ts b/website/src/app/llms.mdx/docs/[[...slug]]/route.ts new file mode 100644 index 0000000..012e877 --- /dev/null +++ b/website/src/app/llms.mdx/docs/[[...slug]]/route.ts @@ -0,0 +1,23 @@ +import { getLLMText, getPageMarkdownUrl, source } from '@/lib/source'; +import { notFound } from 'next/navigation'; + +export const revalidate = false; + +export async function GET(_req: Request, { params }: RouteContext<'/llms.mdx/docs/[[...slug]]'>) { + const { slug } = await params; + // remove the appended "content.md" + const page = source.getPage(slug?.slice(0, -1)); + if (!page) notFound(); + + return new Response(await getLLMText(page), { + headers: { + 'Content-Type': 'text/markdown', + }, + }); +} + +export function generateStaticParams() { + return source.getPages().map((page) => ({ + slug: getPageMarkdownUrl(page).segments, + })); +} diff --git a/website/src/app/llms.txt/route.ts b/website/src/app/llms.txt/route.ts new file mode 100644 index 0000000..fc80cb6 --- /dev/null +++ b/website/src/app/llms.txt/route.ts @@ -0,0 +1,8 @@ +import { source } from '@/lib/source'; +import { llms } from 'fumadocs-core/source'; + +export const revalidate = false; + +export function GET() { + return new Response(llms(source).index()); +} diff --git a/website/src/app/og/docs/[...slug]/route.tsx b/website/src/app/og/docs/[...slug]/route.tsx new file mode 100644 index 0000000..877166d --- /dev/null +++ b/website/src/app/og/docs/[...slug]/route.tsx @@ -0,0 +1,28 @@ +import { getPageImage, source } from '@/lib/source'; +import { notFound } from 'next/navigation'; +import { ImageResponse } from 'next/og'; +import { generate as DefaultImage } from 'fumadocs-ui/og'; +import { appName } from '@/lib/shared'; + +export const revalidate = false; + +export async function GET(_req: Request, { params }: RouteContext<'/og/docs/[...slug]'>) { + const { slug } = await params; + const page = source.getPage(slug.slice(0, -1)); + if (!page) notFound(); + + return new ImageResponse( + , + { + width: 1200, + height: 630, + }, + ); +} + +export function generateStaticParams() { + return source.getPages().map((page) => ({ + lang: page.locale, + slug: getPageImage(page).segments, + })); +} diff --git a/website/src/components/markdown.tsx b/website/src/components/markdown.tsx new file mode 100644 index 0000000..67c4902 --- /dev/null +++ b/website/src/components/markdown.tsx @@ -0,0 +1,116 @@ +import { remark } from 'remark'; +import remarkGfm from 'remark-gfm'; +import remarkRehype from 'remark-rehype'; +import { toJsxRuntime } from 'hast-util-to-jsx-runtime'; +import { + Children, + type ComponentProps, + type ReactElement, + type ReactNode, + Suspense, + use, + useDeferredValue, +} from 'react'; +import { Fragment, jsx, jsxs } from 'react/jsx-runtime'; +import { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock'; +import defaultMdxComponents from 'fumadocs-ui/mdx'; +import { visit } from 'unist-util-visit'; +import type { ElementContent, Root, RootContent } from 'hast'; + +export interface Processor { + process: (content: string) => Promise; +} + +export function rehypeWrapWords() { + return (tree: Root) => { + visit(tree, ['text', 'element'], (node, index, parent) => { + if (node.type === 'element' && node.tagName === 'pre') return 'skip'; + if (node.type !== 'text' || !parent || index === undefined) return; + + const words = node.value.split(/(?=\s)/); + + // Create new span nodes for each word and whitespace + const newNodes: ElementContent[] = words.flatMap((word) => { + if (word.length === 0) return []; + + return { + type: 'element', + tagName: 'span', + properties: { + class: 'animate-fd-fade-in', + }, + children: [{ type: 'text', value: word }], + }; + }); + + Object.assign(node, { + type: 'element', + tagName: 'span', + properties: {}, + children: newNodes, + } satisfies RootContent); + return 'skip'; + }); + }; +} + +function createProcessor(): Processor { + const processor = remark().use(remarkGfm).use(remarkRehype).use(rehypeWrapWords); + + return { + async process(content) { + const nodes = processor.parse({ value: content }); + const hast = await processor.run(nodes); + + return toJsxRuntime(hast, { + development: false, + jsx, + jsxs, + Fragment, + components: { + ...defaultMdxComponents, + pre: Pre, + img: undefined, // use JSX + }, + }); + }, + }; +} + +function Pre(props: ComponentProps<'pre'>) { + const code = Children.only(props.children) as ReactElement; + const codeProps = code.props as ComponentProps<'code'>; + const content = codeProps.children; + if (typeof content !== 'string') return null; + + let lang = + codeProps.className + ?.split(' ') + .find((v) => v.startsWith('language-')) + ?.slice('language-'.length) ?? 'text'; + + if (lang === 'mdx') lang = 'md'; + + return ; +} + +const processor = createProcessor(); + +export function Markdown({ text }: { text: string }) { + const deferredText = useDeferredValue(text); + + return ( + {text}

}> + +
+ ); +} + +const cache = new Map>(); + +function Renderer({ text }: { text: string }) { + const result = cache.get(text) ?? processor.process(text); + cache.set(text, result); + + return use(result); +} diff --git a/website/src/components/mdx.tsx b/website/src/components/mdx.tsx new file mode 100644 index 0000000..a640575 --- /dev/null +++ b/website/src/components/mdx.tsx @@ -0,0 +1,15 @@ +import defaultMdxComponents from 'fumadocs-ui/mdx'; +import type { MDXComponents } from 'mdx/types'; + +export function getMDXComponents(components?: MDXComponents) { + return { + ...defaultMdxComponents, + ...components, + } satisfies MDXComponents; +} + +export const useMDXComponents = getMDXComponents; + +declare global { + type MDXProvidedComponents = ReturnType; +} diff --git a/website/src/components/provider.tsx b/website/src/components/provider.tsx new file mode 100644 index 0000000..522282b --- /dev/null +++ b/website/src/components/provider.tsx @@ -0,0 +1,8 @@ +'use client'; +import SearchDialog from '@/components/search'; +import { RootProvider } from 'fumadocs-ui/provider/next'; +import { type ReactNode } from 'react'; + +export function Provider({ children }: { children: ReactNode }) { + return {children}; +} diff --git a/website/src/components/search.tsx b/website/src/components/search.tsx new file mode 100644 index 0000000..1f70420 --- /dev/null +++ b/website/src/components/search.tsx @@ -0,0 +1,46 @@ +'use client'; +import { + SearchDialog, + SearchDialogClose, + SearchDialogContent, + SearchDialogHeader, + SearchDialogIcon, + SearchDialogInput, + SearchDialogList, + SearchDialogOverlay, + type SharedProps, +} from 'fumadocs-ui/components/dialog/search'; +import { useDocsSearch } from 'fumadocs-core/search/client'; +import { create } from '@orama/orama'; +import { useI18n } from 'fumadocs-ui/contexts/i18n'; + +function initOrama() { + return create({ + schema: { _: 'string' }, + // https://docs.orama.com/docs/orama-js/supported-languages + language: 'english', + }); +} + +export default function DefaultSearchDialog(props: SharedProps) { + const { locale } = useI18n(); // (optional) for i18n + const { search, setSearch, query } = useDocsSearch({ + type: 'static', + initOrama, + locale, + }); + + return ( + + + + + + + + + + + + ); +} diff --git a/website/src/components/ui/button.tsx b/website/src/components/ui/button.tsx new file mode 100644 index 0000000..7c504c7 --- /dev/null +++ b/website/src/components/ui/button.tsx @@ -0,0 +1,29 @@ +import { cva, type VariantProps } from 'class-variance-authority'; + +const variants = { + primary: + 'bg-fd-primary text-fd-primary-foreground hover:bg-fd-primary/80 disabled:bg-fd-secondary disabled:text-fd-secondary-foreground', + outline: 'border hover:bg-fd-accent hover:text-fd-accent-foreground', + ghost: 'hover:bg-fd-accent hover:text-fd-accent-foreground', + secondary: + 'border bg-fd-secondary text-fd-secondary-foreground hover:bg-fd-accent hover:text-fd-accent-foreground', +} as const; + +export const buttonVariants = cva( + 'inline-flex items-center justify-center rounded-md p-2 text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring', + { + variants: { + variant: variants, + // fumadocs use `color` instead of `variant` + color: variants, + size: { + sm: 'gap-1 px-2 py-1.5 text-xs', + icon: 'p-1.5 [&_svg]:size-5', + 'icon-sm': 'p-1.5 [&_svg]:size-4.5', + 'icon-xs': 'p-1 [&_svg]:size-4', + }, + }, + }, +); + +export type ButtonProps = VariantProps; diff --git a/website/src/lib/cn.ts b/website/src/lib/cn.ts new file mode 100644 index 0000000..ba66fd2 --- /dev/null +++ b/website/src/lib/cn.ts @@ -0,0 +1 @@ +export { twMerge as cn } from 'tailwind-merge'; diff --git a/website/src/lib/layout.shared.tsx b/website/src/lib/layout.shared.tsx new file mode 100644 index 0000000..88b9ca8 --- /dev/null +++ b/website/src/lib/layout.shared.tsx @@ -0,0 +1,12 @@ +import type { BaseLayoutProps } from 'fumadocs-ui/layouts/shared'; +import { appName, gitConfig } from './shared'; + +export function baseOptions(): BaseLayoutProps { + return { + nav: { + // JSX supported + title: appName, + }, + githubUrl: `https://github.com/${gitConfig.user}/${gitConfig.repo}`, + }; +} diff --git a/website/src/lib/shared.ts b/website/src/lib/shared.ts new file mode 100644 index 0000000..812926e --- /dev/null +++ b/website/src/lib/shared.ts @@ -0,0 +1,11 @@ +export const appName = 'My App'; +export const docsRoute = '/docs'; +export const docsImageRoute = '/og/docs'; +export const docsContentRoute = '/llms.mdx/docs'; + +// fill this with your actual GitHub info, for example: +export const gitConfig = { + user: 'fuma-nama', + repo: 'fumadocs', + branch: 'main', +}; diff --git a/website/src/lib/source.ts b/website/src/lib/source.ts new file mode 100644 index 0000000..f5d0eae --- /dev/null +++ b/website/src/lib/source.ts @@ -0,0 +1,36 @@ +import { docs } from 'collections/server'; +import { loader } from 'fumadocs-core/source'; +import { docsContentRoute, docsImageRoute, docsRoute } from './shared'; + +// See https://fumadocs.dev/docs/headless/source-api for more info +export const source = loader({ + baseUrl: docsRoute, + source: docs.toFumadocsSource(), + plugins: [], +}); + +export function getPageImage(page: (typeof source)['$inferPage']) { + const segments = [...page.slugs, 'image.png']; + + return { + segments, + url: `${docsImageRoute}/${segments.join('/')}`, + }; +} + +export function getPageMarkdownUrl(page: (typeof source)['$inferPage']) { + const segments = [...page.slugs, 'content.md']; + + return { + segments, + url: `${docsContentRoute}/${segments.join('/')}`, + }; +} + +export async function getLLMText(page: (typeof source)['$inferPage']) { + const processed = await page.data.getText('processed'); + + return `# ${page.data.title} (${page.url}) + +${processed}`; +} diff --git a/website/tsconfig.json b/website/tsconfig.json new file mode 100644 index 0000000..59c41ba --- /dev/null +++ b/website/tsconfig.json @@ -0,0 +1,45 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "paths": { + "@/*": [ + "./src/*" + ], + "collections/*": [ + "./.source/*" + ] + }, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] +} \ No newline at end of file From a43fdb2d2718423c882af4c01b0350ebd091de40 Mon Sep 17 00:00:00 2001 From: enixCode <58286681+enixCode@users.noreply.github.com> Date: Sat, 30 May 2026 00:58:08 +0200 Subject: [PATCH 02/10] docs(fumadocs): port the 5 guides + intro to MDX content - Convert docs/guides/*.md (quickstart, extract, detached, security, gvisor-kata) into website/content/docs/*.mdx, deriving the frontmatter title from each H1. - Replace the scaffold placeholder index.mdx with a real light-runner intro, drop the default test.mdx. - Add content/docs/meta.json to order the sidebar. - next build renders all 6 docs pages as a clean static export. build with cc --- website/content/docs/detached.mdx | 142 +++++++++++++++++++++++++++ website/content/docs/extract.mdx | 125 +++++++++++++++++++++++ website/content/docs/gvisor-kata.mdx | 134 +++++++++++++++++++++++++ website/content/docs/index.mdx | 31 ++++-- website/content/docs/meta.json | 3 + website/content/docs/quickstart.mdx | 58 +++++++++++ website/content/docs/security.mdx | 117 ++++++++++++++++++++++ website/content/docs/test.mdx | 17 ---- 8 files changed, 602 insertions(+), 25 deletions(-) create mode 100644 website/content/docs/detached.mdx create mode 100644 website/content/docs/extract.mdx create mode 100644 website/content/docs/gvisor-kata.mdx create mode 100644 website/content/docs/meta.json create mode 100644 website/content/docs/quickstart.mdx create mode 100644 website/content/docs/security.mdx delete mode 100644 website/content/docs/test.mdx diff --git a/website/content/docs/detached.mdx b/website/content/docs/detached.mdx new file mode 100644 index 0000000..fec33e4 --- /dev/null +++ b/website/content/docs/detached.mdx @@ -0,0 +1,142 @@ +--- +title: "Detached runs" +--- + +A standard `runner.run(...)` ties the container's lifetime to the host Node process: kill the host, the run dies. Detached mode lets the container outlive the host. + +Use it when: + +- A run can take **hours** (training, batch jobs, CI-like workloads) and you cannot afford to lose it on a host crash or deploy. +- You want a long-poll architecture where one process **starts** runs and a different process **collects** results. +- You want to spawn a job, return immediately, and reconnect later from anywhere on the same machine. + +## Start a detached run + +```ts +import { DockerRunner } from 'light-runner'; + +const runner = new DockerRunner(); + +const execution = runner.run({ + image: 'python:3.12-alpine', + command: 'python long_job.py', + dir: './job', + timeout: 6 * 60 * 60 * 1000, // 6 hours + extract: [{ from: '/app/result.json', to: './out' }], + detached: true, +}); + +console.log('started, id =', execution.id); +// you can let this process exit; the container keeps running +``` + +## Reconnect to a running detached job + +```ts +const ex = DockerRunner.attach('light-runner-abc123def456'); +if (!ex) { + console.error('no state file for that id'); +} else { + const result = await ex.result; + console.log(result.success, result.exitCode, result.extracted); +} +``` + +`attach(id)` returns `null` when no state file exists for that id (typo'd id, or the run was reaped). + +## Listing known runs + +```ts +import { DockerRunner } from 'light-runner'; + +for (const state of DockerRunner.list()) { + console.log(state.id, state.status, state.startedAt, state.image); +} +``` + +## Detached contract differences + +| Capability | Attached | Detached | +|---|---|---| +| `input` (stdin) | Supported | **Rejected at API boundary** (host process death loses stdin) | +| `onLog` callback | Streams stdout/stderr lines | **Not called** (stream lost on host death; use `docker logs ` instead) | +| `cancel()` / signal | Best-effort kill | Best-effort kill, plus state file marked `cancelled` | +| `extract` | Runs after exit | Runs after exit, requested set persisted in state file | + +## State file lifecycle + +Every detached run writes one JSON file under `~/.light-runner/state/.json` (or `LIGHT_RUNNER_STATE_DIR`): + +```jsonc +{ + "id": "light-runner-abc123def456", + "container": "light-runner-abc123def456", + "volume": "light-runner-abc123def456", + "image": "python:3.12-alpine", + "workdir": "/app", + "command": "python long_job.py", + "timeout": 21600000, + "extract": [{"from": "/app/result.json", "to": "./out"}], + "startedAt": "2026-04-27T10:15:00.000Z", + "status": "running" +} +``` + +Status transitions: + +``` +running ──┬─> exited (clean exit, exitCode + finishedAt + durationMs added) + ├─> cancelled (cancel() / abort, exitCode set, cancelled: true) + └─> failed (setup error, container vanished, etc.) +``` + +Writes are atomic via temp + rename, so a host crash mid-write does not corrupt the file. + +## Cross-host resume + +The state dir is just JSON files under a fixed path. Two ways to make it shared: + +1. **Same machine, different process trees**: same `LIGHT_RUNNER_STATE_DIR`, no extra setup. Process A starts the run, process B re-attaches by id. +2. **Different machines**: mount the state dir on a shared filesystem (NFS, EFS, networked volume). The Docker daemon must be the **same one** on both hosts (they share the named volume + container by name). + +## Race-safe attach + +`attach(id)` is safe to call **immediately after** `runner.run({detached: true})` returns. The runner writes the state file synchronously inside `run()`, before any async setup, so the file always exists by the time the caller has the `Execution` handle. Internally, `attach` polls the docker daemon for ~3 seconds with `containerExists()` to absorb the gap between state-file-written and container-actually-created. + +## Reaping + +A long-running host eventually accumulates state files for finished runs. Two cleanup helpers: + +```ts +// Reconcile state files with the docker daemon. +// Mark `running` states as `failed` if their container has vanished. +await DockerRunner.cleanupOrphanStates(); + +// Sweep idle/exited containers + volumes tagged with the light-runner label. +const { containers, volumes } = await DockerRunner.reapOrphans(); +console.log(`reaped ${containers} containers, ${volumes} volumes`); +``` + +`reapOrphans` removes resources older than `LIGHT_RUNNER_REAP_AGE_MS` (default 5 minutes). Safe to run on a shared docker host with unrelated workloads since it filters by the `light-runner.run-id` label. + +Run both on host startup, before accepting new work. + +## Stop, pause, resume + +Detached or attached, the same `Execution` API works: + +```ts +await ex.stop({ signal: 'SIGTERM', grace: 10_000 }); // graceful, fall back to SIGKILL +await ex.pause(); // freezes via cgroup, memory preserved +await ex.resume(); // unfreezes +ex.cancel(); // immediate kill, sync, fire-and-forget +``` + +`pause()` is intentionally not flagging `cancelled: true` — a paused run is expected to resume and complete normally. + +## Gotchas + +- **Stdin is gone.** `RunRequest.input` is rejected at the API boundary when `detached: true`. Pipe input through a file in `dir` instead. +- **`onLog` is silent.** No live stream on host. Inspect `docker logs ` for stdout/stderr while the run is alive. +- **State file ≠ source of truth for liveness.** A `running` status with a vanished container = ghost run; `cleanupOrphanStates` is what reconciles that. +- **Extract still runs**, but only when the host that holds the resolved promise sees the exit. Re-attached hosts see `extracted` in their `result` too. diff --git a/website/content/docs/extract.mdx b/website/content/docs/extract.mdx new file mode 100644 index 0000000..f704280 --- /dev/null +++ b/website/content/docs/extract.mdx @@ -0,0 +1,125 @@ +--- +title: "Extract files" +--- + +`extract` is the **only output channel** for files. Logs go to `onLog`, exit code goes to `result.exitCode`, structured output goes through stdout / extracted files. The library has no opinion on what your container does inside. + +## Basic usage + +```ts +const execution = runner.run({ + image: 'node:lts-alpine', + command: 'node build.js', + dir: './project', + extract: [ + { from: '/app/dist', to: './out' }, // folder, recursive + { from: '/app/report.pdf', to: './out' }, // single file + { from: '/app/maybe-missing', to: './out' }, // missing -> reported, run still succeeds + ], +}); + +const result = await execution.result; +console.log(result.extracted); +// [ +// { from: '/app/dist', to: './out', status: 'ok', bytes: 124583 }, +// { from: '/app/report.pdf', to: './out', status: 'ok', bytes: 9421 }, +// { from: '/app/maybe-missing', to: './out', status: 'missing' }, +// ] +``` + +## Folder vs file semantics (rsync-like) + +| `from` is a... | Result | +|---|---| +| **Folder** | The **contents** of the folder land **directly in `to`** (no basename wrap). Equivalent to `rsync -a from/ to/` or `cp -r from/. to/`. All subdirectories and files are included recursively. | +| **File** | The file lands as `to/basename(from)`. | + +Trailing slash is irrelevant: `'/app/dist'` and `'/app/dist/'` produce identical output. + +```ts +extract: [ + { from: '/app/dist', to: './out' }, // /app/dist/a.js -> ./out/a.js + { from: '/app/dist/', to: './out' }, // same as above + { from: '/app/report.pdf', to: './out' }, // -> ./out/report.pdf +] +``` + +`to` is always a **destination directory**. It is auto-created via `fs.mkdirSync(to, { recursive: true })`. + +## Result statuses + +Each `extract` entry produces one `ExtractResult`: + +| `status` | Meaning | +|-------------|----------------------------------------------------------| +| `'ok'` | Archived and extracted. `bytes` reports the archive size.| +| `'missing'` | `from` does not exist in the container. | +| `'error'` | Cap exceeded, path traversal, mkdir failed, etc. The `error` field carries the reason. | + +A missing or errored entry **never fails the run**. The consumer inspects `result.extracted` and decides what to do. + +## Hard rules + +- **Path traversal rejected**: any segment containing `..` is refused before any container is spawned. `extract: [{ from: '/app/../etc/passwd', ... }]` → `status: 'error'` with `error: 'path traversal rejected (..)'`. +- **Symlinks skipped**: a malicious container could craft a symlink whose target path exists on the host. The tar reader silently drops them. +- **1 GiB per-entry cap**: enforced both **pre-flight** (`du -sb` inside the container) and **streamed** (byte counter in the host pipe). Above that, the entry is reported as `error` and the run still succeeds. +- **Extract only on success**: skipped when `exitCode !== 0` or the run was cancelled. `result.extracted` is undefined in those cases. +- **Disk-to-disk streaming**: the host never buffers the archive in Node RAM. + +## How extraction works internally + +1. After your container exits with code `0`, the runner spawns a **throwaway Alpine** sidecar with the same volume mounted read-only (no need to keep your image alive). +2. A pre-flight script checks that `from` exists, computes its byte size with `du -sb`, refuses if over the cap. +3. The sidecar runs `tar c` on `from` and pipes the archive to the host through a hijacked Docker stream. +4. The host pipes that into the [`tar` extract](https://www.npmjs.com/package/tar) reader, which writes files into `to/` and counts bytes for the streamed cap check. +5. The sidecar exits, AutoRemove tears it down, the runner returns `result.extracted`. + +## Common patterns + +### Capture structured output + +Have the container write a JSON file, extract it, parse it on the host: + +```ts +// Inside the container: +// import json +// json.dump({'fib': fib(20)}, open('/app/result.json', 'w')) + +const result = await runner.run({ + image: 'python:3.12-alpine', + command: 'python main.py', + dir: './solver', + extract: [{ from: '/app/result.json', to: './out' }], +}).result; + +const data = JSON.parse(fs.readFileSync('./out/result.json', 'utf8')); +``` + +### Pull a build artefact + +```ts +extract: [ + { from: '/app/dist', to: './public' }, + { from: '/app/coverage', to: './reports' }, +], +``` + +### Tolerate optional outputs + +Multiple entries with one missing is fine: + +```ts +extract: [ + { from: '/app/required.json', to: './out' }, + { from: '/app/optional-extra', to: './out' }, // may not exist +] + +const result = await execution.result; +const required = result.extracted!.find(e => e.from === '/app/required.json'); +if (required?.status !== 'ok') throw new Error('required.json missing'); +``` + +## See also + +- [`ExtractSpec`](/api/interfaces/ExtractSpec) and [`ExtractResult`](/api/interfaces/ExtractResult) in the API reference +- [Security model](./security) — why symlinks and `..` segments are dropped diff --git a/website/content/docs/gvisor-kata.mdx b/website/content/docs/gvisor-kata.mdx new file mode 100644 index 0000000..8eea7f0 --- /dev/null +++ b/website/content/docs/gvisor-kata.mdx @@ -0,0 +1,134 @@ +--- +title: "gVisor & Kata Containers" +--- + +Default `runtime: 'runc'` shares the host kernel with the container. That is fast and convenient, but it means a kernel-level exploit inside the container can compromise the host. For genuinely hostile code, switch the runtime. + +## Choose the right tier + +| Runtime | Isolation | Performance | Status in light-runner | +|---|---|---|---| +| `runc` (default) | Linux namespaces + cgroups, shared kernel | Native | **Tested**, default for trusted/known code | +| `runsc` (gVisor) | User-space syscall interception, smaller kernel attack surface | ~10-30% I/O overhead | **Tested**, recommended for hostile code | +| `kata` (Kata Containers) | Lightweight VM per container, separate kernel | ~5-15% boot + I/O cost | **Option exposed but not yet validated in our test matrix** — open an issue if you run it in production | + +Switch via `RunnerOptions`: + +```ts +const runner = new DockerRunner({ runtime: 'runsc' }); // or 'kata' +``` + +When the option is `runc` (or omitted), the runner does not pass a `Runtime` field to Docker, so you keep whatever the daemon's default is. + +## When to use gVisor + +Use it when **any** of these is true: + +- The code you run is **anonymous** (random user uploads, public CTF entries). +- The code is **AI-generated** and you do not audit each call (LLM tool execution, agent runtimes). +- You ship a **multi-tenant playground** and one tenant compromising the host would be a headline. +- You handle PII or regulated data and the threat model includes "the running code is the adversary". + +You do **not** need gVisor when: + +- The code comes from your own CI / internal tooling and you trust the toolchain. +- You build the image yourself from a known Dockerfile. +- The performance cost is unacceptable (data-intensive batch jobs). + +## Install gVisor on Linux / WSL2 + +gVisor does **not** run natively on macOS or Windows. On Windows, use Docker Desktop with the **WSL2 backend** — the `runsc` install lives inside the WSL2 distro, not the Windows host. + +```bash +( + set -e + ARCH=$(uname -m) + URL=https://storage.googleapis.com/gvisor/releases/release/latest/${ARCH} + wget ${URL}/runsc ${URL}/runsc.sha512 \ + ${URL}/containerd-shim-runsc-v1 ${URL}/containerd-shim-runsc-v1.sha512 + sha512sum -c runsc.sha512 -c containerd-shim-runsc-v1.sha512 + rm -f *.sha512 + chmod a+rx runsc containerd-shim-runsc-v1 + sudo mv runsc containerd-shim-runsc-v1 /usr/local/bin +) +sudo /usr/local/bin/runsc install +sudo systemctl reload docker +``` + +`latest` is a rolling channel — gVisor ships frequent date-stamped releases (`release-YYYYMMDD.N`), no semantic version. Verify with `runsc --version`. + +After the daemon reload, test that Docker accepts the new runtime: + +```bash +docker run --rm --runtime=runsc alpine:3.19 dmesg | head +# Expect: gVisor-style kernel ring buffer, NOT the host's +``` + +Then in your code: + +```ts +const runner = new DockerRunner({ runtime: 'runsc' }); +``` + +## Performance notes + +`runsc` intercepts syscalls in user space, so it pays a tax on every syscall: + +| Workload | Approx. overhead vs runc | +|---|---| +| CPU-bound (no syscalls) | ~0% | +| Read-heavy I/O | 10-15% | +| Write-heavy I/O | 20-30% | +| Network-heavy (small packets) | 25-40% | +| Workloads spawning many processes | 30-50% | + +For agent-style runs (one container, one process tree, one set of files), the overhead is usually **invisible**. For tight inner loops on disk or network, benchmark before committing. + +## Kata Containers + +Kata runs each container inside a lightweight VM with its own kernel, giving you **VM-level isolation** at container-level UX. + +```ts +const runner = new DockerRunner({ runtime: 'kata' }); +``` + +We pass `runtime: 'kata'` straight through to Docker's `HostConfig.Runtime`. Docker then dispatches to whichever Kata shim is installed (`containerd-shim-kata-v2` or similar). The library does **not** validate that the runtime is installed; if it is missing, Docker returns a `CONTAINER_START_FAILED` error at run time. + +**The disclaimer** (also visible on the security note in the bespoke landing): we expose this option for users who already run Kata, but our CI does **not** install or test against Kata. If you adopt it in production, please open an issue with results — both successes and edge cases. + +Useful resources: + +- [Kata Containers project](https://github.com/kata-containers/kata-containers) +- [Docker + Kata setup guide](https://github.com/kata-containers/kata-containers/blob/main/docs/install/docker/ubuntu-docker-install.md) + +## Verifying isolation + +A quick sanity check that the runtime actually changed: + +```ts +const result = await runner.run({ + image: 'alpine:3.19', + command: 'cat /proc/self/maps | head -5', + // gVisor-mapped binaries look very different from runc-mapped ones +}).result; +``` + +Or look for the gVisor signature: + +```ts +const result = await runner.run({ + image: 'alpine:3.19', + command: 'dmesg | grep -i gvisor || echo "not gvisor"', +}).result; +``` + +Under `runsc` you will see `gVisor` strings in `dmesg`. Under `runc`, you will see the host's kernel ring buffer. + +## Trade-offs summary + +| Want... | Use | +|---|---| +| Maximum speed, you trust the code | `runc` (default) | +| Hard barrier against kernel exploits, willing to pay 10-30% I/O | `runsc` | +| Full VM isolation, separate kernel | `kata` (un-validated, at your own risk) | +| Air-gapped network on top of any of the above | `network: 'none'` on the request | diff --git a/website/content/docs/index.mdx b/website/content/docs/index.mdx index 1ede18e..4182167 100644 --- a/website/content/docs/index.mdx +++ b/website/content/docs/index.mdx @@ -1,13 +1,28 @@ --- -title: Hello World -description: Your first document +title: light-runner +description: Run untrusted code in hardened Docker containers from Node.js. --- -Welcome to the docs! You can start writing documents in `/content/docs`. +light-runner is a single-responsibility Node.js library that runs code inside a hardened Docker container and returns the exit code plus any files you ask for. Domain-agnostic: no magic filenames, no forced output schema. -## What is Next? +## Install - - - - +```bash +npm install light-runner +``` + +## Quick taste + +```ts +import { DockerRunner } from 'light-runner'; + +const runner = new DockerRunner(); +const exec = runner.run({ + image: 'node:20-alpine', + entrypoint: 'node -e "console.log(1 + 1)"', +}); +const result = await exec.result; +console.log(result.exitCode); // 0 +``` + +Start with the [Quick start](/docs/quickstart), then explore [Extract files](/docs/extract), [Detached runs](/docs/detached), the [Security model](/docs/security), and [gVisor & Kata](/docs/gvisor-kata). diff --git a/website/content/docs/meta.json b/website/content/docs/meta.json new file mode 100644 index 0000000..5c4b662 --- /dev/null +++ b/website/content/docs/meta.json @@ -0,0 +1,3 @@ +{ + "pages": ["index", "quickstart", "extract", "detached", "security", "gvisor-kata"] +} diff --git a/website/content/docs/quickstart.mdx b/website/content/docs/quickstart.mdx new file mode 100644 index 0000000..00a5573 --- /dev/null +++ b/website/content/docs/quickstart.mdx @@ -0,0 +1,58 @@ +--- +title: "Quick start" +--- + +Run untrusted code in a hardened Docker container, get back the exit code, logs, and any files the container produced. That is the whole library. + +## Install + +```bash +npm install light-runner +``` + +Requirements: + +- Node.js >= 22 +- A running Docker daemon (Docker Desktop on macOS / Windows, `dockerd` on Linux) +- Optional: [gVisor](./gvisor-kata) for kernel-level isolation + +## Run something + +```ts +import { DockerRunner } from 'light-runner'; + +const runner = new DockerRunner({ memory: '512m', cpus: '1' }); + +const execution = runner.run({ + image: 'python:3.12-alpine', + command: 'python main.py', + dir: './my-project', + input: { task: 'compute', n: 20 }, + timeout: 30_000, + extract: [{ from: '/app/result.json', to: './out' }], +}); + +const result = await execution.result; + +result.success // true if exitCode === 0, not cancelled, not timed out +result.exitCode // container exit code +result.duration // ms +result.cancelled // true if cancel() / signal aborted +result.extracted // [{ from, to, status, bytes? }, ...] if extract was set +``` + +## What happens under the hood + +1. A named Docker volume is created (`light-runner-`). +2. The folder at `dir` is streamed into the volume via a throwaway Alpine seeder, skipping `.git`, `node_modules`, `dist`, `build`, `.next`, `.cache`, `.turbo`, `coverage`, and **all symlinks**. +3. Your image runs with the volume mounted at `workdir` (default `/app`), strict isolation flags, and a PID / memory / CPU cap. +4. On exit-code 0, each `extract` entry is streamed out via `tar`. On non-zero exit, extract is skipped. +5. The volume is destroyed, success or not. + +## Where to go next + +- [Extract files](./extract) — how to pull artefacts out of the container after a run +- [Detached runs](./detached) — long-running jobs that survive a host restart +- [Security model](./security) — what the sandbox protects against and what it does not +- [gVisor & Kata](./gvisor-kata) — adding a stronger runtime for hostile code +- [API reference](/api/) — full type signatures and class methods diff --git a/website/content/docs/security.mdx b/website/content/docs/security.mdx new file mode 100644 index 0000000..2e43694 --- /dev/null +++ b/website/content/docs/security.mdx @@ -0,0 +1,117 @@ +--- +title: "Security model" +--- + +`light-runner` is the boring, correct, library-grade answer to "how do I run untrusted code in a container from Node.js?". It is **secure by default**, **additive only** (every option makes the sandbox stronger, never weaker), and it has **one job** (no orchestration, no networking, no persistence beyond the run). + +This page describes what is in scope, what is not, and how to choose the right hardening tier. + +## Threat model + +| In scope | Out of scope | +|---|---| +| Untrusted **user code** running inside the container | The host kernel itself (use gVisor for hostile code) | +| **Filesystem isolation** between the run and the host | Side-channel attacks (timing, cache, Spectre) | +| **Process isolation** between sibling runs on the same host | Hardware-level threats (firmware, BIOS) | +| **Network containment** between the run and the host network | The Docker socket itself (root-equivalent on host) | +| **Resource starvation** (memory, CPU, pids, extract size) | DoS at the orchestration layer (caller's job) | +| Common container-escape patterns: raw sockets, mknod, capability juggling | Multi-tenant isolation **between tenants** sharing one container | + +**The one rule**: one run, one container, one tenant. If two pieces of code must not see each other, they each get their own `runner.run(...)` call. + +## What is on by default + +Every flag in [`src/createOptions.ts`](https://github.com/enixCode/light-runner/blob/main/src/createOptions.ts) is on for every run, with no opt-out path. + +### Capabilities dropped + +The following Linux capabilities are stripped at startup: + +| Capability | Why | +|----------------|------------------------------------------------------------| +| `NET_RAW` | Raw / packet sockets (ARP spoofing, packet crafting) | +| `MKNOD` | Fabricate device nodes | +| `SYS_CHROOT` | Escape weaker chroot jails | +| `SETPCAP` | Modify capability sets of other processes | +| `SETFCAP` | Escalate via setcap on dropped binaries | +| `AUDIT_WRITE` | Kernel audit log flooding / spoofing | + +### `no-new-privileges` + +A `setuid` binary inside the container **cannot elevate above the user it starts as**. Even if the image ships a legitimate-looking root-suid helper, it stays at the run user's privilege level. + +### Process cap + +`PidsLimit: 100` per container. A fork-bomb caps out in milliseconds instead of paging the host. Tunable upward via `RunnerOptions` if you genuinely need more (compilers spawning many processes, orchestrators-of-orchestrators), but the floor is conservative. + +### Memory and CPU budget + +`512 MiB` and `1` core by default, **cgroup-enforced**. Noisy runs cannot starve their neighbours. Override with `new DockerRunner({ memory: '4g', cpus: '4' })`. + +### Network isolation + +Default network: a **dedicated isolated bridge** (`light-runner-isolated`) with **inter-container traffic disabled** (`com.docker.network.bridge.enable_icc: false`). Outbound internet works; sibling runs on the same bridge cannot see each other. + +For air-gapped runs, set `network: 'none'` in the request — the container has no network interface at all. + +### Filesystem protections + +- **Symlinks in your input folder are filtered** at seed time, so a stray `.git` link or a deliberate symlink to `/etc/passwd` cannot cross the host -> container boundary. +- **`DEFAULT_IGNORES`** (`.git`, `node_modules`, `dist`, `build`, `.next`, `.cache`, `.turbo`, `coverage`) are skipped during seeding. They are noise at best and credentials-bearing at worst. +- **Path traversal in `extract.from`** (segments containing `..`) is rejected **before** any container is spawned. A malicious container cannot tell the host extractor to write to `/etc/cron.d/`. +- **Extract symlinks are skipped** during streaming. A container cannot craft a tarball with a symlink that resolves to a host path. +- **Extract cap**: 1 GiB per entry, enforced **twice** — pre-flight via `du -sb` inside the container, and streamed via a byte counter on the host pipe. + +## What this does not cover + +- **Kernel exploits** (anything that breaks out of namespaces by tickling the host kernel directly). +- **`runc` CVEs** (rare but real; you eat them if you ship `runtime: 'runc'`). +- **Side-channel attacks** (timing, cache eviction, Spectre/Meltdown family). + +For genuinely hostile code (anonymous user-submitted source, AI-agent-generated tool calls, a CTF playground), combine with a stronger runtime — see [gVisor & Kata](./gvisor-kata). + +## Secrets + +`env` vars go to `docker run --env`, which makes them visible in `docker inspect` and Docker metadata. That is fine in most setups (a host with Docker socket access is already root-equivalent), but for sensitive material prefer: + +- **`input`** (stdin). Ephemeral. Not in metadata, not in `docker inspect`. Your container reads it via `sys.stdin.read()` / `process.stdin`. +- **A bind mount to `/run/secrets/`**. Docker-native file-based secrets pattern (compose has a `secrets:` block for this). Not managed by light-runner — the consumer wires it via the host config or via a parent compose definition. + +Avoid putting API keys in `env`. Avoid putting them in `command`. Avoid putting them in `dir` (they would be tarred into the seed archive and visible to anyone with access to the volume). + +## Hardening recipes + +### Air-gapped run (no network, untrusted source code) + +```ts +const runner = new DockerRunner(); +runner.run({ + image: 'python:3.12-alpine', + command: 'python untrusted.py', + dir: './sandbox', + network: 'none', + timeout: 30_000, + extract: [{ from: '/app/output.json', to: './out' }], +}); +``` + +### Tighter resource budget + +```ts +const runner = new DockerRunner({ + memory: '128m', + cpus: '0.5', +}); +``` + +### Maximum isolation (gVisor) + +```ts +const runner = new DockerRunner({ runtime: 'runsc' }); +``` + +See [gVisor & Kata](./gvisor-kata) for installation. + +## Reporting a security issue + +Email the maintainer (see GitHub profile) with `[security]` in the subject. Public issues are fine for things that need a fix but no one is exploiting; private disclosure is preferred for actively-exploitable bugs. diff --git a/website/content/docs/test.mdx b/website/content/docs/test.mdx deleted file mode 100644 index f475f4a..0000000 --- a/website/content/docs/test.mdx +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: Components -description: Components ---- - -## Code Block - -```js -console.log('Hello World'); -``` - -## Cards - - - - - From c22f394f983bc913ef1160cad0733c218a24f899 Mon Sep 17 00:00:00 2001 From: enixCode <58286681+enixCode@users.noreply.github.com> Date: Sat, 30 May 2026 01:26:46 +0200 Subject: [PATCH 03/10] docs(fumadocs): theme accent + auto-generated API reference - Set the primary accent to Tailwind blue-600 (light) / blue-400 (dark) on the neutral gray scale, matching the light-process docs palette. - Generate the typedoc-markdown API reference into content/docs/api and rewrite it for Fumadocs (frontmatter titles + header stripped) via scripts/gen-fumadocs-api.mjs; Fumadocs auto-builds the API sidebar. - Order the api group into the docs nav. - Enrich the intro example (real fields entrypoint/dir/input/extract, with detached/networks as commented options). - next build renders 93 static pages (guides + full API reference). build with cc --- scripts/gen-fumadocs-api.mjs | 56 ++++ .../content/docs/api/classes/DockerRunner.md | 201 ++++++++++++ website/content/docs/api/classes/Execution.md | 134 ++++++++ .../docs/api/classes/LightRunnerError.md | 295 ++++++++++++++++++ .../api/functions/cleanupOrphanNetworks.md | 19 ++ .../docs/api/functions/connectNetwork.md | 23 ++ .../docs/api/functions/createNetwork.md | 23 ++ .../docs/api/functions/deleteNetwork.md | 19 ++ .../content/docs/api/functions/listStates.md | 13 + .../docs/api/functions/networkExists.md | 19 ++ .../content/docs/api/functions/readState.md | 19 ++ website/content/docs/api/index.md | 37 +++ .../api/interfaces/CleanupCacheOptions.md | 15 + .../api/interfaces/CleanupNetworkOptions.md | 31 ++ .../api/interfaces/CreateNetworkOptions.md | 101 ++++++ .../docs/api/interfaces/ExtractResult.md | 55 ++++ .../docs/api/interfaces/ExtractSpec.md | 25 ++ .../content/docs/api/interfaces/RunRequest.md | 145 +++++++++ .../content/docs/api/interfaces/RunResult.md | 57 ++++ .../content/docs/api/interfaces/RunState.md | 145 +++++++++ .../docs/api/interfaces/RunnerOptions.md | 55 ++++ .../docs/api/interfaces/StopOptions.md | 25 ++ website/content/docs/api/meta.json | 4 + .../api/type-aliases/LightRunnerErrorCode.md | 17 + .../content/docs/api/type-aliases/Runtime.md | 9 + website/content/docs/index.mdx | 18 +- website/content/docs/meta.json | 2 +- website/src/app/global.css | 15 + 28 files changed, 1571 insertions(+), 6 deletions(-) create mode 100644 scripts/gen-fumadocs-api.mjs create mode 100644 website/content/docs/api/classes/DockerRunner.md create mode 100644 website/content/docs/api/classes/Execution.md create mode 100644 website/content/docs/api/classes/LightRunnerError.md create mode 100644 website/content/docs/api/functions/cleanupOrphanNetworks.md create mode 100644 website/content/docs/api/functions/connectNetwork.md create mode 100644 website/content/docs/api/functions/createNetwork.md create mode 100644 website/content/docs/api/functions/deleteNetwork.md create mode 100644 website/content/docs/api/functions/listStates.md create mode 100644 website/content/docs/api/functions/networkExists.md create mode 100644 website/content/docs/api/functions/readState.md create mode 100644 website/content/docs/api/index.md create mode 100644 website/content/docs/api/interfaces/CleanupCacheOptions.md create mode 100644 website/content/docs/api/interfaces/CleanupNetworkOptions.md create mode 100644 website/content/docs/api/interfaces/CreateNetworkOptions.md create mode 100644 website/content/docs/api/interfaces/ExtractResult.md create mode 100644 website/content/docs/api/interfaces/ExtractSpec.md create mode 100644 website/content/docs/api/interfaces/RunRequest.md create mode 100644 website/content/docs/api/interfaces/RunResult.md create mode 100644 website/content/docs/api/interfaces/RunState.md create mode 100644 website/content/docs/api/interfaces/RunnerOptions.md create mode 100644 website/content/docs/api/interfaces/StopOptions.md create mode 100644 website/content/docs/api/meta.json create mode 100644 website/content/docs/api/type-aliases/LightRunnerErrorCode.md create mode 100644 website/content/docs/api/type-aliases/Runtime.md diff --git a/scripts/gen-fumadocs-api.mjs b/scripts/gen-fumadocs-api.mjs new file mode 100644 index 0000000..0210d70 --- /dev/null +++ b/scripts/gen-fumadocs-api.mjs @@ -0,0 +1,56 @@ +/* + * Regenerate the Fumadocs API reference from the TypeScript source. + * + * Runs typedoc (typedoc-plugin-markdown, configured in typedoc.json) into + * website/content/docs/api, then rewrites each page for Fumadocs: adds a + * frontmatter `title` derived from the typedoc H1 (stripping the kind prefix + * like "Interface: ") and drops the typedoc page header. Fumadocs then + * auto-builds the API sidebar from the file tree. + * + * Run from the repo root: `node scripts/gen-fumadocs-api.mjs`. Wire this into + * the docs CI step before `next build` so the API tracks the code. + */ +import { execSync } from 'node:child_process'; +import fs from 'node:fs'; +import path from 'node:path'; + +const OUT = 'website/content/docs/api'; + +execSync(`npx typedoc --out ${OUT}`, { stdio: 'inherit' }); + +const ROOT = path.resolve(OUT); + +function clean(h1) { + return h1 + .replace(/^#\s+/, '') + .replace(/^(Interface|Class|Function|Type Alias|Variable|Enumeration|Enum|Namespace):\s*/, '') + .replace(/\(\)$/, '') + .trim(); +} + +function rewrite(file) { + const rel = path.relative(ROOT, file).replace(/\\/g, '/'); + const lines = fs.readFileSync(file, 'utf8').split(/\r?\n/); + const h1Idx = lines.findIndex((l) => /^#\s+/.test(l)); + let title; + if (rel === 'index.md') title = 'API reference'; + else if (h1Idx >= 0) title = clean(lines[h1Idx]); + else title = path.basename(file, '.md'); + + let body = h1Idx >= 0 ? lines.slice(h1Idx + 1) : lines; + while (body.length && body[0].trim() === '') body.shift(); + + const safe = title.replace(/"/g, '\\"'); + fs.writeFileSync(file, `---\ntitle: "${safe}"\n---\n\n${body.join('\n').trimEnd()}\n`, 'utf8'); +} + +function walk(dir) { + for (const e of fs.readdirSync(dir, { withFileTypes: true })) { + const p = path.join(dir, e.name); + if (e.isDirectory()) walk(p); + else if (e.name.endsWith('.md')) rewrite(p); + } +} + +walk(ROOT); +console.log('Fumadocs API reference regenerated.'); diff --git a/website/content/docs/api/classes/DockerRunner.md b/website/content/docs/api/classes/DockerRunner.md new file mode 100644 index 0000000..65db8fd --- /dev/null +++ b/website/content/docs/api/classes/DockerRunner.md @@ -0,0 +1,201 @@ +--- +title: "DockerRunner" +--- + +Defined in: [src/DockerRunner.ts:16](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L16) + +## Constructors + +### Constructor + +```ts +new DockerRunner(options?): DockerRunner; +``` + +Defined in: [src/DockerRunner.ts:19](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L19) + +#### Parameters + +##### options? + +[`RunnerOptions`](../interfaces/RunnerOptions.md) = `{}` + +#### Returns + +`DockerRunner` + +## Methods + +### run() + +```ts +run(request): Execution; +``` + +Defined in: [src/DockerRunner.ts:29](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L29) + +#### Parameters + +##### request + +[`RunRequest`](../interfaces/RunRequest.md) + +#### Returns + +[`Execution`](Execution.md) + +*** + +### attach() + +```ts +static attach(id): Execution | null; +``` + +Defined in: [src/DockerRunner.ts:142](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L142) + +#### Parameters + +##### id + +`string` + +#### Returns + +[`Execution`](Execution.md) \| `null` + +*** + +### cleanupOldStates() + +```ts +static cleanupOldStates(maxBytes?): number; +``` + +Defined in: [src/DockerRunner.ts:157](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L157) + +#### Parameters + +##### maxBytes? + +`number` + +#### Returns + +`number` + +*** + +### cleanupOrphanCache() + +```ts +static cleanupOrphanCache(opts?): Promise; +``` + +Defined in: [src/DockerRunner.ts:122](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L122) + +#### Parameters + +##### opts? + +[`CleanupCacheOptions`](../interfaces/CleanupCacheOptions.md) = `{}` + +#### Returns + +`Promise`\<`number`\> + +*** + +### cleanupOrphanNetworks() + +```ts +static cleanupOrphanNetworks(opts?): Promise; +``` + +Defined in: [src/DockerRunner.ts:133](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L133) + +#### Parameters + +##### opts? + +[`CleanupNetworkOptions`](../interfaces/CleanupNetworkOptions.md) = `{}` + +#### Returns + +`Promise`\<`number`\> + +*** + +### cleanupOrphanStates() + +```ts +static cleanupOrphanStates(): Promise; +``` + +Defined in: [src/DockerRunner.ts:167](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L167) + +#### Returns + +`Promise`\<`number`\> + +*** + +### cleanupOrphanVolumes() + +```ts +static cleanupOrphanVolumes(): Promise; +``` + +Defined in: [src/DockerRunner.ts:113](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L113) + +#### Returns + +`Promise`\<`number`\> + +*** + +### isAvailable() + +```ts +static isAvailable(): Promise; +``` + +Defined in: [src/DockerRunner.ts:109](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L109) + +#### Returns + +`Promise`\<`boolean`\> + +*** + +### list() + +```ts +static list(): RunState[]; +``` + +Defined in: [src/DockerRunner.ts:146](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L146) + +#### Returns + +[`RunState`](../interfaces/RunState.md)[] + +*** + +### reapOrphans() + +```ts +static reapOrphans(): Promise<{ + containers: number; + volumes: number; +}>; +``` + +Defined in: [src/DockerRunner.ts:178](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L178) + +#### Returns + +`Promise`\<\{ + `containers`: `number`; + `volumes`: `number`; +\}\> diff --git a/website/content/docs/api/classes/Execution.md b/website/content/docs/api/classes/Execution.md new file mode 100644 index 0000000..414f194 --- /dev/null +++ b/website/content/docs/api/classes/Execution.md @@ -0,0 +1,134 @@ +--- +title: "Execution" +--- + +Defined in: [src/Execution.ts:17](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L17) + +## Constructors + +### Constructor + +```ts +new Execution( + id, + result, + onCancel): Execution; +``` + +Defined in: [src/Execution.ts:22](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L22) + +#### Parameters + +##### id + +`string` + +##### result + +`Promise`\<[`RunResult`](../interfaces/RunResult.md)\> + +##### onCancel + +() => `void` + +#### Returns + +`Execution` + +## Properties + +### id + +```ts +readonly id: string; +``` + +Defined in: [src/Execution.ts:18](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L18) + +*** + +### result + +```ts +readonly result: Promise; +``` + +Defined in: [src/Execution.ts:19](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L19) + +## Accessors + +### cancelled + +#### Get Signature + +```ts +get cancelled(): boolean; +``` + +Defined in: [src/Execution.ts:45](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L45) + +##### Returns + +`boolean` + +## Methods + +### cancel() + +```ts +cancel(): void; +``` + +Defined in: [src/Execution.ts:36](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L36) + +#### Returns + +`void` + +*** + +### pause() + +```ts +pause(): Promise; +``` + +Defined in: [src/Execution.ts:92](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L92) + +#### Returns + +`Promise`\<`void`\> + +*** + +### resume() + +```ts +resume(): Promise; +``` + +Defined in: [src/Execution.ts:100](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L100) + +#### Returns + +`Promise`\<`void`\> + +*** + +### stop() + +```ts +stop(options?): Promise; +``` + +Defined in: [src/Execution.ts:54](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L54) + +#### Parameters + +##### options? + +[`StopOptions`](../interfaces/StopOptions.md) = `{}` + +#### Returns + +`Promise`\<`void`\> diff --git a/website/content/docs/api/classes/LightRunnerError.md b/website/content/docs/api/classes/LightRunnerError.md new file mode 100644 index 0000000..d406963 --- /dev/null +++ b/website/content/docs/api/classes/LightRunnerError.md @@ -0,0 +1,295 @@ +--- +title: "LightRunnerError" +--- + +Defined in: [src/errors.ts:25](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L25) + +## Extends + +- `Error` + +## Properties + +### cause? + +```ts +optional cause?: unknown; +``` + +Defined in: node\_modules/typescript/lib/lib.es2022.error.d.ts:24 + +#### Inherited from + +```ts +Error.cause +``` + +*** + +### code + +```ts +readonly code: LightRunnerErrorCode; +``` + +Defined in: [src/errors.ts:26](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L26) + +*** + +### containerId? + +```ts +readonly optional containerId?: string; +``` + +Defined in: [src/errors.ts:28](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L28) + +*** + +### dockerOp? + +```ts +readonly optional dockerOp?: string; +``` + +Defined in: [src/errors.ts:27](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L27) + +*** + +### message + +```ts +message: string; +``` + +Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1075 + +#### Inherited from + +```ts +Error.message +``` + +*** + +### name + +```ts +name: string; +``` + +Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1074 + +#### Inherited from + +```ts +Error.name +``` + +*** + +### stack? + +```ts +optional stack?: string; +``` + +Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1076 + +#### Inherited from + +```ts +Error.stack +``` + +*** + +### stackTraceLimit + +```ts +static stackTraceLimit: number; +``` + +Defined in: node\_modules/@types/node/globals.d.ts:67 + +The `Error.stackTraceLimit` property specifies the number of stack frames +collected by a stack trace (whether generated by `new Error().stack` or +`Error.captureStackTrace(obj)`). + +The default value is `10` but may be set to any valid JavaScript number. Changes +will affect any stack trace captured _after_ the value has been changed. + +If set to a non-number value, or set to a negative number, stack traces will +not capture any frames. + +#### Inherited from + +```ts +Error.stackTraceLimit +``` + +## Methods + +### toJSON() + +```ts +toJSON(): { + code: LightRunnerErrorCode; + containerId?: string; + dockerOp?: string; + message: string; + name: string; +}; +``` + +Defined in: [src/errors.ts:39](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L39) + +#### Returns + +```ts +{ + code: LightRunnerErrorCode; + containerId?: string; + dockerOp?: string; + message: string; + name: string; +} +``` + +##### code + +```ts +code: LightRunnerErrorCode; +``` + +##### containerId? + +```ts +optional containerId?: string; +``` + +##### dockerOp? + +```ts +optional dockerOp?: string; +``` + +##### message + +```ts +message: string; +``` + +##### name + +```ts +name: string; +``` + +*** + +### captureStackTrace() + +```ts +static captureStackTrace(targetObject, constructorOpt?): void; +``` + +Defined in: node\_modules/@types/node/globals.d.ts:51 + +Creates a `.stack` property on `targetObject`, which when accessed returns +a string representing the location in the code at which +`Error.captureStackTrace()` was called. + +```js +const myObject = {}; +Error.captureStackTrace(myObject); +myObject.stack; // Similar to `new Error().stack` +``` + +The first line of the trace will be prefixed with +`${myObject.name}: ${myObject.message}`. + +The optional `constructorOpt` argument accepts a function. If given, all frames +above `constructorOpt`, including `constructorOpt`, will be omitted from the +generated stack trace. + +The `constructorOpt` argument is useful for hiding implementation +details of error generation from the user. For instance: + +```js +function a() { + b(); +} + +function b() { + c(); +} + +function c() { + // Create an error without stack trace to avoid calculating the stack trace twice. + const { stackTraceLimit } = Error; + Error.stackTraceLimit = 0; + const error = new Error(); + Error.stackTraceLimit = stackTraceLimit; + + // Capture the stack trace above function b + Error.captureStackTrace(error, b); // Neither function c, nor b is included in the stack trace + throw error; +} + +a(); +``` + +#### Parameters + +##### targetObject + +`object` + +##### constructorOpt? + +`Function` + +#### Returns + +`void` + +#### Inherited from + +```ts +Error.captureStackTrace +``` + +*** + +### prepareStackTrace() + +```ts +static prepareStackTrace(err, stackTraces): any; +``` + +Defined in: node\_modules/@types/node/globals.d.ts:55 + +#### Parameters + +##### err + +`Error` + +##### stackTraces + +`CallSite`[] + +#### Returns + +`any` + +#### See + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + +#### Inherited from + +```ts +Error.prepareStackTrace +``` diff --git a/website/content/docs/api/functions/cleanupOrphanNetworks.md b/website/content/docs/api/functions/cleanupOrphanNetworks.md new file mode 100644 index 0000000..c6c04a2 --- /dev/null +++ b/website/content/docs/api/functions/cleanupOrphanNetworks.md @@ -0,0 +1,19 @@ +--- +title: "cleanupOrphanNetworks" +--- + +```ts +function cleanupOrphanNetworks(opts?): Promise; +``` + +Defined in: [src/network.ts:213](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L213) + +## Parameters + +### opts? + +[`CleanupNetworkOptions`](../interfaces/CleanupNetworkOptions.md) = `{}` + +## Returns + +`Promise`\<`number`\> diff --git a/website/content/docs/api/functions/connectNetwork.md b/website/content/docs/api/functions/connectNetwork.md new file mode 100644 index 0000000..87db46a --- /dev/null +++ b/website/content/docs/api/functions/connectNetwork.md @@ -0,0 +1,23 @@ +--- +title: "connectNetwork" +--- + +```ts +function connectNetwork(name, containerId): Promise; +``` + +Defined in: [src/network.ts:166](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L166) + +## Parameters + +### name + +`string` + +### containerId + +`string` + +## Returns + +`Promise`\<`void`\> diff --git a/website/content/docs/api/functions/createNetwork.md b/website/content/docs/api/functions/createNetwork.md new file mode 100644 index 0000000..6d7a4d5 --- /dev/null +++ b/website/content/docs/api/functions/createNetwork.md @@ -0,0 +1,23 @@ +--- +title: "createNetwork" +--- + +```ts +function createNetwork(name, opts?): Promise; +``` + +Defined in: [src/network.ts:69](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L69) + +## Parameters + +### name + +`string` + +### opts? + +[`CreateNetworkOptions`](../interfaces/CreateNetworkOptions.md) = `{}` + +## Returns + +`Promise`\<`boolean`\> diff --git a/website/content/docs/api/functions/deleteNetwork.md b/website/content/docs/api/functions/deleteNetwork.md new file mode 100644 index 0000000..ee97f54 --- /dev/null +++ b/website/content/docs/api/functions/deleteNetwork.md @@ -0,0 +1,19 @@ +--- +title: "deleteNetwork" +--- + +```ts +function deleteNetwork(name): Promise; +``` + +Defined in: [src/network.ts:145](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L145) + +## Parameters + +### name + +`string` + +## Returns + +`Promise`\<`void`\> diff --git a/website/content/docs/api/functions/listStates.md b/website/content/docs/api/functions/listStates.md new file mode 100644 index 0000000..2419885 --- /dev/null +++ b/website/content/docs/api/functions/listStates.md @@ -0,0 +1,13 @@ +--- +title: "listStates" +--- + +```ts +function listStates(): RunState[]; +``` + +Defined in: [src/state.ts:56](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L56) + +## Returns + +[`RunState`](../interfaces/RunState.md)[] diff --git a/website/content/docs/api/functions/networkExists.md b/website/content/docs/api/functions/networkExists.md new file mode 100644 index 0000000..e922810 --- /dev/null +++ b/website/content/docs/api/functions/networkExists.md @@ -0,0 +1,19 @@ +--- +title: "networkExists" +--- + +```ts +function networkExists(name): Promise; +``` + +Defined in: [src/network.ts:182](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L182) + +## Parameters + +### name + +`string` + +## Returns + +`Promise`\<`boolean`\> diff --git a/website/content/docs/api/functions/readState.md b/website/content/docs/api/functions/readState.md new file mode 100644 index 0000000..428b4bd --- /dev/null +++ b/website/content/docs/api/functions/readState.md @@ -0,0 +1,19 @@ +--- +title: "readState" +--- + +```ts +function readState(id): RunState | null; +``` + +Defined in: [src/state.ts:46](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L46) + +## Parameters + +### id + +`string` + +## Returns + +[`RunState`](../interfaces/RunState.md) \| `null` diff --git a/website/content/docs/api/index.md b/website/content/docs/api/index.md new file mode 100644 index 0000000..6cc5fbe --- /dev/null +++ b/website/content/docs/api/index.md @@ -0,0 +1,37 @@ +--- +title: "API reference" +--- + +## Classes + +- [DockerRunner](classes/DockerRunner.md) +- [Execution](classes/Execution.md) +- [LightRunnerError](classes/LightRunnerError.md) + +## Interfaces + +- [CleanupCacheOptions](interfaces/CleanupCacheOptions.md) +- [CleanupNetworkOptions](interfaces/CleanupNetworkOptions.md) +- [CreateNetworkOptions](interfaces/CreateNetworkOptions.md) +- [ExtractResult](interfaces/ExtractResult.md) +- [ExtractSpec](interfaces/ExtractSpec.md) +- [RunnerOptions](interfaces/RunnerOptions.md) +- [RunRequest](interfaces/RunRequest.md) +- [RunResult](interfaces/RunResult.md) +- [RunState](interfaces/RunState.md) +- [StopOptions](interfaces/StopOptions.md) + +## Type Aliases + +- [LightRunnerErrorCode](type-aliases/LightRunnerErrorCode.md) +- [Runtime](type-aliases/Runtime.md) + +## Functions + +- [cleanupOrphanNetworks](functions/cleanupOrphanNetworks.md) +- [connectNetwork](functions/connectNetwork.md) +- [createNetwork](functions/createNetwork.md) +- [deleteNetwork](functions/deleteNetwork.md) +- [listStates](functions/listStates.md) +- [networkExists](functions/networkExists.md) +- [readState](functions/readState.md) diff --git a/website/content/docs/api/interfaces/CleanupCacheOptions.md b/website/content/docs/api/interfaces/CleanupCacheOptions.md new file mode 100644 index 0000000..71d7d5d --- /dev/null +++ b/website/content/docs/api/interfaces/CleanupCacheOptions.md @@ -0,0 +1,15 @@ +--- +title: "CleanupCacheOptions" +--- + +Defined in: [src/build.ts:190](https://github.com/enixCode/light-runner/blob/main/src/build.ts#L190) + +## Properties + +### maxAgeMs? + +```ts +optional maxAgeMs?: number; +``` + +Defined in: [src/build.ts:192](https://github.com/enixCode/light-runner/blob/main/src/build.ts#L192) diff --git a/website/content/docs/api/interfaces/CleanupNetworkOptions.md b/website/content/docs/api/interfaces/CleanupNetworkOptions.md new file mode 100644 index 0000000..28eaa95 --- /dev/null +++ b/website/content/docs/api/interfaces/CleanupNetworkOptions.md @@ -0,0 +1,31 @@ +--- +title: "CleanupNetworkOptions" +--- + +Defined in: [src/network.ts:47](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L47) + +## Properties + +### maxAgeMs? + +```ts +optional maxAgeMs?: number; +``` + +Defined in: [src/network.ts:55](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L55) + +Skip networks created within this many milliseconds. Default 30 minutes. +This is the race protection: a network just created by a concurrent run +whose container has not yet attached is preserved. + +*** + +### prefix? + +```ts +optional prefix?: string; +``` + +Defined in: [src/network.ts:49](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L49) + +Only consider networks whose name starts with this prefix. Defaults to `light-runner-`. diff --git a/website/content/docs/api/interfaces/CreateNetworkOptions.md b/website/content/docs/api/interfaces/CreateNetworkOptions.md new file mode 100644 index 0000000..81765b8 --- /dev/null +++ b/website/content/docs/api/interfaces/CreateNetworkOptions.md @@ -0,0 +1,101 @@ +--- +title: "CreateNetworkOptions" +--- + +Defined in: [src/network.ts:11](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L11) + +## Properties + +### driver? + +```ts +optional driver?: "bridge"; +``` + +Defined in: [src/network.ts:13](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L13) + +Docker network driver. Defaults to 'bridge'. + +*** + +### exclusive? + +```ts +optional exclusive?: boolean; +``` + +Defined in: [src/network.ts:24](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L24) + +When true, fail (return false) if the network already exists. Default +false = idempotent: returns true whether we created it or it already +existed. + +*** + +### iccEnabled? + +```ts +optional iccEnabled?: boolean; +``` + +Defined in: [src/network.ts:18](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L18) + +Inter-container communication. Defaults to false: containers attached +to the network cannot reach each other. Only honored for bridge driver. + +*** + +### ipam? + +```ts +optional ipam?: { + gateway?: string; + ipRange?: string; + subnet?: string; +}; +``` + +Defined in: [src/network.ts:33](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L33) + +Explicit IPAM (IP Address Management) config. When omitted, Docker +auto-assigns a subnet from its default pool. Pass this to let a higher +layer (typically light-process) allocate a specific subnet per run from +a CGNAT pool or any other range. + +#### gateway? + +```ts +optional gateway?: string; +``` + +Gateway IP. Docker picks the first usable address when omitted. + +#### ipRange? + +```ts +optional ipRange?: string; +``` + +Optional sub-range within `subnet` where Docker is allowed to +auto-assign IPs. Outside this range stays reserved for static +assignment. Rare. + +#### subnet? + +```ts +optional subnet?: string; +``` + +CIDR de la plage IP du réseau, ex: '100.64.42.0/24'. + +*** + +### labels? + +```ts +optional labels?: Record; +``` + +Defined in: [src/network.ts:26](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L26) + +Optional Docker labels (helpful for downstream tooling / cleanup). diff --git a/website/content/docs/api/interfaces/ExtractResult.md b/website/content/docs/api/interfaces/ExtractResult.md new file mode 100644 index 0000000..d9af207 --- /dev/null +++ b/website/content/docs/api/interfaces/ExtractResult.md @@ -0,0 +1,55 @@ +--- +title: "ExtractResult" +--- + +Defined in: [src/types.ts:28](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L28) + +## Properties + +### bytes? + +```ts +optional bytes?: number; +``` + +Defined in: [src/types.ts:33](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L33) + +*** + +### error? + +```ts +optional error?: string; +``` + +Defined in: [src/types.ts:32](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L32) + +*** + +### from + +```ts +from: string; +``` + +Defined in: [src/types.ts:29](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L29) + +*** + +### status + +```ts +status: "ok" | "error" | "missing"; +``` + +Defined in: [src/types.ts:31](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L31) + +*** + +### to + +```ts +to: string; +``` + +Defined in: [src/types.ts:30](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L30) diff --git a/website/content/docs/api/interfaces/ExtractSpec.md b/website/content/docs/api/interfaces/ExtractSpec.md new file mode 100644 index 0000000..7000a17 --- /dev/null +++ b/website/content/docs/api/interfaces/ExtractSpec.md @@ -0,0 +1,25 @@ +--- +title: "ExtractSpec" +--- + +Defined in: [src/types.ts:11](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L11) + +## Properties + +### from + +```ts +from: string; +``` + +Defined in: [src/types.ts:16](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L16) + +*** + +### to + +```ts +to: string; +``` + +Defined in: [src/types.ts:25](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L25) diff --git a/website/content/docs/api/interfaces/RunRequest.md b/website/content/docs/api/interfaces/RunRequest.md new file mode 100644 index 0000000..68379ef --- /dev/null +++ b/website/content/docs/api/interfaces/RunRequest.md @@ -0,0 +1,145 @@ +--- +title: "RunRequest" +--- + +Defined in: [src/types.ts:36](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L36) + +## Properties + +### detached? + +```ts +optional detached?: boolean; +``` + +Defined in: [src/types.ts:110](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L110) + +*** + +### dir? + +```ts +optional dir?: string; +``` + +Defined in: [src/types.ts:67](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L67) + +*** + +### entrypoint? + +```ts +optional entrypoint?: string; +``` + +Defined in: [src/types.ts:39](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L39) + +*** + +### env? + +```ts +optional env?: Record; +``` + +Defined in: [src/types.ts:87](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L87) + +*** + +### extract? + +```ts +optional extract?: ExtractSpec[]; +``` + +Defined in: [src/types.ts:97](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L97) + +*** + +### image + +```ts +image: string; +``` + +Defined in: [src/types.ts:37](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L37) + +*** + +### input? + +```ts +optional input?: unknown; +``` + +Defined in: [src/types.ts:71](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L71) + +*** + +### networks? + +```ts +optional networks?: string[]; +``` + +Defined in: [src/types.ts:85](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L85) + +*** + +### onLog? + +```ts +optional onLog?: (line) => void; +``` + +Defined in: [src/types.ts:91](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L91) + +#### Parameters + +##### line + +`string` + +#### Returns + +`void` + +*** + +### run? + +```ts +optional run?: string[]; +``` + +Defined in: [src/types.ts:60](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L60) + +*** + +### signal? + +```ts +optional signal?: AbortSignal; +``` + +Defined in: [src/types.ts:90](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L90) + +*** + +### timeout? + +```ts +optional timeout?: number; +``` + +Defined in: [src/types.ts:73](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L73) + +*** + +### workdir? + +```ts +optional workdir?: string; +``` + +Defined in: [src/types.ts:89](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L89) diff --git a/website/content/docs/api/interfaces/RunResult.md b/website/content/docs/api/interfaces/RunResult.md new file mode 100644 index 0000000..b93bad2 --- /dev/null +++ b/website/content/docs/api/interfaces/RunResult.md @@ -0,0 +1,57 @@ +--- +title: "RunResult" +--- + +Defined in: [src/types.ts:113](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L113) + +## Properties + +### cancelled + +```ts +cancelled: boolean; +``` + +Defined in: [src/types.ts:117](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L117) + +*** + +### duration + +```ts +duration: number; +``` + +Defined in: [src/types.ts:116](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L116) + +*** + +### exitCode + +```ts +exitCode: number; +``` + +Defined in: [src/types.ts:115](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L115) + +*** + +### extracted? + +```ts +optional extracted?: ExtractResult[]; +``` + +Defined in: [src/types.ts:119](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L119) + +Status of each requested extract. Present only if `extract` was set. + +*** + +### success + +```ts +success: boolean; +``` + +Defined in: [src/types.ts:114](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L114) diff --git a/website/content/docs/api/interfaces/RunState.md b/website/content/docs/api/interfaces/RunState.md new file mode 100644 index 0000000..802482e --- /dev/null +++ b/website/content/docs/api/interfaces/RunState.md @@ -0,0 +1,145 @@ +--- +title: "RunState" +--- + +Defined in: [src/state.ts:8](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L8) + +## Properties + +### cancelled? + +```ts +optional cancelled?: boolean; +``` + +Defined in: [src/state.ts:27](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L27) + +*** + +### container + +```ts +container: string; +``` + +Defined in: [src/state.ts:10](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L10) + +*** + +### durationMs? + +```ts +optional durationMs?: number; +``` + +Defined in: [src/state.ts:21](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L21) + +*** + +### entrypoint? + +```ts +optional entrypoint?: string; +``` + +Defined in: [src/state.ts:14](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L14) + +*** + +### exitCode? + +```ts +optional exitCode?: number; +``` + +Defined in: [src/state.ts:20](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L20) + +*** + +### extract? + +```ts +optional extract?: ExtractSpec[]; +``` + +Defined in: [src/state.ts:16](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L16) + +*** + +### finishedAt? + +```ts +optional finishedAt?: string; +``` + +Defined in: [src/state.ts:18](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L18) + +*** + +### id + +```ts +id: string; +``` + +Defined in: [src/state.ts:9](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L9) + +*** + +### image + +```ts +image: string; +``` + +Defined in: [src/state.ts:12](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L12) + +*** + +### startedAt + +```ts +startedAt: string; +``` + +Defined in: [src/state.ts:17](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L17) + +*** + +### status + +```ts +status: "running" | "exited" | "cancelled" | "failed"; +``` + +Defined in: [src/state.ts:19](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L19) + +*** + +### timeout? + +```ts +optional timeout?: number; +``` + +Defined in: [src/state.ts:15](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L15) + +*** + +### volume + +```ts +volume: string; +``` + +Defined in: [src/state.ts:11](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L11) + +*** + +### workdir + +```ts +workdir: string; +``` + +Defined in: [src/state.ts:13](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L13) diff --git a/website/content/docs/api/interfaces/RunnerOptions.md b/website/content/docs/api/interfaces/RunnerOptions.md new file mode 100644 index 0000000..68cff2e --- /dev/null +++ b/website/content/docs/api/interfaces/RunnerOptions.md @@ -0,0 +1,55 @@ +--- +title: "RunnerOptions" +--- + +Defined in: [src/types.ts:3](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L3) + +## Properties + +### cpus? + +```ts +optional cpus?: string; +``` + +Defined in: [src/types.ts:5](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L5) + +*** + +### gpus? + +```ts +optional gpus?: string | number; +``` + +Defined in: [src/types.ts:7](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L7) + +*** + +### memory? + +```ts +optional memory?: string; +``` + +Defined in: [src/types.ts:4](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L4) + +*** + +### noNewPrivileges? + +```ts +optional noNewPrivileges?: boolean; +``` + +Defined in: [src/types.ts:8](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L8) + +*** + +### runtime? + +```ts +optional runtime?: Runtime; +``` + +Defined in: [src/types.ts:6](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L6) diff --git a/website/content/docs/api/interfaces/StopOptions.md b/website/content/docs/api/interfaces/StopOptions.md new file mode 100644 index 0000000..7c7e8a6 --- /dev/null +++ b/website/content/docs/api/interfaces/StopOptions.md @@ -0,0 +1,25 @@ +--- +title: "StopOptions" +--- + +Defined in: [src/Execution.ts:4](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L4) + +## Properties + +### grace? + +```ts +optional grace?: number; +``` + +Defined in: [src/Execution.ts:14](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L14) + +*** + +### signal? + +```ts +optional signal?: string; +``` + +Defined in: [src/Execution.ts:9](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L9) diff --git a/website/content/docs/api/meta.json b/website/content/docs/api/meta.json new file mode 100644 index 0000000..d9d9469 --- /dev/null +++ b/website/content/docs/api/meta.json @@ -0,0 +1,4 @@ +{ + "title": "API reference", + "pages": ["index", "classes", "interfaces", "functions", "type-aliases"] +} diff --git a/website/content/docs/api/type-aliases/LightRunnerErrorCode.md b/website/content/docs/api/type-aliases/LightRunnerErrorCode.md new file mode 100644 index 0000000..ab52fbb --- /dev/null +++ b/website/content/docs/api/type-aliases/LightRunnerErrorCode.md @@ -0,0 +1,17 @@ +--- +title: "LightRunnerErrorCode" +--- + +```ts +type LightRunnerErrorCode = + | "DOCKER_UNREACHABLE" + | "VOLUME_CREATE_FAILED" + | "CONTAINER_START_FAILED" + | "SEED_FAILED" + | "EXTRACT_FAILED" + | "BUILD_FAILED" + | "INVALID_RUN_STEP" + | "NETWORK_CONNECT_FAILED"; +``` + +Defined in: [src/errors.ts:1](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L1) diff --git a/website/content/docs/api/type-aliases/Runtime.md b/website/content/docs/api/type-aliases/Runtime.md new file mode 100644 index 0000000..f489a92 --- /dev/null +++ b/website/content/docs/api/type-aliases/Runtime.md @@ -0,0 +1,9 @@ +--- +title: "Runtime" +--- + +```ts +type Runtime = "runc" | "runsc" | "kata"; +``` + +Defined in: [src/types.ts:1](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L1) diff --git a/website/content/docs/index.mdx b/website/content/docs/index.mdx index 4182167..b3f5374 100644 --- a/website/content/docs/index.mdx +++ b/website/content/docs/index.mdx @@ -17,12 +17,20 @@ npm install light-runner import { DockerRunner } from 'light-runner'; const runner = new DockerRunner(); -const exec = runner.run({ - image: 'node:20-alpine', - entrypoint: 'node -e "console.log(1 + 1)"', + +const execution = runner.run({ + image: 'python:3.12-alpine', + entrypoint: 'python main.py', // shell command, run via `sh -c` (there is no `command` field) + dir: './my-project', // host folder copied into the container workdir + input: { task: 'compute', n: 20 }, // any JSON value, piped to stdin + timeout: 30_000, + extract: [{ from: '/app/result.json', to: './out' }], + // detached: true, // decouple from the launcher, resume later with DockerRunner.attach(id) + // networks: ['my-net'], // attach to one or more existing networks }); -const result = await exec.result; -console.log(result.exitCode); // 0 + +const result = await execution.result; +console.log(result.exitCode, result.extracted); ``` Start with the [Quick start](/docs/quickstart), then explore [Extract files](/docs/extract), [Detached runs](/docs/detached), the [Security model](/docs/security), and [gVisor & Kata](/docs/gvisor-kata). diff --git a/website/content/docs/meta.json b/website/content/docs/meta.json index 5c4b662..6266cb6 100644 --- a/website/content/docs/meta.json +++ b/website/content/docs/meta.json @@ -1,3 +1,3 @@ { - "pages": ["index", "quickstart", "extract", "detached", "security", "gvisor-kata"] + "pages": ["index", "quickstart", "extract", "detached", "security", "gvisor-kata", "api"] } diff --git a/website/src/app/global.css b/website/src/app/global.css index f86f3c9..9d6bf67 100644 --- a/website/src/app/global.css +++ b/website/src/app/global.css @@ -10,3 +10,18 @@ html > body[data-scroll-locked] { margin-right: 0px !important; --removed-body-scroll-bar-size: 0px !important; } + +/* + * Accent aligned with the light-process docs palette: Tailwind blue-600 on + * the neutral gray scale (the `neutral` preset above). Overrides win because + * they come after the preset @imports. + */ +:root { + --color-fd-primary: hsl(221, 83%, 53%); /* blue-600 */ + --color-fd-primary-foreground: hsl(0, 0%, 100%); +} + +.dark { + --color-fd-primary: hsl(213, 94%, 68%); /* blue-400, lighter for dark contrast */ + --color-fd-primary-foreground: hsl(222, 47%, 11%); +} From c51f51d0b131dfbe0a4940b98df6019af1e0ac12 Mon Sep 17 00:00:00 2001 From: enixCode <58286681+enixCode@users.noreply.github.com> Date: Sat, 30 May 2026 01:33:21 +0200 Subject: [PATCH 04/10] fix(fumadocs): rewrite typedoc API cross-links to extensionless routes typedoc-plugin-markdown emits relative `.md` cross-links (e.g. `../interfaces/RunRequest.md`); Fumadocs routes have no `.md`, so clicking them 404s. gen-fumadocs-api.mjs now rewrites internal `.md` links to absolute Fumadocs routes (`/docs/api/interfaces/RunRequest`), preserving anchors and leaving external https links untouched. Rebuild stays green (93 pages). build with cc --- scripts/gen-fumadocs-api.mjs | 16 ++++++- .../content/docs/api/classes/DockerRunner.md | 14 +++--- website/content/docs/api/classes/Execution.md | 4 +- .../api/functions/cleanupOrphanNetworks.md | 2 +- .../docs/api/functions/createNetwork.md | 2 +- .../content/docs/api/functions/listStates.md | 2 +- .../content/docs/api/functions/readState.md | 2 +- website/content/docs/api/index.md | 44 +++++++++---------- website/content/docs/api/meta.json | 4 -- 9 files changed, 50 insertions(+), 40 deletions(-) delete mode 100644 website/content/docs/api/meta.json diff --git a/scripts/gen-fumadocs-api.mjs b/scripts/gen-fumadocs-api.mjs index 0210d70..66816a8 100644 --- a/scripts/gen-fumadocs-api.mjs +++ b/scripts/gen-fumadocs-api.mjs @@ -28,6 +28,18 @@ function clean(h1) { .trim(); } +function fixLinks(text, currentDir) { + // Rewrite typedoc's relative `.md` cross-links to extensionless Fumadocs + // routes, e.g. `../interfaces/RunRequest.md#x` -> `/docs/api/interfaces/RunRequest#x`. + // Fumadocs routes have no `.md`, so the raw typedoc links 404. + return text.replace(/\]\(([^)#\s]+\.md)(#[^)]*)?\)/g, (m, relPath, anchor) => { + if (/^https?:\/\//.test(relPath)) return m; + const resolved = path.posix.normalize(path.posix.join(currentDir, relPath)).replace(/\.md$/, ''); + const route = resolved === 'index' ? '/docs/api' : `/docs/api/${resolved}`; + return `](${route}${anchor ?? ''})`; + }); +} + function rewrite(file) { const rel = path.relative(ROOT, file).replace(/\\/g, '/'); const lines = fs.readFileSync(file, 'utf8').split(/\r?\n/); @@ -40,8 +52,10 @@ function rewrite(file) { let body = h1Idx >= 0 ? lines.slice(h1Idx + 1) : lines; while (body.length && body[0].trim() === '') body.shift(); + const dir = path.posix.dirname(rel); + const fixed = fixLinks(body.join('\n'), dir === '.' ? '' : dir); const safe = title.replace(/"/g, '\\"'); - fs.writeFileSync(file, `---\ntitle: "${safe}"\n---\n\n${body.join('\n').trimEnd()}\n`, 'utf8'); + fs.writeFileSync(file, `---\ntitle: "${safe}"\n---\n\n${fixed.trimEnd()}\n`, 'utf8'); } function walk(dir) { diff --git a/website/content/docs/api/classes/DockerRunner.md b/website/content/docs/api/classes/DockerRunner.md index 65db8fd..5d03940 100644 --- a/website/content/docs/api/classes/DockerRunner.md +++ b/website/content/docs/api/classes/DockerRunner.md @@ -18,7 +18,7 @@ Defined in: [src/DockerRunner.ts:19](https://github.com/enixCode/light-runner/bl ##### options? -[`RunnerOptions`](../interfaces/RunnerOptions.md) = `{}` +[`RunnerOptions`](/docs/api/interfaces/RunnerOptions) = `{}` #### Returns @@ -38,11 +38,11 @@ Defined in: [src/DockerRunner.ts:29](https://github.com/enixCode/light-runner/bl ##### request -[`RunRequest`](../interfaces/RunRequest.md) +[`RunRequest`](/docs/api/interfaces/RunRequest) #### Returns -[`Execution`](Execution.md) +[`Execution`](/docs/api/classes/Execution) *** @@ -62,7 +62,7 @@ Defined in: [src/DockerRunner.ts:142](https://github.com/enixCode/light-runner/b #### Returns -[`Execution`](Execution.md) \| `null` +[`Execution`](/docs/api/classes/Execution) \| `null` *** @@ -98,7 +98,7 @@ Defined in: [src/DockerRunner.ts:122](https://github.com/enixCode/light-runner/b ##### opts? -[`CleanupCacheOptions`](../interfaces/CleanupCacheOptions.md) = `{}` +[`CleanupCacheOptions`](/docs/api/interfaces/CleanupCacheOptions) = `{}` #### Returns @@ -118,7 +118,7 @@ Defined in: [src/DockerRunner.ts:133](https://github.com/enixCode/light-runner/b ##### opts? -[`CleanupNetworkOptions`](../interfaces/CleanupNetworkOptions.md) = `{}` +[`CleanupNetworkOptions`](/docs/api/interfaces/CleanupNetworkOptions) = `{}` #### Returns @@ -178,7 +178,7 @@ Defined in: [src/DockerRunner.ts:146](https://github.com/enixCode/light-runner/b #### Returns -[`RunState`](../interfaces/RunState.md)[] +[`RunState`](/docs/api/interfaces/RunState)[] *** diff --git a/website/content/docs/api/classes/Execution.md b/website/content/docs/api/classes/Execution.md index 414f194..aae57a0 100644 --- a/website/content/docs/api/classes/Execution.md +++ b/website/content/docs/api/classes/Execution.md @@ -25,7 +25,7 @@ Defined in: [src/Execution.ts:22](https://github.com/enixCode/light-runner/blob/ ##### result -`Promise`\<[`RunResult`](../interfaces/RunResult.md)\> +`Promise`\<[`RunResult`](/docs/api/interfaces/RunResult)\> ##### onCancel @@ -127,7 +127,7 @@ Defined in: [src/Execution.ts:54](https://github.com/enixCode/light-runner/blob/ ##### options? -[`StopOptions`](../interfaces/StopOptions.md) = `{}` +[`StopOptions`](/docs/api/interfaces/StopOptions) = `{}` #### Returns diff --git a/website/content/docs/api/functions/cleanupOrphanNetworks.md b/website/content/docs/api/functions/cleanupOrphanNetworks.md index c6c04a2..7104cf8 100644 --- a/website/content/docs/api/functions/cleanupOrphanNetworks.md +++ b/website/content/docs/api/functions/cleanupOrphanNetworks.md @@ -12,7 +12,7 @@ Defined in: [src/network.ts:213](https://github.com/enixCode/light-runner/blob/m ### opts? -[`CleanupNetworkOptions`](../interfaces/CleanupNetworkOptions.md) = `{}` +[`CleanupNetworkOptions`](/docs/api/interfaces/CleanupNetworkOptions) = `{}` ## Returns diff --git a/website/content/docs/api/functions/createNetwork.md b/website/content/docs/api/functions/createNetwork.md index 6d7a4d5..a16ba9b 100644 --- a/website/content/docs/api/functions/createNetwork.md +++ b/website/content/docs/api/functions/createNetwork.md @@ -16,7 +16,7 @@ Defined in: [src/network.ts:69](https://github.com/enixCode/light-runner/blob/ma ### opts? -[`CreateNetworkOptions`](../interfaces/CreateNetworkOptions.md) = `{}` +[`CreateNetworkOptions`](/docs/api/interfaces/CreateNetworkOptions) = `{}` ## Returns diff --git a/website/content/docs/api/functions/listStates.md b/website/content/docs/api/functions/listStates.md index 2419885..cdb2981 100644 --- a/website/content/docs/api/functions/listStates.md +++ b/website/content/docs/api/functions/listStates.md @@ -10,4 +10,4 @@ Defined in: [src/state.ts:56](https://github.com/enixCode/light-runner/blob/main ## Returns -[`RunState`](../interfaces/RunState.md)[] +[`RunState`](/docs/api/interfaces/RunState)[] diff --git a/website/content/docs/api/functions/readState.md b/website/content/docs/api/functions/readState.md index 428b4bd..b3e1dbb 100644 --- a/website/content/docs/api/functions/readState.md +++ b/website/content/docs/api/functions/readState.md @@ -16,4 +16,4 @@ Defined in: [src/state.ts:46](https://github.com/enixCode/light-runner/blob/main ## Returns -[`RunState`](../interfaces/RunState.md) \| `null` +[`RunState`](/docs/api/interfaces/RunState) \| `null` diff --git a/website/content/docs/api/index.md b/website/content/docs/api/index.md index 6cc5fbe..8f56efc 100644 --- a/website/content/docs/api/index.md +++ b/website/content/docs/api/index.md @@ -4,34 +4,34 @@ title: "API reference" ## Classes -- [DockerRunner](classes/DockerRunner.md) -- [Execution](classes/Execution.md) -- [LightRunnerError](classes/LightRunnerError.md) +- [DockerRunner](/docs/api/classes/DockerRunner) +- [Execution](/docs/api/classes/Execution) +- [LightRunnerError](/docs/api/classes/LightRunnerError) ## Interfaces -- [CleanupCacheOptions](interfaces/CleanupCacheOptions.md) -- [CleanupNetworkOptions](interfaces/CleanupNetworkOptions.md) -- [CreateNetworkOptions](interfaces/CreateNetworkOptions.md) -- [ExtractResult](interfaces/ExtractResult.md) -- [ExtractSpec](interfaces/ExtractSpec.md) -- [RunnerOptions](interfaces/RunnerOptions.md) -- [RunRequest](interfaces/RunRequest.md) -- [RunResult](interfaces/RunResult.md) -- [RunState](interfaces/RunState.md) -- [StopOptions](interfaces/StopOptions.md) +- [CleanupCacheOptions](/docs/api/interfaces/CleanupCacheOptions) +- [CleanupNetworkOptions](/docs/api/interfaces/CleanupNetworkOptions) +- [CreateNetworkOptions](/docs/api/interfaces/CreateNetworkOptions) +- [ExtractResult](/docs/api/interfaces/ExtractResult) +- [ExtractSpec](/docs/api/interfaces/ExtractSpec) +- [RunnerOptions](/docs/api/interfaces/RunnerOptions) +- [RunRequest](/docs/api/interfaces/RunRequest) +- [RunResult](/docs/api/interfaces/RunResult) +- [RunState](/docs/api/interfaces/RunState) +- [StopOptions](/docs/api/interfaces/StopOptions) ## Type Aliases -- [LightRunnerErrorCode](type-aliases/LightRunnerErrorCode.md) -- [Runtime](type-aliases/Runtime.md) +- [LightRunnerErrorCode](/docs/api/type-aliases/LightRunnerErrorCode) +- [Runtime](/docs/api/type-aliases/Runtime) ## Functions -- [cleanupOrphanNetworks](functions/cleanupOrphanNetworks.md) -- [connectNetwork](functions/connectNetwork.md) -- [createNetwork](functions/createNetwork.md) -- [deleteNetwork](functions/deleteNetwork.md) -- [listStates](functions/listStates.md) -- [networkExists](functions/networkExists.md) -- [readState](functions/readState.md) +- [cleanupOrphanNetworks](/docs/api/functions/cleanupOrphanNetworks) +- [connectNetwork](/docs/api/functions/connectNetwork) +- [createNetwork](/docs/api/functions/createNetwork) +- [deleteNetwork](/docs/api/functions/deleteNetwork) +- [listStates](/docs/api/functions/listStates) +- [networkExists](/docs/api/functions/networkExists) +- [readState](/docs/api/functions/readState) diff --git a/website/content/docs/api/meta.json b/website/content/docs/api/meta.json deleted file mode 100644 index d9d9469..0000000 --- a/website/content/docs/api/meta.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "title": "API reference", - "pages": ["index", "classes", "interfaces", "functions", "type-aliases"] -} From 48629ad99bb03954d237a75c95d9a58a73b00e17 Mon Sep 17 00:00:00 2001 From: enixCode <58286681+enixCode@users.noreply.github.com> Date: Sat, 30 May 2026 01:34:58 +0200 Subject: [PATCH 05/10] fix(fumadocs): regenerate API group meta.json in the gen script typedoc cleans its output dir on every run, deleting the hand-written content/docs/api/meta.json. gen-fumadocs-api.mjs now rewrites it after generation, so the API-reference group title and ordering survive a regen. build with cc --- scripts/gen-fumadocs-api.mjs | 13 +++++++++++++ website/content/docs/api/meta.json | 10 ++++++++++ 2 files changed, 23 insertions(+) create mode 100644 website/content/docs/api/meta.json diff --git a/scripts/gen-fumadocs-api.mjs b/scripts/gen-fumadocs-api.mjs index 66816a8..b5d8e04 100644 --- a/scripts/gen-fumadocs-api.mjs +++ b/scripts/gen-fumadocs-api.mjs @@ -67,4 +67,17 @@ function walk(dir) { } walk(ROOT); + +// typedoc's cleanOutputDir wipes the folder on every run, so (re)write the +// Fumadocs group meta here rather than keeping it as a static file. +fs.writeFileSync( + path.join(ROOT, 'meta.json'), + `${JSON.stringify( + { title: 'API reference', pages: ['index', 'classes', 'interfaces', 'functions', 'type-aliases'] }, + null, + 2, + )}\n`, + 'utf8', +); + console.log('Fumadocs API reference regenerated.'); diff --git a/website/content/docs/api/meta.json b/website/content/docs/api/meta.json new file mode 100644 index 0000000..18de2e6 --- /dev/null +++ b/website/content/docs/api/meta.json @@ -0,0 +1,10 @@ +{ + "title": "API reference", + "pages": [ + "index", + "classes", + "interfaces", + "functions", + "type-aliases" + ] +} From dfe34a91a2838cca0a0acc9f8fe758b037e7ac0d Mon Sep 17 00:00:00 2001 From: enixCode <58286681+enixCode@users.noreply.github.com> Date: Sat, 30 May 2026 07:26:32 +0200 Subject: [PATCH 06/10] docs(fumadocs): landing page and correct app name - Replace the scaffold placeholder home with a real landing (hero, primitives, quick start, security model, ecosystem, footer) on the blue/gray theme. - Set appName to light-runner and gitConfig to enixCode/light-runner (was the scaffold default My App / fuma-nama-fumadocs). - Add root metadata (title, description, metadataBase), which also clears the build metadataBase warning. build with cc --- website/src/app/(home)/page.tsx | 216 ++++++++++++++++++++++++++++++-- website/src/app/layout.tsx | 9 ++ website/src/lib/shared.ts | 6 +- 3 files changed, 218 insertions(+), 13 deletions(-) diff --git a/website/src/app/(home)/page.tsx b/website/src/app/(home)/page.tsx index c936084..970bd1e 100644 --- a/website/src/app/(home)/page.tsx +++ b/website/src/app/(home)/page.tsx @@ -1,16 +1,212 @@ import Link from 'next/link'; -export default function HomePage() { +const primitives = [ + { + num: '01 / isolated', + title: 'Your code runs in its own cell.', + body: 'Every run gets a fresh container, its own volume, its own network. Nothing leaks in from the host, nothing leaks out to sibling runs. Torn down on exit, success or not.', + }, + { + num: '02 / drop in, pull out', + title: 'Send a folder. Get any file back.', + body: 'Point at a directory on your disk, it becomes the container workdir. When the run finishes, ask for any path and it lands back on your host.', + }, + { + num: '03 / stop on demand', + title: 'Cancel, abort, or time out.', + body: 'Pass an AbortSignal, call cancel(), or set a deadline. The container dies and its volume goes with it. No zombie processes, no leaked disk.', + }, + { + num: '04 / any stack', + title: 'Python, Node, Go, Ruby, shell, anything.', + body: 'Any Docker image on your registry or anyone else’s. No special runtime inside the container, no SDK to import, no convention to follow.', + }, +]; + +const security: [string, string][] = [ + ['Kernel permissions', 'Dangerous capabilities stripped at startup: raw sockets, device creation, chroot escapes, capability juggling, audit-log spoofing. Every run, unconditionally.'], + ['No privilege escalation', 'A setuid binary inside your container cannot elevate above the user it starts as.'], + ['Fork-bomb protection', 'Max 100 processes per container. A runaway loop caps out in milliseconds.'], + ['Memory and CPU budget', '512 MiB and one core by default, cgroup-enforced. Tunable per runner.'], + ['Network isolation', 'Isolated bridge by default with inter-container traffic blocked. Use networks: [‘none’] to sever it entirely.'], + ['Host filesystem', 'Symlinks in your input folder are filtered before seeding, so a stray link cannot reach back into the host.'], + ['Safe extraction', 'Paths escaping upward (..) are refused; each extracted entry is capped at 1 GiB.'], + ['Kernel-level hardening', 'Swap the runtime to gVisor with one option for user-space syscall interception.'], +]; + +const ecosystem = [ + { + name: 'light-runner', + tag: 'this library', + title: 'Spawn one container, return exit code and files.', + body: 'The execution primitive. Domain-agnostic. Zero orchestration. The other two tools call down to this one.', + }, + { + name: 'light-run', + tag: 'HTTP', + title: 'CLI and HTTP surface around light-runner.', + body: 'Point a POST endpoint at it, pipe bodies through, get results back. Stateless wrapper, same defaults, same guarantees.', + }, + { + name: 'light-process', + tag: 'DAG', + title: 'DAG orchestration, retries, fan-out.', + body: 'Composes runs into pipelines with backoff, concurrency limits, and structured outputs.', + }, +]; + +const code = `import { DockerRunner } from 'light-runner'; + +const runner = new DockerRunner({ memory: '512m', cpus: '1' }); + +const execution = runner.run({ + image: 'python:3.12-alpine', + entrypoint: 'python main.py', + dir: './my-project', + input: { task: 'compute', n: 20 }, + timeout: 30_000, + extract: [{ from: '/app/result.json', to: './out' }], +}); + +const result = await execution.result; +result.success; // true if exit 0 and not cancelled +result.exitCode; // the container exit code +result.extracted; // [{ from, to, status, bytes }]`; + +function Label({ children }: { children: React.ReactNode }) { return ( -
-

Hello World

-

- You can open{' '} - - /docs - {' '} - and see the documentation. -

+
+ {children}
); } + +export default function HomePage() { + return ( +
+ {/* Hero */} +
+

+ Execution primitive, Node.js +

+

+ Run untrusted code in hardened containers. +

+

+ A single-purpose Node.js library that runs your code in a container it tears down + afterwards, and hands you back the exit code, logs, and any files you asked for. Nothing + else. +

+
+ + Quick start + + + API reference + + + GitHub + +
+
+ npm install light-runner +
+
+ + {/* Primitives */} +
+ +

+ Give it code. Get back an exit code, logs, and the + files you asked for. +

+
+ {primitives.map((p) => ( +
+
{p.num}
+

{p.title}

+

{p.body}

+
+ ))} +
+
+ + {/* Quick start */} +
+ +

+ A few lines to run, one to get your artefact. +

+
+          {code}
+        
+
+ + {/* Security */} +
+ +

+ Hardened defaults, never opt-out. Add more + restrictions, never fewer. +

+
+ {security.map(([k, v]) => ( +
+
{k}
+
{v}
+
+ ))} +
+

+ Does not cover kernel exploits, runc CVEs, or side-channel attacks. For genuinely hostile + code, combine with the gVisor (runsc) or Kata runtimes. +

+
+ + {/* Ecosystem */} +
+ +

+ Three tools. Each does one thing. +

+
+ {ecosystem.map((e) => ( +
+
+ {e.name} + + {e.tag} + +
+

{e.title}

+

{e.body}

+
+ ))} +
+
+ + {/* Footer */} +
+
+ light-runner / execution primitive + +
+
+
+ ); +} diff --git a/website/src/app/layout.tsx b/website/src/app/layout.tsx index fffc0a5..c092ccd 100644 --- a/website/src/app/layout.tsx +++ b/website/src/app/layout.tsx @@ -6,6 +6,15 @@ const inter = Inter({ subsets: ['latin'], }); +export const metadata = { + metadataBase: new URL('https://enixcode.github.io/light-runner'), + title: { + default: 'light-runner', + template: '%s | light-runner', + }, + description: 'Run untrusted code in hardened Docker containers from Node.js.', +}; + export default function Layout({ children }: LayoutProps<'/'>) { return ( diff --git a/website/src/lib/shared.ts b/website/src/lib/shared.ts index 812926e..8d8d18d 100644 --- a/website/src/lib/shared.ts +++ b/website/src/lib/shared.ts @@ -1,11 +1,11 @@ -export const appName = 'My App'; +export const appName = 'light-runner'; export const docsRoute = '/docs'; export const docsImageRoute = '/og/docs'; export const docsContentRoute = '/llms.mdx/docs'; // fill this with your actual GitHub info, for example: export const gitConfig = { - user: 'fuma-nama', - repo: 'fumadocs', + user: 'enixCode', + repo: 'light-runner', branch: 'main', }; From 02c38f770f90f0896367bee76583eda5596a8661 Mon Sep 17 00:00:00 2001 From: enixCode <58286681+enixCode@users.noreply.github.com> Date: Sat, 30 May 2026 07:29:21 +0200 Subject: [PATCH 07/10] docs(fumadocs): make llms.txt spec-compliant The default Fumadocs llms.txt emits `# Docs` with root-relative links. Per the llmstxt.org spec, set the H1 to the project name, add a blockquote summary, and rewrite links to absolute deployed URLs (domain + basePath) so they are followable. build with cc --- website/src/app/llms.txt/route.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/website/src/app/llms.txt/route.ts b/website/src/app/llms.txt/route.ts index fc80cb6..f1fc274 100644 --- a/website/src/app/llms.txt/route.ts +++ b/website/src/app/llms.txt/route.ts @@ -3,6 +3,25 @@ import { llms } from 'fumadocs-core/source'; export const revalidate = false; +// Deployed site root (domain + basePath). Page urls from the source are +// root-relative (`/docs/...`), so prefixing with this yields absolute, +// followable URLs as the llms.txt spec recommends. +const SITE = 'https://enixcode.github.io/light-runner'; + +const SUMMARY = + 'Run untrusted code in hardened Docker containers from Node.js. A single-purpose ' + + 'library: spawn one container, get back the exit code, logs, and any files you ask ' + + 'for. Domain-agnostic, secure by default.'; + export function GET() { - return new Response(llms(source).index()); + const body = llms(source) + .index() + // Spec: the H1 is the project name, followed by an optional blockquote summary. + .replace(/^# Docs\n*/, `# light-runner\n\n> ${SUMMARY}\n\n## Docs\n\n`) + // Make every internal link an absolute, deployed URL. + .replace(/\]\((\/[^)]+)\)/g, `](${SITE}$1)`); + + return new Response(body, { + headers: { 'Content-Type': 'text/markdown; charset=utf-8' }, + }); } From d7e07aa586392aa482907038f08fdf6a0a6a418b Mon Sep 17 00:00:00 2001 From: enixCode <58286681+enixCode@users.noreply.github.com> Date: Sat, 30 May 2026 08:30:59 +0200 Subject: [PATCH 08/10] docs(fumadocs): restore the bespoke landing page Port the original VitePress landing to the Fumadocs home: the dark bespoke design (hero + banner, primitives, code window, security grid, ecosystem, footer) with the Fraunces / JetBrains Mono type, live GitHub version badges, and the copy button. - landing.css: the original bespoke stylesheet, with the three global selectors (code/pre, footer, focus rings) scoped to .bespoke-landing so it cannot leak into the docs pages; Google Fonts imported. - page.tsx: HTML ported to JSX as a client component; the script (GitHub release fetch + copy) ported to a useEffect; the code sample uses dangerouslySetInnerHTML to keep the syntax spans verbatim. - The home route drops Fumadocs HomeLayout chrome to render full-bleed. - Copy banner.webp into website/public. build with cc --- website/public/banner.webp | Bin 0 -> 26938 bytes website/src/app/(home)/landing.css | 607 +++++++++++++++++++++++++++++ website/src/app/(home)/layout.tsx | 7 +- website/src/app/(home)/page.tsx | 594 +++++++++++++++++++--------- 4 files changed, 1009 insertions(+), 199 deletions(-) create mode 100644 website/public/banner.webp create mode 100644 website/src/app/(home)/landing.css diff --git a/website/public/banner.webp b/website/public/banner.webp new file mode 100644 index 0000000000000000000000000000000000000000..a2a08e9d2148c266eabb5f3dea5bb762506ed268 GIT binary patch literal 26938 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 RXEZ!lep7n6@cY3S003FOdYb?M literal 0 HcmV?d00001 diff --git a/website/src/app/(home)/landing.css b/website/src/app/(home)/landing.css new file mode 100644 index 0000000..f06c133 --- /dev/null +++ b/website/src/app/(home)/landing.css @@ -0,0 +1,607 @@ +@import url('https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..500;1,9..144,300..500&family=JetBrains+Mono:wght@400;500&display=swap'); + +.bespoke-landing { + background: var(--ink); + color: var(--paper); + min-height: 100vh; + font-family: 'Fraunces', serif; +} + +/* Bespoke landing styles. Loaded by theme/index.ts. Selectors are mostly class-based (.hero, .prim, etc.) so they only match elements present on the landing page; the few that could collide with VitePress chrome (section, main/header/footer) are scoped to .bespoke-landing / .bespoke-landing-wrap. */ + :root { + --ink: #050608; + --ink-2: #0a0c10; + --ink-3: #12151c; + --line: #1a1d24; + --line-hot: #242933; + --paper: #edeef0; + --paper-dim: #8a8f9a; + --paper-dimmer: #4d525c; + --halo: #c7e8ff; + --halo-soft: #7fddff; + --amber: #ffb855; + --ember: #ff6b35; + } + + + + .bespoke-landing main, .bespoke-landing header, .bespoke-landing footer { position: relative; z-index: 1; } + + /* ---------- typography ---------- */ + + .display { + font-family: 'Fraunces', serif; + font-variation-settings: "SOFT" 50, "WONK" 1; + font-weight: 350; + letter-spacing: -0.02em; + line-height: 1; + } + .label { + font-family: 'JetBrains Mono', monospace; + font-weight: 500; + font-size: 11px; + letter-spacing: 0.22em; + text-transform: uppercase; + color: var(--paper-dim); + } + .label::before { + content: "// "; + color: var(--halo-soft); + } + .bespoke-landing code, .bespoke-landing pre, .bespoke-landing .mono { + font-family: 'JetBrains Mono', monospace; + font-size: 13px; + } + + /* ---------- layout ---------- */ + + .shell { + max-width: 1240px; + margin: 0 auto; + padding: 0 clamp(24px, 5vw, 64px); + } + + /* ---------- top bar ---------- */ + + header.top { + padding: 28px 0 0; + } + .top-row { + display: flex; + align-items: center; + justify-content: space-between; + padding-bottom: 20px; + border-bottom: 1px solid var(--line); + } + .mark { + display: inline-flex; + align-items: center; + gap: 10px; + font-family: 'Fraunces', serif; + font-weight: 400; + font-size: 17px; + letter-spacing: -0.01em; + color: var(--paper); + text-decoration: none; + } + .mark-dot { + width: 10px; height: 10px; + border-radius: 50%; + background: var(--halo); + box-shadow: 0 0 14px var(--halo-soft), 0 0 3px #fff inset; + } + .mark em { + font-style: italic; + font-weight: 300; + color: var(--paper-dim); + font-size: 12px; + margin-left: 6px; + } + nav.top-nav { + display: flex; gap: 28px; + } + nav.top-nav a { + font-size: 12px; + letter-spacing: 0.18em; + text-transform: uppercase; + font-family: 'JetBrains Mono', monospace; + font-weight: 400; + color: var(--paper-dim); + text-decoration: none; + transition: color .2s; + } + nav.top-nav a:hover { color: var(--paper); } + nav.top-nav a:hover::before { content: "› "; color: var(--halo-soft); } + @media (max-width: 720px) { + nav.top-nav a:not(.primary) { display: none; } + } + nav.top-nav a.primary { + color: var(--ink); + background: var(--halo); + padding: 8px 14px; + border-radius: 2px; + } + nav.top-nav a.primary::before { display: none !important; } + + /* ---------- hero ---------- */ + + .bespoke-landing section.hero { + padding: clamp(60px, 10vh, 120px) 0 60px; + display: grid; + grid-template-columns: 1fr; + gap: 60px; + align-items: end; + } + + .hero-headline { max-width: 860px; } + .hero-eyebrow { + display: flex; align-items: center; gap: 14px; + margin-bottom: 32px; + opacity: 0; transform: translateY(8px); + animation: rise .9s .1s forwards cubic-bezier(.2,.7,.2,1); + } + .hero-eyebrow .v { color: var(--halo-soft); font-family: 'JetBrains Mono', monospace; font-size: 11px; letter-spacing: 0.18em; } + .hero-eyebrow .divider { width: 36px; height: 1px; background: var(--line-hot); } + .hero-eyebrow .tag { font-family: 'JetBrains Mono', monospace; font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--paper-dim); } + + h1.display { + font-size: clamp(52px, 9vw, 124px); + opacity: 0; transform: translateY(16px); + animation: rise 1s .15s forwards cubic-bezier(.2,.7,.2,1); + } + h1.display .accent { + font-style: italic; + font-weight: 300; + color: var(--halo); + } + h1.display .shy { + font-style: italic; + font-weight: 300; + color: var(--paper-dim); + } + + .hero-lede { + font-family: 'Fraunces', serif; + font-weight: 300; + font-size: clamp(18px, 2vw, 22px); + line-height: 1.45; + color: var(--paper); + max-width: 640px; + margin-top: 36px; + opacity: 0; transform: translateY(12px); + animation: rise 1s .3s forwards cubic-bezier(.2,.7,.2,1); + } + .hero-lede em { + color: var(--paper-dim); + font-style: italic; + } + + .hero-meta { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); + gap: 24px 48px; + margin-top: 48px; + padding-top: 28px; + border-top: 1px solid var(--line); + opacity: 0; transform: translateY(12px); + animation: rise 1s .45s forwards cubic-bezier(.2,.7,.2,1); + } + .hero-meta .cell { } + .hero-meta .k { font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--paper-dimmer); margin-bottom: 6px; } + .hero-meta .v { font-family: 'Fraunces', serif; font-size: 22px; font-weight: 350; letter-spacing: -0.01em; } + .hero-meta .v .sub { color: var(--paper-dim); font-size: 13px; margin-left: 6px; font-family: 'JetBrains Mono', monospace; letter-spacing: 0; text-transform: none; } + + .hero-banner { + margin-top: clamp(48px, 8vh, 96px); + position: relative; + overflow: hidden; + border: 1px solid var(--line); + border-radius: 2px; + background: #000; + aspect-ratio: 16 / 5; + opacity: 0; transform: translateY(20px); + animation: rise 1.4s .6s forwards cubic-bezier(.2,.7,.2,1); + } + .hero-banner img { + width: 100%; height: 100%; + object-fit: cover; + display: block; + filter: contrast(1.05); + } + .hero-banner::before { + content: ""; + position: absolute; inset: 0; + background: linear-gradient(180deg, transparent 60%, var(--ink) 100%); + pointer-events: none; + } + .hero-banner .corners { + position: absolute; inset: 12px; + pointer-events: none; + } + .hero-banner .corners::before, + .hero-banner .corners::after { + content: ""; + position: absolute; + width: 14px; height: 14px; + border: 1px solid var(--halo-soft); + opacity: .6; + } + .hero-banner .corners::before { top: 0; left: 0; border-right: none; border-bottom: none; } + .hero-banner .corners::after { bottom: 0; right: 0; border-left: none; border-top: none; } + + .hero-banner-caption { + display: flex; justify-content: space-between; + margin-top: 12px; + font-family: 'JetBrains Mono', monospace; + font-size: 10px; + letter-spacing: 0.2em; + color: var(--paper-dimmer); + text-transform: uppercase; + } + + /* ---------- section frame ---------- */ + + .bespoke-landing section { + padding: clamp(80px, 12vh, 140px) 0; + border-top: 1px solid var(--line); + position: relative; + } + .bespoke-landing section .section-head { + display: grid; + grid-template-columns: 160px 1fr; + gap: 48px; + margin-bottom: 64px; + align-items: baseline; + } + .bespoke-landing section .section-head .label { padding-top: 10px; } + .bespoke-landing section h2 { + font-family: 'Fraunces', serif; + font-weight: 350; + font-style: italic; + font-size: clamp(32px, 4.5vw, 56px); + letter-spacing: -0.015em; + line-height: 1.05; + max-width: 820px; + } + .bespoke-landing section h2 .strong { + font-style: normal; + color: var(--halo); + font-variation-settings: "WONK" 1; + } + @media (max-width: 720px) { + .bespoke-landing section .section-head { grid-template-columns: 1fr; gap: 8px; margin-bottom: 36px; } + } + + /* ---------- primitives grid ---------- */ + + .prims { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); + gap: 0; + border-top: 1px solid var(--line); + } + .prim { + padding: 36px 32px 40px; + border-bottom: 1px solid var(--line); + border-right: 1px solid var(--line); + position: relative; + transition: background .25s; + } + .prim:hover { background: var(--ink-2); } + .prim:last-child { border-right: 1px solid var(--line); } + @media (max-width: 720px) { .prim { border-right: none !important; } } + + .prim .num { + font-family: 'JetBrains Mono', monospace; + font-size: 11px; + color: var(--halo-soft); + letter-spacing: 0.2em; + margin-bottom: 32px; + display: flex; align-items: center; gap: 10px; + } + .prim .num::after { + content: ""; flex: 1; height: 1px; background: var(--line-hot); + } + .prim h3 { + font-family: 'Fraunces', serif; + font-weight: 400; + font-size: 24px; + line-height: 1.15; + margin-bottom: 14px; + letter-spacing: -0.01em; + } + .prim h3 em { color: var(--halo); font-style: italic; font-weight: 300; } + .prim p { + font-size: 14px; + line-height: 1.6; + color: var(--paper-dim); + max-width: 34ch; + } + + /* ---------- code block ---------- */ + + .code-window { + border: 1px solid var(--line); + background: var(--ink-2); + border-radius: 2px; + overflow: hidden; + margin-top: 8px; + } + .code-window .bar { + display: flex; align-items: center; justify-content: space-between; + padding: 10px 16px; + border-bottom: 1px solid var(--line); + background: var(--ink-3); + font-family: 'JetBrains Mono', monospace; + font-size: 11px; + color: var(--paper-dimmer); + letter-spacing: 0.15em; + text-transform: uppercase; + } + .code-window .bar .pills { + display: inline-flex; gap: 6px; + } + .code-window .bar .pills i { + width: 8px; height: 8px; border-radius: 50%; display: inline-block; + background: #2a2f38; + } + .code-window .bar .pills i:first-child { background: #ff5f57; opacity: .55; } + .code-window .bar .pills i:nth-child(2) { background: #febc2e; opacity: .55; } + .code-window .bar .pills i:nth-child(3) { background: #28c840; opacity: .55; } + .code-window pre { + padding: 28px 32px; + overflow-x: auto; + font-size: 13px; + line-height: 1.75; + color: var(--paper); + } + .code-window pre .k { color: var(--halo-soft); } + .code-window pre .s { color: #f5d796; } + .code-window pre .c { color: var(--paper-dimmer); font-style: italic; } + .code-window pre .f { color: var(--paper); } + .code-window pre .p { color: var(--paper-dim); } + .code-window pre .n { color: #c8b6ff; } + button.copy { + background: transparent; + border: 1px solid var(--line-hot); + color: var(--paper-dim); + font-family: 'JetBrains Mono', monospace; + font-size: 10px; + letter-spacing: 0.18em; + text-transform: uppercase; + padding: 4px 10px; + cursor: pointer; + border-radius: 2px; + transition: all .2s; + } + button.copy:hover { color: var(--ink); background: var(--halo); border-color: var(--halo); } + button.copy.done { color: var(--ink); background: var(--halo-soft); border-color: var(--halo-soft); } + + /* ---------- quick-start split ---------- */ + + .qstart { + display: grid; + grid-template-columns: 5fr 7fr; + gap: 64px; + align-items: start; + } + @media (max-width: 900px) { .qstart { grid-template-columns: 1fr; gap: 36px; } } + + .qstart .side p { + font-family: 'Fraunces', serif; + font-size: 19px; + line-height: 1.55; + color: var(--paper); + font-weight: 300; + } + .qstart .side p + p { margin-top: 18px; color: var(--paper-dim); } + .qstart .side .install { + margin-top: 28px; + display: inline-flex; + align-items: center; + gap: 12px; + font-family: 'JetBrains Mono', monospace; + font-size: 13px; + padding: 12px 18px; + border: 1px solid var(--line-hot); + background: var(--ink-2); + border-radius: 2px; + } + .qstart .side .install::before { + content: "$"; color: var(--halo-soft); + } + + /* ---------- security block ---------- */ + + .sec-grid { + display: grid; + grid-template-columns: 1fr 1fr; + border-top: 1px solid var(--line); + } + .sec-grid .row { + display: contents; + } + .sec-grid .k, .sec-grid .v { + padding: 20px 24px; + border-bottom: 1px solid var(--line); + } + .sec-grid .k { + font-family: 'JetBrains Mono', monospace; + font-size: 12px; + letter-spacing: 0.05em; + color: var(--halo-soft); + border-right: 1px solid var(--line); + } + .sec-grid .v { + font-size: 14px; + color: var(--paper-dim); + line-height: 1.6; + } + .sec-grid .v strong { color: var(--paper); font-weight: 400; } + @media (max-width: 720px) { + .sec-grid { grid-template-columns: 1fr; } + .sec-grid .k { border-right: none; padding-bottom: 4px; } + .sec-grid .v { padding-top: 4px; } + } + + .sec-note { + margin-top: 40px; + padding: 20px 24px; + border-left: 2px solid var(--amber); + background: rgba(255, 184, 85, 0.04); + font-size: 14px; + color: var(--paper-dim); + line-height: 1.6; + } + .sec-note strong { color: var(--amber); font-weight: 500; } + + /* ---------- ecosystem cards ---------- */ + + .eco { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 20px; + } + @media (max-width: 900px) { .eco { grid-template-columns: 1fr; } } + + .eco-card { + padding: 32px 28px 28px; + border: 1px solid var(--line); + background: linear-gradient(180deg, var(--ink-2) 0%, var(--ink) 100%); + border-radius: 2px; + position: relative; + overflow: hidden; + transition: border-color .25s, transform .25s; + } + .eco-card:hover { border-color: var(--line-hot); transform: translateY(-2px); } + .eco-card.this { + border-color: var(--halo-soft); + background: linear-gradient(180deg, rgba(127,221,255,0.06) 0%, var(--ink) 100%); + } + .eco-card.this::after { + content: "this repo"; + position: absolute; + top: 16px; right: 16px; + font-family: 'JetBrains Mono', monospace; + font-size: 10px; + letter-spacing: 0.2em; + text-transform: uppercase; + color: var(--ink); + background: var(--halo); + padding: 4px 8px; + border-radius: 2px; + } + .eco-card .mono-name { + font-family: 'JetBrains Mono', monospace; + font-weight: 500; + font-size: 15px; + color: var(--paper); + margin-bottom: 18px; + } + .eco-card h3 { + font-family: 'Fraunces', serif; + font-weight: 400; + font-size: 20px; + line-height: 1.2; + margin-bottom: 10px; + letter-spacing: -0.01em; + } + .eco-card p { + font-size: 13px; + color: var(--paper-dim); + line-height: 1.55; + } + .eco-card .status { + margin-top: 22px; + font-family: 'JetBrains Mono', monospace; + font-size: 10px; + letter-spacing: 0.2em; + text-transform: uppercase; + color: var(--paper-dimmer); + display: flex; align-items: center; gap: 8px; + } + .eco-card .status::before { + content: ""; width: 6px; height: 6px; border-radius: 50%; + background: var(--paper-dimmer); + } + .eco-card.this .status::before { background: var(--halo); box-shadow: 0 0 10px var(--halo-soft); } + .eco-card.this .status { color: var(--halo-soft); } + /* Eco-card version: hidden by default, surfaced once GitHub API resolves. */ + .eco-card .status .status-version:not(:empty)::before { content: " - "; } + + /* ---------- footer ---------- */ + + .bespoke-landing footer { + padding: 56px 0 48px; + border-top: 1px solid var(--line); + } + .foot-row { + display: flex; + justify-content: space-between; + align-items: flex-end; + flex-wrap: wrap; + gap: 32px; + } + .foot-row .sig { + font-family: 'Fraunces', serif; + font-style: italic; + font-weight: 300; + font-size: 14px; + color: var(--paper-dim); + max-width: 320px; + line-height: 1.5; + } + .foot-links { + display: flex; gap: 32px; + } + .foot-links a { + color: var(--paper-dim); + text-decoration: none; + font-family: 'JetBrains Mono', monospace; + font-size: 11px; + letter-spacing: 0.18em; + text-transform: uppercase; + transition: color .2s; + } + .foot-links a:hover { color: var(--halo); } + .foot-meta { + margin-top: 36px; + padding-top: 20px; + border-top: 1px solid var(--line); + display: flex; + justify-content: space-between; + font-family: 'JetBrains Mono', monospace; + font-size: 10px; + letter-spacing: 0.2em; + text-transform: uppercase; + color: var(--paper-dimmer); + } + + /* ---------- motion ---------- */ + + @keyframes rise { + to { opacity: 1; transform: translateY(0); } + } + + /* Fallback for users with prefers-reduced-motion: reduce. The hero elements + * start at opacity: 0 and rely on the rise animation to become visible; if + * the animation is suppressed by the reduced-motion media query in custom.css, + * we must surface them anyway, otherwise the entire hero reads as empty space. */ + @media (prefers-reduced-motion: reduce) { + .bespoke-landing .hero-eyebrow, + .bespoke-landing h1.display, + .bespoke-landing .hero-lede, + .bespoke-landing .hero-meta, + .bespoke-landing .hero-banner { + opacity: 1 !important; + transform: none !important; + animation: none !important; + } + } + + + /* ---------- focus ---------- */ + .bespoke-landing a:focus-visible, .bespoke-landing button:focus-visible { + outline: 1px solid var(--halo); + outline-offset: 3px; + } diff --git a/website/src/app/(home)/layout.tsx b/website/src/app/(home)/layout.tsx index 77379fa..dc098a0 100644 --- a/website/src/app/(home)/layout.tsx +++ b/website/src/app/(home)/layout.tsx @@ -1,6 +1,5 @@ -import { HomeLayout } from 'fumadocs-ui/layouts/home'; -import { baseOptions } from '@/lib/layout.shared'; - +// The home route is a full-bleed bespoke landing with its own header and +// footer, so it deliberately does not use Fumadocs' HomeLayout chrome. export default function Layout({ children }: LayoutProps<'/'>) { - return {children}; + return <>{children}; } diff --git a/website/src/app/(home)/page.tsx b/website/src/app/(home)/page.tsx index 970bd1e..110a6d7 100644 --- a/website/src/app/(home)/page.tsx +++ b/website/src/app/(home)/page.tsx @@ -1,212 +1,416 @@ -import Link from 'next/link'; +'use client'; -const primitives = [ - { - num: '01 / isolated', - title: 'Your code runs in its own cell.', - body: 'Every run gets a fresh container, its own volume, its own network. Nothing leaks in from the host, nothing leaks out to sibling runs. Torn down on exit, success or not.', - }, - { - num: '02 / drop in, pull out', - title: 'Send a folder. Get any file back.', - body: 'Point at a directory on your disk, it becomes the container workdir. When the run finishes, ask for any path and it lands back on your host.', - }, - { - num: '03 / stop on demand', - title: 'Cancel, abort, or time out.', - body: 'Pass an AbortSignal, call cancel(), or set a deadline. The container dies and its volume goes with it. No zombie processes, no leaked disk.', - }, - { - num: '04 / any stack', - title: 'Python, Node, Go, Ruby, shell, anything.', - body: 'Any Docker image on your registry or anyone else’s. No special runtime inside the container, no SDK to import, no convention to follow.', - }, -]; +import { useEffect } from 'react'; +import './landing.css'; -const security: [string, string][] = [ - ['Kernel permissions', 'Dangerous capabilities stripped at startup: raw sockets, device creation, chroot escapes, capability juggling, audit-log spoofing. Every run, unconditionally.'], - ['No privilege escalation', 'A setuid binary inside your container cannot elevate above the user it starts as.'], - ['Fork-bomb protection', 'Max 100 processes per container. A runaway loop caps out in milliseconds.'], - ['Memory and CPU budget', '512 MiB and one core by default, cgroup-enforced. Tunable per runner.'], - ['Network isolation', 'Isolated bridge by default with inter-container traffic blocked. Use networks: [‘none’] to sever it entirely.'], - ['Host filesystem', 'Symlinks in your input folder are filtered before seeding, so a stray link cannot reach back into the host.'], - ['Safe extraction', 'Paths escaping upward (..) are refused; each extracted entry is capped at 1 GiB.'], - ['Kernel-level hardening', 'Swap the runtime to gVisor with one option for user-space syscall interception.'], -]; +const BASE = '/light-runner'; -const ecosystem = [ - { - name: 'light-runner', - tag: 'this library', - title: 'Spawn one container, return exit code and files.', - body: 'The execution primitive. Domain-agnostic. Zero orchestration. The other two tools call down to this one.', - }, - { - name: 'light-run', - tag: 'HTTP', - title: 'CLI and HTTP surface around light-runner.', - body: 'Point a POST endpoint at it, pipe bodies through, get results back. Stateless wrapper, same defaults, same guarantees.', - }, - { - name: 'light-process', - tag: 'DAG', - title: 'DAG orchestration, retries, fan-out.', - body: 'Composes runs into pipelines with backoff, concurrency limits, and structured outputs.', - }, -]; +const CODE_HTML = `import { DockerRunner } from 'light-runner'; +const runner = new DockerRunner({ memory: '512m', cpus: '1' }); +const execution = runner.run({ + image: 'python:3.12-alpine', + entrypoint: 'python main.py', + dir: './my-project', + input: { task: 'compute', n: 20 }, + timeout: 30_000, + extract: [{ from: '/app/result.json', to: './out' }], +}); +const result = await execution.result; +result.success // true if exit 0 and not cancelled +result.exitCode // the container exit code +result.extracted // [{ from, to, status, bytes }]`; -const code = `import { DockerRunner } from 'light-runner'; +export default function HomePage() { + useEffect(() => { + const btn = document.querySelector('[data-copy]'); + const src = document.getElementById('code-sample'); + if (btn && src) { + btn.addEventListener('click', async () => { + try { + await navigator.clipboard.writeText((src as HTMLElement).innerText.trim()); + btn.textContent = 'Copied'; + btn.classList.add('done'); + setTimeout(() => { + btn.textContent = 'Copy'; + btn.classList.remove('done'); + }, 1600); + } catch { + btn.textContent = 'Select'; + } + }); + } -const runner = new DockerRunner({ memory: '512m', cpus: '1' }); + const PROJECT = 'enixCode/light-runner'; + const repos = new Set([PROJECT]); + document.querySelectorAll('[data-eco-status][data-gh-repo]').forEach((el) => { + const r = el.getAttribute('data-gh-repo'); + if (r) repos.add(r); + }); -const execution = runner.run({ - image: 'python:3.12-alpine', - entrypoint: 'python main.py', - dir: './my-project', - input: { task: 'compute', n: 20 }, - timeout: 30_000, - extract: [{ from: '/app/result.json', to: './out' }], -}); + const fetchLatest = (repo: string): Promise<{ tag_name?: string; prerelease?: boolean } | null> => + fetch(`https://api.github.com/repos/${repo}/releases/latest`) + .then((r) => (r.ok ? r.json() : null)) + .catch(() => null); -const result = await execution.result; -result.success; // true if exit 0 and not cancelled -result.exitCode; // the container exit code -result.extracted; // [{ from, to, status, bytes }]`; + Promise.all([...repos].map((repo) => fetchLatest(repo).then((data) => [repo, data] as const))).then( + (entries) => { + const releases = new Map(entries); + const project = releases.get(PROJECT); + if (project?.tag_name) { + const tag = project.tag_name; + const v = tag.startsWith('v') ? tag : `v${tag}`; + document.querySelectorAll('[data-gh-version]').forEach((el) => { + el.textContent = v; + }); + } + document.querySelectorAll('[data-eco-status][data-gh-repo]').forEach((el) => { + const repo = el.getAttribute('data-gh-repo'); + const fallback = el.getAttribute('data-fallback') || 'In development'; + const data = repo ? releases.get(repo) : null; + const tag = data?.tag_name; + if (!tag) { + el.textContent = fallback; + return; + } + const v = tag.startsWith('v') ? tag : `v${tag}`; + el.textContent = `${data?.prerelease === true ? 'Pre-release - ' : 'Stable - '}${v}`; + }); + }, + ); + }, []); -function Label({ children }: { children: React.ReactNode }) { return ( -
- {children} -
- ); -} - -export default function HomePage() { - return ( -
- {/* Hero */} -
-

- Execution primitive, Node.js -

-

- Run untrusted code in hardened containers. -

-

- A single-purpose Node.js library that runs your code in a container it tears down - afterwards, and hands you back the exit code, logs, and any files you asked for. Nothing - else. -

-
- - Quick start - - - API reference - - - GitHub - -
-
- npm install light-runner +
- - {/* Primitives */} -
- -

- Give it code. Get back an exit code, logs, and the - files you asked for. -

-
- {primitives.map((p) => ( -
-
{p.num}
-

{p.title}

-

{p.body}

+ +
+ {/* HERO */} +
+
+
+ + + Execution primitive - Node.js
- ))} -
-
- - {/* Quick start */} -
- -

- A few lines to run, one to get your artefact. -

-
-          {code}
-        
-
- - {/* Security */} -
- -

- Hardened defaults, never opt-out. Add more - restrictions, never fewer. -

-
- {security.map(([k, v]) => ( -
-
{k}
-
{v}
+
+

+ Run untrusted code +
+ in hardened containers. +

+

+ A single-purpose Node.js library that runs your code in a container it tears down + afterwards, and hands you back the exit code, logs, and any files you asked for.{' '} + Nothing else. +

+
+
+
Runtime
+
+ Node >=22 +
+
+
+
Dependencies
+
+ 3 dockerode + tar +
+
+
+
Transport
+
+ dockerode no CLI +
+
+
+
License
+
+ MIT permissive +
+
+
- ))} -
-

- Does not cover kernel exploits, runc CVEs, or side-channel attacks. For genuinely hostile - code, combine with the gVisor (runsc) or Kata runtimes. -

-
- - {/* Ecosystem */} -
- -

- Three tools. Each does one thing. -

-
- {ecosystem.map((e) => ( -
-
- {e.name} - - {e.tag} - -
-

{e.title}

-

{e.body}

+
+
+ {/* eslint-disable-next-line @next/next/no-img-element */} + A single glowing sphere floating above a wireframe cube on an isolated dark grid, the visual metaphor for a sandboxed container. + +
+ Fig. 01 - One process, one cell, one grid. + light-runner / visual +
+
+
+
+ {/* PRIMITIVES */} +
+
+
+
what you get
+

+ Give it code. Get back an exit code, logs, and the + files you asked for. +

- ))} -
-
- - {/* Footer */} -
-
- light-runner / execution primitive - +
+
+
01 / isolated
+

+ Your code runs in its own cell. +

+

+ Every run gets a fresh container, its own volume, its own network. Nothing leaks in + from the host, nothing leaks out to sibling runs. Torn down on exit, success or not. +

+
+
+
02 / drop in, pull out
+

+ Send a folder. Get any file back. +

+

+ Point at a directory on your disk, it becomes the container workdir. When the run + finishes, ask for any path and it lands back on your host. +

+
+
+
03 / stop on demand
+

+ Cancel, abort, or time out. +

+

+ Pass an AbortSignal, call cancel(), or set a deadline. The + container dies and its volume goes with it. No zombie processes, no leaked disk. +

+
+
+
04 / any stack
+

+ Python, Node, Go, Ruby, shell, anything. +

+

+ Any Docker image on your registry or anyone else's. No special runtime inside the + container, no SDK to import, no convention to follow. Your code stays your code. +

+
+
+
+
+ {/* QUICK START */} +
+
+
+
quick start
+

+ Five lines to run, one to get your artefact. +

+
+
+
+

+ Point light-runner at an image and a folder. Pipe input through stdin. + Extract whatever your container wrote. +

+

No HTTP server. No config file. No CLI.

+ npm install light-runner +
+
+
+ + + + + + example.ts + +
+
+              
+
+
+
+ {/* SECURITY */} +
+
+
+
security model
+

+ Hardened defaults, never opt-out. Add more + restrictions, never fewer. +

+
+
+
+
Kernel permissions
+
+ Dangerous capabilities stripped at startup - raw sockets, device + creation, chroot escapes, capability juggling, audit-log spoofing. Every run, + unconditionally. +
+
+
+
No privilege escalation
+
+ A setuid binary inside your container cannot elevate above the user + it starts as. +
+
+
+
Fork-bomb protection
+
+ Max 100 processes per container. A runaway loop caps out in + milliseconds instead of paging the host. +
+
+
+
Memory and CPU budget
+
+ 512 MiB and one core by default, cgroup-enforced. + Noisy runs cannot starve their neighbours. Tunable per runner. +
+
+
+
Network isolation
+
+ Isolated bridge by default with inter-container traffic blocked. + Pass networks: ['none'] to sever it entirely. +
+
+
+
Host filesystem protection
+
+ Symlinks in your input folder are filtered before seeding, so a + stray link cannot reach back into the host filesystem. +
+
+
+
Safe file extraction
+
+ A container cannot write outside the destination folder you chose: paths escaping + upward (..) are refused. Each extracted entry is capped at{' '} + 1 GiB so a runaway output cannot fill your disk. +
+
+
+
Kernel-level hardening
+
+ Swap the runtime to gVisor with one option for user-space syscall + interception, at ~10-30% I/O cost. +
+
+
+
+ Does not cover - kernel exploits, runc CVEs, side-channel + attacks. For genuinely hostile code, combine with {'{ runtime: \'runsc\' }'}{' '} + (gVisor) or {'{ runtime: \'kata\' }'} (Kata Containers, VM-level isolation). +
+
+
+ {/* ECOSYSTEM */} +
+
+
+
ecosystem
+

+ Three tools. Each does one thing. +

+
+
+
+
light-runner
+

Spawn one container, return exit code and files.

+

+ The execution primitive. Domain-agnostic. Zero orchestration. The other two tools in + this family both call down to this one. +

+
+ Loading +
+
+
+
light-run
+

CLI and HTTP surface around light-runner.

+

+ Point a POST endpoint at it, pipe bodies through, get results back. Stateless + wrapper, same defaults, same guarantees. +

+
+ Loading +
+
+
+
light-process
+

DAG orchestration, retries, fan-out.

+

+ When one container is not enough. Composes runs into pipelines with backoff, + concurrency limits, and structured outputs. +

+
+ Loading +
+
+
+
+
+
+
+
+
+
One glowing node. One dark grid. The rest is up to the code inside.
+ +
+
+ light-runner // execution primitive + built with cc +
- +
); } From 3c71dedec8401f8ede52155507379135b8a63c4b Mon Sep 17 00:00:00 2001 From: enixCode <58286681+enixCode@users.noreply.github.com> Date: Sat, 30 May 2026 08:52:19 +0200 Subject: [PATCH 09/10] docs(fumadocs): consume the shared light-landing-page package The home now renders LandingPage data={lightRunnerData} from the shared light-landing-page package (git dependency) instead of an in-repo copy. The bespoke design, CSS and logic live in the package; only lightRunnerData (brand, hero, primitives, security, ecosystem, links) is local. The local landing.css is dropped. A design change now ships to every light-* site from one source. build with cc --- website/package-lock.json | 203 +--------- website/package.json | 1 + website/src/app/(home)/data.tsx | 263 +++++++++++++ website/src/app/(home)/landing.css | 607 ----------------------------- website/src/app/(home)/page.tsx | 417 +------------------- 5 files changed, 279 insertions(+), 1212 deletions(-) create mode 100644 website/src/app/(home)/data.tsx delete mode 100644 website/src/app/(home)/landing.css diff --git a/website/package-lock.json b/website/package-lock.json index 3a1a357..5a390ab 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -9,17 +9,14 @@ "version": "0.0.0", "hasInstallScript": true, "dependencies": { - "@ai-sdk/react": "^3.0.193", - "@openrouter/ai-sdk-provider": "^2.9.0", "@orama/orama": "^3.1.18", - "@radix-ui/react-presence": "^1.1.5", - "ai": "^6.0.191", "class-variance-authority": "^0.7.1", "flexsearch": "^0.8.212", "fumadocs-core": "16.9.3", "fumadocs-mdx": "15.0.10", "fumadocs-ui": "16.9.3", "hast-util-to-jsx-runtime": "^2.3.6", + "light-landing-page": "github:enixCode/light-landing-page", "lucide-react": "^1.17.0", "next": "16.2.6", "react": "^19.2.6", @@ -46,70 +43,6 @@ "typescript": "^6.0.3" } }, - "node_modules/@ai-sdk/gateway": { - "version": "3.0.121", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.121.tgz", - "integrity": "sha512-uY248djJRxa5W68MHiyqO8WLdOeKQoRClGg7PVX/VPhVW8SJNM7/l5DcrA5WAM3YfQrLyNkgZa2VOu8T0t8LUw==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "3.0.10", - "@ai-sdk/provider-utils": "4.0.27", - "@vercel/oidc": "3.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/@ai-sdk/provider": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.10.tgz", - "integrity": "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==", - "license": "Apache-2.0", - "dependencies": { - "json-schema": "^0.4.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@ai-sdk/provider-utils": { - "version": "4.0.27", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz", - "integrity": "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "3.0.10", - "@standard-schema/spec": "^1.1.0", - "eventsource-parser": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/@ai-sdk/react": { - "version": "3.0.195", - "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-3.0.195.tgz", - "integrity": "sha512-+yIH84d4bBNzLKfaDDf4EocEH0XQKKNwNShxbrz5xAiJMNIPnWVWT9cyrSerYaGH3iNVS/g2io42PE4HNbc4RA==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider-utils": "4.0.27", - "ai": "6.0.193", - "swr": "^2.2.5", - "throttleit": "2.1.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "^18 || ~19.0.1 || ~19.1.2 || ^19.2.1" - } - }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -364,30 +297,6 @@ "node": ">=6.9.0" } }, - "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@emnapi/wasi-threads": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", @@ -1845,29 +1754,6 @@ "node": ">=12.4.0" } }, - "node_modules/@openrouter/ai-sdk-provider": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@openrouter/ai-sdk-provider/-/ai-sdk-provider-2.9.0.tgz", - "integrity": "sha512-Seva+NCa0WUQnJIUE5GzHsUv1WTIeyqwz0ELl2VtS6NP+eF+77yCXGFVOMbvoCM7QMjlnhv7931e89R+8pJdcQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "ai": "^6.0.0", - "zod": "^3.25.0 || ^4.0.0" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", - "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@orama/orama": { "version": "3.1.18", "resolved": "https://registry.npmjs.org/@orama/orama/-/orama-3.1.18.tgz", @@ -3816,15 +3702,6 @@ "win32" ] }, - "node_modules/@vercel/oidc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.2.0.tgz", - "integrity": "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==", - "license": "Apache-2.0", - "engines": { - "node": ">= 20" - } - }, "node_modules/@zeit/schemas": { "version": "2.36.0", "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.36.0.tgz", @@ -3854,25 +3731,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/ai": { - "version": "6.0.193", - "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.193.tgz", - "integrity": "sha512-VQOTOse8+X8kMtg61DNSXlYJzwOW4NjMLDJNk/qxClWsFe4oiyFJDHGGG1oezfGcFzuYuQe/8Z7r4kwiZWh2YQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@ai-sdk/gateway": "3.0.121", - "@ai-sdk/provider": "3.0.10", - "@ai-sdk/provider-utils": "4.0.27", - "@opentelemetry/api": "^1.9.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, "node_modules/ajv": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", @@ -5498,6 +5356,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -5816,15 +5675,6 @@ "node": ">=0.10.0" } }, - "node_modules/eventsource-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz", - "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -7524,12 +7374,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -7617,6 +7461,15 @@ "node": ">= 0.8.0" } }, + "node_modules/light-landing-page": { + "version": "0.1.0", + "resolved": "git+ssh://git@github.com/enixCode/light-landing-page.git#62deeb09f0bb8e28d6f046c7db1bb4b63ed71564", + "license": "MIT", + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/lightningcss": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", @@ -11043,19 +10896,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/swr": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.4.1.tgz", - "integrity": "sha512-2CC6CiKQtEwaEeNiqWTAw9PGykW8SR5zZX8MZk6TeAvEAnVS7Visz8WzphqgtQ8v2xz/4Q5K+j+SeMaKXeeQIA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3", - "use-sync-external-store": "^1.6.0" - }, - "peerDependencies": { - "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/tailwind-merge": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", @@ -11088,18 +10928,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/throttleit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", - "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/tinyexec": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.3.tgz", @@ -11619,15 +11447,6 @@ } } }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/website/package.json b/website/package.json index 978a1ec..9b9c1d0 100644 --- a/website/package.json +++ b/website/package.json @@ -15,6 +15,7 @@ "fumadocs-core": "16.9.3", "fumadocs-mdx": "15.0.10", "fumadocs-ui": "16.9.3", + "light-landing-page": "github:enixCode/light-landing-page", "lucide-react": "^1.17.0", "next": "16.2.6", "react": "^19.2.6", diff --git a/website/src/app/(home)/data.tsx b/website/src/app/(home)/data.tsx new file mode 100644 index 0000000..52881a4 --- /dev/null +++ b/website/src/app/(home)/data.tsx @@ -0,0 +1,263 @@ +import type { LandingData } from 'light-landing-page'; + +const BASE = '/light-runner'; + +const CODE_HTML = `import { DockerRunner } from 'light-runner'; +const runner = new DockerRunner({ memory: '512m', cpus: '1' }); +const execution = runner.run({ + image: 'python:3.12-alpine', + entrypoint: 'python main.py', + dir: './my-project', + input: { task: 'compute', n: 20 }, + timeout: 30_000, + extract: [{ from: '/app/result.json', to: './out' }], +}); +const result = await execution.result; +result.success // true if exit 0 and not cancelled +result.exitCode // the container exit code +result.extracted // [{ from, to, status, bytes }]`; + +export const lightRunnerData: LandingData = { + githubRepo: 'enixCode/light-runner', + brand: 'light-runner', + nav: [ + { label: 'Primitives', href: '#primitives' }, + { label: 'Quick start', href: '#quick-start' }, + { label: 'Security', href: '#security' }, + { label: 'Ecosystem', href: '#ecosystem' }, + { label: 'Documentation', href: `${BASE}/docs` }, + { label: 'GitHub ->', href: 'https://github.com/enixCode/light-runner', primary: true }, + ], + hero: { + tag: 'Execution primitive - Node.js', + headline: ( + <> + Run untrusted code +
+ in hardened containers. + + ), + lede: ( + <> + A single-purpose Node.js library that runs your code in a container it tears down afterwards, + and hands you back the exit code, logs, and any files you asked for. Nothing else. + + ), + meta: [ + { k: 'Runtime', v: <>Node >=22 }, + { k: 'Dependencies', v: <>3 dockerode + tar }, + { k: 'Transport', v: <>dockerode no CLI }, + { k: 'License', v: <>MIT permissive }, + ], + banner: { + src: `${BASE}/banner.webp`, + alt: 'A single glowing sphere floating above a wireframe cube on an isolated dark grid, the visual metaphor for a sandboxed container.', + captionLeft: 'Fig. 01 - One process, one cell, one grid.', + captionRight: 'light-runner / visual', + }, + }, + primitives: { + label: 'what you get', + heading: ( + <> + Give it code. Get back an exit code, logs, and the files you + asked for. + + ), + items: [ + { + num: '01 / isolated', + title: ( + <> + Your code runs in its own cell. + + ), + body: 'Every run gets a fresh container, its own volume, its own network. Nothing leaks in from the host, nothing leaks out to sibling runs. Torn down on exit, success or not.', + }, + { + num: '02 / drop in, pull out', + title: ( + <> + Send a folder. Get any file back. + + ), + body: 'Point at a directory on your disk, it becomes the container workdir. When the run finishes, ask for any path and it lands back on your host.', + }, + { + num: '03 / stop on demand', + title: ( + <> + Cancel, abort, or time out. + + ), + body: ( + <> + Pass an AbortSignal, call cancel(), or set a deadline. The + container dies and its volume goes with it. No zombie processes, no leaked disk. + + ), + }, + { + num: '04 / any stack', + title: ( + <> + Python, Node, Go, Ruby, shell, anything. + + ), + body: 'Any Docker image on your registry or anyone else’s. No special runtime inside the container, no SDK to import, no convention to follow. Your code stays your code.', + }, + ], + }, + quickstart: { + label: 'quick start', + heading: ( + <> + Five lines to run, one to get your artefact. + + ), + side: ( + <> +

+ Point light-runner at an image and a folder. Pipe input through stdin. Extract + whatever your container wrote. +

+

No HTTP server. No config file. No CLI.

+ + ), + install: 'npm install light-runner', + codeHtml: CODE_HTML, + }, + security: { + label: 'security model', + heading: ( + <> + Hardened defaults, never opt-out. Add more restrictions, never + fewer. + + ), + rows: [ + { + k: 'Kernel permissions', + v: ( + <> + Dangerous capabilities stripped at startup - raw sockets, device + creation, chroot escapes, capability juggling, audit-log spoofing. Every run, + unconditionally. + + ), + }, + { + k: 'No privilege escalation', + v: ( + <> + A setuid binary inside your container cannot elevate above the user it + starts as. + + ), + }, + { + k: 'Fork-bomb protection', + v: ( + <> + Max 100 processes per container. A runaway loop caps out in milliseconds + instead of paging the host. + + ), + }, + { + k: 'Memory and CPU budget', + v: ( + <> + 512 MiB and one core by default, cgroup-enforced. Noisy + runs cannot starve their neighbours. Tunable per runner. + + ), + }, + { + k: 'Network isolation', + v: ( + <> + Isolated bridge by default with inter-container traffic blocked. Pass{' '} + networks: ['none'] to sever it entirely. + + ), + }, + { + k: 'Host filesystem protection', + v: ( + <> + Symlinks in your input folder are filtered before seeding, so a stray + link cannot reach back into the host filesystem. + + ), + }, + { + k: 'Safe file extraction', + v: ( + <> + A container cannot write outside the destination folder you chose: paths escaping upward + (..) are refused. Each extracted entry is capped at 1 GiB so + a runaway output cannot fill your disk. + + ), + }, + { + k: 'Kernel-level hardening', + v: ( + <> + Swap the runtime to gVisor with one option for user-space syscall + interception, at ~10-30% I/O cost. + + ), + }, + ], + note: ( + <> + Does not cover - kernel exploits, runc CVEs, side-channel + attacks. For genuinely hostile code, combine with {'{ runtime: \'runsc\' }'}{' '} + (gVisor) or {'{ runtime: \'kata\' }'} (Kata Containers, VM-level isolation). + + ), + }, + ecosystem: { + label: 'ecosystem', + heading: ( + <> + Three tools. Each does one thing. + + ), + cards: [ + { + name: 'light-runner', + current: true, + title: 'Spawn one container, return exit code and files.', + body: 'The execution primitive. Domain-agnostic. Zero orchestration. The other two tools in this family both call down to this one.', + repo: 'enixCode/light-runner', + }, + { + name: 'light-run', + title: 'CLI and HTTP surface around light-runner.', + body: 'Point a POST endpoint at it, pipe bodies through, get results back. Stateless wrapper, same defaults, same guarantees.', + repo: 'enixCode/light-run', + }, + { + name: 'light-process', + title: 'DAG orchestration, retries, fan-out.', + body: 'When one container is not enough. Composes runs into pipelines with backoff, concurrency limits, and structured outputs.', + repo: 'enixCode/light-process', + }, + ], + }, + footer: { + sig: 'One glowing node. One dark grid. The rest is up to the code inside.', + links: [ + { label: 'API', href: `${BASE}/docs/api` }, + { label: 'GitHub', href: 'https://github.com/enixCode/light-runner' }, + { label: 'npm', href: 'https://www.npmjs.com/package/light-runner' }, + { label: 'Security', href: '#security' }, + { label: 'MIT', href: 'https://github.com/enixCode/light-runner/blob/main/LICENSE' }, + ], + metaLeft: 'light-runner // execution primitive', + metaRight: 'built with cc', + }, +}; diff --git a/website/src/app/(home)/landing.css b/website/src/app/(home)/landing.css deleted file mode 100644 index f06c133..0000000 --- a/website/src/app/(home)/landing.css +++ /dev/null @@ -1,607 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..500;1,9..144,300..500&family=JetBrains+Mono:wght@400;500&display=swap'); - -.bespoke-landing { - background: var(--ink); - color: var(--paper); - min-height: 100vh; - font-family: 'Fraunces', serif; -} - -/* Bespoke landing styles. Loaded by theme/index.ts. Selectors are mostly class-based (.hero, .prim, etc.) so they only match elements present on the landing page; the few that could collide with VitePress chrome (section, main/header/footer) are scoped to .bespoke-landing / .bespoke-landing-wrap. */ - :root { - --ink: #050608; - --ink-2: #0a0c10; - --ink-3: #12151c; - --line: #1a1d24; - --line-hot: #242933; - --paper: #edeef0; - --paper-dim: #8a8f9a; - --paper-dimmer: #4d525c; - --halo: #c7e8ff; - --halo-soft: #7fddff; - --amber: #ffb855; - --ember: #ff6b35; - } - - - - .bespoke-landing main, .bespoke-landing header, .bespoke-landing footer { position: relative; z-index: 1; } - - /* ---------- typography ---------- */ - - .display { - font-family: 'Fraunces', serif; - font-variation-settings: "SOFT" 50, "WONK" 1; - font-weight: 350; - letter-spacing: -0.02em; - line-height: 1; - } - .label { - font-family: 'JetBrains Mono', monospace; - font-weight: 500; - font-size: 11px; - letter-spacing: 0.22em; - text-transform: uppercase; - color: var(--paper-dim); - } - .label::before { - content: "// "; - color: var(--halo-soft); - } - .bespoke-landing code, .bespoke-landing pre, .bespoke-landing .mono { - font-family: 'JetBrains Mono', monospace; - font-size: 13px; - } - - /* ---------- layout ---------- */ - - .shell { - max-width: 1240px; - margin: 0 auto; - padding: 0 clamp(24px, 5vw, 64px); - } - - /* ---------- top bar ---------- */ - - header.top { - padding: 28px 0 0; - } - .top-row { - display: flex; - align-items: center; - justify-content: space-between; - padding-bottom: 20px; - border-bottom: 1px solid var(--line); - } - .mark { - display: inline-flex; - align-items: center; - gap: 10px; - font-family: 'Fraunces', serif; - font-weight: 400; - font-size: 17px; - letter-spacing: -0.01em; - color: var(--paper); - text-decoration: none; - } - .mark-dot { - width: 10px; height: 10px; - border-radius: 50%; - background: var(--halo); - box-shadow: 0 0 14px var(--halo-soft), 0 0 3px #fff inset; - } - .mark em { - font-style: italic; - font-weight: 300; - color: var(--paper-dim); - font-size: 12px; - margin-left: 6px; - } - nav.top-nav { - display: flex; gap: 28px; - } - nav.top-nav a { - font-size: 12px; - letter-spacing: 0.18em; - text-transform: uppercase; - font-family: 'JetBrains Mono', monospace; - font-weight: 400; - color: var(--paper-dim); - text-decoration: none; - transition: color .2s; - } - nav.top-nav a:hover { color: var(--paper); } - nav.top-nav a:hover::before { content: "› "; color: var(--halo-soft); } - @media (max-width: 720px) { - nav.top-nav a:not(.primary) { display: none; } - } - nav.top-nav a.primary { - color: var(--ink); - background: var(--halo); - padding: 8px 14px; - border-radius: 2px; - } - nav.top-nav a.primary::before { display: none !important; } - - /* ---------- hero ---------- */ - - .bespoke-landing section.hero { - padding: clamp(60px, 10vh, 120px) 0 60px; - display: grid; - grid-template-columns: 1fr; - gap: 60px; - align-items: end; - } - - .hero-headline { max-width: 860px; } - .hero-eyebrow { - display: flex; align-items: center; gap: 14px; - margin-bottom: 32px; - opacity: 0; transform: translateY(8px); - animation: rise .9s .1s forwards cubic-bezier(.2,.7,.2,1); - } - .hero-eyebrow .v { color: var(--halo-soft); font-family: 'JetBrains Mono', monospace; font-size: 11px; letter-spacing: 0.18em; } - .hero-eyebrow .divider { width: 36px; height: 1px; background: var(--line-hot); } - .hero-eyebrow .tag { font-family: 'JetBrains Mono', monospace; font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--paper-dim); } - - h1.display { - font-size: clamp(52px, 9vw, 124px); - opacity: 0; transform: translateY(16px); - animation: rise 1s .15s forwards cubic-bezier(.2,.7,.2,1); - } - h1.display .accent { - font-style: italic; - font-weight: 300; - color: var(--halo); - } - h1.display .shy { - font-style: italic; - font-weight: 300; - color: var(--paper-dim); - } - - .hero-lede { - font-family: 'Fraunces', serif; - font-weight: 300; - font-size: clamp(18px, 2vw, 22px); - line-height: 1.45; - color: var(--paper); - max-width: 640px; - margin-top: 36px; - opacity: 0; transform: translateY(12px); - animation: rise 1s .3s forwards cubic-bezier(.2,.7,.2,1); - } - .hero-lede em { - color: var(--paper-dim); - font-style: italic; - } - - .hero-meta { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); - gap: 24px 48px; - margin-top: 48px; - padding-top: 28px; - border-top: 1px solid var(--line); - opacity: 0; transform: translateY(12px); - animation: rise 1s .45s forwards cubic-bezier(.2,.7,.2,1); - } - .hero-meta .cell { } - .hero-meta .k { font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--paper-dimmer); margin-bottom: 6px; } - .hero-meta .v { font-family: 'Fraunces', serif; font-size: 22px; font-weight: 350; letter-spacing: -0.01em; } - .hero-meta .v .sub { color: var(--paper-dim); font-size: 13px; margin-left: 6px; font-family: 'JetBrains Mono', monospace; letter-spacing: 0; text-transform: none; } - - .hero-banner { - margin-top: clamp(48px, 8vh, 96px); - position: relative; - overflow: hidden; - border: 1px solid var(--line); - border-radius: 2px; - background: #000; - aspect-ratio: 16 / 5; - opacity: 0; transform: translateY(20px); - animation: rise 1.4s .6s forwards cubic-bezier(.2,.7,.2,1); - } - .hero-banner img { - width: 100%; height: 100%; - object-fit: cover; - display: block; - filter: contrast(1.05); - } - .hero-banner::before { - content: ""; - position: absolute; inset: 0; - background: linear-gradient(180deg, transparent 60%, var(--ink) 100%); - pointer-events: none; - } - .hero-banner .corners { - position: absolute; inset: 12px; - pointer-events: none; - } - .hero-banner .corners::before, - .hero-banner .corners::after { - content: ""; - position: absolute; - width: 14px; height: 14px; - border: 1px solid var(--halo-soft); - opacity: .6; - } - .hero-banner .corners::before { top: 0; left: 0; border-right: none; border-bottom: none; } - .hero-banner .corners::after { bottom: 0; right: 0; border-left: none; border-top: none; } - - .hero-banner-caption { - display: flex; justify-content: space-between; - margin-top: 12px; - font-family: 'JetBrains Mono', monospace; - font-size: 10px; - letter-spacing: 0.2em; - color: var(--paper-dimmer); - text-transform: uppercase; - } - - /* ---------- section frame ---------- */ - - .bespoke-landing section { - padding: clamp(80px, 12vh, 140px) 0; - border-top: 1px solid var(--line); - position: relative; - } - .bespoke-landing section .section-head { - display: grid; - grid-template-columns: 160px 1fr; - gap: 48px; - margin-bottom: 64px; - align-items: baseline; - } - .bespoke-landing section .section-head .label { padding-top: 10px; } - .bespoke-landing section h2 { - font-family: 'Fraunces', serif; - font-weight: 350; - font-style: italic; - font-size: clamp(32px, 4.5vw, 56px); - letter-spacing: -0.015em; - line-height: 1.05; - max-width: 820px; - } - .bespoke-landing section h2 .strong { - font-style: normal; - color: var(--halo); - font-variation-settings: "WONK" 1; - } - @media (max-width: 720px) { - .bespoke-landing section .section-head { grid-template-columns: 1fr; gap: 8px; margin-bottom: 36px; } - } - - /* ---------- primitives grid ---------- */ - - .prims { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); - gap: 0; - border-top: 1px solid var(--line); - } - .prim { - padding: 36px 32px 40px; - border-bottom: 1px solid var(--line); - border-right: 1px solid var(--line); - position: relative; - transition: background .25s; - } - .prim:hover { background: var(--ink-2); } - .prim:last-child { border-right: 1px solid var(--line); } - @media (max-width: 720px) { .prim { border-right: none !important; } } - - .prim .num { - font-family: 'JetBrains Mono', monospace; - font-size: 11px; - color: var(--halo-soft); - letter-spacing: 0.2em; - margin-bottom: 32px; - display: flex; align-items: center; gap: 10px; - } - .prim .num::after { - content: ""; flex: 1; height: 1px; background: var(--line-hot); - } - .prim h3 { - font-family: 'Fraunces', serif; - font-weight: 400; - font-size: 24px; - line-height: 1.15; - margin-bottom: 14px; - letter-spacing: -0.01em; - } - .prim h3 em { color: var(--halo); font-style: italic; font-weight: 300; } - .prim p { - font-size: 14px; - line-height: 1.6; - color: var(--paper-dim); - max-width: 34ch; - } - - /* ---------- code block ---------- */ - - .code-window { - border: 1px solid var(--line); - background: var(--ink-2); - border-radius: 2px; - overflow: hidden; - margin-top: 8px; - } - .code-window .bar { - display: flex; align-items: center; justify-content: space-between; - padding: 10px 16px; - border-bottom: 1px solid var(--line); - background: var(--ink-3); - font-family: 'JetBrains Mono', monospace; - font-size: 11px; - color: var(--paper-dimmer); - letter-spacing: 0.15em; - text-transform: uppercase; - } - .code-window .bar .pills { - display: inline-flex; gap: 6px; - } - .code-window .bar .pills i { - width: 8px; height: 8px; border-radius: 50%; display: inline-block; - background: #2a2f38; - } - .code-window .bar .pills i:first-child { background: #ff5f57; opacity: .55; } - .code-window .bar .pills i:nth-child(2) { background: #febc2e; opacity: .55; } - .code-window .bar .pills i:nth-child(3) { background: #28c840; opacity: .55; } - .code-window pre { - padding: 28px 32px; - overflow-x: auto; - font-size: 13px; - line-height: 1.75; - color: var(--paper); - } - .code-window pre .k { color: var(--halo-soft); } - .code-window pre .s { color: #f5d796; } - .code-window pre .c { color: var(--paper-dimmer); font-style: italic; } - .code-window pre .f { color: var(--paper); } - .code-window pre .p { color: var(--paper-dim); } - .code-window pre .n { color: #c8b6ff; } - button.copy { - background: transparent; - border: 1px solid var(--line-hot); - color: var(--paper-dim); - font-family: 'JetBrains Mono', monospace; - font-size: 10px; - letter-spacing: 0.18em; - text-transform: uppercase; - padding: 4px 10px; - cursor: pointer; - border-radius: 2px; - transition: all .2s; - } - button.copy:hover { color: var(--ink); background: var(--halo); border-color: var(--halo); } - button.copy.done { color: var(--ink); background: var(--halo-soft); border-color: var(--halo-soft); } - - /* ---------- quick-start split ---------- */ - - .qstart { - display: grid; - grid-template-columns: 5fr 7fr; - gap: 64px; - align-items: start; - } - @media (max-width: 900px) { .qstart { grid-template-columns: 1fr; gap: 36px; } } - - .qstart .side p { - font-family: 'Fraunces', serif; - font-size: 19px; - line-height: 1.55; - color: var(--paper); - font-weight: 300; - } - .qstart .side p + p { margin-top: 18px; color: var(--paper-dim); } - .qstart .side .install { - margin-top: 28px; - display: inline-flex; - align-items: center; - gap: 12px; - font-family: 'JetBrains Mono', monospace; - font-size: 13px; - padding: 12px 18px; - border: 1px solid var(--line-hot); - background: var(--ink-2); - border-radius: 2px; - } - .qstart .side .install::before { - content: "$"; color: var(--halo-soft); - } - - /* ---------- security block ---------- */ - - .sec-grid { - display: grid; - grid-template-columns: 1fr 1fr; - border-top: 1px solid var(--line); - } - .sec-grid .row { - display: contents; - } - .sec-grid .k, .sec-grid .v { - padding: 20px 24px; - border-bottom: 1px solid var(--line); - } - .sec-grid .k { - font-family: 'JetBrains Mono', monospace; - font-size: 12px; - letter-spacing: 0.05em; - color: var(--halo-soft); - border-right: 1px solid var(--line); - } - .sec-grid .v { - font-size: 14px; - color: var(--paper-dim); - line-height: 1.6; - } - .sec-grid .v strong { color: var(--paper); font-weight: 400; } - @media (max-width: 720px) { - .sec-grid { grid-template-columns: 1fr; } - .sec-grid .k { border-right: none; padding-bottom: 4px; } - .sec-grid .v { padding-top: 4px; } - } - - .sec-note { - margin-top: 40px; - padding: 20px 24px; - border-left: 2px solid var(--amber); - background: rgba(255, 184, 85, 0.04); - font-size: 14px; - color: var(--paper-dim); - line-height: 1.6; - } - .sec-note strong { color: var(--amber); font-weight: 500; } - - /* ---------- ecosystem cards ---------- */ - - .eco { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 20px; - } - @media (max-width: 900px) { .eco { grid-template-columns: 1fr; } } - - .eco-card { - padding: 32px 28px 28px; - border: 1px solid var(--line); - background: linear-gradient(180deg, var(--ink-2) 0%, var(--ink) 100%); - border-radius: 2px; - position: relative; - overflow: hidden; - transition: border-color .25s, transform .25s; - } - .eco-card:hover { border-color: var(--line-hot); transform: translateY(-2px); } - .eco-card.this { - border-color: var(--halo-soft); - background: linear-gradient(180deg, rgba(127,221,255,0.06) 0%, var(--ink) 100%); - } - .eco-card.this::after { - content: "this repo"; - position: absolute; - top: 16px; right: 16px; - font-family: 'JetBrains Mono', monospace; - font-size: 10px; - letter-spacing: 0.2em; - text-transform: uppercase; - color: var(--ink); - background: var(--halo); - padding: 4px 8px; - border-radius: 2px; - } - .eco-card .mono-name { - font-family: 'JetBrains Mono', monospace; - font-weight: 500; - font-size: 15px; - color: var(--paper); - margin-bottom: 18px; - } - .eco-card h3 { - font-family: 'Fraunces', serif; - font-weight: 400; - font-size: 20px; - line-height: 1.2; - margin-bottom: 10px; - letter-spacing: -0.01em; - } - .eco-card p { - font-size: 13px; - color: var(--paper-dim); - line-height: 1.55; - } - .eco-card .status { - margin-top: 22px; - font-family: 'JetBrains Mono', monospace; - font-size: 10px; - letter-spacing: 0.2em; - text-transform: uppercase; - color: var(--paper-dimmer); - display: flex; align-items: center; gap: 8px; - } - .eco-card .status::before { - content: ""; width: 6px; height: 6px; border-radius: 50%; - background: var(--paper-dimmer); - } - .eco-card.this .status::before { background: var(--halo); box-shadow: 0 0 10px var(--halo-soft); } - .eco-card.this .status { color: var(--halo-soft); } - /* Eco-card version: hidden by default, surfaced once GitHub API resolves. */ - .eco-card .status .status-version:not(:empty)::before { content: " - "; } - - /* ---------- footer ---------- */ - - .bespoke-landing footer { - padding: 56px 0 48px; - border-top: 1px solid var(--line); - } - .foot-row { - display: flex; - justify-content: space-between; - align-items: flex-end; - flex-wrap: wrap; - gap: 32px; - } - .foot-row .sig { - font-family: 'Fraunces', serif; - font-style: italic; - font-weight: 300; - font-size: 14px; - color: var(--paper-dim); - max-width: 320px; - line-height: 1.5; - } - .foot-links { - display: flex; gap: 32px; - } - .foot-links a { - color: var(--paper-dim); - text-decoration: none; - font-family: 'JetBrains Mono', monospace; - font-size: 11px; - letter-spacing: 0.18em; - text-transform: uppercase; - transition: color .2s; - } - .foot-links a:hover { color: var(--halo); } - .foot-meta { - margin-top: 36px; - padding-top: 20px; - border-top: 1px solid var(--line); - display: flex; - justify-content: space-between; - font-family: 'JetBrains Mono', monospace; - font-size: 10px; - letter-spacing: 0.2em; - text-transform: uppercase; - color: var(--paper-dimmer); - } - - /* ---------- motion ---------- */ - - @keyframes rise { - to { opacity: 1; transform: translateY(0); } - } - - /* Fallback for users with prefers-reduced-motion: reduce. The hero elements - * start at opacity: 0 and rely on the rise animation to become visible; if - * the animation is suppressed by the reduced-motion media query in custom.css, - * we must surface them anyway, otherwise the entire hero reads as empty space. */ - @media (prefers-reduced-motion: reduce) { - .bespoke-landing .hero-eyebrow, - .bespoke-landing h1.display, - .bespoke-landing .hero-lede, - .bespoke-landing .hero-meta, - .bespoke-landing .hero-banner { - opacity: 1 !important; - transform: none !important; - animation: none !important; - } - } - - - /* ---------- focus ---------- */ - .bespoke-landing a:focus-visible, .bespoke-landing button:focus-visible { - outline: 1px solid var(--halo); - outline-offset: 3px; - } diff --git a/website/src/app/(home)/page.tsx b/website/src/app/(home)/page.tsx index 110a6d7..edb4a8d 100644 --- a/website/src/app/(home)/page.tsx +++ b/website/src/app/(home)/page.tsx @@ -1,416 +1,7 @@ -'use client'; - -import { useEffect } from 'react'; -import './landing.css'; - -const BASE = '/light-runner'; - -const CODE_HTML = `import { DockerRunner } from 'light-runner'; -const runner = new DockerRunner({ memory: '512m', cpus: '1' }); -const execution = runner.run({ - image: 'python:3.12-alpine', - entrypoint: 'python main.py', - dir: './my-project', - input: { task: 'compute', n: 20 }, - timeout: 30_000, - extract: [{ from: '/app/result.json', to: './out' }], -}); -const result = await execution.result; -result.success // true if exit 0 and not cancelled -result.exitCode // the container exit code -result.extracted // [{ from, to, status, bytes }]`; +import { LandingPage } from 'light-landing-page'; +import 'light-landing-page/styles.css'; +import { lightRunnerData } from './data'; export default function HomePage() { - useEffect(() => { - const btn = document.querySelector('[data-copy]'); - const src = document.getElementById('code-sample'); - if (btn && src) { - btn.addEventListener('click', async () => { - try { - await navigator.clipboard.writeText((src as HTMLElement).innerText.trim()); - btn.textContent = 'Copied'; - btn.classList.add('done'); - setTimeout(() => { - btn.textContent = 'Copy'; - btn.classList.remove('done'); - }, 1600); - } catch { - btn.textContent = 'Select'; - } - }); - } - - const PROJECT = 'enixCode/light-runner'; - const repos = new Set([PROJECT]); - document.querySelectorAll('[data-eco-status][data-gh-repo]').forEach((el) => { - const r = el.getAttribute('data-gh-repo'); - if (r) repos.add(r); - }); - - const fetchLatest = (repo: string): Promise<{ tag_name?: string; prerelease?: boolean } | null> => - fetch(`https://api.github.com/repos/${repo}/releases/latest`) - .then((r) => (r.ok ? r.json() : null)) - .catch(() => null); - - Promise.all([...repos].map((repo) => fetchLatest(repo).then((data) => [repo, data] as const))).then( - (entries) => { - const releases = new Map(entries); - const project = releases.get(PROJECT); - if (project?.tag_name) { - const tag = project.tag_name; - const v = tag.startsWith('v') ? tag : `v${tag}`; - document.querySelectorAll('[data-gh-version]').forEach((el) => { - el.textContent = v; - }); - } - document.querySelectorAll('[data-eco-status][data-gh-repo]').forEach((el) => { - const repo = el.getAttribute('data-gh-repo'); - const fallback = el.getAttribute('data-fallback') || 'In development'; - const data = repo ? releases.get(repo) : null; - const tag = data?.tag_name; - if (!tag) { - el.textContent = fallback; - return; - } - const v = tag.startsWith('v') ? tag : `v${tag}`; - el.textContent = `${data?.prerelease === true ? 'Pre-release - ' : 'Stable - '}${v}`; - }); - }, - ); - }, []); - - return ( -
-
- -
-
- {/* HERO */} -
-
-
- - - Execution primitive - Node.js -
-
-

- Run untrusted code -
- in hardened containers. -

-

- A single-purpose Node.js library that runs your code in a container it tears down - afterwards, and hands you back the exit code, logs, and any files you asked for.{' '} - Nothing else. -

-
-
-
Runtime
-
- Node >=22 -
-
-
-
Dependencies
-
- 3 dockerode + tar -
-
-
-
Transport
-
- dockerode no CLI -
-
-
-
License
-
- MIT permissive -
-
-
-
-
-
- {/* eslint-disable-next-line @next/next/no-img-element */} - A single glowing sphere floating above a wireframe cube on an isolated dark grid, the visual metaphor for a sandboxed container. - -
- Fig. 01 - One process, one cell, one grid. - light-runner / visual -
-
-
-
- {/* PRIMITIVES */} -
-
-
-
what you get
-

- Give it code. Get back an exit code, logs, and the - files you asked for. -

-
-
-
-
01 / isolated
-

- Your code runs in its own cell. -

-

- Every run gets a fresh container, its own volume, its own network. Nothing leaks in - from the host, nothing leaks out to sibling runs. Torn down on exit, success or not. -

-
-
-
02 / drop in, pull out
-

- Send a folder. Get any file back. -

-

- Point at a directory on your disk, it becomes the container workdir. When the run - finishes, ask for any path and it lands back on your host. -

-
-
-
03 / stop on demand
-

- Cancel, abort, or time out. -

-

- Pass an AbortSignal, call cancel(), or set a deadline. The - container dies and its volume goes with it. No zombie processes, no leaked disk. -

-
-
-
04 / any stack
-

- Python, Node, Go, Ruby, shell, anything. -

-

- Any Docker image on your registry or anyone else's. No special runtime inside the - container, no SDK to import, no convention to follow. Your code stays your code. -

-
-
-
-
- {/* QUICK START */} -
-
-
-
quick start
-

- Five lines to run, one to get your artefact. -

-
-
-
-

- Point light-runner at an image and a folder. Pipe input through stdin. - Extract whatever your container wrote. -

-

No HTTP server. No config file. No CLI.

- npm install light-runner -
-
-
- - - - - - example.ts - -
-
-              
-
-
-
- {/* SECURITY */} -
-
-
-
security model
-

- Hardened defaults, never opt-out. Add more - restrictions, never fewer. -

-
-
-
-
Kernel permissions
-
- Dangerous capabilities stripped at startup - raw sockets, device - creation, chroot escapes, capability juggling, audit-log spoofing. Every run, - unconditionally. -
-
-
-
No privilege escalation
-
- A setuid binary inside your container cannot elevate above the user - it starts as. -
-
-
-
Fork-bomb protection
-
- Max 100 processes per container. A runaway loop caps out in - milliseconds instead of paging the host. -
-
-
-
Memory and CPU budget
-
- 512 MiB and one core by default, cgroup-enforced. - Noisy runs cannot starve their neighbours. Tunable per runner. -
-
-
-
Network isolation
-
- Isolated bridge by default with inter-container traffic blocked. - Pass networks: ['none'] to sever it entirely. -
-
-
-
Host filesystem protection
-
- Symlinks in your input folder are filtered before seeding, so a - stray link cannot reach back into the host filesystem. -
-
-
-
Safe file extraction
-
- A container cannot write outside the destination folder you chose: paths escaping - upward (..) are refused. Each extracted entry is capped at{' '} - 1 GiB so a runaway output cannot fill your disk. -
-
-
-
Kernel-level hardening
-
- Swap the runtime to gVisor with one option for user-space syscall - interception, at ~10-30% I/O cost. -
-
-
-
- Does not cover - kernel exploits, runc CVEs, side-channel - attacks. For genuinely hostile code, combine with {'{ runtime: \'runsc\' }'}{' '} - (gVisor) or {'{ runtime: \'kata\' }'} (Kata Containers, VM-level isolation). -
-
-
- {/* ECOSYSTEM */} -
-
-
-
ecosystem
-

- Three tools. Each does one thing. -

-
-
-
-
light-runner
-

Spawn one container, return exit code and files.

-

- The execution primitive. Domain-agnostic. Zero orchestration. The other two tools in - this family both call down to this one. -

-
- Loading -
-
-
-
light-run
-

CLI and HTTP surface around light-runner.

-

- Point a POST endpoint at it, pipe bodies through, get results back. Stateless - wrapper, same defaults, same guarantees. -

-
- Loading -
-
-
-
light-process
-

DAG orchestration, retries, fan-out.

-

- When one container is not enough. Composes runs into pipelines with backoff, - concurrency limits, and structured outputs. -

-
- Loading -
-
-
-
-
-
-
-
-
-
One glowing node. One dark grid. The rest is up to the code inside.
- -
-
- light-runner // execution primitive - built with cc -
-
-
-
- ); + return ; } From e10694eb975a554b89a1e2c06001b88647b60ced Mon Sep 17 00:00:00 2001 From: enixCode <58286681+enixCode@users.noreply.github.com> Date: Sat, 30 May 2026 09:25:33 +0200 Subject: [PATCH 10/10] build(docs): cut over the docs site from VitePress to Fumadocs - Replace the VitePress docs with the Fumadocs static site under website/. - docs.yml now regenerates the API (docs:api), builds the Next.js static export and deploys website/out to Pages (was: VitePress build + dist). - package.json: drop vitepress and the vitepress docs scripts. docs:api, docs:dev and docs:build now drive the Fumadocs site; preversion and the pre-commit hook regenerate website/content/docs/api. - Remove the docs/ VitePress tree (landing, guides, api, .vitepress, public); all of it now lives in website/. - Update CLAUDE.md docs references. build with cc --- .github/workflows/docs.yml | 33 +- .husky/pre-commit | 12 +- docs/.vitepress/config.ts | 163 - docs/.vitepress/theme/custom.css | 546 ---- docs/.vitepress/theme/index.ts | 15 - docs/.vitepress/theme/landing.css | 598 ---- docs/api/classes/DockerRunner.md | 205 -- docs/api/classes/Execution.md | 138 - docs/api/classes/LightRunnerError.md | 299 -- docs/api/functions/cleanupOrphanNetworks.md | 23 - docs/api/functions/connectNetwork.md | 27 - docs/api/functions/createNetwork.md | 27 - docs/api/functions/deleteNetwork.md | 23 - docs/api/functions/listStates.md | 17 - docs/api/functions/networkExists.md | 23 - docs/api/functions/readState.md | 23 - docs/api/index.md | 39 - docs/api/interfaces/CleanupCacheOptions.md | 19 - docs/api/interfaces/CleanupNetworkOptions.md | 35 - docs/api/interfaces/CreateNetworkOptions.md | 105 - docs/api/interfaces/ExtractResult.md | 59 - docs/api/interfaces/ExtractSpec.md | 29 - docs/api/interfaces/RunRequest.md | 149 - docs/api/interfaces/RunResult.md | 61 - docs/api/interfaces/RunState.md | 149 - docs/api/interfaces/RunnerOptions.md | 59 - docs/api/interfaces/StopOptions.md | 29 - docs/api/type-aliases/LightRunnerErrorCode.md | 21 - docs/api/type-aliases/Runtime.md | 13 - docs/guides/detached.md | 140 - docs/guides/extract.md | 123 - docs/guides/gvisor-kata.md | 132 - docs/guides/quickstart.md | 56 - docs/guides/security.md | 115 - docs/index.md | 324 -- docs/public/banner.webp | Bin 26938 -> 0 bytes package-lock.json | 2758 +---------------- package.json | 14 +- 38 files changed, 154 insertions(+), 6447 deletions(-) delete mode 100644 docs/.vitepress/config.ts delete mode 100644 docs/.vitepress/theme/custom.css delete mode 100644 docs/.vitepress/theme/index.ts delete mode 100644 docs/.vitepress/theme/landing.css delete mode 100644 docs/api/classes/DockerRunner.md delete mode 100644 docs/api/classes/Execution.md delete mode 100644 docs/api/classes/LightRunnerError.md delete mode 100644 docs/api/functions/cleanupOrphanNetworks.md delete mode 100644 docs/api/functions/connectNetwork.md delete mode 100644 docs/api/functions/createNetwork.md delete mode 100644 docs/api/functions/deleteNetwork.md delete mode 100644 docs/api/functions/listStates.md delete mode 100644 docs/api/functions/networkExists.md delete mode 100644 docs/api/functions/readState.md delete mode 100644 docs/api/index.md delete mode 100644 docs/api/interfaces/CleanupCacheOptions.md delete mode 100644 docs/api/interfaces/CleanupNetworkOptions.md delete mode 100644 docs/api/interfaces/CreateNetworkOptions.md delete mode 100644 docs/api/interfaces/ExtractResult.md delete mode 100644 docs/api/interfaces/ExtractSpec.md delete mode 100644 docs/api/interfaces/RunRequest.md delete mode 100644 docs/api/interfaces/RunResult.md delete mode 100644 docs/api/interfaces/RunState.md delete mode 100644 docs/api/interfaces/RunnerOptions.md delete mode 100644 docs/api/interfaces/StopOptions.md delete mode 100644 docs/api/type-aliases/LightRunnerErrorCode.md delete mode 100644 docs/api/type-aliases/Runtime.md delete mode 100644 docs/guides/detached.md delete mode 100644 docs/guides/extract.md delete mode 100644 docs/guides/gvisor-kata.md delete mode 100644 docs/guides/quickstart.md delete mode 100644 docs/guides/security.md delete mode 100644 docs/index.md delete mode 100644 docs/public/banner.webp diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index a0a4176..7c4bb9a 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -1,18 +1,20 @@ name: Docs -# Build the VitePress site (bespoke landing in public/, guides, and TypeDoc-generated -# API reference) and deploy it to GitHub Pages on every push to main that touches +# Build the Fumadocs site (website/, a Next.js static export with the shared +# light-landing-page home, the MDX guides, and a TypeDoc-generated API +# reference) and deploy it to GitHub Pages on every push to main that touches # the docs sources or the public surface they describe. on: push: branches: [main] paths: - - 'docs/**' + - 'website/**' - 'src/**' + - 'scripts/gen-fumadocs-api.mjs' + - 'typedoc.json' - 'package.json' - 'package-lock.json' - - 'typedoc.json' - '.github/workflows/docs.yml' workflow_dispatch: @@ -29,13 +31,11 @@ permissions: jobs: build: - name: Build VitePress site + name: Build Fumadocs site runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - with: - fetch-depth: 0 # lastUpdated needs the full history - name: Setup Node.js 24 uses: actions/setup-node@v6 @@ -43,16 +43,27 @@ jobs: node-version: 24 cache: npm - - name: Install dependencies + # Root deps (typedoc + typedoc-plugin-markdown) power the API generation. + - name: Install root dependencies run: npm ci - - name: Regenerate TypeDoc markdown + build VitePress - run: npm run docs + # Regenerate the API reference from the current src/ so it can never + # drift from the code. + - name: Regenerate the API reference + run: npm run docs:api + + # The website is its own package; it pulls the shared landing + # (light-landing-page) via its lockfile. + - name: Install website dependencies + run: npm --prefix website ci + + - name: Build the static export + run: npm --prefix website run build - name: Upload Pages artifact uses: actions/upload-pages-artifact@v3 with: - path: docs/.vitepress/dist + path: website/out deploy: name: Deploy to GitHub Pages diff --git a/.husky/pre-commit b/.husky/pre-commit index 88e8287..8713d20 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,14 +1,14 @@ -# Regenerates docs/api/ ONLY if files under src/ are staged. Keeps the commit -# UX snappy for pure-test or pure-config commits. +# Regenerates the Fumadocs API reference ONLY if files under src/ are staged. +# Keeps the commit UX snappy for pure-test or pure-config commits. set -e staged=$(git diff --cached --name-only --diff-filter=ACMR) echo "$staged" | grep -qE '^src/' || exit 0 -echo "[pre-commit] src/ changed - regenerating docs/api/ ..." -npm run --silent docs:typedoc > /dev/null +echo "[pre-commit] src/ changed - regenerating the API reference ..." +npm run --silent docs:api > /dev/null -git add docs/api/ +git add website/content/docs/api/ -echo "[pre-commit] docs/api/ updated and staged." +echo "[pre-commit] website/content/docs/api/ updated and staged." diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts deleted file mode 100644 index 260e4a3..0000000 --- a/docs/.vitepress/config.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { defineConfig } from 'vitepress'; -// Derive the nav version label from package.json so it never goes stale on a -// release. Vite/esbuild inlines the JSON import at config-build time. -import pkg from '../../package.json'; - -/* - * VitePress site config for light-runner. - * - * Architecture: - * - `docs/index.md` is the bespoke landing (layout: home, raw HTML/CSS preserved) - * - `docs/guides/*.md` are user-facing how-to guides - * - `docs/api/*.md` is auto-generated by typedoc-plugin-markdown from src/ - * - GitHub Pages deploys docs/.vitepress/dist/ (configured in .github/workflows/docs.yml) - * - * Sidebar for /api/ is intentionally a static list of the public re-exports - * from src/index.ts. typedoc-plugin-markdown also writes its own README.md / - * modules.md that we link as the entry point. Adding a new public export -> - * remember to add it to the sidebar entry below. - */ - -const GUIDES = [ - { text: 'Quick start', link: '/guides/quickstart' }, - { text: 'Extract files', link: '/guides/extract' }, - { text: 'Detached runs', link: '/guides/detached' }, - { text: 'Security model', link: '/guides/security' }, - { text: 'gVisor & Kata', link: '/guides/gvisor-kata' }, -]; - -/* - * API sidebar mirrors the directory tree typedoc-plugin-markdown emits under - * docs/api/. Adding a new public export -> regenerate the API ref via - * `npm run docs:typedoc`, then add the corresponding entry here. The list is - * hand-maintained because VitePress does not auto-generate sidebars from a - * folder scan. - */ -const API_SIDEBAR = [ - { - text: 'Overview', - items: [{ text: 'Public surface', link: '/api/' }], - }, - { - text: 'Classes', - collapsed: false, - items: [ - { text: 'DockerRunner', link: '/api/classes/DockerRunner' }, - { text: 'Execution', link: '/api/classes/Execution' }, - { text: 'LightRunnerError', link: '/api/classes/LightRunnerError' }, - ], - }, - { - text: 'Interfaces', - collapsed: false, - items: [ - { text: 'RunRequest', link: '/api/interfaces/RunRequest' }, - { text: 'RunResult', link: '/api/interfaces/RunResult' }, - { text: 'RunnerOptions', link: '/api/interfaces/RunnerOptions' }, - { text: 'ExtractSpec', link: '/api/interfaces/ExtractSpec' }, - { text: 'ExtractResult', link: '/api/interfaces/ExtractResult' }, - { text: 'StopOptions', link: '/api/interfaces/StopOptions' }, - { text: 'RunState', link: '/api/interfaces/RunState' }, - { text: 'CreateNetworkOptions', link: '/api/interfaces/CreateNetworkOptions' }, - { text: 'CleanupNetworkOptions', link: '/api/interfaces/CleanupNetworkOptions' }, - { text: 'CleanupCacheOptions', link: '/api/interfaces/CleanupCacheOptions' }, - ], - }, - { - text: 'Functions', - collapsed: false, - items: [ - { text: 'listStates', link: '/api/functions/listStates' }, - { text: 'readState', link: '/api/functions/readState' }, - { text: 'createNetwork', link: '/api/functions/createNetwork' }, - { text: 'deleteNetwork', link: '/api/functions/deleteNetwork' }, - { text: 'networkExists', link: '/api/functions/networkExists' }, - { text: 'cleanupOrphanNetworks', link: '/api/functions/cleanupOrphanNetworks' }, - ], - }, - { - text: 'Type aliases', - collapsed: false, - items: [ - { text: 'Runtime', link: '/api/type-aliases/Runtime' }, - { text: 'LightRunnerErrorCode', link: '/api/type-aliases/LightRunnerErrorCode' }, - ], - }, -]; - -export default defineConfig({ - title: 'light-runner', - description: 'Run untrusted code in hardened Docker containers from Node.js', - lang: 'en-US', - // Project site is served under https://enixcode.github.io/light-runner/, so - // the base must match the sub-path. Without it VitePress emits asset URLs - // rooted at / (enixcode.github.io/assets/...) which 404, leaving the live - // site blank. VitePress auto-prepends this base to absolute (/...) asset - // and head URLs, so the favicon href stays '/banner.webp'. - base: '/light-runner/', - cleanUrls: true, - lastUpdated: true, - ignoreDeadLinks: 'localhostLinks', - - head: [ - ['link', { rel: 'icon', type: 'image/webp', href: '/banner.webp' }], - ['meta', { name: 'theme-color', content: '#050608' }], - ['meta', { property: 'og:title', content: 'light-runner' }], - [ - 'meta', - { - property: 'og:description', - content: 'Run untrusted code in hardened Docker containers from Node.js.', - }, - ], - ['meta', { property: 'og:image', content: 'https://enixcode.github.io/light-runner/banner.webp' }], - ['meta', { property: 'og:url', content: 'https://enixcode.github.io/light-runner/' }], - ['meta', { name: 'twitter:card', content: 'summary_large_image' }], - ['meta', { name: 'twitter:image', content: 'https://enixcode.github.io/light-runner/banner.webp' }], - ], - - // Bespoke landing + custom theme are dark-only by design (deep ink ground, - // cyan halo accents, noise + grid background). A light mode would have to - // be redesigned from scratch, so we lock the appearance to dark and hide - // the toggle entirely. - appearance: 'force-dark', - - themeConfig: { - nav: [ - { text: 'Guides', link: '/guides/quickstart', activeMatch: '^/guides/' }, - { text: 'API', link: '/api/', activeMatch: '^/api/' }, - { - text: `v${pkg.version}`, - items: [ - { text: 'Changelog', link: 'https://github.com/enixCode/light-runner/releases' }, - { text: 'npm', link: 'https://www.npmjs.com/package/light-runner' }, - ], - }, - ], - - sidebar: { - '/guides/': [ - { text: 'Guides', items: GUIDES }, - ], - '/api/': API_SIDEBAR, - }, - - socialLinks: [{ icon: 'github', link: 'https://github.com/enixCode/light-runner' }], - - footer: { - message: 'Released under the MIT License.', - copyright: 'light-runner / execution primitive', - }, - - search: { - provider: 'local', - }, - - editLink: { - pattern: 'https://github.com/enixCode/light-runner/edit/main/docs/:path', - text: 'Edit this page on GitHub', - }, - - outline: { level: [2, 3] }, - }, -}); diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css deleted file mode 100644 index d12a71e..0000000 --- a/docs/.vitepress/theme/custom.css +++ /dev/null @@ -1,546 +0,0 @@ -/* - * light-runner / VitePress theme overrides. - * Mirrors the bespoke landing's design language onto every guide and API page. - * - * Layers: - * 1. Fonts: Fraunces (display), IBM Plex Sans (body), JetBrains Mono (labels/code) - * 2. Palette tokens: dark ink, glacial cyan halo, amber/ember accents - * 3. Background: fixed-position GPU-composited noise + grid (zero scroll cost) - * 4. Chrome: nav, sidebar, content typography, code blocks, search dialog - */ - -@import url('https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght,SOFT,WONK@9..144,300..700,0..100,0..1&family=IBM+Plex+Sans:wght@300;400;500;600&family=JetBrains+Mono:wght@400;500&display=swap'); - -/* ---------- Palette + token bridge ---------- */ - -:root { - --ink: #050608; - --ink-2: #0a0c10; - --ink-3: #12151c; - --line: #1a1d24; - --line-hot: #242933; - --paper: #edeef0; - --paper-dim: #8a8f9a; - --paper-dimmer: #4d525c; - --halo: #c7e8ff; - --halo-soft: #7fddff; - --amber: #ffb855; - --ember: #ff6b35; -} - -/* Map our palette onto VitePress' design tokens. */ -:root { - --vp-c-bg: var(--ink); - --vp-c-bg-alt: var(--ink-2); - --vp-c-bg-elv: var(--ink-3); - --vp-c-bg-soft: var(--ink-2); - - --vp-c-default-1: var(--paper); - --vp-c-default-2: var(--paper-dim); - --vp-c-default-3: var(--paper-dimmer); - --vp-c-default-soft: rgba(127, 221, 255, 0.06); - - --vp-c-brand-1: var(--halo-soft); - --vp-c-brand-2: var(--halo); - --vp-c-brand-3: var(--halo-soft); - --vp-c-brand-soft: rgba(127, 221, 255, 0.10); - - --vp-c-tip-1: var(--halo-soft); - --vp-c-tip-2: var(--halo); - --vp-c-tip-soft: rgba(127, 221, 255, 0.08); - - --vp-c-warning-1: var(--amber); - --vp-c-warning-2: var(--amber); - --vp-c-warning-soft: rgba(255, 184, 85, 0.08); - - --vp-c-danger-1: var(--ember); - --vp-c-danger-2: var(--ember); - --vp-c-danger-soft: rgba(255, 107, 53, 0.10); - - --vp-c-text-1: var(--paper); - --vp-c-text-2: var(--paper-dim); - --vp-c-text-3: var(--paper-dimmer); - - --vp-c-divider: var(--line); - --vp-c-gutter: var(--ink); - - --vp-font-family-base: 'IBM Plex Sans', system-ui, sans-serif; - --vp-font-family-mono: 'JetBrains Mono', monospace; - - --vp-code-bg: var(--ink-2); - --vp-code-block-bg: var(--ink-2); - --vp-code-block-divider-color: var(--line); - --vp-code-line-highlight-color: rgba(127, 221, 255, 0.06); - - --vp-c-shadow-3: 0 0 24px rgba(127, 221, 255, 0.08); - - /* Sidebar widths slightly tighter than default for a more editorial feel. */ - --vp-layout-max-width: 1340px; - --vp-sidebar-width: 252px; -} - -html.dark { - /* Force dark — light theme would clash with the noise + halo palette. */ - --vp-c-bg: var(--ink); - --vp-c-bg-alt: var(--ink-2); -} - -/* ---------- Body + persistent grid + noise overlay ---------- */ - -html, body { - background-color: var(--ink); - color: var(--paper); -} - -body { - font-family: var(--vp-font-family-base); - font-weight: 300; - font-size: 16px; - line-height: 1.65; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - letter-spacing: 0.005em; -} - -/* Fixed GPU-composited background: noise + grid + radial halo. Same trick as - * the landing - one composited layer that survives scroll without repaints. - * Grid opacity intentionally low so the texture reads as atmosphere, not as - * a foreground element competing with the content. */ -body::before { - content: ""; - position: fixed; - inset: 0; - z-index: 0; - pointer-events: none; - background-color: var(--ink); - background-image: - url("data:image/svg+xml;utf8,"), - radial-gradient(ellipse 80% 60% at 50% 0%, rgba(127, 221, 255, 0.03), transparent 70%), - linear-gradient(rgba(255, 255, 255, 0.018) 1px, transparent 1px), - linear-gradient(90deg, rgba(255, 255, 255, 0.018) 1px, transparent 1px); - background-size: 180px 180px, 100% 100%, 96px 96px, 96px 96px; - background-position: 0 0, 0 0, 0 0, 0 0; - transform: translateZ(0); - will-change: transform; -} - -#app, .Layout, .VPContent { position: relative; z-index: 1; background: transparent; } -.VPDoc, .VPDoc.has-aside .content-container, .VPHome, .VPPage { background: transparent !important; } - -/* ---------- Top navbar ---------- */ - -.VPNav { - background: rgba(5, 6, 8, 0.78) !important; - backdrop-filter: blur(14px) saturate(140%); - -webkit-backdrop-filter: blur(14px) saturate(140%); - border-bottom: 1px solid var(--line); -} -.VPNavBar.has-sidebar .content, -.VPNavBar .content, -.VPNavBar .container { - background: transparent !important; -} -.VPNavBar .title { - font-family: 'Fraunces', serif; - font-weight: 400; - letter-spacing: -0.01em; - font-size: 17px; - color: var(--paper); -} -/* Glowing dot before the site title - mirrors the .mark-dot of the landing. */ -.VPNavBarTitle .title::before { - content: ""; - display: inline-block; - width: 9px; - height: 9px; - border-radius: 50%; - background: var(--halo); - box-shadow: 0 0 14px var(--halo-soft), 0 0 3px #fff inset; - margin-right: 12px; - vertical-align: middle; - transform: translateY(-1px); -} -.VPNavBarMenuLink, .VPNavBarMenuGroup .text { - font-family: 'JetBrains Mono', monospace; - font-size: 11px !important; - font-weight: 400 !important; - letter-spacing: 0.18em; - text-transform: uppercase; - color: var(--paper-dim) !important; - transition: color .2s; -} -.VPNavBarMenuLink:hover, .VPNavBarMenuGroup:hover .text { color: var(--paper) !important; } -.VPNavBarMenuLink.active { color: var(--halo) !important; } - -.VPNavBarSocialLinks svg { transition: transform .2s, color .2s; } -.VPNavBarSocialLinks a:hover svg { color: var(--halo) !important; transform: translateY(-1px); } - -/* ---------- Sidebar ---------- */ - -.VPSidebar { - background: rgba(10, 12, 16, 0.55) !important; - backdrop-filter: blur(8px); - -webkit-backdrop-filter: blur(8px); - border-right: 1px solid var(--line); - padding-top: 16px; -} -.VPSidebarItem .text { - font-family: 'IBM Plex Sans', system-ui, sans-serif; - font-weight: 400; - font-size: 14px; - letter-spacing: 0.005em; - color: var(--paper-dim); -} -.VPSidebarItem.is-active > .item .text, -.VPSidebarItem.has-active > .item .text { color: var(--halo) !important; font-weight: 500; } -.VPSidebarItem.level-0 > .item .text { - font-family: 'JetBrains Mono', monospace; - font-size: 10px; - font-weight: 500; - letter-spacing: 0.22em; - text-transform: uppercase; - color: var(--paper-dimmer); -} -.VPSidebarItem.level-0 > .item .text::before { - content: "// "; - color: var(--halo-soft); -} -.VPSidebarItem .link:hover .text { color: var(--paper) !important; } - -/* ---------- Document layout + typography ---------- */ - -.VPDoc .container { - padding-top: 28px; -} -.VPDoc h1, .VPDoc h2, .VPDoc h3, .VPDoc h4 { - font-family: 'Fraunces', serif; - letter-spacing: -0.018em; - color: var(--paper); -} -.VPDoc h1 { - font-weight: 350; - font-style: italic; - font-size: clamp(40px, 5vw, 64px); - line-height: 1.05; - margin-bottom: 28px; -} -.VPDoc h1 .strong, .VPDoc h2 .strong { color: var(--halo); font-style: normal; } -.VPDoc h2 { - font-weight: 350; - font-style: italic; - font-size: clamp(26px, 2.6vw, 34px); - line-height: 1.15; - margin-top: 56px; - padding-top: 16px; - border-top: 1px solid var(--line); -} -.VPDoc h2::before { - content: "// "; - font-style: normal; - font-family: 'JetBrains Mono', monospace; - font-weight: 500; - font-size: 10px; - letter-spacing: 0.22em; - color: var(--halo-soft); - vertical-align: middle; - margin-right: 6px; - text-transform: uppercase; - display: inline-block; - padding: 0 6px 1px 0; -} -.VPDoc h3 { - font-weight: 400; - font-size: clamp(18px, 1.3vw, 21px); - line-height: 1.25; - margin-top: 32px; - margin-bottom: 8px; - color: var(--paper); - letter-spacing: -0.01em; - font-style: normal; -} -.VPDoc h4 { - font-weight: 500; - font-size: 14px; - line-height: 1.3; - margin-top: 22px; - margin-bottom: 6px; - color: var(--paper); - font-style: normal; - font-family: 'IBM Plex Sans', system-ui, sans-serif; - letter-spacing: -0.005em; -} -.VPDoc h3 em, .VPDoc h2 em { - color: var(--halo); - font-style: italic; - font-weight: 300; -} -.VPDoc p { color: var(--paper); font-weight: 300; margin: 10px 0; } -.VPDoc p em { color: var(--paper-dim); font-style: italic; } -.VPDoc strong { color: var(--paper); font-weight: 500; } -/* TypeDoc-generated "Defined in: src/foo.ts:NN" lines - dim, small, mono. */ -.VPDoc p:has(> a[href*="src/"]) { - font-family: 'JetBrains Mono', monospace; - font-size: 11px; - color: var(--paper-dimmer); - margin: 4px 0 14px; - letter-spacing: 0; -} -.VPDoc p:has(> a[href*="src/"]) a { - color: var(--paper-dim); - border-bottom: none; -} -.VPDoc p:has(> a[href*="src/"]) a:hover { color: var(--halo); } -.VPDoc hr { - border: none; - height: 1px; - margin: 6px 0; - background: linear-gradient( - 90deg, - transparent 0%, - rgba(127, 221, 255, 0.45) 12%, - rgba(127, 221, 255, 0.45) 88%, - transparent 100% - ); - box-shadow: 0 0 12px rgba(127, 221, 255, 0.25); -} -/* When an h3 follows an hr (typedoc property-list pattern), kill its - * margin-top so the divider sits flush against the next property name. */ -.VPDoc hr + h3, -.VPDoc hr + h4 { - margin-top: 14px; -} -.VPDoc a { - color: var(--halo); - text-decoration: none; - border-bottom: 1px solid transparent; - transition: border-color .15s; -} -.VPDoc a:hover { border-bottom-color: var(--halo); } -.VPDoc ul, .VPDoc ol { color: var(--paper); } -.VPDoc li { margin: 6px 0; } -.VPDoc hr { border-color: var(--line); margin: 48px 0; } - -.VPDoc blockquote { - border-left: 2px solid var(--halo-soft); - background: rgba(127, 221, 255, 0.04); - padding: 18px 22px; - margin: 24px 0; - color: var(--paper-dim); - font-family: 'Fraunces', serif; - font-style: italic; - font-weight: 300; - font-size: 17px; -} -.VPDoc blockquote p { margin: 0; } -.VPDoc blockquote strong { color: var(--paper); font-style: normal; } - -/* ---------- Tables ---------- */ - -.VPDoc table { - border-collapse: collapse; - margin: 24px 0; - display: table; - width: 100%; -} -.VPDoc th, .VPDoc td { - border: 1px solid var(--line); - padding: 12px 16px; - text-align: left; - background: transparent; -} -.VPDoc th { - font-family: 'JetBrains Mono', monospace; - font-size: 11px; - font-weight: 500; - letter-spacing: 0.14em; - text-transform: uppercase; - color: var(--halo-soft); - background: rgba(127, 221, 255, 0.04); -} -.VPDoc tr:nth-child(2n) td { background: rgba(255, 255, 255, 0.012); } - -/* ---------- Inline code + code blocks ---------- */ - -.VPDoc :not(pre) > code { - font-family: 'JetBrains Mono', monospace; - font-size: 13px; - background: var(--ink-2); - color: var(--halo); - padding: 2px 7px; - border-radius: 2px; - border: 1px solid var(--line); -} -.VPDoc div[class*="language-"] { - background: var(--ink-2); - border: 1px solid var(--line); - border-radius: 2px; - margin: 12px 0 18px; - position: relative; - overflow: hidden; -} -/* On API pages h3 + code block is the dominant pattern (one per property); - * pull the code right under the header with no margin between them. */ -.VPDoc h3 + div[class*="language-"], -.VPDoc h4 + div[class*="language-"] { - margin-top: 6px; -} -.VPDoc div[class*="language-"]::before { - /* Mac-style traffic-light dots above the code block, mirrors .code-window of landing. */ - content: ""; - display: block; - height: 32px; - border-bottom: 1px solid var(--line); - background: var(--ink-3) url("data:image/svg+xml;utf8,") 16px 12px no-repeat; -} -.VPDoc div[class*="language-"] pre { - background: transparent !important; - padding: 18px 24px !important; - font-size: 13px; - line-height: 1.65; - color: var(--paper); -} -.VPDoc div[class*="language-"] .lang { - display: none; /* hide the small lang badge; the dots already mark the block */ -} -.VPDoc div[class*="language-"] .copy { - top: 6px !important; - right: 8px !important; - background: transparent !important; - border: 1px solid var(--line-hot) !important; - color: var(--paper-dim) !important; - font-family: 'JetBrains Mono', monospace !important; - font-size: 9px !important; - letter-spacing: 0.18em; - text-transform: uppercase; -} -.VPDoc div[class*="language-"] .copy:hover { - background: var(--halo) !important; - color: var(--ink) !important; - border-color: var(--halo) !important; -} - -/* ---------- Aside (right outline) ---------- */ - -.VPDocAside .outline-marker { - background: var(--halo) !important; -} -.VPDocAside .outline-title, -.VPDocAside .outline-link { - font-family: 'JetBrains Mono', monospace; -} -.VPDocAside .outline-title { - font-size: 10px; - font-weight: 500; - letter-spacing: 0.22em; - text-transform: uppercase; - color: var(--paper-dimmer); -} -.VPDocAside .outline-title::before { - content: "// "; - color: var(--halo-soft); -} -.VPDocAside .outline-link { - font-size: 12px; - color: var(--paper-dim); - letter-spacing: 0; - text-transform: none; - transition: color .2s; -} -.VPDocAside .outline-link:hover, -.VPDocAside .outline-link.active { color: var(--halo) !important; } - -/* ---------- Search dialog ---------- */ - -.VPLocalSearchBox .shell { - background: var(--ink-2) !important; - border: 1px solid var(--line-hot) !important; -} -.VPLocalSearchBox .search-bar { - background: var(--ink-3); - border-bottom: 1px solid var(--line); -} -.VPLocalSearchBox .search-input { - font-family: 'JetBrains Mono', monospace; - color: var(--paper); -} -.VPNavBarSearch .DocSearch-Button, -.VPNavBarSearchButton { - background: transparent !important; - border: 1px solid var(--line) !important; - color: var(--paper-dim) !important; -} -.VPNavBarSearch .DocSearch-Button:hover { border-color: var(--halo-soft) !important; color: var(--paper) !important; } - -/* ---------- Edit-this-page + last-updated + prev/next ---------- */ - -.VPDocFooter, .edit-info { - border-top: 1px solid var(--line); -} -.edit-link-button { - font-family: 'JetBrains Mono', monospace; - font-size: 11px; - letter-spacing: 0.18em; - text-transform: uppercase; - color: var(--paper-dim) !important; -} -.edit-link-button:hover { color: var(--halo) !important; } -.last-updated { - font-family: 'JetBrains Mono', monospace; - font-size: 10px; - letter-spacing: 0.14em; - color: var(--paper-dimmer); -} -.pager-link { - border: 1px solid var(--line); - background: var(--ink-2); - transition: border-color .2s, transform .2s; -} -.pager-link:hover { border-color: var(--halo-soft); transform: translateY(-1px); } -.pager-link .desc { - font-family: 'JetBrains Mono', monospace; - font-size: 10px; - letter-spacing: 0.18em; - text-transform: uppercase; - color: var(--paper-dimmer); -} -.pager-link .title { - font-family: 'Fraunces', serif; - font-style: italic; - font-weight: 300; - color: var(--paper); -} - -/* ---------- Footer ---------- */ - -.VPFooter { - background: transparent !important; - border-top: 1px solid var(--line); - font-family: 'JetBrains Mono', monospace; - font-size: 10px; - letter-spacing: 0.18em; - text-transform: uppercase; - color: var(--paper-dimmer) !important; -} -.VPFooter .message, .VPFooter .copyright { color: var(--paper-dimmer) !important; } - -/* ---------- Selection + focus ---------- */ - -::selection { background: var(--halo); color: var(--ink); } -a:focus-visible, button:focus-visible { - outline: 1px solid var(--halo); - outline-offset: 3px; - border-radius: 1px; -} - -/* ---------- Reduced motion ---------- */ - -@media (prefers-reduced-motion: reduce) { - * { animation: none !important; transition: none !important; } -} - -/* ---------- Mobile tweaks ---------- */ - -@media (max-width: 720px) { - .VPDoc h2 { margin-top: 40px; } - .VPDoc h1 { font-size: 36px; } -} diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts deleted file mode 100644 index e435138..0000000 --- a/docs/.vitepress/theme/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Theme } from 'vitepress'; -import DefaultTheme from 'vitepress/theme'; -import './custom.css'; -import './landing.css'; - -/* - * Extends VitePress' default theme with the light-runner laboratory aesthetic: - * Fraunces display, IBM Plex Sans body, JetBrains Mono labels, ink/paper/halo - * palette, persistent grid + noise background. Defined here, applied to every - * route under /guides/ and /api/ so the chrome matches the bespoke landing - * served at /. - */ -export default { - extends: DefaultTheme, -} satisfies Theme; diff --git a/docs/.vitepress/theme/landing.css b/docs/.vitepress/theme/landing.css deleted file mode 100644 index cf112d8..0000000 --- a/docs/.vitepress/theme/landing.css +++ /dev/null @@ -1,598 +0,0 @@ -/* Bespoke landing styles. Loaded by theme/index.ts. Selectors are mostly class-based (.hero, .prim, etc.) so they only match elements present on the landing page; the few that could collide with VitePress chrome (section, main/header/footer) are scoped to .bespoke-landing / .bespoke-landing-wrap. */ - :root { - --ink: #050608; - --ink-2: #0a0c10; - --ink-3: #12151c; - --line: #1a1d24; - --line-hot: #242933; - --paper: #edeef0; - --paper-dim: #8a8f9a; - --paper-dimmer: #4d525c; - --halo: #c7e8ff; - --halo-soft: #7fddff; - --amber: #ffb855; - --ember: #ff6b35; - } - - - - .bespoke-landing main, .bespoke-landing header, .bespoke-landing footer { position: relative; z-index: 1; } - - /* ---------- typography ---------- */ - - .display { - font-family: 'Fraunces', serif; - font-variation-settings: "SOFT" 50, "WONK" 1; - font-weight: 350; - letter-spacing: -0.02em; - line-height: 1; - } - .label { - font-family: 'JetBrains Mono', monospace; - font-weight: 500; - font-size: 11px; - letter-spacing: 0.22em; - text-transform: uppercase; - color: var(--paper-dim); - } - .label::before { - content: "// "; - color: var(--halo-soft); - } - code, pre, .mono { - font-family: 'JetBrains Mono', monospace; - font-size: 13px; - } - - /* ---------- layout ---------- */ - - .shell { - max-width: 1240px; - margin: 0 auto; - padding: 0 clamp(24px, 5vw, 64px); - } - - /* ---------- top bar ---------- */ - - header.top { - padding: 28px 0 0; - } - .top-row { - display: flex; - align-items: center; - justify-content: space-between; - padding-bottom: 20px; - border-bottom: 1px solid var(--line); - } - .mark { - display: inline-flex; - align-items: center; - gap: 10px; - font-family: 'Fraunces', serif; - font-weight: 400; - font-size: 17px; - letter-spacing: -0.01em; - color: var(--paper); - text-decoration: none; - } - .mark-dot { - width: 10px; height: 10px; - border-radius: 50%; - background: var(--halo); - box-shadow: 0 0 14px var(--halo-soft), 0 0 3px #fff inset; - } - .mark em { - font-style: italic; - font-weight: 300; - color: var(--paper-dim); - font-size: 12px; - margin-left: 6px; - } - nav.top-nav { - display: flex; gap: 28px; - } - nav.top-nav a { - font-size: 12px; - letter-spacing: 0.18em; - text-transform: uppercase; - font-family: 'JetBrains Mono', monospace; - font-weight: 400; - color: var(--paper-dim); - text-decoration: none; - transition: color .2s; - } - nav.top-nav a:hover { color: var(--paper); } - nav.top-nav a:hover::before { content: "› "; color: var(--halo-soft); } - @media (max-width: 720px) { - nav.top-nav a:not(.primary) { display: none; } - } - nav.top-nav a.primary { - color: var(--ink); - background: var(--halo); - padding: 8px 14px; - border-radius: 2px; - } - nav.top-nav a.primary::before { display: none !important; } - - /* ---------- hero ---------- */ - - .bespoke-landing section.hero { - padding: clamp(60px, 10vh, 120px) 0 60px; - display: grid; - grid-template-columns: 1fr; - gap: 60px; - align-items: end; - } - - .hero-headline { max-width: 860px; } - .hero-eyebrow { - display: flex; align-items: center; gap: 14px; - margin-bottom: 32px; - opacity: 0; transform: translateY(8px); - animation: rise .9s .1s forwards cubic-bezier(.2,.7,.2,1); - } - .hero-eyebrow .v { color: var(--halo-soft); font-family: 'JetBrains Mono', monospace; font-size: 11px; letter-spacing: 0.18em; } - .hero-eyebrow .divider { width: 36px; height: 1px; background: var(--line-hot); } - .hero-eyebrow .tag { font-family: 'JetBrains Mono', monospace; font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--paper-dim); } - - h1.display { - font-size: clamp(52px, 9vw, 124px); - opacity: 0; transform: translateY(16px); - animation: rise 1s .15s forwards cubic-bezier(.2,.7,.2,1); - } - h1.display .accent { - font-style: italic; - font-weight: 300; - color: var(--halo); - } - h1.display .shy { - font-style: italic; - font-weight: 300; - color: var(--paper-dim); - } - - .hero-lede { - font-family: 'Fraunces', serif; - font-weight: 300; - font-size: clamp(18px, 2vw, 22px); - line-height: 1.45; - color: var(--paper); - max-width: 640px; - margin-top: 36px; - opacity: 0; transform: translateY(12px); - animation: rise 1s .3s forwards cubic-bezier(.2,.7,.2,1); - } - .hero-lede em { - color: var(--paper-dim); - font-style: italic; - } - - .hero-meta { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); - gap: 24px 48px; - margin-top: 48px; - padding-top: 28px; - border-top: 1px solid var(--line); - opacity: 0; transform: translateY(12px); - animation: rise 1s .45s forwards cubic-bezier(.2,.7,.2,1); - } - .hero-meta .cell { } - .hero-meta .k { font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--paper-dimmer); margin-bottom: 6px; } - .hero-meta .v { font-family: 'Fraunces', serif; font-size: 22px; font-weight: 350; letter-spacing: -0.01em; } - .hero-meta .v .sub { color: var(--paper-dim); font-size: 13px; margin-left: 6px; font-family: 'JetBrains Mono', monospace; letter-spacing: 0; text-transform: none; } - - .hero-banner { - margin-top: clamp(48px, 8vh, 96px); - position: relative; - overflow: hidden; - border: 1px solid var(--line); - border-radius: 2px; - background: #000; - aspect-ratio: 16 / 5; - opacity: 0; transform: translateY(20px); - animation: rise 1.4s .6s forwards cubic-bezier(.2,.7,.2,1); - } - .hero-banner img { - width: 100%; height: 100%; - object-fit: cover; - display: block; - filter: contrast(1.05); - } - .hero-banner::before { - content: ""; - position: absolute; inset: 0; - background: linear-gradient(180deg, transparent 60%, var(--ink) 100%); - pointer-events: none; - } - .hero-banner .corners { - position: absolute; inset: 12px; - pointer-events: none; - } - .hero-banner .corners::before, - .hero-banner .corners::after { - content: ""; - position: absolute; - width: 14px; height: 14px; - border: 1px solid var(--halo-soft); - opacity: .6; - } - .hero-banner .corners::before { top: 0; left: 0; border-right: none; border-bottom: none; } - .hero-banner .corners::after { bottom: 0; right: 0; border-left: none; border-top: none; } - - .hero-banner-caption { - display: flex; justify-content: space-between; - margin-top: 12px; - font-family: 'JetBrains Mono', monospace; - font-size: 10px; - letter-spacing: 0.2em; - color: var(--paper-dimmer); - text-transform: uppercase; - } - - /* ---------- section frame ---------- */ - - .bespoke-landing section { - padding: clamp(80px, 12vh, 140px) 0; - border-top: 1px solid var(--line); - position: relative; - } - .bespoke-landing section .section-head { - display: grid; - grid-template-columns: 160px 1fr; - gap: 48px; - margin-bottom: 64px; - align-items: baseline; - } - .bespoke-landing section .section-head .label { padding-top: 10px; } - .bespoke-landing section h2 { - font-family: 'Fraunces', serif; - font-weight: 350; - font-style: italic; - font-size: clamp(32px, 4.5vw, 56px); - letter-spacing: -0.015em; - line-height: 1.05; - max-width: 820px; - } - .bespoke-landing section h2 .strong { - font-style: normal; - color: var(--halo); - font-variation-settings: "WONK" 1; - } - @media (max-width: 720px) { - .bespoke-landing section .section-head { grid-template-columns: 1fr; gap: 8px; margin-bottom: 36px; } - } - - /* ---------- primitives grid ---------- */ - - .prims { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); - gap: 0; - border-top: 1px solid var(--line); - } - .prim { - padding: 36px 32px 40px; - border-bottom: 1px solid var(--line); - border-right: 1px solid var(--line); - position: relative; - transition: background .25s; - } - .prim:hover { background: var(--ink-2); } - .prim:last-child { border-right: 1px solid var(--line); } - @media (max-width: 720px) { .prim { border-right: none !important; } } - - .prim .num { - font-family: 'JetBrains Mono', monospace; - font-size: 11px; - color: var(--halo-soft); - letter-spacing: 0.2em; - margin-bottom: 32px; - display: flex; align-items: center; gap: 10px; - } - .prim .num::after { - content: ""; flex: 1; height: 1px; background: var(--line-hot); - } - .prim h3 { - font-family: 'Fraunces', serif; - font-weight: 400; - font-size: 24px; - line-height: 1.15; - margin-bottom: 14px; - letter-spacing: -0.01em; - } - .prim h3 em { color: var(--halo); font-style: italic; font-weight: 300; } - .prim p { - font-size: 14px; - line-height: 1.6; - color: var(--paper-dim); - max-width: 34ch; - } - - /* ---------- code block ---------- */ - - .code-window { - border: 1px solid var(--line); - background: var(--ink-2); - border-radius: 2px; - overflow: hidden; - margin-top: 8px; - } - .code-window .bar { - display: flex; align-items: center; justify-content: space-between; - padding: 10px 16px; - border-bottom: 1px solid var(--line); - background: var(--ink-3); - font-family: 'JetBrains Mono', monospace; - font-size: 11px; - color: var(--paper-dimmer); - letter-spacing: 0.15em; - text-transform: uppercase; - } - .code-window .bar .pills { - display: inline-flex; gap: 6px; - } - .code-window .bar .pills i { - width: 8px; height: 8px; border-radius: 50%; display: inline-block; - background: #2a2f38; - } - .code-window .bar .pills i:first-child { background: #ff5f57; opacity: .55; } - .code-window .bar .pills i:nth-child(2) { background: #febc2e; opacity: .55; } - .code-window .bar .pills i:nth-child(3) { background: #28c840; opacity: .55; } - .code-window pre { - padding: 28px 32px; - overflow-x: auto; - font-size: 13px; - line-height: 1.75; - color: var(--paper); - } - .code-window pre .k { color: var(--halo-soft); } - .code-window pre .s { color: #f5d796; } - .code-window pre .c { color: var(--paper-dimmer); font-style: italic; } - .code-window pre .f { color: var(--paper); } - .code-window pre .p { color: var(--paper-dim); } - .code-window pre .n { color: #c8b6ff; } - button.copy { - background: transparent; - border: 1px solid var(--line-hot); - color: var(--paper-dim); - font-family: 'JetBrains Mono', monospace; - font-size: 10px; - letter-spacing: 0.18em; - text-transform: uppercase; - padding: 4px 10px; - cursor: pointer; - border-radius: 2px; - transition: all .2s; - } - button.copy:hover { color: var(--ink); background: var(--halo); border-color: var(--halo); } - button.copy.done { color: var(--ink); background: var(--halo-soft); border-color: var(--halo-soft); } - - /* ---------- quick-start split ---------- */ - - .qstart { - display: grid; - grid-template-columns: 5fr 7fr; - gap: 64px; - align-items: start; - } - @media (max-width: 900px) { .qstart { grid-template-columns: 1fr; gap: 36px; } } - - .qstart .side p { - font-family: 'Fraunces', serif; - font-size: 19px; - line-height: 1.55; - color: var(--paper); - font-weight: 300; - } - .qstart .side p + p { margin-top: 18px; color: var(--paper-dim); } - .qstart .side .install { - margin-top: 28px; - display: inline-flex; - align-items: center; - gap: 12px; - font-family: 'JetBrains Mono', monospace; - font-size: 13px; - padding: 12px 18px; - border: 1px solid var(--line-hot); - background: var(--ink-2); - border-radius: 2px; - } - .qstart .side .install::before { - content: "$"; color: var(--halo-soft); - } - - /* ---------- security block ---------- */ - - .sec-grid { - display: grid; - grid-template-columns: 1fr 1fr; - border-top: 1px solid var(--line); - } - .sec-grid .row { - display: contents; - } - .sec-grid .k, .sec-grid .v { - padding: 20px 24px; - border-bottom: 1px solid var(--line); - } - .sec-grid .k { - font-family: 'JetBrains Mono', monospace; - font-size: 12px; - letter-spacing: 0.05em; - color: var(--halo-soft); - border-right: 1px solid var(--line); - } - .sec-grid .v { - font-size: 14px; - color: var(--paper-dim); - line-height: 1.6; - } - .sec-grid .v strong { color: var(--paper); font-weight: 400; } - @media (max-width: 720px) { - .sec-grid { grid-template-columns: 1fr; } - .sec-grid .k { border-right: none; padding-bottom: 4px; } - .sec-grid .v { padding-top: 4px; } - } - - .sec-note { - margin-top: 40px; - padding: 20px 24px; - border-left: 2px solid var(--amber); - background: rgba(255, 184, 85, 0.04); - font-size: 14px; - color: var(--paper-dim); - line-height: 1.6; - } - .sec-note strong { color: var(--amber); font-weight: 500; } - - /* ---------- ecosystem cards ---------- */ - - .eco { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 20px; - } - @media (max-width: 900px) { .eco { grid-template-columns: 1fr; } } - - .eco-card { - padding: 32px 28px 28px; - border: 1px solid var(--line); - background: linear-gradient(180deg, var(--ink-2) 0%, var(--ink) 100%); - border-radius: 2px; - position: relative; - overflow: hidden; - transition: border-color .25s, transform .25s; - } - .eco-card:hover { border-color: var(--line-hot); transform: translateY(-2px); } - .eco-card.this { - border-color: var(--halo-soft); - background: linear-gradient(180deg, rgba(127,221,255,0.06) 0%, var(--ink) 100%); - } - .eco-card.this::after { - content: "this repo"; - position: absolute; - top: 16px; right: 16px; - font-family: 'JetBrains Mono', monospace; - font-size: 10px; - letter-spacing: 0.2em; - text-transform: uppercase; - color: var(--ink); - background: var(--halo); - padding: 4px 8px; - border-radius: 2px; - } - .eco-card .mono-name { - font-family: 'JetBrains Mono', monospace; - font-weight: 500; - font-size: 15px; - color: var(--paper); - margin-bottom: 18px; - } - .eco-card h3 { - font-family: 'Fraunces', serif; - font-weight: 400; - font-size: 20px; - line-height: 1.2; - margin-bottom: 10px; - letter-spacing: -0.01em; - } - .eco-card p { - font-size: 13px; - color: var(--paper-dim); - line-height: 1.55; - } - .eco-card .status { - margin-top: 22px; - font-family: 'JetBrains Mono', monospace; - font-size: 10px; - letter-spacing: 0.2em; - text-transform: uppercase; - color: var(--paper-dimmer); - display: flex; align-items: center; gap: 8px; - } - .eco-card .status::before { - content: ""; width: 6px; height: 6px; border-radius: 50%; - background: var(--paper-dimmer); - } - .eco-card.this .status::before { background: var(--halo); box-shadow: 0 0 10px var(--halo-soft); } - .eco-card.this .status { color: var(--halo-soft); } - /* Eco-card version: hidden by default, surfaced once GitHub API resolves. */ - .eco-card .status .status-version:not(:empty)::before { content: " - "; } - - /* ---------- footer ---------- */ - - footer { - padding: 56px 0 48px; - border-top: 1px solid var(--line); - } - .foot-row { - display: flex; - justify-content: space-between; - align-items: flex-end; - flex-wrap: wrap; - gap: 32px; - } - .foot-row .sig { - font-family: 'Fraunces', serif; - font-style: italic; - font-weight: 300; - font-size: 14px; - color: var(--paper-dim); - max-width: 320px; - line-height: 1.5; - } - .foot-links { - display: flex; gap: 32px; - } - .foot-links a { - color: var(--paper-dim); - text-decoration: none; - font-family: 'JetBrains Mono', monospace; - font-size: 11px; - letter-spacing: 0.18em; - text-transform: uppercase; - transition: color .2s; - } - .foot-links a:hover { color: var(--halo); } - .foot-meta { - margin-top: 36px; - padding-top: 20px; - border-top: 1px solid var(--line); - display: flex; - justify-content: space-between; - font-family: 'JetBrains Mono', monospace; - font-size: 10px; - letter-spacing: 0.2em; - text-transform: uppercase; - color: var(--paper-dimmer); - } - - /* ---------- motion ---------- */ - - @keyframes rise { - to { opacity: 1; transform: translateY(0); } - } - - /* Fallback for users with prefers-reduced-motion: reduce. The hero elements - * start at opacity: 0 and rely on the rise animation to become visible; if - * the animation is suppressed by the reduced-motion media query in custom.css, - * we must surface them anyway, otherwise the entire hero reads as empty space. */ - @media (prefers-reduced-motion: reduce) { - .bespoke-landing .hero-eyebrow, - .bespoke-landing h1.display, - .bespoke-landing .hero-lede, - .bespoke-landing .hero-meta, - .bespoke-landing .hero-banner { - opacity: 1 !important; - transform: none !important; - animation: none !important; - } - } - - - /* ---------- focus ---------- */ - a:focus-visible, button:focus-visible { - outline: 1px solid var(--halo); - outline-offset: 3px; - } diff --git a/docs/api/classes/DockerRunner.md b/docs/api/classes/DockerRunner.md deleted file mode 100644 index de59ce2..0000000 --- a/docs/api/classes/DockerRunner.md +++ /dev/null @@ -1,205 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / DockerRunner - -# Class: DockerRunner - -Defined in: [src/DockerRunner.ts:16](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L16) - -## Constructors - -### Constructor - -```ts -new DockerRunner(options?): DockerRunner; -``` - -Defined in: [src/DockerRunner.ts:19](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L19) - -#### Parameters - -##### options? - -[`RunnerOptions`](../interfaces/RunnerOptions.md) = `{}` - -#### Returns - -`DockerRunner` - -## Methods - -### run() - -```ts -run(request): Execution; -``` - -Defined in: [src/DockerRunner.ts:29](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L29) - -#### Parameters - -##### request - -[`RunRequest`](../interfaces/RunRequest.md) - -#### Returns - -[`Execution`](Execution.md) - -*** - -### attach() - -```ts -static attach(id): Execution | null; -``` - -Defined in: [src/DockerRunner.ts:142](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L142) - -#### Parameters - -##### id - -`string` - -#### Returns - -[`Execution`](Execution.md) \| `null` - -*** - -### cleanupOldStates() - -```ts -static cleanupOldStates(maxBytes?): number; -``` - -Defined in: [src/DockerRunner.ts:157](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L157) - -#### Parameters - -##### maxBytes? - -`number` - -#### Returns - -`number` - -*** - -### cleanupOrphanCache() - -```ts -static cleanupOrphanCache(opts?): Promise; -``` - -Defined in: [src/DockerRunner.ts:122](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L122) - -#### Parameters - -##### opts? - -[`CleanupCacheOptions`](../interfaces/CleanupCacheOptions.md) = `{}` - -#### Returns - -`Promise`\<`number`\> - -*** - -### cleanupOrphanNetworks() - -```ts -static cleanupOrphanNetworks(opts?): Promise; -``` - -Defined in: [src/DockerRunner.ts:133](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L133) - -#### Parameters - -##### opts? - -[`CleanupNetworkOptions`](../interfaces/CleanupNetworkOptions.md) = `{}` - -#### Returns - -`Promise`\<`number`\> - -*** - -### cleanupOrphanStates() - -```ts -static cleanupOrphanStates(): Promise; -``` - -Defined in: [src/DockerRunner.ts:167](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L167) - -#### Returns - -`Promise`\<`number`\> - -*** - -### cleanupOrphanVolumes() - -```ts -static cleanupOrphanVolumes(): Promise; -``` - -Defined in: [src/DockerRunner.ts:113](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L113) - -#### Returns - -`Promise`\<`number`\> - -*** - -### isAvailable() - -```ts -static isAvailable(): Promise; -``` - -Defined in: [src/DockerRunner.ts:109](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L109) - -#### Returns - -`Promise`\<`boolean`\> - -*** - -### list() - -```ts -static list(): RunState[]; -``` - -Defined in: [src/DockerRunner.ts:146](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L146) - -#### Returns - -[`RunState`](../interfaces/RunState.md)[] - -*** - -### reapOrphans() - -```ts -static reapOrphans(): Promise<{ - containers: number; - volumes: number; -}>; -``` - -Defined in: [src/DockerRunner.ts:178](https://github.com/enixCode/light-runner/blob/main/src/DockerRunner.ts#L178) - -#### Returns - -`Promise`\<\{ - `containers`: `number`; - `volumes`: `number`; -\}\> diff --git a/docs/api/classes/Execution.md b/docs/api/classes/Execution.md deleted file mode 100644 index 2dbb376..0000000 --- a/docs/api/classes/Execution.md +++ /dev/null @@ -1,138 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / Execution - -# Class: Execution - -Defined in: [src/Execution.ts:17](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L17) - -## Constructors - -### Constructor - -```ts -new Execution( - id, - result, - onCancel): Execution; -``` - -Defined in: [src/Execution.ts:22](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L22) - -#### Parameters - -##### id - -`string` - -##### result - -`Promise`\<[`RunResult`](../interfaces/RunResult.md)\> - -##### onCancel - -() => `void` - -#### Returns - -`Execution` - -## Properties - -### id - -```ts -readonly id: string; -``` - -Defined in: [src/Execution.ts:18](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L18) - -*** - -### result - -```ts -readonly result: Promise; -``` - -Defined in: [src/Execution.ts:19](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L19) - -## Accessors - -### cancelled - -#### Get Signature - -```ts -get cancelled(): boolean; -``` - -Defined in: [src/Execution.ts:45](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L45) - -##### Returns - -`boolean` - -## Methods - -### cancel() - -```ts -cancel(): void; -``` - -Defined in: [src/Execution.ts:36](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L36) - -#### Returns - -`void` - -*** - -### pause() - -```ts -pause(): Promise; -``` - -Defined in: [src/Execution.ts:92](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L92) - -#### Returns - -`Promise`\<`void`\> - -*** - -### resume() - -```ts -resume(): Promise; -``` - -Defined in: [src/Execution.ts:100](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L100) - -#### Returns - -`Promise`\<`void`\> - -*** - -### stop() - -```ts -stop(options?): Promise; -``` - -Defined in: [src/Execution.ts:54](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L54) - -#### Parameters - -##### options? - -[`StopOptions`](../interfaces/StopOptions.md) = `{}` - -#### Returns - -`Promise`\<`void`\> diff --git a/docs/api/classes/LightRunnerError.md b/docs/api/classes/LightRunnerError.md deleted file mode 100644 index 011710b..0000000 --- a/docs/api/classes/LightRunnerError.md +++ /dev/null @@ -1,299 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / LightRunnerError - -# Class: LightRunnerError - -Defined in: [src/errors.ts:25](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L25) - -## Extends - -- `Error` - -## Properties - -### cause? - -```ts -optional cause?: unknown; -``` - -Defined in: node\_modules/typescript/lib/lib.es2022.error.d.ts:24 - -#### Inherited from - -```ts -Error.cause -``` - -*** - -### code - -```ts -readonly code: LightRunnerErrorCode; -``` - -Defined in: [src/errors.ts:26](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L26) - -*** - -### containerId? - -```ts -readonly optional containerId?: string; -``` - -Defined in: [src/errors.ts:28](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L28) - -*** - -### dockerOp? - -```ts -readonly optional dockerOp?: string; -``` - -Defined in: [src/errors.ts:27](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L27) - -*** - -### message - -```ts -message: string; -``` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1075 - -#### Inherited from - -```ts -Error.message -``` - -*** - -### name - -```ts -name: string; -``` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1074 - -#### Inherited from - -```ts -Error.name -``` - -*** - -### stack? - -```ts -optional stack?: string; -``` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1076 - -#### Inherited from - -```ts -Error.stack -``` - -*** - -### stackTraceLimit - -```ts -static stackTraceLimit: number; -``` - -Defined in: node\_modules/@types/node/globals.d.ts:67 - -The `Error.stackTraceLimit` property specifies the number of stack frames -collected by a stack trace (whether generated by `new Error().stack` or -`Error.captureStackTrace(obj)`). - -The default value is `10` but may be set to any valid JavaScript number. Changes -will affect any stack trace captured _after_ the value has been changed. - -If set to a non-number value, or set to a negative number, stack traces will -not capture any frames. - -#### Inherited from - -```ts -Error.stackTraceLimit -``` - -## Methods - -### toJSON() - -```ts -toJSON(): { - code: LightRunnerErrorCode; - containerId?: string; - dockerOp?: string; - message: string; - name: string; -}; -``` - -Defined in: [src/errors.ts:39](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L39) - -#### Returns - -```ts -{ - code: LightRunnerErrorCode; - containerId?: string; - dockerOp?: string; - message: string; - name: string; -} -``` - -##### code - -```ts -code: LightRunnerErrorCode; -``` - -##### containerId? - -```ts -optional containerId?: string; -``` - -##### dockerOp? - -```ts -optional dockerOp?: string; -``` - -##### message - -```ts -message: string; -``` - -##### name - -```ts -name: string; -``` - -*** - -### captureStackTrace() - -```ts -static captureStackTrace(targetObject, constructorOpt?): void; -``` - -Defined in: node\_modules/@types/node/globals.d.ts:51 - -Creates a `.stack` property on `targetObject`, which when accessed returns -a string representing the location in the code at which -`Error.captureStackTrace()` was called. - -```js -const myObject = {}; -Error.captureStackTrace(myObject); -myObject.stack; // Similar to `new Error().stack` -``` - -The first line of the trace will be prefixed with -`${myObject.name}: ${myObject.message}`. - -The optional `constructorOpt` argument accepts a function. If given, all frames -above `constructorOpt`, including `constructorOpt`, will be omitted from the -generated stack trace. - -The `constructorOpt` argument is useful for hiding implementation -details of error generation from the user. For instance: - -```js -function a() { - b(); -} - -function b() { - c(); -} - -function c() { - // Create an error without stack trace to avoid calculating the stack trace twice. - const { stackTraceLimit } = Error; - Error.stackTraceLimit = 0; - const error = new Error(); - Error.stackTraceLimit = stackTraceLimit; - - // Capture the stack trace above function b - Error.captureStackTrace(error, b); // Neither function c, nor b is included in the stack trace - throw error; -} - -a(); -``` - -#### Parameters - -##### targetObject - -`object` - -##### constructorOpt? - -`Function` - -#### Returns - -`void` - -#### Inherited from - -```ts -Error.captureStackTrace -``` - -*** - -### prepareStackTrace() - -```ts -static prepareStackTrace(err, stackTraces): any; -``` - -Defined in: node\_modules/@types/node/globals.d.ts:55 - -#### Parameters - -##### err - -`Error` - -##### stackTraces - -`CallSite`[] - -#### Returns - -`any` - -#### See - -https://v8.dev/docs/stack-trace-api#customizing-stack-traces - -#### Inherited from - -```ts -Error.prepareStackTrace -``` diff --git a/docs/api/functions/cleanupOrphanNetworks.md b/docs/api/functions/cleanupOrphanNetworks.md deleted file mode 100644 index b99793e..0000000 --- a/docs/api/functions/cleanupOrphanNetworks.md +++ /dev/null @@ -1,23 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / cleanupOrphanNetworks - -# Function: cleanupOrphanNetworks() - -```ts -function cleanupOrphanNetworks(opts?): Promise; -``` - -Defined in: [src/network.ts:213](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L213) - -## Parameters - -### opts? - -[`CleanupNetworkOptions`](../interfaces/CleanupNetworkOptions.md) = `{}` - -## Returns - -`Promise`\<`number`\> diff --git a/docs/api/functions/connectNetwork.md b/docs/api/functions/connectNetwork.md deleted file mode 100644 index 81b6c6c..0000000 --- a/docs/api/functions/connectNetwork.md +++ /dev/null @@ -1,27 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / connectNetwork - -# Function: connectNetwork() - -```ts -function connectNetwork(name, containerId): Promise; -``` - -Defined in: [src/network.ts:166](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L166) - -## Parameters - -### name - -`string` - -### containerId - -`string` - -## Returns - -`Promise`\<`void`\> diff --git a/docs/api/functions/createNetwork.md b/docs/api/functions/createNetwork.md deleted file mode 100644 index ff0cf8b..0000000 --- a/docs/api/functions/createNetwork.md +++ /dev/null @@ -1,27 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / createNetwork - -# Function: createNetwork() - -```ts -function createNetwork(name, opts?): Promise; -``` - -Defined in: [src/network.ts:69](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L69) - -## Parameters - -### name - -`string` - -### opts? - -[`CreateNetworkOptions`](../interfaces/CreateNetworkOptions.md) = `{}` - -## Returns - -`Promise`\<`boolean`\> diff --git a/docs/api/functions/deleteNetwork.md b/docs/api/functions/deleteNetwork.md deleted file mode 100644 index bf0c114..0000000 --- a/docs/api/functions/deleteNetwork.md +++ /dev/null @@ -1,23 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / deleteNetwork - -# Function: deleteNetwork() - -```ts -function deleteNetwork(name): Promise; -``` - -Defined in: [src/network.ts:145](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L145) - -## Parameters - -### name - -`string` - -## Returns - -`Promise`\<`void`\> diff --git a/docs/api/functions/listStates.md b/docs/api/functions/listStates.md deleted file mode 100644 index 168abe9..0000000 --- a/docs/api/functions/listStates.md +++ /dev/null @@ -1,17 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / listStates - -# Function: listStates() - -```ts -function listStates(): RunState[]; -``` - -Defined in: [src/state.ts:56](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L56) - -## Returns - -[`RunState`](../interfaces/RunState.md)[] diff --git a/docs/api/functions/networkExists.md b/docs/api/functions/networkExists.md deleted file mode 100644 index 81a6dae..0000000 --- a/docs/api/functions/networkExists.md +++ /dev/null @@ -1,23 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / networkExists - -# Function: networkExists() - -```ts -function networkExists(name): Promise; -``` - -Defined in: [src/network.ts:182](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L182) - -## Parameters - -### name - -`string` - -## Returns - -`Promise`\<`boolean`\> diff --git a/docs/api/functions/readState.md b/docs/api/functions/readState.md deleted file mode 100644 index 5bab374..0000000 --- a/docs/api/functions/readState.md +++ /dev/null @@ -1,23 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / readState - -# Function: readState() - -```ts -function readState(id): RunState | null; -``` - -Defined in: [src/state.ts:46](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L46) - -## Parameters - -### id - -`string` - -## Returns - -[`RunState`](../interfaces/RunState.md) \| `null` diff --git a/docs/api/index.md b/docs/api/index.md deleted file mode 100644 index 2c81b26..0000000 --- a/docs/api/index.md +++ /dev/null @@ -1,39 +0,0 @@ -**light-runner v0.15.0** - -*** - -# light-runner v0.15.0 - -## Classes - -- [DockerRunner](classes/DockerRunner.md) -- [Execution](classes/Execution.md) -- [LightRunnerError](classes/LightRunnerError.md) - -## Interfaces - -- [CleanupCacheOptions](interfaces/CleanupCacheOptions.md) -- [CleanupNetworkOptions](interfaces/CleanupNetworkOptions.md) -- [CreateNetworkOptions](interfaces/CreateNetworkOptions.md) -- [ExtractResult](interfaces/ExtractResult.md) -- [ExtractSpec](interfaces/ExtractSpec.md) -- [RunnerOptions](interfaces/RunnerOptions.md) -- [RunRequest](interfaces/RunRequest.md) -- [RunResult](interfaces/RunResult.md) -- [RunState](interfaces/RunState.md) -- [StopOptions](interfaces/StopOptions.md) - -## Type Aliases - -- [LightRunnerErrorCode](type-aliases/LightRunnerErrorCode.md) -- [Runtime](type-aliases/Runtime.md) - -## Functions - -- [cleanupOrphanNetworks](functions/cleanupOrphanNetworks.md) -- [connectNetwork](functions/connectNetwork.md) -- [createNetwork](functions/createNetwork.md) -- [deleteNetwork](functions/deleteNetwork.md) -- [listStates](functions/listStates.md) -- [networkExists](functions/networkExists.md) -- [readState](functions/readState.md) diff --git a/docs/api/interfaces/CleanupCacheOptions.md b/docs/api/interfaces/CleanupCacheOptions.md deleted file mode 100644 index f54129c..0000000 --- a/docs/api/interfaces/CleanupCacheOptions.md +++ /dev/null @@ -1,19 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / CleanupCacheOptions - -# Interface: CleanupCacheOptions - -Defined in: [src/build.ts:190](https://github.com/enixCode/light-runner/blob/main/src/build.ts#L190) - -## Properties - -### maxAgeMs? - -```ts -optional maxAgeMs?: number; -``` - -Defined in: [src/build.ts:192](https://github.com/enixCode/light-runner/blob/main/src/build.ts#L192) diff --git a/docs/api/interfaces/CleanupNetworkOptions.md b/docs/api/interfaces/CleanupNetworkOptions.md deleted file mode 100644 index 2fec63b..0000000 --- a/docs/api/interfaces/CleanupNetworkOptions.md +++ /dev/null @@ -1,35 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / CleanupNetworkOptions - -# Interface: CleanupNetworkOptions - -Defined in: [src/network.ts:47](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L47) - -## Properties - -### maxAgeMs? - -```ts -optional maxAgeMs?: number; -``` - -Defined in: [src/network.ts:55](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L55) - -Skip networks created within this many milliseconds. Default 30 minutes. -This is the race protection: a network just created by a concurrent run -whose container has not yet attached is preserved. - -*** - -### prefix? - -```ts -optional prefix?: string; -``` - -Defined in: [src/network.ts:49](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L49) - -Only consider networks whose name starts with this prefix. Defaults to `light-runner-`. diff --git a/docs/api/interfaces/CreateNetworkOptions.md b/docs/api/interfaces/CreateNetworkOptions.md deleted file mode 100644 index e5c2376..0000000 --- a/docs/api/interfaces/CreateNetworkOptions.md +++ /dev/null @@ -1,105 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / CreateNetworkOptions - -# Interface: CreateNetworkOptions - -Defined in: [src/network.ts:11](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L11) - -## Properties - -### driver? - -```ts -optional driver?: "bridge"; -``` - -Defined in: [src/network.ts:13](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L13) - -Docker network driver. Defaults to 'bridge'. - -*** - -### exclusive? - -```ts -optional exclusive?: boolean; -``` - -Defined in: [src/network.ts:24](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L24) - -When true, fail (return false) if the network already exists. Default -false = idempotent: returns true whether we created it or it already -existed. - -*** - -### iccEnabled? - -```ts -optional iccEnabled?: boolean; -``` - -Defined in: [src/network.ts:18](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L18) - -Inter-container communication. Defaults to false: containers attached -to the network cannot reach each other. Only honored for bridge driver. - -*** - -### ipam? - -```ts -optional ipam?: { - gateway?: string; - ipRange?: string; - subnet?: string; -}; -``` - -Defined in: [src/network.ts:33](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L33) - -Explicit IPAM (IP Address Management) config. When omitted, Docker -auto-assigns a subnet from its default pool. Pass this to let a higher -layer (typically light-process) allocate a specific subnet per run from -a CGNAT pool or any other range. - -#### gateway? - -```ts -optional gateway?: string; -``` - -Gateway IP. Docker picks the first usable address when omitted. - -#### ipRange? - -```ts -optional ipRange?: string; -``` - -Optional sub-range within `subnet` where Docker is allowed to -auto-assign IPs. Outside this range stays reserved for static -assignment. Rare. - -#### subnet? - -```ts -optional subnet?: string; -``` - -CIDR de la plage IP du réseau, ex: '100.64.42.0/24'. - -*** - -### labels? - -```ts -optional labels?: Record; -``` - -Defined in: [src/network.ts:26](https://github.com/enixCode/light-runner/blob/main/src/network.ts#L26) - -Optional Docker labels (helpful for downstream tooling / cleanup). diff --git a/docs/api/interfaces/ExtractResult.md b/docs/api/interfaces/ExtractResult.md deleted file mode 100644 index 04eaec1..0000000 --- a/docs/api/interfaces/ExtractResult.md +++ /dev/null @@ -1,59 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / ExtractResult - -# Interface: ExtractResult - -Defined in: [src/types.ts:28](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L28) - -## Properties - -### bytes? - -```ts -optional bytes?: number; -``` - -Defined in: [src/types.ts:33](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L33) - -*** - -### error? - -```ts -optional error?: string; -``` - -Defined in: [src/types.ts:32](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L32) - -*** - -### from - -```ts -from: string; -``` - -Defined in: [src/types.ts:29](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L29) - -*** - -### status - -```ts -status: "ok" | "error" | "missing"; -``` - -Defined in: [src/types.ts:31](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L31) - -*** - -### to - -```ts -to: string; -``` - -Defined in: [src/types.ts:30](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L30) diff --git a/docs/api/interfaces/ExtractSpec.md b/docs/api/interfaces/ExtractSpec.md deleted file mode 100644 index 43e18e3..0000000 --- a/docs/api/interfaces/ExtractSpec.md +++ /dev/null @@ -1,29 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / ExtractSpec - -# Interface: ExtractSpec - -Defined in: [src/types.ts:11](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L11) - -## Properties - -### from - -```ts -from: string; -``` - -Defined in: [src/types.ts:16](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L16) - -*** - -### to - -```ts -to: string; -``` - -Defined in: [src/types.ts:25](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L25) diff --git a/docs/api/interfaces/RunRequest.md b/docs/api/interfaces/RunRequest.md deleted file mode 100644 index edda20d..0000000 --- a/docs/api/interfaces/RunRequest.md +++ /dev/null @@ -1,149 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / RunRequest - -# Interface: RunRequest - -Defined in: [src/types.ts:36](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L36) - -## Properties - -### detached? - -```ts -optional detached?: boolean; -``` - -Defined in: [src/types.ts:110](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L110) - -*** - -### dir? - -```ts -optional dir?: string; -``` - -Defined in: [src/types.ts:67](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L67) - -*** - -### entrypoint? - -```ts -optional entrypoint?: string; -``` - -Defined in: [src/types.ts:39](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L39) - -*** - -### env? - -```ts -optional env?: Record; -``` - -Defined in: [src/types.ts:87](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L87) - -*** - -### extract? - -```ts -optional extract?: ExtractSpec[]; -``` - -Defined in: [src/types.ts:97](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L97) - -*** - -### image - -```ts -image: string; -``` - -Defined in: [src/types.ts:37](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L37) - -*** - -### input? - -```ts -optional input?: unknown; -``` - -Defined in: [src/types.ts:71](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L71) - -*** - -### networks? - -```ts -optional networks?: string[]; -``` - -Defined in: [src/types.ts:85](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L85) - -*** - -### onLog? - -```ts -optional onLog?: (line) => void; -``` - -Defined in: [src/types.ts:91](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L91) - -#### Parameters - -##### line - -`string` - -#### Returns - -`void` - -*** - -### run? - -```ts -optional run?: string[]; -``` - -Defined in: [src/types.ts:60](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L60) - -*** - -### signal? - -```ts -optional signal?: AbortSignal; -``` - -Defined in: [src/types.ts:90](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L90) - -*** - -### timeout? - -```ts -optional timeout?: number; -``` - -Defined in: [src/types.ts:73](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L73) - -*** - -### workdir? - -```ts -optional workdir?: string; -``` - -Defined in: [src/types.ts:89](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L89) diff --git a/docs/api/interfaces/RunResult.md b/docs/api/interfaces/RunResult.md deleted file mode 100644 index 3908826..0000000 --- a/docs/api/interfaces/RunResult.md +++ /dev/null @@ -1,61 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / RunResult - -# Interface: RunResult - -Defined in: [src/types.ts:113](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L113) - -## Properties - -### cancelled - -```ts -cancelled: boolean; -``` - -Defined in: [src/types.ts:117](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L117) - -*** - -### duration - -```ts -duration: number; -``` - -Defined in: [src/types.ts:116](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L116) - -*** - -### exitCode - -```ts -exitCode: number; -``` - -Defined in: [src/types.ts:115](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L115) - -*** - -### extracted? - -```ts -optional extracted?: ExtractResult[]; -``` - -Defined in: [src/types.ts:119](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L119) - -Status of each requested extract. Present only if `extract` was set. - -*** - -### success - -```ts -success: boolean; -``` - -Defined in: [src/types.ts:114](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L114) diff --git a/docs/api/interfaces/RunState.md b/docs/api/interfaces/RunState.md deleted file mode 100644 index 14b7a8b..0000000 --- a/docs/api/interfaces/RunState.md +++ /dev/null @@ -1,149 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / RunState - -# Interface: RunState - -Defined in: [src/state.ts:8](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L8) - -## Properties - -### cancelled? - -```ts -optional cancelled?: boolean; -``` - -Defined in: [src/state.ts:27](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L27) - -*** - -### container - -```ts -container: string; -``` - -Defined in: [src/state.ts:10](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L10) - -*** - -### durationMs? - -```ts -optional durationMs?: number; -``` - -Defined in: [src/state.ts:21](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L21) - -*** - -### entrypoint? - -```ts -optional entrypoint?: string; -``` - -Defined in: [src/state.ts:14](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L14) - -*** - -### exitCode? - -```ts -optional exitCode?: number; -``` - -Defined in: [src/state.ts:20](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L20) - -*** - -### extract? - -```ts -optional extract?: ExtractSpec[]; -``` - -Defined in: [src/state.ts:16](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L16) - -*** - -### finishedAt? - -```ts -optional finishedAt?: string; -``` - -Defined in: [src/state.ts:18](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L18) - -*** - -### id - -```ts -id: string; -``` - -Defined in: [src/state.ts:9](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L9) - -*** - -### image - -```ts -image: string; -``` - -Defined in: [src/state.ts:12](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L12) - -*** - -### startedAt - -```ts -startedAt: string; -``` - -Defined in: [src/state.ts:17](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L17) - -*** - -### status - -```ts -status: "running" | "exited" | "cancelled" | "failed"; -``` - -Defined in: [src/state.ts:19](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L19) - -*** - -### timeout? - -```ts -optional timeout?: number; -``` - -Defined in: [src/state.ts:15](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L15) - -*** - -### volume - -```ts -volume: string; -``` - -Defined in: [src/state.ts:11](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L11) - -*** - -### workdir - -```ts -workdir: string; -``` - -Defined in: [src/state.ts:13](https://github.com/enixCode/light-runner/blob/main/src/state.ts#L13) diff --git a/docs/api/interfaces/RunnerOptions.md b/docs/api/interfaces/RunnerOptions.md deleted file mode 100644 index b53cc81..0000000 --- a/docs/api/interfaces/RunnerOptions.md +++ /dev/null @@ -1,59 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / RunnerOptions - -# Interface: RunnerOptions - -Defined in: [src/types.ts:3](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L3) - -## Properties - -### cpus? - -```ts -optional cpus?: string; -``` - -Defined in: [src/types.ts:5](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L5) - -*** - -### gpus? - -```ts -optional gpus?: string | number; -``` - -Defined in: [src/types.ts:7](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L7) - -*** - -### memory? - -```ts -optional memory?: string; -``` - -Defined in: [src/types.ts:4](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L4) - -*** - -### noNewPrivileges? - -```ts -optional noNewPrivileges?: boolean; -``` - -Defined in: [src/types.ts:8](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L8) - -*** - -### runtime? - -```ts -optional runtime?: Runtime; -``` - -Defined in: [src/types.ts:6](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L6) diff --git a/docs/api/interfaces/StopOptions.md b/docs/api/interfaces/StopOptions.md deleted file mode 100644 index 3ec469b..0000000 --- a/docs/api/interfaces/StopOptions.md +++ /dev/null @@ -1,29 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / StopOptions - -# Interface: StopOptions - -Defined in: [src/Execution.ts:4](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L4) - -## Properties - -### grace? - -```ts -optional grace?: number; -``` - -Defined in: [src/Execution.ts:14](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L14) - -*** - -### signal? - -```ts -optional signal?: string; -``` - -Defined in: [src/Execution.ts:9](https://github.com/enixCode/light-runner/blob/main/src/Execution.ts#L9) diff --git a/docs/api/type-aliases/LightRunnerErrorCode.md b/docs/api/type-aliases/LightRunnerErrorCode.md deleted file mode 100644 index b993eb8..0000000 --- a/docs/api/type-aliases/LightRunnerErrorCode.md +++ /dev/null @@ -1,21 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / LightRunnerErrorCode - -# Type Alias: LightRunnerErrorCode - -```ts -type LightRunnerErrorCode = - | "DOCKER_UNREACHABLE" - | "VOLUME_CREATE_FAILED" - | "CONTAINER_START_FAILED" - | "SEED_FAILED" - | "EXTRACT_FAILED" - | "BUILD_FAILED" - | "INVALID_RUN_STEP" - | "NETWORK_CONNECT_FAILED"; -``` - -Defined in: [src/errors.ts:1](https://github.com/enixCode/light-runner/blob/main/src/errors.ts#L1) diff --git a/docs/api/type-aliases/Runtime.md b/docs/api/type-aliases/Runtime.md deleted file mode 100644 index 216dbdc..0000000 --- a/docs/api/type-aliases/Runtime.md +++ /dev/null @@ -1,13 +0,0 @@ -[**light-runner v0.15.0**](../index.md) - -*** - -[light-runner](../index.md) / Runtime - -# Type Alias: Runtime - -```ts -type Runtime = "runc" | "runsc" | "kata"; -``` - -Defined in: [src/types.ts:1](https://github.com/enixCode/light-runner/blob/main/src/types.ts#L1) diff --git a/docs/guides/detached.md b/docs/guides/detached.md deleted file mode 100644 index ba05aff..0000000 --- a/docs/guides/detached.md +++ /dev/null @@ -1,140 +0,0 @@ -# Detached runs - -A standard `runner.run(...)` ties the container's lifetime to the host Node process: kill the host, the run dies. Detached mode lets the container outlive the host. - -Use it when: - -- A run can take **hours** (training, batch jobs, CI-like workloads) and you cannot afford to lose it on a host crash or deploy. -- You want a long-poll architecture where one process **starts** runs and a different process **collects** results. -- You want to spawn a job, return immediately, and reconnect later from anywhere on the same machine. - -## Start a detached run - -```ts -import { DockerRunner } from 'light-runner'; - -const runner = new DockerRunner(); - -const execution = runner.run({ - image: 'python:3.12-alpine', - command: 'python long_job.py', - dir: './job', - timeout: 6 * 60 * 60 * 1000, // 6 hours - extract: [{ from: '/app/result.json', to: './out' }], - detached: true, -}); - -console.log('started, id =', execution.id); -// you can let this process exit; the container keeps running -``` - -## Reconnect to a running detached job - -```ts -const ex = DockerRunner.attach('light-runner-abc123def456'); -if (!ex) { - console.error('no state file for that id'); -} else { - const result = await ex.result; - console.log(result.success, result.exitCode, result.extracted); -} -``` - -`attach(id)` returns `null` when no state file exists for that id (typo'd id, or the run was reaped). - -## Listing known runs - -```ts -import { DockerRunner } from 'light-runner'; - -for (const state of DockerRunner.list()) { - console.log(state.id, state.status, state.startedAt, state.image); -} -``` - -## Detached contract differences - -| Capability | Attached | Detached | -|---|---|---| -| `input` (stdin) | Supported | **Rejected at API boundary** (host process death loses stdin) | -| `onLog` callback | Streams stdout/stderr lines | **Not called** (stream lost on host death; use `docker logs ` instead) | -| `cancel()` / signal | Best-effort kill | Best-effort kill, plus state file marked `cancelled` | -| `extract` | Runs after exit | Runs after exit, requested set persisted in state file | - -## State file lifecycle - -Every detached run writes one JSON file under `~/.light-runner/state/.json` (or `LIGHT_RUNNER_STATE_DIR`): - -```jsonc -{ - "id": "light-runner-abc123def456", - "container": "light-runner-abc123def456", - "volume": "light-runner-abc123def456", - "image": "python:3.12-alpine", - "workdir": "/app", - "command": "python long_job.py", - "timeout": 21600000, - "extract": [{"from": "/app/result.json", "to": "./out"}], - "startedAt": "2026-04-27T10:15:00.000Z", - "status": "running" -} -``` - -Status transitions: - -``` -running ──┬─> exited (clean exit, exitCode + finishedAt + durationMs added) - ├─> cancelled (cancel() / abort, exitCode set, cancelled: true) - └─> failed (setup error, container vanished, etc.) -``` - -Writes are atomic via temp + rename, so a host crash mid-write does not corrupt the file. - -## Cross-host resume - -The state dir is just JSON files under a fixed path. Two ways to make it shared: - -1. **Same machine, different process trees**: same `LIGHT_RUNNER_STATE_DIR`, no extra setup. Process A starts the run, process B re-attaches by id. -2. **Different machines**: mount the state dir on a shared filesystem (NFS, EFS, networked volume). The Docker daemon must be the **same one** on both hosts (they share the named volume + container by name). - -## Race-safe attach - -`attach(id)` is safe to call **immediately after** `runner.run({detached: true})` returns. The runner writes the state file synchronously inside `run()`, before any async setup, so the file always exists by the time the caller has the `Execution` handle. Internally, `attach` polls the docker daemon for ~3 seconds with `containerExists()` to absorb the gap between state-file-written and container-actually-created. - -## Reaping - -A long-running host eventually accumulates state files for finished runs. Two cleanup helpers: - -```ts -// Reconcile state files with the docker daemon. -// Mark `running` states as `failed` if their container has vanished. -await DockerRunner.cleanupOrphanStates(); - -// Sweep idle/exited containers + volumes tagged with the light-runner label. -const { containers, volumes } = await DockerRunner.reapOrphans(); -console.log(`reaped ${containers} containers, ${volumes} volumes`); -``` - -`reapOrphans` removes resources older than `LIGHT_RUNNER_REAP_AGE_MS` (default 5 minutes). Safe to run on a shared docker host with unrelated workloads since it filters by the `light-runner.run-id` label. - -Run both on host startup, before accepting new work. - -## Stop, pause, resume - -Detached or attached, the same `Execution` API works: - -```ts -await ex.stop({ signal: 'SIGTERM', grace: 10_000 }); // graceful, fall back to SIGKILL -await ex.pause(); // freezes via cgroup, memory preserved -await ex.resume(); // unfreezes -ex.cancel(); // immediate kill, sync, fire-and-forget -``` - -`pause()` is intentionally not flagging `cancelled: true` — a paused run is expected to resume and complete normally. - -## Gotchas - -- **Stdin is gone.** `RunRequest.input` is rejected at the API boundary when `detached: true`. Pipe input through a file in `dir` instead. -- **`onLog` is silent.** No live stream on host. Inspect `docker logs ` for stdout/stderr while the run is alive. -- **State file ≠ source of truth for liveness.** A `running` status with a vanished container = ghost run; `cleanupOrphanStates` is what reconciles that. -- **Extract still runs**, but only when the host that holds the resolved promise sees the exit. Re-attached hosts see `extracted` in their `result` too. diff --git a/docs/guides/extract.md b/docs/guides/extract.md deleted file mode 100644 index fda2391..0000000 --- a/docs/guides/extract.md +++ /dev/null @@ -1,123 +0,0 @@ -# Extract files - -`extract` is the **only output channel** for files. Logs go to `onLog`, exit code goes to `result.exitCode`, structured output goes through stdout / extracted files. The library has no opinion on what your container does inside. - -## Basic usage - -```ts -const execution = runner.run({ - image: 'node:lts-alpine', - command: 'node build.js', - dir: './project', - extract: [ - { from: '/app/dist', to: './out' }, // folder, recursive - { from: '/app/report.pdf', to: './out' }, // single file - { from: '/app/maybe-missing', to: './out' }, // missing -> reported, run still succeeds - ], -}); - -const result = await execution.result; -console.log(result.extracted); -// [ -// { from: '/app/dist', to: './out', status: 'ok', bytes: 124583 }, -// { from: '/app/report.pdf', to: './out', status: 'ok', bytes: 9421 }, -// { from: '/app/maybe-missing', to: './out', status: 'missing' }, -// ] -``` - -## Folder vs file semantics (rsync-like) - -| `from` is a... | Result | -|---|---| -| **Folder** | The **contents** of the folder land **directly in `to`** (no basename wrap). Equivalent to `rsync -a from/ to/` or `cp -r from/. to/`. All subdirectories and files are included recursively. | -| **File** | The file lands as `to/basename(from)`. | - -Trailing slash is irrelevant: `'/app/dist'` and `'/app/dist/'` produce identical output. - -```ts -extract: [ - { from: '/app/dist', to: './out' }, // /app/dist/a.js -> ./out/a.js - { from: '/app/dist/', to: './out' }, // same as above - { from: '/app/report.pdf', to: './out' }, // -> ./out/report.pdf -] -``` - -`to` is always a **destination directory**. It is auto-created via `fs.mkdirSync(to, { recursive: true })`. - -## Result statuses - -Each `extract` entry produces one `ExtractResult`: - -| `status` | Meaning | -|-------------|----------------------------------------------------------| -| `'ok'` | Archived and extracted. `bytes` reports the archive size.| -| `'missing'` | `from` does not exist in the container. | -| `'error'` | Cap exceeded, path traversal, mkdir failed, etc. The `error` field carries the reason. | - -A missing or errored entry **never fails the run**. The consumer inspects `result.extracted` and decides what to do. - -## Hard rules - -- **Path traversal rejected**: any segment containing `..` is refused before any container is spawned. `extract: [{ from: '/app/../etc/passwd', ... }]` → `status: 'error'` with `error: 'path traversal rejected (..)'`. -- **Symlinks skipped**: a malicious container could craft a symlink whose target path exists on the host. The tar reader silently drops them. -- **1 GiB per-entry cap**: enforced both **pre-flight** (`du -sb` inside the container) and **streamed** (byte counter in the host pipe). Above that, the entry is reported as `error` and the run still succeeds. -- **Extract only on success**: skipped when `exitCode !== 0` or the run was cancelled. `result.extracted` is undefined in those cases. -- **Disk-to-disk streaming**: the host never buffers the archive in Node RAM. - -## How extraction works internally - -1. After your container exits with code `0`, the runner spawns a **throwaway Alpine** sidecar with the same volume mounted read-only (no need to keep your image alive). -2. A pre-flight script checks that `from` exists, computes its byte size with `du -sb`, refuses if over the cap. -3. The sidecar runs `tar c` on `from` and pipes the archive to the host through a hijacked Docker stream. -4. The host pipes that into the [`tar` extract](https://www.npmjs.com/package/tar) reader, which writes files into `to/` and counts bytes for the streamed cap check. -5. The sidecar exits, AutoRemove tears it down, the runner returns `result.extracted`. - -## Common patterns - -### Capture structured output - -Have the container write a JSON file, extract it, parse it on the host: - -```ts -// Inside the container: -// import json -// json.dump({'fib': fib(20)}, open('/app/result.json', 'w')) - -const result = await runner.run({ - image: 'python:3.12-alpine', - command: 'python main.py', - dir: './solver', - extract: [{ from: '/app/result.json', to: './out' }], -}).result; - -const data = JSON.parse(fs.readFileSync('./out/result.json', 'utf8')); -``` - -### Pull a build artefact - -```ts -extract: [ - { from: '/app/dist', to: './public' }, - { from: '/app/coverage', to: './reports' }, -], -``` - -### Tolerate optional outputs - -Multiple entries with one missing is fine: - -```ts -extract: [ - { from: '/app/required.json', to: './out' }, - { from: '/app/optional-extra', to: './out' }, // may not exist -] - -const result = await execution.result; -const required = result.extracted!.find(e => e.from === '/app/required.json'); -if (required?.status !== 'ok') throw new Error('required.json missing'); -``` - -## See also - -- [`ExtractSpec`](/api/interfaces/ExtractSpec) and [`ExtractResult`](/api/interfaces/ExtractResult) in the API reference -- [Security model](./security) — why symlinks and `..` segments are dropped diff --git a/docs/guides/gvisor-kata.md b/docs/guides/gvisor-kata.md deleted file mode 100644 index 6950849..0000000 --- a/docs/guides/gvisor-kata.md +++ /dev/null @@ -1,132 +0,0 @@ -# gVisor & Kata Containers - -Default `runtime: 'runc'` shares the host kernel with the container. That is fast and convenient, but it means a kernel-level exploit inside the container can compromise the host. For genuinely hostile code, switch the runtime. - -## Choose the right tier - -| Runtime | Isolation | Performance | Status in light-runner | -|---|---|---|---| -| `runc` (default) | Linux namespaces + cgroups, shared kernel | Native | **Tested**, default for trusted/known code | -| `runsc` (gVisor) | User-space syscall interception, smaller kernel attack surface | ~10-30% I/O overhead | **Tested**, recommended for hostile code | -| `kata` (Kata Containers) | Lightweight VM per container, separate kernel | ~5-15% boot + I/O cost | **Option exposed but not yet validated in our test matrix** — open an issue if you run it in production | - -Switch via `RunnerOptions`: - -```ts -const runner = new DockerRunner({ runtime: 'runsc' }); // or 'kata' -``` - -When the option is `runc` (or omitted), the runner does not pass a `Runtime` field to Docker, so you keep whatever the daemon's default is. - -## When to use gVisor - -Use it when **any** of these is true: - -- The code you run is **anonymous** (random user uploads, public CTF entries). -- The code is **AI-generated** and you do not audit each call (LLM tool execution, agent runtimes). -- You ship a **multi-tenant playground** and one tenant compromising the host would be a headline. -- You handle PII or regulated data and the threat model includes "the running code is the adversary". - -You do **not** need gVisor when: - -- The code comes from your own CI / internal tooling and you trust the toolchain. -- You build the image yourself from a known Dockerfile. -- The performance cost is unacceptable (data-intensive batch jobs). - -## Install gVisor on Linux / WSL2 - -gVisor does **not** run natively on macOS or Windows. On Windows, use Docker Desktop with the **WSL2 backend** — the `runsc` install lives inside the WSL2 distro, not the Windows host. - -```bash -( - set -e - ARCH=$(uname -m) - URL=https://storage.googleapis.com/gvisor/releases/release/latest/${ARCH} - wget ${URL}/runsc ${URL}/runsc.sha512 \ - ${URL}/containerd-shim-runsc-v1 ${URL}/containerd-shim-runsc-v1.sha512 - sha512sum -c runsc.sha512 -c containerd-shim-runsc-v1.sha512 - rm -f *.sha512 - chmod a+rx runsc containerd-shim-runsc-v1 - sudo mv runsc containerd-shim-runsc-v1 /usr/local/bin -) -sudo /usr/local/bin/runsc install -sudo systemctl reload docker -``` - -`latest` is a rolling channel — gVisor ships frequent date-stamped releases (`release-YYYYMMDD.N`), no semantic version. Verify with `runsc --version`. - -After the daemon reload, test that Docker accepts the new runtime: - -```bash -docker run --rm --runtime=runsc alpine:3.19 dmesg | head -# Expect: gVisor-style kernel ring buffer, NOT the host's -``` - -Then in your code: - -```ts -const runner = new DockerRunner({ runtime: 'runsc' }); -``` - -## Performance notes - -`runsc` intercepts syscalls in user space, so it pays a tax on every syscall: - -| Workload | Approx. overhead vs runc | -|---|---| -| CPU-bound (no syscalls) | ~0% | -| Read-heavy I/O | 10-15% | -| Write-heavy I/O | 20-30% | -| Network-heavy (small packets) | 25-40% | -| Workloads spawning many processes | 30-50% | - -For agent-style runs (one container, one process tree, one set of files), the overhead is usually **invisible**. For tight inner loops on disk or network, benchmark before committing. - -## Kata Containers - -Kata runs each container inside a lightweight VM with its own kernel, giving you **VM-level isolation** at container-level UX. - -```ts -const runner = new DockerRunner({ runtime: 'kata' }); -``` - -We pass `runtime: 'kata'` straight through to Docker's `HostConfig.Runtime`. Docker then dispatches to whichever Kata shim is installed (`containerd-shim-kata-v2` or similar). The library does **not** validate that the runtime is installed; if it is missing, Docker returns a `CONTAINER_START_FAILED` error at run time. - -**The disclaimer** (also visible on the security note in the bespoke landing): we expose this option for users who already run Kata, but our CI does **not** install or test against Kata. If you adopt it in production, please open an issue with results — both successes and edge cases. - -Useful resources: - -- [Kata Containers project](https://github.com/kata-containers/kata-containers) -- [Docker + Kata setup guide](https://github.com/kata-containers/kata-containers/blob/main/docs/install/docker/ubuntu-docker-install.md) - -## Verifying isolation - -A quick sanity check that the runtime actually changed: - -```ts -const result = await runner.run({ - image: 'alpine:3.19', - command: 'cat /proc/self/maps | head -5', - // gVisor-mapped binaries look very different from runc-mapped ones -}).result; -``` - -Or look for the gVisor signature: - -```ts -const result = await runner.run({ - image: 'alpine:3.19', - command: 'dmesg | grep -i gvisor || echo "not gvisor"', -}).result; -``` - -Under `runsc` you will see `gVisor` strings in `dmesg`. Under `runc`, you will see the host's kernel ring buffer. - -## Trade-offs summary - -| Want... | Use | -|---|---| -| Maximum speed, you trust the code | `runc` (default) | -| Hard barrier against kernel exploits, willing to pay 10-30% I/O | `runsc` | -| Full VM isolation, separate kernel | `kata` (un-validated, at your own risk) | -| Air-gapped network on top of any of the above | `network: 'none'` on the request | diff --git a/docs/guides/quickstart.md b/docs/guides/quickstart.md deleted file mode 100644 index d97ac23..0000000 --- a/docs/guides/quickstart.md +++ /dev/null @@ -1,56 +0,0 @@ -# Quick start - -Run untrusted code in a hardened Docker container, get back the exit code, logs, and any files the container produced. That is the whole library. - -## Install - -```bash -npm install light-runner -``` - -Requirements: - -- Node.js >= 22 -- A running Docker daemon (Docker Desktop on macOS / Windows, `dockerd` on Linux) -- Optional: [gVisor](./gvisor-kata) for kernel-level isolation - -## Run something - -```ts -import { DockerRunner } from 'light-runner'; - -const runner = new DockerRunner({ memory: '512m', cpus: '1' }); - -const execution = runner.run({ - image: 'python:3.12-alpine', - command: 'python main.py', - dir: './my-project', - input: { task: 'compute', n: 20 }, - timeout: 30_000, - extract: [{ from: '/app/result.json', to: './out' }], -}); - -const result = await execution.result; - -result.success // true if exitCode === 0, not cancelled, not timed out -result.exitCode // container exit code -result.duration // ms -result.cancelled // true if cancel() / signal aborted -result.extracted // [{ from, to, status, bytes? }, ...] if extract was set -``` - -## What happens under the hood - -1. A named Docker volume is created (`light-runner-`). -2. The folder at `dir` is streamed into the volume via a throwaway Alpine seeder, skipping `.git`, `node_modules`, `dist`, `build`, `.next`, `.cache`, `.turbo`, `coverage`, and **all symlinks**. -3. Your image runs with the volume mounted at `workdir` (default `/app`), strict isolation flags, and a PID / memory / CPU cap. -4. On exit-code 0, each `extract` entry is streamed out via `tar`. On non-zero exit, extract is skipped. -5. The volume is destroyed, success or not. - -## Where to go next - -- [Extract files](./extract) — how to pull artefacts out of the container after a run -- [Detached runs](./detached) — long-running jobs that survive a host restart -- [Security model](./security) — what the sandbox protects against and what it does not -- [gVisor & Kata](./gvisor-kata) — adding a stronger runtime for hostile code -- [API reference](/api/) — full type signatures and class methods diff --git a/docs/guides/security.md b/docs/guides/security.md deleted file mode 100644 index bdf5e5d..0000000 --- a/docs/guides/security.md +++ /dev/null @@ -1,115 +0,0 @@ -# Security model - -`light-runner` is the boring, correct, library-grade answer to "how do I run untrusted code in a container from Node.js?". It is **secure by default**, **additive only** (every option makes the sandbox stronger, never weaker), and it has **one job** (no orchestration, no networking, no persistence beyond the run). - -This page describes what is in scope, what is not, and how to choose the right hardening tier. - -## Threat model - -| In scope | Out of scope | -|---|---| -| Untrusted **user code** running inside the container | The host kernel itself (use gVisor for hostile code) | -| **Filesystem isolation** between the run and the host | Side-channel attacks (timing, cache, Spectre) | -| **Process isolation** between sibling runs on the same host | Hardware-level threats (firmware, BIOS) | -| **Network containment** between the run and the host network | The Docker socket itself (root-equivalent on host) | -| **Resource starvation** (memory, CPU, pids, extract size) | DoS at the orchestration layer (caller's job) | -| Common container-escape patterns: raw sockets, mknod, capability juggling | Multi-tenant isolation **between tenants** sharing one container | - -**The one rule**: one run, one container, one tenant. If two pieces of code must not see each other, they each get their own `runner.run(...)` call. - -## What is on by default - -Every flag in [`src/createOptions.ts`](https://github.com/enixCode/light-runner/blob/main/src/createOptions.ts) is on for every run, with no opt-out path. - -### Capabilities dropped - -The following Linux capabilities are stripped at startup: - -| Capability | Why | -|----------------|------------------------------------------------------------| -| `NET_RAW` | Raw / packet sockets (ARP spoofing, packet crafting) | -| `MKNOD` | Fabricate device nodes | -| `SYS_CHROOT` | Escape weaker chroot jails | -| `SETPCAP` | Modify capability sets of other processes | -| `SETFCAP` | Escalate via setcap on dropped binaries | -| `AUDIT_WRITE` | Kernel audit log flooding / spoofing | - -### `no-new-privileges` - -A `setuid` binary inside the container **cannot elevate above the user it starts as**. Even if the image ships a legitimate-looking root-suid helper, it stays at the run user's privilege level. - -### Process cap - -`PidsLimit: 100` per container. A fork-bomb caps out in milliseconds instead of paging the host. Tunable upward via `RunnerOptions` if you genuinely need more (compilers spawning many processes, orchestrators-of-orchestrators), but the floor is conservative. - -### Memory and CPU budget - -`512 MiB` and `1` core by default, **cgroup-enforced**. Noisy runs cannot starve their neighbours. Override with `new DockerRunner({ memory: '4g', cpus: '4' })`. - -### Network isolation - -Default network: a **dedicated isolated bridge** (`light-runner-isolated`) with **inter-container traffic disabled** (`com.docker.network.bridge.enable_icc: false`). Outbound internet works; sibling runs on the same bridge cannot see each other. - -For air-gapped runs, set `network: 'none'` in the request — the container has no network interface at all. - -### Filesystem protections - -- **Symlinks in your input folder are filtered** at seed time, so a stray `.git` link or a deliberate symlink to `/etc/passwd` cannot cross the host -> container boundary. -- **`DEFAULT_IGNORES`** (`.git`, `node_modules`, `dist`, `build`, `.next`, `.cache`, `.turbo`, `coverage`) are skipped during seeding. They are noise at best and credentials-bearing at worst. -- **Path traversal in `extract.from`** (segments containing `..`) is rejected **before** any container is spawned. A malicious container cannot tell the host extractor to write to `/etc/cron.d/`. -- **Extract symlinks are skipped** during streaming. A container cannot craft a tarball with a symlink that resolves to a host path. -- **Extract cap**: 1 GiB per entry, enforced **twice** — pre-flight via `du -sb` inside the container, and streamed via a byte counter on the host pipe. - -## What this does not cover - -- **Kernel exploits** (anything that breaks out of namespaces by tickling the host kernel directly). -- **`runc` CVEs** (rare but real; you eat them if you ship `runtime: 'runc'`). -- **Side-channel attacks** (timing, cache eviction, Spectre/Meltdown family). - -For genuinely hostile code (anonymous user-submitted source, AI-agent-generated tool calls, a CTF playground), combine with a stronger runtime — see [gVisor & Kata](./gvisor-kata). - -## Secrets - -`env` vars go to `docker run --env`, which makes them visible in `docker inspect` and Docker metadata. That is fine in most setups (a host with Docker socket access is already root-equivalent), but for sensitive material prefer: - -- **`input`** (stdin). Ephemeral. Not in metadata, not in `docker inspect`. Your container reads it via `sys.stdin.read()` / `process.stdin`. -- **A bind mount to `/run/secrets/`**. Docker-native file-based secrets pattern (compose has a `secrets:` block for this). Not managed by light-runner — the consumer wires it via the host config or via a parent compose definition. - -Avoid putting API keys in `env`. Avoid putting them in `command`. Avoid putting them in `dir` (they would be tarred into the seed archive and visible to anyone with access to the volume). - -## Hardening recipes - -### Air-gapped run (no network, untrusted source code) - -```ts -const runner = new DockerRunner(); -runner.run({ - image: 'python:3.12-alpine', - command: 'python untrusted.py', - dir: './sandbox', - network: 'none', - timeout: 30_000, - extract: [{ from: '/app/output.json', to: './out' }], -}); -``` - -### Tighter resource budget - -```ts -const runner = new DockerRunner({ - memory: '128m', - cpus: '0.5', -}); -``` - -### Maximum isolation (gVisor) - -```ts -const runner = new DockerRunner({ runtime: 'runsc' }); -``` - -See [gVisor & Kata](./gvisor-kata) for installation. - -## Reporting a security issue - -Email the maintainer (see GitHub profile) with `[security]` in the subject. Public issues are fine for things that need a fix but no one is exploiting; private disclosure is preferred for actively-exploitable bugs. diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index 0e91109..0000000 --- a/docs/index.md +++ /dev/null @@ -1,324 +0,0 @@ ---- -title: light-runner -layout: page -sidebar: false -aside: false -pageClass: bespoke-landing-page ---- - - - -
-
- -
-
- -
-
-
- - - Execution primitive - Node.js -
-
-

- Run untrusted code
- in hardened containers. -

-

- A single-purpose Node.js library that runs your code in a container - it tears down afterwards, and hands you back the exit code, logs, - and any files you asked for. Nothing else. -

-
-
-
Runtime
-
Node >=22
-
-
-
Dependencies
-
2 dockerode + tar
-
-
-
Transport
-
dockerode no CLI
-
-
-
Tests
-
82 / 82 pass
-
-
-
License
-
MIT permissive
-
-
-
-
-
- A single glowing sphere floating above a wireframe cube on an isolated dark grid - the visual metaphor for a sandboxed container. - -
-
- Fig. 01 - One process, one cell, one grid. - light-runner / visual -
-
-
-
- -
-
-
-
what you get
-

Give it code. Get back an exit code, logs, and the files you asked for.

-
-
-
-
01 / isolated
-

Your code runs in its own cell.

-

Every run gets a fresh container, its own volume, its own network. Nothing leaks in from the host, nothing leaks out to sibling runs. Torn down on exit - success or not.

-
-
-
02 / drop in, pull out
-

Send a folder. Get any file back.

-

Point at a directory on your disk, it becomes the container's workdir. When the run finishes, ask for any path - a report, a binary, a whole build tree - and it lands back on your host.

-
-
-
03 / stop on demand
-

Cancel, abort, or time out.

-

Pass an AbortSignal, call cancel(), or set a deadline. The container dies and its volume goes with it. No zombie processes, no leaked disk.

-
-
-
04 / any stack
-

Python, Node, Go, Ruby, shell - anything.

-

Any Docker image on your registry or someone else's. No special runtime inside the container, no SDK to import, no convention to follow. Your code stays your code.

-
-
-
-
- -
-
-
-
quick start
-

Five lines to run, one to get your artefact.

-
-
-
-

Point light-runner at an image and a folder. Pipe input through stdin. Extract whatever your container wrote.

-

No HTTP server. No config file. No CLI.

- npm install light-runner -
-
-
- - example.ts - -
-
import { DockerRunner } from 'light-runner';
-const runner = new DockerRunner({ memory: '512m', cpus: '1' });
-const execution = runner.run({
-  image:   'python:3.12-alpine',
-  command: 'python main.py',
-  dir:     './my-project',
-  input:   { task: 'compute', n: 20 },
-  timeout: 30_000,
-  extract: [{ from: '/app/result.json', to: './out' }],
-});
-const result = await execution.result;
-result.success     // true if exit 0 and not cancelled
-result.exitCode    // the container's exit code
-result.extracted   // [{ from, to, status, bytes }]
-
-
-
-
- -
-
-
-
security model
-

Hardened defaults, never opt-out. Add more restrictions, never fewer.

-
-
-
-
Kernel permissions
-
Dangerous capabilities stripped at startup - raw sockets, device creation, chroot escapes, capability juggling, audit-log spoofing. Every run, unconditionally.
-
-
-
No privilege escalation
-
A setuid binary inside your container cannot elevate above the user it starts as.
-
-
-
Fork-bomb protection
-
Max 100 processes per container. A runaway loop caps out in milliseconds instead of paging the host.
-
-
-
Memory and CPU budget
-
512 MiB and one core by default, cgroup-enforced. Noisy runs cannot starve their neighbours. Tunable per runner.
-
-
-
Network isolation
-
Isolated bridge by default with inter-container traffic blocked. Pass network: 'none' to sever it entirely.
-
-
-
Host filesystem protection
-
Symlinks in your input folder are filtered before seeding, so a stray link cannot reach back into the host filesystem.
-
-
-
Safe file extraction
-
A container cannot write outside the destination folder you chose: paths escaping upward (..) are refused. Each extracted entry is capped at 1 GiB so a runaway output cannot fill your disk.
-
-
-
Kernel-level hardening
-
Swap the runtime to gVisor with one option for user-space syscall interception, at ~10-30% I/O cost.
-
-
-
- Does not cover - kernel exploits, runc CVEs, side-channel attacks. For genuinely hostile code, combine with { runtime: 'runsc' } (gVisor) or { runtime: 'kata' } (Kata Containers, VM-level isolation - option exposed but not yet validated in our test matrix). -
-
-
- -
-
-
-
ecosystem
-

Three tools. Each does one thing.

-
-
-
-
light-runner
-

Spawn one container, return exit code and files.

-

The execution primitive. Domain-agnostic. Zero orchestration. The other two tools in this family both call down to this one.

-
Loading
-
-
-
light-run
-

CLI and HTTP surface around light-runner.

-

Point a POST endpoint at it, pipe bodies through, get results back. Stateless wrapper, same defaults, same guarantees.

-
Loading
-
-
-
light-process
-

DAG orchestration, retries, fan-out.

-

When one container is not enough. Composes runs into pipelines with backoff, concurrency limits, and structured outputs.

-
Loading
-
-
-
-
-
-
-
-
-
- One glowing node. One dark grid. The rest is up to the code inside. -
- -
-
- light-runner // execution primitive - built with cc -
-
-
-
- - diff --git a/docs/public/banner.webp b/docs/public/banner.webp deleted file mode 100644 index a2a08e9d2148c266eabb5f3dea5bb762506ed268..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26938 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 RXEZ!lep7n6@cY3S003FOdYb?M diff --git a/package-lock.json b/package-lock.json index 46d4f3e..3266317 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,8 +25,7 @@ "husky": "^9.1.7", "typedoc": "^0.28.19", "typedoc-plugin-markdown": "^4.11.0", - "typescript": "^6.0.3", - "vitepress": "^1.6.4" + "typescript": "^6.0.3" }, "engines": { "node": ">=22" @@ -40,265 +39,6 @@ } } }, - "node_modules/@algolia/abtesting": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.17.0.tgz", - "integrity": "sha512-nuhHZdTiCtRzJEe9VSNzyqE9cOQMt01UWBzymFnjbgwrxxZpbGHQde6Oa/y9zyspTCjbUtb7Q5HQek1CLiLyeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", - "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", - "@algolia/autocomplete-shared": "1.17.7" - } - }, - "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", - "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.17.7" - }, - "peerDependencies": { - "search-insights": ">= 1 < 3" - } - }, - "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", - "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.17.7" - }, - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/autocomplete-shared": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", - "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/client-abtesting": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.51.0.tgz", - "integrity": "sha512-PKrKlIla1U2J7mFcIQn6N3pWP4oySmkxShnbbDsj/H7818gKbET5KsUwsVoNjWIxHKTJMCTcQ7ekAJ8Ea23NMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-analytics": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.51.0.tgz", - "integrity": "sha512-U+HCY1K16Km91pIRL1kN6bW6BbGFAF/WhkRSCx4wyl1aFpbrlhSFQs/dAwWbmyBiHWwVWhl7stWHQ1pum5EfMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-common": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.51.0.tgz", - "integrity": "sha512-YPJ3dEuZLCRp846Az94t6Z2gwSNRazP+SmBco7p6SCa4fYrtIE820PDXYZshbNrj2Z8Qfbmv7BQ1Lecl5L3G/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-insights": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.51.0.tgz", - "integrity": "sha512-/gEwLlR7fQ7YjOW+ADRZ0NxLDtpTC61FSzlZ01Gdl1kTJfU0Rq3Y/TYqwxGxlQGcUiXtGzrpjxXWh3Y0TZD6NA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-personalization": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.51.0.tgz", - "integrity": "sha512-nRwUN1Y2cKyOAFZyIBagkEfZSIhP05nWhT4Rjwl84lcjECssYggftrAODrZ4leakXxSGjhxs/AdaAFEIBqwVFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-query-suggestions": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.51.0.tgz", - "integrity": "sha512-pybzYCG7VoQKppo+z5iZOKpW8XqtFxhsAIRgEaNboCnfypKukiBHJAwB+pmr7vMZXBsOHwklGYWwCG82e8qshA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-search": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.51.0.tgz", - "integrity": "sha512-DWVIlj6RqcvdhwP0gBU9OpOQPnHdcAk9jlT+z8rsNb2+liWv4eUlfQZ7saGBraFsnygEHD3PtdppIHvqwBAb5w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/ingestion": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.51.0.tgz", - "integrity": "sha512-bA25s12iUDJi/X8M7tWlPRT8GeOhls/yDbdoUqinz27lNqsOlcM1UrAxIKdIZ6lm3sXit+ewPIz1pS2x6rXu8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/monitoring": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.51.0.tgz", - "integrity": "sha512-zj+RcE5e0NE0/ew6oEOTgOplPHry+w2oi7h0Y87lhdq4E0d7xLS31KVB8kKfCGkrG7AYtZvrcyvLOKS5d0no4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/recommend": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.51.0.tgz", - "integrity": "sha512-/HDgccfye1Rq3bPxaSCsvSEBHzSMmtpM9ZRGRtAuC62Cv+ql/76IWnxjGTDXtqIJ+/j7ZlFYAzq9fkp95wF2SQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.51.0.tgz", - "integrity": "sha512-nJdW+WBwGlXWMJbxxB7/AJPvNq0lLJSudXmIQCJbmH8jsOXQhRpAtoCD4ceLyJKv3ze9JbQu4Gqu5JDLckuFcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.51.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-fetch": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.51.0.tgz", - "integrity": "sha512-bsBgRI/1h1mjS3eCyfGau78yGZVmiDLmT1aU6dMnk75/T0SgKqnSKNpQ53xKoDYVChGDcNnpHXWpoUSo8MH1+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.51.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-node-http": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.51.0.tgz", - "integrity": "sha512-zPrIDVPpmKWgrjmWOqpqrhqAhNjvVkjoj+mqw2NBPxEOuKNzP0H+Qz5NJLLTOepBVj1UFedFaF3AUgxLsB9ukQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.51.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", @@ -314,16 +54,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", @@ -334,36 +64,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@balena/dockerignore": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", @@ -550,549 +250,107 @@ "git-raw-commits": "^5.0.0", "minimist": "^1.2.8", "tinyexec": "^1.0.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/resolve-extends": { - "version": "20.5.2", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-20.5.2.tgz", - "integrity": "sha512-8EhSCU9eNos/5cI1yg64GW79UH1c64O69AfStCsj4zqy6An/qIphVEXj4/+2M6056T8coz00f+UXFn4WUUP1HQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/config-validator": "^20.5.0", - "@commitlint/types": "^20.5.0", - "global-directory": "^5.0.0", - "import-meta-resolve": "^4.0.0", - "lodash.mergewith": "^4.6.2", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/rules": { - "version": "20.5.0", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-20.5.0.tgz", - "integrity": "sha512-5NdQXQEdnDPT5pK8O39ZA7HohzPRHEsDGU23cyVCNPQy4WegAbAwrQk3nIu7p2sl3dutPk8RZd91yKTrMTnRkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/ensure": "^20.5.0", - "@commitlint/message": "^20.4.3", - "@commitlint/to-lines": "^20.0.0", - "@commitlint/types": "^20.5.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/to-lines": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-20.0.0.tgz", - "integrity": "sha512-2l9gmwiCRqZNWgV+pX1X7z4yP0b3ex/86UmUFgoRt672Ez6cAM2lOQeHFRUTuE6sPpi8XBCGnd8Kh3bMoyHwJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/top-level": { - "version": "20.4.3", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-20.4.3.tgz", - "integrity": "sha512-qD9xfP6dFg5jQ3NMrOhG0/w5y3bBUsVGyJvXxdWEwBm8hyx4WOk3kKXw28T5czBYvyeCVJgJJ6aoJZUWDpaacQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/types": { - "version": "20.5.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-20.5.0.tgz", - "integrity": "sha512-ZJoS8oSq2CAZEpc/YI9SulLrdiIyXeHb/OGqGrkUP6Q7YV+0ouNAa7GjqRdXeQPncHQIDz/jbCTlHScvYvO/gA==", - "dev": true, - "license": "MIT", - "dependencies": { - "conventional-commits-parser": "^6.3.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@conventional-changelog/git-client": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-2.7.0.tgz", - "integrity": "sha512-j7A8/LBEQ+3rugMzPXoKYzyUPpw/0CBQCyvtTR7Lmu4olG4yRC/Tfkq79Mr3yuPs0SUitlO2HwGP3gitMJnRFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@simple-libs/child-process-utils": "^1.0.0", - "@simple-libs/stream-utils": "^1.2.0", - "semver": "^7.5.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "conventional-commits-filter": "^5.0.0", - "conventional-commits-parser": "^6.4.0" - }, - "peerDependenciesMeta": { - "conventional-commits-filter": { - "optional": true - }, - "conventional-commits-parser": { - "optional": true - } - } - }, - "node_modules/@docsearch/css": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", - "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@docsearch/js": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz", - "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docsearch/react": "3.8.2", - "preact": "^10.0.0" - } - }, - "node_modules/@docsearch/react": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", - "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-core": "1.17.7", - "@algolia/autocomplete-preset-algolia": "1.17.7", - "@docsearch/css": "3.8.2", - "algoliasearch": "^5.14.2" - }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 19.0.0", - "react": ">= 16.8.0 < 19.0.0", - "react-dom": ">= 16.8.0 < 19.0.0", - "search-insights": ">= 1 < 3" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "search-insights": { - "optional": true - } - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + }, "engines": { - "node": ">=12" + "node": ">=v18" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], + "node_modules/@commitlint/resolve-extends": { + "version": "20.5.2", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-20.5.2.tgz", + "integrity": "sha512-8EhSCU9eNos/5cI1yg64GW79UH1c64O69AfStCsj4zqy6An/qIphVEXj4/+2M6056T8coz00f+UXFn4WUUP1HQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "@commitlint/config-validator": "^20.5.0", + "@commitlint/types": "^20.5.0", + "global-directory": "^5.0.0", + "import-meta-resolve": "^4.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0" + }, "engines": { - "node": ">=12" + "node": ">=v18" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], + "node_modules/@commitlint/rules": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-20.5.0.tgz", + "integrity": "sha512-5NdQXQEdnDPT5pK8O39ZA7HohzPRHEsDGU23cyVCNPQy4WegAbAwrQk3nIu7p2sl3dutPk8RZd91yKTrMTnRkQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "@commitlint/ensure": "^20.5.0", + "@commitlint/message": "^20.4.3", + "@commitlint/to-lines": "^20.0.0", + "@commitlint/types": "^20.5.0" + }, "engines": { - "node": ">=12" + "node": ">=v18" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], + "node_modules/@commitlint/to-lines": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-20.0.0.tgz", + "integrity": "sha512-2l9gmwiCRqZNWgV+pX1X7z4yP0b3ex/86UmUFgoRt672Ez6cAM2lOQeHFRUTuE6sPpi8XBCGnd8Kh3bMoyHwJw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], "engines": { - "node": ">=12" + "node": ">=v18" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], + "node_modules/@commitlint/top-level": { + "version": "20.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-20.4.3.tgz", + "integrity": "sha512-qD9xfP6dFg5jQ3NMrOhG0/w5y3bBUsVGyJvXxdWEwBm8hyx4WOk3kKXw28T5czBYvyeCVJgJJ6aoJZUWDpaacQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "escalade": "^3.2.0" + }, "engines": { - "node": ">=12" + "node": ">=v18" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], + "node_modules/@commitlint/types": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-20.5.0.tgz", + "integrity": "sha512-ZJoS8oSq2CAZEpc/YI9SulLrdiIyXeHb/OGqGrkUP6Q7YV+0ouNAa7GjqRdXeQPncHQIDz/jbCTlHScvYvO/gA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "conventional-commits-parser": "^6.3.0", + "picocolors": "^1.1.1" + }, "engines": { - "node": ">=12" + "node": ">=v18" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], + "node_modules/@conventional-changelog/git-client": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-2.7.0.tgz", + "integrity": "sha512-j7A8/LBEQ+3rugMzPXoKYzyUPpw/0CBQCyvtTR7Lmu4olG4yRC/Tfkq79Mr3yuPs0SUitlO2HwGP3gitMJnRFw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@simple-libs/child-process-utils": "^1.0.0", + "@simple-libs/stream-utils": "^1.2.0", + "semver": "^7.5.2" + }, "engines": { - "node": ">=12" + "node": ">=18" + }, + "peerDependencies": { + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.4.0" + }, + "peerDependenciesMeta": { + "conventional-commits-filter": { + "optional": true + }, + "conventional-commits-parser": { + "optional": true + } } }, "node_modules/@gerrit0/mini-shiki": { @@ -1158,23 +416,6 @@ "node": ">=6" } }, - "node_modules/@iconify-json/simple-icons": { - "version": "1.2.80", - "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.80.tgz", - "integrity": "sha512-iglncJJ6X/dVuzFDU32MrHwwo4RBwivGf108dgyYg+HKS78ifx0h7sTenpDZMVT+UhdS6CSgZcvY/SvRXlIEUg==", - "dev": true, - "license": "CC0-1.0", - "dependencies": { - "@iconify/types": "*" - } - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "dev": true, - "license": "MIT" - }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", @@ -1187,13 +428,6 @@ "node": ">=18.0.0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, "node_modules/@js-sdsl/ordered-map": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", @@ -1803,449 +1037,39 @@ "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "license": "BSD-3-Clause", "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", - "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", - "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", - "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", - "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", - "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", - "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", - "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", - "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", - "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", - "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", - "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", - "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", - "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", - "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", - "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", - "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", - "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", - "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", - "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", - "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", - "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", - "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", - "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", - "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", - "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@shikijs/core": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", - "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/engine-javascript": "2.5.0", - "@shikijs/engine-oniguruma": "2.5.0", - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.4" - } - }, - "node_modules/@shikijs/core/node_modules/@shikijs/engine-oniguruma": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", - "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2" - } - }, - "node_modules/@shikijs/core/node_modules/@shikijs/types": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", - "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, - "node_modules/@shikijs/engine-javascript": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", - "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^3.1.0" - } + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" }, - "node_modules/@shikijs/engine-javascript/node_modules/@shikijs/types": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", - "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" }, "node_modules/@shikijs/engine-oniguruma": { "version": "3.23.0", @@ -2278,28 +1102,6 @@ "@shikijs/types": "3.23.0" } }, - "node_modules/@shikijs/transformers": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", - "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/core": "2.5.0", - "@shikijs/types": "2.5.0" - } - }, - "node_modules/@shikijs/transformers/node_modules/@shikijs/types": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", - "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, "node_modules/@shikijs/types": { "version": "3.23.0", "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", @@ -2370,13 +1172,6 @@ "@types/ssh2": "*" } }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", @@ -2387,41 +1182,6 @@ "@types/unist": "*" } }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/markdown-it": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", - "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" - } - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/node": { "version": "25.6.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", @@ -2476,298 +1236,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", - "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", - "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.33.tgz", - "integrity": "sha512-3PZLQwFw4Za3TC8t0FvTy3wI16Kt+pmwcgNZca4Pj9iWL2E72a/gZlpBtAJvEdDMdCxdG/qq0C7PN0bsJuv0Rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.2", - "@vue/shared": "3.5.33", - "entities": "^7.0.1", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-core/node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.33.tgz", - "integrity": "sha512-PXq0yrfCLzzL07rbXO4awtXY1Z06LG2eu6Adg3RJFa/j3Cii217XxxLXG22N330gw7GmALCY0Z8RgXEviwgpjA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.33", - "@vue/shared": "3.5.33" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.33.tgz", - "integrity": "sha512-UTUvRO9cY+rROrx/pvN9P5Z7FgA6QGfokUCfhQE4EnmUj3rVnK+CHI0LsEO1pg+I7//iRYMUfcNcCPe7tg0CoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.2", - "@vue/compiler-core": "3.5.33", - "@vue/compiler-dom": "3.5.33", - "@vue/compiler-ssr": "3.5.33", - "@vue/shared": "3.5.33", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.21", - "postcss": "^8.5.10", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.33.tgz", - "integrity": "sha512-IErjYdnj1qIupG5xxiVIYiiRvDhGWV4zuh/RCrwfYpuL+HWQzeU6lCk/nF9r7olWMnjKxCAkOctT2qFWFkzb1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.33", - "@vue/shared": "3.5.33" - } - }, - "node_modules/@vue/devtools-api": { - "version": "7.7.9", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", - "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-kit": "^7.7.9" - } - }, - "node_modules/@vue/devtools-kit": { - "version": "7.7.9", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", - "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-shared": "^7.7.9", - "birpc": "^2.3.0", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^1.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.2" - } - }, - "node_modules/@vue/devtools-shared": { - "version": "7.7.9", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", - "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "rfdc": "^1.4.1" - } - }, - "node_modules/@vue/reactivity": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.33.tgz", - "integrity": "sha512-p8UfIqyIhb0rYGlSgSBV+lPhF2iUSBcRy7enhTmPqKWadHy9kcOFYF1AejYBP9P+avnd3OBbD49DU4pLWX/94A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/shared": "3.5.33" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.33.tgz", - "integrity": "sha512-UpFF45RI9//a7rvq7RdOQblb4tup7hHG9QsmIrxkFQLzQ7R8/iNQ5LE15NhLZ1/WcHMU2b47u6P33CPUelHyIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.33", - "@vue/shared": "3.5.33" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.33.tgz", - "integrity": "sha512-IOxMsAOwquhfITgmOgaPYl7/j8gKUxUFoflRc+u4LxyD3+783xne8vNta1PONVCvCV9A0w7hkyEepINDqfO0tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.33", - "@vue/runtime-core": "3.5.33", - "@vue/shared": "3.5.33", - "csstype": "^3.2.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.33.tgz", - "integrity": "sha512-0xylq/8/h44lVG0pZFknv1XIdEgymq2E9n59uTWJBG+dIgiT0TMCSsxrN7nO16Z0MU0MPjFcguBbZV8Itk52Hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.5.33", - "@vue/shared": "3.5.33" - }, - "peerDependencies": { - "vue": "3.5.33" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.33.tgz", - "integrity": "sha512-5vR2QIlmaLG77Ygd4pMP6+SGQ5yox9VhtnbDWTy9DzMzdmeLxZ1QqxrywEZ9sa1AVubfIJyaCG3ytyWU81ufcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vueuse/core": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", - "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/web-bluetooth": "^0.0.21", - "@vueuse/metadata": "12.8.2", - "@vueuse/shared": "12.8.2", - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/integrations": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", - "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vueuse/core": "12.8.2", - "@vueuse/shared": "12.8.2", - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "async-validator": "^4", - "axios": "^1", - "change-case": "^5", - "drauu": "^0.4", - "focus-trap": "^7", - "fuse.js": "^7", - "idb-keyval": "^6", - "jwt-decode": "^4", - "nprogress": "^0.2", - "qrcode": "^1.5", - "sortablejs": "^1", - "universal-cookie": "^7" - }, - "peerDependenciesMeta": { - "async-validator": { - "optional": true - }, - "axios": { - "optional": true - }, - "change-case": { - "optional": true - }, - "drauu": { - "optional": true - }, - "focus-trap": { - "optional": true - }, - "fuse.js": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "jwt-decode": { - "optional": true - }, - "nprogress": { - "optional": true - }, - "qrcode": { - "optional": true - }, - "sortablejs": { - "optional": true - }, - "universal-cookie": { - "optional": true - } - } - }, - "node_modules/@vueuse/metadata": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", - "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", - "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", @@ -2809,33 +1277,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/algoliasearch": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.51.0.tgz", - "integrity": "sha512-u3XS8HaTzt5YN90KPsOXMRjYJUMVD1dtr6yi4NXQluMbZ5IjQNBu1MEabdAxFhYtEuexqomPMSmRIhQJUd3QSg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@algolia/abtesting": "1.17.0", - "@algolia/client-abtesting": "5.51.0", - "@algolia/client-analytics": "5.51.0", - "@algolia/client-common": "5.51.0", - "@algolia/client-insights": "5.51.0", - "@algolia/client-personalization": "5.51.0", - "@algolia/client-query-suggestions": "5.51.0", - "@algolia/client-search": "5.51.0", - "@algolia/ingestion": "1.51.0", - "@algolia/monitoring": "1.51.0", - "@algolia/recommend": "5.51.0", - "@algolia/requester-browser-xhr": "5.51.0", - "@algolia/requester-fetch": "5.51.0", - "@algolia/requester-node-http": "5.51.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -3028,16 +1469,6 @@ "tweetnacl": "^0.14.3" } }, - "node_modules/birpc": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", - "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -3089,53 +1520,20 @@ "node_modules/buildcheck": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.7.tgz", - "integrity": "sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==", - "optional": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "integrity": "sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==", + "optional": true, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=6" } }, "node_modules/chownr": { @@ -3186,17 +1584,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", @@ -3251,22 +1638,6 @@ "node": ">=18" } }, - "node_modules/copy-anything": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", - "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-what": "^5.2.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, "node_modules/cosmiconfig": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", @@ -3327,13 +1698,6 @@ "node": ">=10.0.0" } }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -3351,30 +1715,6 @@ } } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/docker-modem": { "version": "5.0.7", "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.7.tgz", @@ -3426,13 +1766,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/emoji-regex-xs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", - "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", - "dev": true, - "license": "MIT" - }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -3475,45 +1808,6 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -3523,13 +1817,6 @@ "node": ">=6" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, "node_modules/events-universal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", @@ -3569,38 +1856,12 @@ ], "license": "BSD-3-Clause" }, - "node_modules/focus-trap": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz", - "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "tabbable": "^6.4.0" - } - }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "license": "MIT" }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -3643,62 +1904,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hookable": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", - "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/husky": { "version": "9.1.7", "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", @@ -3844,19 +2049,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-what": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", - "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, "node_modules/jiti": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", @@ -3972,23 +2164,6 @@ "dev": true, "license": "MIT" }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/mark.js": { - "version": "8.11.1", - "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", - "dev": true, - "license": "MIT" - }, "node_modules/markdown-it": { "version": "14.1.1", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", @@ -4007,28 +2182,6 @@ "markdown-it": "bin/markdown-it.mjs" } }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", @@ -4049,100 +2202,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/minimatch": { "version": "10.2.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", @@ -4178,13 +2237,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/minisearch": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", - "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", - "dev": true, - "license": "MIT" - }, "node_modules/minizlib": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", @@ -4197,13 +2249,6 @@ "node": ">= 18" } }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true, - "license": "MIT" - }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -4230,25 +2275,6 @@ "license": "MIT", "optional": true }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4258,18 +2284,6 @@ "wrappy": "1" } }, - "node_modules/oniguruma-to-es": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", - "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex-xs": "^1.0.0", - "regex": "^6.0.1", - "regex-recursion": "^6.0.2" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -4298,75 +2312,17 @@ "engines": { "node": ">=8" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/postcss": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz", - "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/preact": { - "version": "10.29.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.1.tgz", - "integrity": "sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/protobufjs": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.5.tgz", @@ -4425,33 +2381,6 @@ "node": ">= 6" } }, - "node_modules/regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", - "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-recursion": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", - "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", - "dev": true, - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-utilities": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", - "dev": true, - "license": "MIT" - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4495,58 +2424,6 @@ "node": ">=8" } }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/rollup": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", - "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.2", - "@rollup/rollup-android-arm64": "4.60.2", - "@rollup/rollup-darwin-arm64": "4.60.2", - "@rollup/rollup-darwin-x64": "4.60.2", - "@rollup/rollup-freebsd-arm64": "4.60.2", - "@rollup/rollup-freebsd-x64": "4.60.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", - "@rollup/rollup-linux-arm-musleabihf": "4.60.2", - "@rollup/rollup-linux-arm64-gnu": "4.60.2", - "@rollup/rollup-linux-arm64-musl": "4.60.2", - "@rollup/rollup-linux-loong64-gnu": "4.60.2", - "@rollup/rollup-linux-loong64-musl": "4.60.2", - "@rollup/rollup-linux-ppc64-gnu": "4.60.2", - "@rollup/rollup-linux-ppc64-musl": "4.60.2", - "@rollup/rollup-linux-riscv64-gnu": "4.60.2", - "@rollup/rollup-linux-riscv64-musl": "4.60.2", - "@rollup/rollup-linux-s390x-gnu": "4.60.2", - "@rollup/rollup-linux-x64-gnu": "4.60.2", - "@rollup/rollup-linux-x64-musl": "4.60.2", - "@rollup/rollup-openbsd-x64": "4.60.2", - "@rollup/rollup-openharmony-arm64": "4.60.2", - "@rollup/rollup-win32-arm64-msvc": "4.60.2", - "@rollup/rollup-win32-ia32-msvc": "4.60.2", - "@rollup/rollup-win32-x64-gnu": "4.60.2", - "@rollup/rollup-win32-x64-msvc": "4.60.2", - "fsevents": "~2.3.2" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -4573,14 +2450,6 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, - "node_modules/search-insights": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", - "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", @@ -4594,96 +2463,6 @@ "node": ">=10" } }, - "node_modules/shiki": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", - "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/core": "2.5.0", - "@shikijs/engine-javascript": "2.5.0", - "@shikijs/engine-oniguruma": "2.5.0", - "@shikijs/langs": "2.5.0", - "@shikijs/themes": "2.5.0", - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/shiki/node_modules/@shikijs/engine-oniguruma": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", - "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2" - } - }, - "node_modules/shiki/node_modules/@shikijs/langs": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", - "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "2.5.0" - } - }, - "node_modules/shiki/node_modules/@shikijs/themes": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", - "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "2.5.0" - } - }, - "node_modules/shiki/node_modules/@shikijs/types": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", - "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/split-ca": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", @@ -4741,21 +2520,6 @@ "node": ">=8" } }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "dev": true, - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -4768,26 +2532,6 @@ "node": ">=8" } }, - "node_modules/superjson": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", - "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "copy-anything": "^4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tabbable": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", - "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", - "dev": true, - "license": "MIT" - }, "node_modules/tar": { "version": "7.5.13", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", @@ -4878,17 +2622,6 @@ "node": ">=18" } }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", @@ -4961,252 +2694,12 @@ "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", "license": "MIT" }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", - "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vitepress": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.4.tgz", - "integrity": "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docsearch/css": "3.8.2", - "@docsearch/js": "3.8.2", - "@iconify-json/simple-icons": "^1.2.21", - "@shikijs/core": "^2.1.0", - "@shikijs/transformers": "^2.1.0", - "@shikijs/types": "^2.1.0", - "@types/markdown-it": "^14.1.2", - "@vitejs/plugin-vue": "^5.2.1", - "@vue/devtools-api": "^7.7.0", - "@vue/shared": "^3.5.13", - "@vueuse/core": "^12.4.0", - "@vueuse/integrations": "^12.4.0", - "focus-trap": "^7.6.4", - "mark.js": "8.11.1", - "minisearch": "^7.1.1", - "shiki": "^2.1.0", - "vite": "^5.4.14", - "vue": "^3.5.13" - }, - "bin": { - "vitepress": "bin/vitepress.js" - }, - "peerDependencies": { - "markdown-it-mathjax3": "^4", - "postcss": "^8" - }, - "peerDependenciesMeta": { - "markdown-it-mathjax3": { - "optional": true - }, - "postcss": { - "optional": true - } - } - }, - "node_modules/vitepress/node_modules/@shikijs/types": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", - "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/vue": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.33.tgz", - "integrity": "sha512-1AgChhx5w3ALgT4oK3acm2Es/7jyZhWSVUfs3rOBlGQC0rjEDkS7G4lWlJJGGNQD+BV3reCwbQrOe1mPNwKHBQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/compiler-dom": "3.5.33", - "@vue/compiler-sfc": "3.5.33", - "@vue/runtime-dom": "3.5.33", - "@vue/server-renderer": "3.5.33", - "@vue/shared": "3.5.33" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -5290,17 +2783,6 @@ "engines": { "node": ">=12" } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } } } } diff --git a/package.json b/package.json index dde3cb1..bd0fa01 100644 --- a/package.json +++ b/package.json @@ -32,13 +32,12 @@ "demo": "npm run test:build && node dist/examples/main.js", "demo:detached": "npm run test:build && node dist/examples/detached-full.js", "demo:otel": "npm run test:build && node dist/examples/demo-otel.js", - "docs": "npm run docs:typedoc && npm run docs:build", - "preversion": "npm run docs:typedoc && git add docs/api/", + "docs:api": "node scripts/gen-fumadocs-api.mjs", + "docs:dev": "npm run docs:api && npm --prefix website run dev", + "docs:build": "npm run docs:api && npm --prefix website run build", + "preversion": "npm run docs:api && git add website/content/docs/api/", "prepublishOnly": "npm run build", - "prepare": "husky", - "docs:typedoc": "node -e \"require('node:fs').rmSync('docs/api',{recursive:true,force:true})\" && typedoc", - "docs:dev": "npm run docs:typedoc && vitepress dev docs", - "docs:build": "vitepress build docs" + "prepare": "husky" }, "engines": { "node": ">=22" @@ -64,8 +63,7 @@ "husky": "^9.1.7", "typedoc": "^0.28.19", "typedoc-plugin-markdown": "^4.11.0", - "typescript": "^6.0.3", - "vitepress": "^1.6.4" + "typescript": "^6.0.3" }, "dependencies": { "dockerode": "^5.0.0",