├── .nvmrc ├── server ├── .npmrc ├── nodemon.json ├── src │ ├── env.ts │ ├── index.ts │ ├── middleware.ts │ ├── server.ts │ └── pokedex.ts ├── tsconfig.json └── package.json ├── alpic.json ├── docs └── demo.gif ├── pnpm-workspace.yaml ├── .cursor └── mcp.json ├── .prettierrc ├── web ├── src │ ├── utils.ts │ ├── helpers.ts │ ├── index.css │ ├── widgets │ │ └── pokemon.tsx │ └── components │ │ └── ui │ │ └── shadcn-io │ │ └── spinner │ │ └── index.tsx ├── tsconfig.json ├── vite.config.ts ├── components.json ├── tsconfig.node.json ├── eslint.config.js ├── tsconfig.app.json └── package.json ├── .vscode ├── tasks.json ├── launch.json └── settings.json ├── eslint.config.mjs ├── package.json ├── README.md ├── .gitignore └── pnpm-lock.yaml /.nvmrc: -------------------------------------------------------------------------------- 1 | lts/jod -------------------------------------------------------------------------------- /server/.npmrc: -------------------------------------------------------------------------------- 1 | sharedWorkspaceLockfile=false -------------------------------------------------------------------------------- /alpic.json: -------------------------------------------------------------------------------- 1 | { 2 | "buildOutputDir": "server/dist" 3 | } -------------------------------------------------------------------------------- /docs/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alpic-ai/apps-sdk-template/HEAD/docs/demo.gif -------------------------------------------------------------------------------- /server/nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "watch": ["src/**/*"], 3 | "ext": "ts,js,json", 4 | "exec": "tsx src/index.ts" 5 | } 6 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - "web" 3 | - "server" 4 | sharedWorkspaceLockfile: false 5 | 6 | catalog: 7 | skybridge: ^0.11.1 8 | -------------------------------------------------------------------------------- /.cursor/mcp.json: -------------------------------------------------------------------------------- 1 | { 2 | "mcpServers": { 3 | "local": { 4 | "url": "http://localhost:3000/mcp" 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "useTabs": false, 4 | "singleQuote": false, 5 | "trailingComma": "all", 6 | "printWidth": 120, 7 | "bracketSpacing": true 8 | } 9 | -------------------------------------------------------------------------------- /web/src/utils.ts: -------------------------------------------------------------------------------- 1 | import { clsx, type ClassValue } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /web/src/helpers.ts: -------------------------------------------------------------------------------- 1 | import type { AppType } from "../../server/src/server"; 2 | import { generateHelpers } from "skybridge/web"; 3 | 4 | export const { useCallTool, useToolInfo } = generateHelpers(); 5 | -------------------------------------------------------------------------------- /web/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }], 4 | "compilerOptions": { 5 | "baseUrl": ".", 6 | "paths": { 7 | "@/*": ["./src/*"] 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "shell", 6 | "command": "npm", 7 | "args": ["build"], 8 | "group": "build", 9 | "label": "npm: build", 10 | "detail": "npm build", 11 | "problemMatcher": ["$tsc"] 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | import eslint from "@eslint/js"; 3 | import eslintConfigPrettier from "eslint-config-prettier"; 4 | import tseslint from "typescript-eslint"; 5 | 6 | export default tseslint.config(eslint.configs.recommended, tseslint.configs.recommended, eslintConfigPrettier, { 7 | ignores: ["**/*.js"], 8 | }); -------------------------------------------------------------------------------- /server/src/env.ts: -------------------------------------------------------------------------------- 1 | import "dotenv/config"; 2 | 3 | import { createEnv } from "@t3-oss/env-core"; 4 | import { z } from "zod"; 5 | 6 | export const env = createEnv({ 7 | server: { 8 | NODE_ENV: z.enum(["development", "production"]).default("development"), 9 | }, 10 | runtimeEnv: process.env, 11 | emptyStringAsUndefined: true, 12 | }); 13 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.0.1", 3 | "configurations": [ 4 | { 5 | "name": "Debug MCP Server", 6 | "type": "node", 7 | "request": "launch", 8 | "program": "${workspaceFolder}/dist/index.js", 9 | "console": "integratedTerminal", 10 | "sourceMaps": true, 11 | "outFiles": ["${workspaceFolder}/dist/**/*.js"], 12 | "preLaunchTask": "npm: build", 13 | "stopOnEntry": false 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /web/vite.config.ts: -------------------------------------------------------------------------------- 1 | import tailwindcss from "@tailwindcss/vite"; 2 | import react from "@vitejs/plugin-react"; 3 | import path from "path"; 4 | import { defineConfig } from "vite"; 5 | import { skybridge } from "skybridge/web"; 6 | 7 | // https://vite.dev/config/ 8 | export default defineConfig({ 9 | plugins: [skybridge(), react(), tailwindcss()], 10 | 11 | resolve: { 12 | alias: { 13 | "@": path.resolve(__dirname, "./src"), 14 | }, 15 | }, 16 | }); 17 | -------------------------------------------------------------------------------- /server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "module": "ESNext", 5 | "moduleResolution": "bundler", 6 | "esModuleInterop": true, 7 | "strict": true, 8 | "skipLibCheck": true, 9 | "forceConsistentCasingInFileNames": true, 10 | "outDir": "dist", 11 | "sourceMap": true, 12 | "jsx": "react", 13 | "inlineSources": true 14 | }, 15 | "include": ["**/*.ts", "**/*.tsx"], 16 | "exclude": ["dist", "node_modules"] 17 | } 18 | -------------------------------------------------------------------------------- /web/components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 4 | "rsc": false, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "", 8 | "css": "src/index.css", 9 | "baseColor": "neutral", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "iconLibrary": "lucide", 14 | "aliases": { 15 | "components": "@/components", 16 | "utils": "@/lib/utils", 17 | "ui": "@/components/ui", 18 | "lib": "@/lib", 19 | "hooks": "@/hooks" 20 | }, 21 | "registries": {} 22 | } 23 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "editor.codeActionsOnSave": { 4 | "source.fixAll.eslint": "explicit" 5 | }, 6 | "prettier.requireConfig": true, 7 | "eslint.format.enable": true, 8 | "prettier.resolveGlobalModules": true, 9 | "prettier.useEditorConfig": false, 10 | "editor.defaultFormatter": "esbenp.prettier-vscode", 11 | "[typescript]": { 12 | "editor.defaultFormatter": "esbenp.prettier-vscode" 13 | }, 14 | "[javascript]": { 15 | "editor.defaultFormatter": "esbenp.prettier-vscode" 16 | }, 17 | "[json]": { 18 | "editor.defaultFormatter": "esbenp.prettier-vscode" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /web/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 | "target": "ES2023", 5 | "lib": ["ES2023"], 6 | "module": "ESNext", 7 | "types": ["node"], 8 | "skipLibCheck": true, 9 | 10 | /* Bundler mode */ 11 | "moduleResolution": "bundler", 12 | "allowImportingTsExtensions": true, 13 | "verbatimModuleSyntax": true, 14 | "moduleDetection": "force", 15 | "noEmit": true, 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "erasableSyntaxOnly": true, 22 | "noFallthroughCasesInSwitch": true, 23 | "noUncheckedSideEffectImports": true 24 | }, 25 | "include": ["vite.config.ts"] 26 | } 27 | -------------------------------------------------------------------------------- /web/eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from "@eslint/js"; 2 | import globals from "globals"; 3 | import reactHooks from "eslint-plugin-react-hooks"; 4 | import reactRefresh from "eslint-plugin-react-refresh"; 5 | import tseslint from "typescript-eslint"; 6 | import { defineConfig, globalIgnores } from "eslint/config"; 7 | 8 | export default defineConfig([ 9 | globalIgnores(["dist"]), 10 | { 11 | files: ["**/*.{ts,tsx}"], 12 | extends: [ 13 | js.configs.recommended, 14 | tseslint.configs.recommended, 15 | reactHooks.configs["recommended-latest"], 16 | reactRefresh.configs.vite, 17 | ], 18 | languageOptions: { 19 | ecmaVersion: 2020, 20 | globals: globals.browser, 21 | parserOptions: { 22 | tsconfigRootDir: import.meta.dirname, 23 | }, 24 | }, 25 | }, 26 | ]); 27 | -------------------------------------------------------------------------------- /web/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 4 | "target": "ES2022", 5 | "useDefineForClassFields": true, 6 | "lib": ["ES2022", "DOM", "DOM.Iterable"], 7 | "module": "ESNext", 8 | "types": ["vite/client"], 9 | "skipLibCheck": true, 10 | 11 | /* Bundler mode */ 12 | "moduleResolution": "bundler", 13 | "allowImportingTsExtensions": true, 14 | "verbatimModuleSyntax": true, 15 | "moduleDetection": "force", 16 | "noEmit": true, 17 | "jsx": "react-jsx", 18 | 19 | /* Linting */ 20 | "strict": true, 21 | "noUnusedLocals": true, 22 | "noUnusedParameters": true, 23 | "erasableSyntaxOnly": true, 24 | "noFallthroughCasesInSwitch": true, 25 | "noUncheckedSideEffectImports": true, 26 | 27 | /* Shadcn Config */ 28 | "baseUrl": ".", 29 | "paths": { 30 | "@/*": ["./src/*"] 31 | } 32 | }, 33 | "include": ["src"] 34 | } 35 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@apps-sdk-template/server", 3 | "version": "0.0.1", 4 | "private": true, 5 | "main": "dist/index.js", 6 | "description": "Alpic MCP Server Template", 7 | "files": [ 8 | "dist" 9 | ], 10 | "type": "module", 11 | "scripts": { 12 | "dev": "nodemon", 13 | "build": "tsc", 14 | "start": "node dist/index.js", 15 | "inspector": "mcp-inspector http://localhost:3000/mcp" 16 | }, 17 | "dependencies": { 18 | "@modelcontextprotocol/sdk": "^1.24.3", 19 | "@t3-oss/env-core": "^0.13.8", 20 | "dotenv": "^17.2.3", 21 | "express": "^5.1.0", 22 | "lodash": "^4.17.21", 23 | "skybridge": "catalog:", 24 | "vite": "^7.1.11", 25 | "zod": "^4.1.13" 26 | }, 27 | "devDependencies": { 28 | "@modelcontextprotocol/inspector": "^0.17.5", 29 | "@types/express": "^5.0.3", 30 | "@types/lodash": "^4.17.20", 31 | "@types/node": "^22.15.30", 32 | "nodemon": "^3.1.10", 33 | "tsx": "^4.19.2", 34 | "typescript": "^5.7.2" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /server/src/index.ts: -------------------------------------------------------------------------------- 1 | import express, { type Express } from "express"; 2 | 3 | import { widgetsDevServer } from "skybridge/server"; 4 | import type { ViteDevServer } from "vite"; 5 | import { env } from "./env.js"; 6 | import { mcp } from "./middleware.js"; 7 | import server from "./server.js"; 8 | 9 | const app = express() as Express & { vite: ViteDevServer }; 10 | 11 | app.use(express.json()); 12 | 13 | app.use(mcp(server)); 14 | 15 | if (env.NODE_ENV !== "production") { 16 | app.use(await widgetsDevServer()); 17 | } 18 | 19 | app.listen(3000, (error) => { 20 | if (error) { 21 | console.error("Failed to start server:", error); 22 | process.exit(1); 23 | } 24 | 25 | console.log(`Server listening on port 3000 - ${env.NODE_ENV}`); 26 | console.log( 27 | "Make your local server accessible with 'ngrok http 3000' and connect to ChatGPT with URL https://xxxxxx.ngrok-free.app/mcp", 28 | ); 29 | }); 30 | 31 | process.on("SIGINT", async () => { 32 | console.log("Server shutdown complete"); 33 | process.exit(0); 34 | }); 35 | -------------------------------------------------------------------------------- /web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@apps-sdk-template/web", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "echo 'Not implemented", 8 | "build": "tsc -b && vite build", 9 | "lint": "eslint .", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "skybridge": "catalog:", 14 | "class-variance-authority": "^0.7.1", 15 | "clsx": "^2.1.1", 16 | "glob": "^11.0.3", 17 | "lucide-react": "^0.546.0", 18 | "react": "^19.1.1", 19 | "react-dom": "^19.1.1", 20 | "tailwind-merge": "^3.3.1", 21 | "tailwindcss": "^4.1.14" 22 | }, 23 | "devDependencies": { 24 | "@eslint/js": "^9.36.0", 25 | "@tailwindcss/vite": "^4.1.14", 26 | "@types/node": "^24.6.0", 27 | "@types/react": "^19.1.16", 28 | "@types/react-dom": "^19.1.9", 29 | "@vitejs/plugin-react": "^5.0.4", 30 | "eslint": "^9.36.0", 31 | "eslint-plugin-react-hooks": "^5.2.0", 32 | "eslint-plugin-react-refresh": "^0.4.22", 33 | "globals": "^16.4.0", 34 | "tw-animate-css": "^1.4.0", 35 | "typescript": "~5.9.3", 36 | "typescript-eslint": "^8.45.0", 37 | "vite": "^7.1.11" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "apps-sdk-template", 3 | "version": "0.0.1", 4 | "private": true, 5 | "description": "Alpic MCP Server Template", 6 | "type": "module", 7 | "packageManager": "pnpm@10.18.3", 8 | "scripts": { 9 | "dev": "pnpm --filter @apps-sdk-template/server dev", 10 | "build": "pnpm web:build && rm -rf server/dist && pnpm --filter=@apps-sdk-template/server --prod deploy server/dist && cp -r web/dist server/dist/assets && pnpm --filter=@apps-sdk-template/server build", 11 | "start": "pnpm server:start", 12 | "inspector": "pnpm --filter @apps-sdk-template/server inspector", 13 | "server:build": "pnpm --filter @apps-sdk-template/server build", 14 | "server:start": "pnpm --filter @apps-sdk-template/server start", 15 | "web:build": "pnpm --filter @apps-sdk-template/web build", 16 | "web:preview": "pnpm --filter @apps-sdk-template/web preview" 17 | }, 18 | "devDependencies": { 19 | "@eslint/js": "^9.18.0", 20 | "eslint-config-prettier": "^10.0.1", 21 | "eslint-plugin-prettier": "^5.2.2", 22 | "prettier": "^3.5.3", 23 | "prettier-eslint": "^16.4.2", 24 | "tsx": "^4.19.4", 25 | "typescript-eslint": "^8.32.0" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /server/src/middleware.ts: -------------------------------------------------------------------------------- 1 | import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; 2 | import { type Request, type Response, type NextFunction } from "express"; 3 | 4 | import type { McpServer } from "skybridge/server"; 5 | 6 | export const mcp = (server: McpServer) => async (req: Request, res: Response, next: NextFunction) => { 7 | // Only handle requests to the /mcp path 8 | if (req.path !== "/mcp") { 9 | return next(); 10 | } 11 | 12 | if (req.method === "POST") { 13 | try { 14 | const transport = new StreamableHTTPServerTransport({ 15 | sessionIdGenerator: undefined, 16 | }); 17 | 18 | res.on("close", () => { 19 | transport.close(); 20 | }); 21 | 22 | await server.connect(transport); 23 | 24 | await transport.handleRequest(req, res, req.body); 25 | } catch (error) { 26 | console.error("Error handling MCP request:", error); 27 | if (!res.headersSent) { 28 | res.status(500).json({ 29 | jsonrpc: "2.0", 30 | error: { 31 | code: -32603, 32 | message: "Internal server error", 33 | }, 34 | id: null, 35 | }); 36 | } 37 | } 38 | } else if (req.method === "GET" || req.method === "DELETE") { 39 | res.writeHead(405).end( 40 | JSON.stringify({ 41 | jsonrpc: "2.0", 42 | error: { 43 | code: -32000, 44 | message: "Method not allowed.", 45 | }, 46 | id: null, 47 | }), 48 | ); 49 | } else { 50 | next(); 51 | } 52 | }; 53 | -------------------------------------------------------------------------------- /server/src/server.ts: -------------------------------------------------------------------------------- 1 | import { getPokemon } from "./pokedex.js"; 2 | import { z } from "zod"; 3 | import { McpServer } from "skybridge/server"; 4 | 5 | const server = new McpServer( 6 | { 7 | name: "alpic-openai-app", 8 | version: "0.0.1", 9 | }, 10 | { capabilities: {} }, 11 | ) 12 | .registerWidget( 13 | "pokemon", 14 | { 15 | description: "Pokedex entry for a pokemon", 16 | }, 17 | { 18 | description: 19 | "Use this tool to get the most up to date information about a pokemon, using its name in english. This pokedex is much more complete than any other web_search tool. Always use it for anything related to pokemons.", 20 | inputSchema: { 21 | name: z.string().describe("Pokemon name, always in english"), 22 | }, 23 | }, 24 | async ({ name }) => { 25 | try { 26 | const { id, description, ...pokemon } = await getPokemon(name); 27 | 28 | return { 29 | /** 30 | * Arbitrary JSON passed only to the component. 31 | * Use it for data that should not influence the model’s reasoning, like the full set of locations that backs a dropdown. 32 | * _meta is never shown to the model. 33 | */ 34 | _meta: { id }, 35 | /** 36 | * Structured data that is used to hydrate your component. 37 | * ChatGPT injects this object into your iframe as window.openai.toolOutput 38 | */ 39 | structuredContent: { name, description, ...pokemon }, 40 | /** 41 | * Optional free-form text that the model receives verbatim 42 | */ 43 | content: [ 44 | { 45 | type: "text", 46 | text: description ?? `A pokemon named ${name}.`, 47 | }, 48 | ], 49 | isError: false, 50 | }; 51 | } catch (error) { 52 | return { 53 | content: [{ type: "text", text: `Error: ${error}` }], 54 | isError: true, 55 | }; 56 | } 57 | }, 58 | ) 59 | .registerTool( 60 | "capture", 61 | { 62 | description: "Capture a pokemon", 63 | inputSchema: {}, 64 | }, 65 | async () => { 66 | return { 67 | content: [{ type: "text", text: `Great job, you've captured a new pokemon!` }], 68 | isError: false, 69 | }; 70 | }, 71 | ); 72 | 73 | export default server; 74 | export type AppType = typeof server; 75 | -------------------------------------------------------------------------------- /web/src/index.css: -------------------------------------------------------------------------------- 1 | @import "tailwindcss"; 2 | @import "tw-animate-css"; 3 | 4 | @custom-variant dark (&:is(.dark *)); 5 | 6 | @theme inline { 7 | --radius-sm: calc(var(--radius) - 4px); 8 | --radius-md: calc(var(--radius) - 2px); 9 | --radius-lg: var(--radius); 10 | --radius-xl: calc(var(--radius) + 4px); 11 | --color-background: var(--background); 12 | --color-foreground: var(--foreground); 13 | --color-card: var(--card); 14 | --color-card-foreground: var(--card-foreground); 15 | --color-popover: var(--popover); 16 | --color-popover-foreground: var(--popover-foreground); 17 | --color-primary: var(--primary); 18 | --color-primary-foreground: var(--primary-foreground); 19 | --color-secondary: var(--secondary); 20 | --color-secondary-foreground: var(--secondary-foreground); 21 | --color-muted: var(--muted); 22 | --color-muted-foreground: var(--muted-foreground); 23 | --color-accent: var(--accent); 24 | --color-accent-foreground: var(--accent-foreground); 25 | --color-destructive: var(--destructive); 26 | --color-border: var(--border); 27 | --color-input: var(--input); 28 | --color-ring: var(--ring); 29 | --color-chart-1: var(--chart-1); 30 | --color-chart-2: var(--chart-2); 31 | --color-chart-3: var(--chart-3); 32 | --color-chart-4: var(--chart-4); 33 | --color-chart-5: var(--chart-5); 34 | --color-sidebar: var(--sidebar); 35 | --color-sidebar-foreground: var(--sidebar-foreground); 36 | --color-sidebar-primary: var(--sidebar-primary); 37 | --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); 38 | --color-sidebar-accent: var(--sidebar-accent); 39 | --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); 40 | --color-sidebar-border: var(--sidebar-border); 41 | --color-sidebar-ring: var(--sidebar-ring); 42 | } 43 | 44 | :root { 45 | --radius: 0.625rem; 46 | --background: oklch(1 0 0); 47 | --foreground: oklch(0.145 0 0); 48 | --card: oklch(1 0 0); 49 | --card-foreground: oklch(0.145 0 0); 50 | --popover: oklch(1 0 0); 51 | --popover-foreground: oklch(0.145 0 0); 52 | --primary: oklch(0.205 0 0); 53 | --primary-foreground: oklch(0.985 0 0); 54 | --secondary: oklch(0.97 0 0); 55 | --secondary-foreground: oklch(0.205 0 0); 56 | --muted: oklch(0.97 0 0); 57 | --muted-foreground: oklch(0.556 0 0); 58 | --accent: oklch(0.97 0 0); 59 | --accent-foreground: oklch(0.205 0 0); 60 | --destructive: oklch(0.577 0.245 27.325); 61 | --border: oklch(0.922 0 0); 62 | --input: oklch(0.922 0 0); 63 | --ring: oklch(0.708 0 0); 64 | --chart-1: oklch(0.646 0.222 41.116); 65 | --chart-2: oklch(0.6 0.118 184.704); 66 | --chart-3: oklch(0.398 0.07 227.392); 67 | --chart-4: oklch(0.828 0.189 84.429); 68 | --chart-5: oklch(0.769 0.188 70.08); 69 | --sidebar: oklch(0.985 0 0); 70 | --sidebar-foreground: oklch(0.145 0 0); 71 | --sidebar-primary: oklch(0.205 0 0); 72 | --sidebar-primary-foreground: oklch(0.985 0 0); 73 | --sidebar-accent: oklch(0.97 0 0); 74 | --sidebar-accent-foreground: oklch(0.205 0 0); 75 | --sidebar-border: oklch(0.922 0 0); 76 | --sidebar-ring: oklch(0.708 0 0); 77 | } 78 | 79 | .dark { 80 | --background: oklch(0.145 0 0); 81 | --foreground: oklch(0.985 0 0); 82 | --card: oklch(0.205 0 0); 83 | --card-foreground: oklch(0.985 0 0); 84 | --popover: oklch(0.205 0 0); 85 | --popover-foreground: oklch(0.985 0 0); 86 | --primary: oklch(0.922 0 0); 87 | --primary-foreground: oklch(0.205 0 0); 88 | --secondary: oklch(0.269 0 0); 89 | --secondary-foreground: oklch(0.985 0 0); 90 | --muted: oklch(0.269 0 0); 91 | --muted-foreground: oklch(0.708 0 0); 92 | --accent: oklch(0.269 0 0); 93 | --accent-foreground: oklch(0.985 0 0); 94 | --destructive: oklch(0.704 0.191 22.216); 95 | --border: oklch(1 0 0 / 10%); 96 | --input: oklch(1 0 0 / 15%); 97 | --ring: oklch(0.556 0 0); 98 | --chart-1: oklch(0.488 0.243 264.376); 99 | --chart-2: oklch(0.696 0.17 162.48); 100 | --chart-3: oklch(0.769 0.188 70.08); 101 | --chart-4: oklch(0.627 0.265 303.9); 102 | --chart-5: oklch(0.645 0.246 16.439); 103 | --sidebar: oklch(0.205 0 0); 104 | --sidebar-foreground: oklch(0.985 0 0); 105 | --sidebar-primary: oklch(0.488 0.243 264.376); 106 | --sidebar-primary-foreground: oklch(0.985 0 0); 107 | --sidebar-accent: oklch(0.269 0 0); 108 | --sidebar-accent-foreground: oklch(0.985 0 0); 109 | --sidebar-border: oklch(1 0 0 / 10%); 110 | --sidebar-ring: oklch(0.556 0 0); 111 | } 112 | 113 | @layer base { 114 | * { 115 | @apply border-border outline-ring/50; 116 | } 117 | body { 118 | @apply bg-background text-foreground; 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ChatGPT Apps SDK Alpic Starter 2 | 3 | This repository is a minimal Typescript application demonstrating how to build an OpenAI Apps SDK compatible MCP server with widget rendering in ChatGPT. 4 | 5 | ![Demo](docs/demo.gif) 6 | 7 | ## Overview 8 | 9 | This project shows how to integrate a Typescript express application with the ChatGPT Apps SDK using the Model Context Protocol (MCP). It includes a working MCP server that exposes tools and resources that can be called from ChatGPT, with responses rendered natively in ChatGPT. It also includes MCP tools without UI widgets. 10 | 11 | ## Getting Started 12 | 13 | ### Prerequisites 14 | 15 | - Node.js 22+ (see `.nvmrc` for exact version) 16 | - pnpm (install with `npm install -g pnpm`) 17 | - Ngrok 18 | 19 | ### Local Development with Hot Module Replacement (HMR) 20 | 21 | This project uses Vite for React widget development with full HMR support, allowing you to see changes in real-time, directly within ChatGPT conversation, without restarting the server. 22 | 23 | #### 1. Clone and Install 24 | 25 | ```bash 26 | git clone 27 | cd apps-sdk-template 28 | pnpm install 29 | ``` 30 | 31 | #### 2. Start the Development Server 32 | 33 | Run the development server from the root directory: 34 | 35 | ```bash 36 | pnpm dev 37 | ``` 38 | 39 | This command starts an Express server on port 3000. This server packages: 40 | 41 | - an MCP endpoint on `/mcp` - aka the ChatGPT App Backend 42 | - a React application on Vite HMR dev server - aka the ChatGPT App Frontend 43 | 44 | #### 3. Expose Your Local Server 45 | 46 | In a separate terminal, expose your local server using ngrok: 47 | 48 | ```bash 49 | ngrok http 3000 50 | ``` 51 | 52 | Copy the forwarding URL from ngrok output: 53 | 54 | ```bash 55 | Forwarding https://3785c5ddc4b6.ngrok-free.app -> http://localhost:3000 56 | ``` 57 | 58 | #### 4. Connect to ChatGPT 59 | 60 | - Enable **Settings → Connectors → Advanced → Developer mode** in the ChatGPT client 61 | - Navigate to **Settings → Connectors → Create** 62 | - Enter your ngrok URL with the `/mcp` path (e.g., `https://3785c5ddc4b6.ngrok-free.app/mcp`) 63 | - Click **Create** 64 | 65 | #### 5. Test Your Integration 66 | 67 | - Start a new conversation in ChatGPT 68 | - Select your newly created connector using **the + button → Your connector** 69 | - Try prompting the model (e.g., "Show me pikachu details") 70 | 71 | #### 6. Develop with HMR 72 | 73 | Now you can edit React components in `web` and see changes instantly: 74 | 75 | - Make changes to any component 76 | - Save the file 77 | - The widget will automatically update in ChatGPT without refreshing or reconnecting 78 | - The Express server and MCP server continue running without interruption 79 | 80 | **Note:** When you modify widget components, changes will be reflected immediately. If you modify MCP server code (in `src/`), you may need to reload your connector in **Settings → Connectors → [Your connector] → Reload**. 81 | 82 | ## Widget Naming Convention 83 | 84 | **Important:** For a widget to work properly, the name of the endpoint in your MCP server must match the file name of the corresponding React component in `web/src/widgets/`. 85 | 86 | For example: 87 | 88 | - If you create a widget endpoint named `pokemon-card`, you must create a corresponding React component file at `web/src/widgets/pokemon-card.tsx` 89 | - The endpoint name and the widget file name (without the `.tsx` extension) must be identical 90 | 91 | This naming convention allows the system to automatically map widget requests to their corresponding React components. 92 | 93 | ## Deploy to Production 94 | 95 | Use Alpic to deploy your OpenAI App to production. 96 | 97 | [![Deploy on Alpic](https://assets.alpic.ai/button.svg)](https://app.alpic.ai/new/clone?repositoryUrl=https%3A%2F%2Fgithub.com%2Falpic-ai%2Fapps-sdk-template) 98 | 99 | - In ChatGPT, navigate to **Settings → Connectors → Create** and add your MCP server URL (e.g., `https://your-app-name.alpic.live`) 100 | 101 | ## Project Structure 102 | 103 | ``` 104 | . 105 | ├── server/ 106 | │ ├── app.ts # OpenAI App extension class with widget API implementation 107 | │ ├── server.ts # MCP server with tool/resource/prompt registration 108 | │ └── index.ts # Express server definition 109 | └── web/ 110 | └── src/ 111 | └── widgets/ # React widget components (must match endpoint names) 112 | ``` 113 | 114 | ## Resources 115 | 116 | - [Apps SDK Documentation](https://developers.openai.com/apps-sdk) 117 | - [Model Context Protocol Documentation](https://modelcontextprotocol.io/) 118 | - [Alpic Documentation](https://docs.alpic.ai/) 119 | -------------------------------------------------------------------------------- /server/src/pokedex.ts: -------------------------------------------------------------------------------- 1 | export const getPokemon = async (name: string) => { 2 | const query = ` 3 | query getPokemon($name: String!, $language: String!) { 4 | pokemon(where: {name: {_eq: $name} is_default: {_eq: true}}) { 5 | id 6 | order 7 | height 8 | weight 9 | pokemonstats { 10 | base_stat 11 | stat { 12 | name 13 | statnames(where: {language: {name: {_eq: $language}}}, limit: 1) { 14 | name 15 | } 16 | } 17 | } 18 | pokemonabilities { 19 | ability { 20 | name 21 | abilitynames(where: {language: {name: {_eq: $language}}}, limit: 1) { 22 | name 23 | } 24 | abilityflavortexts(where: {language: {name: {_eq: $language}}}, limit: 1) { 25 | flavor_text 26 | } 27 | } 28 | } 29 | pokemonsprites { 30 | sprites 31 | } 32 | pokemontypes { 33 | type { 34 | name 35 | typenames(where: {language: {name: {_eq: $language}}}, limit: 1) { 36 | name 37 | } 38 | } 39 | } 40 | pokemonspecy { 41 | pokemoncolor { 42 | name 43 | } 44 | evolutionchain { 45 | pokemonspecies { 46 | pokemons(where: {is_default: {_eq: true}}) { 47 | name 48 | order 49 | pokemonsprites { 50 | sprites 51 | } 52 | } 53 | } 54 | } 55 | pokemonspeciesflavortexts(where: {language: {name: {_eq: $language}}}, limit: 1) { 56 | flavor_text 57 | } 58 | } 59 | } 60 | } 61 | `; 62 | 63 | const response = await fetch("https://graphql.pokeapi.co/v1beta2", { 64 | method: "POST", 65 | headers: { 66 | "Content-Type": "application/json", 67 | }, 68 | body: JSON.stringify({ 69 | query, 70 | variables: { name: name.toLowerCase(), language: "en" }, 71 | }), 72 | }); 73 | 74 | const result = await response.json(); 75 | const pokemon = result.data.pokemon[0] as { 76 | id: number; 77 | order: number; 78 | height: number; 79 | weight: number; 80 | pokemonspecy: { 81 | pokemoncolor: { name: string }; 82 | pokemonspeciesflavortexts: { flavor_text: string }[]; 83 | evolutionchain: { 84 | pokemonspecies: { 85 | pokemons: { 86 | name: string; 87 | order: number; 88 | pokemonsprites: { sprites: { front_default: string } }[]; 89 | }[]; 90 | }[]; 91 | }; 92 | }; 93 | pokemonsprites: { sprites: { front_default: string } }[]; 94 | pokemonstats: { 95 | base_stat: number; 96 | stat: { name: string; statnames: { name: string }[] }; 97 | }[]; 98 | pokemontypes: { 99 | type: { name: string; typenames: { name: string }[] }; 100 | }[]; 101 | pokemonabilities: { 102 | ability: { 103 | name: string; 104 | abilitynames: { name: string }[]; 105 | abilityflavortexts: { flavor_text: string }[]; 106 | }; 107 | }[]; 108 | } | null; 109 | 110 | if (!pokemon) { 111 | throw new Error(`Pokemon ${name} not found`); 112 | } 113 | 114 | return { 115 | id: pokemon.id, 116 | color: pokemon.pokemonspecy.pokemoncolor.name, 117 | order: pokemon.order, 118 | heightInMeters: pokemon.height / 10, 119 | weightInKilograms: pokemon.weight / 10, 120 | imageUrl: pokemon.pokemonsprites[0].sprites.front_default, 121 | description: pokemon.pokemonspecy.pokemonspeciesflavortexts[0]?.flavor_text 122 | .replace(/\n/g, " ") 123 | .replace(/\.(?![^.]*$)/g, ". "), 124 | stats: pokemon.pokemonstats.map((stat) => ({ 125 | id: stat.stat.name, 126 | name: stat.stat.statnames[0].name, 127 | value: stat.base_stat, 128 | })), 129 | types: pokemon.pokemontypes.map((type) => ({ 130 | id: type.type.name, 131 | name: type.type.typenames[0].name, 132 | })), 133 | abilities: pokemon.pokemonabilities.map((ability) => ({ 134 | id: ability.ability.name, 135 | name: ability.ability.abilitynames[0].name, 136 | description: ability.ability.abilityflavortexts[0]?.flavor_text 137 | .replace(/\n/g, " ") 138 | .replace(/\.(?![^.]*$)/g, ". "), 139 | })), 140 | evolutions: pokemon.pokemonspecy.evolutionchain.pokemonspecies.map(({ pokemons: [pokemon] }) => ({ 141 | id: pokemon.name, 142 | order: pokemon.order, 143 | imageUrl: pokemon.pokemonsprites[0].sprites.front_default, 144 | })), 145 | }; 146 | }; 147 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # ============================================================================= 2 | # OPERATING SYSTEM FILES 3 | # ============================================================================= 4 | .DS_Store 5 | .DS_Store? 6 | ._* 7 | .Spotlight-V100 8 | .Trashes 9 | ehthumbs.db 10 | Thumbs.db 11 | 12 | # ============================================================================= 13 | # NODE.JS & PACKAGE MANAGERS 14 | # ============================================================================= 15 | node_modules/ 16 | npm-debug.log* 17 | yarn-debug.log* 18 | yarn-error.log* 19 | .pnpm-debug.log* 20 | .npm 21 | .pnp.js 22 | .pnp.cjs 23 | .pnp.mjs 24 | .pnp.json 25 | .pnp.ts 26 | 27 | # ============================================================================= 28 | # TYPESCRIPT & JAVASCRIPT 29 | # ============================================================================= 30 | *.tsbuildinfo 31 | .tscache/ 32 | *.js.map 33 | *.mjs.map 34 | *.cjs.map 35 | *.d.ts.map 36 | *.d.ts 37 | !*.d.ts.template 38 | *.tgz 39 | .eslintcache 40 | .rollup.cache 41 | 42 | # ============================================================================= 43 | # PYTHON 44 | # ============================================================================= 45 | __pycache__/ 46 | *.py[cod] 47 | *$py.class 48 | *.so 49 | .Python 50 | develop-eggs/ 51 | eggs/ 52 | .eggs/ 53 | lib/ 54 | lib64/ 55 | parts/ 56 | sdist/ 57 | var/ 58 | wheels/ 59 | *.egg-info/ 60 | .installed.cfg 61 | *.egg 62 | .pytest_cache/ 63 | .coverage 64 | htmlcov/ 65 | .tox/ 66 | .venv 67 | venv/ 68 | ENV/ 69 | 70 | # ============================================================================= 71 | # JAVA 72 | # ============================================================================= 73 | *.class 74 | *.jar 75 | *.war 76 | *.nar 77 | *.ear 78 | hs_err_pid* 79 | target/ 80 | .gradle/ 81 | 82 | # ============================================================================= 83 | # RUBY 84 | # ============================================================================= 85 | *.gem 86 | *.rbc 87 | /.config 88 | /coverage/ 89 | /InstalledFiles 90 | /pkg/ 91 | /spec/reports/ 92 | /spec/examples.txt 93 | /test/tmp/ 94 | /test/version_tmp/ 95 | /tmp/ 96 | .byebug_history 97 | 98 | # ============================================================================= 99 | # BUILD & DISTRIBUTION 100 | # ============================================================================= 101 | build/ 102 | dist/ 103 | dist-ssr/ 104 | out/ 105 | 106 | # ============================================================================= 107 | # COMPILED FILES 108 | # ============================================================================= 109 | *.com 110 | *.dll 111 | *.exe 112 | *.o 113 | 114 | # ============================================================================= 115 | # PACKAGE & ARCHIVE FILES 116 | # ============================================================================= 117 | *.7z 118 | *.dmg 119 | *.gz 120 | *.iso 121 | *.rar 122 | *.tar 123 | *.tar.gz 124 | *.zip 125 | 126 | # ============================================================================= 127 | # LOGS & DATABASES 128 | # ============================================================================= 129 | *.log 130 | *.sql 131 | *.sqlite 132 | *.sqlite3 133 | logs/ 134 | 135 | # ============================================================================= 136 | # TESTING & COVERAGE 137 | # ============================================================================= 138 | coverage/ 139 | .nyc_output/ 140 | 141 | # ============================================================================= 142 | # CACHE & TEMPORARY FILES 143 | # ============================================================================= 144 | .cache/ 145 | .parcel-cache/ 146 | *.bak 147 | 148 | # ============================================================================= 149 | # ENVIRONMENT & CONFIGURATION 150 | # ============================================================================= 151 | .env 152 | .env.local 153 | .env.development.local 154 | .env.test.local 155 | .env.production.local 156 | .sample-env 157 | sample.* 158 | !sample.template.* 159 | *.local 160 | mcp-servers.json 161 | mcp-config.json 162 | 163 | # ============================================================================= 164 | # DEMO & EXAMPLE DIRECTORIES 165 | # ============================================================================= 166 | demo/ 167 | demos/ 168 | example/ 169 | examples/ 170 | samples/ 171 | 172 | # ============================================================================= 173 | # GENERATED DOCUMENTATION 174 | # ============================================================================= 175 | docs/api/ 176 | 177 | # ============================================================================= 178 | # EDITOR DIRECTORIES AND FILES 179 | # ============================================================================= 180 | .vscode/* 181 | !.vscode/extensions.json 182 | .idea 183 | *.suo 184 | *.ntvs* 185 | *.njsproj 186 | *.sln 187 | *.sw? 188 | 189 | # ============================================================================= 190 | # APPLICATION SPECIFIC 191 | # ============================================================================= 192 | repomix-output* 193 | duckdata/ 194 | .claude -------------------------------------------------------------------------------- /web/src/widgets/pokemon.tsx: -------------------------------------------------------------------------------- 1 | import { Spinner } from "@/components/ui/shadcn-io/spinner"; 2 | import "@/index.css"; 3 | 4 | import { mountWidget } from "skybridge/web"; 5 | import { useCallTool, useToolInfo } from "../helpers"; 6 | 7 | const typesSvgs = { 8 | bug: "https://raw.githubusercontent.com/partywhale/pokemon-type-icons/refs/heads/main/icons/bug.svg", 9 | dark: "https://raw.githubusercontent.com/partywhale/pokemon-type-icons/refs/heads/main/icons/dark.svg", 10 | dragon: "https://raw.githubusercontent.com/partywhale/pokemon-type-icons/refs/heads/main/icons/dragon.svg", 11 | electric: "https://raw.githubusercontent.com/partywhale/pokemon-type-icons/refs/heads/main/icons/electric.svg", 12 | fairy: "https://raw.githubusercontent.com/partywhale/pokemon-type-icons/refs/heads/main/icons/fairy.svg", 13 | fighting: "https://raw.githubusercontent.com/partywhale/pokemon-type-icons/refs/heads/main/icons/fighting.svg", 14 | fire: "https://raw.githubusercontent.com/partywhale/pokemon-type-icons/refs/heads/main/icons/fire.svg", 15 | flying: "https://raw.githubusercontent.com/partywhale/pokemon-type-icons/refs/heads/main/icons/flying.svg", 16 | ghost: "https://raw.githubusercontent.com/partywhale/pokemon-type-icons/refs/heads/main/icons/ghost.svg", 17 | grass: "https://raw.githubusercontent.com/partywhale/pokemon-type-icons/refs/heads/main/icons/grass.svg", 18 | ground: "https://raw.githubusercontent.com/partywhale/pokemon-type-icons/refs/heads/main/icons/ground.svg", 19 | ice: "https://raw.githubusercontent.com/partywhale/pokemon-type-icons/refs/heads/main/icons/ice.svg", 20 | normal: "https://raw.githubusercontent.com/partywhale/pokemon-type-icons/refs/heads/main/icons/normal.svg", 21 | poison: "https://raw.githubusercontent.com/partywhale/pokemon-type-icons/refs/heads/main/icons/poison.svg", 22 | psychic: "https://raw.githubusercontent.com/partywhale/pokemon-type-icons/refs/heads/main/icons/psychic.svg", 23 | rock: "https://raw.githubusercontent.com/partywhale/pokemon-type-icons/refs/heads/main/icons/rock.svg", 24 | steel: "https://raw.githubusercontent.com/partywhale/pokemon-type-icons/refs/heads/main/icons/steel.svg", 25 | water: "https://raw.githubusercontent.com/partywhale/pokemon-type-icons/refs/heads/main/icons/water.svg", 26 | }; 27 | 28 | const typesToClassnames: Record< 29 | string, 30 | { 31 | background: { 32 | widget: string; 33 | tiles: string; 34 | }; 35 | text: string; 36 | } 37 | > = { 38 | bug: { 39 | background: { widget: "bg-gray-100", tiles: "bg-gray-50" }, 40 | text: "black", 41 | }, 42 | dark: { 43 | background: { widget: "bg-gray-100", tiles: "bg-gray-50" }, 44 | text: "black", 45 | }, 46 | dragon: { 47 | background: { widget: "bg-gray-100", tiles: "bg-gray-50" }, 48 | text: "black", 49 | }, 50 | electric: { 51 | background: { widget: "bg-yellow-100", tiles: "bg-yellow-50" }, 52 | text: "text-yellow-600", 53 | }, 54 | fairy: { 55 | background: { widget: "bg-gray-100", tiles: "bg-gray-50" }, 56 | text: "black", 57 | }, 58 | fighting: { 59 | background: { widget: "bg-gray-100", tiles: "bg-gray-50" }, 60 | text: "black", 61 | }, 62 | fire: { 63 | background: { widget: "bg-orange-100", tiles: "bg-orange-50" }, 64 | text: "text-orange-600", 65 | }, 66 | flying: { 67 | background: { widget: "bg-gray-100", tiles: "bg-gray-50" }, 68 | text: "black", 69 | }, 70 | ghost: { 71 | background: { widget: "bg-gray-100", tiles: "bg-gray-50" }, 72 | text: "black", 73 | }, 74 | grass: { 75 | background: { widget: "bg-green-100", tiles: "bg-green-50" }, 76 | text: "text-green-600", 77 | }, 78 | ground: { 79 | background: { widget: "bg-[#D7CCC8]", tiles: "bg-[#EFEBE9]" }, 80 | text: "text-[#6D4C41]", 81 | }, 82 | ice: { 83 | background: { widget: "bg-blue-100", tiles: "bg-blue-50" }, 84 | text: "text-blue-600", 85 | }, 86 | normal: { 87 | background: { widget: "bg-gray-100", tiles: "bg-gray-50" }, 88 | text: "black", 89 | }, 90 | poison: { 91 | background: { widget: "bg-purple-100", tiles: "bg-purple-50" }, 92 | text: "text-purple-600", 93 | }, 94 | psychic: { 95 | background: { widget: "bg-gray-100", tiles: "bg-gray-50" }, 96 | text: "black", 97 | }, 98 | rock: { 99 | background: { widget: "bg-gray-100", tiles: "bg-gray-50" }, 100 | text: "black", 101 | }, 102 | steel: { 103 | background: { widget: "bg-gray-100", tiles: "bg-gray-50" }, 104 | text: "black", 105 | }, 106 | water: { 107 | background: { widget: "bg-blue-100", tiles: "bg-blue-50" }, 108 | text: "text-blue-600", 109 | }, 110 | }; 111 | 112 | function Pokemon() { 113 | const toolInfo = useToolInfo<"pokemon">(); 114 | 115 | const pokemon = toolInfo.output ?? null; 116 | 117 | const { callTool: captureTool } = useCallTool("capture"); 118 | 119 | if (!pokemon) { 120 | return ( 121 |
122 | 123 |
124 | ); 125 | } 126 | 127 | return ( 128 |
129 | {pokemon.name} 130 |
131 | 132 |
133 |
134 |

{pokemon.name}

135 |

136 | {String(pokemon.order).padStart(3, "0")} 137 |

138 |
139 |
140 | {pokemon.types.map(({ id, name }) => ( 141 | {name} 142 | ))} 143 |
144 |
145 |

{pokemon.description}

146 | 152 |
153 |
154 |
155 | ); 156 | } 157 | 158 | const Tile = ({ children, color }: { children: React.ReactNode; color: string }) => { 159 | return
{children}
; 160 | }; 161 | 162 | export default Pokemon; 163 | 164 | mountWidget(); 165 | -------------------------------------------------------------------------------- /web/src/components/ui/shadcn-io/spinner/index.tsx: -------------------------------------------------------------------------------- 1 | import { LoaderCircleIcon, LoaderIcon, LoaderPinwheelIcon, type LucideProps } from "lucide-react"; 2 | import { cn } from "../../../../utils"; 3 | 4 | type SpinnerVariantProps = Omit; 5 | 6 | const Default = ({ className, ...props }: SpinnerVariantProps) => ( 7 | 8 | ); 9 | 10 | const Circle = ({ className, ...props }: SpinnerVariantProps) => ( 11 | 12 | ); 13 | 14 | const Pinwheel = ({ className, ...props }: SpinnerVariantProps) => ( 15 | 16 | ); 17 | 18 | const CircleFilled = ({ className, size = 24, ...props }: SpinnerVariantProps) => ( 19 |
20 |
21 | 26 |
27 | 28 |
29 | ); 30 | 31 | const Ellipsis = ({ size = 24, ...props }: SpinnerVariantProps) => { 32 | return ( 33 | 34 | Loading... 35 | 36 | 45 | 46 | 47 | 55 | 56 | 57 | 66 | 67 | 68 | ); 69 | }; 70 | 71 | const Ring = ({ size = 24, ...props }: SpinnerVariantProps) => ( 72 | 80 | Loading... 81 | 82 | 83 | 93 | 103 | 104 | 105 | 115 | 125 | 126 | 127 | 128 | ); 129 | 130 | const Bars = ({ size = 24, ...props }: SpinnerVariantProps) => ( 131 | 132 | Loading... 133 | 156 | 157 | 158 | 159 | 160 | ); 161 | 162 | const Infinite = ({ size = 24, ...props }: SpinnerVariantProps) => ( 163 | 171 | Loading... 172 | 184 | 191 | 192 | 193 | ); 194 | 195 | export type SpinnerProps = LucideProps & { 196 | variant?: "default" | "circle" | "pinwheel" | "circle-filled" | "ellipsis" | "ring" | "bars" | "infinite"; 197 | }; 198 | 199 | export const Spinner = ({ variant, ...props }: SpinnerProps) => { 200 | switch (variant) { 201 | case "circle": 202 | return ; 203 | case "pinwheel": 204 | return ; 205 | case "circle-filled": 206 | return ; 207 | case "ellipsis": 208 | return ; 209 | case "ring": 210 | return ; 211 | case "bars": 212 | return ; 213 | case "infinite": 214 | return ; 215 | default: 216 | return ; 217 | } 218 | }; 219 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@eslint/js': 12 | specifier: ^9.18.0 13 | version: 9.37.0 14 | eslint-config-prettier: 15 | specifier: ^10.0.1 16 | version: 10.1.8(eslint@9.38.0(jiti@2.6.1)) 17 | eslint-plugin-prettier: 18 | specifier: ^5.2.2 19 | version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.1)))(eslint@9.38.0(jiti@2.6.1))(prettier@3.6.2) 20 | prettier: 21 | specifier: ^3.5.3 22 | version: 3.6.2 23 | prettier-eslint: 24 | specifier: ^16.4.2 25 | version: 16.4.2(typescript@5.9.3) 26 | tsx: 27 | specifier: ^4.19.4 28 | version: 4.20.6 29 | typescript-eslint: 30 | specifier: ^8.32.0 31 | version: 8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) 32 | 33 | packages: 34 | 35 | '@esbuild/aix-ppc64@0.25.11': 36 | resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} 37 | engines: {node: '>=18'} 38 | cpu: [ppc64] 39 | os: [aix] 40 | 41 | '@esbuild/android-arm64@0.25.11': 42 | resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} 43 | engines: {node: '>=18'} 44 | cpu: [arm64] 45 | os: [android] 46 | 47 | '@esbuild/android-arm@0.25.11': 48 | resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} 49 | engines: {node: '>=18'} 50 | cpu: [arm] 51 | os: [android] 52 | 53 | '@esbuild/android-x64@0.25.11': 54 | resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} 55 | engines: {node: '>=18'} 56 | cpu: [x64] 57 | os: [android] 58 | 59 | '@esbuild/darwin-arm64@0.25.11': 60 | resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} 61 | engines: {node: '>=18'} 62 | cpu: [arm64] 63 | os: [darwin] 64 | 65 | '@esbuild/darwin-x64@0.25.11': 66 | resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} 67 | engines: {node: '>=18'} 68 | cpu: [x64] 69 | os: [darwin] 70 | 71 | '@esbuild/freebsd-arm64@0.25.11': 72 | resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} 73 | engines: {node: '>=18'} 74 | cpu: [arm64] 75 | os: [freebsd] 76 | 77 | '@esbuild/freebsd-x64@0.25.11': 78 | resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} 79 | engines: {node: '>=18'} 80 | cpu: [x64] 81 | os: [freebsd] 82 | 83 | '@esbuild/linux-arm64@0.25.11': 84 | resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} 85 | engines: {node: '>=18'} 86 | cpu: [arm64] 87 | os: [linux] 88 | 89 | '@esbuild/linux-arm@0.25.11': 90 | resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} 91 | engines: {node: '>=18'} 92 | cpu: [arm] 93 | os: [linux] 94 | 95 | '@esbuild/linux-ia32@0.25.11': 96 | resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} 97 | engines: {node: '>=18'} 98 | cpu: [ia32] 99 | os: [linux] 100 | 101 | '@esbuild/linux-loong64@0.25.11': 102 | resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} 103 | engines: {node: '>=18'} 104 | cpu: [loong64] 105 | os: [linux] 106 | 107 | '@esbuild/linux-mips64el@0.25.11': 108 | resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} 109 | engines: {node: '>=18'} 110 | cpu: [mips64el] 111 | os: [linux] 112 | 113 | '@esbuild/linux-ppc64@0.25.11': 114 | resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} 115 | engines: {node: '>=18'} 116 | cpu: [ppc64] 117 | os: [linux] 118 | 119 | '@esbuild/linux-riscv64@0.25.11': 120 | resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} 121 | engines: {node: '>=18'} 122 | cpu: [riscv64] 123 | os: [linux] 124 | 125 | '@esbuild/linux-s390x@0.25.11': 126 | resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} 127 | engines: {node: '>=18'} 128 | cpu: [s390x] 129 | os: [linux] 130 | 131 | '@esbuild/linux-x64@0.25.11': 132 | resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} 133 | engines: {node: '>=18'} 134 | cpu: [x64] 135 | os: [linux] 136 | 137 | '@esbuild/netbsd-arm64@0.25.11': 138 | resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} 139 | engines: {node: '>=18'} 140 | cpu: [arm64] 141 | os: [netbsd] 142 | 143 | '@esbuild/netbsd-x64@0.25.11': 144 | resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} 145 | engines: {node: '>=18'} 146 | cpu: [x64] 147 | os: [netbsd] 148 | 149 | '@esbuild/openbsd-arm64@0.25.11': 150 | resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} 151 | engines: {node: '>=18'} 152 | cpu: [arm64] 153 | os: [openbsd] 154 | 155 | '@esbuild/openbsd-x64@0.25.11': 156 | resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} 157 | engines: {node: '>=18'} 158 | cpu: [x64] 159 | os: [openbsd] 160 | 161 | '@esbuild/openharmony-arm64@0.25.11': 162 | resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} 163 | engines: {node: '>=18'} 164 | cpu: [arm64] 165 | os: [openharmony] 166 | 167 | '@esbuild/sunos-x64@0.25.11': 168 | resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} 169 | engines: {node: '>=18'} 170 | cpu: [x64] 171 | os: [sunos] 172 | 173 | '@esbuild/win32-arm64@0.25.11': 174 | resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} 175 | engines: {node: '>=18'} 176 | cpu: [arm64] 177 | os: [win32] 178 | 179 | '@esbuild/win32-ia32@0.25.11': 180 | resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} 181 | engines: {node: '>=18'} 182 | cpu: [ia32] 183 | os: [win32] 184 | 185 | '@esbuild/win32-x64@0.25.11': 186 | resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} 187 | engines: {node: '>=18'} 188 | cpu: [x64] 189 | os: [win32] 190 | 191 | '@eslint-community/eslint-utils@4.9.0': 192 | resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} 193 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 194 | peerDependencies: 195 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 196 | 197 | '@eslint-community/regexpp@4.12.1': 198 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 199 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 200 | 201 | '@eslint/config-array@0.21.1': 202 | resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} 203 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 204 | 205 | '@eslint/config-helpers@0.4.1': 206 | resolution: {integrity: sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==} 207 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 208 | 209 | '@eslint/core@0.16.0': 210 | resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} 211 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 212 | 213 | '@eslint/eslintrc@2.1.4': 214 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 215 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 216 | 217 | '@eslint/eslintrc@3.3.1': 218 | resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 219 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 220 | 221 | '@eslint/js@8.57.1': 222 | resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} 223 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 224 | 225 | '@eslint/js@9.37.0': 226 | resolution: {integrity: sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==} 227 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 228 | 229 | '@eslint/js@9.38.0': 230 | resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==} 231 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 232 | 233 | '@eslint/object-schema@2.1.7': 234 | resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} 235 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 236 | 237 | '@eslint/plugin-kit@0.4.0': 238 | resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} 239 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 240 | 241 | '@humanfs/core@0.19.1': 242 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 243 | engines: {node: '>=18.18.0'} 244 | 245 | '@humanfs/node@0.16.7': 246 | resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} 247 | engines: {node: '>=18.18.0'} 248 | 249 | '@humanwhocodes/config-array@0.13.0': 250 | resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} 251 | engines: {node: '>=10.10.0'} 252 | deprecated: Use @eslint/config-array instead 253 | 254 | '@humanwhocodes/module-importer@1.0.1': 255 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 256 | engines: {node: '>=12.22'} 257 | 258 | '@humanwhocodes/object-schema@2.0.3': 259 | resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} 260 | deprecated: Use @eslint/object-schema instead 261 | 262 | '@humanwhocodes/retry@0.4.3': 263 | resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 264 | engines: {node: '>=18.18'} 265 | 266 | '@jest/schemas@29.6.3': 267 | resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 268 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 269 | 270 | '@nodelib/fs.scandir@2.1.5': 271 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 272 | engines: {node: '>= 8'} 273 | 274 | '@nodelib/fs.stat@2.0.5': 275 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 276 | engines: {node: '>= 8'} 277 | 278 | '@nodelib/fs.walk@1.2.8': 279 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 280 | engines: {node: '>= 8'} 281 | 282 | '@pkgr/core@0.2.9': 283 | resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} 284 | engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 285 | 286 | '@sinclair/typebox@0.27.8': 287 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 288 | 289 | '@types/estree@1.0.8': 290 | resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 291 | 292 | '@types/json-schema@7.0.15': 293 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 294 | 295 | '@typescript-eslint/eslint-plugin@8.46.1': 296 | resolution: {integrity: sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==} 297 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 298 | peerDependencies: 299 | '@typescript-eslint/parser': ^8.46.1 300 | eslint: ^8.57.0 || ^9.0.0 301 | typescript: '>=4.8.4 <6.0.0' 302 | 303 | '@typescript-eslint/parser@6.21.0': 304 | resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} 305 | engines: {node: ^16.0.0 || >=18.0.0} 306 | peerDependencies: 307 | eslint: ^7.0.0 || ^8.0.0 308 | typescript: '*' 309 | peerDependenciesMeta: 310 | typescript: 311 | optional: true 312 | 313 | '@typescript-eslint/parser@8.46.1': 314 | resolution: {integrity: sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==} 315 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 316 | peerDependencies: 317 | eslint: ^8.57.0 || ^9.0.0 318 | typescript: '>=4.8.4 <6.0.0' 319 | 320 | '@typescript-eslint/project-service@8.46.1': 321 | resolution: {integrity: sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==} 322 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 323 | peerDependencies: 324 | typescript: '>=4.8.4 <6.0.0' 325 | 326 | '@typescript-eslint/scope-manager@6.21.0': 327 | resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} 328 | engines: {node: ^16.0.0 || >=18.0.0} 329 | 330 | '@typescript-eslint/scope-manager@8.46.1': 331 | resolution: {integrity: sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==} 332 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 333 | 334 | '@typescript-eslint/tsconfig-utils@8.46.1': 335 | resolution: {integrity: sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==} 336 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 337 | peerDependencies: 338 | typescript: '>=4.8.4 <6.0.0' 339 | 340 | '@typescript-eslint/type-utils@8.46.1': 341 | resolution: {integrity: sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==} 342 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 343 | peerDependencies: 344 | eslint: ^8.57.0 || ^9.0.0 345 | typescript: '>=4.8.4 <6.0.0' 346 | 347 | '@typescript-eslint/types@6.21.0': 348 | resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} 349 | engines: {node: ^16.0.0 || >=18.0.0} 350 | 351 | '@typescript-eslint/types@8.46.1': 352 | resolution: {integrity: sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==} 353 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 354 | 355 | '@typescript-eslint/typescript-estree@6.21.0': 356 | resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} 357 | engines: {node: ^16.0.0 || >=18.0.0} 358 | peerDependencies: 359 | typescript: '*' 360 | peerDependenciesMeta: 361 | typescript: 362 | optional: true 363 | 364 | '@typescript-eslint/typescript-estree@8.46.1': 365 | resolution: {integrity: sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==} 366 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 367 | peerDependencies: 368 | typescript: '>=4.8.4 <6.0.0' 369 | 370 | '@typescript-eslint/utils@8.46.1': 371 | resolution: {integrity: sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==} 372 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 373 | peerDependencies: 374 | eslint: ^8.57.0 || ^9.0.0 375 | typescript: '>=4.8.4 <6.0.0' 376 | 377 | '@typescript-eslint/visitor-keys@6.21.0': 378 | resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} 379 | engines: {node: ^16.0.0 || >=18.0.0} 380 | 381 | '@typescript-eslint/visitor-keys@8.46.1': 382 | resolution: {integrity: sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==} 383 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 384 | 385 | '@ungap/structured-clone@1.3.0': 386 | resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} 387 | 388 | acorn-jsx@5.3.2: 389 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 390 | peerDependencies: 391 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 392 | 393 | acorn@8.15.0: 394 | resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 395 | engines: {node: '>=0.4.0'} 396 | hasBin: true 397 | 398 | ajv@6.12.6: 399 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 400 | 401 | ansi-regex@2.1.1: 402 | resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} 403 | engines: {node: '>=0.10.0'} 404 | 405 | ansi-regex@5.0.1: 406 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 407 | engines: {node: '>=8'} 408 | 409 | ansi-styles@2.2.1: 410 | resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} 411 | engines: {node: '>=0.10.0'} 412 | 413 | ansi-styles@4.3.0: 414 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 415 | engines: {node: '>=8'} 416 | 417 | ansi-styles@5.2.0: 418 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 419 | engines: {node: '>=10'} 420 | 421 | argparse@2.0.1: 422 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 423 | 424 | array-union@2.1.0: 425 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 426 | engines: {node: '>=8'} 427 | 428 | balanced-match@1.0.2: 429 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 430 | 431 | brace-expansion@1.1.12: 432 | resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} 433 | 434 | brace-expansion@2.0.2: 435 | resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 436 | 437 | braces@3.0.3: 438 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 439 | engines: {node: '>=8'} 440 | 441 | callsites@3.1.0: 442 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 443 | engines: {node: '>=6'} 444 | 445 | chalk@1.1.3: 446 | resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} 447 | engines: {node: '>=0.10.0'} 448 | 449 | chalk@4.1.2: 450 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 451 | engines: {node: '>=10'} 452 | 453 | color-convert@2.0.1: 454 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 455 | engines: {node: '>=7.0.0'} 456 | 457 | color-name@1.1.4: 458 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 459 | 460 | common-tags@1.8.2: 461 | resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} 462 | engines: {node: '>=4.0.0'} 463 | 464 | concat-map@0.0.1: 465 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 466 | 467 | cross-spawn@7.0.6: 468 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 469 | engines: {node: '>= 8'} 470 | 471 | debug@4.4.3: 472 | resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 473 | engines: {node: '>=6.0'} 474 | peerDependencies: 475 | supports-color: '*' 476 | peerDependenciesMeta: 477 | supports-color: 478 | optional: true 479 | 480 | deep-is@0.1.4: 481 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 482 | 483 | dir-glob@3.0.1: 484 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 485 | engines: {node: '>=8'} 486 | 487 | dlv@1.1.3: 488 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 489 | 490 | doctrine@3.0.0: 491 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 492 | engines: {node: '>=6.0.0'} 493 | 494 | esbuild@0.25.11: 495 | resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} 496 | engines: {node: '>=18'} 497 | hasBin: true 498 | 499 | escape-string-regexp@1.0.5: 500 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 501 | engines: {node: '>=0.8.0'} 502 | 503 | escape-string-regexp@4.0.0: 504 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 505 | engines: {node: '>=10'} 506 | 507 | eslint-config-prettier@10.1.8: 508 | resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} 509 | hasBin: true 510 | peerDependencies: 511 | eslint: '>=7.0.0' 512 | 513 | eslint-plugin-prettier@5.5.4: 514 | resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} 515 | engines: {node: ^14.18.0 || >=16.0.0} 516 | peerDependencies: 517 | '@types/eslint': '>=8.0.0' 518 | eslint: '>=8.0.0' 519 | eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' 520 | prettier: '>=3.0.0' 521 | peerDependenciesMeta: 522 | '@types/eslint': 523 | optional: true 524 | eslint-config-prettier: 525 | optional: true 526 | 527 | eslint-scope@7.2.2: 528 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 529 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 530 | 531 | eslint-scope@8.4.0: 532 | resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} 533 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 534 | 535 | eslint-visitor-keys@3.4.3: 536 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 537 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 538 | 539 | eslint-visitor-keys@4.2.1: 540 | resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} 541 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 542 | 543 | eslint@8.57.1: 544 | resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} 545 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 546 | deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. 547 | hasBin: true 548 | 549 | eslint@9.38.0: 550 | resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==} 551 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 552 | hasBin: true 553 | peerDependencies: 554 | jiti: '*' 555 | peerDependenciesMeta: 556 | jiti: 557 | optional: true 558 | 559 | espree@10.4.0: 560 | resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} 561 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 562 | 563 | espree@9.6.1: 564 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 565 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 566 | 567 | esquery@1.6.0: 568 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 569 | engines: {node: '>=0.10'} 570 | 571 | esrecurse@4.3.0: 572 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 573 | engines: {node: '>=4.0'} 574 | 575 | estraverse@5.3.0: 576 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 577 | engines: {node: '>=4.0'} 578 | 579 | esutils@2.0.3: 580 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 581 | engines: {node: '>=0.10.0'} 582 | 583 | fast-deep-equal@3.1.3: 584 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 585 | 586 | fast-diff@1.3.0: 587 | resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} 588 | 589 | fast-glob@3.3.3: 590 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 591 | engines: {node: '>=8.6.0'} 592 | 593 | fast-json-stable-stringify@2.1.0: 594 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 595 | 596 | fast-levenshtein@2.0.6: 597 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 598 | 599 | fastq@1.19.1: 600 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 601 | 602 | file-entry-cache@6.0.1: 603 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 604 | engines: {node: ^10.12.0 || >=12.0.0} 605 | 606 | file-entry-cache@8.0.0: 607 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 608 | engines: {node: '>=16.0.0'} 609 | 610 | fill-range@7.1.1: 611 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 612 | engines: {node: '>=8'} 613 | 614 | find-up@5.0.0: 615 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 616 | engines: {node: '>=10'} 617 | 618 | flat-cache@3.2.0: 619 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 620 | engines: {node: ^10.12.0 || >=12.0.0} 621 | 622 | flat-cache@4.0.1: 623 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 624 | engines: {node: '>=16'} 625 | 626 | flatted@3.3.3: 627 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 628 | 629 | fs.realpath@1.0.0: 630 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 631 | 632 | fsevents@2.3.3: 633 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 634 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 635 | os: [darwin] 636 | 637 | get-tsconfig@4.12.0: 638 | resolution: {integrity: sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==} 639 | 640 | glob-parent@5.1.2: 641 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 642 | engines: {node: '>= 6'} 643 | 644 | glob-parent@6.0.2: 645 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 646 | engines: {node: '>=10.13.0'} 647 | 648 | glob@7.2.3: 649 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 650 | deprecated: Glob versions prior to v9 are no longer supported 651 | 652 | globals@13.24.0: 653 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 654 | engines: {node: '>=8'} 655 | 656 | globals@14.0.0: 657 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 658 | engines: {node: '>=18'} 659 | 660 | globby@11.1.0: 661 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 662 | engines: {node: '>=10'} 663 | 664 | graphemer@1.4.0: 665 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 666 | 667 | has-ansi@2.0.0: 668 | resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} 669 | engines: {node: '>=0.10.0'} 670 | 671 | has-flag@4.0.0: 672 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 673 | engines: {node: '>=8'} 674 | 675 | ignore@5.3.2: 676 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 677 | engines: {node: '>= 4'} 678 | 679 | ignore@7.0.5: 680 | resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} 681 | engines: {node: '>= 4'} 682 | 683 | import-fresh@3.3.1: 684 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 685 | engines: {node: '>=6'} 686 | 687 | imurmurhash@0.1.4: 688 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 689 | engines: {node: '>=0.8.19'} 690 | 691 | indent-string@4.0.0: 692 | resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} 693 | engines: {node: '>=8'} 694 | 695 | inflight@1.0.6: 696 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 697 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 698 | 699 | inherits@2.0.4: 700 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 701 | 702 | is-extglob@2.1.1: 703 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 704 | engines: {node: '>=0.10.0'} 705 | 706 | is-glob@4.0.3: 707 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 708 | engines: {node: '>=0.10.0'} 709 | 710 | is-number@7.0.0: 711 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 712 | engines: {node: '>=0.12.0'} 713 | 714 | is-path-inside@3.0.3: 715 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 716 | engines: {node: '>=8'} 717 | 718 | isexe@2.0.0: 719 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 720 | 721 | jiti@2.6.1: 722 | resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} 723 | hasBin: true 724 | 725 | js-yaml@4.1.0: 726 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 727 | hasBin: true 728 | 729 | json-buffer@3.0.1: 730 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 731 | 732 | json-schema-traverse@0.4.1: 733 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 734 | 735 | json-stable-stringify-without-jsonify@1.0.1: 736 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 737 | 738 | keyv@4.5.4: 739 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 740 | 741 | levn@0.4.1: 742 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 743 | engines: {node: '>= 0.8.0'} 744 | 745 | locate-path@6.0.0: 746 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 747 | engines: {node: '>=10'} 748 | 749 | lodash.merge@4.6.2: 750 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 751 | 752 | lodash@4.17.21: 753 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 754 | 755 | loglevel-colored-level-prefix@1.0.0: 756 | resolution: {integrity: sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==} 757 | 758 | loglevel@1.9.2: 759 | resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} 760 | engines: {node: '>= 0.6.0'} 761 | 762 | merge2@1.4.1: 763 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 764 | engines: {node: '>= 8'} 765 | 766 | micromatch@4.0.8: 767 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 768 | engines: {node: '>=8.6'} 769 | 770 | minimatch@3.1.2: 771 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 772 | 773 | minimatch@9.0.3: 774 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 775 | engines: {node: '>=16 || 14 >=14.17'} 776 | 777 | minimatch@9.0.5: 778 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 779 | engines: {node: '>=16 || 14 >=14.17'} 780 | 781 | ms@2.1.3: 782 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 783 | 784 | natural-compare@1.4.0: 785 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 786 | 787 | once@1.4.0: 788 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 789 | 790 | optionator@0.9.4: 791 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 792 | engines: {node: '>= 0.8.0'} 793 | 794 | p-limit@3.1.0: 795 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 796 | engines: {node: '>=10'} 797 | 798 | p-locate@5.0.0: 799 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 800 | engines: {node: '>=10'} 801 | 802 | parent-module@1.0.1: 803 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 804 | engines: {node: '>=6'} 805 | 806 | path-exists@4.0.0: 807 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 808 | engines: {node: '>=8'} 809 | 810 | path-is-absolute@1.0.1: 811 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 812 | engines: {node: '>=0.10.0'} 813 | 814 | path-key@3.1.1: 815 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 816 | engines: {node: '>=8'} 817 | 818 | path-type@4.0.0: 819 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 820 | engines: {node: '>=8'} 821 | 822 | picomatch@2.3.1: 823 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 824 | engines: {node: '>=8.6'} 825 | 826 | prelude-ls@1.2.1: 827 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 828 | engines: {node: '>= 0.8.0'} 829 | 830 | prettier-eslint@16.4.2: 831 | resolution: {integrity: sha512-vtJAQEkaN8fW5QKl08t7A5KCjlZuDUNeIlr9hgolMS5s3+uzbfRHDwaRnzrdqnY2YpHDmeDS/8zY0MKQHXJtaA==} 832 | engines: {node: '>=16.10.0'} 833 | peerDependencies: 834 | prettier-plugin-svelte: ^3.0.0 835 | svelte-eslint-parser: '*' 836 | peerDependenciesMeta: 837 | prettier-plugin-svelte: 838 | optional: true 839 | svelte-eslint-parser: 840 | optional: true 841 | 842 | prettier-linter-helpers@1.0.0: 843 | resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} 844 | engines: {node: '>=6.0.0'} 845 | 846 | prettier@3.6.2: 847 | resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} 848 | engines: {node: '>=14'} 849 | hasBin: true 850 | 851 | pretty-format@29.7.0: 852 | resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 853 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 854 | 855 | punycode@2.3.1: 856 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 857 | engines: {node: '>=6'} 858 | 859 | queue-microtask@1.2.3: 860 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 861 | 862 | react-is@18.3.1: 863 | resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} 864 | 865 | require-relative@0.8.7: 866 | resolution: {integrity: sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==} 867 | 868 | resolve-from@4.0.0: 869 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 870 | engines: {node: '>=4'} 871 | 872 | resolve-pkg-maps@1.0.0: 873 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 874 | 875 | reusify@1.1.0: 876 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 877 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 878 | 879 | rimraf@3.0.2: 880 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 881 | deprecated: Rimraf versions prior to v4 are no longer supported 882 | hasBin: true 883 | 884 | run-parallel@1.2.0: 885 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 886 | 887 | semver@7.7.3: 888 | resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} 889 | engines: {node: '>=10'} 890 | hasBin: true 891 | 892 | shebang-command@2.0.0: 893 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 894 | engines: {node: '>=8'} 895 | 896 | shebang-regex@3.0.0: 897 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 898 | engines: {node: '>=8'} 899 | 900 | slash@3.0.0: 901 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 902 | engines: {node: '>=8'} 903 | 904 | strip-ansi@3.0.1: 905 | resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} 906 | engines: {node: '>=0.10.0'} 907 | 908 | strip-ansi@6.0.1: 909 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 910 | engines: {node: '>=8'} 911 | 912 | strip-json-comments@3.1.1: 913 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 914 | engines: {node: '>=8'} 915 | 916 | supports-color@2.0.0: 917 | resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} 918 | engines: {node: '>=0.8.0'} 919 | 920 | supports-color@7.2.0: 921 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 922 | engines: {node: '>=8'} 923 | 924 | synckit@0.11.11: 925 | resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} 926 | engines: {node: ^14.18.0 || >=16.0.0} 927 | 928 | text-table@0.2.0: 929 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 930 | 931 | to-regex-range@5.0.1: 932 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 933 | engines: {node: '>=8.0'} 934 | 935 | ts-api-utils@1.4.3: 936 | resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} 937 | engines: {node: '>=16'} 938 | peerDependencies: 939 | typescript: '>=4.2.0' 940 | 941 | ts-api-utils@2.1.0: 942 | resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 943 | engines: {node: '>=18.12'} 944 | peerDependencies: 945 | typescript: '>=4.8.4' 946 | 947 | tslib@2.8.1: 948 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 949 | 950 | tsx@4.20.6: 951 | resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} 952 | engines: {node: '>=18.0.0'} 953 | hasBin: true 954 | 955 | type-check@0.4.0: 956 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 957 | engines: {node: '>= 0.8.0'} 958 | 959 | type-fest@0.20.2: 960 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 961 | engines: {node: '>=10'} 962 | 963 | typescript-eslint@8.46.1: 964 | resolution: {integrity: sha512-VHgijW803JafdSsDO8I761r3SHrgk4T00IdyQ+/UsthtgPRsBWQLqoSxOolxTpxRKi1kGXK0bSz4CoAc9ObqJA==} 965 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 966 | peerDependencies: 967 | eslint: ^8.57.0 || ^9.0.0 968 | typescript: '>=4.8.4 <6.0.0' 969 | 970 | typescript@5.9.3: 971 | resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 972 | engines: {node: '>=14.17'} 973 | hasBin: true 974 | 975 | uri-js@4.4.1: 976 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 977 | 978 | vue-eslint-parser@9.4.3: 979 | resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} 980 | engines: {node: ^14.17.0 || >=16.0.0} 981 | peerDependencies: 982 | eslint: '>=6.0.0' 983 | 984 | which@2.0.2: 985 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 986 | engines: {node: '>= 8'} 987 | hasBin: true 988 | 989 | word-wrap@1.2.5: 990 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 991 | engines: {node: '>=0.10.0'} 992 | 993 | wrappy@1.0.2: 994 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 995 | 996 | yocto-queue@0.1.0: 997 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 998 | engines: {node: '>=10'} 999 | 1000 | snapshots: 1001 | 1002 | '@esbuild/aix-ppc64@0.25.11': 1003 | optional: true 1004 | 1005 | '@esbuild/android-arm64@0.25.11': 1006 | optional: true 1007 | 1008 | '@esbuild/android-arm@0.25.11': 1009 | optional: true 1010 | 1011 | '@esbuild/android-x64@0.25.11': 1012 | optional: true 1013 | 1014 | '@esbuild/darwin-arm64@0.25.11': 1015 | optional: true 1016 | 1017 | '@esbuild/darwin-x64@0.25.11': 1018 | optional: true 1019 | 1020 | '@esbuild/freebsd-arm64@0.25.11': 1021 | optional: true 1022 | 1023 | '@esbuild/freebsd-x64@0.25.11': 1024 | optional: true 1025 | 1026 | '@esbuild/linux-arm64@0.25.11': 1027 | optional: true 1028 | 1029 | '@esbuild/linux-arm@0.25.11': 1030 | optional: true 1031 | 1032 | '@esbuild/linux-ia32@0.25.11': 1033 | optional: true 1034 | 1035 | '@esbuild/linux-loong64@0.25.11': 1036 | optional: true 1037 | 1038 | '@esbuild/linux-mips64el@0.25.11': 1039 | optional: true 1040 | 1041 | '@esbuild/linux-ppc64@0.25.11': 1042 | optional: true 1043 | 1044 | '@esbuild/linux-riscv64@0.25.11': 1045 | optional: true 1046 | 1047 | '@esbuild/linux-s390x@0.25.11': 1048 | optional: true 1049 | 1050 | '@esbuild/linux-x64@0.25.11': 1051 | optional: true 1052 | 1053 | '@esbuild/netbsd-arm64@0.25.11': 1054 | optional: true 1055 | 1056 | '@esbuild/netbsd-x64@0.25.11': 1057 | optional: true 1058 | 1059 | '@esbuild/openbsd-arm64@0.25.11': 1060 | optional: true 1061 | 1062 | '@esbuild/openbsd-x64@0.25.11': 1063 | optional: true 1064 | 1065 | '@esbuild/openharmony-arm64@0.25.11': 1066 | optional: true 1067 | 1068 | '@esbuild/sunos-x64@0.25.11': 1069 | optional: true 1070 | 1071 | '@esbuild/win32-arm64@0.25.11': 1072 | optional: true 1073 | 1074 | '@esbuild/win32-ia32@0.25.11': 1075 | optional: true 1076 | 1077 | '@esbuild/win32-x64@0.25.11': 1078 | optional: true 1079 | 1080 | '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': 1081 | dependencies: 1082 | eslint: 8.57.1 1083 | eslint-visitor-keys: 3.4.3 1084 | 1085 | '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0(jiti@2.6.1))': 1086 | dependencies: 1087 | eslint: 9.38.0(jiti@2.6.1) 1088 | eslint-visitor-keys: 3.4.3 1089 | 1090 | '@eslint-community/regexpp@4.12.1': {} 1091 | 1092 | '@eslint/config-array@0.21.1': 1093 | dependencies: 1094 | '@eslint/object-schema': 2.1.7 1095 | debug: 4.4.3 1096 | minimatch: 3.1.2 1097 | transitivePeerDependencies: 1098 | - supports-color 1099 | 1100 | '@eslint/config-helpers@0.4.1': 1101 | dependencies: 1102 | '@eslint/core': 0.16.0 1103 | 1104 | '@eslint/core@0.16.0': 1105 | dependencies: 1106 | '@types/json-schema': 7.0.15 1107 | 1108 | '@eslint/eslintrc@2.1.4': 1109 | dependencies: 1110 | ajv: 6.12.6 1111 | debug: 4.4.3 1112 | espree: 9.6.1 1113 | globals: 13.24.0 1114 | ignore: 5.3.2 1115 | import-fresh: 3.3.1 1116 | js-yaml: 4.1.0 1117 | minimatch: 3.1.2 1118 | strip-json-comments: 3.1.1 1119 | transitivePeerDependencies: 1120 | - supports-color 1121 | 1122 | '@eslint/eslintrc@3.3.1': 1123 | dependencies: 1124 | ajv: 6.12.6 1125 | debug: 4.4.3 1126 | espree: 10.4.0 1127 | globals: 14.0.0 1128 | ignore: 5.3.2 1129 | import-fresh: 3.3.1 1130 | js-yaml: 4.1.0 1131 | minimatch: 3.1.2 1132 | strip-json-comments: 3.1.1 1133 | transitivePeerDependencies: 1134 | - supports-color 1135 | 1136 | '@eslint/js@8.57.1': {} 1137 | 1138 | '@eslint/js@9.37.0': {} 1139 | 1140 | '@eslint/js@9.38.0': {} 1141 | 1142 | '@eslint/object-schema@2.1.7': {} 1143 | 1144 | '@eslint/plugin-kit@0.4.0': 1145 | dependencies: 1146 | '@eslint/core': 0.16.0 1147 | levn: 0.4.1 1148 | 1149 | '@humanfs/core@0.19.1': {} 1150 | 1151 | '@humanfs/node@0.16.7': 1152 | dependencies: 1153 | '@humanfs/core': 0.19.1 1154 | '@humanwhocodes/retry': 0.4.3 1155 | 1156 | '@humanwhocodes/config-array@0.13.0': 1157 | dependencies: 1158 | '@humanwhocodes/object-schema': 2.0.3 1159 | debug: 4.4.3 1160 | minimatch: 3.1.2 1161 | transitivePeerDependencies: 1162 | - supports-color 1163 | 1164 | '@humanwhocodes/module-importer@1.0.1': {} 1165 | 1166 | '@humanwhocodes/object-schema@2.0.3': {} 1167 | 1168 | '@humanwhocodes/retry@0.4.3': {} 1169 | 1170 | '@jest/schemas@29.6.3': 1171 | dependencies: 1172 | '@sinclair/typebox': 0.27.8 1173 | 1174 | '@nodelib/fs.scandir@2.1.5': 1175 | dependencies: 1176 | '@nodelib/fs.stat': 2.0.5 1177 | run-parallel: 1.2.0 1178 | 1179 | '@nodelib/fs.stat@2.0.5': {} 1180 | 1181 | '@nodelib/fs.walk@1.2.8': 1182 | dependencies: 1183 | '@nodelib/fs.scandir': 2.1.5 1184 | fastq: 1.19.1 1185 | 1186 | '@pkgr/core@0.2.9': {} 1187 | 1188 | '@sinclair/typebox@0.27.8': {} 1189 | 1190 | '@types/estree@1.0.8': {} 1191 | 1192 | '@types/json-schema@7.0.15': {} 1193 | 1194 | '@typescript-eslint/eslint-plugin@8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': 1195 | dependencies: 1196 | '@eslint-community/regexpp': 4.12.1 1197 | '@typescript-eslint/parser': 8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) 1198 | '@typescript-eslint/scope-manager': 8.46.1 1199 | '@typescript-eslint/type-utils': 8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) 1200 | '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) 1201 | '@typescript-eslint/visitor-keys': 8.46.1 1202 | eslint: 9.38.0(jiti@2.6.1) 1203 | graphemer: 1.4.0 1204 | ignore: 7.0.5 1205 | natural-compare: 1.4.0 1206 | ts-api-utils: 2.1.0(typescript@5.9.3) 1207 | typescript: 5.9.3 1208 | transitivePeerDependencies: 1209 | - supports-color 1210 | 1211 | '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3)': 1212 | dependencies: 1213 | '@typescript-eslint/scope-manager': 6.21.0 1214 | '@typescript-eslint/types': 6.21.0 1215 | '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) 1216 | '@typescript-eslint/visitor-keys': 6.21.0 1217 | debug: 4.4.3 1218 | eslint: 8.57.1 1219 | optionalDependencies: 1220 | typescript: 5.9.3 1221 | transitivePeerDependencies: 1222 | - supports-color 1223 | 1224 | '@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': 1225 | dependencies: 1226 | '@typescript-eslint/scope-manager': 8.46.1 1227 | '@typescript-eslint/types': 8.46.1 1228 | '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3) 1229 | '@typescript-eslint/visitor-keys': 8.46.1 1230 | debug: 4.4.3 1231 | eslint: 9.38.0(jiti@2.6.1) 1232 | typescript: 5.9.3 1233 | transitivePeerDependencies: 1234 | - supports-color 1235 | 1236 | '@typescript-eslint/project-service@8.46.1(typescript@5.9.3)': 1237 | dependencies: 1238 | '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3) 1239 | '@typescript-eslint/types': 8.46.1 1240 | debug: 4.4.3 1241 | typescript: 5.9.3 1242 | transitivePeerDependencies: 1243 | - supports-color 1244 | 1245 | '@typescript-eslint/scope-manager@6.21.0': 1246 | dependencies: 1247 | '@typescript-eslint/types': 6.21.0 1248 | '@typescript-eslint/visitor-keys': 6.21.0 1249 | 1250 | '@typescript-eslint/scope-manager@8.46.1': 1251 | dependencies: 1252 | '@typescript-eslint/types': 8.46.1 1253 | '@typescript-eslint/visitor-keys': 8.46.1 1254 | 1255 | '@typescript-eslint/tsconfig-utils@8.46.1(typescript@5.9.3)': 1256 | dependencies: 1257 | typescript: 5.9.3 1258 | 1259 | '@typescript-eslint/type-utils@8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': 1260 | dependencies: 1261 | '@typescript-eslint/types': 8.46.1 1262 | '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3) 1263 | '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) 1264 | debug: 4.4.3 1265 | eslint: 9.38.0(jiti@2.6.1) 1266 | ts-api-utils: 2.1.0(typescript@5.9.3) 1267 | typescript: 5.9.3 1268 | transitivePeerDependencies: 1269 | - supports-color 1270 | 1271 | '@typescript-eslint/types@6.21.0': {} 1272 | 1273 | '@typescript-eslint/types@8.46.1': {} 1274 | 1275 | '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.3)': 1276 | dependencies: 1277 | '@typescript-eslint/types': 6.21.0 1278 | '@typescript-eslint/visitor-keys': 6.21.0 1279 | debug: 4.4.3 1280 | globby: 11.1.0 1281 | is-glob: 4.0.3 1282 | minimatch: 9.0.3 1283 | semver: 7.7.3 1284 | ts-api-utils: 1.4.3(typescript@5.9.3) 1285 | optionalDependencies: 1286 | typescript: 5.9.3 1287 | transitivePeerDependencies: 1288 | - supports-color 1289 | 1290 | '@typescript-eslint/typescript-estree@8.46.1(typescript@5.9.3)': 1291 | dependencies: 1292 | '@typescript-eslint/project-service': 8.46.1(typescript@5.9.3) 1293 | '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3) 1294 | '@typescript-eslint/types': 8.46.1 1295 | '@typescript-eslint/visitor-keys': 8.46.1 1296 | debug: 4.4.3 1297 | fast-glob: 3.3.3 1298 | is-glob: 4.0.3 1299 | minimatch: 9.0.5 1300 | semver: 7.7.3 1301 | ts-api-utils: 2.1.0(typescript@5.9.3) 1302 | typescript: 5.9.3 1303 | transitivePeerDependencies: 1304 | - supports-color 1305 | 1306 | '@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': 1307 | dependencies: 1308 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) 1309 | '@typescript-eslint/scope-manager': 8.46.1 1310 | '@typescript-eslint/types': 8.46.1 1311 | '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3) 1312 | eslint: 9.38.0(jiti@2.6.1) 1313 | typescript: 5.9.3 1314 | transitivePeerDependencies: 1315 | - supports-color 1316 | 1317 | '@typescript-eslint/visitor-keys@6.21.0': 1318 | dependencies: 1319 | '@typescript-eslint/types': 6.21.0 1320 | eslint-visitor-keys: 3.4.3 1321 | 1322 | '@typescript-eslint/visitor-keys@8.46.1': 1323 | dependencies: 1324 | '@typescript-eslint/types': 8.46.1 1325 | eslint-visitor-keys: 4.2.1 1326 | 1327 | '@ungap/structured-clone@1.3.0': {} 1328 | 1329 | acorn-jsx@5.3.2(acorn@8.15.0): 1330 | dependencies: 1331 | acorn: 8.15.0 1332 | 1333 | acorn@8.15.0: {} 1334 | 1335 | ajv@6.12.6: 1336 | dependencies: 1337 | fast-deep-equal: 3.1.3 1338 | fast-json-stable-stringify: 2.1.0 1339 | json-schema-traverse: 0.4.1 1340 | uri-js: 4.4.1 1341 | 1342 | ansi-regex@2.1.1: {} 1343 | 1344 | ansi-regex@5.0.1: {} 1345 | 1346 | ansi-styles@2.2.1: {} 1347 | 1348 | ansi-styles@4.3.0: 1349 | dependencies: 1350 | color-convert: 2.0.1 1351 | 1352 | ansi-styles@5.2.0: {} 1353 | 1354 | argparse@2.0.1: {} 1355 | 1356 | array-union@2.1.0: {} 1357 | 1358 | balanced-match@1.0.2: {} 1359 | 1360 | brace-expansion@1.1.12: 1361 | dependencies: 1362 | balanced-match: 1.0.2 1363 | concat-map: 0.0.1 1364 | 1365 | brace-expansion@2.0.2: 1366 | dependencies: 1367 | balanced-match: 1.0.2 1368 | 1369 | braces@3.0.3: 1370 | dependencies: 1371 | fill-range: 7.1.1 1372 | 1373 | callsites@3.1.0: {} 1374 | 1375 | chalk@1.1.3: 1376 | dependencies: 1377 | ansi-styles: 2.2.1 1378 | escape-string-regexp: 1.0.5 1379 | has-ansi: 2.0.0 1380 | strip-ansi: 3.0.1 1381 | supports-color: 2.0.0 1382 | 1383 | chalk@4.1.2: 1384 | dependencies: 1385 | ansi-styles: 4.3.0 1386 | supports-color: 7.2.0 1387 | 1388 | color-convert@2.0.1: 1389 | dependencies: 1390 | color-name: 1.1.4 1391 | 1392 | color-name@1.1.4: {} 1393 | 1394 | common-tags@1.8.2: {} 1395 | 1396 | concat-map@0.0.1: {} 1397 | 1398 | cross-spawn@7.0.6: 1399 | dependencies: 1400 | path-key: 3.1.1 1401 | shebang-command: 2.0.0 1402 | which: 2.0.2 1403 | 1404 | debug@4.4.3: 1405 | dependencies: 1406 | ms: 2.1.3 1407 | 1408 | deep-is@0.1.4: {} 1409 | 1410 | dir-glob@3.0.1: 1411 | dependencies: 1412 | path-type: 4.0.0 1413 | 1414 | dlv@1.1.3: {} 1415 | 1416 | doctrine@3.0.0: 1417 | dependencies: 1418 | esutils: 2.0.3 1419 | 1420 | esbuild@0.25.11: 1421 | optionalDependencies: 1422 | '@esbuild/aix-ppc64': 0.25.11 1423 | '@esbuild/android-arm': 0.25.11 1424 | '@esbuild/android-arm64': 0.25.11 1425 | '@esbuild/android-x64': 0.25.11 1426 | '@esbuild/darwin-arm64': 0.25.11 1427 | '@esbuild/darwin-x64': 0.25.11 1428 | '@esbuild/freebsd-arm64': 0.25.11 1429 | '@esbuild/freebsd-x64': 0.25.11 1430 | '@esbuild/linux-arm': 0.25.11 1431 | '@esbuild/linux-arm64': 0.25.11 1432 | '@esbuild/linux-ia32': 0.25.11 1433 | '@esbuild/linux-loong64': 0.25.11 1434 | '@esbuild/linux-mips64el': 0.25.11 1435 | '@esbuild/linux-ppc64': 0.25.11 1436 | '@esbuild/linux-riscv64': 0.25.11 1437 | '@esbuild/linux-s390x': 0.25.11 1438 | '@esbuild/linux-x64': 0.25.11 1439 | '@esbuild/netbsd-arm64': 0.25.11 1440 | '@esbuild/netbsd-x64': 0.25.11 1441 | '@esbuild/openbsd-arm64': 0.25.11 1442 | '@esbuild/openbsd-x64': 0.25.11 1443 | '@esbuild/openharmony-arm64': 0.25.11 1444 | '@esbuild/sunos-x64': 0.25.11 1445 | '@esbuild/win32-arm64': 0.25.11 1446 | '@esbuild/win32-ia32': 0.25.11 1447 | '@esbuild/win32-x64': 0.25.11 1448 | 1449 | escape-string-regexp@1.0.5: {} 1450 | 1451 | escape-string-regexp@4.0.0: {} 1452 | 1453 | eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.1)): 1454 | dependencies: 1455 | eslint: 9.38.0(jiti@2.6.1) 1456 | 1457 | eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.1)))(eslint@9.38.0(jiti@2.6.1))(prettier@3.6.2): 1458 | dependencies: 1459 | eslint: 9.38.0(jiti@2.6.1) 1460 | prettier: 3.6.2 1461 | prettier-linter-helpers: 1.0.0 1462 | synckit: 0.11.11 1463 | optionalDependencies: 1464 | eslint-config-prettier: 10.1.8(eslint@9.38.0(jiti@2.6.1)) 1465 | 1466 | eslint-scope@7.2.2: 1467 | dependencies: 1468 | esrecurse: 4.3.0 1469 | estraverse: 5.3.0 1470 | 1471 | eslint-scope@8.4.0: 1472 | dependencies: 1473 | esrecurse: 4.3.0 1474 | estraverse: 5.3.0 1475 | 1476 | eslint-visitor-keys@3.4.3: {} 1477 | 1478 | eslint-visitor-keys@4.2.1: {} 1479 | 1480 | eslint@8.57.1: 1481 | dependencies: 1482 | '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) 1483 | '@eslint-community/regexpp': 4.12.1 1484 | '@eslint/eslintrc': 2.1.4 1485 | '@eslint/js': 8.57.1 1486 | '@humanwhocodes/config-array': 0.13.0 1487 | '@humanwhocodes/module-importer': 1.0.1 1488 | '@nodelib/fs.walk': 1.2.8 1489 | '@ungap/structured-clone': 1.3.0 1490 | ajv: 6.12.6 1491 | chalk: 4.1.2 1492 | cross-spawn: 7.0.6 1493 | debug: 4.4.3 1494 | doctrine: 3.0.0 1495 | escape-string-regexp: 4.0.0 1496 | eslint-scope: 7.2.2 1497 | eslint-visitor-keys: 3.4.3 1498 | espree: 9.6.1 1499 | esquery: 1.6.0 1500 | esutils: 2.0.3 1501 | fast-deep-equal: 3.1.3 1502 | file-entry-cache: 6.0.1 1503 | find-up: 5.0.0 1504 | glob-parent: 6.0.2 1505 | globals: 13.24.0 1506 | graphemer: 1.4.0 1507 | ignore: 5.3.2 1508 | imurmurhash: 0.1.4 1509 | is-glob: 4.0.3 1510 | is-path-inside: 3.0.3 1511 | js-yaml: 4.1.0 1512 | json-stable-stringify-without-jsonify: 1.0.1 1513 | levn: 0.4.1 1514 | lodash.merge: 4.6.2 1515 | minimatch: 3.1.2 1516 | natural-compare: 1.4.0 1517 | optionator: 0.9.4 1518 | strip-ansi: 6.0.1 1519 | text-table: 0.2.0 1520 | transitivePeerDependencies: 1521 | - supports-color 1522 | 1523 | eslint@9.38.0(jiti@2.6.1): 1524 | dependencies: 1525 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) 1526 | '@eslint-community/regexpp': 4.12.1 1527 | '@eslint/config-array': 0.21.1 1528 | '@eslint/config-helpers': 0.4.1 1529 | '@eslint/core': 0.16.0 1530 | '@eslint/eslintrc': 3.3.1 1531 | '@eslint/js': 9.38.0 1532 | '@eslint/plugin-kit': 0.4.0 1533 | '@humanfs/node': 0.16.7 1534 | '@humanwhocodes/module-importer': 1.0.1 1535 | '@humanwhocodes/retry': 0.4.3 1536 | '@types/estree': 1.0.8 1537 | ajv: 6.12.6 1538 | chalk: 4.1.2 1539 | cross-spawn: 7.0.6 1540 | debug: 4.4.3 1541 | escape-string-regexp: 4.0.0 1542 | eslint-scope: 8.4.0 1543 | eslint-visitor-keys: 4.2.1 1544 | espree: 10.4.0 1545 | esquery: 1.6.0 1546 | esutils: 2.0.3 1547 | fast-deep-equal: 3.1.3 1548 | file-entry-cache: 8.0.0 1549 | find-up: 5.0.0 1550 | glob-parent: 6.0.2 1551 | ignore: 5.3.2 1552 | imurmurhash: 0.1.4 1553 | is-glob: 4.0.3 1554 | json-stable-stringify-without-jsonify: 1.0.1 1555 | lodash.merge: 4.6.2 1556 | minimatch: 3.1.2 1557 | natural-compare: 1.4.0 1558 | optionator: 0.9.4 1559 | optionalDependencies: 1560 | jiti: 2.6.1 1561 | transitivePeerDependencies: 1562 | - supports-color 1563 | 1564 | espree@10.4.0: 1565 | dependencies: 1566 | acorn: 8.15.0 1567 | acorn-jsx: 5.3.2(acorn@8.15.0) 1568 | eslint-visitor-keys: 4.2.1 1569 | 1570 | espree@9.6.1: 1571 | dependencies: 1572 | acorn: 8.15.0 1573 | acorn-jsx: 5.3.2(acorn@8.15.0) 1574 | eslint-visitor-keys: 3.4.3 1575 | 1576 | esquery@1.6.0: 1577 | dependencies: 1578 | estraverse: 5.3.0 1579 | 1580 | esrecurse@4.3.0: 1581 | dependencies: 1582 | estraverse: 5.3.0 1583 | 1584 | estraverse@5.3.0: {} 1585 | 1586 | esutils@2.0.3: {} 1587 | 1588 | fast-deep-equal@3.1.3: {} 1589 | 1590 | fast-diff@1.3.0: {} 1591 | 1592 | fast-glob@3.3.3: 1593 | dependencies: 1594 | '@nodelib/fs.stat': 2.0.5 1595 | '@nodelib/fs.walk': 1.2.8 1596 | glob-parent: 5.1.2 1597 | merge2: 1.4.1 1598 | micromatch: 4.0.8 1599 | 1600 | fast-json-stable-stringify@2.1.0: {} 1601 | 1602 | fast-levenshtein@2.0.6: {} 1603 | 1604 | fastq@1.19.1: 1605 | dependencies: 1606 | reusify: 1.1.0 1607 | 1608 | file-entry-cache@6.0.1: 1609 | dependencies: 1610 | flat-cache: 3.2.0 1611 | 1612 | file-entry-cache@8.0.0: 1613 | dependencies: 1614 | flat-cache: 4.0.1 1615 | 1616 | fill-range@7.1.1: 1617 | dependencies: 1618 | to-regex-range: 5.0.1 1619 | 1620 | find-up@5.0.0: 1621 | dependencies: 1622 | locate-path: 6.0.0 1623 | path-exists: 4.0.0 1624 | 1625 | flat-cache@3.2.0: 1626 | dependencies: 1627 | flatted: 3.3.3 1628 | keyv: 4.5.4 1629 | rimraf: 3.0.2 1630 | 1631 | flat-cache@4.0.1: 1632 | dependencies: 1633 | flatted: 3.3.3 1634 | keyv: 4.5.4 1635 | 1636 | flatted@3.3.3: {} 1637 | 1638 | fs.realpath@1.0.0: {} 1639 | 1640 | fsevents@2.3.3: 1641 | optional: true 1642 | 1643 | get-tsconfig@4.12.0: 1644 | dependencies: 1645 | resolve-pkg-maps: 1.0.0 1646 | 1647 | glob-parent@5.1.2: 1648 | dependencies: 1649 | is-glob: 4.0.3 1650 | 1651 | glob-parent@6.0.2: 1652 | dependencies: 1653 | is-glob: 4.0.3 1654 | 1655 | glob@7.2.3: 1656 | dependencies: 1657 | fs.realpath: 1.0.0 1658 | inflight: 1.0.6 1659 | inherits: 2.0.4 1660 | minimatch: 3.1.2 1661 | once: 1.4.0 1662 | path-is-absolute: 1.0.1 1663 | 1664 | globals@13.24.0: 1665 | dependencies: 1666 | type-fest: 0.20.2 1667 | 1668 | globals@14.0.0: {} 1669 | 1670 | globby@11.1.0: 1671 | dependencies: 1672 | array-union: 2.1.0 1673 | dir-glob: 3.0.1 1674 | fast-glob: 3.3.3 1675 | ignore: 5.3.2 1676 | merge2: 1.4.1 1677 | slash: 3.0.0 1678 | 1679 | graphemer@1.4.0: {} 1680 | 1681 | has-ansi@2.0.0: 1682 | dependencies: 1683 | ansi-regex: 2.1.1 1684 | 1685 | has-flag@4.0.0: {} 1686 | 1687 | ignore@5.3.2: {} 1688 | 1689 | ignore@7.0.5: {} 1690 | 1691 | import-fresh@3.3.1: 1692 | dependencies: 1693 | parent-module: 1.0.1 1694 | resolve-from: 4.0.0 1695 | 1696 | imurmurhash@0.1.4: {} 1697 | 1698 | indent-string@4.0.0: {} 1699 | 1700 | inflight@1.0.6: 1701 | dependencies: 1702 | once: 1.4.0 1703 | wrappy: 1.0.2 1704 | 1705 | inherits@2.0.4: {} 1706 | 1707 | is-extglob@2.1.1: {} 1708 | 1709 | is-glob@4.0.3: 1710 | dependencies: 1711 | is-extglob: 2.1.1 1712 | 1713 | is-number@7.0.0: {} 1714 | 1715 | is-path-inside@3.0.3: {} 1716 | 1717 | isexe@2.0.0: {} 1718 | 1719 | jiti@2.6.1: 1720 | optional: true 1721 | 1722 | js-yaml@4.1.0: 1723 | dependencies: 1724 | argparse: 2.0.1 1725 | 1726 | json-buffer@3.0.1: {} 1727 | 1728 | json-schema-traverse@0.4.1: {} 1729 | 1730 | json-stable-stringify-without-jsonify@1.0.1: {} 1731 | 1732 | keyv@4.5.4: 1733 | dependencies: 1734 | json-buffer: 3.0.1 1735 | 1736 | levn@0.4.1: 1737 | dependencies: 1738 | prelude-ls: 1.2.1 1739 | type-check: 0.4.0 1740 | 1741 | locate-path@6.0.0: 1742 | dependencies: 1743 | p-locate: 5.0.0 1744 | 1745 | lodash.merge@4.6.2: {} 1746 | 1747 | lodash@4.17.21: {} 1748 | 1749 | loglevel-colored-level-prefix@1.0.0: 1750 | dependencies: 1751 | chalk: 1.1.3 1752 | loglevel: 1.9.2 1753 | 1754 | loglevel@1.9.2: {} 1755 | 1756 | merge2@1.4.1: {} 1757 | 1758 | micromatch@4.0.8: 1759 | dependencies: 1760 | braces: 3.0.3 1761 | picomatch: 2.3.1 1762 | 1763 | minimatch@3.1.2: 1764 | dependencies: 1765 | brace-expansion: 1.1.12 1766 | 1767 | minimatch@9.0.3: 1768 | dependencies: 1769 | brace-expansion: 2.0.2 1770 | 1771 | minimatch@9.0.5: 1772 | dependencies: 1773 | brace-expansion: 2.0.2 1774 | 1775 | ms@2.1.3: {} 1776 | 1777 | natural-compare@1.4.0: {} 1778 | 1779 | once@1.4.0: 1780 | dependencies: 1781 | wrappy: 1.0.2 1782 | 1783 | optionator@0.9.4: 1784 | dependencies: 1785 | deep-is: 0.1.4 1786 | fast-levenshtein: 2.0.6 1787 | levn: 0.4.1 1788 | prelude-ls: 1.2.1 1789 | type-check: 0.4.0 1790 | word-wrap: 1.2.5 1791 | 1792 | p-limit@3.1.0: 1793 | dependencies: 1794 | yocto-queue: 0.1.0 1795 | 1796 | p-locate@5.0.0: 1797 | dependencies: 1798 | p-limit: 3.1.0 1799 | 1800 | parent-module@1.0.1: 1801 | dependencies: 1802 | callsites: 3.1.0 1803 | 1804 | path-exists@4.0.0: {} 1805 | 1806 | path-is-absolute@1.0.1: {} 1807 | 1808 | path-key@3.1.1: {} 1809 | 1810 | path-type@4.0.0: {} 1811 | 1812 | picomatch@2.3.1: {} 1813 | 1814 | prelude-ls@1.2.1: {} 1815 | 1816 | prettier-eslint@16.4.2(typescript@5.9.3): 1817 | dependencies: 1818 | '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) 1819 | common-tags: 1.8.2 1820 | dlv: 1.1.3 1821 | eslint: 8.57.1 1822 | indent-string: 4.0.0 1823 | lodash.merge: 4.6.2 1824 | loglevel-colored-level-prefix: 1.0.0 1825 | prettier: 3.6.2 1826 | pretty-format: 29.7.0 1827 | require-relative: 0.8.7 1828 | tslib: 2.8.1 1829 | vue-eslint-parser: 9.4.3(eslint@8.57.1) 1830 | transitivePeerDependencies: 1831 | - supports-color 1832 | - typescript 1833 | 1834 | prettier-linter-helpers@1.0.0: 1835 | dependencies: 1836 | fast-diff: 1.3.0 1837 | 1838 | prettier@3.6.2: {} 1839 | 1840 | pretty-format@29.7.0: 1841 | dependencies: 1842 | '@jest/schemas': 29.6.3 1843 | ansi-styles: 5.2.0 1844 | react-is: 18.3.1 1845 | 1846 | punycode@2.3.1: {} 1847 | 1848 | queue-microtask@1.2.3: {} 1849 | 1850 | react-is@18.3.1: {} 1851 | 1852 | require-relative@0.8.7: {} 1853 | 1854 | resolve-from@4.0.0: {} 1855 | 1856 | resolve-pkg-maps@1.0.0: {} 1857 | 1858 | reusify@1.1.0: {} 1859 | 1860 | rimraf@3.0.2: 1861 | dependencies: 1862 | glob: 7.2.3 1863 | 1864 | run-parallel@1.2.0: 1865 | dependencies: 1866 | queue-microtask: 1.2.3 1867 | 1868 | semver@7.7.3: {} 1869 | 1870 | shebang-command@2.0.0: 1871 | dependencies: 1872 | shebang-regex: 3.0.0 1873 | 1874 | shebang-regex@3.0.0: {} 1875 | 1876 | slash@3.0.0: {} 1877 | 1878 | strip-ansi@3.0.1: 1879 | dependencies: 1880 | ansi-regex: 2.1.1 1881 | 1882 | strip-ansi@6.0.1: 1883 | dependencies: 1884 | ansi-regex: 5.0.1 1885 | 1886 | strip-json-comments@3.1.1: {} 1887 | 1888 | supports-color@2.0.0: {} 1889 | 1890 | supports-color@7.2.0: 1891 | dependencies: 1892 | has-flag: 4.0.0 1893 | 1894 | synckit@0.11.11: 1895 | dependencies: 1896 | '@pkgr/core': 0.2.9 1897 | 1898 | text-table@0.2.0: {} 1899 | 1900 | to-regex-range@5.0.1: 1901 | dependencies: 1902 | is-number: 7.0.0 1903 | 1904 | ts-api-utils@1.4.3(typescript@5.9.3): 1905 | dependencies: 1906 | typescript: 5.9.3 1907 | 1908 | ts-api-utils@2.1.0(typescript@5.9.3): 1909 | dependencies: 1910 | typescript: 5.9.3 1911 | 1912 | tslib@2.8.1: {} 1913 | 1914 | tsx@4.20.6: 1915 | dependencies: 1916 | esbuild: 0.25.11 1917 | get-tsconfig: 4.12.0 1918 | optionalDependencies: 1919 | fsevents: 2.3.3 1920 | 1921 | type-check@0.4.0: 1922 | dependencies: 1923 | prelude-ls: 1.2.1 1924 | 1925 | type-fest@0.20.2: {} 1926 | 1927 | typescript-eslint@8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3): 1928 | dependencies: 1929 | '@typescript-eslint/eslint-plugin': 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) 1930 | '@typescript-eslint/parser': 8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) 1931 | '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3) 1932 | '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) 1933 | eslint: 9.38.0(jiti@2.6.1) 1934 | typescript: 5.9.3 1935 | transitivePeerDependencies: 1936 | - supports-color 1937 | 1938 | typescript@5.9.3: {} 1939 | 1940 | uri-js@4.4.1: 1941 | dependencies: 1942 | punycode: 2.3.1 1943 | 1944 | vue-eslint-parser@9.4.3(eslint@8.57.1): 1945 | dependencies: 1946 | debug: 4.4.3 1947 | eslint: 8.57.1 1948 | eslint-scope: 7.2.2 1949 | eslint-visitor-keys: 3.4.3 1950 | espree: 9.6.1 1951 | esquery: 1.6.0 1952 | lodash: 4.17.21 1953 | semver: 7.7.3 1954 | transitivePeerDependencies: 1955 | - supports-color 1956 | 1957 | which@2.0.2: 1958 | dependencies: 1959 | isexe: 2.0.0 1960 | 1961 | word-wrap@1.2.5: {} 1962 | 1963 | wrappy@1.0.2: {} 1964 | 1965 | yocto-queue@0.1.0: {} 1966 | --------------------------------------------------------------------------------