@robinbraemer/codemode 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +91 -40
- package/dist/{chunk-NSUQUO7S.js → chunk-M4AL5G4U.js} +28 -31
- package/dist/chunk-M4AL5G4U.js.map +1 -0
- package/dist/{codemode-DbXujxeq.d.ts → codemode-C8y0tnb7.d.ts} +44 -7
- package/dist/index.d.ts +55 -25
- package/dist/index.js +485 -116
- package/dist/index.js.map +1 -1
- package/dist/{isolated-vm-57EIYEJM.js → isolated-vm-7REUQAB5.js} +2 -2
- package/dist/mcp.d.ts +5 -12
- package/dist/mcp.js +5 -3
- package/dist/mcp.js.map +1 -1
- package/package.json +5 -8
- package/dist/chunk-NSUQUO7S.js.map +0 -1
- package/dist/chunk-ZWSO33DZ.js +0 -148
- package/dist/chunk-ZWSO33DZ.js.map +0 -1
- package/dist/quickjs-BGVQS2YE.js +0 -8
- package/dist/quickjs-BGVQS2YE.js.map +0 -1
- /package/dist/{isolated-vm-57EIYEJM.js.map → isolated-vm-7REUQAB5.js.map} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@robinbraemer/codemode",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Code Mode MCP tools from OpenAPI specs. Two tools (search + execute) replace hundreds of individual MCP tools.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -38,23 +38,20 @@
|
|
|
38
38
|
"url": "https://github.com/cnap-tech/codemode.git"
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|
|
41
|
-
"isolated-vm": "6"
|
|
42
|
-
"quickjs-emscripten": ">=0.30.0"
|
|
41
|
+
"isolated-vm": "6"
|
|
43
42
|
},
|
|
44
43
|
"peerDependenciesMeta": {
|
|
45
44
|
"isolated-vm": {
|
|
46
45
|
"optional": true
|
|
47
|
-
},
|
|
48
|
-
"quickjs-emscripten": {
|
|
49
|
-
"optional": true
|
|
50
46
|
}
|
|
51
47
|
},
|
|
52
48
|
"devDependencies": {
|
|
53
49
|
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
54
50
|
"hono": "^4.7.6",
|
|
55
51
|
"isolated-vm": "^6.0.2",
|
|
56
|
-
"
|
|
52
|
+
"oxlint": "^1.50.0",
|
|
57
53
|
"tsup": "^8.4.0",
|
|
54
|
+
"tsx": "^4.21.0",
|
|
58
55
|
"typescript": "^5.7.3",
|
|
59
56
|
"vitest": "^3.0.5",
|
|
60
57
|
"zod": "^3.24.2"
|
|
@@ -64,6 +61,6 @@
|
|
|
64
61
|
"dev": "tsup --watch",
|
|
65
62
|
"test": "vitest run",
|
|
66
63
|
"test:watch": "vitest",
|
|
67
|
-
"lint": "tsc --noEmit"
|
|
64
|
+
"lint": "oxlint && tsc --noEmit"
|
|
68
65
|
}
|
|
69
66
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/executor/isolated-vm.ts"],"sourcesContent":["import type { Executor, ExecuteResult, SandboxOptions } from \"../types.js\";\n\n/**\n * Executor implementation using isolated-vm (V8 isolates).\n * Requires `isolated-vm` v6+ as a peer dependency.\n *\n * Each execute() call creates a fresh V8 isolate with its own heap — no state\n * leaks between calls. The sandbox has zero I/O capabilities by default (no\n * fetch, no fs, no require). The only way out is through injected host functions.\n */\nexport class IsolatedVMExecutor implements Executor {\n private memoryMB: number;\n private timeoutMs: number;\n\n constructor(options: SandboxOptions = {}) {\n this.memoryMB = options.memoryMB ?? 64;\n this.timeoutMs = options.timeoutMs ?? 30_000;\n }\n\n async execute(\n code: string,\n globals: Record<string, unknown>,\n ): Promise<ExecuteResult> {\n // @ts-ignore — optional peer dependency\n const ivm = (await import(\"isolated-vm\")).default ?? (await import(\"isolated-vm\"));\n const isolate = new ivm.Isolate({ memoryLimit: this.memoryMB });\n const logs: string[] = [];\n\n try {\n const context = await isolate.createContext();\n const jail = context.global;\n await jail.set(\"global\", jail.derefInto());\n\n // Inject console (captures logs via Callback)\n jail.setSync(\n \"__log\",\n new ivm.Callback((...args: unknown[]) => {\n logs.push(\n args\n .map((a) => (typeof a === \"string\" ? a : stringify(a)))\n .join(\" \"),\n );\n }),\n );\n await context.eval(`\n globalThis.console = {\n log: (...args) => __log(...args),\n warn: (...args) => __log(...args),\n error: (...args) => __log(...args),\n };\n `);\n\n // Inject globals\n let refCounter = 0;\n for (const [name, value] of Object.entries(globals)) {\n if (typeof value === \"function\") {\n // Async host function: set Reference, wrap with .apply() in isolate\n const refName = `__ref${refCounter++}`;\n await jail.set(refName, new ivm.Reference(value));\n await context.eval(`\n globalThis[${JSON.stringify(name)}] = function(...args) {\n return ${refName}.apply(undefined, args, {\n arguments: { copy: true },\n result: { promise: true, copy: true },\n });\n };\n `);\n } else if (isNamespaceWithMethods(value)) {\n // Namespace object with methods (e.g. { request: fn })\n const ns = value as Record<string, unknown>;\n let nsSetup = `globalThis[${JSON.stringify(name)}] = {};\\n`;\n\n for (const [key, val] of Object.entries(ns)) {\n if (typeof val === \"function\") {\n const refName = `__ref${refCounter++}`;\n await jail.set(refName, new ivm.Reference(val));\n nsSetup += `\n globalThis[${JSON.stringify(name)}][${JSON.stringify(key)}] = function(...args) {\n return ${refName}.apply(undefined, args, {\n arguments: { copy: true },\n result: { promise: true, copy: true },\n });\n };\n `;\n }\n }\n\n // Inject non-function properties as JSON\n const dataProps = Object.entries(ns).filter(([, v]) => typeof v !== \"function\");\n if (dataProps.length > 0) {\n const dataObj = Object.fromEntries(dataProps);\n nsSetup += `Object.assign(globalThis[${JSON.stringify(name)}], ${JSON.stringify(dataObj)});\\n`;\n }\n\n await context.eval(nsSetup);\n } else {\n // Plain data: inject as JSON\n await context.eval(\n `globalThis[${JSON.stringify(name)}] = ${JSON.stringify(value)};`,\n );\n }\n }\n\n // Execute the code\n const wrappedCode = `(${code})()`;\n const script = await isolate.compileScript(wrappedCode);\n const result = await script.run(context, {\n timeout: this.timeoutMs,\n promise: true,\n copy: true,\n });\n\n context.release();\n return { result, logs };\n } catch (err) {\n return {\n result: undefined,\n error: err instanceof Error ? err.message : String(err),\n logs,\n };\n } finally {\n if (!isolate.isDisposed) {\n isolate.dispose();\n }\n }\n }\n}\n\nfunction isNamespaceWithMethods(value: unknown): boolean {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.values(value as Record<string, unknown>).some(\n (v) => typeof v === \"function\",\n )\n );\n}\n\nfunction stringify(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/chunk-ZWSO33DZ.js
DELETED
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
// src/executor/quickjs.ts
|
|
2
|
-
var QuickJSExecutor = class {
|
|
3
|
-
memoryBytes;
|
|
4
|
-
timeoutMs;
|
|
5
|
-
constructor(options = {}) {
|
|
6
|
-
this.memoryBytes = (options.memoryMB ?? 64) * 1024 * 1024;
|
|
7
|
-
this.timeoutMs = options.timeoutMs ?? 3e4;
|
|
8
|
-
}
|
|
9
|
-
async execute(code, globals) {
|
|
10
|
-
const qjs = await import("quickjs-emscripten");
|
|
11
|
-
const logs = [];
|
|
12
|
-
const vm = await qjs.newAsyncContext();
|
|
13
|
-
const runtime = vm.runtime;
|
|
14
|
-
runtime.setMemoryLimit(this.memoryBytes);
|
|
15
|
-
runtime.setMaxStackSize(1024 * 320);
|
|
16
|
-
const deadline = Date.now() + this.timeoutMs;
|
|
17
|
-
runtime.setInterruptHandler(() => Date.now() > deadline);
|
|
18
|
-
try {
|
|
19
|
-
injectConsole(vm, logs);
|
|
20
|
-
for (const [name, value] of Object.entries(globals)) {
|
|
21
|
-
if (typeof value === "function") {
|
|
22
|
-
injectAsyncFunction(vm, name, value);
|
|
23
|
-
} else if (typeof value === "object" && value !== null && !Array.isArray(value) && Object.values(value).some((v) => typeof v === "function")) {
|
|
24
|
-
injectNamespace(vm, name, value);
|
|
25
|
-
} else {
|
|
26
|
-
const jsonStr = JSON.stringify(value);
|
|
27
|
-
const handle = vm.evalCode(`(${jsonStr})`);
|
|
28
|
-
if (handle.error) {
|
|
29
|
-
handle.error.dispose();
|
|
30
|
-
} else {
|
|
31
|
-
vm.setProp(vm.global, name, handle.value);
|
|
32
|
-
handle.value.dispose();
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
const wrappedCode = `(${code})()`;
|
|
37
|
-
const resultHandle = await vm.evalCodeAsync(wrappedCode);
|
|
38
|
-
if (resultHandle.error) {
|
|
39
|
-
let error = vm.dump(resultHandle.error);
|
|
40
|
-
try {
|
|
41
|
-
resultHandle.error.dispose();
|
|
42
|
-
} catch {
|
|
43
|
-
}
|
|
44
|
-
if (typeof error === "object" && error?.type === "rejected") {
|
|
45
|
-
error = error.reason;
|
|
46
|
-
}
|
|
47
|
-
return {
|
|
48
|
-
result: void 0,
|
|
49
|
-
error: typeof error === "object" && error?.message ? error.message : String(error),
|
|
50
|
-
logs
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
let result = vm.dump(resultHandle.value);
|
|
54
|
-
try {
|
|
55
|
-
resultHandle.value.dispose();
|
|
56
|
-
} catch {
|
|
57
|
-
}
|
|
58
|
-
result = unwrapPromiseResult(result);
|
|
59
|
-
return { result, logs };
|
|
60
|
-
} catch (err) {
|
|
61
|
-
return {
|
|
62
|
-
result: void 0,
|
|
63
|
-
error: err instanceof Error ? err.message : String(err),
|
|
64
|
-
logs
|
|
65
|
-
};
|
|
66
|
-
} finally {
|
|
67
|
-
try {
|
|
68
|
-
vm.dispose();
|
|
69
|
-
} catch {
|
|
70
|
-
}
|
|
71
|
-
try {
|
|
72
|
-
runtime.dispose();
|
|
73
|
-
} catch {
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
function injectConsole(vm, logs) {
|
|
79
|
-
const consoleObj = vm.newObject();
|
|
80
|
-
const logFn = vm.newFunction("log", (...args) => {
|
|
81
|
-
const values = args.map((h) => vm.dump(h));
|
|
82
|
-
logs.push(values.map((v) => typeof v === "string" ? v : JSON.stringify(v)).join(" "));
|
|
83
|
-
});
|
|
84
|
-
vm.setProp(consoleObj, "log", logFn);
|
|
85
|
-
vm.setProp(consoleObj, "warn", logFn);
|
|
86
|
-
vm.setProp(consoleObj, "error", logFn);
|
|
87
|
-
vm.setProp(vm.global, "console", consoleObj);
|
|
88
|
-
logFn.dispose();
|
|
89
|
-
consoleObj.dispose();
|
|
90
|
-
}
|
|
91
|
-
function injectAsyncFunction(vm, name, fn) {
|
|
92
|
-
const handle = vm.newAsyncifiedFunction(name, async (...argHandles) => {
|
|
93
|
-
const args = argHandles.map((h) => vm.dump(h));
|
|
94
|
-
const result = await fn(...args);
|
|
95
|
-
return marshalToVM(vm, result);
|
|
96
|
-
});
|
|
97
|
-
vm.setProp(vm.global, name, handle);
|
|
98
|
-
handle.dispose();
|
|
99
|
-
}
|
|
100
|
-
function injectNamespace(vm, name, ns) {
|
|
101
|
-
const nsObj = vm.newObject();
|
|
102
|
-
for (const [key, value] of Object.entries(ns)) {
|
|
103
|
-
if (typeof value === "function") {
|
|
104
|
-
const handle = vm.newAsyncifiedFunction(key, async (...argHandles) => {
|
|
105
|
-
const args = argHandles.map((h) => vm.dump(h));
|
|
106
|
-
const result = await value(...args);
|
|
107
|
-
return marshalToVM(vm, result);
|
|
108
|
-
});
|
|
109
|
-
vm.setProp(nsObj, key, handle);
|
|
110
|
-
handle.dispose();
|
|
111
|
-
} else {
|
|
112
|
-
const jsonStr = JSON.stringify(value);
|
|
113
|
-
const handle = vm.evalCode(`(${jsonStr})`);
|
|
114
|
-
if (!handle.error) {
|
|
115
|
-
vm.setProp(nsObj, key, handle.value);
|
|
116
|
-
handle.value.dispose();
|
|
117
|
-
} else {
|
|
118
|
-
handle.error.dispose();
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
vm.setProp(vm.global, name, nsObj);
|
|
123
|
-
nsObj.dispose();
|
|
124
|
-
}
|
|
125
|
-
function unwrapPromiseResult(result) {
|
|
126
|
-
if (typeof result === "object" && result !== null && "type" in result && result.type === "fulfilled" && "value" in result) {
|
|
127
|
-
return result.value;
|
|
128
|
-
}
|
|
129
|
-
return result;
|
|
130
|
-
}
|
|
131
|
-
function marshalToVM(vm, value) {
|
|
132
|
-
if (value === void 0 || value === null) return vm.undefined;
|
|
133
|
-
if (typeof value === "string") return vm.newString(value);
|
|
134
|
-
if (typeof value === "number") return vm.newNumber(value);
|
|
135
|
-
if (typeof value === "boolean") return value ? vm.true : vm.false;
|
|
136
|
-
const jsonStr = JSON.stringify(value);
|
|
137
|
-
const result = vm.evalCode(`(${jsonStr})`);
|
|
138
|
-
if (result.error) {
|
|
139
|
-
result.error.dispose();
|
|
140
|
-
return vm.undefined;
|
|
141
|
-
}
|
|
142
|
-
return result.value;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
export {
|
|
146
|
-
QuickJSExecutor
|
|
147
|
-
};
|
|
148
|
-
//# sourceMappingURL=chunk-ZWSO33DZ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/executor/quickjs.ts"],"sourcesContent":["import type { Executor, ExecuteResult, SandboxOptions } from \"../types.js\";\n\n/**\n * Executor implementation using quickjs-emscripten (QuickJS compiled to WASM).\n * Requires `quickjs-emscripten` as a peer dependency.\n *\n * Advantages over isolated-vm:\n * - Pure WASM, no native dependencies (works everywhere including Bun)\n * - WASM-level sandbox isolation\n *\n * Tradeoffs:\n * - ~3-5x slower than V8 for compute (negligible for API orchestration)\n * - Only one async suspension at a time per module\n */\nexport class QuickJSExecutor implements Executor {\n private memoryBytes: number;\n private timeoutMs: number;\n\n constructor(options: SandboxOptions = {}) {\n this.memoryBytes = (options.memoryMB ?? 64) * 1024 * 1024;\n this.timeoutMs = options.timeoutMs ?? 30_000;\n }\n\n async execute(\n code: string,\n globals: Record<string, unknown>,\n ): Promise<ExecuteResult> {\n const qjs = await import(\"quickjs-emscripten\");\n const logs: string[] = [];\n\n // Use the convenience function that manages module/runtime lifecycle\n const vm = await qjs.newAsyncContext();\n const runtime = vm.runtime;\n\n runtime.setMemoryLimit(this.memoryBytes);\n runtime.setMaxStackSize(1024 * 320); // 320KB stack\n\n // Interrupt after timeout\n const deadline = Date.now() + this.timeoutMs;\n runtime.setInterruptHandler(() => Date.now() > deadline);\n\n try {\n // Inject console\n injectConsole(vm, logs);\n\n // Inject globals\n for (const [name, value] of Object.entries(globals)) {\n if (typeof value === \"function\") {\n injectAsyncFunction(vm, name, value as (...args: unknown[]) => unknown);\n } else if (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.values(value as Record<string, unknown>).some((v) => typeof v === \"function\")\n ) {\n injectNamespace(vm, name, value as Record<string, unknown>);\n } else {\n // Inject as JSON data\n const jsonStr = JSON.stringify(value);\n const handle = vm.evalCode(`(${jsonStr})`);\n if (handle.error) {\n handle.error.dispose();\n } else {\n vm.setProp(vm.global, name, handle.value);\n handle.value.dispose();\n }\n }\n }\n\n // Execute the code\n const wrappedCode = `(${code})()`;\n const resultHandle = await vm.evalCodeAsync(wrappedCode);\n\n if (resultHandle.error) {\n let error = vm.dump(resultHandle.error);\n try { resultHandle.error.dispose(); } catch { /* already disposed */ }\n // Unwrap rejected promise wrapper\n if (typeof error === \"object\" && error?.type === \"rejected\") {\n error = error.reason;\n }\n return {\n result: undefined,\n error: typeof error === \"object\" && error?.message ? error.message : String(error),\n logs,\n };\n }\n\n let result = vm.dump(resultHandle.value);\n // The value handle from async evaluation may already be managed/disposed\n // by the runtime, so we guard the dispose call\n try { resultHandle.value.dispose(); } catch { /* already disposed */ }\n\n // evalCodeAsync wraps async results as { type: 'fulfilled', value } or { type: 'rejected', reason }\n result = unwrapPromiseResult(result);\n\n return { result, logs };\n } catch (err) {\n return {\n result: undefined,\n error: err instanceof Error ? err.message : String(err),\n logs,\n };\n } finally {\n // Dispose context first, then runtime\n // Use try/catch because quickjs-emscripten can throw during\n // cleanup when host references are freed\n try { vm.dispose(); } catch { /* ignore cleanup errors */ }\n try { runtime.dispose(); } catch { /* ignore cleanup errors */ }\n }\n }\n}\n\nfunction injectConsole(vm: any, logs: string[]): void {\n const consoleObj = vm.newObject();\n\n const logFn = vm.newFunction(\"log\", (...args: any[]) => {\n const values = args.map((h: any) => vm.dump(h));\n logs.push(values.map((v: unknown) => (typeof v === \"string\" ? v : JSON.stringify(v))).join(\" \"));\n });\n\n vm.setProp(consoleObj, \"log\", logFn);\n vm.setProp(consoleObj, \"warn\", logFn);\n vm.setProp(consoleObj, \"error\", logFn);\n vm.setProp(vm.global, \"console\", consoleObj);\n\n logFn.dispose();\n consoleObj.dispose();\n}\n\nfunction injectAsyncFunction(\n vm: any,\n name: string,\n fn: (...args: unknown[]) => unknown,\n): void {\n const handle = vm.newAsyncifiedFunction(name, async (...argHandles: any[]) => {\n const args = argHandles.map((h: any) => vm.dump(h));\n const result = await fn(...args);\n return marshalToVM(vm, result);\n });\n vm.setProp(vm.global, name, handle);\n handle.dispose();\n}\n\nfunction injectNamespace(\n vm: any,\n name: string,\n ns: Record<string, unknown>,\n): void {\n const nsObj = vm.newObject();\n\n for (const [key, value] of Object.entries(ns)) {\n if (typeof value === \"function\") {\n const handle = vm.newAsyncifiedFunction(key, async (...argHandles: any[]) => {\n const args = argHandles.map((h: any) => vm.dump(h));\n const result = await value(...args);\n return marshalToVM(vm, result);\n });\n vm.setProp(nsObj, key, handle);\n handle.dispose();\n } else {\n const jsonStr = JSON.stringify(value);\n const handle = vm.evalCode(`(${jsonStr})`);\n if (!handle.error) {\n vm.setProp(nsObj, key, handle.value);\n handle.value.dispose();\n } else {\n handle.error.dispose();\n }\n }\n }\n\n vm.setProp(vm.global, name, nsObj);\n nsObj.dispose();\n}\n\n/**\n * When evalCodeAsync runs an async arrow function, the dump of the result\n * is `{ type: 'fulfilled', value: X }` instead of just `X`.\n * This unwraps it.\n */\nfunction unwrapPromiseResult(result: unknown): unknown {\n if (\n typeof result === \"object\" &&\n result !== null &&\n \"type\" in result &&\n (result as any).type === \"fulfilled\" &&\n \"value\" in result\n ) {\n return (result as any).value;\n }\n return result;\n}\n\nfunction marshalToVM(vm: any, value: unknown): any {\n if (value === undefined || value === null) return vm.undefined;\n if (typeof value === \"string\") return vm.newString(value);\n if (typeof value === \"number\") return vm.newNumber(value);\n if (typeof value === \"boolean\") return value ? vm.true : vm.false;\n\n // For objects/arrays, serialize to JSON and parse inside VM\n const jsonStr = JSON.stringify(value);\n const result = vm.evalCode(`(${jsonStr})`);\n if (result.error) {\n result.error.dispose();\n return vm.undefined;\n }\n return result.value;\n}\n"],"mappings":";AAcO,IAAM,kBAAN,MAA0C;AAAA,EACvC;AAAA,EACA;AAAA,EAER,YAAY,UAA0B,CAAC,GAAG;AACxC,SAAK,eAAe,QAAQ,YAAY,MAAM,OAAO;AACrD,SAAK,YAAY,QAAQ,aAAa;AAAA,EACxC;AAAA,EAEA,MAAM,QACJ,MACA,SACwB;AACxB,UAAM,MAAM,MAAM,OAAO,oBAAoB;AAC7C,UAAM,OAAiB,CAAC;AAGxB,UAAM,KAAK,MAAM,IAAI,gBAAgB;AACrC,UAAM,UAAU,GAAG;AAEnB,YAAQ,eAAe,KAAK,WAAW;AACvC,YAAQ,gBAAgB,OAAO,GAAG;AAGlC,UAAM,WAAW,KAAK,IAAI,IAAI,KAAK;AACnC,YAAQ,oBAAoB,MAAM,KAAK,IAAI,IAAI,QAAQ;AAEvD,QAAI;AAEF,oBAAc,IAAI,IAAI;AAGtB,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACnD,YAAI,OAAO,UAAU,YAAY;AAC/B,8BAAoB,IAAI,MAAM,KAAwC;AAAA,QACxE,WACE,OAAO,UAAU,YACjB,UAAU,QACV,CAAC,MAAM,QAAQ,KAAK,KACpB,OAAO,OAAO,KAAgC,EAAE,KAAK,CAAC,MAAM,OAAO,MAAM,UAAU,GACnF;AACA,0BAAgB,IAAI,MAAM,KAAgC;AAAA,QAC5D,OAAO;AAEL,gBAAM,UAAU,KAAK,UAAU,KAAK;AACpC,gBAAM,SAAS,GAAG,SAAS,IAAI,OAAO,GAAG;AACzC,cAAI,OAAO,OAAO;AAChB,mBAAO,MAAM,QAAQ;AAAA,UACvB,OAAO;AACL,eAAG,QAAQ,GAAG,QAAQ,MAAM,OAAO,KAAK;AACxC,mBAAO,MAAM,QAAQ;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAGA,YAAM,cAAc,IAAI,IAAI;AAC5B,YAAM,eAAe,MAAM,GAAG,cAAc,WAAW;AAEvD,UAAI,aAAa,OAAO;AACtB,YAAI,QAAQ,GAAG,KAAK,aAAa,KAAK;AACtC,YAAI;AAAE,uBAAa,MAAM,QAAQ;AAAA,QAAG,QAAQ;AAAA,QAAyB;AAErE,YAAI,OAAO,UAAU,YAAY,OAAO,SAAS,YAAY;AAC3D,kBAAQ,MAAM;AAAA,QAChB;AACA,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,MAAM,UAAU,OAAO,KAAK;AAAA,UACjF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,SAAS,GAAG,KAAK,aAAa,KAAK;AAGvC,UAAI;AAAE,qBAAa,MAAM,QAAQ;AAAA,MAAG,QAAQ;AAAA,MAAyB;AAGrE,eAAS,oBAAoB,MAAM;AAEnC,aAAO,EAAE,QAAQ,KAAK;AAAA,IACxB,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACtD;AAAA,MACF;AAAA,IACF,UAAE;AAIA,UAAI;AAAE,WAAG,QAAQ;AAAA,MAAG,QAAQ;AAAA,MAA8B;AAC1D,UAAI;AAAE,gBAAQ,QAAQ;AAAA,MAAG,QAAQ;AAAA,MAA8B;AAAA,IACjE;AAAA,EACF;AACF;AAEA,SAAS,cAAc,IAAS,MAAsB;AACpD,QAAM,aAAa,GAAG,UAAU;AAEhC,QAAM,QAAQ,GAAG,YAAY,OAAO,IAAI,SAAgB;AACtD,UAAM,SAAS,KAAK,IAAI,CAAC,MAAW,GAAG,KAAK,CAAC,CAAC;AAC9C,SAAK,KAAK,OAAO,IAAI,CAAC,MAAgB,OAAO,MAAM,WAAW,IAAI,KAAK,UAAU,CAAC,CAAE,EAAE,KAAK,GAAG,CAAC;AAAA,EACjG,CAAC;AAED,KAAG,QAAQ,YAAY,OAAO,KAAK;AACnC,KAAG,QAAQ,YAAY,QAAQ,KAAK;AACpC,KAAG,QAAQ,YAAY,SAAS,KAAK;AACrC,KAAG,QAAQ,GAAG,QAAQ,WAAW,UAAU;AAE3C,QAAM,QAAQ;AACd,aAAW,QAAQ;AACrB;AAEA,SAAS,oBACP,IACA,MACA,IACM;AACN,QAAM,SAAS,GAAG,sBAAsB,MAAM,UAAU,eAAsB;AAC5E,UAAM,OAAO,WAAW,IAAI,CAAC,MAAW,GAAG,KAAK,CAAC,CAAC;AAClD,UAAM,SAAS,MAAM,GAAG,GAAG,IAAI;AAC/B,WAAO,YAAY,IAAI,MAAM;AAAA,EAC/B,CAAC;AACD,KAAG,QAAQ,GAAG,QAAQ,MAAM,MAAM;AAClC,SAAO,QAAQ;AACjB;AAEA,SAAS,gBACP,IACA,MACA,IACM;AACN,QAAM,QAAQ,GAAG,UAAU;AAE3B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,EAAE,GAAG;AAC7C,QAAI,OAAO,UAAU,YAAY;AAC/B,YAAM,SAAS,GAAG,sBAAsB,KAAK,UAAU,eAAsB;AAC3E,cAAM,OAAO,WAAW,IAAI,CAAC,MAAW,GAAG,KAAK,CAAC,CAAC;AAClD,cAAM,SAAS,MAAM,MAAM,GAAG,IAAI;AAClC,eAAO,YAAY,IAAI,MAAM;AAAA,MAC/B,CAAC;AACD,SAAG,QAAQ,OAAO,KAAK,MAAM;AAC7B,aAAO,QAAQ;AAAA,IACjB,OAAO;AACL,YAAM,UAAU,KAAK,UAAU,KAAK;AACpC,YAAM,SAAS,GAAG,SAAS,IAAI,OAAO,GAAG;AACzC,UAAI,CAAC,OAAO,OAAO;AACjB,WAAG,QAAQ,OAAO,KAAK,OAAO,KAAK;AACnC,eAAO,MAAM,QAAQ;AAAA,MACvB,OAAO;AACL,eAAO,MAAM,QAAQ;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,KAAG,QAAQ,GAAG,QAAQ,MAAM,KAAK;AACjC,QAAM,QAAQ;AAChB;AAOA,SAAS,oBAAoB,QAA0B;AACrD,MACE,OAAO,WAAW,YAClB,WAAW,QACX,UAAU,UACT,OAAe,SAAS,eACzB,WAAW,QACX;AACA,WAAQ,OAAe;AAAA,EACzB;AACA,SAAO;AACT;AAEA,SAAS,YAAY,IAAS,OAAqB;AACjD,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO,GAAG;AACrD,MAAI,OAAO,UAAU,SAAU,QAAO,GAAG,UAAU,KAAK;AACxD,MAAI,OAAO,UAAU,SAAU,QAAO,GAAG,UAAU,KAAK;AACxD,MAAI,OAAO,UAAU,UAAW,QAAO,QAAQ,GAAG,OAAO,GAAG;AAG5D,QAAM,UAAU,KAAK,UAAU,KAAK;AACpC,QAAM,SAAS,GAAG,SAAS,IAAI,OAAO,GAAG;AACzC,MAAI,OAAO,OAAO;AAChB,WAAO,MAAM,QAAQ;AACrB,WAAO,GAAG;AAAA,EACZ;AACA,SAAO,OAAO;AAChB;","names":[]}
|
package/dist/quickjs-BGVQS2YE.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
File without changes
|