├── 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 |
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 |
--------------------------------------------------------------------------------