diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..b7ee8e7 --- /dev/null +++ b/.env.example @@ -0,0 +1,5 @@ +GITHUB_TOKEN="" +GITLAB_TOKEN="" +UPSTASH_REDIS_URL="" +UPSTASH_REDIS_TOKEN="" +DATABASE_URL="" \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..8b52c59 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,15 @@ +# These are supported funding model platforms + +github: [ieedan] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +polar: # Replace with a single Polar username +buy_me_a_coffee: # Replace with a single Buy Me a Coffee username +thanks_dev: # Replace with a single thanks.dev username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..0054af9 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,22 @@ +name: CI + +on: + pull_request: + +jobs: + CI: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: pnpm + + - name: Install dependencies + run: pnpm install + + - name: Check Types + run: pnpm lint diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..daa6a97 --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +node_modules + +# Output +.output +.vercel +.velite +.netlify +.wrangler +/.svelte-kit +/build +/static/search.json + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..ab78a95 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +# Package Managers +package-lock.json +pnpm-lock.yaml +yarn.lock diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..7ebb855 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,15 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ] +} diff --git a/README.md b/README.md index e538de1..e6a5e2c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,42 @@ -# docs -The documentation site for jsrepo. +

+ + + + +

jsrepo

+ +

+ +# jsrepo docs + +The docs site for jsrepo + +## Development + +```bash +pnpm install + +pnpm dev +``` + +### Environment variables + +You'll need to provide the following environment variables: + +```.env +GITHUB_TOKEN="" +GITLAB_TOKEN="" +UPSTASH_REDIS_URL="" +UPSTASH_REDIS_TOKEN="" +DATABASE_URL="" # postgres db +``` + +## Contributing + +Make sure to format and lint the code before submitting a PR! + +```bash +pnpm format + +pnpm lint +``` diff --git a/components.json b/components.json new file mode 100644 index 0000000..27896d2 --- /dev/null +++ b/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://next.shadcn-svelte.com/schema.json", + "style": "new-york", + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/app.css", + "baseColor": "zinc" + }, + "aliases": { + "components": "$lib/components", + "utils": "$lib/utils", + "ui": "$lib/components/ui", + "hooks": "$lib/hooks" + }, + "typescript": true, + "registry": "https://next.shadcn-svelte.com/registry" +} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..c97e890 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,55 @@ +import prettier from 'eslint-config-prettier'; +import js from '@eslint/js'; +import { includeIgnoreFile } from '@eslint/compat'; +import svelte from 'eslint-plugin-svelte'; +import globals from 'globals'; +import { fileURLToPath } from 'node:url'; +import ts from 'typescript-eslint'; +import svelteConfig from './svelte.config.js'; + +const gitignorePath = fileURLToPath(new URL('./.gitignore', import.meta.url)); + +export default ts.config( + includeIgnoreFile(gitignorePath), + js.configs.recommended, + ...ts.configs.recommended, + ...svelte.configs['flat/recommended'], + prettier, + ...svelte.configs['flat/prettier'], + { + languageOptions: { + globals: { + ...globals.browser, + ...globals.node + } + }, + rules: { + '@typescript-eslint/no-unused-vars': [ + 'error', + { + varsIgnorePattern: '^_', + argsIgnorePattern: '^_' + } + ], + 'no-prototype-builtins': 'off', + 'no-useless-escape': 'warn' + } + }, + { + files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], + + languageOptions: { + parserOptions: { + // only enable this if you want linting to take 3 minutes + // projectService: true, + extraFileExtensions: ['.svelte'], + parser: ts.parser, + svelteConfig + } + }, + rules: { + 'svelte/no-at-html-tags': 'warn', + 'svelte/no-useless-mustaches': 'warn' + } + } +); diff --git a/jsrepo.json b/jsrepo.json new file mode 100644 index 0000000..cbc3fce --- /dev/null +++ b/jsrepo.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://unpkg.com/jsrepo@1.47.0/schemas/project-config.json", + "repos": ["github/ieedan/std", "github/ieedan/shadcn-svelte-extras"], + "includeTests": false, + "watermark": true, + "formatter": "prettier", + "configFiles": {}, + "paths": { + "*": "./src/lib/blocks", + "ts": "$lib/ts", + "ui": "$lib/components/ui", + "actions": "$lib/actions", + "hooks": "$lib/hooks", + "utils": "$lib/utils" + } +} diff --git a/mdsx.config.js b/mdsx.config.js new file mode 100644 index 0000000..c3db77b --- /dev/null +++ b/mdsx.config.js @@ -0,0 +1,63 @@ +import { createHighlighter } from 'shiki'; +import rehypeAutolinkHeadings from 'rehype-autolink-headings'; +import rehypeSlug from 'rehype-slug'; +import rehypePrettyCode from 'rehype-pretty-code'; +import remarkGfm from 'remark-gfm'; +import rehypeExternalLinks from 'rehype-external-links'; + +/** + * @type {import('rehype-pretty-code').Options} + */ +export const prettyCodeOptions = { + theme: { + dark: 'github-dark-default', + light: 'github-light-default' + }, + getHighlighter: (options) => + createHighlighter({ + ...options, + langs: [ + 'plaintext', + import('shiki/langs/javascript.mjs'), + import('shiki/langs/typescript.mjs'), + import('shiki/langs/svelte.mjs'), + import('shiki/langs/sh.mjs'), + import('shiki/langs/jsonc.mjs'), + import('shiki/langs/json.mjs'), + import('shiki/langs/yaml.mjs') + ] + }), + keepBackground: false, + onVisitLine(node) { + // Prevent lines from collapsing in `display: grid` mode, and allow empty + // lines to be copy/pasted + if (node.children.length === 0) { + node.children = [{ type: 'text', value: ' ' }]; + } + }, + onVisitHighlightedLine(node) { + node.properties.className = ['line--highlighted']; + }, + onVisitHighlightedChars(node) { + node.properties.className = ['chars--highlighted']; + } +}; + +/** @type {import('mdsx').MDSXConfig} */ +const options = { + remarkPlugins: [remarkGfm], + rehypePlugins: [ + rehypeSlug, + rehypeAutolinkHeadings, + [rehypePrettyCode, prettyCodeOptions], + [rehypeExternalLinks, { target: '_blank' }] + ], + extensions: ['.svx', '.md'], + blueprints: { + default: { + path: 'src/lib/components/site/docs/markdown/blueprint.svelte' + } + } +}; + +export default options; diff --git a/package.json b/package.json new file mode 100644 index 0000000..0c93d4e --- /dev/null +++ b/package.json @@ -0,0 +1,86 @@ +{ + "name": "docs", + "private": true, + "version": "0.0.1", + "type": "module", + "packageManager": "pnpm@10.7.1", + "scripts": { + "dev": "concurrently \"pnpm dev:content\" \"vite dev\"", + "build": "pnpm build:content && pnpm build:svelte", + "build:svelte": "vite build", + "dev:content": "velite build --watch", + "build:content": "velite", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "format": "prettier --write .", + "lint": "prettier --check . && eslint ." + }, + "devDependencies": { + "@eslint/compat": "^1.2.5", + "@eslint/js": "^9.24.0", + "@fontsource-variable/jetbrains-mono": "^5.2.5", + "@fontsource-variable/oxanium": "^5.2.5", + "@lucide/svelte": "^0.486.0", + "@lukulent/svelte-umami": "^0.0.4", + "@shikijs/langs": "^3.2.1", + "@shikijs/markdown-it": "^3.2.1", + "@shikijs/themes": "^3.2.1", + "@sveltejs/adapter-vercel": "^5.7.0", + "@sveltejs/kit": "^2.20.5", + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "@types/markdown-it": "^14.1.2", + "@upstash/redis": "^1.34.7", + "autoprefixer": "^10.4.20", + "badge-maker": "^4.1.0", + "bits-ui": "1.3.15", + "clsx": "^2.1.1", + "concurrently": "^9.1.2", + "core@latest": "link:@shikijs/markdown-it/core@latest", + "drizzle-orm": "^0.41.0", + "eslint": "^9.24.0", + "eslint-config-prettier": "^10.1.2", + "eslint-plugin-svelte": "^3.5.1", + "flexsearch": "^0.7.43", + "globals": "^16.0.0", + "isomorphic-dompurify": "^2.23.0", + "jsrepo": "^1.47.0", + "markdown-it": "^14.1.0", + "markdown-it-table": "^4.1.1", + "mdsx": "^0.0.6", + "mode-watcher": "^0.5.1", + "octokit": "^4.1.3", + "package-manager-detector": "^1.1.0", + "postgres": "^3.4.5", + "prettier": "^3.4.2", + "prettier-plugin-svelte": "^3.3.3", + "prettier-plugin-tailwindcss": "^0.6.10", + "rehype-autolink-headings": "^7.1.0", + "rehype-external-links": "^3.0.0", + "rehype-pretty-code": "^0.14.1", + "rehype-raw": "^7.0.0", + "rehype-slug": "^6.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remove-markdown": "^0.6.0", + "runed": "^0.25.0", + "shiki": "^3.2.2", + "svelte": "^5.25.12", + "svelte-check": "^4.0.0", + "sveltekit-search-params": "^3.0.0", + "sveltekit-superforms": "^2.24.1", + "tailwind-merge": "^2.6.0", + "tailwind-variants": "^0.3.1", + "tailwindcss": "^3.4.17", + "tailwindcss-animate": "^1.0.7", + "typescript": "^5.0.0", + "typescript-eslint": "^8.29.1", + "unified": "^11.0.5", + "valibot": "^1.0.0", + "velite": "^0.2.2", + "vite": "^6.2.6" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..1aea3df --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,7870 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@eslint/compat': + specifier: ^1.2.5 + version: 1.2.8(eslint@9.24.0(jiti@1.21.7)) + '@eslint/js': + specifier: ^9.24.0 + version: 9.24.0 + '@fontsource-variable/jetbrains-mono': + specifier: ^5.2.5 + version: 5.2.5 + '@fontsource-variable/oxanium': + specifier: ^5.2.5 + version: 5.2.5 + '@lucide/svelte': + specifier: ^0.486.0 + version: 0.486.0(svelte@5.27.0) + '@lukulent/svelte-umami': + specifier: ^0.0.4 + version: 0.0.4(svelte@5.27.0) + '@shikijs/langs': + specifier: ^3.2.1 + version: 3.2.2 + '@shikijs/markdown-it': + specifier: ^3.2.1 + version: 3.2.2 + '@shikijs/themes': + specifier: ^3.2.1 + version: 3.2.2 + '@sveltejs/adapter-vercel': + specifier: ^5.7.0 + version: 5.7.0(@sveltejs/kit@2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(rollup@4.40.0) + '@sveltejs/kit': + specifier: ^2.20.5 + version: 2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)) + '@sveltejs/vite-plugin-svelte': + specifier: ^5.0.0 + version: 5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)) + '@types/markdown-it': + specifier: ^14.1.2 + version: 14.1.2 + '@upstash/redis': + specifier: ^1.34.7 + version: 1.34.8 + autoprefixer: + specifier: ^10.4.20 + version: 10.4.21(postcss@8.5.3) + badge-maker: + specifier: ^4.1.0 + version: 4.1.0 + bits-ui: + specifier: 1.3.15 + version: 1.3.15(svelte@5.27.0) + clsx: + specifier: ^2.1.1 + version: 2.1.1 + concurrently: + specifier: ^9.1.2 + version: 9.1.2 + core@latest: + specifier: link:@shikijs/markdown-it/core@latest + version: link:@shikijs/markdown-it/core@latest + drizzle-orm: + specifier: ^0.41.0 + version: 0.41.0(postgres@3.4.5) + eslint: + specifier: ^9.24.0 + version: 9.24.0(jiti@1.21.7) + eslint-config-prettier: + specifier: ^10.1.2 + version: 10.1.2(eslint@9.24.0(jiti@1.21.7)) + eslint-plugin-svelte: + specifier: ^3.5.1 + version: 3.5.1(eslint@9.24.0(jiti@1.21.7))(svelte@5.27.0) + flexsearch: + specifier: ^0.7.43 + version: 0.7.43 + globals: + specifier: ^16.0.0 + version: 16.0.0 + isomorphic-dompurify: + specifier: ^2.23.0 + version: 2.23.0 + jsrepo: + specifier: ^1.47.0 + version: 1.47.0(typescript@5.8.3)(ws@8.18.1)(zod@3.24.3) + markdown-it: + specifier: ^14.1.0 + version: 14.1.0 + markdown-it-table: + specifier: ^4.1.1 + version: 4.1.1 + mdsx: + specifier: ^0.0.6 + version: 0.0.6(svelte@5.27.0) + mode-watcher: + specifier: ^0.5.1 + version: 0.5.1(svelte@5.27.0) + octokit: + specifier: ^4.1.3 + version: 4.1.3 + package-manager-detector: + specifier: ^1.1.0 + version: 1.2.0 + postgres: + specifier: ^3.4.5 + version: 3.4.5 + prettier: + specifier: ^3.4.2 + version: 3.5.3 + prettier-plugin-svelte: + specifier: ^3.3.3 + version: 3.3.3(prettier@3.5.3)(svelte@5.27.0) + prettier-plugin-tailwindcss: + specifier: ^0.6.10 + version: 0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.27.0))(prettier@3.5.3) + rehype-autolink-headings: + specifier: ^7.1.0 + version: 7.1.0 + rehype-external-links: + specifier: ^3.0.0 + version: 3.0.0 + rehype-pretty-code: + specifier: ^0.14.1 + version: 0.14.1(shiki@3.2.2) + rehype-raw: + specifier: ^7.0.0 + version: 7.0.0 + rehype-slug: + specifier: ^6.0.0 + version: 6.0.0 + rehype-stringify: + specifier: ^10.0.1 + version: 10.0.1 + remark-gfm: + specifier: ^4.0.1 + version: 4.0.1 + remark-parse: + specifier: ^11.0.0 + version: 11.0.0 + remark-rehype: + specifier: ^11.1.2 + version: 11.1.2 + remove-markdown: + specifier: ^0.6.0 + version: 0.6.0 + runed: + specifier: ^0.25.0 + version: 0.25.0(svelte@5.27.0) + shiki: + specifier: ^3.2.2 + version: 3.2.2 + svelte: + specifier: ^5.25.12 + version: 5.27.0 + svelte-check: + specifier: ^4.0.0 + version: 4.1.6(picomatch@4.0.2)(svelte@5.27.0)(typescript@5.8.3) + sveltekit-search-params: + specifier: ^3.0.0 + version: 3.0.0(@sveltejs/kit@2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)) + sveltekit-superforms: + specifier: ^2.24.1 + version: 2.24.1(@sveltejs/kit@2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(@types/json-schema@7.0.15)(svelte@5.27.0)(typescript@5.8.3) + tailwind-merge: + specifier: ^2.6.0 + version: 2.6.0 + tailwind-variants: + specifier: ^0.3.1 + version: 0.3.1(tailwindcss@3.4.17) + tailwindcss: + specifier: ^3.4.17 + version: 3.4.17 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + typescript: + specifier: ^5.0.0 + version: 5.8.3 + typescript-eslint: + specifier: ^8.29.1 + version: 8.30.1(eslint@9.24.0(jiti@1.21.7))(typescript@5.8.3) + unified: + specifier: ^11.0.5 + version: 11.0.5 + valibot: + specifier: ^1.0.0 + version: 1.0.0(typescript@5.8.3) + velite: + specifier: ^0.2.2 + version: 0.2.2(acorn@8.14.1) + vite: + specifier: ^6.2.6 + version: 6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1) + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@anthropic-ai/sdk@0.39.0': + resolution: {integrity: sha512-eMyDIPRZbt1CCLErRCi3exlAvNkBtRe+kW5vvJyef93PmNr/clstYgHhtvmkxN82nlKgzyGPCyGxrm0JQ1ZIdg==} + + '@ark/schema@0.46.0': + resolution: {integrity: sha512-c2UQdKgP2eqqDArfBqQIJppxJHvNNXuQPeuSPlDML4rjw+f1cu0qAlzOG4b8ujgm9ctIDWwhpyw6gjG5ledIVQ==} + + '@ark/util@0.46.0': + resolution: {integrity: sha512-JPy/NGWn/lvf1WmGCPw2VGpBg5utZraE84I7wli18EDF3p3zc/e9WolT35tINeZO3l7C77SjqRJeAUoT0CvMRg==} + + '@asamuzakjp/css-color@3.1.2': + resolution: {integrity: sha512-nwgc7jPn3LpZ4JWsoHtuwBsad1qSSLDDX634DdG0PBJofIuIEtSWk4KkRmuXyu178tjuHAbwiMNNzwqIyLYxZw==} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.27.0': + resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.27.0': + resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.27.0': + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + engines: {node: '>=6.9.0'} + + '@biomejs/js-api@0.7.1': + resolution: {integrity: sha512-VFdgFFZWcyCQxZcAasyv8Enpexn4CblMdWmr6izLYHTLcbd+z9x/LuKU71qnmClABfnYqZjiY7c8DKTVri3Ajw==} + peerDependencies: + '@biomejs/wasm-bundler': ^1.9.2 + '@biomejs/wasm-nodejs': ^1.9.2 + '@biomejs/wasm-web': ^1.9.2 + peerDependenciesMeta: + '@biomejs/wasm-bundler': + optional: true + '@biomejs/wasm-nodejs': + optional: true + '@biomejs/wasm-web': + optional: true + + '@biomejs/wasm-nodejs@1.9.4': + resolution: {integrity: sha512-ZqNlhKcZW6MW1LxWIOfh9YVrBykvzyFad3bOh6JJFraDnNa3NXboRDiaI8dmrbb0ZHXCU1Tsq6WQsKV2Vpp5dw==} + + '@clack/core@0.4.2': + resolution: {integrity: sha512-NYQfcEy8MWIxrT5Fj8nIVchfRFA26yYKJcvBS7WlUIlw2OmQOY9DhGGXMovyI5J5PpxrCPGkgUi207EBrjpBvg==} + + '@clack/prompts@0.10.1': + resolution: {integrity: sha512-Q0T02vx8ZM9XSv9/Yde0jTmmBQufZhPJfYAg2XrrrxWWaZgq1rr8nU8Hv710BQ1dhoP8rtY7YUdpGej2Qza/cw==} + + '@csstools/color-helpers@5.0.2': + resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.2': + resolution: {integrity: sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.4 + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/css-color-parser@3.0.8': + resolution: {integrity: sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.4 + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/css-parser-algorithms@3.0.4': + resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/css-tokenizer@3.0.3': + resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} + engines: {node: '>=18'} + + '@emnapi/core@1.4.3': + resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} + + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + + '@emnapi/wasi-threads@1.0.2': + resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} + + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.2': + resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.2': + resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.2': + resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.2': + resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.2': + resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.2': + resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.2': + resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.2': + resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.2': + resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.2': + resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.2': + resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.2': + resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.2': + resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.2': + resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.2': + resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.2': + resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.2': + resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.25.2': + resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.2': + resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.25.2': + resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.2': + resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.2': + resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.2': + resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.2': + resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.2': + resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.6.1': + resolution: {integrity: sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/compat@1.2.8': + resolution: {integrity: sha512-LqCYHdWL/QqKIJuZ/ucMAv8d4luKGs4oCPgpt8mWztQAtPrHfXKQ/XAUc8ljCHAfJCn6SvkpTcGt5Tsh8saowA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.10.0 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/config-array@0.20.0': + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.2.1': + resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.12.0': + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.13.0': + resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.24.0': + resolution: {integrity: sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.8': + resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@exodus/schemasafe@1.3.0': + resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} + + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@fontsource-variable/jetbrains-mono@5.2.5': + resolution: {integrity: sha512-G3sN1xq1moZd0JL+hFaA4MEdsiQS+JXC/z7m+EqA5/Fzn5CQlXGUaaNKFGQdDsFuLTnCfW0KOOSWHjygNfjEPw==} + + '@fontsource-variable/oxanium@5.2.5': + resolution: {integrity: sha512-Vt/XIHxASIbOTl5HrQab3uLHxAtXt5lHTECMyMdKTKaAFKynwU6S7NcYWjSb4jv2uAOV+KZ47vhmKE0FBW8uAw==} + + '@gcornut/valibot-json-schema@0.31.0': + resolution: {integrity: sha512-3xGptCurm23e7nuPQkdrE5rEs1FeTPHhAUsBuwwqG4/YeZLwJOoYZv+fmsppUEfo5y9lzUwNQrNqLS/q7HMc7g==} + hasBin: true + + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + engines: {node: '>=18.18'} + + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@internationalized/date@3.8.0': + resolution: {integrity: sha512-J51AJ0fEL68hE4CwGPa6E0PO6JDaVLd8aln48xFCSy7CZkZc96dGEGmLs2OEEbBxcsVZtfrqkXJwI2/MSG8yKw==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@lucide/svelte@0.486.0': + resolution: {integrity: sha512-Q8dav9ruYhdLepb2NNngYeGaMHxFv4Qd1FPc7YYkqouHfjTOJ3fLeyKmbANioRRmtMrLBNfOez9v5EIca+VCFg==} + peerDependencies: + svelte: ^5 + + '@lukulent/svelte-umami@0.0.4': + resolution: {integrity: sha512-LXmo0oa8lPg032gfqFQgRhEJgUDqgsOzyqPSXtJ2nKlUAYhsPbB0EXwgOjrj7+IfeiBEiq2c6vfv0VV5Jvv/PA==} + peerDependencies: + svelte: ^4.0.0 || ^5.0.0 + + '@mapbox/node-pre-gyp@2.0.0': + resolution: {integrity: sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==} + engines: {node: '>=18'} + hasBin: true + + '@mdx-js/mdx@3.1.0': + resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} + + '@napi-rs/wasm-runtime@0.2.9': + resolution: {integrity: sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@octokit/app@15.1.6': + resolution: {integrity: sha512-WELCamoCJo9SN0lf3SWZccf68CF0sBNPQuLYmZ/n87p5qvBJDe9aBtr5dHkh7T9nxWZ608pizwsUbypSzZAiUw==} + engines: {node: '>= 18'} + + '@octokit/auth-app@7.2.1': + resolution: {integrity: sha512-4jaopCVOtWN0V8qCx/1s2pkRqC6tcvIQM3kFB99eIpsP53GfsoIKO08D94b83n/V3iGihHmxWR2lXzE0NicUGg==} + engines: {node: '>= 18'} + + '@octokit/auth-oauth-app@8.1.4': + resolution: {integrity: sha512-71iBa5SflSXcclk/OL3lJzdt4iFs56OJdpBGEBl1wULp7C58uiswZLV6TdRaiAzHP1LT8ezpbHlKuxADb+4NkQ==} + engines: {node: '>= 18'} + + '@octokit/auth-oauth-device@7.1.5': + resolution: {integrity: sha512-lR00+k7+N6xeECj0JuXeULQ2TSBB/zjTAmNF2+vyGPDEFx1dgk1hTDmL13MjbSmzusuAmuJD8Pu39rjp9jH6yw==} + engines: {node: '>= 18'} + + '@octokit/auth-oauth-user@5.1.4': + resolution: {integrity: sha512-4tJRofMHm6ZCd3O2PVgboBbQ/lNtacREeaihet0+wCATZmvPK+jjg2K6NjBfY69An3yzQdmkcMeiaOOoxOPr7Q==} + engines: {node: '>= 18'} + + '@octokit/auth-token@5.1.2': + resolution: {integrity: sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==} + engines: {node: '>= 18'} + + '@octokit/auth-unauthenticated@6.1.3': + resolution: {integrity: sha512-d5gWJla3WdSl1yjbfMpET+hUSFCE15qM0KVSB0H1shyuJihf/RL1KqWoZMIaonHvlNojkL9XtLFp8QeLe+1iwA==} + engines: {node: '>= 18'} + + '@octokit/core@6.1.5': + resolution: {integrity: sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==} + engines: {node: '>= 18'} + + '@octokit/endpoint@10.1.4': + resolution: {integrity: sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==} + engines: {node: '>= 18'} + + '@octokit/graphql@8.2.2': + resolution: {integrity: sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==} + engines: {node: '>= 18'} + + '@octokit/oauth-app@7.1.6': + resolution: {integrity: sha512-OMcMzY2WFARg80oJNFwWbY51TBUfLH4JGTy119cqiDawSFXSIBujxmpXiKbGWQlvfn0CxE6f7/+c6+Kr5hI2YA==} + engines: {node: '>= 18'} + + '@octokit/oauth-authorization-url@7.1.1': + resolution: {integrity: sha512-ooXV8GBSabSWyhLUowlMIVd9l1s2nsOGQdlP2SQ4LnkEsGXzeCvbSbCPdZThXhEFzleGPwbapT0Sb+YhXRyjCA==} + engines: {node: '>= 18'} + + '@octokit/oauth-methods@5.1.5': + resolution: {integrity: sha512-Ev7K8bkYrYLhoOSZGVAGsLEscZQyq7XQONCBBAl2JdMg7IT3PQn/y8P0KjloPoYpI5UylqYrLeUcScaYWXwDvw==} + engines: {node: '>= 18'} + + '@octokit/openapi-types@25.0.0': + resolution: {integrity: sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==} + + '@octokit/openapi-webhooks-types@10.4.0': + resolution: {integrity: sha512-HMiF7FUiVBYfp8pPijMTkWuPELQB6XkPftrnSuK1C1YXaaq2+0ganiQkorEQfXTmhtwlgHJwXT6P8miVhIyjQA==} + + '@octokit/plugin-paginate-graphql@5.2.4': + resolution: {integrity: sha512-pLZES1jWaOynXKHOqdnwZ5ULeVR6tVVCMm+AUbp0htdcyXDU95WbkYdU4R2ej1wKj5Tu94Mee2Ne0PjPO9cCyA==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-paginate-rest@12.0.0': + resolution: {integrity: sha512-MPd6WK1VtZ52lFrgZ0R2FlaoiWllzgqFHaSZxvp72NmoDeZ0m8GeJdg4oB6ctqMTYyrnDYp592Xma21mrgiyDA==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-rest-endpoint-methods@14.0.0': + resolution: {integrity: sha512-iQt6ovem4b7zZYZQtdv+PwgbL5VPq37th1m2x2TdkgimIDJpsi2A6Q/OI/23i/hR6z5mL0EgisNR4dcbmckSZQ==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-retry@7.2.1': + resolution: {integrity: sha512-wUc3gv0D6vNHpGxSaR3FlqJpTXGWgqmk607N9L3LvPL4QjaxDgX/1nY2mGpT37Khn+nlIXdljczkRnNdTTV3/A==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-throttling@10.0.0': + resolution: {integrity: sha512-Kuq5/qs0DVYTHZuBAzCZStCzo2nKvVRo/TDNhCcpC2TKiOGz/DisXMCvjt3/b5kr6SCI1Y8eeeJTHBxxpFvZEg==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': ^6.1.3 + + '@octokit/request-error@6.1.8': + resolution: {integrity: sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==} + engines: {node: '>= 18'} + + '@octokit/request@9.2.3': + resolution: {integrity: sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==} + engines: {node: '>= 18'} + + '@octokit/types@14.0.0': + resolution: {integrity: sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==} + + '@octokit/webhooks-methods@5.1.1': + resolution: {integrity: sha512-NGlEHZDseJTCj8TMMFehzwa9g7On4KJMPVHDSrHxCQumL6uSQR8wIkP/qesv52fXqV1BPf4pTxwtS31ldAt9Xg==} + engines: {node: '>= 18'} + + '@octokit/webhooks@13.8.0': + resolution: {integrity: sha512-3PCWyFBNbW2+Ox36VAkSqlPoIb96NZiPcICRYySHZrDTM2NuNxvrjPeaQDj2egqILs9EZFObRTHVMe4XxXJV7w==} + engines: {node: '>= 18'} + + '@oxc-parser/binding-darwin-arm64@0.63.0': + resolution: {integrity: sha512-A1WyN+JZKSdI0CS5kay4JByBDUVGKZklVgPMzINKnGD6kGgc94QBEfYKa+So4nprCjpR/JV2Rcg1Gv5Gsxd6kg==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.63.0': + resolution: {integrity: sha512-gJlWpD1NwSOD7BzKSPiioTUgVo0Y2vMDnEkKyhX1wKERVuBFhObMsfJJ6YSK8MOz8HJMulSjfE0euwXCrgeTGA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.63.0': + resolution: {integrity: sha512-xdKXY7Q8xKGyjZ/bkYYutqmDAFWfvXWVoLzCgZ+BP7iXqwRFKCvASIm7taZ9XXmWiI8z80HaV/V1tu7ecznNnw==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.63.0': + resolution: {integrity: sha512-D2NIiU5tmeS5OFqLNYEtbaCkNzkoIBCsbiYCal31fPmH1Q4ePC2DQtgJ+127dARZaUDVB+aPkRuuRPUPVMga7w==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-arm64-musl@0.63.0': + resolution: {integrity: sha512-A8QosGcHXt8x/7fxHMygytJLqiMesX60tXnrXUK+41GIEv0lzwjiugzOAG3om9+O/reVvh1S5BI3uGvr/Tp3pA==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-x64-gnu@0.63.0': + resolution: {integrity: sha512-ZuM+UZW8VIf9fPqi7Th4ffWt622iyPD14aDQpCwk/fZfKsKWYY25Nv94p4te4dWhtRg122urTu4k2b12vorR8w==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-linux-x64-musl@0.63.0': + resolution: {integrity: sha512-WVKm04d8Q2+OQOq4w0djqWh+Qr3v+VC3fshQAxEZ9xhKBqcStTQZ1B7Wt58S0lfgk2dmjJfrE3YmewS8O+0LFw==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-wasm32-wasi@0.63.0': + resolution: {integrity: sha512-2LaFgfg6OfolsE8/JXg8sMc114bE+2zi2L0XnMQODhAUre/MoKm6DY6VX4bDFkAtupMaVJ03KgRfmowVDVNAVg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-parser/binding-win32-arm64-msvc@0.63.0': + resolution: {integrity: sha512-tVYhlRYj1j1MwhrlJ7hp9TVwTAJRlayAQ/+hzILSwFcjztVw/33tZwoEq3LydZhscsiKNANyA9s1ztrP4QOZ5g==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.63.0': + resolution: {integrity: sha512-0o52Mp2slTzynpP1dcqemDmQQmCs/phBdwJa6JERqdI1IKdp8+Xa39rEsDqQo3IISsXUDhd68hZBWmwayCsPrA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.63.0': + resolution: {integrity: sha512-2tIGBdm0mOMMo3AUVdXyZUORDbWTnt4XVOKeNdcPtxtb39SgyF/ek2QV7DJ9BAV5TWYYis6BuY5SqrAp+PHRgQ==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@poppinss/macroable@1.0.4': + resolution: {integrity: sha512-ct43jurbe7lsUX5eIrj4ijO3j/6zIPp7CDnFWXDs7UPAbw1Pu1iH3oAmFdP4jcskKJBURH5M9oTtyeiUXyHX8Q==} + engines: {node: '>=18.16.0'} + + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.40.0': + resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.40.0': + resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.40.0': + resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.40.0': + resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.40.0': + resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.40.0': + resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.40.0': + resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.40.0': + resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.40.0': + resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.40.0': + resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.40.0': + resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.40.0': + resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.40.0': + resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.40.0': + resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.40.0': + resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.40.0': + resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.40.0': + resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} + cpu: [x64] + os: [win32] + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@shikijs/core@3.2.2': + resolution: {integrity: sha512-yvlSKVMLjddAGBa2Yu+vUZxuu3sClOWW1AG+UtJkvejYuGM5BVL35s6Ijiwb75O9QdEx6IkMxinHZSi8ZyrBaA==} + + '@shikijs/engine-javascript@3.2.2': + resolution: {integrity: sha512-tlDKfhWpF4jKLUyVAnmL+ggIC+0VyteNsUpBzh1iwWLZu4i+PelIRr0TNur6pRRo5UZIv3ss/PLMuwahg9S2hg==} + + '@shikijs/engine-oniguruma@3.2.2': + resolution: {integrity: sha512-vyXRnWVCSvokwbaUD/8uPn6Gqsf5Hv7XwcW4AgiU4Z2qwy19sdr6VGzMdheKKN58tJOOe5MIKiNb901bgcUXYQ==} + + '@shikijs/langs@3.2.2': + resolution: {integrity: sha512-NY0Urg2dV9ETt3JIOWoMPuoDNwte3geLZ4M1nrPHbkDS8dWMpKcEwlqiEIGqtwZNmt5gKyWpR26ln2Bg2ecPgw==} + + '@shikijs/markdown-it@3.2.2': + resolution: {integrity: sha512-abxppHBxksFKhAHn/nM/VAktZVMOtigPgWFuokENJ0jPAoqMs4Xn7zMCjizftgld0B+JbM7IGGJsC2qaP4j0OQ==} + peerDependencies: + markdown-it-async: ^2.2.0 + peerDependenciesMeta: + markdown-it-async: + optional: true + + '@shikijs/themes@3.2.2': + resolution: {integrity: sha512-Zuq4lgAxVKkb0FFdhHSdDkALuRpsj1so1JdihjKNQfgM78EHxV2JhO10qPsMrm01FkE3mDRTdF68wfmsqjt6HA==} + + '@shikijs/types@3.2.2': + resolution: {integrity: sha512-a5TiHk7EH5Lso8sHcLHbVNNhWKP0Wi3yVnXnu73g86n3WoDgEra7n3KszyeCGuyoagspQ2fzvy4cpSc8pKhb0A==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@sideway/address@4.1.5': + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + + '@sinclair/typebox@0.34.33': + resolution: {integrity: sha512-5HAV9exOMcXRUxo+9iYB5n09XxzCXnfy4VTNW4xnDv+FgjzAGY989C28BIdljKqmF+ZltUwujE3aossvcVtq6g==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + + '@sveltejs/acorn-typescript@1.0.5': + resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/adapter-vercel@5.7.0': + resolution: {integrity: sha512-Bd/loKugyr12I576NaktLzIHa0PinS638wuWgVq4ctPg/qmkeU459jurWjs3NiRN/pbBpXOlk8i8HXgQF+dsUg==} + peerDependencies: + '@sveltejs/kit': ^2.4.0 + + '@sveltejs/kit@2.20.7': + resolution: {integrity: sha512-dVbLMubpJJSLI4OYB+yWYNHGAhgc2bVevWuBjDj8jFUXIJOAnLwYP3vsmtcgoxNGUXoq0rHS5f7MFCsryb6nzg==} + engines: {node: '>=18.13'} + hasBin: true + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.3 || ^6.0.0 + + '@sveltejs/vite-plugin-svelte-inspector@2.1.0': + resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==} + engines: {node: ^18.0.0 || >=20} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^3.0.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.0 + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': + resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 + + '@sveltejs/vite-plugin-svelte@3.1.2': + resolution: {integrity: sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==} + engines: {node: ^18.0.0 || >=20} + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.0 + + '@sveltejs/vite-plugin-svelte@5.0.3': + resolution: {integrity: sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.0.0 + + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + + '@types/aws-lambda@8.10.149': + resolution: {integrity: sha512-NXSZIhfJjnXqJgtS7IwutqIF/SOy1Wz5Px4gUY1RWITp3AYTyuJS4xaXr/bIJY1v15XMzrJ5soGnPM+7uigZjA==} + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node-fetch@2.6.12': + resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} + + '@types/node@18.19.86': + resolution: {integrity: sha512-fifKayi175wLyKyc5qUfyENhQ1dCNI1UNjp653d8kuYcPQN5JhX3dGuP/XmvPTg/xRBn1VTLpbmi+H/Mr7tLfQ==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/validator@13.15.0': + resolution: {integrity: sha512-nh7nrWhLr6CBq9ldtw0wx+z9wKnnv/uTVLA9g/3/TcOYxbpOSZE+MhKPmWqU+K0NvThjhv12uD8MuqijB0WzEA==} + + '@typeschema/class-validator@0.3.0': + resolution: {integrity: sha512-OJSFeZDIQ8EK1HTljKLT5CItM2wsbgczLN8tMEfz3I1Lmhc5TBfkZ0eikFzUC16tI3d1Nag7um6TfCgp2I2Bww==} + peerDependencies: + class-validator: ^0.14.1 + peerDependenciesMeta: + class-validator: + optional: true + + '@typeschema/core@0.14.0': + resolution: {integrity: sha512-Ia6PtZHcL3KqsAWXjMi5xIyZ7XMH4aSnOQes8mfMLx+wGFGtGRNlwe6Y7cYvX+WfNK67OL0/HSe9t8QDygV0/w==} + peerDependencies: + '@types/json-schema': ^7.0.15 + peerDependenciesMeta: + '@types/json-schema': + optional: true + + '@typescript-eslint/eslint-plugin@8.30.1': + resolution: {integrity: sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/parser@8.30.1': + resolution: {integrity: sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/scope-manager@8.30.1': + resolution: {integrity: sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.30.1': + resolution: {integrity: sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/types@8.30.1': + resolution: {integrity: sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.30.1': + resolution: {integrity: sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/utils@8.30.1': + resolution: {integrity: sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/visitor-keys@8.30.1': + resolution: {integrity: sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@upstash/redis@1.34.8': + resolution: {integrity: sha512-eGJgOKc+2Uq4AdSM0lNx+WvFFhQeyhJ32SGNuSniLPg4lNb6m5h2AQ77qL+TgWiMZO8HCQ82Zsc/RlVBevCWTg==} + + '@vercel/nft@0.29.2': + resolution: {integrity: sha512-A/Si4mrTkQqJ6EXJKv5EYCDQ3NL6nJXxG8VGXePsaiQigsomHYQC9xSpX8qGk7AEZk4b1ssbYIqJ0ISQQ7bfcA==} + engines: {node: '>=18'} + hasBin: true + + '@vinejs/compiler@3.0.0': + resolution: {integrity: sha512-v9Lsv59nR56+bmy2p0+czjZxsLHwaibJ+SV5iK9JJfehlJMa501jUJQqqz4X/OqKXrxtE3uTQmSqjUqzF3B2mw==} + engines: {node: '>=18.0.0'} + + '@vinejs/vine@3.0.1': + resolution: {integrity: sha512-ZtvYkYpZOYdvbws3uaOAvTFuvFXoQGAtmzeiXu+XSMGxi5GVsODpoI9Xu9TplEMuD/5fmAtBbKb9cQHkWkLXDQ==} + engines: {node: '>=18.16.0'} + + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + + '@vue/compiler-sfc@3.5.13': + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + + '@vue/compiler-ssr@3.5.13': + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + + '@vue/reactivity@3.5.13': + resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + + '@vue/runtime-core@3.5.13': + resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + + '@vue/runtime-dom@3.5.13': + resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + + '@vue/server-renderer@3.5.13': + resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + peerDependencies: + vue: 3.5.13 + + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + anafanafo@2.0.0: + resolution: {integrity: sha512-Nlfq7NC4AOkTJerWRIZcOAiMNtIDVIGWGvQ98O7Jl6Kr2Dk0dX5u4MqN778kSRTy5KRqchpLdF2RtLFEz9FVkQ==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + arktype@2.1.20: + resolution: {integrity: sha512-IZCEEXaJ8g+Ijd59WtSYwtjnqXiwM8sWQ5EjGamcto7+HVN9eK0C4p0zDlCuAwWhpqr6fIBkxPuYDl4/Mcj/+Q==} + + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atomically@2.0.3: + resolution: {integrity: sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==} + + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + badge-maker@4.1.0: + resolution: {integrity: sha512-qYImXoz0WZRMaauqSMo6QNurKp26K3RcOhefuGfno50xmAzHEJsgHbP4gnHs6Ps53KgQgFi4MJKB6Rq8H7siww==} + engines: {node: '>=16'} + hasBin: true + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + before-after-hook@3.0.2: + resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + binary-search@1.3.6: + resolution: {integrity: sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bits-ui@1.3.15: + resolution: {integrity: sha512-A0qbIJFNseMmqvSUZP6gnvxFvChteOdIcTfKyyYUTWGNWwOOcwRv2OBDiB3AgFntmGKbST71lg5HDJkI+c94/g==} + engines: {node: '>=18', pnpm: '>=8.7.0'} + peerDependencies: + svelte: ^5.11.0 + + bottleneck@2.19.5: + resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + + caniuse-lite@1.0.30001714: + resolution: {integrity: sha512-mtgapdwDLSSBnCI3JokHM7oEQBLxiJKVRtg10AxM1AyeiKcM96f0Mkbqeq+1AbiCtvMcHRulAAEMu693JrSWqg==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + char-width-table-consumer@1.0.0: + resolution: {integrity: sha512-Fz4UD0LBpxPgL9i29CJ5O4KANwaMnX/OhhbxzvNa332h+9+nRKyeuLw4wA51lt/ex67+/AdsoBQJF3kgX2feYQ==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + class-validator@0.14.1: + resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + color-convert@0.5.3: + resolution: {integrity: sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concurrently@9.1.2: + resolution: {integrity: sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==} + engines: {node: '>=18'} + hasBin: true + + conf@13.1.0: + resolution: {integrity: sha512-Bi6v586cy1CoTFViVO4lGTtx780lfF96fUmS1lSX6wpZf6330NvHUu6fReVuDP1de8Mg0nkZb01c8tAQdz1o3w==} + engines: {node: '>=18'} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + css-color-converter@2.0.0: + resolution: {integrity: sha512-oLIG2soZz3wcC3aAl/7Us5RS8Hvvc6I8G8LniF/qfMmrm7fIKQ8RIDDRZeKyGL2SrWfNqYspuLShbnjBMVWm8g==} + + css-dependency@0.0.3: + resolution: {integrity: sha512-jLQuve6jhpjkH3+k2Y8jK3j27Hm3rnIsRW/8oOf9oxFOBI5iu6sndwSv6lj5dNfO9JVP6cNb8Xs+VXhndgtLfQ==} + + css-unit-converter@1.1.2: + resolution: {integrity: sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssstyle@4.3.0: + resolution: {integrity: sha512-6r0NiY0xizYqfBvWp1G7WXJ06/bZyrk7Dc6PHql82C/pKGUTKu4yAX4Y8JPamb1ob9nBKuxWzCGTRuGwU3yxJQ==} + engines: {node: '>=18'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + debounce-fn@6.0.0: + resolution: {integrity: sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==} + engines: {node: '>=18'} + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.5.0: + resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + + decode-named-character-reference@1.1.0: + resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + devalue@5.1.1: + resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff@7.0.0: + resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} + engines: {node: '>=0.3.1'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dompurify@3.2.5: + resolution: {integrity: sha512-mLPd29uoRe9HpvwP2TxClGQBzGXeEC/we/q+bFlmPPmj2p2Ugl3r6ATu/UU1v77DXNcehiBg9zsr1dREyA/dJQ==} + + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} + + drizzle-orm@0.41.0: + resolution: {integrity: sha512-7A4ZxhHk9gdlXmTdPj/lREtP+3u8KvZ4yEN6MYVxBzZGex5Wtdc+CWSbu7btgF6TB0N+MNPrvW7RKBbxJchs/Q==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=4' + '@electric-sql/pglite': '>=0.2.0' + '@libsql/client': '>=0.10.0' + '@libsql/client-wasm': '>=0.10.0' + '@neondatabase/serverless': '>=0.10.0' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/sql.js': '*' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=14.0.0' + gel: '>=2' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + prisma: '*' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@libsql/client-wasm': + optional: true + '@neondatabase/serverless': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/sql.js': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + gel: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + effect@3.14.10: + resolution: {integrity: sha512-qmqq8eqQlavxtOvDRtizbW5/Z2rSJA1U7vhrF5h+8gcCRVqYXj5nTyySUyHdMMEFPBjsgVeJ1aVKMXZGjaGoAg==} + + electron-to-chromium@1.5.137: + resolution: {integrity: sha512-/QSJaU2JyIuTbbABAo/crOs+SuAZLS+fVVS10PVrIT9hrRkmZl8Hb0xPSkKRUUWHQtYzXHpQUW3Dy5hwMzGZkA==} + + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + + esbuild-runner@2.2.2: + resolution: {integrity: sha512-fRFVXcmYVmSmtYm2mL8RlUASt2TDkGh3uRcvHFOKNr/T58VrfVeKD9uT9nlgxk96u0LS0ehS/GY7Da/bXWKkhw==} + hasBin: true + peerDependencies: + esbuild: '*' + + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.25.2: + resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-prettier@10.1.2: + resolution: {integrity: sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-svelte@3.5.1: + resolution: {integrity: sha512-Qn1slddZHfqYiDO6IN8/iN3YL+VuHlgYjm30FT+hh0Jf/TX0jeZMTJXQMajFm5f6f6hURi+XO8P+NPYD+T4jkg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.1 || ^9.0.0 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + + eslint-scope@8.3.0: + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.24.0: + resolution: {integrity: sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrap@1.4.6: + resolution: {integrity: sha512-F/D2mADJ9SHY3IwksD4DAXjTt7qt7GWUf3/8RhCNWmC/67tyb55dpimHmy7EplakFaflV0R/PC+fdSPqrRHAQw==} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + execa@9.5.2: + resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==} + engines: {node: ^18.19.0 || >=20.5.0} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-check@3.23.2: + resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} + engines: {node: '>=8.0.0'} + + fast-content-type-parse@2.0.1: + resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + flexsearch@0.7.43: + resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data-encoder@1.7.2: + resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + + form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} + + formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.0.0: + resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==} + engines: {node: '>=18'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-heading-rank@3.0.0: + resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.3: + resolution: {integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + + is-absolute-url@4.0.1: + resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isomorphic-dompurify@2.23.0: + resolution: {integrity: sha512-f9w5fPJwlu+VK1uowFy4eWYgd7uxl0nQJbtorGp1OAs6JeY1qPkBQKNee1RXrnr68GqZ86PwQ6LF/5rW1TrOZQ==} + engines: {node: '>=18'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + joi@17.13.3: + resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-to-ts@3.1.1: + resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} + engines: {node: '>=16'} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@8.0.1: + resolution: {integrity: sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + jsrepo@1.47.0: + resolution: {integrity: sha512-jWXBNxO9lNVA4duzr9XCnAqP2n42IFlCEGH5z2f8WpnYm14IT5o+DsTuK9PHSRAmzSfbQjArQzqj9QKbWyxJSw==} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + known-css-properties@0.35.0: + resolution: {integrity: sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + libphonenumber-js@1.12.6: + resolution: {integrity: sha512-PJiS4ETaUfCOFLpmtKzAbqZQjCCKVu2OhTV4SVNNE7c2nu/dACvtCqj4L0i/KWNnIgRv7yrILvBj5Lonv5Ncxw==} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-it-table@4.1.1: + resolution: {integrity: sha512-dzFHRwCe97sXD071Gw/LSIwgAcO2vNsT0BcPCmnrKhNW/W57Bnknl8EaC+j4hM3bAqus1CiVPcTQAvLkUfHLhw==} + engines: {node: '>12.6'} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdsx@0.0.6: + resolution: {integrity: sha512-hfIlNzOlT153M37ZzbjuGSN8ZFNqlyEWaPnGr9L92Ty/dkZdIfgyDeFrsJDuQ77oY1bf3jeNCycR19ocD/BpfA==} + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.1 + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + memoize-weak@1.0.2: + resolution: {integrity: sha512-gj39xkrjEw7nCn4nJ1M5ms6+MyMlyiGmttzsqAUsAKn6bYKwuTHh/AO3cKPF8IBrTIYTxb0wWXFs3E//Y8VoWQ==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} + + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mode-watcher@0.5.1: + resolution: {integrity: sha512-adEC6T7TMX/kzQlaO/MtiQOSFekZfQu4MC+lXyoceQG+U5sKpJWZ4yKXqw846ExIuWJgedkOIPqAYYRk/xHm+w==} + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.1 + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + normalize-url@8.0.1: + resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + engines: {node: '>=14.16'} + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + nwsapi@2.2.20: + resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + octokit@4.1.3: + resolution: {integrity: sha512-PP+EL8h4xPCE9NBo6jXq6I2/EiTXsn1cg9F0IZehHBv/qhuQpyGMFElEB17miWKciuT6vRHiFFiG9+FoXOmg6A==} + engines: {node: '>= 18'} + + ollama@0.5.15: + resolution: {integrity: sha512-TSaZSJyP7MQJFjSmmNsoJiriwa3U+/UJRw6+M8aucs5dTsaWNZsBIGpDb5rXnW6nXxJBB/z79gZY8IaiIQgelQ==} + + oniguruma-parser@0.11.2: + resolution: {integrity: sha512-F7Ld4oDZJCI5/wCZ8AOffQbqjSzIRpKH7I/iuSs1SkhZeCj0wS6PMZ4W6VA16TWHrAo0Y9bBKEJOe7tvwcTXnw==} + + oniguruma-to-es@4.2.0: + resolution: {integrity: sha512-MDPs6KSOLS0tKQ7joqg44dRIRZUyotfTy0r+7oEEs6VwWWP0+E2PPDYWMFN0aqOjRyWHBYq7RfKw9GQk2S2z5g==} + + openai@4.95.0: + resolution: {integrity: sha512-tWHLTA+/HHyWlP8qg0mQLDSpI2NQLhk6zHLJL8yb59qn2pEI8rbEiAGSDPViLvi3BRDoQZIX5scaJ3xYGr2nhw==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.23.8 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + oxc-parser@0.63.0: + resolution: {integrity: sha512-wsSqdyAZdM02zOvCexJhnkIRUzXuC/0+3iR8dxso54OhIAjW5bNecr8APkwWWNdGrZjipybvnGGP7o2itUN0KA==} + engines: {node: '>=14.0.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@1.2.0: + resolution: {integrity: sha512-PutJepsOtsqVfUsxCzgTTpyXmiAgvKptIgY4th5eq5UXXFhj5PxfQ9hnGkypMeovpAvVshFRItoFHYO18TCOqA==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@3.1.4: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-scss@4.0.9: + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + postgres@3.4.5: + resolution: {integrity: sha512-cDWgoah1Gez9rN3H4165peY9qfpEo+SA61oQv65O3cRUE1pOEoJWwddwcqKE8XZYjbblOJlYDlLV4h67HrEVDg==} + engines: {node: '>=12'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-plugin-svelte@3.3.3: + resolution: {integrity: sha512-yViK9zqQ+H2qZD1w/bH7W8i+bVfKrD8GIFjkFe4Thl6kCT9SlAsXVNmt3jCvQOCsnOhcvYgsoVlRV/Eu6x5nNw==} + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + + prettier-plugin-tailwindcss@0.6.11: + resolution: {integrity: sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} + hasBin: true + + pretty-ms@9.2.0: + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} + engines: {node: '>=18'} + + property-expr@2.0.6: + resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + property-information@7.0.0: + resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.0: + resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==} + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.0.1: + resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + + rehype-autolink-headings@7.1.0: + resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} + + rehype-external-links@3.0.0: + resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-pretty-code@0.14.1: + resolution: {integrity: sha512-IpG4OL0iYlbx78muVldsK86hdfNoht0z63AP7sekQNW2QOTmjxB7RbTO+rhIYNGRljgHxgVZoPwUl6bIC9SbjA==} + engines: {node: '>=18'} + peerDependencies: + shiki: ^1.0.0 || ^2.0.0 || ^3.0.0 + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + rehype-slug@6.0.0: + resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-mdx@3.1.0: + resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remove-markdown@0.6.0: + resolution: {integrity: sha512-B9g8yo5Zp1wXfZ77M1RLpqI7xrBBERkp7+3/Btm9N/uZV5xhXZjzIxDbCKz7CSj141lWDuCnQuH12DKLUv4Ghw==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.40.0: + resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + runed@0.23.4: + resolution: {integrity: sha512-9q8oUiBYeXIDLWNK5DfCWlkL0EW3oGbk845VdKlPeia28l751VpfesaB/+7pI6rnbx1I6rqoZ2fZxptOJLxILA==} + peerDependencies: + svelte: ^5.7.0 + + runed@0.25.0: + resolution: {integrity: sha512-7+ma4AG9FT2sWQEA0Egf6mb7PBT2vHyuHail1ie8ropfSjvZGtEAx8YTmUjv/APCsdRRxEVvArNjALk9zFSOrg==} + peerDependencies: + svelte: ^5.7.0 + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.2: + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} + + shiki@3.2.2: + resolution: {integrity: sha512-0qWBkM2t/0NXPRcVgtLhtHv6Ak3Q5yI4K/ggMqcgLRKm4+pCs3namgZlhlat/7u2CuqNtlShNs9lENOG6n7UaQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + sirv@3.0.1: + resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} + engines: {node: '>=18'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + stubborn-fs@1.2.5: + resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} + + style-to-js@1.1.16: + resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} + + style-to-object@1.0.8: + resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + superstruct@2.0.2: + resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} + engines: {node: '>=14.0.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svelte-check@4.1.6: + resolution: {integrity: sha512-P7w/6tdSfk3zEVvfsgrp3h3DFC75jCdZjTQvgGJtjPORs1n7/v2VMPIoty3PWv7jnfEm3x0G/p9wH4pecTb0Wg==} + engines: {node: '>= 18.0.0'} + hasBin: true + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: '>=5.0.0' + + svelte-eslint-parser@1.1.2: + resolution: {integrity: sha512-vqFBRamDKo1l70KMfxxXj1/0Cco5TfMDnqaAjgz6D8PyoMhfMcDOLRkAwPg8WkMyZjMtQL3wW66TZ0x59iqO2w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + + svelte-hmr@0.16.0: + resolution: {integrity: sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==} + engines: {node: ^12.20 || ^14.13.1 || >= 16} + peerDependencies: + svelte: ^3.19.0 || ^4.0.0 + + svelte-toolbelt@0.7.1: + resolution: {integrity: sha512-HcBOcR17Vx9bjaOceUvxkY3nGmbBmCBBbuWLLEWO6jtmWH8f/QoWmbyUfQZrpDINH39en1b8mptfPQT9VKQ1xQ==} + engines: {node: '>=18', pnpm: '>=8.7.0'} + peerDependencies: + svelte: ^5.0.0 + + svelte@5.27.0: + resolution: {integrity: sha512-Uai13Ydt1ZE+bUHme6b9U38PCYVNCqBRoBMkUKbFbKiD7kHWjdUUrklYAQZJxyKK81qII4mrBwe/YmvEMSlC9w==} + engines: {node: '>=18'} + + sveltekit-search-params@3.0.0: + resolution: {integrity: sha512-wq1Yo5zITev8ty9CWGmHgvAh+Xb3mCUewyUmvCdv6MJWi+/aZ4o79Y6SjuduDL0Cfd/KYHkqt4f/wQ4FtokSdw==} + peerDependencies: + '@sveltejs/kit': ^1.0.0 || ^2.0.0 + svelte: ^3.55.0 || ^4.0.0 || ^5.0.0 + + sveltekit-superforms@2.24.1: + resolution: {integrity: sha512-L4BlvgOD1CquP83UaCcHziD/BJ7lJEHT6g0J+F5h15mShxurJiXse4dX1BxDSGarNdzzrOBujd5ecjuIQm2zdw==} + peerDependencies: + '@sveltejs/kit': 1.x || 2.x + svelte: 3.x || 4.x || >=5.0.0-next.51 + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + tailwind-merge@2.5.4: + resolution: {integrity: sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==} + + tailwind-merge@2.6.0: + resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} + + tailwind-variants@0.3.1: + resolution: {integrity: sha512-krn67M3FpPwElg4FsZrOQd0U26o7UDH/QOkK8RNaiCCrr052f6YJPBUfNKnPo/s/xRzNPtv1Mldlxsg8Tb46BQ==} + engines: {node: '>=16.x', pnpm: '>=7.x'} + peerDependencies: + tailwindcss: '*' + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} + engines: {node: '>=14.0.0'} + hasBin: true + + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + + terser@5.39.0: + resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} + engines: {node: '>=10'} + hasBin: true + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tiny-case@1.0.3: + resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} + + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + + tldts-core@6.1.86: + resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} + + tldts@6.1.86: + resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + hasBin: true + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toad-cache@3.7.0: + resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} + engines: {node: '>=12'} + + toposort@2.0.2: + resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-algebra@2.0.0: + resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-deepmerge@7.0.2: + resolution: {integrity: sha512-akcpDTPuez4xzULo5NwuoKwYRtjQJ9eoNfBACiBMaXwNAx7B1PKfe5wqUFJuW5uKzQ68YjDFwPaWHDG1KnFGsA==} + engines: {node: '>=14.13.1'} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@4.40.0: + resolution: {integrity: sha512-ABHZ2/tS2JkvH1PEjxFDTUWC8dB5OsIGZP4IFLhR293GqT5Y5qB1WwL2kMPYhQW9DVgVD8Hd7I8gjwPIf5GFkw==} + engines: {node: '>=16'} + + typescript-eslint@8.30.1: + resolution: {integrity: sha512-D7lC0kcehVH7Mb26MRQi64LMyRJsj3dToJxM1+JVTl53DQSV5/7oUGWQLcKl1C1KnoVHxMMU2FNQMffr7F3Row==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + uint8array-extras@1.4.0: + resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} + engines: {node: '>=18'} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universal-github-app-jwt@2.2.2: + resolution: {integrity: sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw==} + + universal-user-agent@7.0.2: + resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + valibot@0.31.1: + resolution: {integrity: sha512-2YYIhPrnVSz/gfT2/iXVTrSj92HwchCt9Cga/6hX4B26iCz9zkIsGTS0HjDYTZfTi1Un0X6aRvhBi1cfqs/i0Q==} + + valibot@1.0.0: + resolution: {integrity: sha512-1Hc0ihzWxBar6NGeZv7fPLY0QuxFMyxwYR2sF1Blu7Wq7EnremwY2W02tit2ij2VJT8HcSkHAQqmFfl77f73Yw==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + + valibot@1.0.0-rc.3: + resolution: {integrity: sha512-LT0REa7Iqx4QGcaHLiTiTkcmJqJ9QdpOy89HALFFBJgejTS64GQFRIbDF7e4f6pauQbo/myfKGmWXCLhMeM6+g==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + + validate-npm-package-name@6.0.0: + resolution: {integrity: sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==} + engines: {node: ^18.17.0 || >=20.5.0} + + validator@13.15.0: + resolution: {integrity: sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA==} + engines: {node: '>= 0.10'} + + velite@0.2.2: + resolution: {integrity: sha512-VuaowCAIrlarURqVvTeTc1pMCLXUjjrw6FqwpxFahPht9AsWWZ1i8P/DY411n82s5ZwLqC3f8K4ZqzAnAGvJMA==} + engines: {node: ^18.17.0 || >=20.3.0} + hasBin: true + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@6.3.1: + resolution: {integrity: sha512-kkzzkqtMESYklo96HKKPE5KKLkC1amlsqt+RjFMlX2AvbRB/0wghap19NdBxxwGZ+h/C6DLCrcEphPIItlGrRQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@0.2.5: + resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + vite: + optional: true + + vitefu@1.0.6: + resolution: {integrity: sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + vite: + optional: true + + vue@3.5.13: + resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + when-exit@2.1.4: + resolution: {integrity: sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + ws@8.18.1: + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.7.1: + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yoctocolors@2.1.1: + resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} + engines: {node: '>=18'} + + yup@1.6.1: + resolution: {integrity: sha512-JED8pB50qbA4FOkDol0bYF/p60qSEDQqBD0/qeIrUCG1KbPBIQ776fCUNb9ldbPcSTxA69g/47XTo4TqWiuXOA==} + + zimmerframe@1.1.2: + resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + + zod-to-json-schema@3.24.5: + resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} + peerDependencies: + zod: ^3.24.1 + + zod@3.24.3: + resolution: {integrity: sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@anthropic-ai/sdk@0.39.0': + dependencies: + '@types/node': 18.19.86 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + '@ark/schema@0.46.0': + dependencies: + '@ark/util': 0.46.0 + optional: true + + '@ark/util@0.46.0': + optional: true + + '@asamuzakjp/css-color@3.1.2': + dependencies: + '@csstools/css-calc': 2.1.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/css-color-parser': 3.0.8(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + lru-cache: 10.4.3 + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/parser@7.27.0': + dependencies: + '@babel/types': 7.27.0 + + '@babel/runtime@7.27.0': + dependencies: + regenerator-runtime: 0.14.1 + optional: true + + '@babel/types@7.27.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@biomejs/js-api@0.7.1(@biomejs/wasm-nodejs@1.9.4)': + optionalDependencies: + '@biomejs/wasm-nodejs': 1.9.4 + + '@biomejs/wasm-nodejs@1.9.4': {} + + '@clack/core@0.4.2': + dependencies: + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@clack/prompts@0.10.1': + dependencies: + '@clack/core': 0.4.2 + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@csstools/color-helpers@5.0.2': {} + + '@csstools/css-calc@2.1.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + + '@csstools/css-color-parser@3.0.8(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/color-helpers': 5.0.2 + '@csstools/css-calc': 2.1.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + + '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/css-tokenizer': 3.0.3 + + '@csstools/css-tokenizer@3.0.3': {} + + '@emnapi/core@1.4.3': + dependencies: + '@emnapi/wasi-threads': 1.0.2 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.4.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.0.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.24.2': + optional: true + + '@esbuild/aix-ppc64@0.25.2': + optional: true + + '@esbuild/android-arm64@0.24.2': + optional: true + + '@esbuild/android-arm64@0.25.2': + optional: true + + '@esbuild/android-arm@0.24.2': + optional: true + + '@esbuild/android-arm@0.25.2': + optional: true + + '@esbuild/android-x64@0.24.2': + optional: true + + '@esbuild/android-x64@0.25.2': + optional: true + + '@esbuild/darwin-arm64@0.24.2': + optional: true + + '@esbuild/darwin-arm64@0.25.2': + optional: true + + '@esbuild/darwin-x64@0.24.2': + optional: true + + '@esbuild/darwin-x64@0.25.2': + optional: true + + '@esbuild/freebsd-arm64@0.24.2': + optional: true + + '@esbuild/freebsd-arm64@0.25.2': + optional: true + + '@esbuild/freebsd-x64@0.24.2': + optional: true + + '@esbuild/freebsd-x64@0.25.2': + optional: true + + '@esbuild/linux-arm64@0.24.2': + optional: true + + '@esbuild/linux-arm64@0.25.2': + optional: true + + '@esbuild/linux-arm@0.24.2': + optional: true + + '@esbuild/linux-arm@0.25.2': + optional: true + + '@esbuild/linux-ia32@0.24.2': + optional: true + + '@esbuild/linux-ia32@0.25.2': + optional: true + + '@esbuild/linux-loong64@0.24.2': + optional: true + + '@esbuild/linux-loong64@0.25.2': + optional: true + + '@esbuild/linux-mips64el@0.24.2': + optional: true + + '@esbuild/linux-mips64el@0.25.2': + optional: true + + '@esbuild/linux-ppc64@0.24.2': + optional: true + + '@esbuild/linux-ppc64@0.25.2': + optional: true + + '@esbuild/linux-riscv64@0.24.2': + optional: true + + '@esbuild/linux-riscv64@0.25.2': + optional: true + + '@esbuild/linux-s390x@0.24.2': + optional: true + + '@esbuild/linux-s390x@0.25.2': + optional: true + + '@esbuild/linux-x64@0.24.2': + optional: true + + '@esbuild/linux-x64@0.25.2': + optional: true + + '@esbuild/netbsd-arm64@0.24.2': + optional: true + + '@esbuild/netbsd-arm64@0.25.2': + optional: true + + '@esbuild/netbsd-x64@0.24.2': + optional: true + + '@esbuild/netbsd-x64@0.25.2': + optional: true + + '@esbuild/openbsd-arm64@0.24.2': + optional: true + + '@esbuild/openbsd-arm64@0.25.2': + optional: true + + '@esbuild/openbsd-x64@0.24.2': + optional: true + + '@esbuild/openbsd-x64@0.25.2': + optional: true + + '@esbuild/sunos-x64@0.24.2': + optional: true + + '@esbuild/sunos-x64@0.25.2': + optional: true + + '@esbuild/win32-arm64@0.24.2': + optional: true + + '@esbuild/win32-arm64@0.25.2': + optional: true + + '@esbuild/win32-ia32@0.24.2': + optional: true + + '@esbuild/win32-ia32@0.25.2': + optional: true + + '@esbuild/win32-x64@0.24.2': + optional: true + + '@esbuild/win32-x64@0.25.2': + optional: true + + '@eslint-community/eslint-utils@4.6.1(eslint@9.24.0(jiti@1.21.7))': + dependencies: + eslint: 9.24.0(jiti@1.21.7) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/compat@1.2.8(eslint@9.24.0(jiti@1.21.7))': + optionalDependencies: + eslint: 9.24.0(jiti@1.21.7) + + '@eslint/config-array@0.20.0': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.2.1': {} + + '@eslint/core@0.12.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.13.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.24.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.2.8': + dependencies: + '@eslint/core': 0.13.0 + levn: 0.4.1 + + '@exodus/schemasafe@1.3.0': + optional: true + + '@floating-ui/core@1.6.9': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.6.13': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/utils@0.2.9': {} + + '@fontsource-variable/jetbrains-mono@5.2.5': {} + + '@fontsource-variable/oxanium@5.2.5': {} + + '@gcornut/valibot-json-schema@0.31.0': + dependencies: + valibot: 0.31.1 + optionalDependencies: + '@types/json-schema': 7.0.15 + esbuild: 0.25.2 + esbuild-runner: 2.2.2(esbuild@0.25.2) + optional: true + + '@hapi/hoek@9.3.0': + optional: true + + '@hapi/topo@5.1.0': + dependencies: + '@hapi/hoek': 9.3.0 + optional: true + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.2': {} + + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.4.3 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + + '@internationalized/date@3.8.0': + dependencies: + '@swc/helpers': 0.5.17 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@lucide/svelte@0.486.0(svelte@5.27.0)': + dependencies: + svelte: 5.27.0 + + '@lukulent/svelte-umami@0.0.4(svelte@5.27.0)': + dependencies: + esm-env: 1.2.2 + svelte: 5.27.0 + + '@mapbox/node-pre-gyp@2.0.0': + dependencies: + consola: 3.4.2 + detect-libc: 2.0.3 + https-proxy-agent: 7.0.6 + node-fetch: 2.7.0 + nopt: 8.1.0 + semver: 7.7.1 + tar: 7.4.3 + transitivePeerDependencies: + - encoding + - supports-color + + '@mdx-js/mdx@3.1.0(acorn@8.14.1)': + dependencies: + '@types/estree': 1.0.7 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.6 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.0(acorn@8.14.1) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + source-map: 0.7.4 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - acorn + - supports-color + + '@napi-rs/wasm-runtime@0.2.9': + dependencies: + '@emnapi/core': 1.4.3 + '@emnapi/runtime': 1.4.3 + '@tybys/wasm-util': 0.9.0 + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@octokit/app@15.1.6': + dependencies: + '@octokit/auth-app': 7.2.1 + '@octokit/auth-unauthenticated': 6.1.3 + '@octokit/core': 6.1.5 + '@octokit/oauth-app': 7.1.6 + '@octokit/plugin-paginate-rest': 12.0.0(@octokit/core@6.1.5) + '@octokit/types': 14.0.0 + '@octokit/webhooks': 13.8.0 + + '@octokit/auth-app@7.2.1': + dependencies: + '@octokit/auth-oauth-app': 8.1.4 + '@octokit/auth-oauth-user': 5.1.4 + '@octokit/request': 9.2.3 + '@octokit/request-error': 6.1.8 + '@octokit/types': 14.0.0 + toad-cache: 3.7.0 + universal-github-app-jwt: 2.2.2 + universal-user-agent: 7.0.2 + + '@octokit/auth-oauth-app@8.1.4': + dependencies: + '@octokit/auth-oauth-device': 7.1.5 + '@octokit/auth-oauth-user': 5.1.4 + '@octokit/request': 9.2.3 + '@octokit/types': 14.0.0 + universal-user-agent: 7.0.2 + + '@octokit/auth-oauth-device@7.1.5': + dependencies: + '@octokit/oauth-methods': 5.1.5 + '@octokit/request': 9.2.3 + '@octokit/types': 14.0.0 + universal-user-agent: 7.0.2 + + '@octokit/auth-oauth-user@5.1.4': + dependencies: + '@octokit/auth-oauth-device': 7.1.5 + '@octokit/oauth-methods': 5.1.5 + '@octokit/request': 9.2.3 + '@octokit/types': 14.0.0 + universal-user-agent: 7.0.2 + + '@octokit/auth-token@5.1.2': {} + + '@octokit/auth-unauthenticated@6.1.3': + dependencies: + '@octokit/request-error': 6.1.8 + '@octokit/types': 14.0.0 + + '@octokit/core@6.1.5': + dependencies: + '@octokit/auth-token': 5.1.2 + '@octokit/graphql': 8.2.2 + '@octokit/request': 9.2.3 + '@octokit/request-error': 6.1.8 + '@octokit/types': 14.0.0 + before-after-hook: 3.0.2 + universal-user-agent: 7.0.2 + + '@octokit/endpoint@10.1.4': + dependencies: + '@octokit/types': 14.0.0 + universal-user-agent: 7.0.2 + + '@octokit/graphql@8.2.2': + dependencies: + '@octokit/request': 9.2.3 + '@octokit/types': 14.0.0 + universal-user-agent: 7.0.2 + + '@octokit/oauth-app@7.1.6': + dependencies: + '@octokit/auth-oauth-app': 8.1.4 + '@octokit/auth-oauth-user': 5.1.4 + '@octokit/auth-unauthenticated': 6.1.3 + '@octokit/core': 6.1.5 + '@octokit/oauth-authorization-url': 7.1.1 + '@octokit/oauth-methods': 5.1.5 + '@types/aws-lambda': 8.10.149 + universal-user-agent: 7.0.2 + + '@octokit/oauth-authorization-url@7.1.1': {} + + '@octokit/oauth-methods@5.1.5': + dependencies: + '@octokit/oauth-authorization-url': 7.1.1 + '@octokit/request': 9.2.3 + '@octokit/request-error': 6.1.8 + '@octokit/types': 14.0.0 + + '@octokit/openapi-types@25.0.0': {} + + '@octokit/openapi-webhooks-types@10.4.0': {} + + '@octokit/plugin-paginate-graphql@5.2.4(@octokit/core@6.1.5)': + dependencies: + '@octokit/core': 6.1.5 + + '@octokit/plugin-paginate-rest@12.0.0(@octokit/core@6.1.5)': + dependencies: + '@octokit/core': 6.1.5 + '@octokit/types': 14.0.0 + + '@octokit/plugin-rest-endpoint-methods@14.0.0(@octokit/core@6.1.5)': + dependencies: + '@octokit/core': 6.1.5 + '@octokit/types': 14.0.0 + + '@octokit/plugin-retry@7.2.1(@octokit/core@6.1.5)': + dependencies: + '@octokit/core': 6.1.5 + '@octokit/request-error': 6.1.8 + '@octokit/types': 14.0.0 + bottleneck: 2.19.5 + + '@octokit/plugin-throttling@10.0.0(@octokit/core@6.1.5)': + dependencies: + '@octokit/core': 6.1.5 + '@octokit/types': 14.0.0 + bottleneck: 2.19.5 + + '@octokit/request-error@6.1.8': + dependencies: + '@octokit/types': 14.0.0 + + '@octokit/request@9.2.3': + dependencies: + '@octokit/endpoint': 10.1.4 + '@octokit/request-error': 6.1.8 + '@octokit/types': 14.0.0 + fast-content-type-parse: 2.0.1 + universal-user-agent: 7.0.2 + + '@octokit/types@14.0.0': + dependencies: + '@octokit/openapi-types': 25.0.0 + + '@octokit/webhooks-methods@5.1.1': {} + + '@octokit/webhooks@13.8.0': + dependencies: + '@octokit/openapi-webhooks-types': 10.4.0 + '@octokit/request-error': 6.1.8 + '@octokit/webhooks-methods': 5.1.1 + + '@oxc-parser/binding-darwin-arm64@0.63.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.63.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.63.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.63.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.63.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.63.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.63.0': + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.63.0': + dependencies: + '@napi-rs/wasm-runtime': 0.2.9 + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.63.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.63.0': + optional: true + + '@oxc-project/types@0.63.0': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@polka/url@1.0.0-next.29': {} + + '@poppinss/macroable@1.0.4': + optional: true + + '@rollup/pluginutils@5.1.4(rollup@4.40.0)': + dependencies: + '@types/estree': 1.0.7 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.40.0 + + '@rollup/rollup-android-arm-eabi@4.40.0': + optional: true + + '@rollup/rollup-android-arm64@4.40.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.40.0': + optional: true + + '@rollup/rollup-darwin-x64@4.40.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.40.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.40.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.40.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.40.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.40.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.40.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.40.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.40.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.40.0': + optional: true + + '@sec-ant/readable-stream@0.4.1': {} + + '@shikijs/core@3.2.2': + dependencies: + '@shikijs/types': 3.2.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.2.2': + dependencies: + '@shikijs/types': 3.2.2 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.2.0 + + '@shikijs/engine-oniguruma@3.2.2': + dependencies: + '@shikijs/types': 3.2.2 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.2.2': + dependencies: + '@shikijs/types': 3.2.2 + + '@shikijs/markdown-it@3.2.2': + dependencies: + markdown-it: 14.1.0 + shiki: 3.2.2 + + '@shikijs/themes@3.2.2': + dependencies: + '@shikijs/types': 3.2.2 + + '@shikijs/types@3.2.2': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@sideway/address@4.1.5': + dependencies: + '@hapi/hoek': 9.3.0 + optional: true + + '@sideway/formula@3.0.1': + optional: true + + '@sideway/pinpoint@2.0.0': + optional: true + + '@sinclair/typebox@0.34.33': + optional: true + + '@sindresorhus/merge-streams@4.0.0': {} + + '@standard-schema/spec@1.0.0': + optional: true + + '@sveltejs/acorn-typescript@1.0.5(acorn@8.14.1)': + dependencies: + acorn: 8.14.1 + + '@sveltejs/adapter-vercel@5.7.0(@sveltejs/kit@2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(rollup@4.40.0)': + dependencies: + '@sveltejs/kit': 2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)) + '@vercel/nft': 0.29.2(rollup@4.40.0) + esbuild: 0.24.2 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@sveltejs/kit@2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1))': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)) + '@types/cookie': 0.6.0 + cookie: 0.6.0 + devalue: 5.1.1 + esm-env: 1.2.2 + import-meta-resolve: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.17 + mrmime: 2.0.1 + sade: 1.8.1 + set-cookie-parser: 2.7.1 + sirv: 3.0.1 + svelte: 5.27.0 + vite: 6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1) + + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1))': + dependencies: + '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)) + debug: 4.4.0 + svelte: 5.27.0 + vite: 6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1))': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)) + debug: 4.4.0 + svelte: 5.27.0 + vite: 6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)) + debug: 4.4.0 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.17 + svelte: 5.27.0 + svelte-hmr: 0.16.0(svelte@5.27.0) + vite: 6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1) + vitefu: 0.2.5(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)) + debug: 4.4.0 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.17 + svelte: 5.27.0 + vite: 6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1) + vitefu: 1.0.6(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)) + transitivePeerDependencies: + - supports-color + + '@swc/helpers@0.5.17': + dependencies: + tslib: 2.8.1 + + '@tybys/wasm-util@0.9.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/aws-lambda@8.10.149': {} + + '@types/cookie@0.6.0': {} + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.7 + + '@types/estree@1.0.7': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/json-schema@7.0.15': {} + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdurl@2.0.0': {} + + '@types/mdx@2.0.13': {} + + '@types/ms@2.1.0': {} + + '@types/node-fetch@2.6.12': + dependencies: + '@types/node': 18.19.86 + form-data: 4.0.2 + + '@types/node@18.19.86': + dependencies: + undici-types: 5.26.5 + + '@types/trusted-types@2.0.7': + optional: true + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/validator@13.15.0': + optional: true + + '@typeschema/class-validator@0.3.0(@types/json-schema@7.0.15)(class-validator@0.14.1)': + dependencies: + '@typeschema/core': 0.14.0(@types/json-schema@7.0.15) + optionalDependencies: + class-validator: 0.14.1 + transitivePeerDependencies: + - '@types/json-schema' + optional: true + + '@typeschema/core@0.14.0(@types/json-schema@7.0.15)': + optionalDependencies: + '@types/json-schema': 7.0.15 + optional: true + + '@typescript-eslint/eslint-plugin@8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.24.0(jiti@1.21.7))(typescript@5.8.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.30.1(eslint@9.24.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/type-utils': 8.30.1(eslint@9.24.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.30.1 + eslint: 9.24.0(jiti@1.21.7) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@1.21.7))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.30.1 + debug: 4.4.0 + eslint: 9.24.0(jiti@1.21.7) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.30.1': + dependencies: + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/visitor-keys': 8.30.1 + + '@typescript-eslint/type-utils@8.30.1(eslint@9.24.0(jiti@1.21.7))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@1.21.7))(typescript@5.8.3) + debug: 4.4.0 + eslint: 9.24.0(jiti@1.21.7) + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.30.1': {} + + '@typescript-eslint/typescript-estree@8.30.1(typescript@5.8.3)': + dependencies: + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/visitor-keys': 8.30.1 + debug: 4.4.0 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.30.1(eslint@9.24.0(jiti@1.21.7))(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.6.1(eslint@9.24.0(jiti@1.21.7)) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) + eslint: 9.24.0(jiti@1.21.7) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.30.1': + dependencies: + '@typescript-eslint/types': 8.30.1 + eslint-visitor-keys: 4.2.0 + + '@ungap/structured-clone@1.3.0': {} + + '@upstash/redis@1.34.8': + dependencies: + crypto-js: 4.2.0 + + '@vercel/nft@0.29.2(rollup@4.40.0)': + dependencies: + '@mapbox/node-pre-gyp': 2.0.0 + '@rollup/pluginutils': 5.1.4(rollup@4.40.0) + acorn: 8.14.1 + acorn-import-attributes: 1.9.5(acorn@8.14.1) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 10.4.5 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.2 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vinejs/compiler@3.0.0': + optional: true + + '@vinejs/vine@3.0.1': + dependencies: + '@poppinss/macroable': 1.0.4 + '@types/validator': 13.15.0 + '@vinejs/compiler': 3.0.0 + camelcase: 8.0.0 + dayjs: 1.11.13 + dlv: 1.1.3 + normalize-url: 8.0.1 + validator: 13.15.0 + optional: true + + '@vue/compiler-core@3.5.13': + dependencies: + '@babel/parser': 7.27.0 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.13': + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-sfc@3.5.13': + dependencies: + '@babel/parser': 7.27.0 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.5.3 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.13': + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/reactivity@3.5.13': + dependencies: + '@vue/shared': 3.5.13 + + '@vue/runtime-core@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/runtime-dom@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/runtime-core': 3.5.13 + '@vue/shared': 3.5.13 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.8.3))': + dependencies: + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + vue: 3.5.13(typescript@5.8.3) + + '@vue/shared@3.5.13': {} + + abbrev@3.0.1: {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn-import-attributes@1.9.5(acorn@8.14.1): + dependencies: + acorn: 8.14.1 + + acorn-jsx@5.3.2(acorn@8.14.1): + dependencies: + acorn: 8.14.1 + + acorn@8.14.1: {} + + agent-base@7.1.3: {} + + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + anafanafo@2.0.0: + dependencies: + char-width-table-consumer: 1.0.0 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + arktype@2.1.20: + dependencies: + '@ark/schema': 0.46.0 + '@ark/util': 0.46.0 + optional: true + + astring@1.9.0: {} + + async-sema@3.1.1: {} + + asynckit@0.4.0: {} + + atomically@2.0.3: + dependencies: + stubborn-fs: 1.2.5 + when-exit: 2.1.4 + + autoprefixer@10.4.21(postcss@8.5.3): + dependencies: + browserslist: 4.24.4 + caniuse-lite: 1.0.30001714 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-value-parser: 4.2.0 + + axobject-query@4.1.0: {} + + badge-maker@4.1.0: + dependencies: + anafanafo: 2.0.0 + css-color-converter: 2.0.0 + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + before-after-hook@3.0.2: {} + + binary-extensions@2.3.0: {} + + binary-search@1.3.6: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + bits-ui@1.3.15(svelte@5.27.0): + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/dom': 1.6.13 + '@internationalized/date': 3.8.0 + esm-env: 1.2.2 + runed: 0.23.4(svelte@5.27.0) + svelte: 5.27.0 + svelte-toolbelt: 0.7.1(svelte@5.27.0) + tabbable: 6.2.0 + + bottleneck@2.19.5: {} + + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.4.1 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.40.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.0 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001714 + electron-to-chromium: 1.5.137 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.4) + + buffer-from@1.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + camelcase@8.0.0: {} + + caniuse-lite@1.0.30001714: {} + + ccount@2.0.1: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.4.1: {} + + char-width-table-consumer@1.0.0: + dependencies: + binary-search: 1.3.6 + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chownr@3.0.0: {} + + class-validator@0.14.1: + dependencies: + '@types/validator': 13.15.0 + libphonenumber-js: 1.12.6 + validator: 13.15.0 + optional: true + + cli-boxes@3.0.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.1.1: {} + + collapse-white-space@2.1.0: {} + + color-convert@0.5.3: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + commander@13.1.0: {} + + commander@2.20.3: {} + + commander@4.1.1: {} + + concat-map@0.0.1: {} + + concurrently@9.1.2: + dependencies: + chalk: 4.1.2 + lodash: 4.17.21 + rxjs: 7.8.2 + shell-quote: 1.8.2 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + + conf@13.1.0: + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + atomically: 2.0.3 + debounce-fn: 6.0.0 + dot-prop: 9.0.0 + env-paths: 3.0.0 + json-schema-typed: 8.0.1 + semver: 7.7.1 + uint8array-extras: 1.4.0 + + consola@3.4.2: {} + + cookie@0.6.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-js@4.2.0: {} + + css-color-converter@2.0.0: + dependencies: + color-convert: 0.5.3 + color-name: 1.1.4 + css-unit-converter: 1.1.2 + + css-dependency@0.0.3: + dependencies: + ansi-regex: 6.1.0 + + css-unit-converter@1.1.2: {} + + cssesc@3.0.0: {} + + cssstyle@4.3.0: + dependencies: + '@asamuzakjp/css-color': 3.1.2 + rrweb-cssom: 0.8.0 + + csstype@3.1.3: {} + + data-uri-to-buffer@4.0.1: {} + + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + + dayjs@1.11.13: + optional: true + + debounce-fn@6.0.0: + dependencies: + mimic-function: 5.0.1 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decimal.js@10.5.0: {} + + decode-named-character-reference@1.1.0: + dependencies: + character-entities: 2.0.2 + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + delayed-stream@1.0.0: {} + + dequal@2.0.3: {} + + detect-libc@2.0.3: {} + + devalue@5.1.1: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + didyoumean@1.2.2: {} + + diff@7.0.0: {} + + dlv@1.1.3: {} + + dompurify@3.2.5: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + dot-prop@9.0.0: + dependencies: + type-fest: 4.40.0 + + drizzle-orm@0.41.0(postgres@3.4.5): + optionalDependencies: + postgres: 3.4.5 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + effect@3.14.10: + dependencies: + '@standard-schema/spec': 1.0.0 + fast-check: 3.23.2 + optional: true + + electron-to-chromium@1.5.137: {} + + emoji-regex-xs@1.0.0: {} + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + entities@4.5.0: {} + + env-paths@3.0.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.14.1 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.2 + + esbuild-runner@2.2.2(esbuild@0.25.2): + dependencies: + esbuild: 0.25.2 + source-map-support: 0.5.21 + tslib: 2.4.0 + optional: true + + esbuild@0.24.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 + + esbuild@0.25.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.2 + '@esbuild/android-arm': 0.25.2 + '@esbuild/android-arm64': 0.25.2 + '@esbuild/android-x64': 0.25.2 + '@esbuild/darwin-arm64': 0.25.2 + '@esbuild/darwin-x64': 0.25.2 + '@esbuild/freebsd-arm64': 0.25.2 + '@esbuild/freebsd-x64': 0.25.2 + '@esbuild/linux-arm': 0.25.2 + '@esbuild/linux-arm64': 0.25.2 + '@esbuild/linux-ia32': 0.25.2 + '@esbuild/linux-loong64': 0.25.2 + '@esbuild/linux-mips64el': 0.25.2 + '@esbuild/linux-ppc64': 0.25.2 + '@esbuild/linux-riscv64': 0.25.2 + '@esbuild/linux-s390x': 0.25.2 + '@esbuild/linux-x64': 0.25.2 + '@esbuild/netbsd-arm64': 0.25.2 + '@esbuild/netbsd-x64': 0.25.2 + '@esbuild/openbsd-arm64': 0.25.2 + '@esbuild/openbsd-x64': 0.25.2 + '@esbuild/sunos-x64': 0.25.2 + '@esbuild/win32-arm64': 0.25.2 + '@esbuild/win32-ia32': 0.25.2 + '@esbuild/win32-x64': 0.25.2 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-prettier@10.1.2(eslint@9.24.0(jiti@1.21.7)): + dependencies: + eslint: 9.24.0(jiti@1.21.7) + + eslint-plugin-svelte@3.5.1(eslint@9.24.0(jiti@1.21.7))(svelte@5.27.0): + dependencies: + '@eslint-community/eslint-utils': 4.6.1(eslint@9.24.0(jiti@1.21.7)) + '@jridgewell/sourcemap-codec': 1.5.0 + eslint: 9.24.0(jiti@1.21.7) + esutils: 2.0.3 + known-css-properties: 0.35.0 + postcss: 8.5.3 + postcss-load-config: 3.1.4(postcss@8.5.3) + postcss-safe-parser: 7.0.1(postcss@8.5.3) + semver: 7.7.1 + svelte-eslint-parser: 1.1.2(svelte@5.27.0) + optionalDependencies: + svelte: 5.27.0 + transitivePeerDependencies: + - ts-node + + eslint-scope@8.3.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@9.24.0(jiti@1.21.7): + dependencies: + '@eslint-community/eslint-utils': 4.6.1(eslint@9.24.0(jiti@1.21.7)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.20.0 + '@eslint/config-helpers': 0.2.1 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.24.0 + '@eslint/plugin-kit': 0.2.8 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.2 + '@types/estree': 1.0.7 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + eslint-scope: 8.3.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 1.21.7 + transitivePeerDependencies: + - supports-color + + esm-env@1.2.2: {} + + espree@10.3.0: + dependencies: + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + eslint-visitor-keys: 4.2.0 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrap@1.4.6: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.7 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.7 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.4 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.7 + + esutils@2.0.3: {} + + event-target-shim@5.0.1: {} + + execa@9.5.2: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.2.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.1 + + extend@3.0.2: {} + + fast-check@3.23.2: + dependencies: + pure-rand: 6.1.0 + optional: true + + fast-content-type-parse@2.0.1: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + file-uri-to-path@1.0.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + flexsearch@0.7.43: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data-encoder@1.7.2: {} + + form-data@4.0.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + + formdata-node@4.4.1: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + fraction.js@4.3.7: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.3.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + github-slugger@2.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + globals@14.0.0: {} + + globals@16.0.0: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.2.1 + vfile: 6.0.3 + vfile-message: 4.0.2 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.0.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-heading-rank@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.2.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.7 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.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.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.16 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.7 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.16 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + + html-void-elements@3.0.0: {} + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + human-signals@8.0.1: {} + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + ignore@7.0.3: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-meta-resolve@4.1.0: {} + + imurmurhash@0.1.4: {} + + inline-style-parser@0.2.4: {} + + is-absolute-url@4.0.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-arrayish@0.3.2: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-decimal@2.0.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-potential-custom-element-name@1.0.1: {} + + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.7 + + is-stream@4.0.1: {} + + is-unicode-supported@2.1.0: {} + + isexe@2.0.0: {} + + isomorphic-dompurify@2.23.0: + dependencies: + dompurify: 3.2.5 + jsdom: 26.1.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@1.21.7: {} + + joi@17.13.3: + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.5 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + optional: true + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsdom@26.1.0: + dependencies: + cssstyle: 4.3.0 + data-urls: 5.0.0 + decimal.js: 10.5.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.20 + parse5: 7.2.1 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.18.1 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + json-buffer@3.0.1: {} + + json-schema-to-ts@3.1.1: + dependencies: + '@babel/runtime': 7.27.0 + ts-algebra: 2.0.0 + optional: true + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema-typed@8.0.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + jsrepo@1.47.0(typescript@5.8.3)(ws@8.18.1)(zod@3.24.3): + dependencies: + '@anthropic-ai/sdk': 0.39.0 + '@biomejs/js-api': 0.7.1(@biomejs/wasm-nodejs@1.9.4) + '@biomejs/wasm-nodejs': 1.9.4 + '@clack/prompts': 0.10.1 + boxen: 8.0.1 + chalk: 5.4.1 + commander: 13.1.0 + conf: 13.1.0 + css-dependency: 0.0.3 + diff: 7.0.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + execa: 9.5.2 + get-tsconfig: 4.10.0 + ignore: 7.0.3 + is-unicode-supported: 2.1.0 + node-fetch: 3.3.2 + octokit: 4.1.3 + ollama: 0.5.15 + openai: 4.95.0(ws@8.18.1)(zod@3.24.3) + oxc-parser: 0.63.0 + package-manager-detector: 1.2.0 + parse5: 7.2.1 + pathe: 2.0.3 + prettier: 3.5.3 + prettier-plugin-svelte: 3.3.3(prettier@3.5.3)(svelte@5.27.0) + semver: 7.7.1 + sisteransi: 1.0.5 + svelte: 5.27.0 + valibot: 1.0.0(typescript@5.8.3) + validate-npm-package-name: 6.0.0 + vue: 3.5.13(typescript@5.8.3) + transitivePeerDependencies: + - '@biomejs/wasm-bundler' + - '@biomejs/wasm-web' + - encoding + - typescript + - ws + - zod + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kleur@4.1.5: {} + + known-css-properties@0.35.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + libphonenumber-js@1.12.6: + optional: true + + lilconfig@2.1.0: {} + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + locate-character@3.0.0: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + longest-streak@3.1.0: {} + + lru-cache@10.4.3: {} + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + markdown-extensions@2.0.0: {} + + markdown-it-table@4.1.1: {} + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + markdown-table@3.0.4: {} + + math-intrinsics@1.1.0: {} + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.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.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdsx@0.0.6(svelte@5.27.0): + dependencies: + esrap: 1.4.6 + hast-util-to-html: 9.0.5 + magic-string: 0.30.17 + mdast-util-to-markdown: 2.1.2 + rehype-stringify: 10.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + svelte: 5.27.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + yaml: 2.7.1 + zimmerframe: 1.1.2 + transitivePeerDependencies: + - supports-color + + mdurl@2.0.0: {} + + memoize-weak@1.0.2: {} + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-expression@3.0.1: + dependencies: + '@types/estree': 1.0.7 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-jsx@3.0.2: + dependencies: + '@types/estree': 1.0.7 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.2 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.7 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-mdx-expression@2.0.3: + dependencies: + '@types/estree': 1.0.7 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.3: + dependencies: + '@types/estree': 1.0.7 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.2 + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.0 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-function@5.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + minizlib@3.0.2: + dependencies: + minipass: 7.1.2 + + mkdirp@3.0.1: {} + + mode-watcher@0.5.1(svelte@5.27.0): + dependencies: + svelte: 5.27.0 + + mri@1.2.0: {} + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.11: {} + + natural-compare@1.4.0: {} + + node-domexception@1.0.0: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-gyp-build@4.8.4: {} + + node-releases@2.0.19: {} + + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + normalize-url@8.0.1: + optional: true + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + + nwsapi@2.2.20: {} + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + octokit@4.1.3: + dependencies: + '@octokit/app': 15.1.6 + '@octokit/core': 6.1.5 + '@octokit/oauth-app': 7.1.6 + '@octokit/plugin-paginate-graphql': 5.2.4(@octokit/core@6.1.5) + '@octokit/plugin-paginate-rest': 12.0.0(@octokit/core@6.1.5) + '@octokit/plugin-rest-endpoint-methods': 14.0.0(@octokit/core@6.1.5) + '@octokit/plugin-retry': 7.2.1(@octokit/core@6.1.5) + '@octokit/plugin-throttling': 10.0.0(@octokit/core@6.1.5) + '@octokit/request-error': 6.1.8 + '@octokit/types': 14.0.0 + + ollama@0.5.15: + dependencies: + whatwg-fetch: 3.6.20 + + oniguruma-parser@0.11.2: {} + + oniguruma-to-es@4.2.0: + dependencies: + emoji-regex-xs: 1.0.0 + oniguruma-parser: 0.11.2 + regex: 6.0.1 + regex-recursion: 6.0.2 + + openai@4.95.0(ws@8.18.1)(zod@3.24.3): + dependencies: + '@types/node': 18.19.86 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + optionalDependencies: + ws: 8.18.1 + zod: 3.24.3 + transitivePeerDependencies: + - encoding + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + oxc-parser@0.63.0: + dependencies: + '@oxc-project/types': 0.63.0 + optionalDependencies: + '@oxc-parser/binding-darwin-arm64': 0.63.0 + '@oxc-parser/binding-darwin-x64': 0.63.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.63.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.63.0 + '@oxc-parser/binding-linux-arm64-musl': 0.63.0 + '@oxc-parser/binding-linux-x64-gnu': 0.63.0 + '@oxc-parser/binding-linux-x64-musl': 0.63.0 + '@oxc-parser/binding-wasm32-wasi': 0.63.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.63.0 + '@oxc-parser/binding-win32-x64-msvc': 0.63.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.1: {} + + package-manager-detector@1.2.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.1.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-ms@4.0.0: {} + + parse-numeric-range@1.3.0: {} + + parse5@7.2.1: + dependencies: + entities: 4.5.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pify@2.3.0: {} + + pirates@4.0.7: {} + + postcss-import@15.1.0(postcss@8.5.3): + dependencies: + postcss: 8.5.3 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-js@4.0.1(postcss@8.5.3): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.3 + + postcss-load-config@3.1.4(postcss@8.5.3): + dependencies: + lilconfig: 2.1.0 + yaml: 1.10.2 + optionalDependencies: + postcss: 8.5.3 + + postcss-load-config@4.0.2(postcss@8.5.3): + dependencies: + lilconfig: 3.1.3 + yaml: 2.7.1 + optionalDependencies: + postcss: 8.5.3 + + postcss-nested@6.2.0(postcss@8.5.3): + dependencies: + postcss: 8.5.3 + postcss-selector-parser: 6.1.2 + + postcss-safe-parser@7.0.1(postcss@8.5.3): + dependencies: + postcss: 8.5.3 + + postcss-scss@4.0.9(postcss@8.5.3): + dependencies: + postcss: 8.5.3 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.3: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postgres@3.4.5: {} + + prelude-ls@1.2.1: {} + + prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.27.0): + dependencies: + prettier: 3.5.3 + svelte: 5.27.0 + + prettier-plugin-tailwindcss@0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.27.0))(prettier@3.5.3): + dependencies: + prettier: 3.5.3 + optionalDependencies: + prettier-plugin-svelte: 3.3.3(prettier@3.5.3)(svelte@5.27.0) + + prettier@3.5.3: {} + + pretty-ms@9.2.0: + dependencies: + parse-ms: 4.0.0 + + property-expr@2.0.6: + optional: true + + property-information@6.5.0: {} + + property-information@7.0.0: {} + + punycode.js@2.3.1: {} + + punycode@2.3.1: {} + + pure-rand@6.1.0: + optional: true + + queue-microtask@1.2.3: {} + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.1.2: {} + + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.7 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.0(acorn@8.14.1): + dependencies: + acorn-jsx: 5.3.2(acorn@8.14.1) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - acorn + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.7 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.7 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + regenerator-runtime@0.14.1: + optional: true + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.0.1: + dependencies: + regex-utilities: 2.3.0 + + rehype-autolink-headings@7.1.0: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + hast-util-heading-rank: 3.0.0 + hast-util-is-element: 3.0.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + rehype-external-links@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + hast-util-is-element: 3.0.0 + is-absolute-url: 4.0.1 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-pretty-code@0.14.1(shiki@3.2.2): + dependencies: + '@types/hast': 3.0.4 + hast-util-to-string: 3.0.1 + parse-numeric-range: 1.3.0 + rehype-parse: 9.0.1 + shiki: 3.2.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.7 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color + + rehype-slug@6.0.0: + dependencies: + '@types/hast': 3.0.4 + github-slugger: 2.0.0 + hast-util-heading-rank: 3.0.0 + hast-util-to-string: 3.0.1 + unist-util-visit: 5.0.0 + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.1.0: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + remove-markdown@0.6.0: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + rollup@4.40.0: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.40.0 + '@rollup/rollup-android-arm64': 4.40.0 + '@rollup/rollup-darwin-arm64': 4.40.0 + '@rollup/rollup-darwin-x64': 4.40.0 + '@rollup/rollup-freebsd-arm64': 4.40.0 + '@rollup/rollup-freebsd-x64': 4.40.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 + '@rollup/rollup-linux-arm-musleabihf': 4.40.0 + '@rollup/rollup-linux-arm64-gnu': 4.40.0 + '@rollup/rollup-linux-arm64-musl': 4.40.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 + '@rollup/rollup-linux-riscv64-gnu': 4.40.0 + '@rollup/rollup-linux-riscv64-musl': 4.40.0 + '@rollup/rollup-linux-s390x-gnu': 4.40.0 + '@rollup/rollup-linux-x64-gnu': 4.40.0 + '@rollup/rollup-linux-x64-musl': 4.40.0 + '@rollup/rollup-win32-arm64-msvc': 4.40.0 + '@rollup/rollup-win32-ia32-msvc': 4.40.0 + '@rollup/rollup-win32-x64-msvc': 4.40.0 + fsevents: 2.3.3 + + rrweb-cssom@0.8.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + runed@0.23.4(svelte@5.27.0): + dependencies: + esm-env: 1.2.2 + svelte: 5.27.0 + + runed@0.25.0(svelte@5.27.0): + dependencies: + esm-env: 1.2.2 + svelte: 5.27.0 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safer-buffer@2.1.2: {} + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + semver@7.7.1: {} + + set-cookie-parser@2.7.1: {} + + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.7.1 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.2: {} + + shiki@3.2.2: + dependencies: + '@shikijs/core': 3.2.2 + '@shikijs/engine-javascript': 3.2.2 + '@shikijs/engine-oniguruma': 3.2.2 + '@shikijs/langs': 3.2.2 + '@shikijs/themes': 3.2.2 + '@shikijs/types': 3.2.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + signal-exit@4.1.0: {} + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + sirv@3.0.1: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + sisteransi@1.0.5: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + space-separated-tokens@2.0.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-final-newline@4.0.0: {} + + strip-json-comments@3.1.1: {} + + stubborn-fs@1.2.5: {} + + style-to-js@1.1.16: + dependencies: + style-to-object: 1.0.8 + + style-to-object@1.0.8: + dependencies: + inline-style-parser: 0.2.4 + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + ts-interface-checker: 0.1.13 + + superstruct@2.0.2: + optional: true + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svelte-check@4.1.6(picomatch@4.0.2)(svelte@5.27.0)(typescript@5.8.3): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + chokidar: 4.0.3 + fdir: 6.4.3(picomatch@4.0.2) + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.27.0 + typescript: 5.8.3 + transitivePeerDependencies: + - picomatch + + svelte-eslint-parser@1.1.2(svelte@5.27.0): + dependencies: + eslint-scope: 8.3.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + postcss: 8.5.3 + postcss-scss: 4.0.9(postcss@8.5.3) + postcss-selector-parser: 7.1.0 + optionalDependencies: + svelte: 5.27.0 + + svelte-hmr@0.16.0(svelte@5.27.0): + dependencies: + svelte: 5.27.0 + + svelte-toolbelt@0.7.1(svelte@5.27.0): + dependencies: + clsx: 2.1.1 + runed: 0.23.4(svelte@5.27.0) + style-to-object: 1.0.8 + svelte: 5.27.0 + + svelte@5.27.0: + dependencies: + '@ampproject/remapping': 2.3.0 + '@jridgewell/sourcemap-codec': 1.5.0 + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1) + '@types/estree': 1.0.7 + acorn: 8.14.1 + aria-query: 5.3.2 + axobject-query: 4.1.0 + clsx: 2.1.1 + esm-env: 1.2.2 + esrap: 1.4.6 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.17 + zimmerframe: 1.1.2 + + sveltekit-search-params@3.0.0(@sveltejs/kit@2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)): + dependencies: + '@sveltejs/kit': 2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)) + '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)) + svelte: 5.27.0 + transitivePeerDependencies: + - supports-color + - vite + + sveltekit-superforms@2.24.1(@sveltejs/kit@2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(@types/json-schema@7.0.15)(svelte@5.27.0)(typescript@5.8.3): + dependencies: + '@sveltejs/kit': 2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)))(svelte@5.27.0)(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)) + devalue: 5.1.1 + memoize-weak: 1.0.2 + svelte: 5.27.0 + ts-deepmerge: 7.0.2 + optionalDependencies: + '@exodus/schemasafe': 1.3.0 + '@gcornut/valibot-json-schema': 0.31.0 + '@sinclair/typebox': 0.34.33 + '@typeschema/class-validator': 0.3.0(@types/json-schema@7.0.15)(class-validator@0.14.1) + '@vinejs/vine': 3.0.1 + arktype: 2.1.20 + class-validator: 0.14.1 + effect: 3.14.10 + joi: 17.13.3 + json-schema-to-ts: 3.1.1 + superstruct: 2.0.2 + valibot: 1.0.0-rc.3(typescript@5.8.3) + yup: 1.6.1 + zod: 3.24.3 + zod-to-json-schema: 3.24.5(zod@3.24.3) + transitivePeerDependencies: + - '@types/json-schema' + - typescript + + symbol-tree@3.2.4: {} + + tabbable@6.2.0: {} + + tailwind-merge@2.5.4: {} + + tailwind-merge@2.6.0: {} + + tailwind-variants@0.3.1(tailwindcss@3.4.17): + dependencies: + tailwind-merge: 2.5.4 + tailwindcss: 3.4.17 + + tailwindcss-animate@1.0.7(tailwindcss@3.4.17): + dependencies: + tailwindcss: 3.4.17 + + tailwindcss@3.4.17: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3) + postcss-nested: 6.2.0(postcss@8.5.3) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.2 + mkdirp: 3.0.1 + yallist: 5.0.0 + + terser@5.39.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.1 + commander: 2.20.3 + source-map-support: 0.5.21 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tiny-case@1.0.3: + optional: true + + tinyglobby@0.2.12: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + + tldts-core@6.1.86: {} + + tldts@6.1.86: + dependencies: + tldts-core: 6.1.86 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toad-cache@3.7.0: {} + + toposort@2.0.2: + optional: true + + totalist@3.0.1: {} + + tough-cookie@5.1.2: + dependencies: + tldts: 6.1.86 + + tr46@0.0.3: {} + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + ts-algebra@2.0.0: + optional: true + + ts-api-utils@2.1.0(typescript@5.8.3): + dependencies: + typescript: 5.8.3 + + ts-deepmerge@7.0.2: {} + + ts-interface-checker@0.1.13: {} + + tslib@2.4.0: + optional: true + + tslib@2.8.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@2.19.0: + optional: true + + type-fest@4.40.0: {} + + typescript-eslint@8.30.1(eslint@9.24.0(jiti@1.21.7))(typescript@5.8.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.24.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/parser': 8.30.1(eslint@9.24.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@1.21.7))(typescript@5.8.3) + eslint: 9.24.0(jiti@1.21.7) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + typescript@5.8.3: {} + + uc.micro@2.1.0: {} + + uint8array-extras@1.4.0: {} + + undici-types@5.26.5: {} + + unicorn-magic@0.3.0: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universal-github-app-jwt@2.2.2: {} + + universal-user-agent@7.0.2: {} + + update-browserslist-db@1.1.3(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + valibot@0.31.1: + optional: true + + valibot@1.0.0(typescript@5.8.3): + optionalDependencies: + typescript: 5.8.3 + + valibot@1.0.0-rc.3(typescript@5.8.3): + optionalDependencies: + typescript: 5.8.3 + optional: true + + validate-npm-package-name@6.0.0: {} + + validator@13.15.0: + optional: true + + velite@0.2.2(acorn@8.14.1): + dependencies: + '@mdx-js/mdx': 3.1.0(acorn@8.14.1) + esbuild: 0.24.2 + sharp: 0.33.5 + terser: 5.39.0 + transitivePeerDependencies: + - acorn + - supports-color + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + + vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1): + dependencies: + esbuild: 0.25.2 + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.3 + rollup: 4.40.0 + tinyglobby: 0.2.12 + optionalDependencies: + '@types/node': 18.19.86 + fsevents: 2.3.3 + jiti: 1.21.7 + terser: 5.39.0 + yaml: 2.7.1 + + vitefu@0.2.5(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)): + optionalDependencies: + vite: 6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1) + + vitefu@1.0.6(vite@6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1)): + optionalDependencies: + vite: 6.3.1(@types/node@18.19.86)(jiti@1.21.7)(terser@5.39.0)(yaml@2.7.1) + + vue@3.5.13(typescript@5.8.3): + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-sfc': 3.5.13 + '@vue/runtime-dom': 3.5.13 + '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.8.3)) + '@vue/shared': 3.5.13 + optionalDependencies: + typescript: 5.8.3 + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + web-namespaces@2.0.1: {} + + web-streams-polyfill@3.3.3: {} + + web-streams-polyfill@4.0.0-beta.3: {} + + webidl-conversions@3.0.1: {} + + webidl-conversions@7.0.0: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-fetch@3.6.20: {} + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + when-exit@2.1.4: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + ws@8.18.1: {} + + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + + y18n@5.0.8: {} + + yallist@5.0.0: {} + + yaml@1.10.2: {} + + yaml@2.7.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + yoctocolors@2.1.1: {} + + yup@1.6.1: + dependencies: + property-expr: 2.0.6 + tiny-case: 1.0.3 + toposort: 2.0.2 + type-fest: 2.19.0 + optional: true + + zimmerframe@1.1.2: {} + + zod-to-json-schema@3.24.5(zod@3.24.3): + dependencies: + zod: 3.24.3 + optional: true + + zod@3.24.3: + optional: true + + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..d0b7dbe --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +onlyBuiltDependencies: + - esbuild + - sharp diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..0f77216 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +}; diff --git a/src/app.css b/src/app.css new file mode 100644 index 0000000..1391319 --- /dev/null +++ b/src/app.css @@ -0,0 +1,117 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* Awesome theme slightly adjusted from https://tweakcn.com/editor/theme */ +@layer base { + :root { + --background: 40 60% 98.04%; + --foreground: 20.87 18.4% 24.51%; + --card: 36 41.67% 95.29%; + --card-foreground: 20.87 18.4% 24.51%; + --popover: 36 41.67% 95.29%; + --popover-foreground: 20.87 18.4% 24.51%; + --primary: 52.84 93.16% 54.12%; + --primary-foreground: 0 0% 0%; + --secondary: 34.29 60.87% 72.94%; + --secondary-foreground: 33.33 5.45% 32.35%; + --muted: 39.13 45.1% 90%; + --muted-foreground: 25 5.26% 44.71%; + --accent: 34.29 68.29% 83.92%; + --accent-foreground: 33.33 5.45% 32.35%; + --destructive: 0 70% 35.29%; + --destructive-foreground: 0 0% 100%; + --border: 43.5 42.55% 81.57%; + --input: 43.5 42.55% 81.57%; + --ring: 25.96 90.48% 37.06%; + --chart-1: 25.96 90.48% 37.06%; + --chart-2: 25 5.26% 44.71%; + --chart-3: 35.45 91.67% 32.94%; + --chart-4: 25 5.26% 44.71%; + --chart-5: 40.61 96.12% 40.39%; + --sidebar: 39.13 45.1% 90%; + --sidebar-foreground: 20.87 18.4% 24.51%; + --sidebar-primary: 25.96 90.48% 37.06%; + --sidebar-primary-foreground: 0 0% 100%; + --sidebar-accent: 35.45 91.67% 32.94%; + --sidebar-accent-foreground: 0 0% 100%; + --sidebar-border: 43.5 42.55% 81.57%; + --sidebar-ring: 25.96 90.48% 37.06%; + --font-sans: Oxanium, sans-serif; + --font-mono: JetBrains Mono, monospace; + --radius: 0.3rem; + --shadow-2xs: 0px 2px 3px 0px hsl(28 18% 25% / 0.09); + --shadow-xs: 0px 2px 3px 0px hsl(28 18% 25% / 0.09); + --shadow-sm: 0px 2px 3px 0px hsl(28 18% 25% / 0.18), 0px 1px 2px -1px hsl(28 18% 25% / 0.18); + --shadow: 0px 2px 3px 0px hsl(28 18% 25% / 0.18), 0px 1px 2px -1px hsl(28 18% 25% / 0.18); + --shadow-md: 0px 2px 3px 0px hsl(28 18% 25% / 0.18), 0px 2px 4px -1px hsl(28 18% 25% / 0.18); + --shadow-lg: 0px 2px 3px 0px hsl(28 18% 25% / 0.18), 0px 4px 6px -1px hsl(28 18% 25% / 0.18); + --shadow-xl: 0px 2px 3px 0px hsl(28 18% 25% / 0.18), 0px 8px 10px -1px hsl(28 18% 25% / 0.18); + --shadow-2xl: 0px 2px 3px 0px hsl(28 18% 25% / 0.45); + } + + .dark { + --background: 24 9.8% 10%; + --foreground: 60 4.76% 95.88%; + --card: 12 6.49% 15.1%; + --card-foreground: 60 4.76% 95.88%; + --popover: 12 6.49% 15.1%; + --popover-foreground: 60 4.76% 95.88%; + --primary: 52.84 93.16% 54.12%; + --primary-foreground: 0 0% 0%; + --secondary: 33.33 5.45% 32.35%; + --secondary-foreground: 20 5.88% 90%; + --muted: 12 6.49% 15.1%; + --muted-foreground: 24 5.43% 63.92%; + --accent: 198.46 46.43% 21.96%; + --accent-foreground: 20 5.88% 90%; + --destructive: 0 72.22% 50.59%; + --destructive-foreground: 0 0% 100%; + --border: 30 6.25% 25.1%; + --input: 30 6.25% 25.1%; + --ring: 24.58 94.98% 53.14%; + --chart-1: 24.58 94.98% 53.14%; + --chart-2: 198.63 88.66% 48.43%; + --chart-3: 45.4 93.39% 47.45%; + --chart-4: 24 5.43% 63.92%; + --chart-5: 25 5.26% 44.71%; + --sidebar: 12 6.49% 15.1%; + --sidebar-foreground: 60 4.76% 95.88%; + --sidebar-primary: 24.58 94.98% 53.14%; + --sidebar-primary-foreground: 0 0% 100%; + --sidebar-accent: 198.63 88.66% 48.43%; + --sidebar-accent-foreground: 212.31 73.03% 17.45%; + --sidebar-border: 30 6.25% 25.1%; + --sidebar-ring: 24.58 94.98% 53.14%; + --font-sans: Oxanium, sans-serif; + --font-mono: JetBrains Mono, monospace; + --radius: 0.3rem; + --shadow-2xs: 0px 2px 3px 0px hsl(0 0% 5% / 0.09); + --shadow-xs: 0px 2px 3px 0px hsl(0 0% 5% / 0.09); + --shadow-sm: 0px 2px 3px 0px hsl(0 0% 5% / 0.18), 0px 1px 2px -1px hsl(0 0% 5% / 0.18); + --shadow: 0px 2px 3px 0px hsl(0 0% 5% / 0.18), 0px 1px 2px -1px hsl(0 0% 5% / 0.18); + --shadow-md: 0px 2px 3px 0px hsl(0 0% 5% / 0.18), 0px 2px 4px -1px hsl(0 0% 5% / 0.18); + --shadow-lg: 0px 2px 3px 0px hsl(0 0% 5% / 0.18), 0px 4px 6px -1px hsl(0 0% 5% / 0.18); + --shadow-xl: 0px 2px 3px 0px hsl(0 0% 5% / 0.18), 0px 8px 10px -1px hsl(0 0% 5% / 0.18); + --shadow-2xl: 0px 2px 3px 0px hsl(0 0% 5% / 0.45); + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} + +/* For components that need horizontal scrolling */ +.scrollbar-hide { + -ms-overflow-style: none; /* Internet Explorer and Edge */ + scrollbar-width: none; /* Firefox */ +} + +.scrollbar-hide::-webkit-scrollbar { + display: none; /* Chrome, Safari, and Opera */ +} diff --git a/src/app.d.ts b/src/app.d.ts new file mode 100644 index 0000000..da08e6d --- /dev/null +++ b/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/src/app.html b/src/app.html new file mode 100644 index 0000000..77a5ff5 --- /dev/null +++ b/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/src/hooks.server.ts b/src/hooks.server.ts new file mode 100644 index 0000000..9b8fef2 --- /dev/null +++ b/src/hooks.server.ts @@ -0,0 +1,20 @@ +import { redirect, type RequestEvent } from '@sveltejs/kit'; + +export function handle({ event, resolve }) { + redirects(event); + + return resolve(event); +} + +/** Handle redirects from pages that no longer exist that are worth fixing */ +function redirects(event: RequestEvent) { + if (event.url.pathname.startsWith('/registry')) { + const registry = event.url.searchParams.get('url'); + + if (registry !== null) { + redirect(303, `/registries/${registry}`); + } else { + redirect(303, '/registries/'); + } + } +} diff --git a/src/lib/actions/active.svelte.ts b/src/lib/actions/active.svelte.ts new file mode 100644 index 0000000..4a82e26 --- /dev/null +++ b/src/lib/actions/active.svelte.ts @@ -0,0 +1,59 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +import { page } from '$app/state'; +import { untrack } from 'svelte'; + +export type Options = { + /** Determines if the route should be active for subdirectories. + * + * @default true + */ + activeForSubdirectories?: boolean; + /** Determines if the href of the `` tag is a `#` route + * + * @default false + */ + isHash?: boolean; + url: URL; +}; + +/** Sets the `data-active` attribute on an `` tag based on its 'active' state. */ +export const active = (node: HTMLAnchorElement, opts: Omit) => { + checkIsActive(node.href, { ...opts, url: page.url }).toString(); + + $effect(() => { + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + page.url; + + untrack(() => { + node.setAttribute( + 'data-active', + checkIsActive(node.href, { ...opts, url: page.url }).toString() + ); + }); + }); +}; + +export const checkIsActive = ( + nodeHref: string, + { activeForSubdirectories, url, isHash }: Options +): boolean => { + let href: string = new URL(nodeHref).pathname; + + if (isHash) { + href = new URL(nodeHref).hash; + } + + const samePath = href === url.pathname; + + const isParentRoute: boolean = + (activeForSubdirectories == undefined || activeForSubdirectories) && + url.pathname.startsWith(href ?? ''); + + const isHashRoute: boolean = + isHash == true && (url.hash == href || ((href == '#' || href == '#/') && url.hash == '')); + + return samePath || isParentRoute || isHashRoute; +}; diff --git a/src/lib/actions/shortcut.svelte.ts b/src/lib/actions/shortcut.svelte.ts new file mode 100644 index 0000000..2db1251 --- /dev/null +++ b/src/lib/actions/shortcut.svelte.ts @@ -0,0 +1,189 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +export type Options = { + /** Event to use to detect the shortcut @default 'keydown' */ + event?: 'keydown' | 'keyup' | 'keypress'; + /** Function to be called when the shortcut is pressed */ + callback: (e: KeyboardEvent) => void; + /** Should the `Shift` key be pressed */ + shift?: boolean; + /** Should the `Ctrl` / `Command` key be pressed */ + ctrl?: boolean; + /** Should the `Alt` key be pressed */ + alt?: boolean; + /** Which key should be pressed */ + key: Key; + /** Control whether or not the shortcut prevents default behavior @default true */ + preventDefault?: boolean; + /** Control whether or not the shortcut stops propagation @default false */ + stopPropagation?: boolean; +}; + +/** Allows you to configure one or more shortcuts based on the key events of an element. + * + * ## Usage + * ```svelte + * + * + * ``` + */ +export const shortcut = (node: HTMLElement, options: Options[] | Options) => { + const handleKeydown = (e: KeyboardEvent, options: Options) => { + if (options.ctrl && !e.ctrlKey && !e.metaKey) return; + + if (options.alt && !e.altKey) return; + + if (options.shift && !e.shiftKey) return; + + if (e.key.toLocaleLowerCase() !== options.key.toLocaleLowerCase()) return; + + if (options.preventDefault === undefined || options.preventDefault) { + e.preventDefault(); + } + + if (options.stopPropagation) { + e.stopPropagation(); + } + + options.callback(e); + }; + + $effect(() => { + let optionsArr: Options[] = []; + if (Array.isArray(options)) { + optionsArr = options; + } else { + optionsArr = [options]; + } + + for (const opt of optionsArr) { + node.addEventListener(opt.event ?? 'keydown', (e) => handleKeydown(e, opt)); + } + + return () => { + for (const opt of optionsArr) { + node.removeEventListener(opt.event ?? 'keydown', (e) => handleKeydown(e, opt)); + } + }; + }); +}; + +export type Key = + | 'backspace' + | 'tab' + | 'enter' + | 'shift(left)' + | 'shift(right)' + | 'ctrl(left)' + | 'ctrl(right)' + | 'alt(left)' + | 'alt(right)' + | 'pause/break' + | 'caps lock' + | 'escape' + | 'space' + | 'page up' + | 'page down' + | 'end' + | 'home' + | 'left arrow' + | 'up arrow' + | 'right arrow' + | 'down arrow' + | 'print screen' + | 'insert' + | 'delete' + | '0' + | '1' + | '2' + | '3' + | '4' + | '5' + | '6' + | '7' + | '8' + | '9' + | 'a' + | 'b' + | 'c' + | 'd' + | 'e' + | 'f' + | 'g' + | 'h' + | 'i' + | 'j' + | 'k' + | 'l' + | 'm' + | 'n' + | 'o' + | 'p' + | 'q' + | 'r' + | 's' + | 't' + | 'u' + | 'v' + | 'w' + | 'x' + | 'y' + | 'z' + | 'left window key' + | 'right window key' + | 'select key (Context Menu)' + | 'numpad 0' + | 'numpad 1' + | 'numpad 2' + | 'numpad 3' + | 'numpad 4' + | 'numpad 5' + | 'numpad 6' + | 'numpad 7' + | 'numpad 8' + | 'numpad 9' + | 'multiply' + | 'add' + | 'subtract' + | 'decimal point' + | 'divide' + | 'f1' + | 'f2' + | 'f3' + | 'f4' + | 'f5' + | 'f6' + | 'f7' + | 'f8' + | 'f9' + | 'f10' + | 'f11' + | 'f12' + | 'num lock' + | 'scroll lock' + | 'audio volume mute' + | 'audio volume down' + | 'audio volume up' + | 'media player' + | 'launch application 1' + | 'launch application 2' + | 'semi-colon' + | 'equal sign' + | 'comma' + | 'dash' + | 'period' + | 'forward slash' + | 'Backquote/Grave accent' + | 'open bracket' + | 'back slash' + | 'close bracket' + | 'single quote'; diff --git a/src/lib/actions/typewriter.svelte.ts b/src/lib/actions/typewriter.svelte.ts new file mode 100644 index 0000000..885ffbe --- /dev/null +++ b/src/lib/actions/typewriter.svelte.ts @@ -0,0 +1,29 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +import type { TransitionConfig } from 'svelte/transition'; + +export type Options = { + speed: number; + delay: number; + onComplete?: () => void; +}; + +export const typewriter = ( + node: HTMLElement, + { speed = 1, delay = 0, onComplete }: Partial +) => { + const text = node.textContent ?? ''; + const duration = text.length / (speed * 0.01); + + return { + delay, + duration, + tick: (t) => { + const i = Math.trunc(text.length * t); + node.textContent = text.slice(0, i); + if (node.textContent.length === text.length) onComplete?.(); + } + } satisfies TransitionConfig; +}; diff --git a/src/lib/backend/cache/redis-client.ts b/src/lib/backend/cache/redis-client.ts new file mode 100644 index 0000000..80f040e --- /dev/null +++ b/src/lib/backend/cache/redis-client.ts @@ -0,0 +1,9 @@ +import { UPSTASH_REDIS_TOKEN, UPSTASH_REDIS_URL } from '$env/static/private'; +import { Redis } from '@upstash/redis'; + +const redis = new Redis({ + url: UPSTASH_REDIS_URL, + token: UPSTASH_REDIS_TOKEN +}); + +export { redis }; diff --git a/src/lib/backend/db/functions.ts b/src/lib/backend/db/functions.ts new file mode 100644 index 0000000..aefb01d --- /dev/null +++ b/src/lib/backend/db/functions.ts @@ -0,0 +1,72 @@ +import { selectProvider } from 'jsrepo'; +import { db } from '.'; +import { registries, type Registry } from './schema'; +import { desc, eq, sql } from 'drizzle-orm'; + +export async function tryIncrementViews(registryUrl: string): Promise { + const url = await tryInsert(registryUrl); + + if (url === undefined) return undefined; + + const result = await db + .update(registries) + .set({ views: sql`${registries.views} + 1` }) + .where(eq(registries.url, url)) + .returning({ views: registries.views }); + + return result[0].views ?? undefined; +} + +export async function tryInsert(registryUrl: string): Promise { + const provider = selectProvider(registryUrl); + + if (!provider) return; + + const normalizedUrl = provider.parse(registryUrl, { fullyQualified: false }).url; + + const existing = await db.select().from(registries).where(eq(registries.url, normalizedUrl)); + + if (existing.length === 0) { + await db.insert(registries).values({ url: normalizedUrl, views: 0 }); + } + + return normalizedUrl; +} + +/** Fetches a set of registries that are different for every day */ +export async function getFeatured(limit: number = 5): Promise { + const today = new Date(); + const day = String(today.getDate()).padStart(2, '0'); + const month = String(today.getMonth() + 1).padStart(2, '0'); + const year = today.getFullYear(); + + const seed = parseFloat(`0.${day}${month}${year}`); + + // Ensure the seed is within the valid range (-1 to 1) + const normalizedSeed = (seed % 2) - 1; + + try { + // use a transaction to make sure SETSEED works as expected + return await db.transaction(async (tx) => { + // Inside the transaction: + await tx.execute(sql`SELECT SETSEED(${normalizedSeed})`); + + const randomRows = await tx.execute(sql` + SELECT * + FROM registries + ORDER BY RANDOM() + LIMIT ${limit}; + `); + + return randomRows; + }); + } catch (error) { + // Handle transaction errors (e.g., log the error, re-throw, etc.) + console.error('Transaction failed:', error); + throw error; // Re-throw to propagate the error + } +} + +export async function getPopular(limit: number = 5): Promise { + return await db.select().from(registries).orderBy(desc(registries.views)).limit(limit); +} diff --git a/src/lib/backend/db/index.ts b/src/lib/backend/db/index.ts new file mode 100644 index 0000000..ce19d09 --- /dev/null +++ b/src/lib/backend/db/index.ts @@ -0,0 +1,7 @@ +import { drizzle } from 'drizzle-orm/postgres-js'; +import postgres from 'postgres'; +import { DATABASE_URL } from '$env/static/private'; +export * as functions from './functions'; + +const client = postgres(DATABASE_URL, { prepare: false }); +export const db = drizzle(client); diff --git a/src/lib/backend/db/schema.ts b/src/lib/backend/db/schema.ts new file mode 100644 index 0000000..a2f7875 --- /dev/null +++ b/src/lib/backend/db/schema.ts @@ -0,0 +1,14 @@ +import { pgTable, integer, text, timestamp } from 'drizzle-orm/pg-core'; + +export const registries = pgTable('registries', { + url: text().notNull(), + views: integer().notNull(), + created_at: timestamp() +}); + +export type Registry = typeof registries.$inferSelect; + +export const featuredRegistries = pgTable('featured_registries', { + url: text().notNull(), + created_at: timestamp() +}); diff --git a/src/lib/components/animations/marquee/index.ts b/src/lib/components/animations/marquee/index.ts new file mode 100644 index 0000000..b7a85f3 --- /dev/null +++ b/src/lib/components/animations/marquee/index.ts @@ -0,0 +1,3 @@ +import Marquee from './marquee.svelte'; + +export { Marquee }; diff --git a/src/lib/components/animations/marquee/marquee.svelte b/src/lib/components/animations/marquee/marquee.svelte new file mode 100644 index 0000000..cf97d21 --- /dev/null +++ b/src/lib/components/animations/marquee/marquee.svelte @@ -0,0 +1,34 @@ + + +
+ {#each { length: repeat } as _, i (i)} +
+ Default +
+ {/each} +
diff --git a/src/lib/components/icons/azure-devops.svelte b/src/lib/components/icons/azure-devops.svelte new file mode 100644 index 0000000..bc08231 --- /dev/null +++ b/src/lib/components/icons/azure-devops.svelte @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + diff --git a/src/lib/components/icons/bitbucket.svelte b/src/lib/components/icons/bitbucket.svelte new file mode 100644 index 0000000..40423a0 --- /dev/null +++ b/src/lib/components/icons/bitbucket.svelte @@ -0,0 +1,36 @@ + + + + + + + + + + + + diff --git a/src/lib/components/icons/css.svelte b/src/lib/components/icons/css.svelte new file mode 100644 index 0000000..5858c75 --- /dev/null +++ b/src/lib/components/icons/css.svelte @@ -0,0 +1,23 @@ + + + diff --git a/src/lib/components/icons/github.svelte b/src/lib/components/icons/github.svelte new file mode 100644 index 0000000..5cb0a21 --- /dev/null +++ b/src/lib/components/icons/github.svelte @@ -0,0 +1,35 @@ + + +{#if $mode === 'dark'} + + + +{:else} + + + +{/if} diff --git a/src/lib/components/icons/gitlab.svelte b/src/lib/components/icons/gitlab.svelte new file mode 100644 index 0000000..51bbddc --- /dev/null +++ b/src/lib/components/icons/gitlab.svelte @@ -0,0 +1,32 @@ + + + + + + + + diff --git a/src/lib/components/icons/html.svelte b/src/lib/components/icons/html.svelte new file mode 100644 index 0000000..6a05c53 --- /dev/null +++ b/src/lib/components/icons/html.svelte @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/src/lib/components/icons/index.ts b/src/lib/components/icons/index.ts new file mode 100644 index 0000000..bec42df --- /dev/null +++ b/src/lib/components/icons/index.ts @@ -0,0 +1,40 @@ +import type { HTMLAttributes } from 'svelte/elements'; +import AzureDevops from './azure-devops.svelte'; +import GitHub from './github.svelte'; +import CSS from './css.svelte'; +import TypeScript from './typescript.svelte'; +import Svelte from './svelte.svelte'; +import React from './react.svelte'; +import JavaScript from './javascript.svelte'; +import Vue from './vue.svelte'; +import Jsrepo from './jsrepo.svelte'; +import GitLab from './gitlab.svelte'; +import BitBucket from './bitbucket.svelte'; +import Yaml from './yaml.svelte'; +import Svg from './svg.svelte'; +import HTML from './html.svelte'; +import SASS from './sass.svelte'; + +export interface Props extends HTMLAttributes { + class?: string; + width?: number; + height?: number; +} + +export { + AzureDevops, + CSS, + HTML, + GitHub, + TypeScript, + Svelte, + React, + JavaScript, + Vue, + Jsrepo, + GitLab, + BitBucket, + Yaml, + SASS, + Svg +}; diff --git a/src/lib/components/icons/javascript.svelte b/src/lib/components/icons/javascript.svelte new file mode 100644 index 0000000..f41965e --- /dev/null +++ b/src/lib/components/icons/javascript.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/lib/components/icons/jsrepo.svelte b/src/lib/components/icons/jsrepo.svelte new file mode 100644 index 0000000..4424ab3 --- /dev/null +++ b/src/lib/components/icons/jsrepo.svelte @@ -0,0 +1,27 @@ + + + + + + + + + + + + + diff --git a/src/lib/components/icons/react.svelte b/src/lib/components/icons/react.svelte new file mode 100644 index 0000000..b5a8a5a --- /dev/null +++ b/src/lib/components/icons/react.svelte @@ -0,0 +1,18 @@ + + + diff --git a/src/lib/components/icons/sass.svelte b/src/lib/components/icons/sass.svelte new file mode 100644 index 0000000..a7bd044 --- /dev/null +++ b/src/lib/components/icons/sass.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/icons/svelte.svelte b/src/lib/components/icons/svelte.svelte new file mode 100644 index 0000000..fe6e1f2 --- /dev/null +++ b/src/lib/components/icons/svelte.svelte @@ -0,0 +1,23 @@ + + + + svelte-logo + + + diff --git a/src/lib/components/icons/svg.svelte b/src/lib/components/icons/svg.svelte new file mode 100644 index 0000000..681ca12 --- /dev/null +++ b/src/lib/components/icons/svg.svelte @@ -0,0 +1,26 @@ + + + diff --git a/src/lib/components/icons/typescript.svelte b/src/lib/components/icons/typescript.svelte new file mode 100644 index 0000000..6141a85 --- /dev/null +++ b/src/lib/components/icons/typescript.svelte @@ -0,0 +1,25 @@ + + + diff --git a/src/lib/components/icons/vue.svelte b/src/lib/components/icons/vue.svelte new file mode 100644 index 0000000..f90f9c1 --- /dev/null +++ b/src/lib/components/icons/vue.svelte @@ -0,0 +1,18 @@ + + + diff --git a/src/lib/components/icons/yaml.svelte b/src/lib/components/icons/yaml.svelte new file mode 100644 index 0000000..3ffcf3b --- /dev/null +++ b/src/lib/components/icons/yaml.svelte @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/src/lib/components/site/docs/aside.svelte b/src/lib/components/site/docs/aside.svelte new file mode 100644 index 0000000..4bf1fda --- /dev/null +++ b/src/lib/components/site/docs/aside.svelte @@ -0,0 +1,23 @@ + + +
+ {#if toc.current.length > 0} + + On This Page + + + {/if} +
diff --git a/src/lib/components/site/docs/badges/badges-table-dynamic.svelte b/src/lib/components/site/docs/badges/badges-table-dynamic.svelte new file mode 100644 index 0000000..ad6e4d6 --- /dev/null +++ b/src/lib/components/site/docs/badges/badges-table-dynamic.svelte @@ -0,0 +1,130 @@ + + + + + + Badge + + + + + {#each dynamicBadges as { alt, href }, i (i)} + + +
+ + +
+
+ + + + {#snippet child({ props })} + + {/snippet} + + +
+
+ + +
+
+ +
+ {#if registry !== ''} + {#key debounced.current} + + {/key} + {/if} +
+
+ + {#snippet child({ status })} + {#if status === 'success'} +
+ + Copied +
+ {:else} +
+ + Copy Url + Copy +
+ {/if} + {/snippet} +
+ + {#snippet child({ status })} + {#if status === 'success'} +
+ + Copied +
+ {:else} +
+ + Copy Markdown + Copy +
+ {/if} + {/snippet} +
+
+
+
+
+
+ {/each} +
+
diff --git a/src/lib/components/site/docs/badges/badges-table.svelte b/src/lib/components/site/docs/badges/badges-table.svelte new file mode 100644 index 0000000..8309937 --- /dev/null +++ b/src/lib/components/site/docs/badges/badges-table.svelte @@ -0,0 +1,85 @@ + + + + + + Badge + + + + + {#each badges as { alt, href }, i (i)} + + +
+ + +
+
+ + + + {#snippet child({ props })} + + {/snippet} + + + copy(i, href)}>Url + { + const content = `[![jsrepo](${href})](https://jsrepo.dev)`; + copy(i, content); + }} + > + Markdown + + + + +
+ {/each} +
+
diff --git a/src/lib/components/site/docs/badges/index.ts b/src/lib/components/site/docs/badges/index.ts new file mode 100644 index 0000000..9857ca8 --- /dev/null +++ b/src/lib/components/site/docs/badges/index.ts @@ -0,0 +1,4 @@ +import TableDynamic from './badges-table-dynamic.svelte'; +import Table from './badges-table.svelte'; + +export { Table, TableDynamic }; diff --git a/src/lib/components/site/docs/index.ts b/src/lib/components/site/docs/index.ts new file mode 100644 index 0000000..5ba27fc --- /dev/null +++ b/src/lib/components/site/docs/index.ts @@ -0,0 +1,8 @@ +import PageWrapper from './page-wrapper.svelte'; +import Sidebar from './sidebar.svelte'; +import Aside from './aside.svelte'; +import NavMenu from './nav-menu.svelte'; +import ProviderCards from './provider-cards.svelte'; +import LanguageSupport from './language-support.svelte'; + +export { PageWrapper, Sidebar, Aside, NavMenu, ProviderCards, LanguageSupport }; diff --git a/src/lib/components/site/docs/language-support.svelte b/src/lib/components/site/docs/language-support.svelte new file mode 100644 index 0000000..e397ec2 --- /dev/null +++ b/src/lib/components/site/docs/language-support.svelte @@ -0,0 +1,188 @@ + + + + +{#snippet typescript({ size }: { size: number })} + +{/snippet} + +{#snippet javascript({ size }: { size: number })} + +{/snippet} + +{#snippet tsx({ size }: { size: number })} + +{/snippet} + +{#snippet jsx({ size }: { size: number })} + +{/snippet} + +{#snippet svelte({ size }: { size: number })} + +{/snippet} + +{#snippet vue({ size }: { size: number })} + +{/snippet} + +{#snippet yaml({ size }: { size: number })} + +{/snippet} + +{#snippet json({ size }: { size: number })} + +{/snippet} + +{#snippet svg({ size }: { size: number })} + +{/snippet} + +{#snippet css({ size }: { size: number })} + +{/snippet} + +{#snippet sass({ size }: { size: number })} + +{/snippet} + +{#snippet html({ size }: { size: number })} + +{/snippet} + + + + + Language + Dependencies + Formatting + Watermarks + + + + {#each supportedLanguages as { name, logo, dependencyResolutionStatus, formattingStatus, watermarkStatus } (name)} + + +
+ {#if logo} + {@render logo({ size: 18 })} + {/if} + {name} +
+
+ {dependencyResolutionStatus} + {formattingStatus} + {watermarkStatus} +
+ {/each} +
+
diff --git a/src/lib/components/site/docs/markdown/blueprint.svelte b/src/lib/components/site/docs/markdown/blueprint.svelte new file mode 100644 index 0000000..3439025 --- /dev/null +++ b/src/lib/components/site/docs/markdown/blueprint.svelte @@ -0,0 +1,6 @@ + + + diff --git a/src/lib/components/site/docs/markdown/index.ts b/src/lib/components/site/docs/markdown/index.ts new file mode 100644 index 0000000..a836bdf --- /dev/null +++ b/src/lib/components/site/docs/markdown/index.ts @@ -0,0 +1 @@ +export { default as pre } from './pre.svelte'; diff --git a/src/lib/components/site/docs/markdown/pre.svelte b/src/lib/components/site/docs/markdown/pre.svelte new file mode 100644 index 0000000..7adce18 --- /dev/null +++ b/src/lib/components/site/docs/markdown/pre.svelte @@ -0,0 +1,21 @@ + + +
+	{@render children?.()}
+
+ diff --git a/src/lib/components/site/docs/nav-menu.svelte b/src/lib/components/site/docs/nav-menu.svelte new file mode 100644 index 0000000..8e9c20c --- /dev/null +++ b/src/lib/components/site/docs/nav-menu.svelte @@ -0,0 +1,84 @@ + + + +
+
+ + + + + + + + + {#if page.url.pathname.startsWith('/docs')} + {#each Object.entries(map) as [title, docs] (title)} + + + {#each docs as doc (doc.title)} + + {#if doc.children} + + {#each doc.children as child (child.title)} + + {/each} + + {/if} + {/each} + + + {/each} + {/if} +
+
+
+ + +
+
diff --git a/src/lib/components/site/docs/page-wrapper.svelte b/src/lib/components/site/docs/page-wrapper.svelte new file mode 100644 index 0000000..b1d7687 --- /dev/null +++ b/src/lib/components/site/docs/page-wrapper.svelte @@ -0,0 +1,21 @@ + + + + jsrepo - {title} + + + +
+

{title}

+

{description}

+
+ {@render children()} +
+
diff --git a/src/lib/components/site/docs/pagination/component.svelte b/src/lib/components/site/docs/pagination/component.svelte new file mode 100644 index 0000000..383fc80 --- /dev/null +++ b/src/lib/components/site/docs/pagination/component.svelte @@ -0,0 +1,32 @@ + + +
+ {#if variant === 'next'} + {@render children()} + + {:else} + + {@render children()} + {/if} + diff --git a/src/lib/components/site/docs/pagination/index.ts b/src/lib/components/site/docs/pagination/index.ts new file mode 100644 index 0000000..66882ad --- /dev/null +++ b/src/lib/components/site/docs/pagination/index.ts @@ -0,0 +1,4 @@ +import Next from './next.svelte'; +import Previous from './previous.svelte'; + +export { Next, Previous }; diff --git a/src/lib/components/site/docs/pagination/next.svelte b/src/lib/components/site/docs/pagination/next.svelte new file mode 100644 index 0000000..d7f8f46 --- /dev/null +++ b/src/lib/components/site/docs/pagination/next.svelte @@ -0,0 +1,8 @@ + + + diff --git a/src/lib/components/site/docs/pagination/previous.svelte b/src/lib/components/site/docs/pagination/previous.svelte new file mode 100644 index 0000000..2d34212 --- /dev/null +++ b/src/lib/components/site/docs/pagination/previous.svelte @@ -0,0 +1,8 @@ + + + diff --git a/src/lib/components/site/docs/pagination/types.ts b/src/lib/components/site/docs/pagination/types.ts new file mode 100644 index 0000000..226bcc2 --- /dev/null +++ b/src/lib/components/site/docs/pagination/types.ts @@ -0,0 +1,6 @@ +import type { Snippet } from 'svelte'; +import type { HTMLAnchorAttributes } from 'svelte/elements'; + +export interface Props extends HTMLAnchorAttributes { + children: Snippet<[]>; +} diff --git a/src/lib/components/site/docs/provider-cards.svelte b/src/lib/components/site/docs/provider-cards.svelte new file mode 100644 index 0000000..11bd7de --- /dev/null +++ b/src/lib/components/site/docs/provider-cards.svelte @@ -0,0 +1,49 @@ + + +
+ {#each providers as provider (provider.href)} + + + + + + {provider.name} + + + + {/each} +
diff --git a/src/lib/components/site/docs/search/search.svelte b/src/lib/components/site/docs/search/search.svelte new file mode 100644 index 0000000..f60e04b --- /dev/null +++ b/src/lib/components/site/docs/search/search.svelte @@ -0,0 +1,47 @@ + + + + + {#if results.length > 0} + + + {#each results as result (result.id)} + { + await goto(result.href); + openState.setFalse(); + search = ''; + }} + > + {result.title} + + {/each} + + + {/if} + diff --git a/src/lib/components/site/docs/search/search.ts b/src/lib/components/site/docs/search/search.ts new file mode 100644 index 0000000..26d24ce --- /dev/null +++ b/src/lib/components/site/docs/search/search.ts @@ -0,0 +1,33 @@ +import FlexSearch from 'flexsearch'; + +export type IndexEntry = { + id: number; + title: string; + href: string; + content: string; +}; + +let index: FlexSearch.Index; +let content: Map; + +export function createIndex(searchIndex: { docs: IndexEntry[] }) { + content = new Map(); + + index = new FlexSearch.Index({ + tokenize: 'forward', + resolution: 9 + }); + + for (const entry of searchIndex.docs) { + index.add(entry.id, entry.content); + content.set(entry.id, entry); + } +} + +export function searchIndex(query: string): IndexEntry[] { + if (!index) return []; + + const results = index.search(query, { suggest: true }) as number[]; + + return results.map((index: number) => content.get(index)!); +} diff --git a/src/lib/components/site/docs/sidebar.svelte b/src/lib/components/site/docs/sidebar.svelte new file mode 100644 index 0000000..534e780 --- /dev/null +++ b/src/lib/components/site/docs/sidebar.svelte @@ -0,0 +1,42 @@ + + +
+ {#each Object.entries(map) as [title, docs] (title)} + + + {#each docs as doc (doc.title)} + {#if doc.children} + +
+ + + + +
+ + + {#each doc.children as child (child.title)} + + {/each} + + +
+ {:else} + + {/if} + {/each} +
+
+ {/each} +
diff --git a/src/lib/components/site/footer.svelte b/src/lib/components/site/footer.svelte new file mode 100644 index 0000000..6c2ca9e --- /dev/null +++ b/src/lib/components/site/footer.svelte @@ -0,0 +1,55 @@ + + + + + diff --git a/src/lib/components/site/header.svelte b/src/lib/components/site/header.svelte new file mode 100644 index 0000000..56e5eaa --- /dev/null +++ b/src/lib/components/site/header.svelte @@ -0,0 +1,94 @@ + + + + + + +
+
+ + + {#if page.url.pathname.startsWith('/docs')} + + {/if} + +
+
+
+
diff --git a/src/lib/components/site/nav/index.ts b/src/lib/components/site/nav/index.ts new file mode 100644 index 0000000..b295047 --- /dev/null +++ b/src/lib/components/site/nav/index.ts @@ -0,0 +1,6 @@ +import Group from './nav-group.svelte'; +import List from './nav-list.svelte'; +import Link from './nav-link.svelte'; +import Title from './nav-title.svelte'; + +export { Group, List, Link, Title }; diff --git a/src/lib/components/site/nav/nav-group.svelte b/src/lib/components/site/nav/nav-group.svelte new file mode 100644 index 0000000..a1a8a1a --- /dev/null +++ b/src/lib/components/site/nav/nav-group.svelte @@ -0,0 +1,19 @@ + + +
+ {#if title} + {title} + {/if} + {@render children?.()} +
diff --git a/src/lib/components/site/nav/nav-link.svelte b/src/lib/components/site/nav/nav-link.svelte new file mode 100644 index 0000000..d82a8ed --- /dev/null +++ b/src/lib/components/site/nav/nav-link.svelte @@ -0,0 +1,40 @@ + + +
+ + {title} + {#if external} + + {/if} + + {#if tag} + + {tag} + + {/if} +
diff --git a/src/lib/components/site/nav/nav-list.svelte b/src/lib/components/site/nav/nav-list.svelte new file mode 100644 index 0000000..212d5ec --- /dev/null +++ b/src/lib/components/site/nav/nav-list.svelte @@ -0,0 +1,10 @@ + + +
    + {@render children?.()} +
diff --git a/src/lib/components/site/nav/nav-title.svelte b/src/lib/components/site/nav/nav-title.svelte new file mode 100644 index 0000000..193efe4 --- /dev/null +++ b/src/lib/components/site/nav/nav-title.svelte @@ -0,0 +1,10 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/site/registry-search.svelte b/src/lib/components/site/registry-search.svelte new file mode 100644 index 0000000..6c6abb2 --- /dev/null +++ b/src/lib/components/site/registry-search.svelte @@ -0,0 +1,288 @@ + + + { + // if we click outside make sure we clear the selected index + const target = e.target as HTMLElement | null; + + if (!target) return; + + if (!target.hasAttribute('data-search-item')) { + selectedIndex = undefined; + } + }} +/> + +
{ + e.preventDefault(); + handleSubmit(); + }} + class={cn('flex h-12 w-full place-items-center bg-popover text-base md:text-sm', className)} +> +
+ + (selectedIndex = undefined)} + oninput={() => debouncedQuery()} + onkeydown={handleKeydown} + class="h-full w-full min-w-0 bg-transparent py-3 outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50" + placeholder="Search registries..." + disabled={adding} + /> +
+ {#if searching} +
+ +
+ {/if} + {#if error} +
!
+ {/if} +
+ {#if canShowList} +
+ +
+ {#each filteredCompletions as url, i (url)} + {@const Icon = getIcon(url)} + + + + {/each} + {#if filteredCompletions.length === 0 && !searching && search.length > 0} + {#if selectProvider(search) !== undefined} + + + + {/if} + {/if} +
+
+ {/if} +
+ +
diff --git a/src/lib/components/site/star-button.svelte b/src/lib/components/site/star-button.svelte new file mode 100644 index 0000000..baa05e0 --- /dev/null +++ b/src/lib/components/site/star-button.svelte @@ -0,0 +1,38 @@ + + + diff --git a/src/lib/components/ui/accordion/accordion-content.svelte b/src/lib/components/ui/accordion/accordion-content.svelte new file mode 100644 index 0000000..0d1d672 --- /dev/null +++ b/src/lib/components/ui/accordion/accordion-content.svelte @@ -0,0 +1,24 @@ + + + +
+ {@render children?.()} +
+
diff --git a/src/lib/components/ui/accordion/accordion-item.svelte b/src/lib/components/ui/accordion/accordion-item.svelte new file mode 100644 index 0000000..640a466 --- /dev/null +++ b/src/lib/components/ui/accordion/accordion-item.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/lib/components/ui/accordion/accordion-trigger.svelte b/src/lib/components/ui/accordion/accordion-trigger.svelte new file mode 100644 index 0000000..389cbc9 --- /dev/null +++ b/src/lib/components/ui/accordion/accordion-trigger.svelte @@ -0,0 +1,29 @@ + + + + svg]:rotate-180', + className + )} + {...restProps} + > + {@render children?.()} + + + diff --git a/src/lib/components/ui/accordion/index.ts b/src/lib/components/ui/accordion/index.ts new file mode 100644 index 0000000..71538b5 --- /dev/null +++ b/src/lib/components/ui/accordion/index.ts @@ -0,0 +1,17 @@ +import { Accordion as AccordionPrimitive } from 'bits-ui'; +import Content from './accordion-content.svelte'; +import Item from './accordion-item.svelte'; +import Trigger from './accordion-trigger.svelte'; + +const Root = AccordionPrimitive.Root; +export { + Root, + Content, + Item, + Trigger, + // + Root as Accordion, + Content as AccordionContent, + Item as AccordionItem, + Trigger as AccordionTrigger +}; diff --git a/src/lib/components/ui/badge/badge.svelte b/src/lib/components/ui/badge/badge.svelte new file mode 100644 index 0000000..575d32f --- /dev/null +++ b/src/lib/components/ui/badge/badge.svelte @@ -0,0 +1,48 @@ + + + + + + {@render children?.()} + diff --git a/src/lib/components/ui/badge/index.ts b/src/lib/components/ui/badge/index.ts new file mode 100644 index 0000000..f05fb87 --- /dev/null +++ b/src/lib/components/ui/badge/index.ts @@ -0,0 +1,2 @@ +export { default as Badge } from './badge.svelte'; +export { badgeVariants, type BadgeVariant } from './badge.svelte'; diff --git a/src/lib/components/ui/button/button.svelte b/src/lib/components/ui/button/button.svelte new file mode 100644 index 0000000..27c9009 --- /dev/null +++ b/src/lib/components/ui/button/button.svelte @@ -0,0 +1,85 @@ + + + + + + +{#if href} + + {@render children?.()} + +{:else} + +{/if} diff --git a/src/lib/components/ui/button/index.ts b/src/lib/components/ui/button/index.ts new file mode 100644 index 0000000..2f427cc --- /dev/null +++ b/src/lib/components/ui/button/index.ts @@ -0,0 +1,21 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +import Root, { + type ButtonProps, + type ButtonSize, + type ButtonVariant, + buttonVariants +} from './button.svelte'; + +export { + Root, + type ButtonProps as Props, + // + Root as Button, + buttonVariants, + type ButtonProps, + type ButtonSize, + type ButtonVariant +}; diff --git a/src/lib/components/ui/card/card-content.svelte b/src/lib/components/ui/card/card-content.svelte new file mode 100644 index 0000000..e517deb --- /dev/null +++ b/src/lib/components/ui/card/card-content.svelte @@ -0,0 +1,16 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/card/card-description.svelte b/src/lib/components/ui/card/card-description.svelte new file mode 100644 index 0000000..d6adb63 --- /dev/null +++ b/src/lib/components/ui/card/card-description.svelte @@ -0,0 +1,16 @@ + + +

+ {@render children?.()} +

diff --git a/src/lib/components/ui/card/card-footer.svelte b/src/lib/components/ui/card/card-footer.svelte new file mode 100644 index 0000000..ab12955 --- /dev/null +++ b/src/lib/components/ui/card/card-footer.svelte @@ -0,0 +1,16 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/card/card-header.svelte b/src/lib/components/ui/card/card-header.svelte new file mode 100644 index 0000000..e163e42 --- /dev/null +++ b/src/lib/components/ui/card/card-header.svelte @@ -0,0 +1,16 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/card/card-title.svelte b/src/lib/components/ui/card/card-title.svelte new file mode 100644 index 0000000..bb6e4d3 --- /dev/null +++ b/src/lib/components/ui/card/card-title.svelte @@ -0,0 +1,25 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/card/card.svelte b/src/lib/components/ui/card/card.svelte new file mode 100644 index 0000000..081d3b9 --- /dev/null +++ b/src/lib/components/ui/card/card.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/card/index.ts b/src/lib/components/ui/card/index.ts new file mode 100644 index 0000000..5c11597 --- /dev/null +++ b/src/lib/components/ui/card/index.ts @@ -0,0 +1,22 @@ +import Root from './card.svelte'; +import Content from './card-content.svelte'; +import Description from './card-description.svelte'; +import Footer from './card-footer.svelte'; +import Header from './card-header.svelte'; +import Title from './card-title.svelte'; + +export { + Root, + Content, + Description, + Footer, + Header, + Title, + // + Root as Card, + Content as CardContent, + Description as CardDescription, + Footer as CardFooter, + Header as CardHeader, + Title as CardTitle +}; diff --git a/src/lib/components/ui/code/code.svelte b/src/lib/components/ui/code/code.svelte new file mode 100644 index 0000000..b7f681d --- /dev/null +++ b/src/lib/components/ui/code/code.svelte @@ -0,0 +1,183 @@ + + + + +
+ {@html highlighted} + {#if !hideCopy} +
+ +
+ {/if} +
+ + diff --git a/src/lib/components/ui/code/index.ts b/src/lib/components/ui/code/index.ts new file mode 100644 index 0000000..6141c1b --- /dev/null +++ b/src/lib/components/ui/code/index.ts @@ -0,0 +1,7 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +import Code from './code.svelte'; + +export { Code }; diff --git a/src/lib/components/ui/code/shiki.ts b/src/lib/components/ui/code/shiki.ts new file mode 100644 index 0000000..58aeae5 --- /dev/null +++ b/src/lib/components/ui/code/shiki.ts @@ -0,0 +1,29 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +// Follows the best practices established in https://shiki.matsu.io/guide/best-performance +import { createJavaScriptRegexEngine } from 'shiki/engine/javascript'; +import { createHighlighterCore } from 'shiki/core'; + +const bundledLanguages = { + bash: () => import('@shikijs/langs/bash'), + diff: () => import('@shikijs/langs/diff'), + javascript: () => import('@shikijs/langs/javascript'), + json: () => import('@shikijs/langs/json'), + svelte: () => import('@shikijs/langs/svelte'), + typescript: () => import('@shikijs/langs/typescript') +}; + +/** The languages configured for the highlighter */ +export type SupportedLanguage = keyof typeof bundledLanguages; + +/** A preloaded highlighter instance. */ +export const highlighter = createHighlighterCore({ + themes: [ + import('@shikijs/themes/github-light-default'), + import('@shikijs/themes/github-dark-default') + ], + langs: Object.entries(bundledLanguages).map(([_, lang]) => lang), + engine: createJavaScriptRegexEngine() +}); diff --git a/src/lib/components/ui/collapsible/index.ts b/src/lib/components/ui/collapsible/index.ts new file mode 100644 index 0000000..a079553 --- /dev/null +++ b/src/lib/components/ui/collapsible/index.ts @@ -0,0 +1,15 @@ +import { Collapsible as CollapsiblePrimitive } from 'bits-ui'; + +const Root: typeof CollapsiblePrimitive.Root = CollapsiblePrimitive.Root; +const Trigger: typeof CollapsiblePrimitive.Trigger = CollapsiblePrimitive.Trigger; +const Content: typeof CollapsiblePrimitive.Content = CollapsiblePrimitive.Content; + +export { + Root, + Content, + Trigger, + // + Root as Collapsible, + Content as CollapsibleContent, + Trigger as CollapsibleTrigger +}; diff --git a/src/lib/components/ui/command/command-dialog.svelte b/src/lib/components/ui/command/command-dialog.svelte new file mode 100644 index 0000000..2784aa6 --- /dev/null +++ b/src/lib/components/ui/command/command-dialog.svelte @@ -0,0 +1,37 @@ + + + + + + + diff --git a/src/lib/components/ui/command/command-empty.svelte b/src/lib/components/ui/command/command-empty.svelte new file mode 100644 index 0000000..8236a66 --- /dev/null +++ b/src/lib/components/ui/command/command-empty.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/lib/components/ui/command/command-group.svelte b/src/lib/components/ui/command/command-group.svelte new file mode 100644 index 0000000..fd159c6 --- /dev/null +++ b/src/lib/components/ui/command/command-group.svelte @@ -0,0 +1,27 @@ + + + + {#if heading} + + {heading} + + {/if} + + diff --git a/src/lib/components/ui/command/command-input.svelte b/src/lib/components/ui/command/command-input.svelte new file mode 100644 index 0000000..3dfbd7c --- /dev/null +++ b/src/lib/components/ui/command/command-input.svelte @@ -0,0 +1,34 @@ + + +
+ + +
+ {#if searching} +
+ +
+ {/if} +
+
diff --git a/src/lib/components/ui/command/command-item.svelte b/src/lib/components/ui/command/command-item.svelte new file mode 100644 index 0000000..edd265d --- /dev/null +++ b/src/lib/components/ui/command/command-item.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/command/command-link-item.svelte b/src/lib/components/ui/command/command-link-item.svelte new file mode 100644 index 0000000..06194f7 --- /dev/null +++ b/src/lib/components/ui/command/command-link-item.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/command/command-list.svelte b/src/lib/components/ui/command/command-list.svelte new file mode 100644 index 0000000..2fdc5ea --- /dev/null +++ b/src/lib/components/ui/command/command-list.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/command/command-separator.svelte b/src/lib/components/ui/command/command-separator.svelte new file mode 100644 index 0000000..d1f1a24 --- /dev/null +++ b/src/lib/components/ui/command/command-separator.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/lib/components/ui/command/command-shortcut.svelte b/src/lib/components/ui/command/command-shortcut.svelte new file mode 100644 index 0000000..4135b29 --- /dev/null +++ b/src/lib/components/ui/command/command-shortcut.svelte @@ -0,0 +1,20 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/command/command.svelte b/src/lib/components/ui/command/command.svelte new file mode 100644 index 0000000..f2583db --- /dev/null +++ b/src/lib/components/ui/command/command.svelte @@ -0,0 +1,18 @@ + + + diff --git a/src/lib/components/ui/command/index.ts b/src/lib/components/ui/command/index.ts new file mode 100644 index 0000000..4af3994 --- /dev/null +++ b/src/lib/components/ui/command/index.ts @@ -0,0 +1,43 @@ +import { Command as CommandPrimitive } from 'bits-ui'; + +import Root from './command.svelte'; +import Dialog from './command-dialog.svelte'; +import Empty from './command-empty.svelte'; +import Group from './command-group.svelte'; +import Item from './command-item.svelte'; +import Input from './command-input.svelte'; +import List from './command-list.svelte'; +import Separator from './command-separator.svelte'; +import Shortcut from './command-shortcut.svelte'; +import LinkItem from './command-link-item.svelte'; + +const Loading: typeof CommandPrimitive.Loading = CommandPrimitive.Loading; +const Viewport: typeof CommandPrimitive.Viewport = CommandPrimitive.Viewport; + +export { + Root, + Dialog, + Empty, + Group, + Item, + LinkItem, + Input, + List, + Separator, + Shortcut, + Loading, + Viewport, + // + Root as Command, + Dialog as CommandDialog, + Empty as CommandEmpty, + Group as CommandGroup, + Item as CommandItem, + LinkItem as CommandLinkItem, + Input as CommandInput, + List as CommandList, + Separator as CommandSeparator, + Shortcut as CommandShortcut, + Loading as CommandLoading, + Viewport as CommandViewport +}; diff --git a/src/lib/components/ui/copy-button/copy-button.svelte b/src/lib/components/ui/copy-button/copy-button.svelte new file mode 100644 index 0000000..dfe208e --- /dev/null +++ b/src/lib/components/ui/copy-button/copy-button.svelte @@ -0,0 +1,73 @@ + + + + + diff --git a/src/lib/components/ui/copy-button/index.ts b/src/lib/components/ui/copy-button/index.ts new file mode 100644 index 0000000..b310ad9 --- /dev/null +++ b/src/lib/components/ui/copy-button/index.ts @@ -0,0 +1,7 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +import CopyButton from './copy-button.svelte'; + +export { CopyButton }; diff --git a/src/lib/components/ui/dialog/dialog-content.svelte b/src/lib/components/ui/dialog/dialog-content.svelte new file mode 100644 index 0000000..929f954 --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-content.svelte @@ -0,0 +1,42 @@ + + + + + + {@render children?.()} + {#if !hideClose} + + + Close + + {/if} + + diff --git a/src/lib/components/ui/dialog/dialog-description.svelte b/src/lib/components/ui/dialog/dialog-description.svelte new file mode 100644 index 0000000..c8ee6a0 --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-description.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/dialog/dialog-footer.svelte b/src/lib/components/ui/dialog/dialog-footer.svelte new file mode 100644 index 0000000..6c0e68d --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-footer.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/dialog/dialog-header.svelte b/src/lib/components/ui/dialog/dialog-header.svelte new file mode 100644 index 0000000..ce01f3b --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-header.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/dialog/dialog-overlay.svelte b/src/lib/components/ui/dialog/dialog-overlay.svelte new file mode 100644 index 0000000..2d96417 --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-overlay.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/dialog/dialog-title.svelte b/src/lib/components/ui/dialog/dialog-title.svelte new file mode 100644 index 0000000..e20bce1 --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-title.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/dialog/index.ts b/src/lib/components/ui/dialog/index.ts new file mode 100644 index 0000000..5421464 --- /dev/null +++ b/src/lib/components/ui/dialog/index.ts @@ -0,0 +1,37 @@ +import { Dialog as DialogPrimitive } from 'bits-ui'; + +import Title from './dialog-title.svelte'; +import Footer from './dialog-footer.svelte'; +import Header from './dialog-header.svelte'; +import Overlay from './dialog-overlay.svelte'; +import Content from './dialog-content.svelte'; +import Description from './dialog-description.svelte'; + +const Root: typeof DialogPrimitive.Root = DialogPrimitive.Root; +const Trigger: typeof DialogPrimitive.Trigger = DialogPrimitive.Trigger; +const Close: typeof DialogPrimitive.Close = DialogPrimitive.Close; +const Portal: typeof DialogPrimitive.Portal = DialogPrimitive.Portal; + +export { + Root, + Title, + Portal, + Footer, + Header, + Trigger, + Overlay, + Content, + Description, + Close, + // + Root as Dialog, + Title as DialogTitle, + Portal as DialogPortal, + Footer as DialogFooter, + Header as DialogHeader, + Trigger as DialogTrigger, + Overlay as DialogOverlay, + Content as DialogContent, + Description as DialogDescription, + Close as DialogClose +}; diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte new file mode 100644 index 0000000..fd4b9bc --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte @@ -0,0 +1,40 @@ + + + + {#snippet children({ checked, indeterminate })} + + {#if indeterminate} + + {:else} + + {/if} + + {@render childrenProp?.()} + {/snippet} + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte new file mode 100644 index 0000000..d50ffaa --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte @@ -0,0 +1,27 @@ + + + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte new file mode 100644 index 0000000..f9769a6 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte new file mode 100644 index 0000000..cc16784 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte @@ -0,0 +1,23 @@ + + +svg]:size-4 [&>svg]:shrink-0', + inset && 'pl-8', + className + )} + {...restProps} +/> diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte new file mode 100644 index 0000000..523f7ee --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte @@ -0,0 +1,23 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte new file mode 100644 index 0000000..971adfa --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte @@ -0,0 +1,30 @@ + + + + {#snippet children({ checked })} + + {#if checked} + + {/if} + + {@render childrenProp?.({ checked })} + {/snippet} + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte new file mode 100644 index 0000000..978fced --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte new file mode 100644 index 0000000..c750062 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte @@ -0,0 +1,20 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte new file mode 100644 index 0000000..1421b16 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte new file mode 100644 index 0000000..df9467b --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte @@ -0,0 +1,28 @@ + + + + {@render children?.()} + + diff --git a/src/lib/components/ui/dropdown-menu/index.ts b/src/lib/components/ui/dropdown-menu/index.ts new file mode 100644 index 0000000..85c8b9d --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/index.ts @@ -0,0 +1,50 @@ +import { DropdownMenu as DropdownMenuPrimitive } from 'bits-ui'; +import CheckboxItem from './dropdown-menu-checkbox-item.svelte'; +import Content from './dropdown-menu-content.svelte'; +import GroupHeading from './dropdown-menu-group-heading.svelte'; +import Item from './dropdown-menu-item.svelte'; +import Label from './dropdown-menu-label.svelte'; +import RadioItem from './dropdown-menu-radio-item.svelte'; +import Separator from './dropdown-menu-separator.svelte'; +import Shortcut from './dropdown-menu-shortcut.svelte'; +import SubContent from './dropdown-menu-sub-content.svelte'; +import SubTrigger from './dropdown-menu-sub-trigger.svelte'; + +const Sub = DropdownMenuPrimitive.Sub; +const Root = DropdownMenuPrimitive.Root; +const Trigger = DropdownMenuPrimitive.Trigger; +const Group = DropdownMenuPrimitive.Group; +const RadioGroup = DropdownMenuPrimitive.RadioGroup; + +export { + CheckboxItem, + Content, + Root as DropdownMenu, + CheckboxItem as DropdownMenuCheckboxItem, + Content as DropdownMenuContent, + Group as DropdownMenuGroup, + GroupHeading as DropdownMenuGroupHeading, + Item as DropdownMenuItem, + Label as DropdownMenuLabel, + RadioGroup as DropdownMenuRadioGroup, + RadioItem as DropdownMenuRadioItem, + Separator as DropdownMenuSeparator, + Shortcut as DropdownMenuShortcut, + Sub as DropdownMenuSub, + SubContent as DropdownMenuSubContent, + SubTrigger as DropdownMenuSubTrigger, + Trigger as DropdownMenuTrigger, + Group, + GroupHeading, + Item, + Label, + RadioGroup, + RadioItem, + Root, + Separator, + Shortcut, + Sub, + SubContent, + SubTrigger, + Trigger +}; diff --git a/src/lib/components/ui/file-icon/file-icon.svelte b/src/lib/components/ui/file-icon/file-icon.svelte new file mode 100644 index 0000000..454f7f3 --- /dev/null +++ b/src/lib/components/ui/file-icon/file-icon.svelte @@ -0,0 +1,40 @@ + + +{#if extension === '.svelte'} + +{:else if extension === '.ts'} + +{:else if extension === '.js'} + +{:else if extension === '.jsx'} + +{:else if extension === '.tsx'} + +{:else if extension === '.vue'} + +{:else if extension === '.html'} + +{:else if extension === '.json' || extension === '.jsonc'} + +{:else if extension === '.yml' || extension === '.yaml'} + +{:else if extension === '.css'} + +{:else if extension === '.sass' || extension === 'scss'} + +{:else if extension === '.svg'} + +{:else} + {@render fallback?.()} +{/if} diff --git a/src/lib/components/ui/file-icon/index.ts b/src/lib/components/ui/file-icon/index.ts new file mode 100644 index 0000000..b889bbd --- /dev/null +++ b/src/lib/components/ui/file-icon/index.ts @@ -0,0 +1 @@ +export { default as FileIcon } from './file-icon.svelte'; diff --git a/src/lib/components/ui/input/index.ts b/src/lib/components/ui/input/index.ts new file mode 100644 index 0000000..15c0933 --- /dev/null +++ b/src/lib/components/ui/input/index.ts @@ -0,0 +1,7 @@ +import Root from './input.svelte'; + +export { + Root, + // + Root as Input +}; diff --git a/src/lib/components/ui/input/input.svelte b/src/lib/components/ui/input/input.svelte new file mode 100644 index 0000000..e800430 --- /dev/null +++ b/src/lib/components/ui/input/input.svelte @@ -0,0 +1,46 @@ + + +{#if type === 'file'} + +{:else} + +{/if} diff --git a/src/lib/components/ui/kbd/index.ts b/src/lib/components/ui/kbd/index.ts new file mode 100644 index 0000000..4b4c7cf --- /dev/null +++ b/src/lib/components/ui/kbd/index.ts @@ -0,0 +1,7 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +import Kbd from './kbd.svelte'; + +export { Kbd }; diff --git a/src/lib/components/ui/kbd/kbd.svelte b/src/lib/components/ui/kbd/kbd.svelte new file mode 100644 index 0000000..f16e562 --- /dev/null +++ b/src/lib/components/ui/kbd/kbd.svelte @@ -0,0 +1,42 @@ + + + + + + {@render children()} + diff --git a/src/lib/components/ui/label/index.ts b/src/lib/components/ui/label/index.ts new file mode 100644 index 0000000..808d141 --- /dev/null +++ b/src/lib/components/ui/label/index.ts @@ -0,0 +1,7 @@ +import Root from './label.svelte'; + +export { + Root, + // + Root as Label +}; diff --git a/src/lib/components/ui/label/label.svelte b/src/lib/components/ui/label/label.svelte new file mode 100644 index 0000000..bf9af13 --- /dev/null +++ b/src/lib/components/ui/label/label.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/light-switch/index.ts b/src/lib/components/ui/light-switch/index.ts new file mode 100644 index 0000000..016eb5f --- /dev/null +++ b/src/lib/components/ui/light-switch/index.ts @@ -0,0 +1,7 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +import LightSwitch from './light-switch.svelte'; + +export { LightSwitch }; diff --git a/src/lib/components/ui/light-switch/light-switch.svelte b/src/lib/components/ui/light-switch/light-switch.svelte new file mode 100644 index 0000000..d3a30b3 --- /dev/null +++ b/src/lib/components/ui/light-switch/light-switch.svelte @@ -0,0 +1,26 @@ + + + + + diff --git a/src/lib/components/ui/pagination/index.ts b/src/lib/components/ui/pagination/index.ts new file mode 100644 index 0000000..155c2e1 --- /dev/null +++ b/src/lib/components/ui/pagination/index.ts @@ -0,0 +1,24 @@ +import Root from './pagination.svelte'; +import Content from './pagination-content.svelte'; +import Item from './pagination-item.svelte'; +import Link from './pagination-link.svelte'; +import PrevButton from './pagination-prev-button.svelte'; +import NextButton from './pagination-next-button.svelte'; +import Ellipsis from './pagination-ellipsis.svelte'; +export { + Root, + Content, + Item, + Link, + PrevButton, + NextButton, + Ellipsis, + // + Root as Pagination, + Content as PaginationContent, + Item as PaginationItem, + Link as PaginationLink, + PrevButton as PaginationPrevButton, + NextButton as PaginationNextButton, + Ellipsis as PaginationEllipsis +}; diff --git a/src/lib/components/ui/pagination/pagination-content.svelte b/src/lib/components/ui/pagination/pagination-content.svelte new file mode 100644 index 0000000..93bbf29 --- /dev/null +++ b/src/lib/components/ui/pagination/pagination-content.svelte @@ -0,0 +1,16 @@ + + +
    + {@render children?.()} +
diff --git a/src/lib/components/ui/pagination/pagination-ellipsis.svelte b/src/lib/components/ui/pagination/pagination-ellipsis.svelte new file mode 100644 index 0000000..f680e65 --- /dev/null +++ b/src/lib/components/ui/pagination/pagination-ellipsis.svelte @@ -0,0 +1,22 @@ + + + diff --git a/src/lib/components/ui/pagination/pagination-item.svelte b/src/lib/components/ui/pagination/pagination-item.svelte new file mode 100644 index 0000000..349098c --- /dev/null +++ b/src/lib/components/ui/pagination/pagination-item.svelte @@ -0,0 +1,14 @@ + + +
  • + {@render children?.()} +
  • diff --git a/src/lib/components/ui/pagination/pagination-link.svelte b/src/lib/components/ui/pagination/pagination-link.svelte new file mode 100644 index 0000000..1f080ef --- /dev/null +++ b/src/lib/components/ui/pagination/pagination-link.svelte @@ -0,0 +1,38 @@ + + +{#snippet Fallback()} + {page.value} +{/snippet} + + diff --git a/src/lib/components/ui/pagination/pagination-next-button.svelte b/src/lib/components/ui/pagination/pagination-next-button.svelte new file mode 100644 index 0000000..7c1165f --- /dev/null +++ b/src/lib/components/ui/pagination/pagination-next-button.svelte @@ -0,0 +1,25 @@ + + +{#snippet Fallback()} + Next + +{/snippet} + + diff --git a/src/lib/components/ui/pagination/pagination-prev-button.svelte b/src/lib/components/ui/pagination/pagination-prev-button.svelte new file mode 100644 index 0000000..3665e06 --- /dev/null +++ b/src/lib/components/ui/pagination/pagination-prev-button.svelte @@ -0,0 +1,25 @@ + + +{#snippet Fallback()} + Previous + +{/snippet} + + diff --git a/src/lib/components/ui/pagination/pagination.svelte b/src/lib/components/ui/pagination/pagination.svelte new file mode 100644 index 0000000..afb3b9b --- /dev/null +++ b/src/lib/components/ui/pagination/pagination.svelte @@ -0,0 +1,24 @@ + + + diff --git a/src/lib/components/ui/pm-command/index.ts b/src/lib/components/ui/pm-command/index.ts new file mode 100644 index 0000000..318f53c --- /dev/null +++ b/src/lib/components/ui/pm-command/index.ts @@ -0,0 +1,7 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +import PMCommand from './pm-command.svelte'; + +export { PMCommand }; diff --git a/src/lib/components/ui/pm-command/pm-command.svelte b/src/lib/components/ui/pm-command/pm-command.svelte new file mode 100644 index 0000000..8267aec --- /dev/null +++ b/src/lib/components/ui/pm-command/pm-command.svelte @@ -0,0 +1,82 @@ + + + + +
    +
    +
    + {#each agents as pm (pm)} + + {/each} +
    + + {#snippet icon()} + + {/snippet} + +
    +
    + + {commandText} + +
    +
    + + diff --git a/src/lib/components/ui/popover/index.ts b/src/lib/components/ui/popover/index.ts new file mode 100644 index 0000000..5db432e --- /dev/null +++ b/src/lib/components/ui/popover/index.ts @@ -0,0 +1,17 @@ +import { Popover as PopoverPrimitive } from 'bits-ui'; +import Content from './popover-content.svelte'; +const Root = PopoverPrimitive.Root; +const Trigger = PopoverPrimitive.Trigger; +const Close = PopoverPrimitive.Close; + +export { + Root, + Content, + Trigger, + Close, + // + Root as Popover, + Content as PopoverContent, + Trigger as PopoverTrigger, + Close as PopoverClose +}; diff --git a/src/lib/components/ui/popover/popover-content.svelte b/src/lib/components/ui/popover/popover-content.svelte new file mode 100644 index 0000000..583ed09 --- /dev/null +++ b/src/lib/components/ui/popover/popover-content.svelte @@ -0,0 +1,28 @@ + + + + + diff --git a/src/lib/components/ui/search/index.ts b/src/lib/components/ui/search/index.ts new file mode 100644 index 0000000..15aa650 --- /dev/null +++ b/src/lib/components/ui/search/index.ts @@ -0,0 +1,3 @@ +import Search from './search.svelte'; + +export { Search }; diff --git a/src/lib/components/ui/search/search.svelte b/src/lib/components/ui/search/search.svelte new file mode 100644 index 0000000..9bd1848 --- /dev/null +++ b/src/lib/components/ui/search/search.svelte @@ -0,0 +1,69 @@ + + + + + +
    + {#if searching} +
    + +
    + {/if} +
    +
    diff --git a/src/lib/components/ui/select/index.ts b/src/lib/components/ui/select/index.ts new file mode 100644 index 0000000..e9de6b0 --- /dev/null +++ b/src/lib/components/ui/select/index.ts @@ -0,0 +1,34 @@ +import { Select as SelectPrimitive } from 'bits-ui'; + +import GroupHeading from './select-group-heading.svelte'; +import Item from './select-item.svelte'; +import Content from './select-content.svelte'; +import Trigger from './select-trigger.svelte'; +import Separator from './select-separator.svelte'; +import ScrollDownButton from './select-scroll-down-button.svelte'; +import ScrollUpButton from './select-scroll-up-button.svelte'; + +const Root = SelectPrimitive.Root; +const Group = SelectPrimitive.Group; + +export { + Root, + Item, + Group, + GroupHeading, + Content, + Trigger, + Separator, + ScrollDownButton, + ScrollUpButton, + // + Root as Select, + Item as SelectItem, + Group as SelectGroup, + GroupHeading as SelectGroupHeading, + Content as SelectContent, + Trigger as SelectTrigger, + Separator as SelectSeparator, + ScrollDownButton as SelectScrollDownButton, + ScrollUpButton as SelectScrollUpButton +}; diff --git a/src/lib/components/ui/select/select-content.svelte b/src/lib/components/ui/select/select-content.svelte new file mode 100644 index 0000000..bdb0fe7 --- /dev/null +++ b/src/lib/components/ui/select/select-content.svelte @@ -0,0 +1,38 @@ + + + + + + + {@render children?.()} + + + + diff --git a/src/lib/components/ui/select/select-group-heading.svelte b/src/lib/components/ui/select/select-group-heading.svelte new file mode 100644 index 0000000..7f0de7c --- /dev/null +++ b/src/lib/components/ui/select/select-group-heading.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/select/select-item.svelte b/src/lib/components/ui/select/select-item.svelte new file mode 100644 index 0000000..13af377 --- /dev/null +++ b/src/lib/components/ui/select/select-item.svelte @@ -0,0 +1,37 @@ + + + + {#snippet children({ selected, highlighted })} + + {#if selected} + + {/if} + + {#if childrenProp} + {@render childrenProp({ selected, highlighted })} + {:else} + {label || value} + {/if} + {/snippet} + diff --git a/src/lib/components/ui/select/select-scroll-down-button.svelte b/src/lib/components/ui/select/select-scroll-down-button.svelte new file mode 100644 index 0000000..b3fc674 --- /dev/null +++ b/src/lib/components/ui/select/select-scroll-down-button.svelte @@ -0,0 +1,19 @@ + + + + + diff --git a/src/lib/components/ui/select/select-scroll-up-button.svelte b/src/lib/components/ui/select/select-scroll-up-button.svelte new file mode 100644 index 0000000..d6058fe --- /dev/null +++ b/src/lib/components/ui/select/select-scroll-up-button.svelte @@ -0,0 +1,19 @@ + + + + + diff --git a/src/lib/components/ui/select/select-separator.svelte b/src/lib/components/ui/select/select-separator.svelte new file mode 100644 index 0000000..e0846af --- /dev/null +++ b/src/lib/components/ui/select/select-separator.svelte @@ -0,0 +1,13 @@ + + + diff --git a/src/lib/components/ui/select/select-trigger.svelte b/src/lib/components/ui/select/select-trigger.svelte new file mode 100644 index 0000000..820e382 --- /dev/null +++ b/src/lib/components/ui/select/select-trigger.svelte @@ -0,0 +1,24 @@ + + +span]:line-clamp-1', + className + )} + {...restProps} +> + {@render children?.()} + + diff --git a/src/lib/components/ui/separator/index.ts b/src/lib/components/ui/separator/index.ts new file mode 100644 index 0000000..768efac --- /dev/null +++ b/src/lib/components/ui/separator/index.ts @@ -0,0 +1,7 @@ +import Root from './separator.svelte'; + +export { + Root, + // + Root as Separator +}; diff --git a/src/lib/components/ui/separator/separator.svelte b/src/lib/components/ui/separator/separator.svelte new file mode 100644 index 0000000..76b5bad --- /dev/null +++ b/src/lib/components/ui/separator/separator.svelte @@ -0,0 +1,22 @@ + + + diff --git a/src/lib/components/ui/sheet/index.ts b/src/lib/components/ui/sheet/index.ts new file mode 100644 index 0000000..d315263 --- /dev/null +++ b/src/lib/components/ui/sheet/index.ts @@ -0,0 +1,37 @@ +import { Dialog as SheetPrimitive } from 'bits-ui'; + +import Overlay from './sheet-overlay.svelte'; +import Content from './sheet-content.svelte'; +import Header from './sheet-header.svelte'; +import Footer from './sheet-footer.svelte'; +import Title from './sheet-title.svelte'; +import Description from './sheet-description.svelte'; + +const Root = SheetPrimitive.Root; +const Close = SheetPrimitive.Close; +const Trigger = SheetPrimitive.Trigger; +const Portal = SheetPrimitive.Portal; + +export { + Root, + Close, + Trigger, + Portal, + Overlay, + Content, + Header, + Footer, + Title, + Description, + // + Root as Sheet, + Close as SheetClose, + Trigger as SheetTrigger, + Portal as SheetPortal, + Overlay as SheetOverlay, + Content as SheetContent, + Header as SheetHeader, + Footer as SheetFooter, + Title as SheetTitle, + Description as SheetDescription +}; diff --git a/src/lib/components/ui/sheet/sheet-content.svelte b/src/lib/components/ui/sheet/sheet-content.svelte new file mode 100644 index 0000000..8d324d6 --- /dev/null +++ b/src/lib/components/ui/sheet/sheet-content.svelte @@ -0,0 +1,56 @@ + + + + + + + + {@render children?.()} + + + Close + + + diff --git a/src/lib/components/ui/sheet/sheet-description.svelte b/src/lib/components/ui/sheet/sheet-description.svelte new file mode 100644 index 0000000..83574ad --- /dev/null +++ b/src/lib/components/ui/sheet/sheet-description.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/sheet/sheet-footer.svelte b/src/lib/components/ui/sheet/sheet-footer.svelte new file mode 100644 index 0000000..6c0e68d --- /dev/null +++ b/src/lib/components/ui/sheet/sheet-footer.svelte @@ -0,0 +1,20 @@ + + +
    + {@render children?.()} +
    diff --git a/src/lib/components/ui/sheet/sheet-header.svelte b/src/lib/components/ui/sheet/sheet-header.svelte new file mode 100644 index 0000000..691cbee --- /dev/null +++ b/src/lib/components/ui/sheet/sheet-header.svelte @@ -0,0 +1,20 @@ + + +
    + {@render children?.()} +
    diff --git a/src/lib/components/ui/sheet/sheet-overlay.svelte b/src/lib/components/ui/sheet/sheet-overlay.svelte new file mode 100644 index 0000000..3cfbef4 --- /dev/null +++ b/src/lib/components/ui/sheet/sheet-overlay.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/sheet/sheet-title.svelte b/src/lib/components/ui/sheet/sheet-title.svelte new file mode 100644 index 0000000..7696932 --- /dev/null +++ b/src/lib/components/ui/sheet/sheet-title.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/skeleton/index.ts b/src/lib/components/ui/skeleton/index.ts new file mode 100644 index 0000000..3120ce1 --- /dev/null +++ b/src/lib/components/ui/skeleton/index.ts @@ -0,0 +1,7 @@ +import Root from './skeleton.svelte'; + +export { + Root, + // + Root as Skeleton +}; diff --git a/src/lib/components/ui/skeleton/skeleton.svelte b/src/lib/components/ui/skeleton/skeleton.svelte new file mode 100644 index 0000000..0b62163 --- /dev/null +++ b/src/lib/components/ui/skeleton/skeleton.svelte @@ -0,0 +1,17 @@ + + +
    diff --git a/src/lib/components/ui/snippet/index.ts b/src/lib/components/ui/snippet/index.ts new file mode 100644 index 0000000..b9a4cdb --- /dev/null +++ b/src/lib/components/ui/snippet/index.ts @@ -0,0 +1,7 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +import Snippet from './snippet.svelte'; + +export { Snippet }; diff --git a/src/lib/components/ui/snippet/snippet.svelte b/src/lib/components/ui/snippet/snippet.svelte new file mode 100644 index 0000000..766c564 --- /dev/null +++ b/src/lib/components/ui/snippet/snippet.svelte @@ -0,0 +1,52 @@ + + + + +
    + {#if typeof text == 'string'} +
    +			{text}
    +		
    + {:else} + {#each text as line, i (i)} +
    +			{line}
    +		
    + {/each} + {/if} + + +
    diff --git a/src/lib/components/ui/table/index.ts b/src/lib/components/ui/table/index.ts new file mode 100644 index 0000000..99239ae --- /dev/null +++ b/src/lib/components/ui/table/index.ts @@ -0,0 +1,28 @@ +import Root from './table.svelte'; +import Body from './table-body.svelte'; +import Caption from './table-caption.svelte'; +import Cell from './table-cell.svelte'; +import Footer from './table-footer.svelte'; +import Head from './table-head.svelte'; +import Header from './table-header.svelte'; +import Row from './table-row.svelte'; + +export { + Root, + Body, + Caption, + Cell, + Footer, + Head, + Header, + Row, + // + Root as Table, + Body as TableBody, + Caption as TableCaption, + Cell as TableCell, + Footer as TableFooter, + Head as TableHead, + Header as TableHeader, + Row as TableRow +}; diff --git a/src/lib/components/ui/table/table-body.svelte b/src/lib/components/ui/table/table-body.svelte new file mode 100644 index 0000000..6200964 --- /dev/null +++ b/src/lib/components/ui/table/table-body.svelte @@ -0,0 +1,16 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/table/table-caption.svelte b/src/lib/components/ui/table/table-caption.svelte new file mode 100644 index 0000000..30c9f64 --- /dev/null +++ b/src/lib/components/ui/table/table-caption.svelte @@ -0,0 +1,16 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/table/table-cell.svelte b/src/lib/components/ui/table/table-cell.svelte new file mode 100644 index 0000000..d6d2415 --- /dev/null +++ b/src/lib/components/ui/table/table-cell.svelte @@ -0,0 +1,23 @@ + + +[role=checkbox]]:translate-y-[2px]', + className + )} + {...restProps} +> + {@render children?.()} + diff --git a/src/lib/components/ui/table/table-footer.svelte b/src/lib/components/ui/table/table-footer.svelte new file mode 100644 index 0000000..ea724cb --- /dev/null +++ b/src/lib/components/ui/table/table-footer.svelte @@ -0,0 +1,16 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/table/table-head.svelte b/src/lib/components/ui/table/table-head.svelte new file mode 100644 index 0000000..d9db985 --- /dev/null +++ b/src/lib/components/ui/table/table-head.svelte @@ -0,0 +1,23 @@ + + +[role=checkbox]]:translate-y-[2px]', + className + )} + {...restProps} +> + {@render children?.()} + diff --git a/src/lib/components/ui/table/table-header.svelte b/src/lib/components/ui/table/table-header.svelte new file mode 100644 index 0000000..e5883fe --- /dev/null +++ b/src/lib/components/ui/table/table-header.svelte @@ -0,0 +1,16 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/table/table-row.svelte b/src/lib/components/ui/table/table-row.svelte new file mode 100644 index 0000000..b57bcaa --- /dev/null +++ b/src/lib/components/ui/table/table-row.svelte @@ -0,0 +1,23 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/table/table.svelte b/src/lib/components/ui/table/table.svelte new file mode 100644 index 0000000..bc8d74f --- /dev/null +++ b/src/lib/components/ui/table/table.svelte @@ -0,0 +1,18 @@ + + +
    + + {@render children?.()} +
    +
    diff --git a/src/lib/components/ui/tabs/index.ts b/src/lib/components/ui/tabs/index.ts new file mode 100644 index 0000000..00ecd77 --- /dev/null +++ b/src/lib/components/ui/tabs/index.ts @@ -0,0 +1,18 @@ +import { Tabs as TabsPrimitive } from 'bits-ui'; +import Content from './tabs-content.svelte'; +import List from './tabs-list.svelte'; +import Trigger from './tabs-trigger.svelte'; + +const Root = TabsPrimitive.Root; + +export { + Root, + Content, + List, + Trigger, + // + Root as Tabs, + Content as TabsContent, + List as TabsList, + Trigger as TabsTrigger +}; diff --git a/src/lib/components/ui/tabs/tabs-content.svelte b/src/lib/components/ui/tabs/tabs-content.svelte new file mode 100644 index 0000000..57256e4 --- /dev/null +++ b/src/lib/components/ui/tabs/tabs-content.svelte @@ -0,0 +1,21 @@ + + + diff --git a/src/lib/components/ui/tabs/tabs-list.svelte b/src/lib/components/ui/tabs/tabs-list.svelte new file mode 100644 index 0000000..5d07931 --- /dev/null +++ b/src/lib/components/ui/tabs/tabs-list.svelte @@ -0,0 +1,15 @@ + + + diff --git a/src/lib/components/ui/tabs/tabs-trigger.svelte b/src/lib/components/ui/tabs/tabs-trigger.svelte new file mode 100644 index 0000000..7215962 --- /dev/null +++ b/src/lib/components/ui/tabs/tabs-trigger.svelte @@ -0,0 +1,21 @@ + + + diff --git a/src/lib/components/ui/terminal/index.ts b/src/lib/components/ui/terminal/index.ts new file mode 100644 index 0000000..6ae7770 --- /dev/null +++ b/src/lib/components/ui/terminal/index.ts @@ -0,0 +1,11 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +import Loop from './terminal-loop.svelte'; +import Root from './terminal.svelte'; +import TypingAnimation from './terminal-typing-animation.svelte'; +import AnimatedSpan from './terminal-animated-span.svelte'; +import Loading from './terminal-loading.svelte'; + +export { Loop, Root, TypingAnimation, AnimatedSpan, Loading }; diff --git a/src/lib/components/ui/terminal/terminal-animated-span.svelte b/src/lib/components/ui/terminal/terminal-animated-span.svelte new file mode 100644 index 0000000..cd75e2b --- /dev/null +++ b/src/lib/components/ui/terminal/terminal-animated-span.svelte @@ -0,0 +1,39 @@ + + + + +{#if playAnimation} + + {@render children?.()} + +{/if} diff --git a/src/lib/components/ui/terminal/terminal-loading.svelte b/src/lib/components/ui/terminal/terminal-loading.svelte new file mode 100644 index 0000000..12155c5 --- /dev/null +++ b/src/lib/components/ui/terminal/terminal-loading.svelte @@ -0,0 +1,75 @@ + + + + +{#if playAnimation && !complete} + + {frames[frameIndex]} + {loadingMessage} + +{:else if playAnimation} + + {check} + {completeMessage} + +{/if} diff --git a/src/lib/components/ui/terminal/terminal-loop.svelte b/src/lib/components/ui/terminal/terminal-loop.svelte new file mode 100644 index 0000000..6b8a575 --- /dev/null +++ b/src/lib/components/ui/terminal/terminal-loop.svelte @@ -0,0 +1,31 @@ + + + + +{#key loopIndex} + {@render children?.()} +{/key} diff --git a/src/lib/components/ui/terminal/terminal-typing-animation.svelte b/src/lib/components/ui/terminal/terminal-typing-animation.svelte new file mode 100644 index 0000000..0016d19 --- /dev/null +++ b/src/lib/components/ui/terminal/terminal-typing-animation.svelte @@ -0,0 +1,37 @@ + + + + +{#if playAnimation} + animation.onComplete?.() + }} + > + {@render children?.()} + +{/if} diff --git a/src/lib/components/ui/terminal/terminal.svelte b/src/lib/components/ui/terminal/terminal.svelte new file mode 100644 index 0000000..8c466e0 --- /dev/null +++ b/src/lib/components/ui/terminal/terminal.svelte @@ -0,0 +1,35 @@ + + + + + + {@render children?.()} + diff --git a/src/lib/components/ui/terminal/terminal.svelte.ts b/src/lib/components/ui/terminal/terminal.svelte.ts new file mode 100644 index 0000000..9a10578 --- /dev/null +++ b/src/lib/components/ui/terminal/terminal.svelte.ts @@ -0,0 +1,121 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +import { Context } from 'runed'; + +export type Timeout = ReturnType | undefined; + +export type TerminalLoopProps = { + onComplete: () => void; +}; + +export class TerminalLoop { + constructor(readonly opts: TerminalLoopProps) { + this.onComplete = this.onComplete.bind(this); + } + + onComplete() { + this.opts.onComplete(); + } +} + +export type TerminalRootProps = { + delay: number; + speed: number; + onComplete: () => void; +}; + +export class TerminalSession { + #animations: AnimationState[] = $state([]); + #timeout: Timeout; + + constructor( + readonly opts: TerminalRootProps, + readonly loop?: TerminalLoop + ) { + this.onComplete = this.onComplete.bind(this); + } + + play() { + this.#timeout = setTimeout(() => { + this.#animations.sort((a, b) => a.delay - b.delay); + + for (let i = 0; i < this.#animations.length; i++) { + this.#animations[i].timeout = setTimeout(() => { + this.#animations[i].play(this.opts.speed); + + // when the most delayed animation is complete call onComplete + if (i === this.#animations.length - 1) { + this.#animations[i].onComplete = this.onComplete; + } + }, this.#animations[i].delay); + } + }, this.opts.delay); + } + + onComplete() { + this.opts.onComplete?.(); + + this.loop?.onComplete(); + } + + dispose() { + clearTimeout(this.#timeout); + } + + registerAnimation(animation: AnimationState) { + this.#animations.push(animation); + } +} + +export type AnimationStateProps = { + delay: number; + play: (speed: number) => void; +}; + +export class AnimationState { + delay: number; + timeout: Timeout; + onComplete = $state<() => void>(); + + constructor( + readonly rootState: TerminalSession, + readonly opts: AnimationStateProps + ) { + this.delay = opts.delay; + + rootState.registerAnimation(this); + } + + play(speed: number) { + this.opts.play(speed); + } + + dispose() { + clearTimeout(this.timeout); + } +} + +const TerminalLoopContext = new Context('Terminal.Loop'); +const TerminalRootContext = new Context('Terminal.Root'); + +export const useTerminalLoop = (props: TerminalLoopProps) => { + return TerminalLoopContext.set(new TerminalLoop(props)); +}; + +export const useTerminalRoot = (props: TerminalRootProps) => { + let loopState: TerminalLoop | undefined = undefined; + + try { + loopState = TerminalLoopContext.get(); + } catch { + // do nothing we don't care + } + + return TerminalRootContext.set(new TerminalSession(props, loopState)); +}; + +export const useAnimation = (props: AnimationStateProps) => { + return new AnimationState(TerminalRootContext.get(), props); +}; diff --git a/src/lib/components/ui/terminal/types.ts b/src/lib/components/ui/terminal/types.ts new file mode 100644 index 0000000..9defee6 --- /dev/null +++ b/src/lib/components/ui/terminal/types.ts @@ -0,0 +1,10 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +import type { WithChildren } from 'bits-ui'; + +export type TerminalAnimationProps = WithChildren<{ + delay?: number; + class?: string; +}>; diff --git a/src/lib/components/ui/toc/index.ts b/src/lib/components/ui/toc/index.ts new file mode 100644 index 0000000..0dc9861 --- /dev/null +++ b/src/lib/components/ui/toc/index.ts @@ -0,0 +1,7 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +import Root from './toc.svelte'; + +export { Root }; diff --git a/src/lib/components/ui/toc/toc.svelte b/src/lib/components/ui/toc/toc.svelte new file mode 100644 index 0000000..c3a3167 --- /dev/null +++ b/src/lib/components/ui/toc/toc.svelte @@ -0,0 +1,39 @@ + + + + +
      + {#each toc as heading, i (i)} +
    • + {#if heading.id} + + {heading.label} + + {:else} + {heading.label} + {/if} +
    • + {#if heading.children.length > 0} + + {/if} + {/each} +
    diff --git a/src/lib/components/ui/toggle/index.ts b/src/lib/components/ui/toggle/index.ts new file mode 100644 index 0000000..0f18d3b --- /dev/null +++ b/src/lib/components/ui/toggle/index.ts @@ -0,0 +1,13 @@ +import Root from './toggle.svelte'; +export { + toggleVariants, + type ToggleSize, + type ToggleVariant, + type ToggleVariants +} from './toggle.svelte'; + +export { + Root, + // + Root as Toggle +}; diff --git a/src/lib/components/ui/toggle/toggle.svelte b/src/lib/components/ui/toggle/toggle.svelte new file mode 100644 index 0000000..b460980 --- /dev/null +++ b/src/lib/components/ui/toggle/toggle.svelte @@ -0,0 +1,51 @@ + + + + + diff --git a/src/lib/components/ui/tooltip/index.ts b/src/lib/components/ui/tooltip/index.ts new file mode 100644 index 0000000..034ab20 --- /dev/null +++ b/src/lib/components/ui/tooltip/index.ts @@ -0,0 +1,18 @@ +import { Tooltip as TooltipPrimitive } from 'bits-ui'; +import Content from './tooltip-content.svelte'; + +const Root = TooltipPrimitive.Root; +const Trigger = TooltipPrimitive.Trigger; +const Provider = TooltipPrimitive.Provider; + +export { + Root, + Trigger, + Content, + Provider, + // + Root as Tooltip, + Content as TooltipContent, + Trigger as TooltipTrigger, + Provider as TooltipProvider +}; diff --git a/src/lib/components/ui/tooltip/tooltip-content.svelte b/src/lib/components/ui/tooltip/tooltip-content.svelte new file mode 100644 index 0000000..103e43c --- /dev/null +++ b/src/lib/components/ui/tooltip/tooltip-content.svelte @@ -0,0 +1,21 @@ + + + diff --git a/src/lib/components/ui/window/index.ts b/src/lib/components/ui/window/index.ts new file mode 100644 index 0000000..29f8960 --- /dev/null +++ b/src/lib/components/ui/window/index.ts @@ -0,0 +1,7 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +import Window from './window.svelte'; + +export { Window }; diff --git a/src/lib/components/ui/window/window.svelte b/src/lib/components/ui/window/window.svelte new file mode 100644 index 0000000..01902dd --- /dev/null +++ b/src/lib/components/ui/window/window.svelte @@ -0,0 +1,32 @@ + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    + {@render children?.()} +
    +
    diff --git a/src/lib/context.ts b/src/lib/context.ts new file mode 100644 index 0000000..4660395 --- /dev/null +++ b/src/lib/context.ts @@ -0,0 +1,4 @@ +import { Context } from 'runed'; +import type { UseBoolean } from '$lib/hooks/use-boolean.svelte'; + +export const commandContext = new Context('command-menu-context'); diff --git a/src/lib/docs/cli/add.md b/src/lib/docs/cli/add.md new file mode 100644 index 0000000..59e3086 --- /dev/null +++ b/src/lib/docs/cli/add.md @@ -0,0 +1,167 @@ +--- +title: add +description: Add blocks to your project from a registry. +lastUpdated: 4-10-2025 +--- + +```sh +jsrepo add +``` + +## Usage + +Choose a block to add from the registries in your jsrepo.json file: + +```sh +jsrepo add +``` + +Add a partially qualified block using the registries in your jsrepo.json file: + +```sh +jsrepo add utils/math +``` + +Add a fully qualified block: + +```sh +jsrepo add github/ieedan/std/utils/math +``` + +Include another registry in the blocks list: + +```sh +jsrepo add --repo github/ieedan/std +``` + +## Options + +### `--watermark` + +Include a watermark at the top of added files. (For non-interactive zero-config adds) + +#### Usage + +```sh +jsrepo add --watermark true +``` + +### `--tests` + +Include tests along with the blocks when adding them. (For non-interactive zero-config adds) + +#### Usage + +```sh +jsrepo add --tests true +``` + +### `--formatter` + +Configure the formatter used when adding and updating blocks. (prettier, biome, none) (For non-interactive zero-config adds) + +#### Usage + +```sh +jsrepo add --formatter prettier +``` + +### `--paths` + +Allows you to specify where to install categories. A mirror of the paths functionality in the `jsrepo.json` file. (For non-interactive zero-config adds) + +#### Usage + +```sh +jsrepo add --paths utils=./src/blocks/utils,ui=./src/blocks/ui +``` + +### `-E, --expand` + +Expands the diff past the limit set by `--max-unchanged` so that you can see the entire file. + +#### Usage + +```sh +jsrepo add --expand +``` + +### `--max-unchanged` + +Sets a limit on the maximum unchanged lines to display in a diff before it is collapsed. (default: 3) + +#### Usage + +```sh +jsrepo add --max-unchanged 10 +``` + +### `--repo` + +The repository to download the blocks from. + +#### Usage + +```sh +jsrepo add --repo github/ieedan/std +``` + +### `-A, --allow` + +Allow jsrepo to download code from the provided repo. This skips the initial confirmation prompt when attempting to download a block from a registry not listed in the `jsrepo.json` file. + +#### Usage + +```sh +jsrepo add github/ieedan/std/utils/math --allow +``` + +### `-y, --yes` + +Skips confirmation prompts. (Not including permissions prompts) + +#### Usage + +```sh +jsrepo add --yes +``` + +### `--no-cache` + +Prevents caching the git provider state. Useful if the cache is incorrect due to changing the default branch for a repository or changing a tag into a head or vise versa. + +#### Usage + +```sh +jsrepo add --no-cache +``` + +### `--verbose` + +More verbose logging. (May be used to troubleshoot issues) + +#### Usage + +```sh +jsrepo add --verbose +``` + +### `--cwd` + +Run the current command on the provided directory absolute or relative. + +#### Usage + +```sh +jsrepo add --cwd ./sites/docs +``` + +### `-h, --help` + +Help with the command. + +#### Usage + +```sh +jsrepo add --help +``` diff --git a/src/lib/docs/cli/auth.md b/src/lib/docs/cli/auth.md new file mode 100644 index 0000000..5ae947b --- /dev/null +++ b/src/lib/docs/cli/auth.md @@ -0,0 +1,77 @@ +--- +title: auth +description: Configure access tokens for private registry access and update with AI. +lastUpdated: 4-10-2025 +--- + +```sh +jsrepo auth +``` + +## Usage + +Choose a service and provide a token: + +```sh +jsrepo auth +``` + +Authenticate to a specific service: + +```sh +jsrepo auth github +``` + +Choose a service to logout from: + +```sh +jsrepo auth --logout +``` + +Logout from a specific service: + +```sh +jsrepo auth github --logout +``` + +## Options + +### `--token` + +The token to use for authenticating to your service. + +#### Usage + +```sh +jsrepo auth --token xxxxxxxxxxx +``` + +### `--logout` + +Executes the logout flow. + +#### Usage + +```sh +jsrepo auth --logout +``` + +### `--cwd` + +Run the current command on the provided directory absolute or relative. + +#### Usage + +```sh +jsrepo auth --cwd ./sites/docs +``` + +### `-h, --help` + +Help with the command. + +#### Usage + +```sh +jsrepo add --help +``` diff --git a/src/lib/docs/cli/build.md b/src/lib/docs/cli/build.md new file mode 100644 index 0000000..6814dff --- /dev/null +++ b/src/lib/docs/cli/build.md @@ -0,0 +1,179 @@ +--- +title: build +description: Build your code into a jsrepo registry. +lastUpdated: 4-10-2025 +--- + +```sh +jsrepo build +``` + +## Usage + +The build command builds the specified directories into a `jsrepo-manifest.json` file which **jsrepo** can use to locate blocks in your repository. + +```sh +jsrepo build +``` + +## Options + +### `--dirs` + +The directories containing the categories. Corresponding config key: `dirs` + +#### Usage + +```sh +jsrepo build --dirs ./src ./blocks +``` + +### `--output-dir` + +Directory to copy the `jsrepo-manifest.json` and all required registry files to once the build is complete. This is useful when you want to host your registry on a custom domain from a different directory from where the code actually lives. Corresponding config key: `outputDir` + +#### Usage + +```sh +jsrepo build --output-dir ./static/new-york +``` + +### `--include-blocks` + +Include only the blocks with these names. Corresponding config key: `includeBlocks` + +#### Usage + +```sh +jsrepo build --include-blocks math logger +``` + +### `--include-categories` + +Include only the categories with these names. Corresponding config key: `includeCategories` + +#### Usage + +```sh +jsrepo build --include-categories utils scripts +``` + +### `--exclude-blocks` + +Do not include the blocks with these names. Corresponding config key: `excludeBlocks` + +#### Usage + +```sh +jsrepo build --exclude-blocks math logger +``` + +### `--exclude-categories` + +Do not include the categories with these names. Corresponding config key: `excludeCategories` + +#### Usage + +```sh +jsrepo build --exclude-categories utils scripts +``` + +### `--list-blocks` + +List only the blocks with these names. Corresponding config key: `listBlocks` + +#### Usage + +```sh +jsrepo build --list-blocks math logger +``` + +### `--list-categories` + +List only the categories with these names. Corresponding config key: `listCategories` + +#### Usage + +```sh +jsrepo build --list-categories utils scripts +``` + +### `--do-not-list-blocks` + +Do not list the blocks with these names. Corresponding config key: `doNotListBlocks` + +#### Usage + +```sh +jsrepo build --do-not-list-blocks math logger +``` + +### `--do-not-list-categories` + +Do not list the categories with these names. Corresponding config key: `doNotListCategories` + +#### Usage + +```sh +jsrepo build --do-not-list-categories utils scripts +``` + +### `--exclude-deps` + +Prevent these dependencies from being included in the `jsrepo-manifest.json` file. Corresponding config key: `excludeDeps` + +#### Usage + +```sh +jsrepo build --exclude-deps svelte react +``` + +### `--allow-subdirectories` + +Allow subdirectories to be built. Corresponding config key: `allowSubdirectories` + +#### Usage + +```sh +jsrepo build --allow-subdirectories +``` + +### `--preview` + +Display a preview of the blocks list. Corresponding config key: `preview` + +#### Usage + +```sh +jsrepo build --preview +``` + +### `--verbose` + +More verbose logging. (May be used to troubleshoot issues) + +#### Usage + +```sh +jsrepo build --verbose +``` + +### `--cwd` + +Run the current command on the provided directory absolute or relative. + +#### Usage + +```sh +jsrepo build --cwd ./sites/docs +``` + +### `-h, --help` + +Help with the command. + +#### Usage + +```sh +jsrepo build --help +``` diff --git a/src/lib/docs/cli/exec.md b/src/lib/docs/cli/exec.md new file mode 100644 index 0000000..52d8429 --- /dev/null +++ b/src/lib/docs/cli/exec.md @@ -0,0 +1,113 @@ +--- +title: exec +description: Execute a block as a script with arguments. +lastUpdated: 4-10-2025 +--- + +```sh +jsrepo exec +``` + +## Usage + +Choose a script to execute from the registries in your jsrepo.json file: + +```sh +jsrepo exec +``` + +`x` alias: + +```sh +jsrepo x +``` + +Execute with args: + +```sh +jsrepo exec -- argument --yes +``` + +Execute a partially qualified script using the registries in your jsrepo.json file: + +```sh +jsrepo exec github/ieedan/scripts/general/hello +``` + +Include another registry in the scripts list: + +```sh +jsrepo exec --repo github/ieedan/scripts +``` + +## Options + +### `--` + +`--` is a special option that will cause any args after it to be passed to the script instead of **jsrepo**. + +#### Usage + +```sh +jsrepo exec -- argument --yes +``` + +### `--repo` + +The repository to download the scripts from. + +#### Usage + +```sh +jsrepo exec --repo github/ieedan/scripts +``` + +### `-A, --allow` + +Allow **jsrepo** to download code from the provided repo. This skips the initial confirmation prompt when attempting to download a block from a registry not listed in the `jsrepo.json` file. + +#### Usage + +```sh +jsrepo exec --repo github/ieedan/scripts --allow +``` + +### `--no-cache` + +Prevents caching the git provider state. Useful if the cache is incorrect due to changing the default branch for a repository or changing a tag into a head or vise versa. + +#### Usage + +```sh +jsrepo exec --no-cache +``` + +### `--verbose` + +More verbose logging. (May be used to troubleshoot issues) + +#### Usage + +```sh +jsrepo exec --verbose +``` + +### `--cwd` + +Run the current command on the provided directory absolute or relative. + +#### Usage + +```sh +jsrepo exec --cwd ./sites/docs +``` + +### `-h, --help` + +Help with the command. + +#### Usage + +```sh +jsrepo exec --help +``` diff --git a/src/lib/docs/cli/init.md b/src/lib/docs/cli/init.md new file mode 100644 index 0000000..6eed796 --- /dev/null +++ b/src/lib/docs/cli/init.md @@ -0,0 +1,148 @@ +--- +title: init +description: Initialize a registry or project with jsrepo. +lastUpdated: 4-10-2025 +--- + +```sh +jsrepo init +``` + +## Usage + +Choose to initialize a registry or project: + +```sh +jsrepo init +``` + +Initialize a project: + +```sh +jsrepo init --project +``` + +Initialize a registry: + +```sh +jsrepo init --registry +``` + +Initialize a project with registries: + +```sh +jsrepo init github/ieedan/std +``` + +## Options + +### `--repos` + +Deprecated +The repositories to install the blocks from. (For project setup) + +#### Usage + +```sh +jsrepo init --repos github/ieedan/std github/ieedan/shadcn-svelte-extras +``` + +### `--no-watermark` + +Sets the watermark config key to false. (For project setup) + +#### Usage + +```sh +jsrepo init --no-watermark +``` + +### `--tests` + +Sets the tests config key to true. (For project setup) + +#### Usage + +```sh +jsrepo init --tests +``` + +### `--formatter` + +Configure the formatter used when adding and updating blocks. (prettier, biome) (For project setup) + +#### Usage + +```sh +jsrepo init --formatter prettier +``` + +### `-P, --project` + +Takes you through the steps to initialize a project. + +#### Usage + +```sh +jsrepo init --project +``` + +### `-R, --registry` + +Takes you through the steps to initialize a registry. + +#### Usage + +```sh +jsrepo init --registry +``` + +### `--script` + +The name of the build script. (For registry setup) + +#### Usage + +```sh +jsrepo init --script build:registry +``` + +### `-y, --yes` + +Skips confirmation prompts. (Not including permissions prompts) + +#### Usage + +```sh +jsrepo init --yes +``` + +### `--no-cache` + +Prevents caching the git provider state. Useful if the cache is incorrect due to changing the default branch for a repository or changing a tag into a head or vise versa. + +#### Usage + +```sh +jsrepo init --no-cache +``` + +### `--cwd` + +Run the current command on the provided directory absolute or relative. + +#### Usage + +```sh +jsrepo init --cwd ./packages/blocks +``` + +### `-h, --help` + +Help with the command. + +#### Usage + +```sh +jsrepo init --help +``` diff --git a/src/lib/docs/cli/test.md b/src/lib/docs/cli/test.md new file mode 100644 index 0000000..9165a52 --- /dev/null +++ b/src/lib/docs/cli/test.md @@ -0,0 +1,87 @@ +--- +title: test +description: Test local blocks against their corresponding tests in their source registry. +lastUpdated: 4-10-2025 +--- + +```sh +jsrepo test +``` + +## Usage + +```sh +jsrepo test +``` + +## Options + +### `--repo` + +The repository to download the blocks from. + +#### Usage + +```sh +jsrepo test --repo github/ieedan/std +``` + +### `-A, --allow` + +Allow **jsrepo** to download code from the provided repo. This skips the initial confirmation prompt when attempting to download a block from a registry not listed in the `jsrepo.json` file. + +#### Usage + +```sh +jsrepo test github/ieedan/std/utils/math --allow +``` + +### `--debug` + +Leaves the temp test file around for debugging upon failure. + +#### Usage + +```sh +jsrepo test --debug +``` + +### `--no-cache` + +Prevents caching the git provider state. Useful if the cache is incorrect due to changing the default branch for a repository or changing a tag into a head or vise versa. + +#### Usage + +```sh +jsrepo test --no-cache +``` + +### `--verbose` + +More verbose logging. (May be used to troubleshoot issues) + +#### Usage + +```sh +jsrepo test --verbose +``` + +### `--cwd` + +Run the current command on the provided directory absolute or relative. + +#### Usage + +```sh +jsrepo test --cwd ./sites/docs +``` + +### `-h, --help` + +Help with the command. + +#### Usage + +```sh +jsrepo test --help +``` diff --git a/src/lib/docs/cli/update.md b/src/lib/docs/cli/update.md new file mode 100644 index 0000000..25a2525 --- /dev/null +++ b/src/lib/docs/cli/update.md @@ -0,0 +1,135 @@ +--- +title: update +description: Interactively update your blocks. +lastUpdated: 4-10-2025 +--- + +```sh +jsrepo update +``` + +## Usage + +Choose which blocks to update: + +```sh +jsrepo update +``` + +Update a specific block: + +```sh +jsrepo update utils/math +``` + +## Options + +### `--all` + +Update all installed components. + +#### Usage + +```sh +jsrepo update --all +``` + +### `-E, --expand` + +Expands the diff past the limit set by `--max-unchanged` so that you can see the entire file. + +#### Usage + +```sh +jsrepo update --expand +``` + +### `--max-unchanged` + +Sets a limit on the maximum unchanged lines to display in a diff before it is collapsed. (default: 3) + +#### Usage + +```sh +jsrepo update --max-unchanged 10 +``` + +### `-n, --no` + +Do update any blocks. + +#### Usage + +```sh +jsrepo update --no +``` + +### `--repo` + +The repository to download the blocks from. + +#### Usage + +```sh +jsrepo update --repo github/ieedan/std +``` + +### `-A, --allow` + +Allow **jsrepo** to download code from the provided repo. This skips the initial confirmation prompt when attempting to download a block from a registry not listed in the `jsrepo.json` file. + +#### Usage + +```sh +jsrepo update github/ieedan/std/utils/math --allow +``` + +### `-y, --yes` + +Skips confirmation prompts. (Not including permissions prompts) + +#### Usage + +```sh +jsrepo update --yes +``` + +### `--no-cache` + +Prevents caching the git provider state. Useful if the cache is incorrect due to changing the default branch for a repository or changing a tag into a head or vise versa. + +#### Usage + +```sh +jsrepo update --no-cache +``` + +### `--verbose` + +More verbose logging. (May be used to troubleshoot issues) + +#### Usage + +```sh +jsrepo update --verbose +``` + +### `--cwd` + +Run the current command on the provided directory absolute or relative. + +#### Usage + +```sh +jsrepo update --cwd ./sites/docs +``` + +### `-h, --help` + +Help with the command. + +#### Usage + +```sh +jsrepo update --help +``` diff --git a/src/lib/docs/index.md b/src/lib/docs/index.md new file mode 100644 index 0000000..30ec344 --- /dev/null +++ b/src/lib/docs/index.md @@ -0,0 +1,36 @@ +--- +title: Introduction +description: The best way to reuse your code. +lastUpdated: 4-10-2025 +--- + + + +**jsrepo** is a CLI that takes inspiration from the way that [shadcn/ui](https://ui.shadcn.com) allows you install portable blocks of code. + +The goal of **jsrepo** is to make this method of distributing code simpler and more maintainable. + +It does this by unifying the tooling it takes to build a registry, with the tooling to distribute it. As well as providing a rich feature set to make maintaining that code much easier. + +### FAQ + + + + +Who owns the registry? + + +You! Or someone else you know. Anyone can create a registry to be used by everyone! + + + + +Why would I use this instead of the shadcn cli? + + +jsrepo has features like interactive updates and automated registry building that make it extremely pleasant to work with! + + + diff --git a/src/lib/docs/index.ts b/src/lib/docs/index.ts new file mode 100644 index 0000000..9906c5c --- /dev/null +++ b/src/lib/docs/index.ts @@ -0,0 +1,52 @@ +import type { Component } from 'svelte'; +import { docs, type Docs } from '$content/index'; + +const base = '/src/lib/docs/'; + +export async function getDoc(slug: string) { + const modules = import.meta.glob('/src/lib/docs/**/*.md'); + const doc = matchDoc(slug, modules); + const component = (await doc?.resolver())?.default; + + const metadata = docs.find((d) => d.path === slug); + + if (!metadata || !component) { + return undefined; + } + + return { + ...metadata, + component + }; +} + +type Modules = Record Promise>; +type Resolver = () => Promise; + +type DocFile = { + default: Component; + metadata: Docs; +}; + +function matchDoc( + slug: string, + modules: Modules +): { path: string; resolver: Resolver } | undefined { + for (const [path, resolver] of Object.entries(modules)) { + const stripped = path.slice(base.length); + + if (`${slug}.md` === stripped) { + return { path, resolver: resolver as Resolver }; + } + + const index = '/index.md'; + + if (stripped.endsWith(index)) { + if (slug === `${stripped.slice(0, stripped.length - index.length)}`) { + return { path, resolver: resolver as Resolver }; + } + } + } + + return undefined; +} diff --git a/src/lib/docs/jsrepo-json.md b/src/lib/docs/jsrepo-json.md new file mode 100644 index 0000000..0b8456e --- /dev/null +++ b/src/lib/docs/jsrepo-json.md @@ -0,0 +1,104 @@ +--- +title: jsrepo.json +description: The project config file for jsrepo. +lastUpdated: 4-10-2025 +--- + +The `jsrepo.json` allows you to configure how **jsrepo** installs blocks in your project. + +You can create a `jsrepo.json` by running the init command with the `--project` flag: + +```sh +jsrepo init --project +``` + +## $schema + +`$schema` is tracked with the cli so you can use a specific version using unpkg: + +```jsonc showLineNumbers +{ + "$schema": "https://unpkg.com/jsrepo@1.47.0/schemas/project-config.json" +} +``` + +## configFiles + +Where to add specific config files in your project. + +```jsonc showLineNumbers +{ + "configFiles": { + "app.css": "./src/app.css" + } +} +``` + +## formatter + +The formatter to use when writing files in your project. + +```jsonc showLineNumbers +{ + "formatter": "prettier" / "biome" / undefined +} +``` + +jsrepo can format your files following your local config before adding them to your repository. Currently the only supported formatters are Prettier and Biome. + +## includeTests + +Whether or not to include test files when installing blocks. + +```jsonc showLineNumbers +{ + "includeTests": false +} +``` + +## paths + +Where to add specific categories in your project. + +```jsonc showLineNumbers +{ + "paths": { + "*": "./src/blocks", + "components": "$lib/components", + "hooks": "$lib/hooks" + } +} +``` + +## repos + +`repos` allows you to specify different registries to install blocks from. All of the blocks from each registry will be listed when you run add. + +```jsonc showLineNumbers +{ + "repos": ["gitlab/ieedan/std", "github/ieedan/shadcn-phone-input-svelte"] +} +``` + +## watermark + +Whether or not to add a watermark to installed blocks. + +```jsonc showLineNumbers +{ + "watermark": true +} +``` + +When true jsrepo adds a watermark to each block that includes the registry that it was added from from. + +```ts showLineNumbers +/* + Installed from github/ieedan/std +*/ + +export type Point = { + x: number; + y: number; +}; +``` diff --git a/src/lib/docs/map.ts b/src/lib/docs/map.ts new file mode 100644 index 0000000..3665fa8 --- /dev/null +++ b/src/lib/docs/map.ts @@ -0,0 +1,189 @@ +import * as u from '$lib/ts/url'; + +const BASE_ROUTE = '/docs'; + +type TempDoc = { + title: string; + slug: string; + tag?: string; + children?: TempDoc[]; +}; + +export type Doc = { + title: string; + href: string; + tag?: string; + children?: Doc[]; +}; + +// Name of the group mapped to a root doc with children +const tempMap: Record = { + 'Getting Started': [ + { + title: 'Introduction', + slug: '' + }, + [ + { + title: 'Setup', + slug: 'setup' + }, + { + title: 'jsrepo.json', + slug: 'jsrepo-json' + } + ] + ], + CLI: [ + 'cli', + [ + { + title: 'add', + slug: 'add' + }, + { + title: 'auth', + slug: 'auth' + }, + { + title: 'build', + slug: 'build' + }, + { + title: 'exec', + slug: 'exec' + }, + { + title: 'init', + slug: 'init' + }, + { + title: 'test', + slug: 'test' + }, + { + title: 'update', + slug: 'update' + } + ].sort(sortAlphabetical) + ], + 'Create Your Registry': [ + { + title: 'Getting Started', + slug: 'registry' + }, + [ + { + title: 'Choose a Provider', + slug: 'providers', + children: [ + { + title: 'GitHub', + slug: 'github' + }, + { + title: 'GitLab', + slug: 'gitlab' + }, + { + title: 'BitBucket', + slug: 'bitbucket' + }, + { + title: 'AzureDevops', + slug: 'azure' + }, + { + title: 'Self Hosted', + slug: 'self-hosted' + } + ] + }, + { + title: 'Language Support', + slug: 'language-support' + }, + { + title: 'Dynamic Registries', + slug: 'dynamic' + }, + { + title: 'Badges', + slug: 'badges' + }, + { + title: 'jsrepo-build-config.json', + slug: 'jsrepo-build-config-json' + } + ] + ], + Integrations: [ + 'integrations', + [ + { + title: 'Raycast Extension', + slug: 'https://www.raycast.com/ieedan/jsrepo' + } + ] + ] +}; + +export const map = buildMap(tempMap); + +function buildMap(initial: typeof tempMap): Record { + const result: Record = {}; + + for (const [title, value] of Object.entries(initial)) { + const [rootDoc, docs] = value; + + if (typeof rootDoc === 'string') { + const baseHref = u.join(BASE_ROUTE, rootDoc); + + const children = fillHref(baseHref, docs); + + result[title] = children ?? []; + } else { + const baseHref = u.join(BASE_ROUTE, rootDoc.slug); + + const children = fillHref(baseHref, docs); + + result[title] = [{ ...rootDoc, href: baseHref, children: undefined }, ...(children ?? [])]; + } + } + + return result; +} + +function fillHref(baseHref: string, docs: TempDoc[] | undefined): Doc[] | undefined { + if (docs === undefined) return undefined; + + const result: Doc[] = []; + + for (const doc of docs) { + const children = fillHref(u.join(baseHref, doc.slug), doc.children); + + result.push({ + ...doc, + // external links are kept + href: doc.slug.startsWith('https://') ? doc.slug : u.join(baseHref, doc.slug), + children + }); + } + + return result; +} + +function sortAlphabetical(a: TempDoc, b: TempDoc) { + const titleA = a.title.toUpperCase(); + const titleB = b.title.toUpperCase(); + + if (titleA < titleB) { + return -1; + } + if (titleA > titleB) { + return 1; + } + + // Names must be equal + return 0; +} diff --git a/src/lib/docs/registry/badges.md b/src/lib/docs/registry/badges.md new file mode 100644 index 0000000..ba7d6ff --- /dev/null +++ b/src/lib/docs/registry/badges.md @@ -0,0 +1,19 @@ +--- +title: Badges +description: Badges to add to your README. +lastUpdated: 4-10-2025 +--- + + + +## Static Badges + + + +## Dynamic Badges + +These badges will update based on your registry. + + diff --git a/src/lib/docs/registry/dynamic.md b/src/lib/docs/registry/dynamic.md new file mode 100644 index 0000000..225a667 --- /dev/null +++ b/src/lib/docs/registry/dynamic.md @@ -0,0 +1,95 @@ +--- +title: Dynamic Registries +description: How to create dynamic registries in jsrepo. +lastUpdated: 4-10-2025 +--- + +The final frontier of reusable code. + +If you have ever used [shadcn](https://ui.shadcn.com) to install components from [v0](https://v0.dev) you are familiar with dynamic registries. They allow the server to serve different files to the CLI based on the route that was requested. + +This is useful if your product generates code that you want to distribute through the **jsrepo** CLI. + +To understand how to effectively create a dynamic registry in **jsrepo** you need to have a deeper understanding of the way that the manifest file works. + +## How jsrepo locates files + +The `jsrepo-manifest.json` includes all the blocks in your registry and their locations relative to the manifest file. + +This means that you need to ensure that the files needed for your registry are served from the path that is inferred from the `jsrepo-manifest.json`. + +For example take this manifest entry for a button component: + +```jsonc showLineNumbers +{ + name: 'ui', + blocks: [ + { + name: 'button', + directory: 'src/ui/button', + category: 'ui', + tests: false, + subdirectory: true, + list: true, + files: ['button.svelte', 'index.ts'], + localDependencies: ['utils/utils'], + dependencies: [], + devDependencies: [ + '@lucide/svelte@^0.475.0', + 'bits-ui@1.3.2', + 'tailwind-variants@^0.3.1' + ], + _imports_: { + '$lib/utils/utils.js': '{{utils/utils}}.js' + } + } + ] +}, +``` + +The directory that the files for button live in is `src/ui/button` because the `directory` prop is set to `src/ui/button`. + +Because of this **jsrepo** expects the files `button.svelte` and `index.ts` to exist at `src/ui/button/button.svelte` and `src/ui/button/index.ts` respectively. + +## Dependencies + +Any remote or local dependencies that need to be resolved should also be added to each block. In the case of the button component shown above. It has 3 remote dependencies and 1 local dependency. + +Remote dependencies exist under `dependencies` or `devDependencies` and give the name of the package optionally followed by the version. + +Local dependencies exist under `localDependencies` and reference other blocks in the registry and they are listed by `/`. In this case `utils/utils` is referring to the `utils` block in the `utils` category. + +Local dependencies should also come with corresponding mappings in `_imports_`. The `_imports_` key maps literal import statements to a template that is replaced before adding blocks to your project. This allows users to put blocks anywhere in their project without breaking their code. + +If you want dynamic blocks to depend on other blocks you will need to be able to add keys to `_imports_` to prevent breaking their code. Here is an example of how you might resolve the `utils` import from the button component above: + +```js +// here we just replace everything except for the extension +// so it turns into {{utils/utils}}.js +import { cn } from '$lib/utils/utils.js'; +// turns into {{utils/utils}} +import { cn } from '$lib/utils/utils'; +// turns into {{utils/utils}} +import { cn } from '../utils/utils'; +// if utils was a subdirectory with a file index.js +// turns into {{utils/utils}}/index.js +import { cn } from '../utils/utils/index.js'; +``` + +Essentially the path to the local dependency is insignificant but the file or extension after it must be included. + +## Type Definitions + +Type definitions for the manifest can be acquired via the JS API: + +```ts +import type { Manifest } from 'jsrepo'; +``` + +## Conclusion + +With all of this considered you can pretty easily create a dynamic **jsrepo** registry in a few minutes and start distributing components through the **jsrepo** CLI. + +## Examples + +- [github/ieedan/jsrepo-dynamic](https://github.com/ieedan/jsrepo-dynamic) diff --git a/src/lib/docs/registry/index.md b/src/lib/docs/registry/index.md new file mode 100644 index 0000000..c7642e6 --- /dev/null +++ b/src/lib/docs/registry/index.md @@ -0,0 +1,254 @@ +--- +title: Getting Started +description: How to build your own registry with jsrepo. +lastUpdated: 4-10-2025 +--- + +Here we will walk your through how to create your first registry with **jsrepo**. + +## Initialize a new project + +Let's start by initializing our project with a `package.json`: + +```sh +npm init +``` + +## Create your first block + +Now let's create a directory that will be our "category". A category is the section before the `/` in a block specifier (`/`) this allows you to categorize your blocks. + +For this example we will create a new category `utils` under the `/src` directory. Your project should now look like this: + +```plaintext +root +├── /src +│ └── /utils +└── package.json +``` + +Next let's create our first block. + +Add a new file called `add.ts` under `/utils` and paste the following code: + +```ts +export function add(a: number, b: number) { + return a + b; +} +``` + +## Configure the build command + +Now that we have a block in our category let's build it into a manifest that **jsrepo** can understand. + +Before we can do that we will need to configure the `build` command so that it knows where to look for our blocks. + +For this let's run: + +```sh +jsrepo init --registry +``` + +Now **jsrepo** will ask us some questions about our project. The first of which is "Where are your blocks located?". Here we say `/src` because it is the directory containing the category we just created `utils`. + +From here allow **jsrepo** to create the `jsrepo-build-config.json` file and step through the rest of the prompts. + +```plaintext +┌ jsrepo v1.0.0 +│ +◇ Where are your blocks located? +│ ./src +│ +◇ Add another blocks directory? +│ No +│ +◇ Create a `jsrepo-build-config.json` file? +│ Yes +│ +◇ Added `build:registry` to scripts in package.json +│ +◇ Created `jsrepo-build-config.json` +│ +├ Next Steps ────────────────────────────────────────────────┐ +│ │ +│ 1. Add categories to `./src`. │ +│ 2. Run `npm run build:registry` to build the registry. │ +│ │ +├─────────────────────────────────────────────────────────────┘ +│ +└ All done! +``` + +Once you're done you should be able to run: + +```sh +jsrepo build +``` + +**jsrepo** will then output a `jsrepo-manifest.json` that looks like this: + +```jsonc showLineNumbers +{ + "categories": [ + { + "name": "utils", + "blocks": [ + { + "name": "add", + "directory": "src/utils", + "category": "utils", + "tests": false, + "subdirectory": false, + "list": true, + "files": ["add.ts"], + "localDependencies": [], + "_imports_": {}, + "dependencies": [], + "devDependencies": [] + } + ] + } + ] +} +``` + +Congratulations you have just built your first registry. + +Now you can choose any one of the [supported providers](/docs/registry/providers) to host your registry and start distributing your code! + +## Resolving Dependencies + +While small projects like the one above are nice as an example they really don't show any of the true power of **jsrepo**. + +Most real projects will have different blocks that depend on each other or that depend on packages. + +Let's see how **jsrepo** handles that... + +Create a new file `print.ts` under `/utils` and paste the following code: + +```ts showLineNumbers +import color from 'chalk'; +import { add } from './add'; + +export function printSum(a: number, b: number) { + const answer = add(a, b); + + return console.log(`The answer is: ${color.cyan(answer.toString())}`); +} +``` + +Now if you build your `jsrepo-manifest.json` should look like this: + +```jsonc showLineNumbers +{ + "categories": [ + { + "name": "utils", + "blocks": [ + // add ... + { + "name": "print", + "directory": "src/utils", + "category": "utils", + "tests": false, + "subdirectory": false, + "list": true, + "files": ["print.ts"], + "localDependencies": ["utils/add"], + "_imports_": { + "./add": "{{utils/add}}" + }, + "dependencies": ["chalk"], + "devDependencies": [] + } + ] + } + ] +} +``` + +You should notice the `print` block has now been added to the `blocks` array for the `utils` category. + +It should have `utils/add` under it's `localDependencies` and `chalk` under it's `dependencies`. + +> Right now `chalk` doesn't have a version, but if we run `npm install chalk` **jsrepo** will use the version in your `package.json` + +## Excluding Dependencies + +Often you may want certain dependencies to not be installed when users add your blocks. + +Most commonly this will be things like the framework you are using (`Next`, `Svelte`, `etc.`). + +To prevent dependencies from being installed use the `--exclude-deps` flag or the corresponding `excludeDeps` option in your config: + +Flag: + +```sh +jsrepo build --exclude-deps +``` + +Option: + +```jsonc showLineNumbers +{ + "excludeDeps": ["react"] +} +``` + +### Automatically Excluded Dependencies + +By default in `svelte` and `vue` files importing from `svelte` or `vue` will not result in the dependencies being added. + +This is because we can generally assume anyone adding either of those filetypes to their project will already have Svelte or Vue installed. + +## Peer Dependencies + +Peer dependencies all you to warn your users when they are using unsupported versions of dependencies they need for your registry to function. + +An example of this could be your project using TailwindCSS v3 while waiting to migrate to v4. In the meantime you can setup peer dependencies to warn users that v4 is not yet fully supported. + +```jsonc showLineNumbers +{ + "peerDependencies": { + "tailwindcss": { + "version": "3.x.x", + "message": "Tailwind@v4 is not yet fully supported see: https://github.com/ieedan/jsrepo" + } + } +} +``` + +## Config Files + +For some registries you will need the user to have config files such as a `tailwind.config.ts` or `global.css`. + +You can include these files by configuring them in the `jsrepo-build-config.json`: + +```jsonc showLineNumbers +{ + "configFiles": [ + { + "name": "Tailwind Config", + "path": "./tailwind.config.ts", + "expectedPath": "./tailwind.config.ts", + "optional": false + } + ] +} +``` + +When users initialize your registry they will be prompted to add or update these config files. + +## Metadata + +You can view your registry on the **jsrepo** site by navigating to `https://jsrepo.dev/registries/` this page uses information from the manifest to display information like how many categories / blocks your registry has or it's dependencies. + +However if you configure the `meta` key in the `jsrepo-build-config.json` you can add more information like a description, a homepage, and tags. + +## Live Examples + +- [github/ieedan/std](https://github.com/ieedan/std) +- [github/ieedan/shadcn-svelte-extras](https://github.com/ieedan/shadcn-svelte-extras) +- [gitlab/ieedan/std](https://gitlab.com/ieedan/std) +- [bitbucket/ieedan/std](https://bitbucket.org/ieedan/std) +- [azure/ieedan/std/std](https://dev.azure.com/ieedan/_git/std) diff --git a/src/lib/docs/registry/jsrepo-build-config-json.md b/src/lib/docs/registry/jsrepo-build-config-json.md new file mode 100644 index 0000000..7d10e21 --- /dev/null +++ b/src/lib/docs/registry/jsrepo-build-config-json.md @@ -0,0 +1,277 @@ +--- +title: jsrepo-build-config.json +description: The registry config file for jsrepo. +lastUpdated: 4-10-2025 +--- + +`jsrepo-build-config.json` holds the configuration for your registry. + +You can create a `jsrepo-build-config.json` by running the `init` command with the `--registry` flag: + +```sh +jsrepo init --registry +``` + +### `$schema` + +`$schema` is tracked with the cli so you can use a specific version using unpkg: + +```jsonc showLineNumbers +{ + "$schema": "https://unpkg.com/jsrepo@1.47.0/schemas/registry-config.json" +} +``` + +### `allowSubdirectories` + +`allowSubdirectories` allows subdirectories to be built. + +```jsonc showLineNumbers +{ + "allowSubdirectories": false +} +``` + +### `configFiles` + +`configFiles` allows you to specify files that the user may need in their project for the registry to function properly. + +```jsonc showLineNumbers +{ + "configFiles": [ + { + "name": "app.css", + "path": "./src/app.css", + "expectedPath": "./src/app.css", + "optional": false + } + ] +} +``` + +#### `expectedPath` + +The path where you expect users to have this file (used as a default in prompts). + +#### `name` + +The name as it will be displayed in prompts to the user. + +#### `optional` + +When true users will be prompted to ask whether or not they want to add the config file. + +#### `path` + +The path of the file in your registry. + +### `dirs` + +`dirs` is a list of the directories that contain your block categories. + +```jsonc showLineNumbers +{ + "dirs": ["./src", "./blocks"] +} +``` + +### `doNotListBlocks` + +`doNotListBlocks` is a list of block names that shouldn't be listed when the user runs the `add` command. + +```jsonc showLineNumbers +{ + "doNotListBlocks": ["utils"] +} +``` + +### `doNotListCategories` + +`doNotListCategories` is a list of category names that shouldn't be listed when the user runs the `add` command. + +```jsonc showLineNumbers +{ + "doNotListCategories": ["utils"] +} +``` + +### `excludeBlocks` + +`excludeBlocks` allows you to prevent the specified blocks from being included in the manifest. + +```jsonc showLineNumbers +{ + "excludeBlocks": ["domain"] +} +``` + +### `excludeCategories` + +`excludeCategories` allows you to prevent the specified categories from being included in the manifest. + +```jsonc showLineNumbers +{ + "excludeCategories": ["INTERNAL"] +} +``` + +### `excludeDeps` + +`excludeDeps` allows you to prevent specified remote dependencies from being installed when the user adds/updates blocks. This is useful for framework specific API's like React or Svelte. + +```jsonc showLineNumbers +{ + "excludeDeps": ["svelte", "react", "vue"] +} +``` + +### `includeBlocks` + +`includeBlocks` allows you to only include specified blocks in the final manifest file. Keep in mind that if these blocks are referenced by other blocks that are included then your build will break. + +```jsonc showLineNumbers +{ + "includeBlocks": ["ui", "hooks"] +} +``` + +### `includeCategories` + +`includeCategories` allows you to only include specified categories in the final manifest file. Keep in mind that if these categories are referenced by other categories that are included then your build will break. + +```jsonc showLineNumbers +{ + "includeCategories": ["components", "utils"] +} +``` + +### `listBlocks` + +`listBlocks` is a list of block names that should be listed when the user runs the `add` command. + +```jsonc showLineNumbers +{ + "listBlocks": ["utils"] +} +``` + +### `listCategories` + +`listCategories` is a list of category names that should be listed when the user runs the `add` command. + +```jsonc showLineNumbers +{ + "listCategories": ["utils"] +} +``` + +### `meta` + +`meta` allows you to provide optional information about the registry that can be displayed to users for better documentation. + +```jsonc showLineNumbers +{ + "meta": { + "authors": ["Aidan Bleser"], + "bugs": "https://github.com/ieedan/std/issues", + "description": "Fully tested and documented TypeScript utilities brokered by jsrepo.", + "homepage": "https://ieedan.github.io/std/", + "repository": "https://github.com/ieedan/std", + "tags": ["typescript", "std"] + } +} +``` + +### `outputDir` + +`outputDir` is an optional key that allows you to copy the resulting `jsrepo-manifest.json` and any required files to a custom directory. + +This is useful if you want to host the registry in a different location from where the code actually lives. (This should NOT be used when hosting your registry from a git repository) + +```jsonc showLineNumbers +{ + "outputDir": "./static/new-york" +} +``` + +### `peerDependencies` + +`peerDependencies` allow you to warn users when they are missing dependencies that are required or are using dependency versions that are incompatible. + +```jsonc showLineNumbers +{ + "peerDependencies": { + "svelte": { + "version": "5.x.x", + "message": "Svelte 5 is the only supported version for this registry see: https://github.com/ieedan/jsrepo" + }, + "tailwindcss": "3.x.x" + } +} +``` + +#### `message` + +A message displayed to users when installing with an incompatible peer dependency. + +#### `version` + +The version or version range that is supported by your registry. + +### `preview` + +`preview` displays a preview of the blocks list. + +```jsonc showLineNumbers +{ + "preview": false +} +``` + +### `rules` + +`rules` allows you to configure the rules when checking the manifest file after build. + +Below are the default settings for each rule. + +```jsonc showLineNumbers +{ + "rules": { + "no-category-index-file-dependency": "warn", + "no-unpinned-dependency": "warn", + "require-local-dependency-exists": "error", + "max-local-dependencies": ["warn", 10], + "no-cir-dependency": "error", + "no-unused-block": "warn", + "no-framework-dependency": "warn" + } +} +``` + +#### `no-category-index-file-dependency` + +Disallow depending on the index file of a category. + +#### `no-unpinned-dependency` + +Require all dependencies to have a pinned version. + +#### `require-local-dependency-exists` + +Require all local dependencies to exist. + +#### `max-local-dependencies` + +Enforces a limit on the amount of local dependencies a block can have. + +#### `no-circular-dependency` + +Disallow circular dependencies. + +#### `no-unused-block` + +Disallow unused blocks. (Not listed and not a dependency of another block) + +#### `no-framework-dependency` + +Disallow frameworks (Svelte, Vue, React) as dependencies. diff --git a/src/lib/docs/registry/language-support.md b/src/lib/docs/registry/language-support.md new file mode 100644 index 0000000..c446ce7 --- /dev/null +++ b/src/lib/docs/registry/language-support.md @@ -0,0 +1,18 @@ +--- +title: Language Support +description: The languages that jsrepo supports in your registry. +lastUpdated: 4-10-2025 +--- + + + +**jsrepo** has to analyze your code to resolve any local/remote dependencies. Because of this it needs to explicitly support languages for them to be used in your registry. + +- ✅: Supported +- ⌛️: In progress +- 🚫: Not in progress +- ⚠️: Partial support + + diff --git a/src/lib/docs/registry/providers/azure.md b/src/lib/docs/registry/providers/azure.md new file mode 100644 index 0000000..153408a --- /dev/null +++ b/src/lib/docs/registry/providers/azure.md @@ -0,0 +1,42 @@ +--- +title: AzureDevops +description: How to use AzureDevops as your registry provider. +lastUpdated: 4-10-2025 +--- + +## Branches and Tags + +Because the AzureDevops URL structure doesn't include enough information to fetch raw files we have to use a custom structure so copy pasting the URL from the homepage like you can for other providers won't just work. + +Instead you need to follow the following format: + +`azure////(tags|heads)/` + +```sh +azure/ieedan/std/std # default branch shorthand +azure/ieedan/std/std/tags/v1.5.0 # tag reference +azure/ieedan/std/std/heads/next # branch reference +``` + +## Using Tags for Versioning + +Tags can be a great solution to ensuring remote tests and blocks stay on a consistent version. + +```jsonc showLineNumbers +{ + "$schema": "https://unpkg.com/jsrepo@1.47.0/schemas/project-config.json", + // use a specific version tag + "repos": ["azure/ieedan/std/std/tags/v1.5.0"], + "path": "src/blocks", + "includeTests": false, + "watermark": true, + "formatter": "prettier", + "paths": { + "*": "./src/blocks" + } +} +``` + +Tags do not however work like npm packages. Tags are completely mutable meaning a malicious registry could publish over a tag with different code. + +This is why it's always important to make sure you trust the owner of the registry. diff --git a/src/lib/docs/registry/providers/bitbucket.md b/src/lib/docs/registry/providers/bitbucket.md new file mode 100644 index 0000000..fb1def9 --- /dev/null +++ b/src/lib/docs/registry/providers/bitbucket.md @@ -0,0 +1,67 @@ +--- +title: BitBucket +description: How to use BitBucket as your registry provider. +lastUpdated: 4-10-2025 +--- + +## Branches and Tags + +**jsrepo** supports BitBucket so that you can just paste a link to the repo homepage and it will be handled correctly. + +Because of this all of the following paths work: + +```sh +https://bitbucket.org/ieedan/std # default branch shorthand +https://bitbucket.org/ieedan/std/src/v1.5.0 # tag reference +https://bitbucket.org/ieedan/std/src/next # branch reference +``` + +## Using Tags for Versioning + +Tags can be a great solution to ensuring remote tests and blocks stay on a consistent version. + +```jsonc showLineNumbers +{ + "$schema": "https://unpkg.com/jsrepo@1.47.0/schemas/project-config.json", + // use a specific version tag + "repos": ["https://bitbucket.org/ieedan/std/src/v1.5.0"], + "path": "src/blocks", + "includeTests": false, + "watermark": true, + "formatter": "prettier", + "paths": { + "*": "./src/blocks" + } +} +``` + +Tags do not however work like npm packages. Tags are completely mutable meaning a malicious registry could publish over a tag with different code. + +This is why it's always important to make sure you trust the owner of the registry. + +## bitbucket Shorthand + +When referencing bitbucket as the provider you can use the `bitbucket` shorthand in place of `https://bitbucket.org`. + +Example: + +```sh +npx jsrepo add bitbucket/ieedan/std/src/main/utils/math +``` + +In the `jsrepo.json`: + +```jsonc showLineNumbers +{ + "$schema": "https://unpkg.com/jsrepo@1.47.0/schemas/project-config.json", + // use bitbucket instead of https://bitbucket.org + "repos": ["bitbucket/ieedan/std/src/main"], + "path": "src/blocks", + "includeTests": false, + "watermark": true, + "formatter": "prettier", + "paths": { + "*": "./src/blocks" + } +} +``` diff --git a/src/lib/docs/registry/providers/github.md b/src/lib/docs/registry/providers/github.md new file mode 100644 index 0000000..24955a6 --- /dev/null +++ b/src/lib/docs/registry/providers/github.md @@ -0,0 +1,118 @@ +--- +title: GitHub +description: How to use GitHub as your registry provider. +lastUpdated: 4-10-2025 +--- + +## Branches and Tags + +**jsrepo** supports GitHub so that you can just paste a link to the repo homepage and it will be handled correctly. + +Because of this all of the following paths work: + +```sh +https://github.com/ieedan/std # default branch shorthand +https://github.com/ieedan/std/tree/v1.5.0 # tag reference +https://github.com/ieedan/std/tree/next # branch reference +``` + +## Using Tags for Versioning + +Tags can be a great solution to ensuring remote tests and blocks stay on a consistent version. + +```jsonc showLineNumbers +{ + "$schema": "https://unpkg.com/jsrepo@1.47.0/schemas/project-config.json", + // use a specific version tag + "repos": ["https://github.com/ieedan/std/tree/v1.5.0"], + "path": "src/blocks", + "includeTests": false, + "watermark": true, + "formatter": "prettier", + "paths": { + "*": "./src/blocks" + } +} +``` + +Tags do not however work like npm packages. Tags are completely mutable meaning a malicious registry could publish over a tag with different code. + +This is why it's always important to make sure you trust the owner of the registry. + +## github Shorthand + +When referencing GitHub as the provider you can use the `github` shorthand in place of `https://github.com`. + +Example: + +```sh +npx jsrepo add github/ieedan/std/utils/math +``` + +In the `jsrepo.json`: + +```jsonc showLineNumbers +{ + "$schema": "https://unpkg.com/jsrepo@1.47.0/schemas/project-config.json", + // use github instead of https://github.com + "repos": ["github/ieedan/std"], + "path": "src/blocks", + "includeTests": false, + "watermark": true, + "formatter": "prettier", + "paths": { + "*": "./src/blocks" + } +} +``` + +## Rate Limiting + +If you are doing a lot of testing with **jsrepo** you may eventually get to a point where GitHub "cuts you off". At this point GitHub will start to return cached responses when trying to add, update, or test blocks. + +You can get around this by supplying a PAT with the `auth` command. + +## CI / CD + +If you are creating your own registry you may want to build the registry on a push to the main branch to make sure that the `jsrepo-manifest.json` is always up to date with the latest changes. + +Workflow to build the manifest and create a pull request: + +```yaml showLineNumbers +name: build-registry +on: + push: + branches: + - main +permissions: + contents: write + pull-requests: write + id-token: write +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: actions/setup-node@v4 + with: + node-version: '20' + # jsrepo doesn't need any of your + # dependencies to be installed to work + - name: Build jsrepo-manifest.json + run: npx jsrepo build + - name: Create pull request with changes + uses: peter-evans/create-pull-request@v7 + with: + title: 'chore: update `jsrepo-manifest.json`' + body: | + - Update `jsrepo-manifest.json` + --- + This PR was auto generated + branch: build-manifest + commit-message: build `jsrepo-manifest.json` +``` diff --git a/src/lib/docs/registry/providers/gitlab.md b/src/lib/docs/registry/providers/gitlab.md new file mode 100644 index 0000000..a7de703 --- /dev/null +++ b/src/lib/docs/registry/providers/gitlab.md @@ -0,0 +1,79 @@ +--- +title: GitLab +description: How to use GitLab as your registry provider. +lastUpdated: 4-10-2025 +--- + +## Branches and Tags + +**jsrepo** supports GitLab so that you can just paste a link to the repo homepage and it will be handled correctly. + +Because of this all of the following paths work: + +```sh +https://gitlab.com/ieedan/std # default branch shorthand +https://gitlab.com/ieedan/std/-/tree/v1.5.0 # tag reference +https://gitlab.com/ieedan/std/-/tree/next # branch reference +``` + +## Using Tags for Versioning + +Tags can be a great solution to ensuring remote tests and blocks stay on a consistent version. + +```jsonc showLineNumbers +{ + "$schema": "https://unpkg.com/jsrepo@1.47.0/schemas/project-config.json", + // use a specific version tag + "repos": ["https://gitlab.com/ieedan/std/-/tree/v1.5.0"], + "path": "src/blocks", + "includeTests": false, + "watermark": true, + "formatter": "prettier", + "paths": { + "*": "./src/blocks" + } +} +``` + +Tags do not however work like npm packages. Tags are completely mutable meaning a malicious registry could publish over a tag with different code. + +This is why it's always important to make sure you trust the owner of the registry. + +## gitlab Shorthand + +When referencing GitLab as the provider you can use the `gitlab` shorthand in place of `https://gitlab.com`. + +Example: + +```sh +npx jsrepo add gitlab/ieedan/std/utils/math +``` + +In the `jsrepo.json`: + +```jsonc showLineNumbers +{ + "$schema": "https://unpkg.com/jsrepo@1.47.0/schemas/project-config.json", + // use gitlab instead of https://gitlab.com + "repos": ["gitlab/ieedan/std"], + "path": "src/blocks", + "includeTests": false, + "watermark": true, + "formatter": "prettier", + "paths": { + "*": "./src/blocks" + } +} +``` + +## Self hosted GitLab + +Some companies prefer to host their own GitLab instance so we allow that too! + +You can use the `gitlab:` prefix followed by your custom domain to point to your self hosted instance: + +```sh +gitlab:https://example.com/ieedan/std +``` + +Now requests will be made to `https://example.com` with the owner `ieedan` and the repository name `std`. diff --git a/src/lib/docs/registry/providers/index.md b/src/lib/docs/registry/providers/index.md new file mode 100644 index 0000000..89e43d1 --- /dev/null +++ b/src/lib/docs/registry/providers/index.md @@ -0,0 +1,13 @@ +--- +title: Providers +description: The registry providers jsrepo supports. +lastUpdated: 4-10-2025 +--- + + + +**jsrepo** supports multiple providers so everyone can take advantage of it. + + diff --git a/src/lib/docs/registry/providers/self-hosted.md b/src/lib/docs/registry/providers/self-hosted.md new file mode 100644 index 0000000..0c49f3f --- /dev/null +++ b/src/lib/docs/registry/providers/self-hosted.md @@ -0,0 +1,79 @@ +--- +title: Self Hosted +description: How to self host your registry. +lastUpdated: 4-10-2025 +--- + +You can host your registry on your own domain by serving it's assets statically. + +This also allows you to customize where and how things are served in ways that aren't possible when serving from a git provider. Here's a few situations that self hosting makes sense: + +- Serving multiple registries / registry variants +- Branding for your registry +- URL shortening + +## Setup + +To get started you need a way to serve your registry. This can be done with most web application frameworks by just serving the registry out of the corresponding static folder. + +- SvelteKit - `/static` +- Next.js - `/public` +- Nuxt - `/public` +- Nitro - `/public` + +Once you know where your static folder is you can use the `--output-dir` flag or the corresponding `outputDir` option in your `jsrepo-build-config.json` to build the registry and output it so it can be served from your static folder. + +For this example let's host our registry on our site `example.com` at `/r`. + +Build with flag: + +```sh +jsrepo build --output-dir ./public/r +``` + +or with config option: + +```jsonc showLineNumbers +{ + // ... + "outputDir": "./public/r" +} +``` + +Once you have built your registry the manifest file and any assets that it needs should be copied into `/public/r`. + +Now if you serve your site your registry should be accessible at `https://example.com/r`. + +Users can now add blocks like so: + +```sh +jsrepo add --repo https://example.com/r +``` + +## Multiple Registries + +Since self hosting allows you to serve your registry from any path you can also serve multiple registries from the same domain. + +For example say you had a JavaScript and TypeScript variant of your registry. You may want to serve them from `example.com/r/ts` and `example.com/r/js` respectively. + +To do this you can adjust your build config to build each registry individually and pass a different path to the `--output-dir` flag for each registry. + +```sh +jsrepo build --output-dir ./public/r/ts # ts + +jsrepo build --output-dir ./public/r/js # js +``` + +Now users could access each registry like so: + +```sh +jsrepo add --repo https://example.com/r/ts # ts + +jsrepo add --repo https://example.com/r/js # js +``` + +## Private Registries + +You can keep your self-hosted registries private only allowing authenticated users to access blocks. + +Users can provide a token to the `auth` method or during initialization so that they can access the registry. This token will be passed using the Authorization header with the Bearer scheme. diff --git a/src/lib/docs/setup.md b/src/lib/docs/setup.md new file mode 100644 index 0000000..9097ed3 --- /dev/null +++ b/src/lib/docs/setup.md @@ -0,0 +1,120 @@ +--- +title: Setup +description: Setup jsrepo so you can install blocks. +lastUpdated: 4-10-2025 +--- + + + +## Installation + +To get started with **jsrepo** we recommend installing it globally. + + + +## Initialization + +> For this example we will be adding blocks from [github/ieedan/std](https://github.com/ieedan/std). + +Now run: + +```sh +jsrepo init github/ieedan/std +``` + +This will start the setup for `github/ieedan/std`. + +```plaintext +┌ jsrepo v1.47.0 +│ +◇ Please enter a default path to install the blocks +│ ./src/blocks +│ +◇ Which formatter would you like to use? +│ Prettier +│ +● Initializing github/ieedan/std +│ +◇ Fetched manifest from github/ieedan/std +│ +◇ Which category paths would you like to configure? +│ ts +│ +◇ Where should ts be added in your project? +│ ./src/blocks/ts +│ +◇ Add another repo? +│ No +│ +◇ Wrote config to `jsrepo.json` +│ +└ All done! +``` + +Step through the prompts and configure: + +- A default path to install blocks +- A formatter to use (optional) +- Where to install specific categories + +Once complete **jsrepo** will generate a configured [jsrepo.json](/docs/jsrepo-json). + +Now you can easily install blocks either by selecting them from a list or adding them by name: + +```sh +jsrepo add ts/math # add by name + +jsrepo add # add from list +``` + +## Maintaining Your Blocks + +Once you have added blocks to your project you can easily modify the code to your own needs. But how should we handle keeping our code up to date with the source registry once the code has been modified? + +Luckily for you **jsrepo** makes this process much less painful. + +**jsrepo** provides a few different commands for managing differences between your code and the source registry: + +- `update` - interactively update your blocks and see a file by file diff before accepting, rejecting, or allowing an LLM to make changes +- `test` - test your local code against the tests in the source registry + +### Update + +To update blocks you can run: + +```sh +jsrepo update # choose from list + +jsrepo update ts/math # update a specific block + +jsrepo update --all # update all blocks +``` + +When a file has changed **jsrepo** will display a diff with the incoming change. + +Below the diff you are given 3 options. + +- Accept +- Reject +- ✨ Update with AI ✨ + +Hit `Accept` to immediately write the changes to the file, `Reject` to discard the changes and move on, or `✨ Update with AI ✨` to allow you to customize the way you want the file to be updated by prompting an LLM of your choice. + +![The jsrepo update command diff tool](/docs/images/update-diff.png) + +If a file is unchanged it will simply be skipped. + +### Test + +To test blocks you can run: + +```sh +jsrepo test # test all blocks + +jsrepo test ts/math # test a specific block +``` + +**jsrepo** will then pull the tests from the source registry and run them with [vitest](https://vitest.dev/) locally. diff --git a/src/lib/hooks/is-mobile.svelte.ts b/src/lib/hooks/is-mobile.svelte.ts new file mode 100644 index 0000000..0f1afe9 --- /dev/null +++ b/src/lib/hooks/is-mobile.svelte.ts @@ -0,0 +1,9 @@ +import { MediaQuery } from 'svelte/reactivity'; + +const MOBILE_BREAKPOINT = 768; + +export class IsMobile extends MediaQuery { + constructor() { + super(`max-width: ${MOBILE_BREAKPOINT - 1}px`); + } +} diff --git a/src/lib/hooks/use-boolean.svelte.ts b/src/lib/hooks/use-boolean.svelte.ts new file mode 100644 index 0000000..adbd764 --- /dev/null +++ b/src/lib/hooks/use-boolean.svelte.ts @@ -0,0 +1,57 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +/** A hook for easy use of boolean values + * + * ## Usage + * ```svelte + * + * + *

    Value is: {open.current}

    + * + * + * + * + * ``` + */ +export class UseBoolean { + #current = $state(false); + + constructor(defaultValue = false) { + this.#current = defaultValue; + + this.toggle = this.toggle.bind(this); + this.setTrue = this.setTrue.bind(this); + this.setFalse = this.setFalse.bind(this); + } + + /** Toggles the current state */ + toggle() { + this.#current = !this.#current; + } + + /** Sets the current state to true */ + setTrue() { + this.#current = true; + } + + /** Sets the current state to false */ + setFalse() { + this.#current = false; + } + + get current() { + return this.#current; + } + + set current(val) { + this.#current = val; + } +} diff --git a/src/lib/hooks/use-clipboard.svelte.ts b/src/lib/hooks/use-clipboard.svelte.ts new file mode 100644 index 0000000..bed85c6 --- /dev/null +++ b/src/lib/hooks/use-clipboard.svelte.ts @@ -0,0 +1,87 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +type Options = { + /** The time before the copied status is reset. */ + delay: number; +}; + +/** Use this hook to copy text to the clipboard and show a copied state. + * + * ## Usage + * ```svelte + * + * + * + * ``` + * + */ +export class UseClipboard { + #copiedStatus = $state<'success' | 'failure'>(); + private delay: number; + private timeout: ReturnType | undefined = undefined; + + constructor({ delay = 500 }: Partial = {}) { + this.delay = delay; + } + + /** Copies the given text to the users clipboard. + * + * ## Usage + * ```ts + * clipboard.copy('Hello, World!'); + * ``` + * + * @param text + * @returns + */ + async copy(text: string) { + if (this.timeout) { + this.#copiedStatus = undefined; + clearTimeout(this.timeout); + } + + try { + await navigator.clipboard.writeText(text); + + this.#copiedStatus = 'success'; + + this.timeout = setTimeout(() => { + this.#copiedStatus = undefined; + }, this.delay); + } catch { + // an error can occur when not in the browser or if the user hasn't given clipboard access + this.#copiedStatus = 'failure'; + + this.timeout = setTimeout(() => { + this.#copiedStatus = undefined; + }, this.delay); + } + + return this.#copiedStatus; + } + + /** True when the user has just copied to the clipboard. */ + get copied() { + return this.#copiedStatus === 'success'; + } + + /** Indicates whether a copy has occurred + * and gives a status of either `success` or `failure`. */ + get status() { + return this.#copiedStatus; + } +} diff --git a/src/lib/hooks/use-query.svelte.ts b/src/lib/hooks/use-query.svelte.ts new file mode 100644 index 0000000..e3270f9 --- /dev/null +++ b/src/lib/hooks/use-query.svelte.ts @@ -0,0 +1,16 @@ +export class UseQuery { + controller: AbortController | undefined = undefined; + + constructor( + readonly fn: (opts: { signal: AbortSignal; isAborted: (err: unknown) => boolean }) => void + ) {} + + query = $derived.by(() => { + return async () => { + this.controller?.abort?.('aborted'); + this.controller = new AbortController(); + + this.fn({ signal: this.controller.signal, isAborted: (err) => err === 'aborted' }); + }; + }); +} diff --git a/src/lib/hooks/use-toc.svelte.ts b/src/lib/hooks/use-toc.svelte.ts new file mode 100644 index 0000000..b3d794f --- /dev/null +++ b/src/lib/hooks/use-toc.svelte.ts @@ -0,0 +1,169 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +export type HeadingKind = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'; + +export type Heading = { + index: number; + ref: Element; + kind: HeadingKind; + id?: string; + level: number; + label: string; + active: boolean; + children: Heading[]; +}; + +export const INDEX_ATTRIBUTE = 'data-toc-index'; + +/** A hook for generating a table of contents using the page content. + * + * ## Usage + * ```svelte + * + * + *
    + *

    Table of Contents

    + *

    Usage

    + *
    + * ``` + */ +export class UseToc { + #ref = $state(); + #toc = $state([]); + + // This sets everything up once #ref is bound + set ref(ref: Element | undefined) { + this.#ref = ref; + + if (!this.#ref) return; + + this.#toc = getToc(this.#ref); + + // should detect if a heading is added / removed / updated + const mutationObserver = new MutationObserver(() => { + if (!this.#ref) return; + + this.#toc = getToc(this.#ref); + }); + + mutationObserver.observe(this.#ref, { childList: true, subtree: true }); + + const resetActiveHeading = (headings: Heading[]) => { + for (let i = 0; i < headings.length; i++) { + headings[i].active = false; + + resetActiveHeading(headings[i].children); + } + }; + + const setHeadingActive = (headings: Heading[], index: number) => { + for (let i = 0; i < headings.length; i++) { + if (index === headings[i].index) { + headings[i].active = true; + break; + } + + setHeadingActive(headings[i].children, index); + } + }; + + // reactive to the table of contents + $effect(() => { + const intersectionObserver = new IntersectionObserver((entries) => { + for (const entry of entries) { + if (entry.isIntersecting) { + resetActiveHeading(this.#toc); + + const index = entry.target.getAttribute(INDEX_ATTRIBUTE); + + setHeadingActive(this.#toc, parseInt(index ?? '-1')); + } + } + }); + + this.#toc.forEach((heading) => { + intersectionObserver.observe(heading.ref); + }); + + return () => intersectionObserver.disconnect(); + }); + } + + get ref() { + return this.#ref; + } + + /** The generated table of contents */ + get current() { + return this.#toc; + } +} + +const createHeading = (element: HTMLHeadingElement, index: number): Heading => { + const kind = element.tagName.toLowerCase() as HeadingKind; + + element.setAttribute(INDEX_ATTRIBUTE, index.toString()); + + return { + index, + ref: element, + kind, + id: element.id, + level: parseInt(kind[1]), + label: element.innerText ?? '', + active: true, + children: [] + }; +}; + +/** Gets all of the headings contained in the provided element and create a table of contents. + * + * @param el + * @returns + */ +const getToc = (el: Element): Heading[] => { + const headings = Array.from(el.querySelectorAll('h1, h2, h3, h4, h5, h6')).map((h, i) => + createHeading(h as HTMLHeadingElement, i) + ); + + if (headings.length === 0) return []; + + const toc: Heading[] = []; + + let i = 0; + + while (i < headings.length) { + const heading = headings[i]; + + const nextIndex = addChildren(headings, heading, i + 1); + + toc.push(heading); + + i = nextIndex; + } + + return toc; +}; + +const addChildren = (headings: Heading[], base: Heading, index: number): number => { + let i = index; + + while (i < headings.length) { + const sub = headings[i]; + + // example: h1 < h2 or h1 = h1 + if (sub.level <= base.level) break; + + const nextIndex = addChildren(headings, sub, i + 1); + + base.children.push(sub); + + i = nextIndex; + } + + return i; +}; diff --git a/src/lib/scripts/generate-index.js b/src/lib/scripts/generate-index.js new file mode 100644 index 0000000..8cad8ea --- /dev/null +++ b/src/lib/scripts/generate-index.js @@ -0,0 +1,71 @@ +import removeMd from 'remove-markdown'; +import fs from 'node:fs'; +import path from 'node:path'; + +/** Remove markdown syntax + * + * @param {string} md + * @returns + */ +function removeMarkdown(md) { + return removeMd(md, { gfm: true, replaceLinksWithURL: true, useImgAltText: true }); +} + +/** + * @param {any} docs + */ +export function generateIndex(docs) { + console.log('[scripts/generate-index.ts] Generating `/docs` index...'); + + const docsIndex = generateDocsIndex(docs); + + console.log('[scripts/generate-index.ts] Generated `/docs` index'); + + const index = { + docs: docsIndex + }; + + const targetPath = path.resolve(import.meta.dirname, '../static/search.json'); + + fs.writeFileSync(targetPath, JSON.stringify(index)); +} + +/** + * @param {any} docs + */ +function generateDocsIndex(docs) { + const docsIndex = []; + const basePath = path.resolve(import.meta.dirname, '../src/lib/docs'); + + for (let i = 0; i < docs.docs.length; i++) { + const doc = docs.docs[i]; + + let docPath = path.join(basePath, `${doc.path}.md`); + const isIndex = !fs.existsSync(docPath) || doc.path === 'index'; + + if (!fs.existsSync(docPath)) { + docPath = path.join(basePath, doc.path, 'index.md'); + } + + const content = removeMarkdown(fs.readFileSync(docPath).toString()); + + const docsBasePath = '/docs'; + + let href; + + if (isIndex && doc.path === 'index') { + href = `${docsBasePath}/`; + } else { + href = `${docsBasePath}/${doc.path}`; + } + + docsIndex.push({ + id: i, + title: doc.title, + href: href, + content: `${doc.title}\n${doc.description}\n${content}` + }); + } + + return docsIndex; +} diff --git a/src/lib/ts/array.ts b/src/lib/ts/array.ts new file mode 100644 index 0000000..9d0b766 --- /dev/null +++ b/src/lib/ts/array.ts @@ -0,0 +1,80 @@ +/* + Installed from github/ieedan/std +*/ + +/** Maps the provided map into an array using the provided mapping function. + * + * @param map Map to be entered into an array + * @param fn A mapping function to transform each pair into an item + * @returns + * + * ## Usage + * ```ts + * console.log(map); // Map(5) { 0 => 5, 1 => 4, 2 => 3, 3 => 2, 4 => 1 } + * + * const arr = fromMap(map, (_, value) => value); + * + * console.log(arr); // [5, 4, 3, 2, 1] + * ``` + */ +export function fromMap(map: Map, fn: (key: K, value: V) => T): T[] { + const items: T[] = []; + + for (const [key, value] of map) { + items.push(fn(key, value)); + } + + return items; +} + +/** Calculates the sum of all elements in the array based on the provided function. + * + * @param arr Array of items to be summed. + * @param fn Summing function + * @returns + * + * ## Usage + * + * ```ts + * const total = sum([1, 2, 3, 4, 5], (num) => num); + * + * console.log(total); // 15 + * ``` + */ +export function sum(arr: T[], fn: (item: T) => number): number { + let total = 0; + + for (const item of arr) { + total = total + fn(item); + } + + return total; +} + +/** Maps the provided array into a map + * + * @param arr Array of items to be entered into a map + * @param fn A mapping function to transform each item into a key value pair + * @returns + * + * ## Usage + * ```ts + * const map = toMap([5, 4, 3, 2, 1], (item, i) => [i, item]); + * + * console.log(map); // Map(5) { 0 => 5, 1 => 4, 2 => 3, 3 => 2, 4 => 1 } + * ``` + */ +export function toMap( + arr: T[], + fn: (item: T, index: number) => [key: K, value: V] +): Map { + const map = new Map(); + + for (let i = 0; i < arr.length; i++) { + const [key, value] = fn(arr[i], i); + + map.set(key, value); + } + + return map; +} diff --git a/src/lib/ts/casing.ts b/src/lib/ts/casing.ts new file mode 100644 index 0000000..86e87e4 --- /dev/null +++ b/src/lib/ts/casing.ts @@ -0,0 +1,333 @@ +/* + Installed from github/ieedan/std +*/ + +import { isLetter } from '$lib/ts/is-letter'; + +/** Converts a `camelCase` string to a `snake_case` string + * + * @param str + * @returns + * + * ## Usage + * ```ts + * camelToSnake('helloWorld'); // hello_world + * ``` + */ +export function camelToSnake(str: string): string { + let newStr = ''; + + for (let i = 0; i < str.length; i++) { + // is uppercase letter + if (isLetter(str[i]) && str[i].toUpperCase() === str[i]) { + let l = i; + + while (l < str.length && isLetter(str[l]) && str[l].toUpperCase() === str[l]) { + l++; + } + + newStr += `${str.slice(i, l - 1).toLocaleLowerCase()}_${str[l - 1].toLocaleLowerCase()}`; + + i = l - 1; + + continue; + } + + newStr += str[i].toLocaleLowerCase(); + } + + return newStr; +} + +/** Converts a `PascalCase` string to a `snake_case` string + * + * @param str + * @returns + * + * ## Usage + * ```ts + * camelToSnake('HelloWorld'); // hello_world + * ``` + */ +export function pascalToSnake(str: string): string { + let newStr = ''; + + let firstLetter: number | undefined; + + for (let i = 0; i < str.length; i++) { + if (firstLetter === undefined && isLetter(str[i])) { + firstLetter = i; + } + + // is uppercase letter (ignoring the first) + if ( + firstLetter !== undefined && + i > firstLetter && + isLetter(str[i]) && + str[i].toUpperCase() === str[i] + ) { + let l = i; + + while (l < str.length && isLetter(str[l]) && str[l].toUpperCase() === str[l]) { + l++; + } + + newStr += `${str.slice(i, l - 1).toLocaleLowerCase()}_${str[l - 1].toLocaleLowerCase()}`; + + i = l - 1; + + continue; + } + + newStr += str[i].toLocaleLowerCase(); + } + + return newStr; +} + +/** Converts a `camelCase` string to a `kebab-case` string + * + * @param str + * @returns + * + * ## Usage + * ```ts + * camelToSnake('helloWorld'); // hello-world + * ``` + */ +export function camelToKebab(str: string): string { + let newStr = ''; + + for (let i = 0; i < str.length; i++) { + // is uppercase letter + if (i > 0 && isLetter(str[i]) && str[i].toUpperCase() === str[i]) { + let l = i; + + while (l < str.length && isLetter(str[l]) && str[l].toUpperCase() === str[l]) { + l++; + } + + newStr += `${str.slice(i, l - 1).toLocaleLowerCase()}-${str[l - 1].toLocaleLowerCase()}`; + + i = l - 1; + + continue; + } + + newStr += str[i].toLocaleLowerCase(); + } + + return newStr; +} + +/** Converts a `PascalCase` string to a `kebab-case` string + * + * @param str + * @returns + * + * ## Usage + * ```ts + * camelToSnake('HelloWorld'); // hello-world + * ``` + */ +export function pascalToKebab(str: string): string { + let newStr = ''; + + for (let i = 0; i < str.length; i++) { + // is uppercase letter (ignoring the first) + if (i > 0 && isLetter(str[i]) && str[i].toUpperCase() === str[i]) { + let l = i; + + while (l < str.length && isLetter(str[l]) && str[l].toUpperCase() === str[l]) { + l++; + } + + newStr += `${str.slice(i, l - 1).toLocaleLowerCase()}-${str[l - 1].toLocaleLowerCase()}`; + + i = l - 1; + + continue; + } + + newStr += str[i].toLocaleLowerCase(); + } + + return newStr; +} + +/** Converts a `camelCase` string to a `PascalCase` string (makes first letter lowercase) + * + * @param str + * @returns + * + * ## Usage + * ```ts + * camelToPascal('helloWorld'); // HelloWorld + * ``` + */ +export function camelToPascal(str: string): string { + return `${str[0].toLocaleUpperCase()}${str.slice(1)}`; +} + +/** Converts a `PascalCase` string to a `camelCase` string (makes first letter uppercase) + * + * @param str + * @returns + * + * ## Usage + * ```ts + * camelToPascal('HelloWorld'); // helloWorld + * ``` + */ +export function pascalToCamel(str: string): string { + return `${str[0].toLocaleLowerCase()}${str.slice(1)}`; +} + +/** Converts a `snake_case` string to a `PascalCase` string + * + * + * @param str + * @returns + * + * ## Usage + * ```ts + * snakeToPascal('hello_world'); // HelloWorld + * snakeToPascal('HELLO_WORLD'); // HelloWorld + * ``` + */ +export function snakeToPascal(str: string): string { + let newStr = ''; + + let firstLetter = true; + + for (let i = 0; i < str.length; i++) { + // capitalize first letter + if (firstLetter && isLetter(str[i])) { + firstLetter = false; + newStr += str[i].toUpperCase(); + continue; + } + + // capitalize first after a _ (ignoring the first) + if (!firstLetter && str[i] === '_') { + i++; + if (i <= str.length - 1) { + newStr += str[i].toUpperCase(); + } else { + newStr += '_'; + } + continue; + } + + newStr += str[i].toLocaleLowerCase(); + } + + return newStr; +} + +/** Converts a `snake_case` string to a `camelCase` string + * + * + * @param str + * @returns + * + * ## Usage + * ```ts + * snakeToCamel('hello_world'); // helloWorld + * snakeToCamel('HELLO_WORLD'); // helloWorld + * ``` + */ +export function snakeToCamel(str: string): string { + let newStr = ''; + + let firstLetter = true; + + for (let i = 0; i < str.length; i++) { + // capitalize first letter + if (firstLetter && isLetter(str[i])) { + firstLetter = false; + newStr += str[i].toLowerCase(); + continue; + } + + // capitalize first after a _ (ignoring the first) + if (!firstLetter && str[i] === '_') { + i++; + if (i <= str.length - 1) { + newStr += str[i].toUpperCase(); + } else { + newStr += '_'; + } + continue; + } + + newStr += str[i].toLocaleLowerCase(); + } + + return newStr; +} + +/** Converts a `kebab-case` string to a `PascalCase` string + * + * @param str + * @returns + * + * ## Usage + * ```ts + * kebabToPascal('hello-world'); // HelloWorld + * ``` + */ +export function kebabToPascal(str: string): string { + let newStr = ''; + + for (let i = 0; i < str.length; i++) { + // capitalize first + if (i === 0) { + newStr += str[i].toUpperCase(); + continue; + } + + // capitalize first after a - + if (str[i] === '-') { + i++; + if (i <= str.length - 1) { + newStr += str[i].toUpperCase(); + } + continue; + } + + newStr += str[i].toLocaleLowerCase(); + } + + return newStr; +} + +/** Converts a `kebab-case` string to a `camelCase` string + * + * + * @param str + * @returns + * + * ## Usage + * ```ts + * kebabToCamel('hello-world'); // helloWorld + * ``` + */ +export function kebabToCamel(str: string): string { + let newStr = ''; + + for (let i = 0; i < str.length; i++) { + // capitalize first after a - + if (str[i] === '-') { + i++; + if (i <= str.length - 1) { + newStr += str[i].toUpperCase(); + } + continue; + } + + newStr += str[i].toLocaleLowerCase(); + } + + return newStr; +} diff --git a/src/lib/ts/debounced.ts b/src/lib/ts/debounced.ts new file mode 100644 index 0000000..7b012fb --- /dev/null +++ b/src/lib/ts/debounced.ts @@ -0,0 +1,11 @@ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function debounced(fn: (...args: any[]) => void, ms: number) { + let timeout: ReturnType | undefined = undefined; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return (...args: any[]) => { + if (timeout !== undefined) clearTimeout(timeout); + + timeout = setTimeout(() => fn(args), ms); + }; +} diff --git a/src/lib/ts/is-letter.ts b/src/lib/ts/is-letter.ts new file mode 100644 index 0000000..d5799d2 --- /dev/null +++ b/src/lib/ts/is-letter.ts @@ -0,0 +1,25 @@ +/* + Installed from github/ieedan/std +*/ + +export const LETTER_REGEX = new RegExp(/[a-zA-Z]/); + +/** Checks if the provided character is a letter in the alphabet. + * + * @param char + * @returns + * + * ## Usage + * ```ts + * isLetter('a'); + * ``` + */ +export function isLetter(char: string): boolean { + if (char.length > 1) { + throw new Error( + `You probably only meant to pass a character to this function. Instead you gave ${char}` + ); + } + + return LETTER_REGEX.test(char); +} diff --git a/src/lib/ts/markdown.ts b/src/lib/ts/markdown.ts new file mode 100644 index 0000000..9cd1bc4 --- /dev/null +++ b/src/lib/ts/markdown.ts @@ -0,0 +1,26 @@ +import { unified } from 'unified'; +import rehypeAutolinkHeadings from 'rehype-autolink-headings'; +import rehypeSlug from 'rehype-slug'; +import rehypePrettyCode from 'rehype-pretty-code'; +import rehypeStringify from 'rehype-stringify'; +import remarkParse from 'remark-parse'; +import remarkRehype from 'remark-rehype'; +import remarkGfm from 'remark-gfm'; +import rehypeExternalLinks from 'rehype-external-links'; +import rehypeRaw from 'rehype-raw'; +import { prettyCodeOptions } from '../../../mdsx.config'; + +const processor = unified() + .use(remarkParse) + .use(remarkGfm) + .use(remarkRehype, { allowDangerousHtml: true }) + .use(rehypeRaw) + .use(rehypeSlug) + .use(rehypeExternalLinks, { target: '_blank' }) + .use(rehypeAutolinkHeadings) + .use(rehypePrettyCode, prettyCodeOptions) + .use(rehypeStringify); + +export async function rehype(md: string) { + return processor.process(md); +} diff --git a/src/lib/ts/parse-package-name.ts b/src/lib/ts/parse-package-name.ts new file mode 100644 index 0000000..2910f6b --- /dev/null +++ b/src/lib/ts/parse-package-name.ts @@ -0,0 +1,33 @@ +/** + * Adapted from https://github.com/egoist/parse-package-name/blob/main/src/index.ts + * @module + */ + +import { Err, Ok, type Result } from './result'; + +// Parsed a scoped package name into name, version, and path. +const RE_SCOPED = /^(@[^/]+\/[^@/]+)(?:@([^/]+))?(\/.*)?$/; +// Parsed a non-scoped package name into name, version, path +const RE_NON_SCOPED = /^([^@/]+)(?:@([^/]+))?(\/.*)?$/; + +export type Package = { + /** Name of the package as it would be installed from npm */ + name: string; + /** Version of the package */ + version: string; + path: string; +}; + +const parsePackageName = (input: string): Result => { + const m = RE_SCOPED.exec(input) || RE_NON_SCOPED.exec(input); + + if (!m) return Err(`invalid package name: ${input}`); + + return Ok({ + name: m[1] || '', + version: m[2] || 'latest', + path: m[3] || '' + }); +}; + +export { parsePackageName }; diff --git a/src/lib/ts/registry/client.ts b/src/lib/ts/registry/client.ts new file mode 100644 index 0000000..cb12940 --- /dev/null +++ b/src/lib/ts/registry/client.ts @@ -0,0 +1,24 @@ +import * as Icons from '$lib/components/icons'; +import { Server } from '@lucide/svelte'; +import { selectProvider } from 'jsrepo'; +import type { Component } from 'svelte'; + +export function getIcon(registryUrl: string): Component | undefined { + const provider = selectProvider(registryUrl); + + if (!provider) return undefined; + + if (provider.name === 'github') { + return Icons.GitHub; + } else if (provider.name === 'gitlab') { + return Icons.GitLab; + } else if (provider.name === 'bitbucket') { + return Icons.BitBucket; + } else if (provider.name === 'azure') { + return Icons.AzureDevops; + } else if (provider.name === 'http') { + return Server; + } + + return undefined; +} diff --git a/src/lib/ts/registry/index.ts b/src/lib/ts/registry/index.ts new file mode 100644 index 0000000..3038659 --- /dev/null +++ b/src/lib/ts/registry/index.ts @@ -0,0 +1,154 @@ +import { + fetchManifest, + github, + gitlab, + type Manifest, + type RegistryProvider, + type RegistryProviderState +} from 'jsrepo'; +import { rehype } from '../markdown'; +import DOMPurify from 'isomorphic-dompurify'; +import { GITHUB_TOKEN, GITLAB_TOKEN } from '$env/static/private'; +import { redis } from '$lib/backend/cache/redis-client'; + +const REGISTRY_STATE_CACHE_PREFIX = 'registry:state'; + +export type RegistryPageData = { + registryUrl: string; + manifest: Manifest; + readme: string | undefined; +}; + +export type RegistryInfo = Omit; + +export function getStateKey(registryUrl: string) { + return `${REGISTRY_STATE_CACHE_PREFIX}:${registryUrl}`; +} + +/** Gets the provider state either locally or from the cache then caches the state + * + * @param registryUrl + * @param provider + * @param param2 + * @returns + */ +export async function getProviderState( + registryUrl: string, + provider: RegistryProvider, + { cache = true }: { cache?: boolean } = {} +): Promise { + const normalizedUrl = provider.parse(registryUrl, { fullyQualified: false }).url; + + const stateKey = getStateKey(normalizedUrl); + + let state: RegistryProviderState | undefined = undefined; + + // http never needs time to get the state + if (cache && provider.name !== 'http') { + const getCached = async (): Promise => { + const s = await redis.get(stateKey); + + if (!s) return undefined; + + // s has everything except for the provider + return { + ...s, + provider + } as RegistryProviderState; + }; + + const getLocal = async () => + await provider.state(registryUrl, { token: getProviderToken(provider) }); + + const resolvedLocal = getLocal(); + + // whichever is faster we use they should say the same thing + const result = await Promise.race([resolvedLocal, getCached()]); + + // if the cache comes back empty just wait the rest of the time for resolvedLocal to resolve + if (result === undefined) { + state = await resolvedLocal; + } else { + state = result; + } + } else { + state = await provider.state(registryUrl, { token: getProviderToken(provider) }); + } + + // never cache http + if (provider.name !== 'http') { + await redis.set(stateKey, state); + } + + return state; +} + +export async function getRegistryData( + providerState: RegistryProviderState +): Promise { + const [manifestResult, readmeResult] = await Promise.all([ + fetchManifest(providerState, { token: getProviderToken(providerState.provider) }), + fetchReadme(providerState) + ]); + + if (manifestResult.isErr()) return undefined; + + const manifest = manifestResult.unwrap(); + + let readme: string | undefined = readmeResult; + + if (readme != undefined) { + const html = (await rehype(readme)).toString(); + + readme = DOMPurify.sanitize(html); + } + + return { + manifest, + readme + }; +} + +/** Gets the readme for the registry (if it exists) */ +export async function fetchReadme(state: RegistryProviderState): Promise { + const url = await state.provider.resolveRaw(state, 'README.md'); + + try { + const headers = new Headers(); + + const token = getProviderToken(state.provider); + + if (token !== undefined && state.provider.authHeader) { + const [key, value] = state.provider.authHeader(token); + + headers.append(key, value); + } + + const response = await fetch(url, { headers }); + + if (!response.ok) { + return undefined; + } + + // this is because instead of returning 404 in some cases a webpage will be returned + if (response.headers.get('Content-Type')?.startsWith('text/html')) { + return undefined; + } + + return await response.text(); + } catch { + return undefined; + } +} + +export function getProviderToken(provider: RegistryProvider): string | undefined { + switch (provider.name) { + case github.name: + return GITHUB_TOKEN; + case gitlab.name: + return GITLAB_TOKEN; + // add the rest of the tokens here + } + + return undefined; +} diff --git a/src/lib/ts/result.ts b/src/lib/ts/result.ts new file mode 100644 index 0000000..ace4041 --- /dev/null +++ b/src/lib/ts/result.ts @@ -0,0 +1,734 @@ +/* + Installed from github/ieedan/std +*/ + +/** This is just a helper type used only within this file */ +type _Result = { ok: true; val: T } | { ok: false; err: E }; + +/** Result allows you to show to a consumer that a function might throw and force them to handle it. + * + * `T` Value type + * + * `E` Error type + * + * ## Usage + * + * ```ts + * function functionThatMightFail(): Result; + * ``` + * + * ## Usage + * + * ```ts + * const functionThatMightFail = (): Result => Ok("Hello, World!"); + * + * const result = functionThatMightFail(); + * + * console.log(result.unwrap()); // "Hello, World!" + * ``` + */ +class Result { + private readonly _result: _Result; + + constructor(result: _Result) { + this._result = result; + } + + /** Allows you to run callbacks based on the result. + * + * @param success callback to be run when result is success + * @param failure callback to be run when result is failure + * @returns + * + * ## Usage + * + * ```ts + * result.match( + * (val) => val, + * () => { + * throw new Error('oops!') + * } + * ); + * ``` + * + * ## Usage + * + * ```ts + * const functionThatMightFail = (): Result => Ok("Hello, World!"); + * + * const result = functionThatMightFail(); + * + * const val = result.match( + * (val) => val, + * () => { + * throw new Error('oops!') + * } + * ); + * + * console.log(val); // "Hello, World!" + * ``` + */ + match(success: (val: T) => A, failure: (err: E) => B): A | B { + if (!this._result.ok) { + return failure(this._result.err); + } + + return success(this._result.val); + } + + /** Maps `Result` to `Result` using the passed mapping function + * + * @param fn Mapping function + * @returns + * + * ## Usage + * + * ```ts + * result.map((val) => val.length); + * ``` + * + * ## Usage + * + * ```ts + * const functionThatMightFail = (): Result => Ok("Hello, World!"); + * + * const result = functionThatMightFail(); + * + * const hello = result.map((val) => val.slice(0, 5)); + * + * console.log(hello.unwrap()); // "Hello" + * ``` + */ + map(fn: (val: T) => A): Result { + return this.match( + (val) => Ok(fn(val)), + (err) => Err(err) + ); + } + + /** In the `Ok` case returns the mapped value using the function else returns `defaultVal` + * + * @param defaultVal Value to be returned when `Err` + * @param fn Mapping function to map in case of `Ok` + * @returns + * + * ## Usage + * + * ```ts + * result.mapOr(1, (val) => val.length); + * ``` + * + * ## Usage + * + * ### When `Ok` + * + * ```ts + * const functionThatMightFail = (): Result => Ok("foo"); + * + * const result = functionThatMightFail(); + * + * const length = result.mapOr(1, (val) => val.length); + * + * console.log(length); // 3 + * ``` + * + * ### When `Err` + * + * ```ts + * const functionThatMightFail = (): Result => Err("oops!"); + * + * const result = functionThatMightFail(); + * + * const length = result.mapOr(1, (val) => val.length); + * + * console.log(length); // 1 + * ``` + */ + mapOr(defaultVal: A, fn: (val: T) => A): A { + return this.match( + (val) => fn(val), + (_) => defaultVal + ); + } + + /** In the `Ok` case returns the mapped value using `fn` else returns value of `def` + * + * @param def Mapping function called when `Err` + * @param fn Mapping function called when `Ok` + * @returns + * + * ## Usage + * + * ```ts + * result.mapOrElse(() => 1, (val) => val.length); + * ``` + * + * ## Usage + * + * ### When `Ok` + * + * ```ts + * const functionThatMightFail = (): Result => Ok("foo"); + * + * const result = functionThatMightFail(); + * + * const length = result.mapOrElse(() => 1, (val) => val.length); + * + * console.log(length); // 3 + * ``` + * + * ### When `Err` + * + * ```ts + * const functionThatMightFail = (): Result => Err("oops!"); + * + * const result = functionThatMightFail(); + * + * const length = result.mapOr(() => 1, (val) => val.length); + * + * console.log(length); // 1 + * ``` + */ + mapOrElse(def: (err: E) => A, fn: (val: T) => A): A { + return this.match( + (val) => fn(val), + (err) => def(err) + ); + } + + /** Maps `Result` to `Result` using the passed mapping function + * + * @param fn Mapping function + * @returns + * + * ## Usage + * + * ```ts + * result.mapErr((err) => getCodeMsg(err)); + * ``` + * + * ## Usage + * + * ```ts + * const functionThatMightFail = (): Result => Err(10); + * + * const result = functionThatMightFail(); + * + * const message = result.mapErr(() => "Error"); + * + * console.log(message); // "Error" + * ``` + */ + mapErr(fn: (err: E) => A): Result { + return this.match( + (val) => Ok(val), + (err) => Err(fn(err)) + ); + } + + /** In the `Err` case returns the mapped value using the function else returns `defaultVal` + * + * @param defaultVal Value to be returned when `Ok` + * @param fn Mapping function to map in case of `Err` + * @returns + * + * ## Usage + * + * ```ts + * result.mapErrOr("Should've been error", (err) => getCodeMsg(err)); + * ``` + * + * ## Usage + * + * ### When `Ok` + * + * ```ts + * const functionThatMightFail = (): Result => Ok("foo"); + * + * const result = functionThatMightFail(); + * + * const message = result.mapErrOr("Should've been error", () => "Error"); + * + * console.log(message); // "Should've been error" + * ``` + * + * ### When `Err` + * + * ```ts + * const functionThatMightFail = (): Result => Err(10); + * + * const result = functionThatMightFail(); + * + * const message = result.mapErrOr("Should've been error", () => "Error"); + * + * console.log(message); // "Error" + * ``` + */ + mapErrOr(defaultVal: A, fn: (err: E) => A): A { + return this.match( + (_) => defaultVal, + (err) => fn(err) + ); + } + + /** In the `Err` case returns the mapped value using the function else returns value of `def` + * + * @param def Mapping function called when `Ok` + * @param fn Mapping function called when `Err` + * @returns + * + * ## Usage + * + * ```ts + * result.mapErrOrElse(() => "Value", (_) => "Error!"); + * ``` + * + * ## Usage + * + * ### When `Ok` + * + * ```ts + * const functionThatMightFail = (): Result => Ok("foo"); + * + * const result = functionThatMightFail(); + * + * const length = result.mapErrOrElse(() => 1, (val) => val.length); + * + * console.log(length); // 1 + * ``` + * + * ### When `Err` + * + * ```ts + * const functionThatMightFail = (): Result => Err("oops!"); + * + * const result = functionThatMightFail(); + * + * const length = result.mapOr(() => 1, (val) => val.length); + * + * console.log(length); // 4 + * ``` + */ + mapErrOrElse(def: (val: T) => A, fn: (err: E) => A): A { + return this.match( + (val) => def(val), + (err) => fn(err) + ); + } + + /** Returns true if result is `Ok` + * + * @returns + * + * ## Usage + * + * ```ts + * result.isOk(); + * ``` + */ + isOk(): boolean { + return this.match( + () => true, + () => false + ); + } + + /** Returns true if result is `Err` + * + * @returns + * + * ## Usage + * + * ```ts + * result.isErr(); + * ``` + */ + isErr(): boolean { + return this.match( + () => false, + () => true + ); + } + + /** Tries to return value if value is `Err` throws generic error message. + * + * @returns + * + * ## Usage + * + * ```ts + * result.unwrap(); + * ``` + * + * ## Usage + * + * ### When `Ok` + * + * ```ts + * const functionThatMightFail = (): Result => Ok("Hello!"); + * + * const result = functionThatMightFail(); + * + * console.log(result.unwrap()); // "Hello!" + * ``` + * + * ### When `Err` + * + * ```ts + * const functionThatMightFail = (): Result => Err("oops!"); + * + * const result = functionThatMightFail(); + * + * result.unwrap(); // Error: Attempted to call `.unwrap()` on a non `Ok` value. + * ``` + */ + unwrap(): T { + return this.match( + (val) => val, + () => { + throw new Error('Attempted to call `.unwrap()` on a non `Ok` value.'); + } + ); + } + + /** Tries to return err if value is `Ok` throws generic error message. + * + * @returns + * + * ## Usage + * + * ```ts + * result.unwrapErr(); + * ``` + * + * ## Usage + * + * ### When `Ok` + * + * ```ts + * const functionThatMightFail = (): Result => Ok("Hello!"); + * + * const result = functionThatMightFail(); + * + * result.unwrapErr(); // Error: Attempted to call `.unwrapErr()` on a non `Err` value. + * ``` + * + * ### When `Err` + * + * ```ts + * const functionThatMightFail = (): Result => Err("oops!"); + * + * const result = functionThatMightFail(); + * + * console.log(result.unwrapErr()); // "oops!" + * ``` + */ + unwrapErr(): E { + return this.match( + () => { + throw new Error('Attempted to call `.unwrapErr()` on a non `Err` value.'); + }, + (err) => err + ); + } + + /** Tries to unwrap the value if value is `Err` returns `defaultVal` + * + * @param defaultVal Value to be returned if `Err` + * @returns + * + * ## Usage + * + * ```ts + * result.unwrapOr(7); + * ``` + * + * ## Usage + * + * ### When `Ok` + * + * ```ts + * const functionThatMightFail = (): Result => Ok("Hello!"); + * + * const result = functionThatMightFail(); + * + * console.log(result.unwrapOr("Yellow!")); // "Hello!" + * ``` + * + * ### When `Err` + * + * ```ts + * const functionThatMightFail = (): Result => Err("oops!"); + * + * const result = functionThatMightFail(); + * + * console.log(result.unwrapOr("Yellow!")); // "Yellow!" + * ``` + */ + unwrapOr(defaultVal: T): T { + return this.match( + (val) => val, + (_) => defaultVal + ); + } + + /** Tries to unwrap the error if vale is `Ok` returns `defaultVal` + * + * @param defaultVal + * @returns + * + * ## Usage + * + * ```ts + * result.unwrapErrOr("Error"); + * ``` + * + * ## Usage + * + * ### When `Ok` + * + * ```ts + * const functionThatMightFail = (): Result => Ok("Hello!"); + * + * const result = functionThatMightFail(); + * + * console.log(result.unwrapErrOr("Yellow!")); // "Yellow!" + * ``` + * + * ### When `Err` + * + * ```ts + * const functionThatMightFail = (): Result => Err("oops!"); + * + * const result = functionThatMightFail(); + * + * console.log(result.unwrapErrOr("Yellow!")); // "oops!" + * ``` + */ + unwrapErrOr(defaultVal: E): E { + return this.match( + () => defaultVal, + (err) => err + ); + } + + /** Tries to return the value if value is `Err` calls `fn` + * + * @param fn Function called if `Err` + * + * ## Usage + * + * ```ts + * result.unwrapOrElse(() => "Hello!"); + * ``` + * + * ## Usage + * + * ### When `Ok` + * + * ```ts + * const functionThatMightFail = (): Result => Ok("Hello!"); + * + * const result = functionThatMightFail(); + * + * console.log(result.unwrapOrElse(() => "oops!")); // "Hello!" + * ``` + * + * ### When `Err` + * + * ```ts + * const functionThatMightFail = (): Result => Err("oops!"); + * + * const result = functionThatMightFail(); + * + * console.log(result.unwrapOrElse(() => "Hello!")); // "Hello!" + * ``` + * + */ + unwrapOrElse(fn: (err: E) => T): T { + return this.match( + (val) => val, + (err) => fn(err) + ); + } + + /** Tries to return the error if value is `Ok` calls `fn` + * + * @param fn Function called if `Ok` + * + * ## Usage + * + * ```ts + * result.unwrapErrOrElse(() => "Error!"); + * ``` + * + * ## Usage + * + * ### When `Ok` + * + * ```ts + * const functionThatMightFail = (): Result => Ok("Hello!"); + * + * const result = functionThatMightFail(); + * + * console.log(result.unwrapErrOrElse(() => "oops!")); // "oops!" + * ``` + * + * ### When `Err` + * + * ```ts + * const functionThatMightFail = (): Result => Err("oops!"); + * + * const result = functionThatMightFail(); + * + * console.log(result.unwrapErrOrElse(() => "Hello!")); // "oops!" + * ``` + * + */ + unwrapErrOrElse(fn: (val: T) => E): E { + return this.match( + (val) => fn(val), + (err) => err + ); + } + + /** Tries to return value if value is `Err` throws custom error message. + * + * @param message Message to show when value is `Err` + * @returns + * + * ## Usage + * + * ```ts + * result.expect("Custom message"); + * ``` + * + * ## Usage + * + * ### When `Ok` + * + * ```ts + * const functionThatMightFail = (): Result => Ok("Hello!"); + * + * const result = functionThatMightFail(); + * + * console.log(result.expect("I failed!")); // "Hello!" + * ``` + * + * ### When `Err` + * + * ```ts + * const functionThatMightFail = (): Result => Err("oops!"); + * + * const result = functionThatMightFail(); + * + * result.expect("I failed!"); // Error: I failed! + * ``` + */ + expect(message: string): T { + return this.match( + (val) => val, + () => { + throw new Error(message); + } + ); + } + + /** Tries to return error value if value is `Ok` throws custom error message + * + * @param message + * @returns + * + * ## Usage + * + * ```ts + * result.expectErr("Custom message"); + * ``` + * + * ## Usage + * + * ### When `Ok` + * + * ```ts + * const functionThatMightFail = (): Result => Ok("Hello!"); + * + * const result = functionThatMightFail(); + * + * console.log(result.expectErr("I failed!")); // Error: I failed! + * ``` + * + * ### When `Err` + * + * ```ts + * const functionThatMightFail = (): Result => Err("oops!"); + * + * const result = functionThatMightFail(); + * + * console.log(result.expectErr("I failed!")); // "oops!" + * ``` + */ + expectErr(message: string): E { + return this.match( + () => { + throw new Error(message); + }, + (err) => err + ); + } +} + +/** Returns a new `Ok` result type with the provided value + * + * @param val Value of the result + * @returns + * + * ## Usage + * + * ```ts + * Ok(true); + * ``` + * + * ## Usage + * + * ```ts + * const functionThatCanFail = (condition) => { + * if (condition) { + * Ok("Success") + * } + * + * return Err("Failure"); + * } + * ``` + */ +export function Ok(val: T): Result { + return new Result({ ok: true, val }); +} + +/** Returns a new `Err` result type with the provided error + * + * @param err Error of the result + * @returns + * + * ## Usage + * + * ```ts + * Err("I failed!"); + * ``` + * + * ## Usage + * + * ```ts + * const functionThatCanFail = (condition) => { + * if (condition) { + * Ok("Success") + * } + * + * return Err("Failure"); + * } + * ``` + */ +export function Err(err: E): Result { + return new Result({ ok: false, err }); +} + +export type { Result }; diff --git a/src/lib/ts/server-actions/search-registries/client.ts b/src/lib/ts/server-actions/search-registries/client.ts new file mode 100644 index 0000000..f2f5fcb --- /dev/null +++ b/src/lib/ts/server-actions/search-registries/client.ts @@ -0,0 +1,5 @@ +import * as v from 'valibot'; + +export const schema = v.object({ + search: v.string() +}); diff --git a/src/lib/ts/server-actions/search-registries/server.ts b/src/lib/ts/server-actions/search-registries/server.ts new file mode 100644 index 0000000..5738689 --- /dev/null +++ b/src/lib/ts/server-actions/search-registries/server.ts @@ -0,0 +1,32 @@ +import { getProviderState } from '$lib/ts/registry'; +import { fail, redirect, type RequestEvent } from '@sveltejs/kit'; +import { selectProvider } from 'jsrepo'; +import { message, setError, superValidate } from 'sveltekit-superforms'; +import { valibot } from 'sveltekit-superforms/adapters'; +import { schema } from './client'; + +export const action = async (event: RequestEvent) => { + const form = await superValidate(event, valibot(schema)); + if (!form.valid) { + return fail(400, { + form + }); + } + + const provider = selectProvider(form.data.search); + + if (!provider) { + return setError(form, 'search', 'Invalid registry url'); + } + + const registryUrl = form.data.search; + + if (event.url.pathname === `/registries/${registryUrl}}`) { + return message(form, 'You are already there!'); + } + + // just gets the state and sets the cache + await getProviderState(registryUrl, provider, { cache: true }); + + throw redirect(303, `/registries/${registryUrl}`); +}; diff --git a/src/lib/ts/url.ts b/src/lib/ts/url.ts new file mode 100644 index 0000000..bfc19bd --- /dev/null +++ b/src/lib/ts/url.ts @@ -0,0 +1,166 @@ +/* + Installed from github/ieedan/std +*/ + +/** Joins the segments into a single url correctly handling leading and trailing slashes in each segment. + * + * @param segments + * @returns + * + * ## Usage + * ```ts + * const url = join('https://example.com', '', 'api/', '/examples/'); + * + * console.log(url); // https://example.com/api/examples + * ``` + */ +export function join(...segments: string[]): string { + return segments + .map((s, i) => { + if (i !== 0) return removeLeadingAndTrailingSlash(s); + + return removeTrailingSlash(s); + }) + .filter(Boolean) + .join('/'); +} + +/** Removes the leading and trailing slash from the segment (if they exist) + * + * @param segment + * @returns + * + * ## Usage + * ```ts + * const segment = removeLeadingAndTrailingSlash('/example/'); + * + * console.log(segment); // 'example' + * ``` + */ +export function removeLeadingAndTrailingSlash(segment: string): string { + const newSegment = removeLeadingSlash(segment); + return removeTrailingSlash(newSegment); +} + +/** Adds a leading and trailing to the beginning and end of the segment (if it doesn't already exist) + * + * @param segment + * @returns + * + * ## Usage + * ```ts + * const segment = addLeadingAndTrailingSlash('example'); + * + * console.log(segment); // '/example/' + * ``` + */ +export function addLeadingAndTrailingSlash(segment: string): string { + // this is a weird case so feel free to handle it however you think it makes the most sense + if (segment === '') return '//'; + + const newSegment = addLeadingSlash(segment); + return addTrailingSlash(newSegment); +} + +/** Removes the leading slash from the beginning of the segment (if it exists) + * + * @param segment + * @returns + * + * ## Usage + * ```ts + * const segment = removeLeadingSlash('/example'); + * + * console.log(segment); // 'example' + * ``` + */ +export function removeLeadingSlash(segment: string): string { + let newSegment = segment; + if (newSegment.startsWith('/')) { + newSegment = newSegment.slice(1); + } + + return newSegment; +} + +/** Adds a leading slash to the beginning of the segment (if it doesn't already exist) + * + * @param segment + * @returns + * + * ## Usage + * ```ts + * const segment = addLeadingSlash('example'); + * + * console.log(segment); // '/example' + * ``` + */ +export function addLeadingSlash(segment: string): string { + let newSegment = segment; + if (!newSegment.startsWith('/')) { + newSegment = `/${newSegment}`; + } + + return newSegment; +} + +/** Removes the trailing slash from the end of the segment (if it exists) + * + * @param segment + * @returns + * + * ## Usage + * ```ts + * const segment = removeTrailingSlash('example/'); + * + * console.log(segment); // 'example' + * ``` + */ +export function removeTrailingSlash(segment: string): string { + let newSegment = segment; + if (newSegment.endsWith('/')) { + newSegment = newSegment.slice(0, newSegment.length - 1); + } + + return newSegment; +} + +/** Adds a trailing slash to the end of the segment (if it doesn't already exist) + * + * @param segment + * @returns + * + * ## Usage + * ```ts + * const segment = addTrailingSlash('example'); + * + * console.log(segment); // 'example/' + * ``` + */ +export function addTrailingSlash(segment: string): string { + let newSegment = segment; + if (!newSegment.endsWith('/')) { + newSegment = `${newSegment}/`; + } + + return newSegment; +} + +/** Removes the last segment of the url. + * + * @param url + * + * ## Usage + * ```ts + * const url = upOneLevel('/first/second'); + * + * console.log(url); // '/first' + * ``` + */ +export function upOneLevel(url: string): string { + if (url === '/') return url; + + const lastIndex = removeTrailingSlash(url).lastIndexOf('/'); + + return url.slice(0, url.length - lastIndex - 1); +} diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..6a2f839 --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,42 @@ +import type { WithElementRef } from 'bits-ui'; +import { type ClassValue, clsx } from 'clsx'; +import type { + HTMLAnchorAttributes, + HTMLAttributes, + HTMLButtonAttributes, + HTMLImgAttributes, + HTMLInputAttributes, + HTMLLabelAttributes, + HTMLLiAttributes, + HTMLOlAttributes, + HTMLTableAttributes, + HTMLTdAttributes, + HTMLTextareaAttributes, + HTMLThAttributes +} from 'svelte/elements'; +import { twMerge } from 'tailwind-merge'; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +export type PrimitiveDivAttributes = WithElementRef>; +export type PrimitiveElementAttributes = WithElementRef>; +export type PrimitiveAnchorAttributes = WithElementRef; +export type PrimitiveButtonAttributes = WithElementRef; +export type PrimitiveInputAttributes = WithElementRef; +export type PrimitiveSpanAttributes = WithElementRef>; +export type PrimitiveTextareaAttributes = WithElementRef; +export type PrimitiveHeadingAttributes = WithElementRef>; +export type PrimitiveLiAttributes = WithElementRef; +export type PrimitiveOlAttributes = WithElementRef; +export type PrimitiveLabelAttributes = WithElementRef; +export type PrimitiveUlAttributes = WithElementRef>; +export type PrimitiveTableAttributes = WithElementRef; +export type PrimitiveTdAttributes = WithElementRef; +export type PrimitiveTrAttributes = WithElementRef>; +export type PrimitiveThAttributes = WithElementRef; +export type PrimitiveTableSectionAttributes = WithElementRef< + HTMLAttributes +>; +export type PrimitiveImgAttributes = WithElementRef; diff --git a/src/lib/utils/utils.ts b/src/lib/utils/utils.ts new file mode 100644 index 0000000..be89e75 --- /dev/null +++ b/src/lib/utils/utils.ts @@ -0,0 +1,10 @@ +/* + Installed from github/ieedan/shadcn-svelte-extras +*/ + +import { type ClassValue, clsx } from 'clsx'; +import { twMerge } from 'tailwind-merge'; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/src/markdown.css b/src/markdown.css new file mode 100644 index 0000000..deba3cd --- /dev/null +++ b/src/markdown.css @@ -0,0 +1,144 @@ +.prose { + h1, + h2, + h3, + h3, + h4 { + @apply mt-4; + } + + h1 { + @apply scroll-m-20 text-4xl font-extrabold tracking-tight lg:text-5xl; + } + + h2 { + @apply scroll-m-20 pb-2 text-3xl font-semibold tracking-tight first:mt-0; + } + + h3 { + @apply scroll-m-20 text-2xl font-semibold tracking-tight; + } + + h4 { + @apply scroll-m-20 text-xl font-semibold tracking-tight; + } + + p { + @apply leading-7 [&:not(:first-child)]:mt-4; + } + + a { + @apply font-medium underline underline-offset-4; + } + + ul { + @apply ml-4 mt-4 list-disc [&>li]:mt-2; + } + + hr { + @apply mt-4; + } + + blockquote { + @apply mt-4 border-l-2 border-l-primary bg-muted/50 px-4 py-2 text-muted-foreground; + } + + [data-pm-command] { + @apply [&:not(:first-child)]:mt-4; + } + + [data-snippet] { + @apply [&:not(:first-child)]:mt-4; + } + + code:not([data-language]) { + @apply relative text-nowrap rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono; + } + + pre { + @apply max-h-[650px] overflow-auto rounded-lg border bg-background py-4; + } + + :not(h1, h2, h3, h4, h5, h6) code:not([data-language]) { + @apply text-sm; + } + + table { + @apply mt-4 w-full; + } + + tr { + @apply m-0 border-t p-0 even:bg-muted/50; + } + + th { + @apply border px-4 py-2 text-left font-bold [&[align=center]]:text-center [&[align=right]]:text-right; + } + + td { + @apply border px-4 py-2 text-left [&[align=center]]:text-center [&[align=right]]:text-right; + } +} + +[data-theme*='github-dark-default'] { + @apply flex flex-col; +} + +[data-rehype-pretty-code-figure] { + @apply relative font-mono text-sm [&:not(:first-child)]:mt-4; +} + +[data-rehype-pretty-code-figure] code { + display: grid; + min-width: 100%; + border-radius: 0; + background: transparent; + padding: 0; + border: 0; + counter-reset: line; + box-decoration-break: clone; +} + +[data-rehype-pretty-code-figure] [data-line] { + @apply inline-block w-full; + + min-height: 1.5rem; + padding: 2px 1rem; +} + +[data-rehype-pretty-code-figure] [data-line-numbers] [data-line] { + padding: 0 0.5rem; +} + +[data-rehype-pretty-code-figure] [data-line-numbers] > [data-line]::before { + @apply inline-block text-right text-muted-foreground; + + counter-increment: line; + content: counter(line); + width: 1.8rem; + margin-right: 1.4rem; +} + +[data-rehype-pretty-code-figure] .line--highlighted { + @apply !bg-accent; +} + +[data-rehype-pretty-code-figure] .line-highlighted span { + @apply relative; +} + +[data-rehype-pretty-code-figure] .chars--highlighted { + @apply rounded-md bg-accent p-1; +} + +code[data-theme*='github-light-default'], +code[data-theme*='github-light-default'] span { + color: var(--shiki-light); + background-color: var(--shiki-light-bg); +} + +.dark code[data-theme*='github-dark-default'], +.dark code[data-theme*='github-dark-default'] span { + color: var(--shiki-dark); + background-color: var(--shiki-dark-bg); +} diff --git a/src/params/registry.ts b/src/params/registry.ts new file mode 100644 index 0000000..36ac380 --- /dev/null +++ b/src/params/registry.ts @@ -0,0 +1,7 @@ +import { selectProvider } from 'jsrepo'; + +export function match(value) { + const provider = selectProvider(value); + + return provider !== undefined; +} diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts new file mode 100644 index 0000000..048c2e9 --- /dev/null +++ b/src/routes/+layout.server.ts @@ -0,0 +1,40 @@ +import { GITHUB_TOKEN } from '$env/static/private'; +// import { Err, Ok, type Result } from '$lib/ts/result'; +import { Octokit } from 'octokit'; + +export const load = async () => { + const stars = getStars(); + + // const version = tryGetVersion().then((ver) => ver.unwrapOr('1.0.0')); + + return { + // version, + stars + }; +}; + +async function getStars() { + const octokit = new Octokit({ auth: GITHUB_TOKEN }); + + const repo = await octokit.rest.repos.get({ owner: 'ieedan', repo: 'jsrepo' }); + + return repo.data.stargazers_count; +} + +// async function tryGetVersion(): Promise> { +// try { +// const response = await fetch( +// 'https://raw.githubusercontent.com/ieedan/jsrepo/refs/heads/main/packages/cli/package.json' +// ); + +// if (!response.ok) { +// return Err('Error getting version'); +// } + +// const { version } = await response.json(); + +// return Ok(version); +// } catch (err) { +// return Err(`Error getting version: ${err}`); +// } +// } diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100644 index 0000000..c1f652c --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,34 @@ + + + +{#if !dev} + +{/if} + + +
    + {@render children()} + +
    + + +
    +
    diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100644 index 0000000..b81fc37 --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,217 @@ + + + + jsrepo - Home + + + +
    +
    +
    +

    Maintainable source registries

    +

    + jsrepo provides a rich set of features to make distributing and consuming code from source + registries maintainable. +

    + +
    +
    + + +
    +
    +
    +
    +
    {'       + 18 more unchanged (-E to expand)'}
    +{` 21      		switch (country) {
    + 22					case "US":
    + 23						return \`Hello, {name}!\`;`}
    +{' 24'}{` 				case "ES":`}
    +{' 24'}{`						return \`Hola, {name}!\`;`}
    +{` 26			    }
    + 27      }
    + 28
    + `}{'       + 58 more unchanged (-E to expand)'}{`
    + 
    +   Accept changes?
    +   ○ Accept
    +   ○ Reject
    +   ● ✨ Update with AI ✨
    + `}
    +
    +
    +
    + +
    +
    +
    +

    Move quickly

    +

    + With unified build tooling theres no need to write your own scripts. +

    +
    + + + > jsrepo build + + + ✔ Completed checking manifest. + +
    + +
    Preview:
    +	◻ utils/array
    +	◻ utils/string
    +
    +
    + ✔ All done. +
    +
    +
    +
    + +
    +
    + + + > jsrepo add ui/button + + + + ✔ All done. + + +
    +

    Add from anywhere

    +

    + Github, GitLab, BitBucket, Azure, or even your own domain! +

    +
    +
    +
    + +
    +
    +
    +
    +

    Update with confidence

    +

    View changes before they're part of your codebase.

    +
    +
    + + + > jsrepo update ui/button + + + github/ieedan/shadcn-svelte-extras/ui/button + + +
    {`      + 20 more unchanged (-E to expand)`}{`
    +  21                           link: 'text-primary underline-offset-4 hover:underline'
    +  22                   },
    +  23                   size: {`}
    +{`  24                           default: 'h-10 `}px-34 py-2',
    +{`  25                           sm: 'h-9 rounded-md px-3',
    +  26                           lg: 'h-11 rounded-md px-8',
    +  27                           icon: 'h-10 w-10'`}
    +{`      + 60 more unchanged (-E to expand)`}
    +
    + + + ✔ All done. + +
    +
    +
    +
    + +
    +
    +

    Use what YOU use

    +

    And let jsrepo do the rest.

    +
    +
    + + + + + + + + + + + + +
    +
    +
    +
    + +
    +
    +

    Convinced yet?

    + +
    +
    +
    diff --git a/src/routes/api/registries/+server.ts b/src/routes/api/registries/+server.ts new file mode 100644 index 0000000..aa8988e --- /dev/null +++ b/src/routes/api/registries/+server.ts @@ -0,0 +1,130 @@ +import { getProviderState, getRegistryData } from '$lib/ts/registry'; +import { error, json } from '@sveltejs/kit'; +import { selectProvider } from 'jsrepo'; +import * as array from '$lib/ts/array.js'; +import { db, functions } from '$lib/backend/db/index.js'; +import { registries } from '$lib/backend/db/schema.js'; +import { desc, isNotNull, ilike, count } from 'drizzle-orm'; +import type { PgColumn } from 'drizzle-orm/pg-core'; +import type { RegistryResponse } from './types'; + +export async function GET({ url }) { + // limit the maximum possible retrieved rows to 100 + const limit = Math.min(parseInt(url.searchParams.get('limit') ?? '20'), 100); + const offset = parseInt(url.searchParams.get('offset') ?? '0'); + const descending = (url.searchParams.get('order') ?? 'asc') === 'desc'; + const orderBy = url.searchParams.get('order_by'); + const withData = (url.searchParams.get('with_data') ?? 'true') === 'true'; + const query = url.searchParams.get('query'); + + let orderByColumn: PgColumn; + + switch (orderBy) { + case 'views': + orderByColumn = registries.views; + break; + default: + orderByColumn = registries.url; + break; + } + + const [registryCount, urls] = await Promise.all([ + db + .select({ count: count() }) + .from(registries) + .where(query !== null ? ilike(registries.url, `%${query}%`) : isNotNull(registries.url)), // isNotNull is to say always match + db + .select() + .from(registries) + .where(query !== null ? ilike(registries.url, `%${query}%`) : isNotNull(registries.url)) // isNotNull is to say always match + .orderBy(descending ? desc(orderByColumn) : orderByColumn) + .offset(offset) + .limit(limit) + ]); + + const registryData = await Promise.all( + urls.map(async ({ url }, i) => { + try { + const provider = selectProvider(url); + + if (!provider) return undefined; + + const normalizedUrl = provider.parse(url, { fullyQualified: false }).url; + + if (!withData) { + return { + order: i, + url: normalizedUrl, + provider: provider.name + }; + } + + const state = await getProviderState(url, provider, { cache: true }); + + const pageData = await getRegistryData(state); + + if (pageData === undefined) return undefined; + + return { + order: i, + readme: pageData.readme, + manifest: pageData.manifest, + url: normalizedUrl, + provider: provider.name + }; + } catch { + return undefined; + } + }) + ); + + const validRegistries = registryData.flatMap((r) => { + if (r === undefined) return []; + + return [r]; + }); + + const uniqueRegistries = array.toMap(validRegistries, (r) => [r.url, r]); + + const result = array + .fromMap(uniqueRegistries, (_, r) => r) + .sort((a, b) => a.order - b.order) + .map((r) => ({ ...r, order: undefined })); + + const total = registryCount[0].count; + + return json({ + registries: result, + hasMore: total > limit + offset, + total + } satisfies RegistryResponse); +} + +export async function POST({ request }) { + const body = await request.json(); + + if (typeof body !== 'object') { + throw error(400, 'request body should be an object with the `url` property!'); + } + + if (typeof body.url !== 'string') + throw error(400, 'the `url` property is required and must be a string!'); + + const url = body.url as string; + + const provider = selectProvider(url); + + if (!provider) throw error(400, 'invalid registry url!'); + + const normalizedUrl = provider.parse(url, { fullyQualified: false }); + + const state = await getProviderState(url, provider); + + const data = await getRegistryData(state); + + if (data === undefined) throw error(404, 'invalid registry'); + + await functions.tryInsert(normalizedUrl.url); + + return json(data); +} diff --git a/src/routes/api/registries/types.ts b/src/routes/api/registries/types.ts new file mode 100644 index 0000000..fcd1e05 --- /dev/null +++ b/src/routes/api/registries/types.ts @@ -0,0 +1,9 @@ +import type { RegistryInfo } from '$lib/ts/registry'; + +export type RegistryResponse = { + registries: + | (RegistryInfo & { url: string; provider: string })[] + | { url: string; provider: string }[]; + hasMore: boolean; + total: number; +}; diff --git a/src/routes/badges/build/[state]/+server.ts b/src/routes/badges/build/[state]/+server.ts new file mode 100644 index 0000000..d34b89a --- /dev/null +++ b/src/routes/badges/build/[state]/+server.ts @@ -0,0 +1,23 @@ +import { error } from '@sveltejs/kit'; +import { makeBadge } from 'badge-maker'; + +export const GET = async ({ params }) => { + let state = params.state; + + if (state.endsWith('.svg')) state = state.slice(0, state.length - 4); + + if (!['passing', 'failing'].includes(state)) throw error(404); + + const svg = makeBadge({ + label: 'jsrepo', + labelColor: '#f7df1e', + color: state === 'failing' ? '#ff0000' : '', + message: `build ${state}` + }); + + return new Response(svg, { + headers: { + 'Content-Type': 'image/svg+xml' + } + }); +}; diff --git a/src/routes/badges/registry/blocks/+server.ts b/src/routes/badges/registry/blocks/+server.ts new file mode 100644 index 0000000..6a7a8ec --- /dev/null +++ b/src/routes/badges/registry/blocks/+server.ts @@ -0,0 +1,35 @@ +import { getProviderState, getProviderToken } from '$lib/ts/registry'; +import { error } from '@sveltejs/kit'; +import { fetchManifest, selectProvider } from 'jsrepo'; +import { makeBadge } from 'badge-maker'; + +export const GET = async ({ url }) => { + const registryUrl = url.searchParams.get('url'); + + if (registryUrl == null) throw error(400, 'Expected `url` search param'); + + const provider = selectProvider(registryUrl); + + if (!provider) throw error(400, 'Invalid registry url'); + + const state = await getProviderState(registryUrl, provider, { cache: true }); + + const manifest = (await fetchManifest(state, { token: getProviderToken(state.provider) })).match( + (v) => v, + (err) => { + throw error(400, `Error fetching manifest: ${err}`); + } + ); + + const svg = makeBadge({ + label: 'jsrepo', + labelColor: '#f7df1e', + message: `${manifest.categories.flatMap((c) => c.blocks).length} blocks` + }); + + return new Response(svg, { + headers: { + 'Content-Type': 'image/svg+xml' + } + }); +}; diff --git a/src/routes/badges/registry/categories/+server.ts b/src/routes/badges/registry/categories/+server.ts new file mode 100644 index 0000000..48f8e62 --- /dev/null +++ b/src/routes/badges/registry/categories/+server.ts @@ -0,0 +1,35 @@ +import { getProviderState, getProviderToken } from '$lib/ts/registry'; +import { error } from '@sveltejs/kit'; +import { fetchManifest, selectProvider } from 'jsrepo'; +import { makeBadge } from 'badge-maker'; + +export const GET = async ({ url }) => { + const registryUrl = url.searchParams.get('url'); + + if (registryUrl == null) throw error(400, 'Expected `url` search param'); + + const provider = selectProvider(registryUrl); + + if (!provider) throw error(400, 'Invalid registry url'); + + const state = await getProviderState(registryUrl, provider, { cache: true }); + + const manifest = (await fetchManifest(state, { token: getProviderToken(state.provider) })).match( + (v) => v, + (err) => { + throw error(400, `Error fetching manifest: ${err}`); + } + ); + + const svg = makeBadge({ + label: 'jsrepo', + labelColor: '#f7df1e', + message: `${manifest.categories.length} categories` + }); + + return new Response(svg, { + headers: { + 'Content-Type': 'image/svg+xml' + } + }); +}; diff --git a/src/routes/badges/registry/dependencies/+server.ts b/src/routes/badges/registry/dependencies/+server.ts new file mode 100644 index 0000000..21ece20 --- /dev/null +++ b/src/routes/badges/registry/dependencies/+server.ts @@ -0,0 +1,45 @@ +import { getProviderState, getProviderToken } from '$lib/ts/registry'; +import { error } from '@sveltejs/kit'; +import { fetchManifest, selectProvider } from 'jsrepo'; +import { makeBadge } from 'badge-maker'; + +export const GET = async ({ url }) => { + const registryUrl = url.searchParams.get('url'); + + if (registryUrl == null) throw error(400, 'Expected `url` search param'); + + const provider = selectProvider(registryUrl); + + if (!provider) throw error(400, 'Invalid registry url'); + + const state = await getProviderState(registryUrl, provider, { cache: true }); + + const manifest = (await fetchManifest(state, { token: getProviderToken(state.provider) })).match( + (v) => v, + (err) => { + throw error(400, `Error fetching manifest: ${err}`); + } + ); + + const dependencies = new Set(); + + for (const category of manifest.categories) { + for (const block of category.blocks) { + for (const dep of [...block.dependencies, ...block.devDependencies]) { + dependencies.add(dep); + } + } + } + + const svg = makeBadge({ + label: 'jsrepo', + labelColor: '#f7df1e', + message: `${dependencies.size} dependencies` + }); + + return new Response(svg, { + headers: { + 'Content-Type': 'image/svg+xml' + } + }); +}; diff --git a/src/routes/demos/+page.svelte b/src/routes/demos/+page.svelte new file mode 100644 index 0000000..2ea5751 --- /dev/null +++ b/src/routes/demos/+page.svelte @@ -0,0 +1,60 @@ + + + + jsrepo - Demos + + + +
    +
    + {#each videos as { title, description, src } (title)} +
    + +
    +

    {title}

    + + {description} + +
    +
    + {/each} +
    +
    diff --git a/src/routes/docs/+error.svelte b/src/routes/docs/+error.svelte new file mode 100644 index 0000000..389400c --- /dev/null +++ b/src/routes/docs/+error.svelte @@ -0,0 +1,8 @@ + + + +

    + {page.error.message} +

    diff --git a/src/routes/docs/+layout.svelte b/src/routes/docs/+layout.svelte new file mode 100644 index 0000000..c8e27d9 --- /dev/null +++ b/src/routes/docs/+layout.svelte @@ -0,0 +1,66 @@ + + +
    + +
    + {@render children()} +
    + {#if paginated.previous} + {@const { href, title } = paginated.previous} + + {title} + + {/if} + {#if paginated.next} + {@const { href, title } = paginated.next} + + {title} + + {/if} +
    +
    + +
    diff --git a/src/routes/docs/+page.svelte b/src/routes/docs/+page.svelte new file mode 100644 index 0000000..2090cf7 --- /dev/null +++ b/src/routes/docs/+page.svelte @@ -0,0 +1,11 @@ + + + + + diff --git a/src/routes/docs/+page.ts b/src/routes/docs/+page.ts new file mode 100644 index 0000000..77bfec0 --- /dev/null +++ b/src/routes/docs/+page.ts @@ -0,0 +1,16 @@ +import { error } from '@sveltejs/kit'; + +export async function load() { + // @ts-expect-error wrong + const doc = await import('../../lib/docs/index.md'); + + if (!doc || !doc.metadata) { + error(404); + } + + return { + ...doc.metadata, + path: '/', + component: doc.default + }; +} diff --git a/src/routes/docs/[...slug]/+page.svelte b/src/routes/docs/[...slug]/+page.svelte new file mode 100644 index 0000000..2090cf7 --- /dev/null +++ b/src/routes/docs/[...slug]/+page.svelte @@ -0,0 +1,11 @@ + + + + + diff --git a/src/routes/docs/[...slug]/+page.ts b/src/routes/docs/[...slug]/+page.ts new file mode 100644 index 0000000..01ee91a --- /dev/null +++ b/src/routes/docs/[...slug]/+page.ts @@ -0,0 +1,12 @@ +import { getDoc } from '$lib/docs/index'; +import { error } from '@sveltejs/kit'; + +export async function load({ params }) { + const doc = await getDoc(params.slug); + + if (!doc) { + error(404); + } + + return doc; +} diff --git a/src/routes/registries/+page.server.ts b/src/routes/registries/+page.server.ts new file mode 100644 index 0000000..c3b196c --- /dev/null +++ b/src/routes/registries/+page.server.ts @@ -0,0 +1,11 @@ +import { getFeatured, getPopular } from '$lib/backend/db/functions'; + +export async function load() { + const featured = getFeatured(); + const popular = getPopular(); + + return { + popular, + featured + }; +} diff --git a/src/routes/registries/+page.svelte b/src/routes/registries/+page.svelte new file mode 100644 index 0000000..3851636 --- /dev/null +++ b/src/routes/registries/+page.svelte @@ -0,0 +1,79 @@ + + + + jsrepo - Registries + + + +
    +
    +

    Registries

    + + + +
    + + +
    + featured +
      + {#await data.featured} + {#each { length: 5 } as _, i (i)} +
    1. + +
    2. + {/each} + {:then featured} + {#each featured as registry (registry.url)} + {@const Icon = getIcon(registry.url)} +
    3. + + + + {registry.url} + +
    4. + {/each} + {/await} +
    +
    +
    +
    +
    diff --git a/src/routes/registries/[...registry]/+layout.svelte b/src/routes/registries/[...registry]/+layout.svelte new file mode 100644 index 0000000..a929491 --- /dev/null +++ b/src/routes/registries/[...registry]/+layout.svelte @@ -0,0 +1,17 @@ + + +
    +
    +
    + +
    +
    + +
    + {@render children()} +
    +
    diff --git a/src/routes/registries/[...registry]/+page.server.ts b/src/routes/registries/[...registry]/+page.server.ts new file mode 100644 index 0000000..eaa1e1a --- /dev/null +++ b/src/routes/registries/[...registry]/+page.server.ts @@ -0,0 +1,35 @@ +import { dev } from '$app/environment'; +import { functions } from '$lib/backend/db'; +import { getProviderState, getRegistryData } from '$lib/ts/registry'; +import { action } from '$lib/ts/server-actions/search-registries/server'; +import { error, redirect } from '@sveltejs/kit'; +import { selectProvider } from 'jsrepo'; + +export async function load({ params }) { + const registryUrl = params.registry; + + const provider = selectProvider(registryUrl); + + if (!provider) redirect(303, '/registries'); + + const state = await getProviderState(registryUrl, provider, { cache: true }); + + const pageData = await getRegistryData(state); + + if (!pageData) { + error(404, { message: 'registry-search: Could not find the requested registry' }); + } + + if (!dev) { + await functions.tryIncrementViews(registryUrl); + } + + return { + ...pageData, + registryUrl + }; +} + +export const actions = { + default: action +}; diff --git a/src/routes/registries/[...registry]/+page.svelte b/src/routes/registries/[...registry]/+page.svelte new file mode 100644 index 0000000..2bdd7c7 --- /dev/null +++ b/src/routes/registries/[...registry]/+page.svelte @@ -0,0 +1,360 @@ + + + + {data.registryUrl} - Registries - jsrepo + + + +
    +
    +
    +
    +

    +

    + {#if data.manifest.meta?.description} +

    {data.manifest.meta?.description}

    + {/if} +
    + +
    + + + + README + + + Blocks + + + Dependencies + + + Manifest + + + +
    + {#if data.readme} + {@html data.readme} + {:else} +
    + + This registry doesn't have a README. + + + Add a README.md to the root of the registry for it to be displayed here. + +
    + {/if} +
    +
    + +
    + {#each data.manifest.categories as category (category)} + {#each category.blocks.filter((b) => b.list) as block (block.name)} + {@const primaryLanguage = determinePrimaryLanguage(block)} + + + {#snippet child({ props })} + + {/snippet} + + +
    +
    + Files +
      + {#each block.files as file (file)} + {@const ext = parseFileExtension(file)} +
    • +
      + + {#snippet fallback()} + + {/snippet} + +
      + {file} +
    • + {/each} +
    +
    +
    + Remote Dependencies +
      + {#each [...block.dependencies, ...block.devDependencies] as dep (dep)} +
    • {dep}
    • + {/each} +
    +
    +
    + Local Dependencies +
      + {#each block.localDependencies as dep (dep)} +
    • {dep}
    • + {/each} +
    +
    +
    +
    +
    + {/each} + {/each} +
    +
    + + + + + Package + Version + + + + {#each registryInfo.dependencies as dep (dep)} + {@const pkg = parsePackageName(dep).unwrap()} + + + + {pkg.name} + + + + {pkg.version} + + + {/each} + + + + +
    + +
    +
    +
    +
    + + +
    +
    + {#if data.manifest.meta?.tags && data.manifest.meta.tags.length > 0} +
    + {#each data.manifest.meta.tags as tag, i (i)} + {tag} + {/each} +
    + + {/if} + {#if data.manifest.meta?.homepage} + + {/if} + + {#if data.manifest.meta?.repository} + + {:else if provider && provider?.name !== 'http'} + {@const baseUrl = provider.baseUrl(data.registryUrl)} +
    + Repository + + {baseUrl} + + +
    + {/if} + +
    +
    + Categories + {registryInfo.categories} +
    + +
    + Blocks + {registryInfo.blocks} +
    + +
    + Dependencies + {registryInfo.dependencies.length} +
    + +
    + Config Files + {(data.manifest.configFiles ?? []).length} +
    +
    + + {#if data.manifest.meta?.authors} +
    + Authors +
    + {#each data.manifest.meta.authors as author, i (author)} + {author}{i < data.manifest.meta.authors.length - 1 ? ',' : ''} + {/each} +
    +
    + {/if} +
    +
    +
    diff --git a/src/routes/registries/search/+page.server.ts b/src/routes/registries/search/+page.server.ts new file mode 100644 index 0000000..a514574 --- /dev/null +++ b/src/routes/registries/search/+page.server.ts @@ -0,0 +1,46 @@ +import { error, redirect } from '@sveltejs/kit'; +import type { RegistryResponse } from '../../api/registries/types.js'; + +export async function load({ url, fetch }) { + const query = url.searchParams.get('query'); + + if (query === null) redirect(303, '/registries'); + + const limit = 15; + const offset = parseInt(url.searchParams.get('offset') ?? '0'); + const order = url.searchParams.get('order') ?? 'asc'; + let orderBy = url.searchParams.get('order_by') ?? 'alphabetical'; + + if (orderBy !== 'alphabetical' && orderBy !== 'views') { + orderBy = 'alphabetical'; + } + + const search = `?with_data=false&query=${query}&order=${order}&offset=${offset}&limit=${limit}&order_by=${orderBy}`; + + const response = fetchResults(search, fetch); + + return { + query, + limit, + response + }; +} + +async function fetchResults( + search: string, + f: typeof fetch +): Promise { + try { + const requestUrl = `/api/registries${search}`; + + const response = await f(requestUrl); + + if (!response.ok) { + error(response.status); + } + + return await response.json(); + } catch { + return undefined; + } +} diff --git a/src/routes/registries/search/+page.svelte b/src/routes/registries/search/+page.svelte new file mode 100644 index 0000000..f18b7c1 --- /dev/null +++ b/src/routes/registries/search/+page.svelte @@ -0,0 +1,151 @@ + + + + {$params.query} - jsrepo search + + + +
    +
    +
    + ($params.query = search)} + /> +
    +
    + +
    +
    +
    +
    + {#await data.response then response} + {#if response} + {response.total} registries found + {/if} + {/await} +
    +
    + ($params.order = state ? 'asc' : 'desc')} + > + {#if asc} + + {:else} + + {/if} + + ($params['order_by'] = v)} + > + + Sort By: {casing.kebabToPascal(orderBy)} + + + Alphabetical + Views + + +
    +
    +
      + {#await data.response} + {#each { length: 4 } as _, i (i)} +
    1. + +
    2. + {/each} + {:then response} + {@const registries = response?.registries} + {#if registries} + {#each registries as registry (registry.url)} + {@const Icon = getIcon(registry.url)} +
    3. + + + + {registry.url} + +
    4. + {/each} + {/if} + {/await} +
    +
    + {#await data.response then response} + {#if response} + ($params.offset = (v - 1) * data.limit)} + count={response.total} + perPage={data.limit} + > + {#snippet children({ pages, currentPage })} + {#if pages.length > 1} + + + + + + + + {#each pages as page (page.key)} + {#if page.type === 'ellipsis'} + + + + {:else} + + + {page.value} + + + {/if} + {/each} + + + + + + + + {/if} + {/snippet} + + {/if} + {/await} +
    +
    +
    +
    diff --git a/static/badges/jsrepo.svg b/static/badges/jsrepo.svg new file mode 100644 index 0000000..d73199f --- /dev/null +++ b/static/badges/jsrepo.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/static/docs/cli/llms.txt b/static/docs/cli/llms.txt new file mode 100644 index 0000000..f0c667b --- /dev/null +++ b/static/docs/cli/llms.txt @@ -0,0 +1,149 @@ +# jsrepo + +> A CLI to add shared code from remote repositories. + +Latest Version: 1.47.0 + +## Commands + +### add + +Add blocks to your project. + +#### Usage +```bash +jsrepo add [options] [blocks...] +``` + +#### Options +- --formatter : The formatter to use when adding blocks. +- --watermark : Include a watermark at the top of added files. +- --tests : Include tests when adding blocks. +- --paths : The paths where categories should be added to your project. +- -E, --expand: Expands the diff so you see the entire file. +- --max-unchanged : Maximum unchanged lines that will show without being collapsed. (default: 3) +- --repo : Repository to download the blocks from. +- -A, --allow: Allow jsrepo to download code from the provided repo. +- -y, --yes: Skip confirmation prompt. +- --no-cache: Disable caching of resolved git urls. +- --verbose: Include debug logs. +- --cwd : The current working directory. (default: ./) + +### auth + +Provide a token for access to private repositories. + +#### Usage +```bash +jsrepo auth [options] [service] +``` + +#### Options +- --logout: Execute the logout flow. +- --token : The token to use for authenticating to this service. +- --cwd : The current working directory. (default: ./) + +### build + +Builds the provided --dirs in the project root into a `jsrepo-manifest.json` file. + +#### Usage +```bash +jsrepo build [options] +``` + +#### Options +- --dirs [dirs...]: The directories containing the blocks. +- --output-dir : The directory to output the registry to. (Copies jsrepo-manifest.json + all required files) +- --include-blocks [blockNames...]: Include only the blocks with these names. +- --include-categories [categoryNames...]: Include only the categories with these names. +- --exclude-blocks [blockNames...]: Do not include the blocks with these names. +- --exclude-categories [categoryNames...]: Do not include the categories with these names. +- --list-blocks [blockNames...]: List only the blocks with these names. +- --list-categories [categoryNames...]: List only the categories with these names. +- --do-not-list-blocks [blockNames...]: Do not list the blocks with these names. +- --do-not-list-categories [categoryNames...]: Do not list the categories with these names. +- --exclude-deps [deps...]: Dependencies that should not be added. +- --allow-subdirectories: Allow subdirectories to be built. +- --preview: Display a preview of the blocks list. +- --no-output: Do not output a `jsrepo-manifest.json` file. +- --verbose: Include debug logs. +- --cwd : The current working directory. (default: ./) + +### exec + +Execute a block as a script. + +#### Usage +```bash +jsrepo exec [options] [script] +``` + +#### Options +- --repo : Repository to download and run the script from. +- -A, --allow: Allow jsrepo to download code from the provided repo. +- --no-cache: Disable caching of resolved git urls. +- --verbose: Include debug logs. +- --cwd : The current working directory. (default: ./) + +### init + +Initializes your project with a configuration file. + +#### Usage +```bash +jsrepo init [options] [registries...] +``` + +#### Options +- --repos [repos...]: Repository to install the blocks from. (DEPRECATED) +- --no-watermark: Will not add a watermark to each file upon adding it to your project. +- --tests: Will include tests with the blocks. +- --formatter : What formatter to use when adding or updating blocks. +- -P, --project: Takes you through the steps to initialize a project. +- -R, --registry: Takes you through the steps to initialize a registry. +- --script : The name of the build script. (For Registry setup) (default: build:registry) +- -E, --expand: Expands the diff so you see the entire file. +- --max-unchanged : Maximum unchanged lines that will show without being collapsed. (default: 3) +- -y, --yes: Skip confirmation prompt. +- --no-cache: Disable caching of resolved git urls. +- --cwd : The current working directory. (default: ./) + +### test + +Tests local blocks against most recent remote tests. + +#### Usage +```bash +jsrepo test [options] [blocks...] +``` + +#### Options +- --repo : Repository to download the blocks from. +- -A, --allow: Allow jsrepo to download code from the provided repo. +- --debug: Leaves the temp test file around for debugging upon failure. +- --no-cache: Disable caching of resolved git urls. +- --verbose: Include debug logs. +- --cwd : The current working directory. (default: ./) + +### update + +Update blocks to the code in the remote repository. + +#### Usage +```bash +jsrepo update [options] [blocks...] +``` + +#### Options +- --all: Update all installed components. +- -E, --expand: Expands the diff so you see the entire file. +- --max-unchanged : Maximum unchanged lines that will show without being collapsed. (default: 3) +- -n, --no: Do update any blocks. +- --repo : Repository to download the blocks from. +- -A, --allow: Allow jsrepo to download code from the provided repo. +- -y, --yes: Skip confirmation prompt. +- --no-cache: Disable caching of resolved git urls. +- --verbose: Include debug logs. +- --cwd : The current working directory. (default: ./) + diff --git a/static/docs/images/update-diff.png b/static/docs/images/update-diff.png new file mode 100644 index 0000000..93fad37 Binary files /dev/null and b/static/docs/images/update-diff.png differ diff --git a/static/favicon.png b/static/favicon.png new file mode 100644 index 0000000..b7bd7e4 Binary files /dev/null and b/static/favicon.png differ diff --git a/static/llms.txt b/static/llms.txt new file mode 100644 index 0000000..7101986 --- /dev/null +++ b/static/llms.txt @@ -0,0 +1,26 @@ +# jsrepo Documentation for LLMs + +> jsrepo is a CLI that aims to make sharing your code easy and lightweight. It builds your code into a registry and allows you to download it from the CLI a lot like shadcn-ui. + +## Package Documentation + +- [jsrepo CLI](https://jsrepo.dev/docs/cli/llms.txt) + +## Provider Support + +jsrepo supports multiple ways of serving your registry, you can host your registry on GitHub, GitLab, BitBucket, Azure DevOps or on your own domain. + +## Language Support + +- JavaScript (*.js) +- TypeScript (*.ts) +- JSX (*.jsx) +- TSX (*.tsx) +- Svelte (*.svelte) +- Vue (*.vue) +- YAML (*.(yaml|yml)) +- JSON (*.(json|jsonc)) +- CSS (*.css) +- SVG (*.svg) +- SASS (*.(sass|scss)) +- HTML (*.html) diff --git a/static/robots.txt b/static/robots.txt new file mode 100644 index 0000000..14267e9 --- /dev/null +++ b/static/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Allow: / \ No newline at end of file diff --git a/svelte.config.js b/svelte.config.js new file mode 100644 index 0000000..2612127 --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,25 @@ +import { mdsx } from 'mdsx'; +import mdsxConfig from './mdsx.config.js'; +import adapter from '@sveltejs/adapter-vercel'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + // Consult https://svelte.dev/docs/kit/integrations + // for more information about preprocessors + preprocess: [vitePreprocess(), mdsx(mdsxConfig)], + + kit: { + // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. + // If your environment is not supported, or you settled on a specific environment, switch out the adapter. + // See https://svelte.dev/docs/kit/adapters for more information about adapters. + adapter: adapter(), + alias: { + '$content/*': '.velite/*' + } + }, + + extensions: ['.svelte', '.svx', '.md'] +}; + +export default config; diff --git a/tailwind.config.ts b/tailwind.config.ts new file mode 100644 index 0000000..c0230a8 --- /dev/null +++ b/tailwind.config.ts @@ -0,0 +1,106 @@ +import type { Config } from 'tailwindcss'; +import tailwindcssAnimate from 'tailwindcss-animate'; + +const config: Config = { + darkMode: ['class'], + content: ['./src/**/*.{html,js,svelte,ts,md,svx}'], + safelist: ['dark'], + theme: { + container: { + center: true, + padding: '2rem', + screens: { + '2xl': '1400px' + } + }, + extend: { + colors: { + border: 'hsl(var(--border) / )', + input: 'hsl(var(--input) / )', + ring: 'hsl(var(--ring) / )', + background: 'hsl(var(--background) / )', + foreground: 'hsl(var(--foreground) / )', + primary: { + DEFAULT: 'hsl(var(--primary) / )', + foreground: 'hsl(var(--primary-foreground) / )' + }, + secondary: { + DEFAULT: 'hsl(var(--secondary) / )', + foreground: 'hsl(var(--secondary-foreground) / )' + }, + destructive: { + DEFAULT: 'hsl(var(--destructive) / )', + foreground: 'hsl(var(--destructive-foreground) / )' + }, + muted: { + DEFAULT: 'hsl(var(--muted) / )', + foreground: 'hsl(var(--muted-foreground) / )' + }, + accent: { + DEFAULT: 'hsl(var(--accent) / )', + foreground: 'hsl(var(--accent-foreground) / )' + }, + popover: { + DEFAULT: 'hsl(var(--popover) / )', + foreground: 'hsl(var(--popover-foreground) / )' + }, + card: { + DEFAULT: 'hsl(var(--card) / )', + foreground: 'hsl(var(--card-foreground) / )' + }, + sidebar: { + DEFAULT: 'hsl(var(--sidebar-background))', + foreground: 'hsl(var(--sidebar-foreground))', + primary: 'hsl(var(--sidebar-primary))', + 'primary-foreground': 'hsl(var(--sidebar-primary-foreground))', + accent: 'hsl(var(--sidebar-accent))', + 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))', + border: 'hsl(var(--sidebar-border))', + ring: 'hsl(var(--sidebar-ring))' + } + }, + borderRadius: { + xl: 'calc(var(--radius) + 4px)', + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)' + }, + fontFamily: { + sans: ['Oxanium Variable', 'sans-serif'], + mono: ['JetBrains Mono Variable', 'monospace'] + }, + keyframes: { + 'accordion-down': { + from: { height: '0' }, + to: { height: 'var(--bits-accordion-content-height)' } + }, + 'accordion-up': { + from: { height: 'var(--bits-accordion-content-height)' }, + to: { height: '0' } + }, + 'caret-blink': { + '0%,70%,100%': { opacity: '1' }, + '20%,50%': { opacity: '0' } + }, + marquee: { + from: { transform: 'translateX(0)' }, + to: { transform: 'translateX(calc(-100% - var(--gap)))' } + }, + 'marquee-vertical': { + from: { transform: 'translateY(0)' }, + to: { transform: 'translateY(calc(-100% - var(--gap)))' } + } + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + 'caret-blink': 'caret-blink 1.25s ease-out infinite', + marquee: 'marquee var(--duration) linear infinite', + 'marquee-vertical': 'marquee-vertical var(--duration) linear infinite' + } + } + }, + plugins: [tailwindcssAnimate] +}; + +export default config; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..ca6cc51 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,33 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + }, + "include": [ + // SvelteKit defaults + "./.svelte-kit/ambient.d.ts", + "./.svelte-kit/non-ambient.d.ts", + "./.svelte-kit/types/**/$types.d.ts", + "./vite.config.js", + "./vite.config.ts", + "./src/**/*.js", + "./src/**/*.ts", + "./src/**/*.svelte", + "./tests/**/*.js", + "./tests/**/*.ts", + "./tests/**/*.svelte", + // Additions + "mdsx.config.js", + "./velite.config.js", + ".velite/**/*" + ], + "exclude": ["./node_modules/**"] +} diff --git a/velite.config.js b/velite.config.js new file mode 100644 index 0000000..1c270cc --- /dev/null +++ b/velite.config.js @@ -0,0 +1,19 @@ +import { defineConfig, s } from 'velite'; +import { generateIndex } from '$lib/scripts/generate-index.js'; + +export default defineConfig({ + root: './src/lib/docs', + collections: { + docs: { + name: 'Docs', + pattern: './**/*.md', + schema: s.object({ + title: s.string().max(25), + description: s.string(), + lastUpdated: s.isodate(), + path: s.path() + }) + } + }, + complete: generateIndex +}); diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..5087df9 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,16 @@ +import { fileURLToPath } from 'node:url'; +import { join } from 'node:path'; +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +const __dirname = fileURLToPath(new URL('.', import.meta.url)); +export const veliteDirPath = join(__dirname, '.velite'); + +export default defineConfig({ + plugins: [sveltekit()], + server: { + fs: { + allow: [veliteDirPath] + } + } +});