├── packages ├── replkit │ ├── .gitignore │ ├── tsconfig.json │ ├── changelog.md │ ├── src │ │ ├── upgrade.ts │ │ ├── send.ts │ │ ├── htmlFallbackMiddleware.ts │ │ ├── sourcemap.ts │ │ ├── indexHtmlMiddleware.ts │ │ ├── scaffold.ts │ │ └── index.ts │ └── package.json └── template │ ├── .gitignore │ ├── extension.json │ ├── src │ └── tool │ │ ├── main.tsx │ │ └── index.html │ ├── tsconfig.json │ ├── package.json │ ├── public │ └── replit.svg │ └── .replit ├── pnpm-workspace.yaml ├── .gitignore ├── .replit ├── turbo.json ├── .github └── workflows │ └── ci.yaml ├── package.json └── pnpm-lock.yaml /packages/replkit/.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | -------------------------------------------------------------------------------- /packages/template/.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - 'packages/*' -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .config 3 | dist 4 | **/node_modules 5 | .turbo -------------------------------------------------------------------------------- /.replit: -------------------------------------------------------------------------------- 1 | run = "pnpm dev" 2 | 3 | modules = ["nodejs-18:v3-20230608-f4cd419"] 4 | 5 | hidden = [".config", "package-lock.json"] 6 | 7 | [deployment] 8 | run = ["sh", "-c", "node index.js"] 9 | 10 | [extension] 11 | isExtension = true -------------------------------------------------------------------------------- /packages/template/extension.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "My extension", 3 | "description": "A new Replit Extension", 4 | "icon": "/replit.svg", 5 | "tools": [ 6 | { 7 | "name": "Example tool", 8 | "handler": "/tool", 9 | "icon": "/replit.svg" 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /turbo.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://turbo.build/schema.json", 3 | "pipeline": { 4 | "build": { 5 | "dependsOn": ["^build"] 6 | }, 7 | "clean": { 8 | "dependsOn": ["^clean"] 9 | }, 10 | "lint": { 11 | "dependsOn": ["^lint"] 12 | }, 13 | "type:check": { 14 | "dependsOn": ["^type:check"] 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /packages/template/src/tool/main.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import { render } from "react-dom"; 3 | import { useReplit } from "@replit/extensions-react"; 4 | 5 | function Component() { 6 | const { replit } = useReplit(); 7 | 8 | return
Replit Extension
; 9 | } 10 | 11 | render(, document.getElementById("root") as Element); 12 | -------------------------------------------------------------------------------- /packages/replkit/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["src"], 3 | "compilerOptions": { 4 | "esModuleInterop": true, 5 | "target": "ESNext", 6 | "module": "esnext", 7 | "moduleResolution": "node", 8 | "resolveJsonModule": true, 9 | "isolatedModules": true, 10 | "jsx": "react-jsx", 11 | "noUncheckedIndexedAccess": true, 12 | "types": ["node"], 13 | "skipLibCheck": true, 14 | } 15 | } -------------------------------------------------------------------------------- /packages/replkit/changelog.md: -------------------------------------------------------------------------------- 1 | ## 0.0.6 2 | 3 | - Fixes to scaffolding 4 | - Fixes to rewrite logic 5 | - Better help text for `replkit add` 6 | 7 | ## 0.0.5 8 | 9 | - simple upgrade command 10 | 11 | ## 0.0.4 12 | 13 | - scaffolding script 14 | - Assume home directory 15 | 16 | ## 0.0.3 17 | 18 | - index.html resolution 19 | 20 | ## 0.0.2 21 | 22 | - fixed empty CLI behavior 23 | 24 | ## 0.0.1 25 | 26 | - init 27 | -------------------------------------------------------------------------------- /packages/template/src/tool/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Extension Tool 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.github/workflows/ci.yaml: -------------------------------------------------------------------------------- 1 | name: checks 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | branches: 9 | - main 10 | 11 | jobs: 12 | typescript: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v2 16 | - uses: actions/setup-node@v2 17 | with: 18 | node-version: 18 19 | - uses: pnpm/action-setup@v2 20 | with: 21 | version: 7.29.1 22 | - run: pnpm install 23 | - run: pnpm type:check -------------------------------------------------------------------------------- /packages/replkit/src/upgrade.ts: -------------------------------------------------------------------------------- 1 | import { spawn } from "child_process"; 2 | 3 | export async function installReplkit({ version, homeDirectory }) { 4 | return new Promise((resolve, reject) => { 5 | const child = spawn( 6 | "npm", 7 | ["-C", homeDirectory, "i", `@replit/replkit@${version}`], 8 | { stdio: "inherit" }, 9 | ); 10 | 11 | child.on("close", (code) => { 12 | if (code === 0) { 13 | resolve(); 14 | } else { 15 | reject(new Error(`Exited with code ${code}`)); 16 | } 17 | }); 18 | }); 19 | } 20 | -------------------------------------------------------------------------------- /packages/template/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "esModuleInterop": true, 5 | "target": "ESNext", 6 | "useDefineForClassFields": true, 7 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 8 | "allowJs": true, 9 | "skipLibCheck": true, 10 | "allowSyntheticDefaultImports": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "module": "ESNext", 13 | "moduleResolution": "Node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noEmit": true, 17 | "jsx": "react-jsx" 18 | }, 19 | "include": ["src"], 20 | "exclude": ["node_modules", "dist"] 21 | } 22 | -------------------------------------------------------------------------------- /packages/template/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "replit-extension-template", 3 | "version": "0.0.1", 4 | "private": true, 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "lint": "npx prettier --write src/*", 9 | "clean": "rm -rf dist/", 10 | "type:check": "tsc --noEmit" 11 | }, 12 | "keywords": [], 13 | "author": "", 14 | "license": "ISC", 15 | "dependencies": { 16 | "@replit/extensions": "^1.10.0", 17 | "@replit/extensions-react": "^0.6.0", 18 | "@replit/replkit": "^0.0.5", 19 | "react": "^18.2.0", 20 | "react-dom": "^18.2.0" 21 | }, 22 | "devDependencies": { 23 | "@types/react": "^18.2.31", 24 | "@types/react-dom": "^18.2.14" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /packages/template/public/replit.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodejs", 3 | "version": "1.0.0", 4 | "description": "", 5 | "keywords": [], 6 | "author": "", 7 | "license": "ISC", 8 | "scripts": { 9 | "test": "echo \"Error: no test specified\" && exit 1", 10 | "replkit:run-server": "npx tsx packages/replkit/index.ts dev packages/template/", 11 | "dev": "npx turbo run build && ./packages/replkit/dist/index.js -C ./packages/template dev", 12 | "replkit": "npx turbo run build && ./packages/replkit/dist/index.js -C ./packages/template", 13 | "publish:replkit": "npx turbo run build && cd packages/replkit && pnpm publish", 14 | "lint": "npx turbo run lint", 15 | "type:check": "npx turbo run type:check" 16 | }, 17 | "devDependencies": { 18 | "turbo": "^1.10.12" 19 | }, 20 | "dependencies": { 21 | "@types/react": "^18.2.31", 22 | "@types/react-dom": "^18.2.14", 23 | "prettier": "^3.0.2" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /packages/template/.replit: -------------------------------------------------------------------------------- 1 | run = "replkit dev" 2 | entrypoint = "src/tool/main.tsx" 3 | 4 | hidden = [".config", ".git", ".gitignore", "tsconfig.json"] 5 | modules = ["nodejs-18:v11-20230920-bd784b9"] 6 | 7 | [nix] 8 | channel = "stable-21_11" 9 | 10 | [env] 11 | PATH = "/home/runner/$REPL_SLUG/.config/npm/node_global/bin:/home/runner/$REPL_SLUG/node_modules/.bin" 12 | XDG_CONFIG_HOME = "/home/runner/.config" 13 | npm_config_prefix = "/home/runner/$REPL_SLUG/.config/npm/node_global" 14 | 15 | [gitHubImport] 16 | requiredFiles = [".replit", "replit.nix", ".config"] 17 | 18 | [packager] 19 | language = "nodejs" 20 | 21 | [packager.features] 22 | packageSearch = true 23 | guessImports = true 24 | enabledForHosting = false 25 | 26 | [languages.javascript] 27 | pattern = "**/{*.js,*.jsx,*.ts,*.tsx}" 28 | 29 | [languages.javascript.languageServer] 30 | start = "typescript-language-server --stdio" 31 | 32 | [extension] 33 | isExtension = true 34 | buildCommand = "replkit build" 35 | outputDirectory = "./dist" 36 | staticDirectory = "./public" 37 | -------------------------------------------------------------------------------- /packages/replkit/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@replit/replkit", 3 | "version": "0.0.7", 4 | "description": "A framework for building replit extensions", 5 | "main": "", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "build": "esbuild src/index.ts --bundle --outfile=dist/index.js --platform=node --external:lightningcss --external:vite", 9 | "clean": "rm -rf dist", 10 | "lint": "npx prettier --write src/*", 11 | "type:check": "tsc --noEmit" 12 | }, 13 | "bin": { 14 | "replkit": "./dist/index.js" 15 | }, 16 | "files": [ 17 | "dist/*" 18 | ], 19 | "keywords": [ 20 | "replit", 21 | "extensions", 22 | "dev-server" 23 | ], 24 | "author": "lunaroyster", 25 | "dependencies": { 26 | "@types/connect": "^3.4.35", 27 | "@types/cors": "^2.8.13", 28 | "@types/etag": "^1.8.1", 29 | "@types/node": "^18.0.6", 30 | "cac": "^6.7.14", 31 | "chokidar": "^3.5.3", 32 | "connect": "^3.7.0", 33 | "connect-history-api-fallback": "^2.0.0", 34 | "cors": "^2.8.5", 35 | "etag": "^1.8.1", 36 | "events": "^3.3.0", 37 | "json5": "^2.2.3", 38 | "launch-editor-middleware": "^2.6.0", 39 | "magic-string": "^0.30.2", 40 | "node-fetch": "^3.2.6", 41 | "picocolors": "^1.0.0", 42 | "picomatch": "^2.3.1", 43 | "react": "^18.2.0", 44 | "react-dom": "^18.2.0", 45 | "rollup": "^3.28.0", 46 | "tsx": "^3.12.7", 47 | "url": "^0.11.1", 48 | "vite": "^4.4.9" 49 | }, 50 | "devDependencies": { 51 | "esbuild": "^0.19.2" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /packages/replkit/src/send.ts: -------------------------------------------------------------------------------- 1 | import type { 2 | IncomingMessage, 3 | OutgoingHttpHeaders, 4 | ServerResponse, 5 | } from "node:http"; 6 | import getEtag from "etag"; 7 | import type { SourceMap } from "rollup"; 8 | import { getCodeWithSourcemap } from "./sourcemap"; 9 | 10 | const alias: Record = { 11 | js: "application/javascript", 12 | css: "text/css", 13 | html: "text/html", 14 | json: "application/json", 15 | }; 16 | 17 | export interface SendOptions { 18 | etag?: string; 19 | cacheControl?: string; 20 | headers?: OutgoingHttpHeaders; 21 | map?: SourceMap | null; 22 | } 23 | 24 | export function send( 25 | req: IncomingMessage, 26 | res: ServerResponse, 27 | content: string | Buffer, 28 | type: string, 29 | options: SendOptions, 30 | ): void { 31 | const { 32 | etag = getEtag(content, { weak: true }), 33 | cacheControl = "no-cache", 34 | headers, 35 | map, 36 | } = options; 37 | 38 | if (res.writableEnded) { 39 | return; 40 | } 41 | 42 | if (req.headers["if-none-match"] === etag) { 43 | res.statusCode = 304; 44 | res.end(); 45 | return; 46 | } 47 | 48 | res.setHeader("Content-Type", alias[type] || type); 49 | res.setHeader("Cache-Control", cacheControl); 50 | res.setHeader("Etag", etag); 51 | 52 | if (headers) { 53 | for (const name in headers) { 54 | res.setHeader(name, headers[name]!); 55 | } 56 | } 57 | 58 | // inject source map reference 59 | if (map && map.mappings) { 60 | if (type === "js" || type === "css") { 61 | content = getCodeWithSourcemap(type, content.toString(), map); 62 | } 63 | } 64 | 65 | res.statusCode = 200; 66 | res.end(content); 67 | return; 68 | } 69 | -------------------------------------------------------------------------------- /packages/replkit/src/htmlFallbackMiddleware.ts: -------------------------------------------------------------------------------- 1 | import fs from "node:fs"; 2 | import path from "node:path"; 3 | import history from "connect-history-api-fallback"; 4 | import type { NextHandleFunction } from "connect"; 5 | import { parse as urlParse } from "url"; 6 | 7 | function fileExists(path: string) { 8 | return fs.existsSync(path) && fs.statSync(path).isFile(); 9 | } 10 | 11 | function dirExists(path: string) { 12 | return fs.existsSync(path) && fs.statSync(path).isDirectory(); 13 | } 14 | 15 | export function trailingSlashMiddleware(root: string, publicDir: string) { 16 | return function trailingSlashDirectoryRedirectMiddleware(req, res, next) { 17 | const url = urlParse(req.url); 18 | const fsPath = path.join(root, url.pathname!); 19 | console.log({ pathname: url.pathname }); 20 | if (dirExists(fsPath) && !url.pathname!.endsWith("/")) { 21 | // Redirect to the same URL but with trailing slash 22 | const newLocation = url.pathname + '/' + (url.search ?? "") + (url.hash ?? "") 23 | res.writeHead(302, { Location: newLocation }); 24 | res.end(); 25 | 26 | return; 27 | } 28 | 29 | next(); 30 | }; 31 | } 32 | 33 | export function htmlFallbackMiddleware( 34 | root: string, 35 | publicDir: string, 36 | spaFallback: boolean, 37 | ): NextHandleFunction { 38 | const historyHtmlFallbackMiddleware = history({ 39 | // support /dir/ without explicit index.html 40 | rewrites: [ 41 | { 42 | // from: /^(?!.*\.html$).*/, // this is any path that doesn't end with .html 43 | from: /.*/, // all paths 44 | to({ parsedUrl, request }: any) { 45 | // 1. if the requested path exists in public and it is a file, return that 46 | const publicPath = path.join(publicDir, parsedUrl.pathname); 47 | if (fileExists(publicPath)) { 48 | return parsedUrl.pathname; 49 | } 50 | 51 | // 2. if it exists in root and is a file, return that 52 | const fsPath = path.join(root, parsedUrl.pathname); 53 | if (fileExists(fsPath)) { 54 | return parsedUrl.pathname; 55 | } 56 | 57 | // 3. if it exists in root, and is a folder, try returning it + /index.html 58 | if (dirExists(fsPath)) { 59 | // console.log(request) 60 | const indexFileUrl = path.join(parsedUrl.pathname, "index.html"); 61 | // console.log({ indexFileUrl, file: path.join(root, indexFileUrl) }); 62 | if (fileExists(path.join(root, indexFileUrl))) { 63 | return indexFileUrl; 64 | } 65 | } 66 | 67 | // idk, return the same URL, kick it down to the 404 middleware 68 | return request.url; 69 | }, 70 | }, 71 | ], 72 | }); 73 | 74 | // Keep the named function. The name is visible in debug logs via `DEBUG=connect:dispatcher ...` 75 | return function viteHtmlFallbackMiddleware(req, res, next) { 76 | return historyHtmlFallbackMiddleware(req, res, next); 77 | }; 78 | } 79 | -------------------------------------------------------------------------------- /packages/replkit/src/sourcemap.ts: -------------------------------------------------------------------------------- 1 | import path from "node:path"; 2 | import fsp from "node:fs/promises"; 3 | import type { ExistingRawSourceMap, SourceMap } from "rollup"; 4 | 5 | // Virtual modules should be prefixed with a null byte to avoid a 6 | // false positive "missing source" warning. We also check for certain 7 | // prefixes used for special handling in esbuildDepPlugin. 8 | const virtualSourceRE = /^(?:dep:|browser-external:|virtual:)|\0/; 9 | 10 | interface SourceMapLike { 11 | sources: string[]; 12 | sourcesContent?: (string | null)[]; 13 | sourceRoot?: string; 14 | } 15 | 16 | export async function injectSourcesContent( 17 | map: SourceMapLike, 18 | file: string, 19 | ): Promise { 20 | let sourceRoot: string | undefined; 21 | try { 22 | // The source root is undefined for virtual modules and permission errors. 23 | sourceRoot = await fsp.realpath( 24 | path.resolve(path.dirname(file), map.sourceRoot || ""), 25 | ); 26 | } catch {} 27 | 28 | const missingSources: string[] = []; 29 | const sourcesContent = map.sourcesContent || []; 30 | await Promise.all( 31 | map.sources.map(async (sourcePath, index) => { 32 | let content = null; 33 | if (sourcePath && !virtualSourceRE.test(sourcePath)) { 34 | sourcePath = decodeURI(sourcePath); 35 | if (sourceRoot) { 36 | sourcePath = path.resolve(sourceRoot, sourcePath); 37 | } 38 | // inject content from source file when sourcesContent is null 39 | content = 40 | sourcesContent[index] ?? 41 | (await fsp.readFile(sourcePath, "utf-8").catch(() => { 42 | missingSources.push(sourcePath); 43 | return null; 44 | })); 45 | } 46 | sourcesContent[index] = content; 47 | }), 48 | ); 49 | 50 | map.sourcesContent = sourcesContent; 51 | 52 | // Use this command… 53 | // DEBUG="vite:sourcemap" vite build 54 | // …to log the missing sources. 55 | if (missingSources.length) { 56 | console.log(`Sourcemap for "${file}" points to missing source files`); 57 | // debug?.(`Missing sources:\n ` + missingSources.join(`\n `)); 58 | } 59 | } 60 | 61 | export function genSourceMapUrl(map: SourceMap | string): string { 62 | if (typeof map !== "string") { 63 | map = JSON.stringify(map); 64 | } 65 | return `data:application/json;base64,${Buffer.from(map).toString("base64")}`; 66 | } 67 | 68 | export function getCodeWithSourcemap( 69 | type: "js" | "css", 70 | code: string, 71 | map: SourceMap, 72 | ): string { 73 | // if (debug) { 74 | // code += `\n/*${JSON.stringify(map, null, 2).replace(/\*\//g, "*\\/")}*/\n`; 75 | // } 76 | 77 | if (type === "js") { 78 | code += `\n//# sourceMappingURL=${genSourceMapUrl(map)}`; 79 | } else if (type === "css") { 80 | code += `\n/*# sourceMappingURL=${genSourceMapUrl(map)} */`; 81 | } 82 | 83 | return code; 84 | } 85 | 86 | export function applySourcemapIgnoreList( 87 | map: ExistingRawSourceMap, 88 | sourcemapPath: string, 89 | sourcemapIgnoreList: (sourcePath: string, sourcemapPath: string) => boolean, 90 | ): void { 91 | let { x_google_ignoreList } = map; 92 | if (x_google_ignoreList === undefined) { 93 | x_google_ignoreList = []; 94 | } 95 | for ( 96 | let sourcesIndex = 0; 97 | sourcesIndex < map.sources.length; 98 | ++sourcesIndex 99 | ) { 100 | const sourcePath = map.sources[sourcesIndex]; 101 | if (!sourcePath) continue; 102 | 103 | const ignoreList = sourcemapIgnoreList( 104 | path.isAbsolute(sourcePath) 105 | ? sourcePath 106 | : path.resolve(path.dirname(sourcemapPath), sourcePath), 107 | sourcemapPath, 108 | ); 109 | 110 | if (ignoreList && !x_google_ignoreList.includes(sourcesIndex)) { 111 | x_google_ignoreList.push(sourcesIndex); 112 | } 113 | } 114 | 115 | if (x_google_ignoreList.length > 0) { 116 | if (!map.x_google_ignoreList) map.x_google_ignoreList = x_google_ignoreList; 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /packages/replkit/src/indexHtmlMiddleware.ts: -------------------------------------------------------------------------------- 1 | import fs from "node:fs"; 2 | import fsp from "node:fs/promises"; 3 | import path from "node:path"; 4 | import { ViteDevServer, SendOptions, Connect } from "vite"; 5 | import os from "node:os"; 6 | import { IncomingMessage, ServerResponse } from "node:http"; 7 | import getEtag from "etag"; 8 | // import type { IndexHtmlTransformHook } from '../../plugins/html' 9 | // import { 10 | // addToHTMLProxyCache, 11 | // applyHtmlTransforms, 12 | // assetAttrsConfig, 13 | // getAttrKey, 14 | // getScriptInfo, 15 | // htmlEnvHook, 16 | // nodeIsElement, 17 | // overwriteAttrValue, 18 | // postImportMapHook, 19 | // preImportMapHook, 20 | // resolveHtmlTransforms, 21 | // traverseHtml, 22 | // } from '../../plugins/html' 23 | // import type { ResolvedConfig, ViteDevServer } from '../..' 24 | // import { send } from '../send' 25 | // import { CLIENT_PUBLIC_PATH, FS_PREFIX } from '../../constants' 26 | // import { 27 | // ensureWatchedFile, 28 | // fsPathFromId, 29 | // injectQuery, 30 | // isJSRequest, 31 | // joinUrlSegments, 32 | // normalizePath, 33 | // processSrcSetSync, 34 | // stripBase, 35 | // unwrapId, 36 | // wrapId, 37 | // } from '../../utils' 38 | // import { ERR_CLOSED_SERVER } from '../pluginContainer' 39 | // import { ERR_OUTDATED_OPTIMIZED_DEP } from '../../plugins/optimizedDeps' 40 | // import { isCSSRequest } from '../../plugins/css' 41 | // import { checkPublicFile } from '../../plugins/asset' 42 | // import { getCodeWithSourcemap, injectSourcesContent } from '../sourcemap' 43 | 44 | interface AssetNode { 45 | start: number; 46 | end: number; 47 | code: string; 48 | } 49 | 50 | const postfixRE = /[?#].*$/s; 51 | export function cleanUrl(url: string): string { 52 | return url.replace(postfixRE, ""); 53 | } 54 | 55 | export const FS_PREFIX = `/@fs/`; 56 | const VOLUME_RE = /^[A-Z]:/i; 57 | 58 | export function normalizePath(id: string): string { 59 | const isWindows = os.platform() === "win32"; 60 | function slash(p: string): string { 61 | const windowsSlashRE = /\\/g; 62 | return p.replace(windowsSlashRE, "/"); 63 | } 64 | 65 | return path.posix.normalize(isWindows ? slash(id) : id); 66 | } 67 | 68 | export function fsPathFromId(id: string): string { 69 | const fsPath = normalizePath( 70 | id.startsWith(FS_PREFIX) ? id.slice(FS_PREFIX.length) : id, 71 | ); 72 | return fsPath[0] === "/" || fsPath.match(VOLUME_RE) ? fsPath : `/${fsPath}`; 73 | } 74 | 75 | function getHtmlFilename(url: string, server: ViteDevServer) { 76 | if (url.startsWith(FS_PREFIX)) { 77 | return decodeURIComponent(fsPathFromId(url)); 78 | } else { 79 | return decodeURIComponent( 80 | normalizePath(path.join(server.config.root, url.slice(1))), 81 | ); 82 | } 83 | } 84 | 85 | export function indexHtmlMiddleware( 86 | server: ViteDevServer, 87 | ): Connect.NextHandleFunction { 88 | // Keep the named function. The name is visible in debug logs via `DEBUG=connect:dispatcher ...` 89 | return async function viteIndexHtmlMiddleware(req, res, next) { 90 | if (res.writableEnded) { 91 | return next(); 92 | } 93 | 94 | const url = req.url && cleanUrl(req.url); 95 | // htmlFallbackMiddleware appends '.html' to URLs 96 | if (url?.endsWith(".html") && req.headers["sec-fetch-dest"] !== "script") { 97 | const filename = getHtmlFilename(url, server); 98 | if (fs.existsSync(filename)) { 99 | try { 100 | let html = await fsp.readFile(filename, "utf-8"); 101 | html = await server.transformIndexHtml(url, html, req.originalUrl); 102 | return send(req, res, html, "html", { 103 | headers: server.config.server.headers, 104 | }); 105 | } catch (e) { 106 | return next(e); 107 | } 108 | } 109 | } 110 | next(); 111 | }; 112 | } 113 | 114 | const alias: Record = { 115 | js: "application/javascript", 116 | css: "text/css", 117 | html: "text/html", 118 | json: "application/json", 119 | }; 120 | 121 | export function send( 122 | req: IncomingMessage, 123 | res: ServerResponse, 124 | content: string | Buffer, 125 | type: string, 126 | options: SendOptions, 127 | ): void { 128 | const { 129 | etag = getEtag(content, { weak: true }), 130 | cacheControl = "no-cache", 131 | headers, 132 | map, 133 | } = options; 134 | 135 | if (res.writableEnded) { 136 | return; 137 | } 138 | 139 | if (req.headers["if-none-match"] === etag) { 140 | res.statusCode = 304; 141 | res.end(); 142 | return; 143 | } 144 | 145 | res.setHeader("Content-Type", alias[type] || type); 146 | res.setHeader("Cache-Control", cacheControl); 147 | res.setHeader("Etag", etag); 148 | 149 | if (headers) { 150 | for (const name in headers) { 151 | res.setHeader(name, headers[name]!); 152 | } 153 | } 154 | 155 | // TODO: inject source map reference 156 | // if (map && map.mappings) { 157 | // if (type === 'js' || type === 'css') { 158 | // content = getCodeWithSourcemap(type, content.toString(), map) 159 | // } 160 | // } 161 | 162 | res.statusCode = 200; 163 | res.end(content); 164 | return; 165 | } 166 | -------------------------------------------------------------------------------- /packages/replkit/src/scaffold.ts: -------------------------------------------------------------------------------- 1 | import fsp from "fs/promises"; 2 | import path from "path"; 3 | import json5 from "json5"; 4 | 5 | export async function scaffoldTool({ root, toolName, extensionJsonPath }) { 6 | const code = { 7 | indexHtml: (name: string) => ` 8 | 9 | 10 | 11 | 12 | 13 | Extension Tool—${name} 14 | 15 | 16 |
17 | 18 | 19 | 20 | `, 21 | mainTsx: (name: string) => `import * as React from 'react'; 22 | import { renderExtension } from '@replit/extensions-react'; 23 | 24 | function Component() { 25 | return ( 26 |
27 | Example tool: ${name} 28 |
29 | ) 30 | } 31 | 32 | renderExtension(document.getElementById('root') as Element, 33 | 34 | )`, 35 | }; 36 | 37 | const toolFolder = path.join(root, toolName); 38 | await fsp.mkdir(toolFolder); 39 | await fsp.writeFile( 40 | path.join(toolFolder, "index.html"), 41 | code.indexHtml(toolName), 42 | { encoding: "utf-8" }, 43 | ); 44 | await fsp.writeFile( 45 | path.join(toolFolder, "main.tsx"), 46 | code.mainTsx(toolName), 47 | { encoding: "utf-8" }, 48 | ); 49 | const extensionJsonString = await fsp.readFile(extensionJsonPath, { 50 | encoding: "utf-8", 51 | }); 52 | const manifest = json5.parse(extensionJsonString); 53 | const newManifest = { 54 | ...manifest, 55 | tools: [ 56 | ...(manifest.tools ?? []), 57 | { 58 | name: toolName, 59 | handler: `/${toolName}`, 60 | icon: "/replit.svg", 61 | }, 62 | ], 63 | }; 64 | await fsp.writeFile( 65 | extensionJsonPath, 66 | JSON.stringify(newManifest, undefined, 2), 67 | "utf-8", 68 | ); 69 | } 70 | 71 | export async function scaffoldFileHandler({ 72 | root, 73 | fileHandlerName, 74 | fileHandlerGlob, 75 | extensionJsonPath, 76 | }) { 77 | const code = { 78 | indexHtml: (name: string) => ` 79 | 80 | 81 | 82 | 83 | 84 | Extension Tool—${name} 85 | 86 | 87 |
88 | 89 | 90 | 91 | `, 92 | mainTsx: (name: string) => `import * as React from 'react'; 93 | import { renderExtension } from '@replit/extensions-react'; 94 | 95 | function Component() { 96 | return ( 97 |
98 | Example tool: ${name} 99 |
100 | ) 101 | } 102 | 103 | renderExtension(document.getElementById('root') as Element, 104 | 105 | )`, 106 | }; 107 | 108 | const fileHandlerFolder = path.join(root, fileHandlerName); 109 | await fsp.mkdir(fileHandlerFolder); 110 | await fsp.writeFile( 111 | path.join(fileHandlerFolder, "index.html"), 112 | code.indexHtml(fileHandlerName), 113 | { encoding: "utf-8" }, 114 | ); 115 | await fsp.writeFile( 116 | path.join(fileHandlerFolder, "main.tsx"), 117 | code.mainTsx(fileHandlerName), 118 | { encoding: "utf-8" }, 119 | ); 120 | const extensionJsonString = await fsp.readFile(extensionJsonPath, { 121 | encoding: "utf-8", 122 | }); 123 | const manifest = json5.parse(extensionJsonString); 124 | const newManifest = { 125 | ...manifest, 126 | fileHandlers: [ 127 | ...(manifest.fileHandlers ?? []), 128 | { 129 | name: fileHandlerName, 130 | handler: `/${fileHandlerName}`, 131 | glob: fileHandlerGlob, 132 | icon: "/replit.svg", 133 | }, 134 | ], 135 | }; 136 | await fsp.writeFile( 137 | extensionJsonPath, 138 | JSON.stringify(newManifest, undefined, 2), 139 | "utf-8", 140 | ); 141 | } 142 | 143 | export async function scaffoldBackground({ root, extensionJsonPath }) { 144 | const code = { 145 | indexHtml: () => ` 146 | 147 | 148 | 149 | 150 | 151 | Extension Background page 152 | 153 | 154 |
155 | 156 | 157 | 158 | `, 159 | mainTsx: () => ` 160 | import * as replit from '@replit/extensions'; 161 | 162 | async function main() { 163 | await replit.init(); 164 | 165 | await replit.messages.showConfirm('Hello World'); 166 | } 167 | 168 | main() 169 | `, 170 | }; 171 | 172 | const extensionJsonString = await fsp.readFile(extensionJsonPath, { 173 | encoding: "utf-8", 174 | }); 175 | const manifest = json5.parse(extensionJsonString); 176 | 177 | if (manifest.background?.page) { 178 | throw new Error("Extension already has a background page"); 179 | } 180 | 181 | const backgroundFolder = path.join(root, "background"); 182 | await fsp.mkdir(backgroundFolder); 183 | await fsp.writeFile( 184 | path.join(backgroundFolder, "index.html"), 185 | code.indexHtml(), 186 | { encoding: "utf-8" }, 187 | ); 188 | await fsp.writeFile(path.join(backgroundFolder, "main.tsx"), code.mainTsx(), { 189 | encoding: "utf-8", 190 | }); 191 | 192 | const newManifest = { 193 | ...manifest, 194 | background: { 195 | page: "/background", 196 | }, 197 | }; 198 | await fsp.writeFile( 199 | extensionJsonPath, 200 | JSON.stringify(newManifest, undefined, 2), 201 | "utf-8", 202 | ); 203 | } 204 | -------------------------------------------------------------------------------- /packages/replkit/src/index.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import { fileURLToPath, parse as urlParse } from "url"; 3 | import { createServer, InlineConfig, build } from "vite"; 4 | import { 5 | htmlFallbackMiddleware, 6 | trailingSlashMiddleware, 7 | } from "./htmlFallbackMiddleware"; 8 | import { indexHtmlMiddleware } from "./indexHtmlMiddleware"; 9 | import fs from "fs"; 10 | import fsp from "fs/promises"; 11 | import cac from "cac"; 12 | import path from "path"; 13 | import readline from "readline"; 14 | import json5 from "json5"; 15 | import { 16 | scaffoldTool, 17 | scaffoldFileHandler, 18 | scaffoldBackground, 19 | } from "./scaffold"; 20 | import { installReplkit } from "./upgrade"; 21 | 22 | function resolvePath(userPath) { 23 | return path.resolve(process.cwd(), userPath); 24 | } 25 | const cli = cac("replkit"); 26 | 27 | async function getPages( 28 | directoryPath: string, 29 | ): Promise> { 30 | const pages: Array<{ name: string; path: string }> = []; 31 | const files = await fsp.readdir(directoryPath); 32 | 33 | for (const file of files) { 34 | const isDirectory = ( 35 | await fsp.stat(path.join(directoryPath, file)) 36 | ).isDirectory(); 37 | 38 | if (!isDirectory) { 39 | continue; 40 | } 41 | 42 | const indexHtmlPath = path.join(directoryPath, file, "index.html"); 43 | const containsIndexHtml = (await fsp.stat(indexHtmlPath)).isFile(); 44 | 45 | if (!containsIndexHtml) { 46 | continue; 47 | } 48 | 49 | pages.push({ name: file, path: indexHtmlPath }); 50 | } 51 | 52 | return pages; 53 | } 54 | 55 | function resolveHomeDirectory(homeDir?: string) { 56 | return homeDir ? resolvePath(homeDir) : process.cwd(); 57 | } 58 | 59 | async function getConfiguration(homeDir?: string) { 60 | const homeDirectory = resolveHomeDirectory(homeDir); 61 | const root = path.join(homeDirectory, "src"); 62 | const publicDir = homeDirectory + "/public"; 63 | const outDir = `${homeDirectory}/dist`; 64 | const pages = await getPages(root); 65 | const config: InlineConfig = { 66 | root, 67 | publicDir, 68 | appType: "custom", 69 | server: { 70 | host: "0.0.0.0", 71 | port: 8080, 72 | watch: {}, 73 | // strictPort: true, 74 | }, 75 | preview: { 76 | host: "0.0.0.0", 77 | port: 8080, 78 | }, 79 | build: { 80 | outDir, 81 | emptyOutDir: true, 82 | rollupOptions: { 83 | input: pages.reduce( 84 | (acc, val) => ({ ...acc, [val.name]: val.path }), 85 | {}, 86 | ), 87 | }, 88 | }, 89 | logLevel: "info", 90 | }; 91 | 92 | const extensionJsonPath = `${homeDirectory}/extension.json`; 93 | 94 | return { 95 | homeDirectory, 96 | root, 97 | publicDir, 98 | outDir, 99 | config, 100 | extensionJsonPath, 101 | }; 102 | } 103 | 104 | cli.option( 105 | "-C, --home-dir ", 106 | "The extension's home directory. Assumes the current directory if not provided", 107 | { default: process.cwd() }, 108 | ); 109 | 110 | cli.command("dev", "Run the replkit dev server").action(async (options) => { 111 | const { config, homeDirectory, publicDir, root, extensionJsonPath } = 112 | await getConfiguration(options.homeDir); 113 | 114 | console.log(`Running in ${homeDirectory}`); 115 | 116 | const server = await createServer(config); 117 | 118 | // serve extension.json using config file 119 | server.middlewares.use("/extension.json", (req, res) => { 120 | const content = fs.readFileSync(extensionJsonPath, "utf-8"); 121 | res.writeHead(200, { "Content-Type": "application/json" }); 122 | res.end(content); 123 | }); 124 | 125 | // If a /directory is requested, redirect to /directory/ (with the trailing slash) to preserve web behavior 126 | server.middlewares.use(trailingSlashMiddleware(root, publicDir)); 127 | 128 | // If requested file doesn't exist, fall back to index.html 129 | server.middlewares.use(htmlFallbackMiddleware(root, publicDir, false)); 130 | 131 | // Process and serve index.html 132 | server.middlewares.use(indexHtmlMiddleware(server)); 133 | 134 | // Return 404 if not found 135 | server.middlewares.use(function vite404Middleware(_, res) { 136 | res.statusCode = 404; 137 | res.end(); 138 | }); 139 | 140 | console.log("Starting server..."); 141 | await server.listen(); 142 | console.log( 143 | `Replit extension dev server is active. Visit Extension Devtools and click on 'Load Locally'`, 144 | ); 145 | 146 | fs.watchFile( 147 | extensionJsonPath, 148 | { persistent: true, interval: 1000 }, 149 | (eventType, filename) => { 150 | // The  is the Replit prompt symbol 151 | console.log( 152 | " extension.json changed, you may need to reload your extension to see changes", 153 | ); 154 | }, 155 | ); 156 | }); 157 | 158 | cli.command("build", "Build extension").action(async (options) => { 159 | const { config, homeDirectory, publicDir, root, extensionJsonPath, outDir } = 160 | await getConfiguration(options.homeDir); 161 | const output = await build(config); 162 | // TODO: figure out if there's a more idiomatic way to do this with vite / rollup 163 | fs.copyFileSync(extensionJsonPath, `${outDir}/extension.json`); 164 | }); 165 | 166 | const cyan = (str: string) => `\x1b[36m${str}\x1b[0m`; 167 | 168 | cli 169 | .command( 170 | "add ", 171 | `Add a feature to your extension. ${cyan("")} can be one of ${cyan( 172 | "tool", 173 | )}, ${cyan("file-handler")}, ${cyan("background")}`, 174 | ) 175 | .usage( 176 | `add ${cyan("")}\tAdd a feature to your extension. ${cyan( 177 | "", 178 | )} can be one of ${cyan("tool")}, ${cyan("file-handler")}, ${cyan( 179 | "background", 180 | )}`, 181 | ) 182 | .action(async (feature, options) => { 183 | const { 184 | config, 185 | homeDirectory, 186 | publicDir, 187 | root, 188 | extensionJsonPath, 189 | outDir, 190 | } = await getConfiguration(options.homeDir); 191 | 192 | const rl = readline.createInterface({ 193 | input: process.stdin, 194 | output: process.stdout, 195 | }); 196 | 197 | const questionAsync = (prompt) => { 198 | return new Promise((resolve) => { 199 | rl.question(prompt, resolve); 200 | }); 201 | }; 202 | 203 | if (feature === "tool") { 204 | const toolName = (await questionAsync( 205 | "What is this tool called?\n", 206 | )) as string; 207 | await scaffoldTool({ root, toolName, extensionJsonPath }); 208 | } else if (feature === "file-handler") { 209 | const fileHandlerName = (await questionAsync( 210 | "What is this file-handler called?\n", 211 | )) as string; 212 | const fileHandlerGlob = (await questionAsync( 213 | "What files does this file-handler open?\n", 214 | )) as string; 215 | 216 | await scaffoldFileHandler({ 217 | root, 218 | fileHandlerName, 219 | fileHandlerGlob, 220 | extensionJsonPath, 221 | }); 222 | } else if (feature === "background") { 223 | await scaffoldBackground({ root, extensionJsonPath }); 224 | } else { 225 | console.log(`Unknown feature: ${feature}`); 226 | cli.outputHelp(); 227 | } 228 | 229 | rl.close(); 230 | }); 231 | 232 | cli 233 | .command("upgrade", "Upgrade replkit to the latest version") 234 | .action(async (options) => { 235 | const { homeDirectory } = await getConfiguration(options.homeDir); 236 | 237 | await installReplkit({ 238 | homeDirectory, 239 | version: "latest", 240 | }); 241 | }); 242 | 243 | cli.help(); 244 | 245 | async function main() { 246 | try { 247 | const res = await cli.parse(); 248 | 249 | // if you run the CLI without any args 250 | if (cli.rawArgs.length === 2) { 251 | cli.outputHelp(); 252 | } 253 | } catch (e) { 254 | console.log(`Error: ${e.message}`); 255 | cli.outputHelp(); 256 | } 257 | } 258 | 259 | main(); 260 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | importers: 4 | 5 | .: 6 | dependencies: 7 | '@types/react': 8 | specifier: ^18.2.31 9 | version: 18.2.31 10 | '@types/react-dom': 11 | specifier: ^18.2.14 12 | version: 18.2.14 13 | prettier: 14 | specifier: ^3.0.2 15 | version: 3.0.2 16 | devDependencies: 17 | turbo: 18 | specifier: ^1.10.12 19 | version: 1.10.12 20 | 21 | packages/replkit: 22 | dependencies: 23 | '@types/connect': 24 | specifier: ^3.4.35 25 | version: 3.4.35 26 | '@types/cors': 27 | specifier: ^2.8.13 28 | version: 2.8.13 29 | '@types/etag': 30 | specifier: ^1.8.1 31 | version: 1.8.1 32 | '@types/node': 33 | specifier: ^18.0.6 34 | version: 18.0.6 35 | cac: 36 | specifier: ^6.7.14 37 | version: 6.7.14 38 | chokidar: 39 | specifier: ^3.5.3 40 | version: 3.5.3 41 | connect: 42 | specifier: ^3.7.0 43 | version: 3.7.0 44 | connect-history-api-fallback: 45 | specifier: ^2.0.0 46 | version: 2.0.0 47 | cors: 48 | specifier: ^2.8.5 49 | version: 2.8.5 50 | etag: 51 | specifier: ^1.8.1 52 | version: 1.8.1 53 | events: 54 | specifier: ^3.3.0 55 | version: 3.3.0 56 | json5: 57 | specifier: ^2.2.3 58 | version: 2.2.3 59 | launch-editor-middleware: 60 | specifier: ^2.6.0 61 | version: 2.6.0 62 | magic-string: 63 | specifier: ^0.30.2 64 | version: 0.30.2 65 | node-fetch: 66 | specifier: ^3.2.6 67 | version: 3.2.6 68 | picocolors: 69 | specifier: ^1.0.0 70 | version: 1.0.0 71 | picomatch: 72 | specifier: ^2.3.1 73 | version: 2.3.1 74 | react: 75 | specifier: ^18.2.0 76 | version: 18.2.0 77 | react-dom: 78 | specifier: ^18.2.0 79 | version: 18.2.0(react@18.2.0) 80 | rollup: 81 | specifier: ^3.28.0 82 | version: 3.28.0 83 | tsx: 84 | specifier: ^3.12.7 85 | version: 3.12.7 86 | url: 87 | specifier: ^0.11.1 88 | version: 0.11.1 89 | vite: 90 | specifier: ^4.4.9 91 | version: 4.4.9(@types/node@18.0.6) 92 | devDependencies: 93 | esbuild: 94 | specifier: ^0.19.2 95 | version: 0.19.2 96 | 97 | packages/template: 98 | dependencies: 99 | '@replit/extensions': 100 | specifier: ^1.10.0 101 | version: 1.10.0 102 | '@replit/extensions-react': 103 | specifier: ^0.6.0 104 | version: 0.6.0(@replit/extensions@1.10.0)(react@18.2.0) 105 | '@replit/replkit': 106 | specifier: ^0.0.5 107 | version: 0.0.5 108 | react: 109 | specifier: ^18.2.0 110 | version: 18.2.0 111 | react-dom: 112 | specifier: ^18.2.0 113 | version: 18.2.0(react@18.2.0) 114 | devDependencies: 115 | '@types/react': 116 | specifier: ^18.2.31 117 | version: 18.2.31 118 | '@types/react-dom': 119 | specifier: ^18.2.14 120 | version: 18.2.14 121 | 122 | packages: 123 | 124 | /@codemirror/state@6.2.1: 125 | resolution: {integrity: sha512-RupHSZ8+OjNT38zU9fKH2sv+Dnlr8Eb8sl4NOnnqz95mCFTZUaiRP8Xv5MeeaG0px2b8Bnfe7YGwCV3nsBhbuw==} 126 | dev: false 127 | 128 | /@esbuild-kit/cjs-loader@2.4.2: 129 | resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} 130 | dependencies: 131 | '@esbuild-kit/core-utils': 3.1.0 132 | get-tsconfig: 4.7.0 133 | dev: false 134 | 135 | /@esbuild-kit/core-utils@3.1.0: 136 | resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==} 137 | dependencies: 138 | esbuild: 0.17.19 139 | source-map-support: 0.5.21 140 | dev: false 141 | 142 | /@esbuild-kit/esm-loader@2.5.5: 143 | resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} 144 | dependencies: 145 | '@esbuild-kit/core-utils': 3.1.0 146 | get-tsconfig: 4.7.0 147 | dev: false 148 | 149 | /@esbuild/android-arm64@0.17.19: 150 | resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} 151 | engines: {node: '>=12'} 152 | cpu: [arm64] 153 | os: [android] 154 | requiresBuild: true 155 | dev: false 156 | optional: true 157 | 158 | /@esbuild/android-arm64@0.18.20: 159 | resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} 160 | engines: {node: '>=12'} 161 | cpu: [arm64] 162 | os: [android] 163 | requiresBuild: true 164 | dev: false 165 | optional: true 166 | 167 | /@esbuild/android-arm64@0.19.2: 168 | resolution: {integrity: sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==} 169 | engines: {node: '>=12'} 170 | cpu: [arm64] 171 | os: [android] 172 | requiresBuild: true 173 | dev: true 174 | optional: true 175 | 176 | /@esbuild/android-arm@0.17.19: 177 | resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} 178 | engines: {node: '>=12'} 179 | cpu: [arm] 180 | os: [android] 181 | requiresBuild: true 182 | dev: false 183 | optional: true 184 | 185 | /@esbuild/android-arm@0.18.20: 186 | resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} 187 | engines: {node: '>=12'} 188 | cpu: [arm] 189 | os: [android] 190 | requiresBuild: true 191 | dev: false 192 | optional: true 193 | 194 | /@esbuild/android-arm@0.19.2: 195 | resolution: {integrity: sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==} 196 | engines: {node: '>=12'} 197 | cpu: [arm] 198 | os: [android] 199 | requiresBuild: true 200 | dev: true 201 | optional: true 202 | 203 | /@esbuild/android-x64@0.17.19: 204 | resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} 205 | engines: {node: '>=12'} 206 | cpu: [x64] 207 | os: [android] 208 | requiresBuild: true 209 | dev: false 210 | optional: true 211 | 212 | /@esbuild/android-x64@0.18.20: 213 | resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} 214 | engines: {node: '>=12'} 215 | cpu: [x64] 216 | os: [android] 217 | requiresBuild: true 218 | dev: false 219 | optional: true 220 | 221 | /@esbuild/android-x64@0.19.2: 222 | resolution: {integrity: sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==} 223 | engines: {node: '>=12'} 224 | cpu: [x64] 225 | os: [android] 226 | requiresBuild: true 227 | dev: true 228 | optional: true 229 | 230 | /@esbuild/darwin-arm64@0.17.19: 231 | resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} 232 | engines: {node: '>=12'} 233 | cpu: [arm64] 234 | os: [darwin] 235 | requiresBuild: true 236 | dev: false 237 | optional: true 238 | 239 | /@esbuild/darwin-arm64@0.18.20: 240 | resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} 241 | engines: {node: '>=12'} 242 | cpu: [arm64] 243 | os: [darwin] 244 | requiresBuild: true 245 | dev: false 246 | optional: true 247 | 248 | /@esbuild/darwin-arm64@0.19.2: 249 | resolution: {integrity: sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==} 250 | engines: {node: '>=12'} 251 | cpu: [arm64] 252 | os: [darwin] 253 | requiresBuild: true 254 | dev: true 255 | optional: true 256 | 257 | /@esbuild/darwin-x64@0.17.19: 258 | resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} 259 | engines: {node: '>=12'} 260 | cpu: [x64] 261 | os: [darwin] 262 | requiresBuild: true 263 | dev: false 264 | optional: true 265 | 266 | /@esbuild/darwin-x64@0.18.20: 267 | resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} 268 | engines: {node: '>=12'} 269 | cpu: [x64] 270 | os: [darwin] 271 | requiresBuild: true 272 | dev: false 273 | optional: true 274 | 275 | /@esbuild/darwin-x64@0.19.2: 276 | resolution: {integrity: sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==} 277 | engines: {node: '>=12'} 278 | cpu: [x64] 279 | os: [darwin] 280 | requiresBuild: true 281 | dev: true 282 | optional: true 283 | 284 | /@esbuild/freebsd-arm64@0.17.19: 285 | resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} 286 | engines: {node: '>=12'} 287 | cpu: [arm64] 288 | os: [freebsd] 289 | requiresBuild: true 290 | dev: false 291 | optional: true 292 | 293 | /@esbuild/freebsd-arm64@0.18.20: 294 | resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} 295 | engines: {node: '>=12'} 296 | cpu: [arm64] 297 | os: [freebsd] 298 | requiresBuild: true 299 | dev: false 300 | optional: true 301 | 302 | /@esbuild/freebsd-arm64@0.19.2: 303 | resolution: {integrity: sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==} 304 | engines: {node: '>=12'} 305 | cpu: [arm64] 306 | os: [freebsd] 307 | requiresBuild: true 308 | dev: true 309 | optional: true 310 | 311 | /@esbuild/freebsd-x64@0.17.19: 312 | resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} 313 | engines: {node: '>=12'} 314 | cpu: [x64] 315 | os: [freebsd] 316 | requiresBuild: true 317 | dev: false 318 | optional: true 319 | 320 | /@esbuild/freebsd-x64@0.18.20: 321 | resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} 322 | engines: {node: '>=12'} 323 | cpu: [x64] 324 | os: [freebsd] 325 | requiresBuild: true 326 | dev: false 327 | optional: true 328 | 329 | /@esbuild/freebsd-x64@0.19.2: 330 | resolution: {integrity: sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==} 331 | engines: {node: '>=12'} 332 | cpu: [x64] 333 | os: [freebsd] 334 | requiresBuild: true 335 | dev: true 336 | optional: true 337 | 338 | /@esbuild/linux-arm64@0.17.19: 339 | resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} 340 | engines: {node: '>=12'} 341 | cpu: [arm64] 342 | os: [linux] 343 | requiresBuild: true 344 | dev: false 345 | optional: true 346 | 347 | /@esbuild/linux-arm64@0.18.20: 348 | resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} 349 | engines: {node: '>=12'} 350 | cpu: [arm64] 351 | os: [linux] 352 | requiresBuild: true 353 | dev: false 354 | optional: true 355 | 356 | /@esbuild/linux-arm64@0.19.2: 357 | resolution: {integrity: sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==} 358 | engines: {node: '>=12'} 359 | cpu: [arm64] 360 | os: [linux] 361 | requiresBuild: true 362 | dev: true 363 | optional: true 364 | 365 | /@esbuild/linux-arm@0.17.19: 366 | resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} 367 | engines: {node: '>=12'} 368 | cpu: [arm] 369 | os: [linux] 370 | requiresBuild: true 371 | dev: false 372 | optional: true 373 | 374 | /@esbuild/linux-arm@0.18.20: 375 | resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} 376 | engines: {node: '>=12'} 377 | cpu: [arm] 378 | os: [linux] 379 | requiresBuild: true 380 | dev: false 381 | optional: true 382 | 383 | /@esbuild/linux-arm@0.19.2: 384 | resolution: {integrity: sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==} 385 | engines: {node: '>=12'} 386 | cpu: [arm] 387 | os: [linux] 388 | requiresBuild: true 389 | dev: true 390 | optional: true 391 | 392 | /@esbuild/linux-ia32@0.17.19: 393 | resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} 394 | engines: {node: '>=12'} 395 | cpu: [ia32] 396 | os: [linux] 397 | requiresBuild: true 398 | dev: false 399 | optional: true 400 | 401 | /@esbuild/linux-ia32@0.18.20: 402 | resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} 403 | engines: {node: '>=12'} 404 | cpu: [ia32] 405 | os: [linux] 406 | requiresBuild: true 407 | dev: false 408 | optional: true 409 | 410 | /@esbuild/linux-ia32@0.19.2: 411 | resolution: {integrity: sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==} 412 | engines: {node: '>=12'} 413 | cpu: [ia32] 414 | os: [linux] 415 | requiresBuild: true 416 | dev: true 417 | optional: true 418 | 419 | /@esbuild/linux-loong64@0.17.19: 420 | resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} 421 | engines: {node: '>=12'} 422 | cpu: [loong64] 423 | os: [linux] 424 | requiresBuild: true 425 | dev: false 426 | optional: true 427 | 428 | /@esbuild/linux-loong64@0.18.20: 429 | resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} 430 | engines: {node: '>=12'} 431 | cpu: [loong64] 432 | os: [linux] 433 | requiresBuild: true 434 | dev: false 435 | optional: true 436 | 437 | /@esbuild/linux-loong64@0.19.2: 438 | resolution: {integrity: sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==} 439 | engines: {node: '>=12'} 440 | cpu: [loong64] 441 | os: [linux] 442 | requiresBuild: true 443 | dev: true 444 | optional: true 445 | 446 | /@esbuild/linux-mips64el@0.17.19: 447 | resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} 448 | engines: {node: '>=12'} 449 | cpu: [mips64el] 450 | os: [linux] 451 | requiresBuild: true 452 | dev: false 453 | optional: true 454 | 455 | /@esbuild/linux-mips64el@0.18.20: 456 | resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} 457 | engines: {node: '>=12'} 458 | cpu: [mips64el] 459 | os: [linux] 460 | requiresBuild: true 461 | dev: false 462 | optional: true 463 | 464 | /@esbuild/linux-mips64el@0.19.2: 465 | resolution: {integrity: sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==} 466 | engines: {node: '>=12'} 467 | cpu: [mips64el] 468 | os: [linux] 469 | requiresBuild: true 470 | dev: true 471 | optional: true 472 | 473 | /@esbuild/linux-ppc64@0.17.19: 474 | resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} 475 | engines: {node: '>=12'} 476 | cpu: [ppc64] 477 | os: [linux] 478 | requiresBuild: true 479 | dev: false 480 | optional: true 481 | 482 | /@esbuild/linux-ppc64@0.18.20: 483 | resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} 484 | engines: {node: '>=12'} 485 | cpu: [ppc64] 486 | os: [linux] 487 | requiresBuild: true 488 | dev: false 489 | optional: true 490 | 491 | /@esbuild/linux-ppc64@0.19.2: 492 | resolution: {integrity: sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==} 493 | engines: {node: '>=12'} 494 | cpu: [ppc64] 495 | os: [linux] 496 | requiresBuild: true 497 | dev: true 498 | optional: true 499 | 500 | /@esbuild/linux-riscv64@0.17.19: 501 | resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} 502 | engines: {node: '>=12'} 503 | cpu: [riscv64] 504 | os: [linux] 505 | requiresBuild: true 506 | dev: false 507 | optional: true 508 | 509 | /@esbuild/linux-riscv64@0.18.20: 510 | resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} 511 | engines: {node: '>=12'} 512 | cpu: [riscv64] 513 | os: [linux] 514 | requiresBuild: true 515 | dev: false 516 | optional: true 517 | 518 | /@esbuild/linux-riscv64@0.19.2: 519 | resolution: {integrity: sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==} 520 | engines: {node: '>=12'} 521 | cpu: [riscv64] 522 | os: [linux] 523 | requiresBuild: true 524 | dev: true 525 | optional: true 526 | 527 | /@esbuild/linux-s390x@0.17.19: 528 | resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} 529 | engines: {node: '>=12'} 530 | cpu: [s390x] 531 | os: [linux] 532 | requiresBuild: true 533 | dev: false 534 | optional: true 535 | 536 | /@esbuild/linux-s390x@0.18.20: 537 | resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} 538 | engines: {node: '>=12'} 539 | cpu: [s390x] 540 | os: [linux] 541 | requiresBuild: true 542 | dev: false 543 | optional: true 544 | 545 | /@esbuild/linux-s390x@0.19.2: 546 | resolution: {integrity: sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==} 547 | engines: {node: '>=12'} 548 | cpu: [s390x] 549 | os: [linux] 550 | requiresBuild: true 551 | dev: true 552 | optional: true 553 | 554 | /@esbuild/linux-x64@0.17.19: 555 | resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} 556 | engines: {node: '>=12'} 557 | cpu: [x64] 558 | os: [linux] 559 | requiresBuild: true 560 | dev: false 561 | optional: true 562 | 563 | /@esbuild/linux-x64@0.18.20: 564 | resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} 565 | engines: {node: '>=12'} 566 | cpu: [x64] 567 | os: [linux] 568 | requiresBuild: true 569 | dev: false 570 | optional: true 571 | 572 | /@esbuild/linux-x64@0.19.2: 573 | resolution: {integrity: sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==} 574 | engines: {node: '>=12'} 575 | cpu: [x64] 576 | os: [linux] 577 | requiresBuild: true 578 | dev: true 579 | optional: true 580 | 581 | /@esbuild/netbsd-x64@0.17.19: 582 | resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} 583 | engines: {node: '>=12'} 584 | cpu: [x64] 585 | os: [netbsd] 586 | requiresBuild: true 587 | dev: false 588 | optional: true 589 | 590 | /@esbuild/netbsd-x64@0.18.20: 591 | resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} 592 | engines: {node: '>=12'} 593 | cpu: [x64] 594 | os: [netbsd] 595 | requiresBuild: true 596 | dev: false 597 | optional: true 598 | 599 | /@esbuild/netbsd-x64@0.19.2: 600 | resolution: {integrity: sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==} 601 | engines: {node: '>=12'} 602 | cpu: [x64] 603 | os: [netbsd] 604 | requiresBuild: true 605 | dev: true 606 | optional: true 607 | 608 | /@esbuild/openbsd-x64@0.17.19: 609 | resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} 610 | engines: {node: '>=12'} 611 | cpu: [x64] 612 | os: [openbsd] 613 | requiresBuild: true 614 | dev: false 615 | optional: true 616 | 617 | /@esbuild/openbsd-x64@0.18.20: 618 | resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} 619 | engines: {node: '>=12'} 620 | cpu: [x64] 621 | os: [openbsd] 622 | requiresBuild: true 623 | dev: false 624 | optional: true 625 | 626 | /@esbuild/openbsd-x64@0.19.2: 627 | resolution: {integrity: sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==} 628 | engines: {node: '>=12'} 629 | cpu: [x64] 630 | os: [openbsd] 631 | requiresBuild: true 632 | dev: true 633 | optional: true 634 | 635 | /@esbuild/sunos-x64@0.17.19: 636 | resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} 637 | engines: {node: '>=12'} 638 | cpu: [x64] 639 | os: [sunos] 640 | requiresBuild: true 641 | dev: false 642 | optional: true 643 | 644 | /@esbuild/sunos-x64@0.18.20: 645 | resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} 646 | engines: {node: '>=12'} 647 | cpu: [x64] 648 | os: [sunos] 649 | requiresBuild: true 650 | dev: false 651 | optional: true 652 | 653 | /@esbuild/sunos-x64@0.19.2: 654 | resolution: {integrity: sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==} 655 | engines: {node: '>=12'} 656 | cpu: [x64] 657 | os: [sunos] 658 | requiresBuild: true 659 | dev: true 660 | optional: true 661 | 662 | /@esbuild/win32-arm64@0.17.19: 663 | resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} 664 | engines: {node: '>=12'} 665 | cpu: [arm64] 666 | os: [win32] 667 | requiresBuild: true 668 | dev: false 669 | optional: true 670 | 671 | /@esbuild/win32-arm64@0.18.20: 672 | resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} 673 | engines: {node: '>=12'} 674 | cpu: [arm64] 675 | os: [win32] 676 | requiresBuild: true 677 | dev: false 678 | optional: true 679 | 680 | /@esbuild/win32-arm64@0.19.2: 681 | resolution: {integrity: sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==} 682 | engines: {node: '>=12'} 683 | cpu: [arm64] 684 | os: [win32] 685 | requiresBuild: true 686 | dev: true 687 | optional: true 688 | 689 | /@esbuild/win32-ia32@0.17.19: 690 | resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} 691 | engines: {node: '>=12'} 692 | cpu: [ia32] 693 | os: [win32] 694 | requiresBuild: true 695 | dev: false 696 | optional: true 697 | 698 | /@esbuild/win32-ia32@0.18.20: 699 | resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} 700 | engines: {node: '>=12'} 701 | cpu: [ia32] 702 | os: [win32] 703 | requiresBuild: true 704 | dev: false 705 | optional: true 706 | 707 | /@esbuild/win32-ia32@0.19.2: 708 | resolution: {integrity: sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==} 709 | engines: {node: '>=12'} 710 | cpu: [ia32] 711 | os: [win32] 712 | requiresBuild: true 713 | dev: true 714 | optional: true 715 | 716 | /@esbuild/win32-x64@0.17.19: 717 | resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} 718 | engines: {node: '>=12'} 719 | cpu: [x64] 720 | os: [win32] 721 | requiresBuild: true 722 | dev: false 723 | optional: true 724 | 725 | /@esbuild/win32-x64@0.18.20: 726 | resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} 727 | engines: {node: '>=12'} 728 | cpu: [x64] 729 | os: [win32] 730 | requiresBuild: true 731 | dev: false 732 | optional: true 733 | 734 | /@esbuild/win32-x64@0.19.2: 735 | resolution: {integrity: sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==} 736 | engines: {node: '>=12'} 737 | cpu: [x64] 738 | os: [win32] 739 | requiresBuild: true 740 | dev: true 741 | optional: true 742 | 743 | /@jridgewell/sourcemap-codec@1.4.15: 744 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 745 | dev: false 746 | 747 | /@noble/curves@1.1.0: 748 | resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} 749 | dependencies: 750 | '@noble/hashes': 1.3.1 751 | dev: false 752 | 753 | /@noble/hashes@1.3.1: 754 | resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} 755 | engines: {node: '>= 16'} 756 | dev: false 757 | 758 | /@replit/extensions-react@0.6.0(@replit/extensions@1.10.0)(react@18.2.0): 759 | resolution: {integrity: sha512-4+SoKbm8zFLrYUPxChkjIkLzLT719LcSY+wCL2l2yTWc4OYy96y25ZO0Mv1JpFduFywfrPYritb8wQJ9gYPkBg==} 760 | peerDependencies: 761 | '@replit/extensions': '>=1.x' 762 | react: '>=17.0.0' 763 | dependencies: 764 | '@replit/extensions': 1.10.0 765 | '@types/react': 18.2.31 766 | jotai: 2.4.3(@types/react@18.2.31)(react@18.2.0) 767 | react: 18.2.0 768 | dev: false 769 | 770 | /@replit/extensions@1.10.0: 771 | resolution: {integrity: sha512-KUME3xkj7BoVHDLStWs9cr39ZxoBT6i8C82iqCfxvm25dXWtqzOo39l14QSr9n9TuWe4T7iE69ED6bYl0tpXcw==} 772 | dependencies: 773 | '@codemirror/state': 6.2.1 774 | '@noble/curves': 1.1.0 775 | '@root/asn1': 1.0.0 776 | b64u-lite: 1.1.0 777 | comlink: 4.4.1 778 | dev: false 779 | 780 | /@replit/replkit@0.0.5: 781 | resolution: {integrity: sha512-XgjgTjJcC6+OQAWNFptkHoFLeSYYKZWsiGdqw7UixKg5vv+jxY8g1WGkmmh2lm5wI/JG9e1dD4e1snAJVVaTlw==} 782 | hasBin: true 783 | dependencies: 784 | '@types/connect': 3.4.35 785 | '@types/cors': 2.8.13 786 | '@types/etag': 1.8.1 787 | '@types/node': 18.0.6 788 | cac: 6.7.14 789 | chokidar: 3.5.3 790 | connect: 3.7.0 791 | connect-history-api-fallback: 2.0.0 792 | cors: 2.8.5 793 | etag: 1.8.1 794 | events: 3.3.0 795 | json5: 2.2.3 796 | launch-editor-middleware: 2.6.0 797 | magic-string: 0.30.2 798 | node-fetch: 3.2.6 799 | picocolors: 1.0.0 800 | picomatch: 2.3.1 801 | react: 18.2.0 802 | react-dom: 18.2.0(react@18.2.0) 803 | rollup: 3.28.0 804 | tsx: 3.12.7 805 | url: 0.11.1 806 | vite: 4.4.9(@types/node@18.0.6) 807 | transitivePeerDependencies: 808 | - less 809 | - lightningcss 810 | - sass 811 | - stylus 812 | - sugarss 813 | - supports-color 814 | - terser 815 | dev: false 816 | 817 | /@root/asn1@1.0.0: 818 | resolution: {integrity: sha512-0lfZNuOULKJDJmdIkP8V9RnbV3XaK6PAHD3swnFy4tZwtlMDzLKoM/dfNad7ut8Hu3r91wy9uK0WA/9zym5mig==} 819 | dependencies: 820 | '@root/encoding': 1.0.1 821 | dev: false 822 | 823 | /@root/encoding@1.0.1: 824 | resolution: {integrity: sha512-OaEub02ufoU038gy6bsNHQOjIn8nUjGiLcaRmJ40IUykneJkIW5fxDqKxQx48cszuNflYldsJLPPXCrGfHs8yQ==} 825 | dev: false 826 | 827 | /@types/connect@3.4.35: 828 | resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} 829 | dependencies: 830 | '@types/node': 18.0.6 831 | dev: false 832 | 833 | /@types/cors@2.8.13: 834 | resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} 835 | dependencies: 836 | '@types/node': 18.0.6 837 | dev: false 838 | 839 | /@types/etag@1.8.1: 840 | resolution: {integrity: sha512-bsKkeSqN7HYyYntFRAmzcwx/dKW4Wa+KVMTInANlI72PWLQmOpZu96j0OqHZGArW4VQwCmJPteQlXaUDeOB0WQ==} 841 | dependencies: 842 | '@types/node': 18.0.6 843 | dev: false 844 | 845 | /@types/node@18.0.6: 846 | resolution: {integrity: sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==} 847 | dev: false 848 | 849 | /@types/prop-types@15.7.5: 850 | resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} 851 | 852 | /@types/react-dom@18.2.14: 853 | resolution: {integrity: sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==} 854 | dependencies: 855 | '@types/react': 18.2.31 856 | 857 | /@types/react@18.2.31: 858 | resolution: {integrity: sha512-c2UnPv548q+5DFh03y8lEDeMfDwBn9G3dRwfkrxQMo/dOtRHUUO57k6pHvBIfH/VF4Nh+98mZ5aaSe+2echD5g==} 859 | dependencies: 860 | '@types/prop-types': 15.7.5 861 | '@types/scheduler': 0.16.3 862 | csstype: 3.1.2 863 | 864 | /@types/scheduler@0.16.3: 865 | resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} 866 | 867 | /anymatch@3.1.3: 868 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 869 | engines: {node: '>= 8'} 870 | dependencies: 871 | normalize-path: 3.0.0 872 | picomatch: 2.3.1 873 | dev: false 874 | 875 | /b64-lite@1.4.0: 876 | resolution: {integrity: sha512-aHe97M7DXt+dkpa8fHlCcm1CnskAHrJqEfMI0KN7dwqlzml/aUe1AGt6lk51HzrSfVD67xOso84sOpr+0wIe2w==} 877 | dependencies: 878 | base-64: 0.1.0 879 | dev: false 880 | 881 | /b64u-lite@1.1.0: 882 | resolution: {integrity: sha512-929qWGDVCRph7gQVTC6koHqQIpF4vtVaSbwLltFQo44B1bYUquALswZdBKFfrJCPEnsCOvWkJsPdQYZ/Ukhw8A==} 883 | dependencies: 884 | b64-lite: 1.4.0 885 | dev: false 886 | 887 | /base-64@0.1.0: 888 | resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==} 889 | dev: false 890 | 891 | /binary-extensions@2.2.0: 892 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 893 | engines: {node: '>=8'} 894 | dev: false 895 | 896 | /braces@3.0.2: 897 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 898 | engines: {node: '>=8'} 899 | dependencies: 900 | fill-range: 7.0.1 901 | dev: false 902 | 903 | /buffer-from@1.1.2: 904 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 905 | dev: false 906 | 907 | /cac@6.7.14: 908 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 909 | engines: {node: '>=8'} 910 | dev: false 911 | 912 | /call-bind@1.0.2: 913 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 914 | dependencies: 915 | function-bind: 1.1.1 916 | get-intrinsic: 1.2.1 917 | dev: false 918 | 919 | /chokidar@3.5.3: 920 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 921 | engines: {node: '>= 8.10.0'} 922 | dependencies: 923 | anymatch: 3.1.3 924 | braces: 3.0.2 925 | glob-parent: 5.1.2 926 | is-binary-path: 2.1.0 927 | is-glob: 4.0.3 928 | normalize-path: 3.0.0 929 | readdirp: 3.6.0 930 | optionalDependencies: 931 | fsevents: 2.3.2 932 | dev: false 933 | 934 | /comlink@4.4.1: 935 | resolution: {integrity: sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==} 936 | dev: false 937 | 938 | /connect-history-api-fallback@2.0.0: 939 | resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} 940 | engines: {node: '>=0.8'} 941 | dev: false 942 | 943 | /connect@3.7.0: 944 | resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} 945 | engines: {node: '>= 0.10.0'} 946 | dependencies: 947 | debug: 2.6.9 948 | finalhandler: 1.1.2 949 | parseurl: 1.3.3 950 | utils-merge: 1.0.1 951 | transitivePeerDependencies: 952 | - supports-color 953 | dev: false 954 | 955 | /cors@2.8.5: 956 | resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} 957 | engines: {node: '>= 0.10'} 958 | dependencies: 959 | object-assign: 4.1.1 960 | vary: 1.1.2 961 | dev: false 962 | 963 | /csstype@3.1.2: 964 | resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} 965 | 966 | /data-uri-to-buffer@4.0.1: 967 | resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} 968 | engines: {node: '>= 12'} 969 | dev: false 970 | 971 | /debug@2.6.9: 972 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 973 | peerDependencies: 974 | supports-color: '*' 975 | peerDependenciesMeta: 976 | supports-color: 977 | optional: true 978 | dependencies: 979 | ms: 2.0.0 980 | dev: false 981 | 982 | /ee-first@1.1.1: 983 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 984 | dev: false 985 | 986 | /encodeurl@1.0.2: 987 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 988 | engines: {node: '>= 0.8'} 989 | dev: false 990 | 991 | /esbuild@0.17.19: 992 | resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} 993 | engines: {node: '>=12'} 994 | hasBin: true 995 | requiresBuild: true 996 | optionalDependencies: 997 | '@esbuild/android-arm': 0.17.19 998 | '@esbuild/android-arm64': 0.17.19 999 | '@esbuild/android-x64': 0.17.19 1000 | '@esbuild/darwin-arm64': 0.17.19 1001 | '@esbuild/darwin-x64': 0.17.19 1002 | '@esbuild/freebsd-arm64': 0.17.19 1003 | '@esbuild/freebsd-x64': 0.17.19 1004 | '@esbuild/linux-arm': 0.17.19 1005 | '@esbuild/linux-arm64': 0.17.19 1006 | '@esbuild/linux-ia32': 0.17.19 1007 | '@esbuild/linux-loong64': 0.17.19 1008 | '@esbuild/linux-mips64el': 0.17.19 1009 | '@esbuild/linux-ppc64': 0.17.19 1010 | '@esbuild/linux-riscv64': 0.17.19 1011 | '@esbuild/linux-s390x': 0.17.19 1012 | '@esbuild/linux-x64': 0.17.19 1013 | '@esbuild/netbsd-x64': 0.17.19 1014 | '@esbuild/openbsd-x64': 0.17.19 1015 | '@esbuild/sunos-x64': 0.17.19 1016 | '@esbuild/win32-arm64': 0.17.19 1017 | '@esbuild/win32-ia32': 0.17.19 1018 | '@esbuild/win32-x64': 0.17.19 1019 | dev: false 1020 | 1021 | /esbuild@0.18.20: 1022 | resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} 1023 | engines: {node: '>=12'} 1024 | hasBin: true 1025 | requiresBuild: true 1026 | optionalDependencies: 1027 | '@esbuild/android-arm': 0.18.20 1028 | '@esbuild/android-arm64': 0.18.20 1029 | '@esbuild/android-x64': 0.18.20 1030 | '@esbuild/darwin-arm64': 0.18.20 1031 | '@esbuild/darwin-x64': 0.18.20 1032 | '@esbuild/freebsd-arm64': 0.18.20 1033 | '@esbuild/freebsd-x64': 0.18.20 1034 | '@esbuild/linux-arm': 0.18.20 1035 | '@esbuild/linux-arm64': 0.18.20 1036 | '@esbuild/linux-ia32': 0.18.20 1037 | '@esbuild/linux-loong64': 0.18.20 1038 | '@esbuild/linux-mips64el': 0.18.20 1039 | '@esbuild/linux-ppc64': 0.18.20 1040 | '@esbuild/linux-riscv64': 0.18.20 1041 | '@esbuild/linux-s390x': 0.18.20 1042 | '@esbuild/linux-x64': 0.18.20 1043 | '@esbuild/netbsd-x64': 0.18.20 1044 | '@esbuild/openbsd-x64': 0.18.20 1045 | '@esbuild/sunos-x64': 0.18.20 1046 | '@esbuild/win32-arm64': 0.18.20 1047 | '@esbuild/win32-ia32': 0.18.20 1048 | '@esbuild/win32-x64': 0.18.20 1049 | dev: false 1050 | 1051 | /esbuild@0.19.2: 1052 | resolution: {integrity: sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==} 1053 | engines: {node: '>=12'} 1054 | hasBin: true 1055 | requiresBuild: true 1056 | optionalDependencies: 1057 | '@esbuild/android-arm': 0.19.2 1058 | '@esbuild/android-arm64': 0.19.2 1059 | '@esbuild/android-x64': 0.19.2 1060 | '@esbuild/darwin-arm64': 0.19.2 1061 | '@esbuild/darwin-x64': 0.19.2 1062 | '@esbuild/freebsd-arm64': 0.19.2 1063 | '@esbuild/freebsd-x64': 0.19.2 1064 | '@esbuild/linux-arm': 0.19.2 1065 | '@esbuild/linux-arm64': 0.19.2 1066 | '@esbuild/linux-ia32': 0.19.2 1067 | '@esbuild/linux-loong64': 0.19.2 1068 | '@esbuild/linux-mips64el': 0.19.2 1069 | '@esbuild/linux-ppc64': 0.19.2 1070 | '@esbuild/linux-riscv64': 0.19.2 1071 | '@esbuild/linux-s390x': 0.19.2 1072 | '@esbuild/linux-x64': 0.19.2 1073 | '@esbuild/netbsd-x64': 0.19.2 1074 | '@esbuild/openbsd-x64': 0.19.2 1075 | '@esbuild/sunos-x64': 0.19.2 1076 | '@esbuild/win32-arm64': 0.19.2 1077 | '@esbuild/win32-ia32': 0.19.2 1078 | '@esbuild/win32-x64': 0.19.2 1079 | dev: true 1080 | 1081 | /escape-html@1.0.3: 1082 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 1083 | dev: false 1084 | 1085 | /etag@1.8.1: 1086 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 1087 | engines: {node: '>= 0.6'} 1088 | dev: false 1089 | 1090 | /events@3.3.0: 1091 | resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} 1092 | engines: {node: '>=0.8.x'} 1093 | dev: false 1094 | 1095 | /fetch-blob@3.2.0: 1096 | resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} 1097 | engines: {node: ^12.20 || >= 14.13} 1098 | dependencies: 1099 | node-domexception: 1.0.0 1100 | web-streams-polyfill: 3.2.1 1101 | dev: false 1102 | 1103 | /fill-range@7.0.1: 1104 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1105 | engines: {node: '>=8'} 1106 | dependencies: 1107 | to-regex-range: 5.0.1 1108 | dev: false 1109 | 1110 | /finalhandler@1.1.2: 1111 | resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} 1112 | engines: {node: '>= 0.8'} 1113 | dependencies: 1114 | debug: 2.6.9 1115 | encodeurl: 1.0.2 1116 | escape-html: 1.0.3 1117 | on-finished: 2.3.0 1118 | parseurl: 1.3.3 1119 | statuses: 1.5.0 1120 | unpipe: 1.0.0 1121 | transitivePeerDependencies: 1122 | - supports-color 1123 | dev: false 1124 | 1125 | /formdata-polyfill@4.0.10: 1126 | resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} 1127 | engines: {node: '>=12.20.0'} 1128 | dependencies: 1129 | fetch-blob: 3.2.0 1130 | dev: false 1131 | 1132 | /fsevents@2.3.2: 1133 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1134 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1135 | os: [darwin] 1136 | requiresBuild: true 1137 | dev: false 1138 | optional: true 1139 | 1140 | /function-bind@1.1.1: 1141 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1142 | dev: false 1143 | 1144 | /get-intrinsic@1.2.1: 1145 | resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} 1146 | dependencies: 1147 | function-bind: 1.1.1 1148 | has: 1.0.3 1149 | has-proto: 1.0.1 1150 | has-symbols: 1.0.3 1151 | dev: false 1152 | 1153 | /get-tsconfig@4.7.0: 1154 | resolution: {integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==} 1155 | dependencies: 1156 | resolve-pkg-maps: 1.0.0 1157 | dev: false 1158 | 1159 | /glob-parent@5.1.2: 1160 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1161 | engines: {node: '>= 6'} 1162 | dependencies: 1163 | is-glob: 4.0.3 1164 | dev: false 1165 | 1166 | /has-proto@1.0.1: 1167 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 1168 | engines: {node: '>= 0.4'} 1169 | dev: false 1170 | 1171 | /has-symbols@1.0.3: 1172 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 1173 | engines: {node: '>= 0.4'} 1174 | dev: false 1175 | 1176 | /has@1.0.3: 1177 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1178 | engines: {node: '>= 0.4.0'} 1179 | dependencies: 1180 | function-bind: 1.1.1 1181 | dev: false 1182 | 1183 | /is-binary-path@2.1.0: 1184 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1185 | engines: {node: '>=8'} 1186 | dependencies: 1187 | binary-extensions: 2.2.0 1188 | dev: false 1189 | 1190 | /is-extglob@2.1.1: 1191 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1192 | engines: {node: '>=0.10.0'} 1193 | dev: false 1194 | 1195 | /is-glob@4.0.3: 1196 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1197 | engines: {node: '>=0.10.0'} 1198 | dependencies: 1199 | is-extglob: 2.1.1 1200 | dev: false 1201 | 1202 | /is-number@7.0.0: 1203 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1204 | engines: {node: '>=0.12.0'} 1205 | dev: false 1206 | 1207 | /jotai@2.4.3(@types/react@18.2.31)(react@18.2.0): 1208 | resolution: {integrity: sha512-CSAHX9LqWG5WCrU8OgBoZbBJ+Bo9rQU0mPusEF4e0CZ/SNFgurG26vb3UpgvCSJZgYVcUQNiUBM5q86PA8rstQ==} 1209 | engines: {node: '>=12.20.0'} 1210 | peerDependencies: 1211 | '@types/react': '>=17.0.0' 1212 | react: '>=17.0.0' 1213 | peerDependenciesMeta: 1214 | '@types/react': 1215 | optional: true 1216 | react: 1217 | optional: true 1218 | dependencies: 1219 | '@types/react': 18.2.31 1220 | react: 18.2.0 1221 | dev: false 1222 | 1223 | /js-tokens@4.0.0: 1224 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1225 | dev: false 1226 | 1227 | /json5@2.2.3: 1228 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1229 | engines: {node: '>=6'} 1230 | hasBin: true 1231 | dev: false 1232 | 1233 | /launch-editor-middleware@2.6.0: 1234 | resolution: {integrity: sha512-K2yxgljj5TdCeRN1lBtO3/J26+AIDDDw+04y6VAiZbWcTdBwsYN6RrZBnW5DN/QiSIdKNjKdATLUUluWWFYTIA==} 1235 | dependencies: 1236 | launch-editor: 2.6.0 1237 | dev: false 1238 | 1239 | /launch-editor@2.6.0: 1240 | resolution: {integrity: sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==} 1241 | dependencies: 1242 | picocolors: 1.0.0 1243 | shell-quote: 1.8.1 1244 | dev: false 1245 | 1246 | /loose-envify@1.4.0: 1247 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1248 | hasBin: true 1249 | dependencies: 1250 | js-tokens: 4.0.0 1251 | dev: false 1252 | 1253 | /magic-string@0.30.2: 1254 | resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} 1255 | engines: {node: '>=12'} 1256 | dependencies: 1257 | '@jridgewell/sourcemap-codec': 1.4.15 1258 | dev: false 1259 | 1260 | /ms@2.0.0: 1261 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 1262 | dev: false 1263 | 1264 | /nanoid@3.3.6: 1265 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 1266 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1267 | hasBin: true 1268 | dev: false 1269 | 1270 | /node-domexception@1.0.0: 1271 | resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} 1272 | engines: {node: '>=10.5.0'} 1273 | dev: false 1274 | 1275 | /node-fetch@3.2.6: 1276 | resolution: {integrity: sha512-LAy/HZnLADOVkVPubaxHDft29booGglPFDr2Hw0J1AercRh01UiVFm++KMDnJeH9sHgNB4hsXPii7Sgym/sTbw==} 1277 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1278 | dependencies: 1279 | data-uri-to-buffer: 4.0.1 1280 | fetch-blob: 3.2.0 1281 | formdata-polyfill: 4.0.10 1282 | dev: false 1283 | 1284 | /normalize-path@3.0.0: 1285 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1286 | engines: {node: '>=0.10.0'} 1287 | dev: false 1288 | 1289 | /object-assign@4.1.1: 1290 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1291 | engines: {node: '>=0.10.0'} 1292 | dev: false 1293 | 1294 | /object-inspect@1.12.3: 1295 | resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} 1296 | dev: false 1297 | 1298 | /on-finished@2.3.0: 1299 | resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} 1300 | engines: {node: '>= 0.8'} 1301 | dependencies: 1302 | ee-first: 1.1.1 1303 | dev: false 1304 | 1305 | /parseurl@1.3.3: 1306 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 1307 | engines: {node: '>= 0.8'} 1308 | dev: false 1309 | 1310 | /picocolors@1.0.0: 1311 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1312 | dev: false 1313 | 1314 | /picomatch@2.3.1: 1315 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1316 | engines: {node: '>=8.6'} 1317 | dev: false 1318 | 1319 | /postcss@8.4.28: 1320 | resolution: {integrity: sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==} 1321 | engines: {node: ^10 || ^12 || >=14} 1322 | dependencies: 1323 | nanoid: 3.3.6 1324 | picocolors: 1.0.0 1325 | source-map-js: 1.0.2 1326 | dev: false 1327 | 1328 | /prettier@3.0.2: 1329 | resolution: {integrity: sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==} 1330 | engines: {node: '>=14'} 1331 | hasBin: true 1332 | dev: false 1333 | 1334 | /punycode@1.4.1: 1335 | resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} 1336 | dev: false 1337 | 1338 | /qs@6.11.2: 1339 | resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} 1340 | engines: {node: '>=0.6'} 1341 | dependencies: 1342 | side-channel: 1.0.4 1343 | dev: false 1344 | 1345 | /react-dom@18.2.0(react@18.2.0): 1346 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 1347 | peerDependencies: 1348 | react: ^18.2.0 1349 | dependencies: 1350 | loose-envify: 1.4.0 1351 | react: 18.2.0 1352 | scheduler: 0.23.0 1353 | dev: false 1354 | 1355 | /react@18.2.0: 1356 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 1357 | engines: {node: '>=0.10.0'} 1358 | dependencies: 1359 | loose-envify: 1.4.0 1360 | dev: false 1361 | 1362 | /readdirp@3.6.0: 1363 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1364 | engines: {node: '>=8.10.0'} 1365 | dependencies: 1366 | picomatch: 2.3.1 1367 | dev: false 1368 | 1369 | /resolve-pkg-maps@1.0.0: 1370 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1371 | dev: false 1372 | 1373 | /rollup@3.28.0: 1374 | resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} 1375 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 1376 | hasBin: true 1377 | optionalDependencies: 1378 | fsevents: 2.3.2 1379 | dev: false 1380 | 1381 | /scheduler@0.23.0: 1382 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 1383 | dependencies: 1384 | loose-envify: 1.4.0 1385 | dev: false 1386 | 1387 | /shell-quote@1.8.1: 1388 | resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} 1389 | dev: false 1390 | 1391 | /side-channel@1.0.4: 1392 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1393 | dependencies: 1394 | call-bind: 1.0.2 1395 | get-intrinsic: 1.2.1 1396 | object-inspect: 1.12.3 1397 | dev: false 1398 | 1399 | /source-map-js@1.0.2: 1400 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1401 | engines: {node: '>=0.10.0'} 1402 | dev: false 1403 | 1404 | /source-map-support@0.5.21: 1405 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1406 | dependencies: 1407 | buffer-from: 1.1.2 1408 | source-map: 0.6.1 1409 | dev: false 1410 | 1411 | /source-map@0.6.1: 1412 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1413 | engines: {node: '>=0.10.0'} 1414 | dev: false 1415 | 1416 | /statuses@1.5.0: 1417 | resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} 1418 | engines: {node: '>= 0.6'} 1419 | dev: false 1420 | 1421 | /to-regex-range@5.0.1: 1422 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1423 | engines: {node: '>=8.0'} 1424 | dependencies: 1425 | is-number: 7.0.0 1426 | dev: false 1427 | 1428 | /tsx@3.12.7: 1429 | resolution: {integrity: sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==} 1430 | hasBin: true 1431 | dependencies: 1432 | '@esbuild-kit/cjs-loader': 2.4.2 1433 | '@esbuild-kit/core-utils': 3.1.0 1434 | '@esbuild-kit/esm-loader': 2.5.5 1435 | optionalDependencies: 1436 | fsevents: 2.3.2 1437 | dev: false 1438 | 1439 | /turbo-darwin-64@1.10.12: 1440 | resolution: {integrity: sha512-vmDfGVPl5/aFenAbOj3eOx3ePNcWVUyZwYr7taRl0ZBbmv2TzjRiFotO4vrKCiTVnbqjQqAFQWY2ugbqCI1kOQ==} 1441 | cpu: [x64] 1442 | os: [darwin] 1443 | requiresBuild: true 1444 | dev: true 1445 | optional: true 1446 | 1447 | /turbo-darwin-arm64@1.10.12: 1448 | resolution: {integrity: sha512-3JliEESLNX2s7g54SOBqqkqJ7UhcOGkS0ywMr5SNuvF6kWVTbuUq7uBU/sVbGq8RwvK1ONlhPvJne5MUqBCTCQ==} 1449 | cpu: [arm64] 1450 | os: [darwin] 1451 | requiresBuild: true 1452 | dev: true 1453 | optional: true 1454 | 1455 | /turbo-linux-64@1.10.12: 1456 | resolution: {integrity: sha512-siYhgeX0DidIfHSgCR95b8xPee9enKSOjCzx7EjTLmPqPaCiVebRYvbOIYdQWRqiaKh9yfhUtFmtMOMScUf1gg==} 1457 | cpu: [x64] 1458 | os: [linux] 1459 | requiresBuild: true 1460 | dev: true 1461 | optional: true 1462 | 1463 | /turbo-linux-arm64@1.10.12: 1464 | resolution: {integrity: sha512-K/ZhvD9l4SslclaMkTiIrnfcACgos79YcAo4kwc8bnMQaKuUeRpM15sxLpZp3xDjDg8EY93vsKyjaOhdFG2UbA==} 1465 | cpu: [arm64] 1466 | os: [linux] 1467 | requiresBuild: true 1468 | dev: true 1469 | optional: true 1470 | 1471 | /turbo-windows-64@1.10.12: 1472 | resolution: {integrity: sha512-7FSgSwvktWDNOqV65l9AbZwcoueAILeE4L7JvjauNASAjjbuzXGCEq5uN8AQU3U5BOFj4TdXrVmO2dX+lLu8Zg==} 1473 | cpu: [x64] 1474 | os: [win32] 1475 | requiresBuild: true 1476 | dev: true 1477 | optional: true 1478 | 1479 | /turbo-windows-arm64@1.10.12: 1480 | resolution: {integrity: sha512-gCNXF52dwom1HLY9ry/cneBPOKTBHhzpqhMylcyvJP0vp9zeMQQkt6yjYv+6QdnmELC92CtKNp2FsNZo+z0pyw==} 1481 | cpu: [arm64] 1482 | os: [win32] 1483 | requiresBuild: true 1484 | dev: true 1485 | optional: true 1486 | 1487 | /turbo@1.10.12: 1488 | resolution: {integrity: sha512-WM3+jTfQWnB9W208pmP4oeehZcC6JQNlydb/ZHMRrhmQa+htGhWLCzd6Q9rLe0MwZLPpSPFV2/bN5egCLyoKjQ==} 1489 | hasBin: true 1490 | requiresBuild: true 1491 | optionalDependencies: 1492 | turbo-darwin-64: 1.10.12 1493 | turbo-darwin-arm64: 1.10.12 1494 | turbo-linux-64: 1.10.12 1495 | turbo-linux-arm64: 1.10.12 1496 | turbo-windows-64: 1.10.12 1497 | turbo-windows-arm64: 1.10.12 1498 | dev: true 1499 | 1500 | /unpipe@1.0.0: 1501 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 1502 | engines: {node: '>= 0.8'} 1503 | dev: false 1504 | 1505 | /url@0.11.1: 1506 | resolution: {integrity: sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==} 1507 | dependencies: 1508 | punycode: 1.4.1 1509 | qs: 6.11.2 1510 | dev: false 1511 | 1512 | /utils-merge@1.0.1: 1513 | resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} 1514 | engines: {node: '>= 0.4.0'} 1515 | dev: false 1516 | 1517 | /vary@1.1.2: 1518 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 1519 | engines: {node: '>= 0.8'} 1520 | dev: false 1521 | 1522 | /vite@4.4.9(@types/node@18.0.6): 1523 | resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} 1524 | engines: {node: ^14.18.0 || >=16.0.0} 1525 | hasBin: true 1526 | peerDependencies: 1527 | '@types/node': '>= 14' 1528 | less: '*' 1529 | lightningcss: ^1.21.0 1530 | sass: '*' 1531 | stylus: '*' 1532 | sugarss: '*' 1533 | terser: ^5.4.0 1534 | peerDependenciesMeta: 1535 | '@types/node': 1536 | optional: true 1537 | less: 1538 | optional: true 1539 | lightningcss: 1540 | optional: true 1541 | sass: 1542 | optional: true 1543 | stylus: 1544 | optional: true 1545 | sugarss: 1546 | optional: true 1547 | terser: 1548 | optional: true 1549 | dependencies: 1550 | '@types/node': 18.0.6 1551 | esbuild: 0.18.20 1552 | postcss: 8.4.28 1553 | rollup: 3.28.0 1554 | optionalDependencies: 1555 | fsevents: 2.3.2 1556 | dev: false 1557 | 1558 | /web-streams-polyfill@3.2.1: 1559 | resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} 1560 | engines: {node: '>= 8'} 1561 | dev: false 1562 | 1563 | settings: 1564 | autoInstallPeers: true 1565 | excludeLinksFromLockfile: false 1566 | --------------------------------------------------------------------------------