@ricsam/quickjs-core 0.0.1 → 0.2.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.
Files changed (79) hide show
  1. package/README.md +36 -43
  2. package/dist/cjs/blob.cjs +197 -0
  3. package/dist/cjs/blob.cjs.map +10 -0
  4. package/dist/cjs/class-builder.cjs +244 -0
  5. package/dist/cjs/class-builder.cjs.map +10 -0
  6. package/dist/cjs/dom-exception.cjs +95 -0
  7. package/dist/cjs/dom-exception.cjs.map +10 -0
  8. package/dist/cjs/file.cjs +234 -0
  9. package/dist/cjs/file.cjs.map +10 -0
  10. package/dist/cjs/function-builder.cjs +70 -0
  11. package/dist/cjs/function-builder.cjs.map +10 -0
  12. package/dist/cjs/index.cjs +143 -0
  13. package/dist/cjs/index.cjs.map +10 -0
  14. package/dist/cjs/marshal.cjs +191 -0
  15. package/dist/cjs/marshal.cjs.map +10 -0
  16. package/dist/cjs/package.json +5 -0
  17. package/dist/cjs/readable-stream.cjs +588 -0
  18. package/dist/cjs/readable-stream.cjs.map +10 -0
  19. package/dist/cjs/scope.cjs +76 -0
  20. package/dist/cjs/scope.cjs.map +10 -0
  21. package/dist/cjs/transform-stream.cjs +152 -0
  22. package/dist/cjs/transform-stream.cjs.map +10 -0
  23. package/dist/cjs/types.cjs +39 -0
  24. package/dist/cjs/types.cjs.map +10 -0
  25. package/dist/cjs/unmarshal.cjs +254 -0
  26. package/dist/cjs/unmarshal.cjs.map +10 -0
  27. package/dist/cjs/url-search-params.cjs +165 -0
  28. package/dist/cjs/url-search-params.cjs.map +10 -0
  29. package/dist/cjs/url.cjs +183 -0
  30. package/dist/cjs/url.cjs.map +10 -0
  31. package/dist/cjs/writable-stream.cjs +513 -0
  32. package/dist/cjs/writable-stream.cjs.map +10 -0
  33. package/dist/mjs/blob.mjs +166 -0
  34. package/dist/mjs/blob.mjs.map +10 -0
  35. package/dist/mjs/class-builder.mjs +213 -0
  36. package/dist/mjs/class-builder.mjs.map +10 -0
  37. package/dist/mjs/dom-exception.mjs +64 -0
  38. package/dist/mjs/dom-exception.mjs.map +10 -0
  39. package/dist/mjs/file.mjs +203 -0
  40. package/dist/mjs/file.mjs.map +10 -0
  41. package/dist/mjs/function-builder.mjs +39 -0
  42. package/dist/mjs/function-builder.mjs.map +10 -0
  43. package/dist/mjs/index.mjs +132 -0
  44. package/dist/mjs/index.mjs.map +10 -0
  45. package/dist/mjs/marshal.mjs +160 -0
  46. package/dist/mjs/marshal.mjs.map +10 -0
  47. package/dist/mjs/package.json +5 -0
  48. package/dist/mjs/readable-stream.mjs +557 -0
  49. package/dist/mjs/readable-stream.mjs.map +10 -0
  50. package/dist/mjs/scope.mjs +45 -0
  51. package/dist/mjs/scope.mjs.map +10 -0
  52. package/dist/mjs/transform-stream.mjs +121 -0
  53. package/dist/mjs/transform-stream.mjs.map +10 -0
  54. package/dist/mjs/types.mjs +8 -0
  55. package/dist/mjs/types.mjs.map +10 -0
  56. package/dist/mjs/unmarshal.mjs +223 -0
  57. package/dist/mjs/unmarshal.mjs.map +10 -0
  58. package/dist/mjs/url-search-params.mjs +134 -0
  59. package/dist/mjs/url-search-params.mjs.map +10 -0
  60. package/dist/mjs/url.mjs +152 -0
  61. package/dist/mjs/url.mjs.map +10 -0
  62. package/dist/mjs/writable-stream.mjs +482 -0
  63. package/dist/mjs/writable-stream.mjs.map +10 -0
  64. package/dist/types/blob.d.ts +19 -0
  65. package/dist/types/class-builder.d.ts +62 -0
  66. package/dist/types/dom-exception.d.ts +8 -0
  67. package/dist/types/file.d.ts +10 -0
  68. package/dist/types/function-builder.d.ts +23 -0
  69. package/dist/types/index.d.ts +45 -0
  70. package/dist/types/marshal.d.ts +30 -0
  71. package/dist/types/scope.d.ts +18 -0
  72. package/dist/types/streams/readable-stream.d.ts +18 -0
  73. package/dist/types/streams/transform-stream.d.ts +6 -0
  74. package/dist/types/streams/writable-stream.d.ts +14 -0
  75. package/dist/types/types.d.ts +83 -0
  76. package/dist/types/unmarshal.d.ts +14 -0
  77. package/dist/types/url-search-params.d.ts +12 -0
  78. package/dist/types/url.d.ts +30 -0
  79. package/package.json +50 -6
package/README.md CHANGED
@@ -1,45 +1,38 @@
1
1
  # @ricsam/quickjs-core
2
2
 
3
- ## ⚠️ IMPORTANT NOTICE ⚠️
4
-
5
- **This package is created solely for the purpose of setting up OIDC (OpenID Connect) trusted publishing with npm.**
6
-
7
- This is **NOT** a functional package and contains **NO** code or functionality beyond the OIDC setup configuration.
8
-
9
- ## Purpose
10
-
11
- This package exists to:
12
- 1. Configure OIDC trusted publishing for the package name `@ricsam/quickjs-core`
13
- 2. Enable secure, token-less publishing from CI/CD workflows
14
- 3. Establish provenance for packages published under this name
15
-
16
- ## What is OIDC Trusted Publishing?
17
-
18
- OIDC trusted publishing allows package maintainers to publish packages directly from their CI/CD workflows without needing to manage npm access tokens. Instead, it uses OpenID Connect to establish trust between the CI/CD provider (like GitHub Actions) and npm.
19
-
20
- ## Setup Instructions
21
-
22
- To properly configure OIDC trusted publishing for this package:
23
-
24
- 1. Go to [npmjs.com](https://www.npmjs.com/) and navigate to your package settings
25
- 2. Configure the trusted publisher (e.g., GitHub Actions)
26
- 3. Specify the repository and workflow that should be allowed to publish
27
- 4. Use the configured workflow to publish your actual package
28
-
29
- ## DO NOT USE THIS PACKAGE
30
-
31
- This package is a placeholder for OIDC configuration only. It:
32
- - Contains no executable code
33
- - Provides no functionality
34
- - Should not be installed as a dependency
35
- - Exists only for administrative purposes
36
-
37
- ## More Information
38
-
39
- For more details about npm's trusted publishing feature, see:
40
- - [npm Trusted Publishing Documentation](https://docs.npmjs.com/generating-provenance-statements)
41
- - [GitHub Actions OIDC Documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
42
-
43
- ---
44
-
45
- **Maintained for OIDC setup purposes only**
3
+ Core utilities and Web Streams API.
4
+
5
+ ```typescript
6
+ import { setupCore } from "@ricsam/quickjs-core";
7
+
8
+ const handle = setupCore(context);
9
+ ```
10
+
11
+ **Injected Globals:**
12
+ - `ReadableStream`, `WritableStream`, `TransformStream`
13
+ - `ReadableStreamDefaultReader`, `WritableStreamDefaultWriter`
14
+ - `Blob`, `File`
15
+
16
+ **Usage in QuickJS:**
17
+
18
+ ```javascript
19
+ // Streams
20
+ const stream = new ReadableStream({
21
+ start(controller) {
22
+ controller.enqueue("chunk1");
23
+ controller.enqueue("chunk2");
24
+ controller.close();
25
+ }
26
+ });
27
+
28
+ const reader = stream.getReader();
29
+ const { value, done } = await reader.read();
30
+
31
+ // Blob
32
+ const blob = new Blob(["hello", " ", "world"], { type: "text/plain" });
33
+ const text = await blob.text(); // "hello world"
34
+
35
+ // File
36
+ const file = new File(["content"], "file.txt", { type: "text/plain" });
37
+ console.log(file.name); // "file.txt"
38
+ ```
@@ -0,0 +1,197 @@
1
+ // @bun @bun-cjs
2
+ (function(exports, require, module, __filename, __dirname) {var __defProp = Object.defineProperty;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
7
+ var __toCommonJS = (from) => {
8
+ var entry = __moduleCache.get(from), desc;
9
+ if (entry)
10
+ return entry;
11
+ entry = __defProp({}, "__esModule", { value: true });
12
+ if (from && typeof from === "object" || typeof from === "function")
13
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
14
+ get: () => from[key],
15
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
+ }));
17
+ __moduleCache.set(from, entry);
18
+ return entry;
19
+ };
20
+ var __export = (target, all) => {
21
+ for (var name in all)
22
+ __defProp(target, name, {
23
+ get: all[name],
24
+ enumerable: true,
25
+ configurable: true,
26
+ set: (newValue) => all[name] = () => newValue
27
+ });
28
+ };
29
+
30
+ // packages/core/src/blob.ts
31
+ var exports_blob = {};
32
+ __export(exports_blob, {
33
+ createBlobClass: () => createBlobClass,
34
+ createBlob: () => createBlob
35
+ });
36
+ module.exports = __toCommonJS(exports_blob);
37
+ var import_class_builder = require("./class-builder.ts");
38
+ function normalizeParts(parts) {
39
+ const result = [];
40
+ for (const part of parts) {
41
+ if (typeof part === "string") {
42
+ result.push(new TextEncoder().encode(part));
43
+ } else if (part instanceof Uint8Array) {
44
+ result.push(part);
45
+ } else if (part instanceof ArrayBuffer) {
46
+ result.push(new Uint8Array(part));
47
+ } else if (ArrayBuffer.isView(part)) {
48
+ result.push(new Uint8Array(part.buffer, part.byteOffset, part.byteLength));
49
+ } else if (part && typeof part === "object") {
50
+ if ("byteLength" in part && typeof part.byteLength === "number") {
51
+ try {
52
+ result.push(new Uint8Array(part));
53
+ } catch {
54
+ if ("buffer" in part && "byteOffset" in part) {
55
+ const view = part;
56
+ try {
57
+ result.push(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));
58
+ } catch {}
59
+ }
60
+ }
61
+ } else if ("parts" in part) {
62
+ const blobParts = part.parts;
63
+ result.push(...blobParts);
64
+ }
65
+ }
66
+ }
67
+ return result;
68
+ }
69
+ function concatenateParts(parts) {
70
+ const totalLength = parts.reduce((sum, part) => sum + part.length, 0);
71
+ const result = new Uint8Array(totalLength);
72
+ let offset = 0;
73
+ for (const part of parts) {
74
+ result.set(part, offset);
75
+ offset += part.length;
76
+ }
77
+ return result;
78
+ }
79
+ function createBlobClass(context, stateMap, createStream) {
80
+ return import_class_builder.defineClass(context, stateMap, {
81
+ name: "Blob",
82
+ construct: (args) => {
83
+ const blobParts = args[0];
84
+ const options = args[1];
85
+ const parts = blobParts ? normalizeParts(blobParts) : [];
86
+ const size = parts.reduce((sum, part) => sum + part.length, 0);
87
+ const type = options?.type ?? "";
88
+ return { parts, type, size };
89
+ },
90
+ properties: {
91
+ size: {
92
+ get() {
93
+ return this.size;
94
+ }
95
+ },
96
+ type: {
97
+ get() {
98
+ return this.type;
99
+ }
100
+ }
101
+ },
102
+ methods: {
103
+ async text() {
104
+ const data = concatenateParts(this.parts);
105
+ return new TextDecoder().decode(data);
106
+ },
107
+ async arrayBuffer() {
108
+ const data = concatenateParts(this.parts);
109
+ return data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
110
+ },
111
+ async bytes() {
112
+ return concatenateParts(this.parts);
113
+ },
114
+ slice(start, end, contentType) {
115
+ const data = concatenateParts(this.parts);
116
+ const startIndex = typeof start === "number" ? start : 0;
117
+ const endIndex = typeof end === "number" ? end : data.length;
118
+ const sliced = data.slice(startIndex, endIndex);
119
+ return {
120
+ parts: [sliced],
121
+ type: typeof contentType === "string" ? contentType : this.type,
122
+ size: sliced.length
123
+ };
124
+ },
125
+ stream() {
126
+ const data = concatenateParts(this.parts);
127
+ let offset = 0;
128
+ const chunkSize = 65536;
129
+ return createStream({
130
+ pull(controller) {
131
+ if (offset >= data.length) {
132
+ controller.close();
133
+ return;
134
+ }
135
+ const chunk = data.slice(offset, Math.min(offset + chunkSize, data.length));
136
+ offset += chunk.length;
137
+ controller.enqueue(chunk);
138
+ }
139
+ });
140
+ }
141
+ }
142
+ });
143
+ }
144
+ function createBlob(context, stateMap, parts, options) {
145
+ const BlobConstructor = context.getProp(context.global, "Blob");
146
+ const partsHandle = context.newArray();
147
+ for (let i = 0;i < parts.length; i++) {
148
+ const part = parts[i];
149
+ let partHandle;
150
+ if (typeof part === "string") {
151
+ partHandle = context.newString(part);
152
+ } else if (part instanceof ArrayBuffer) {
153
+ partHandle = context.newArrayBuffer(part);
154
+ } else if (part instanceof Uint8Array) {
155
+ partHandle = context.newArrayBuffer(part.buffer.slice(part.byteOffset, part.byteOffset + part.byteLength));
156
+ } else if (part instanceof Blob) {
157
+ partHandle = context.newString("[Blob]");
158
+ } else {
159
+ partHandle = context.newString(String(part));
160
+ }
161
+ context.setProp(partsHandle, i, partHandle);
162
+ partHandle.dispose();
163
+ }
164
+ const optionsHandle = context.newObject();
165
+ if (options?.type) {
166
+ const typeHandle = context.newString(options.type);
167
+ context.setProp(optionsHandle, "type", typeHandle);
168
+ typeHandle.dispose();
169
+ }
170
+ BlobConstructor.dispose();
171
+ context.setProp(context.global, "__tempBlobParts__", partsHandle);
172
+ context.setProp(context.global, "__tempBlobOptions__", optionsHandle);
173
+ partsHandle.dispose();
174
+ optionsHandle.dispose();
175
+ const result = context.evalCode("new Blob(__tempBlobParts__, __tempBlobOptions__)");
176
+ const cleanup1 = context.evalCode("delete globalThis.__tempBlobParts__");
177
+ const cleanup2 = context.evalCode("delete globalThis.__tempBlobOptions__");
178
+ if (cleanup1.error)
179
+ cleanup1.error.dispose();
180
+ else
181
+ cleanup1.value.dispose();
182
+ if (cleanup2.error)
183
+ cleanup2.error.dispose();
184
+ else
185
+ cleanup2.value.dispose();
186
+ if (result.error) {
187
+ const msgHandle = context.getProp(result.error, "message");
188
+ const errorMsg = context.dump(msgHandle);
189
+ msgHandle.dispose();
190
+ result.error.dispose();
191
+ throw new Error(`Failed to create Blob: ${errorMsg}`);
192
+ }
193
+ return result.value;
194
+ }
195
+ })
196
+
197
+ //# debugId=C785F725C30E4CB464756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/blob.ts"],
4
+ "sourcesContent": [
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"./types.ts\";\nimport { defineClass } from \"./class-builder.ts\";\n\n/**\n * Type for the stream factory function\n */\ntype StreamFactory = (source: UnderlyingSource) => QuickJSHandle;\n\ninterface BlobInternalState {\n parts: Uint8Array[];\n type: string;\n size: number;\n}\n\n/**\n * Normalize blob parts to Uint8Array\n * Handles various input types including cross-realm ArrayBuffer/Uint8Array\n */\nfunction normalizeParts(parts: unknown[]): Uint8Array[] {\n const result: Uint8Array[] = [];\n\n for (const part of parts) {\n if (typeof part === \"string\") {\n result.push(new TextEncoder().encode(part));\n } else if (part instanceof Uint8Array) {\n result.push(part);\n } else if (part instanceof ArrayBuffer) {\n result.push(new Uint8Array(part));\n } else if (ArrayBuffer.isView(part)) {\n result.push(new Uint8Array(part.buffer, part.byteOffset, part.byteLength));\n } else if (part && typeof part === \"object\") {\n // Handle cross-realm or duck-typed ArrayBuffer-like objects\n if (\"byteLength\" in part && typeof (part as ArrayBuffer).byteLength === \"number\") {\n try {\n // Try as ArrayBuffer\n result.push(new Uint8Array(part as ArrayBuffer));\n } catch {\n // If that fails, try as TypedArray-like with buffer property\n if (\"buffer\" in part && \"byteOffset\" in part) {\n const view = part as ArrayBufferView;\n try {\n result.push(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));\n } catch {\n // Skip invalid parts\n }\n }\n }\n } else if (\"parts\" in part) {\n // Another Blob-like object\n const blobParts = (part as BlobInternalState).parts;\n result.push(...blobParts);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Concatenate Uint8Arrays into a single Uint8Array\n */\nfunction concatenateParts(parts: Uint8Array[]): Uint8Array {\n const totalLength = parts.reduce((sum, part) => sum + part.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n return result;\n}\n\n/**\n * Create the Blob class for QuickJS\n *\n * @param context - QuickJS context\n * @param stateMap - State map for internal state tracking\n * @param createStream - Factory function to create ReadableStream handles\n */\nexport function createBlobClass(\n context: QuickJSContext,\n stateMap: StateMap,\n createStream: StreamFactory\n): QuickJSHandle {\n return defineClass<BlobInternalState>(context, stateMap, {\n name: \"Blob\",\n construct: (args) => {\n const blobParts = args[0] as unknown[] | undefined;\n const options = args[1] as { type?: string } | undefined;\n\n const parts = blobParts ? normalizeParts(blobParts) : [];\n const size = parts.reduce((sum, part) => sum + part.length, 0);\n const type = options?.type ?? \"\";\n\n return { parts, type, size };\n },\n properties: {\n size: {\n get(this: BlobInternalState) {\n return this.size;\n },\n },\n type: {\n get(this: BlobInternalState) {\n return this.type;\n },\n },\n },\n methods: {\n async text(this: BlobInternalState): Promise<string> {\n const data = concatenateParts(this.parts);\n return new TextDecoder().decode(data);\n },\n async arrayBuffer(this: BlobInternalState): Promise<ArrayBuffer> {\n const data = concatenateParts(this.parts);\n return data.buffer.slice(\n data.byteOffset,\n data.byteOffset + data.byteLength\n ) as ArrayBuffer;\n },\n async bytes(this: BlobInternalState): Promise<Uint8Array> {\n return concatenateParts(this.parts);\n },\n slice(\n this: BlobInternalState,\n start?: unknown,\n end?: unknown,\n contentType?: unknown\n ): BlobInternalState {\n const data = concatenateParts(this.parts);\n const startIndex = typeof start === \"number\" ? start : 0;\n const endIndex = typeof end === \"number\" ? end : data.length;\n const sliced = data.slice(startIndex, endIndex);\n\n return {\n parts: [sliced],\n type: typeof contentType === \"string\" ? contentType : this.type,\n size: sliced.length,\n };\n },\n stream(this: BlobInternalState): QuickJSHandle {\n const data = concatenateParts(this.parts);\n let offset = 0;\n const chunkSize = 65536; // 64KB chunks\n\n // Create an actual ReadableStream using the factory\n return createStream({\n pull(controller) {\n if (offset >= data.length) {\n controller.close();\n return;\n }\n\n const chunk = data.slice(offset, Math.min(offset + chunkSize, data.length));\n offset += chunk.length;\n controller.enqueue(chunk);\n },\n });\n },\n },\n });\n}\n\n/**\n * Create a Blob in QuickJS from host data\n */\nexport function createBlob(\n context: QuickJSContext,\n stateMap: StateMap,\n parts: BlobPart[],\n options?: BlobPropertyBag\n): QuickJSHandle {\n // Get the Blob constructor from global\n const BlobConstructor = context.getProp(context.global, \"Blob\");\n\n // Marshal the parts\n const partsHandle = context.newArray();\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n let partHandle: QuickJSHandle;\n\n if (typeof part === \"string\") {\n partHandle = context.newString(part);\n } else if (part instanceof ArrayBuffer) {\n partHandle = context.newArrayBuffer(part);\n } else if (part instanceof Uint8Array) {\n partHandle = context.newArrayBuffer(\n part.buffer.slice(part.byteOffset, part.byteOffset + part.byteLength)\n );\n } else if (part instanceof Blob) {\n // For Blob, we need to get its array buffer\n // This is async in reality, so we simplify here\n partHandle = context.newString(\"[Blob]\");\n } else {\n partHandle = context.newString(String(part));\n }\n\n context.setProp(partsHandle, i, partHandle);\n partHandle.dispose();\n }\n\n // Marshal options\n const optionsHandle = context.newObject();\n if (options?.type) {\n const typeHandle = context.newString(options.type);\n context.setProp(optionsHandle, \"type\", typeHandle);\n typeHandle.dispose();\n }\n\n BlobConstructor.dispose();\n\n // Set temporary globals for evalCode\n context.setProp(context.global, \"__tempBlobParts__\", partsHandle);\n context.setProp(context.global, \"__tempBlobOptions__\", optionsHandle);\n partsHandle.dispose();\n optionsHandle.dispose();\n\n // Create Blob using evalCode with 'new' (callFunction doesn't work with constructors)\n const result = context.evalCode(\n \"new Blob(__tempBlobParts__, __tempBlobOptions__)\"\n );\n\n // Clean up temporary globals\n const cleanup1 = context.evalCode(\"delete globalThis.__tempBlobParts__\");\n const cleanup2 = context.evalCode(\"delete globalThis.__tempBlobOptions__\");\n if (cleanup1.error) cleanup1.error.dispose();\n else cleanup1.value.dispose();\n if (cleanup2.error) cleanup2.error.dispose();\n else cleanup2.value.dispose();\n\n if (result.error) {\n const msgHandle = context.getProp(result.error, \"message\");\n const errorMsg = context.dump(msgHandle);\n msgHandle.dispose();\n result.error.dispose();\n throw new Error(`Failed to create Blob: ${errorMsg}`);\n }\n\n return result.value;\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "C785F725C30E4CB464756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,244 @@
1
+ // @bun @bun-cjs
2
+ (function(exports, require, module, __filename, __dirname) {var __defProp = Object.defineProperty;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
7
+ var __toCommonJS = (from) => {
8
+ var entry = __moduleCache.get(from), desc;
9
+ if (entry)
10
+ return entry;
11
+ entry = __defProp({}, "__esModule", { value: true });
12
+ if (from && typeof from === "object" || typeof from === "function")
13
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
14
+ get: () => from[key],
15
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
+ }));
17
+ __moduleCache.set(from, entry);
18
+ return entry;
19
+ };
20
+ var __export = (target, all) => {
21
+ for (var name in all)
22
+ __defProp(target, name, {
23
+ get: all[name],
24
+ enumerable: true,
25
+ configurable: true,
26
+ set: (newValue) => all[name] = () => newValue
27
+ });
28
+ };
29
+
30
+ // packages/core/src/class-builder.ts
31
+ var exports_class_builder = {};
32
+ __export(exports_class_builder, {
33
+ setState: () => setState,
34
+ setInstanceState: () => setInstanceState,
35
+ getState: () => getState,
36
+ getInstanceStateById: () => getInstanceStateById,
37
+ getInstanceState: () => getInstanceState,
38
+ defineClass: () => defineClass,
39
+ createStateMap: () => createStateMap,
40
+ clearAllInstanceState: () => clearAllInstanceState,
41
+ cleanupInstanceState: () => cleanupInstanceState
42
+ });
43
+ module.exports = __toCommonJS(exports_class_builder);
44
+ var import_unmarshal = require("./unmarshal.ts");
45
+ var import_marshal = require("./marshal.ts");
46
+ function createStateMap() {
47
+ return new WeakMap;
48
+ }
49
+ function getState(stateMap, handle) {
50
+ return stateMap.get(handle);
51
+ }
52
+ function setState(stateMap, handle, state) {
53
+ stateMap.set(handle, state);
54
+ }
55
+ var instanceIdCounter = 0;
56
+ var instanceStateMap = new Map;
57
+ function defineClass(context, stateMap, definition) {
58
+ const className = definition.name;
59
+ const existingHostCall = context.getProp(context.global, "__hostCall__");
60
+ const hasHostCall = context.typeof(existingHostCall) === "function";
61
+ existingHostCall.dispose();
62
+ if (!hasHostCall) {
63
+ const hostCallFn = context.newFunction("__hostCall__", (classNameHandle, actionHandle, instanceIdHandle, ...argHandles) => {
64
+ const classNameStr = context.getString(classNameHandle);
65
+ const action = context.getString(actionHandle);
66
+ const instanceId = context.getNumber(instanceIdHandle);
67
+ const args = argHandles.map((h) => import_unmarshal.unmarshal(context, h));
68
+ const callbacks2 = classCallbackRegistry.get(classNameStr);
69
+ if (!callbacks2) {
70
+ throw context.newError(`No callbacks registered for class ${classNameStr}`);
71
+ }
72
+ const state = instanceStateMap.get(instanceId);
73
+ try {
74
+ let result2;
75
+ if (action === "__construct__") {
76
+ if (callbacks2.construct) {
77
+ const newState = callbacks2.construct(args);
78
+ instanceStateMap.set(instanceId, newState);
79
+ result2 = undefined;
80
+ }
81
+ } else if (action.startsWith("get:")) {
82
+ const propName = action.slice(4);
83
+ const getter = callbacks2.properties?.[propName]?.get;
84
+ if (getter && state) {
85
+ result2 = getter.call(state);
86
+ }
87
+ } else if (action.startsWith("set:")) {
88
+ const propName = action.slice(4);
89
+ const setter = callbacks2.properties?.[propName]?.set;
90
+ if (setter && state) {
91
+ setter.call(state, args[0]);
92
+ }
93
+ result2 = undefined;
94
+ } else if (action.startsWith("static:")) {
95
+ const methodName = action.slice(7);
96
+ const staticMethod = callbacks2.staticMethods?.[methodName];
97
+ if (staticMethod) {
98
+ result2 = staticMethod(...args);
99
+ }
100
+ } else {
101
+ const method = callbacks2.methods?.[action];
102
+ if (method && state) {
103
+ result2 = method.call(state, ...args);
104
+ }
105
+ }
106
+ if (result2 instanceof Promise) {
107
+ const deferred = context.newPromise();
108
+ result2.then((resolved) => {
109
+ const resolvedHandle = import_marshal.marshal(context, resolved);
110
+ deferred.resolve(resolvedHandle);
111
+ resolvedHandle.dispose();
112
+ context.runtime.executePendingJobs();
113
+ }).catch((error) => {
114
+ const errorHandle = import_marshal.marshal(context, error instanceof Error ? { name: error.name, message: error.message } : { message: String(error) });
115
+ deferred.reject(errorHandle);
116
+ errorHandle.dispose();
117
+ context.runtime.executePendingJobs();
118
+ });
119
+ return deferred.handle;
120
+ }
121
+ return import_marshal.marshal(context, result2);
122
+ } catch (error) {
123
+ throw context.newError(error instanceof Error ? error.message : String(error));
124
+ }
125
+ });
126
+ context.setProp(context.global, "__hostCall__", hostCallFn);
127
+ hostCallFn.dispose();
128
+ }
129
+ const existingNextId = context.getProp(context.global, "__nextInstanceId__");
130
+ const hasNextId = context.typeof(existingNextId) === "function";
131
+ existingNextId.dispose();
132
+ if (!hasNextId) {
133
+ const nextIdFn = context.newFunction("__nextInstanceId__", () => {
134
+ return context.newNumber(++instanceIdCounter);
135
+ });
136
+ context.setProp(context.global, "__nextInstanceId__", nextIdFn);
137
+ nextIdFn.dispose();
138
+ }
139
+ const callbacks = {
140
+ construct: definition.construct,
141
+ methods: definition.methods,
142
+ properties: definition.properties,
143
+ staticMethods: definition.staticMethods
144
+ };
145
+ classCallbackRegistry.set(className, callbacks);
146
+ let classCode = `(function() {
147
+ const __className__ = ${JSON.stringify(className)};
148
+
149
+ class ${className} {
150
+ constructor(...args) {
151
+ this.__instanceId__ = __nextInstanceId__();
152
+ __hostCall__(__className__, "__construct__", this.__instanceId__, ...args);
153
+ }
154
+ `;
155
+ if (definition.methods) {
156
+ for (const methodName of Object.keys(definition.methods)) {
157
+ classCode += `
158
+ ${methodName}(...args) {
159
+ return __hostCall__(__className__, ${JSON.stringify(methodName)}, this.__instanceId__, ...args);
160
+ }
161
+ `;
162
+ }
163
+ }
164
+ if (definition.properties) {
165
+ for (const [propName, descriptor] of Object.entries(definition.properties)) {
166
+ if (descriptor.get) {
167
+ classCode += `
168
+ get ${propName}() {
169
+ return __hostCall__(__className__, "get:${propName}", this.__instanceId__);
170
+ }
171
+ `;
172
+ }
173
+ if (descriptor.set) {
174
+ classCode += `
175
+ set ${propName}(value) {
176
+ __hostCall__(__className__, "set:${propName}", this.__instanceId__, value);
177
+ }
178
+ `;
179
+ }
180
+ }
181
+ }
182
+ classCode += ` }
183
+ `;
184
+ if (definition.staticMethods) {
185
+ for (const methodName of Object.keys(definition.staticMethods)) {
186
+ classCode += `
187
+ ${className}.${methodName} = function(...args) {
188
+ return __hostCall__(__className__, "static:${methodName}", 0, ...args);
189
+ };
190
+ `;
191
+ }
192
+ }
193
+ if (definition.staticProperties) {
194
+ for (const [propName, value] of Object.entries(definition.staticProperties)) {
195
+ classCode += `
196
+ ${className}.${propName} = ${JSON.stringify(value)};
197
+ `;
198
+ }
199
+ }
200
+ classCode += `
201
+ return ${className};
202
+ })()`;
203
+ const result = context.evalCode(classCode);
204
+ if (result.error) {
205
+ const error = context.dump(result.error);
206
+ result.error.dispose();
207
+ throw new Error(`Failed to define class ${className}: ${JSON.stringify(error)}`);
208
+ }
209
+ const classHandle = result.value;
210
+ return classHandle;
211
+ }
212
+ var classCallbackRegistry = new Map;
213
+ function getInstanceState(context, instanceHandle) {
214
+ const idHandle = context.getProp(instanceHandle, "__instanceId__");
215
+ if (context.typeof(idHandle) !== "number") {
216
+ idHandle.dispose();
217
+ return;
218
+ }
219
+ const id = context.getNumber(idHandle);
220
+ idHandle.dispose();
221
+ return instanceStateMap.get(id);
222
+ }
223
+ function setInstanceState(context, instanceHandle, state) {
224
+ const idHandle = context.getProp(instanceHandle, "__instanceId__");
225
+ if (context.typeof(idHandle) !== "number") {
226
+ idHandle.dispose();
227
+ throw new Error("Cannot set state: instance has no __instanceId__");
228
+ }
229
+ const id = context.getNumber(idHandle);
230
+ idHandle.dispose();
231
+ instanceStateMap.set(id, state);
232
+ }
233
+ function getInstanceStateById(instanceId) {
234
+ return instanceStateMap.get(instanceId);
235
+ }
236
+ function cleanupInstanceState(instanceId) {
237
+ instanceStateMap.delete(instanceId);
238
+ }
239
+ function clearAllInstanceState() {
240
+ instanceStateMap.clear();
241
+ }
242
+ })
243
+
244
+ //# debugId=4F7ECFAB7AED668F64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/class-builder.ts"],
4
+ "sourcesContent": [
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { ClassDefinition, StateMap } from \"./types.ts\";\nimport { unmarshal } from \"./unmarshal.ts\";\nimport { marshal } from \"./marshal.ts\";\n\n/**\n * Create a new StateMap for tracking object internal states\n */\nexport function createStateMap(): StateMap {\n return new WeakMap();\n}\n\n/**\n * Get the internal state associated with a QuickJS object handle\n */\nexport function getState<T extends object>(\n stateMap: StateMap,\n handle: QuickJSHandle\n): T | undefined {\n return stateMap.get(handle) as T | undefined;\n}\n\n/**\n * Set the internal state associated with a QuickJS object handle\n */\nexport function setState<T extends object>(\n stateMap: StateMap,\n handle: QuickJSHandle,\n state: T\n): void {\n stateMap.set(handle, state);\n}\n\n// Internal state tracking using instance IDs\nlet instanceIdCounter = 0;\nconst instanceStateMap = new Map<number, unknown>();\n\n/**\n * Define a class in the QuickJS context\n *\n * Uses evalCode to create a proper JavaScript class that can be called with 'new'.\n * Host-side callbacks are registered and invoked by the JavaScript class.\n *\n * @returns Handle to the class constructor (caller must manage disposal)\n *\n * @example\n * const Point = defineClass(context, stateMap, {\n * name: \"Point\",\n * construct: ([x, y]) => ({ x: Number(x), y: Number(y) }),\n * methods: {\n * distance(this: { x: number; y: number }) {\n * return Math.sqrt(this.x ** 2 + this.y ** 2);\n * }\n * },\n * properties: {\n * x: {\n * get(this: { x: number }) { return this.x; },\n * set(this: { x: number }, v: unknown) { this.x = Number(v); }\n * }\n * }\n * });\n * context.setProp(context.global, \"Point\", Point);\n */\nexport function defineClass<TState extends object>(\n context: QuickJSContext,\n stateMap: StateMap,\n definition: ClassDefinition<TState>\n): QuickJSHandle {\n const className = definition.name;\n\n // Create the __hostCall__ function if it doesn't exist\n const existingHostCall = context.getProp(context.global, \"__hostCall__\");\n const hasHostCall = context.typeof(existingHostCall) === \"function\";\n existingHostCall.dispose();\n\n if (!hasHostCall) {\n const hostCallFn = context.newFunction(\"__hostCall__\", (classNameHandle, actionHandle, instanceIdHandle, ...argHandles) => {\n const classNameStr = context.getString(classNameHandle);\n const action = context.getString(actionHandle);\n const instanceId = context.getNumber(instanceIdHandle);\n const args = argHandles.map((h) => unmarshal(context, h));\n\n const callbacks = classCallbackRegistry.get(classNameStr);\n if (!callbacks) {\n throw context.newError(`No callbacks registered for class ${classNameStr}`);\n }\n\n const state = instanceStateMap.get(instanceId) as TState | undefined;\n\n try {\n let result: unknown;\n\n if (action === \"__construct__\") {\n // Constructor call\n if (callbacks.construct) {\n const newState = callbacks.construct(args);\n instanceStateMap.set(instanceId, newState);\n result = undefined;\n }\n } else if (action.startsWith(\"get:\")) {\n // Getter call\n const propName = action.slice(4);\n const getter = callbacks.properties?.[propName]?.get;\n if (getter && state) {\n result = getter.call(state);\n }\n } else if (action.startsWith(\"set:\")) {\n // Setter call\n const propName = action.slice(4);\n const setter = callbacks.properties?.[propName]?.set;\n if (setter && state) {\n setter.call(state, args[0]);\n }\n result = undefined;\n } else if (action.startsWith(\"static:\")) {\n // Static method call\n const methodName = action.slice(7);\n const staticMethod = callbacks.staticMethods?.[methodName];\n if (staticMethod) {\n result = staticMethod(...args);\n }\n } else {\n // Instance method call\n const method = callbacks.methods?.[action];\n if (method && state) {\n result = method.call(state, ...args);\n }\n }\n\n // Handle promises\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result\n .then((resolved) => {\n const resolvedHandle = marshal(context, resolved);\n deferred.resolve(resolvedHandle);\n resolvedHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n const errorHandle = marshal(\n context,\n error instanceof Error\n ? { name: error.name, message: error.message }\n : { message: String(error) }\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n\n return marshal(context, result);\n } catch (error) {\n throw context.newError(\n error instanceof Error ? error.message : String(error)\n );\n }\n });\n context.setProp(context.global, \"__hostCall__\", hostCallFn);\n hostCallFn.dispose();\n }\n\n // Create __nextInstanceId__ function if it doesn't exist\n const existingNextId = context.getProp(context.global, \"__nextInstanceId__\");\n const hasNextId = context.typeof(existingNextId) === \"function\";\n existingNextId.dispose();\n\n if (!hasNextId) {\n const nextIdFn = context.newFunction(\"__nextInstanceId__\", () => {\n return context.newNumber(++instanceIdCounter);\n });\n context.setProp(context.global, \"__nextInstanceId__\", nextIdFn);\n nextIdFn.dispose();\n }\n\n // Register callbacks for this class\n const callbacks: ClassCallbacks<TState> = {\n construct: definition.construct,\n methods: definition.methods,\n properties: definition.properties,\n staticMethods: definition.staticMethods,\n };\n classCallbackRegistry.set(className, callbacks as unknown as ClassCallbacks<object>);\n\n // Build the JavaScript class code\n let classCode = `(function() {\n const __className__ = ${JSON.stringify(className)};\n\n class ${className} {\n constructor(...args) {\n this.__instanceId__ = __nextInstanceId__();\n __hostCall__(__className__, \"__construct__\", this.__instanceId__, ...args);\n }\n`;\n\n // Add methods\n if (definition.methods) {\n for (const methodName of Object.keys(definition.methods)) {\n classCode += `\n ${methodName}(...args) {\n return __hostCall__(__className__, ${JSON.stringify(methodName)}, this.__instanceId__, ...args);\n }\n`;\n }\n }\n\n // Add properties (getters/setters)\n if (definition.properties) {\n for (const [propName, descriptor] of Object.entries(definition.properties)) {\n if (descriptor.get) {\n classCode += `\n get ${propName}() {\n return __hostCall__(__className__, \"get:${propName}\", this.__instanceId__);\n }\n`;\n }\n if (descriptor.set) {\n classCode += `\n set ${propName}(value) {\n __hostCall__(__className__, \"set:${propName}\", this.__instanceId__, value);\n }\n`;\n }\n }\n }\n\n // Close the class definition\n classCode += ` }\n`;\n\n // Add static methods\n if (definition.staticMethods) {\n for (const methodName of Object.keys(definition.staticMethods)) {\n classCode += `\n ${className}.${methodName} = function(...args) {\n return __hostCall__(__className__, \"static:${methodName}\", 0, ...args);\n };\n`;\n }\n }\n\n // Add static properties\n if (definition.staticProperties) {\n for (const [propName, value] of Object.entries(definition.staticProperties)) {\n classCode += `\n ${className}.${propName} = ${JSON.stringify(value)};\n`;\n }\n }\n\n classCode += `\n return ${className};\n})()`;\n\n // Evaluate the class definition\n const result = context.evalCode(classCode);\n if (result.error) {\n const error = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Failed to define class ${className}: ${JSON.stringify(error)}`);\n }\n\n // Store reference to instance state in stateMap for backwards compatibility\n // When an instance handle is accessed, we can look up its state via __instanceId__\n const classHandle = result.value;\n\n return classHandle;\n}\n\n// Registry for class callbacks\ninterface ClassCallbacks<TState extends object> {\n construct?: (args: unknown[]) => TState;\n methods?: Record<string, (this: TState, ...args: unknown[]) => unknown>;\n properties?: Record<string, { get?: (this: TState) => unknown; set?: (this: TState, value: unknown) => void }>;\n staticMethods?: Record<string, (...args: unknown[]) => unknown>;\n}\n\nconst classCallbackRegistry = new Map<string, ClassCallbacks<object>>();\n\n/**\n * Get internal state for a QuickJS instance by extracting its __instanceId__\n */\nexport function getInstanceState<T>(\n context: QuickJSContext,\n instanceHandle: QuickJSHandle\n): T | undefined {\n const idHandle = context.getProp(instanceHandle, \"__instanceId__\");\n if (context.typeof(idHandle) !== \"number\") {\n idHandle.dispose();\n return undefined;\n }\n const id = context.getNumber(idHandle);\n idHandle.dispose();\n return instanceStateMap.get(id) as T | undefined;\n}\n\n/**\n * Set internal state for a QuickJS instance by extracting its __instanceId__\n */\nexport function setInstanceState<T>(\n context: QuickJSContext,\n instanceHandle: QuickJSHandle,\n state: T\n): void {\n const idHandle = context.getProp(instanceHandle, \"__instanceId__\");\n if (context.typeof(idHandle) !== \"number\") {\n idHandle.dispose();\n throw new Error(\"Cannot set state: instance has no __instanceId__\");\n }\n const id = context.getNumber(idHandle);\n idHandle.dispose();\n instanceStateMap.set(id, state);\n}\n\n/**\n * Get internal state by instance ID directly\n * Useful when you have the instanceId from an unmarshaled object\n */\nexport function getInstanceStateById<T>(instanceId: number): T | undefined {\n return instanceStateMap.get(instanceId) as T | undefined;\n}\n\n/**\n * Clean up instance state when an instance is no longer needed\n */\nexport function cleanupInstanceState(instanceId: number): void {\n instanceStateMap.delete(instanceId);\n}\n\n/**\n * Clear all instance state (useful for context disposal or testing cleanup)\n */\nexport function clearAllInstanceState(): void {\n instanceStateMap.clear();\n}\n"
6
+ ],
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE0B,IAA1B;AACwB,IAAxB;AAKO,SAAS,cAAc,GAAa;AAAA,EACzC,OAAO,IAAI;AAAA;AAMN,SAAS,QAA0B,CACxC,UACA,QACe;AAAA,EACf,OAAO,SAAS,IAAI,MAAM;AAAA;AAMrB,SAAS,QAA0B,CACxC,UACA,QACA,OACM;AAAA,EACN,SAAS,IAAI,QAAQ,KAAK;AAAA;AAI5B,IAAI,oBAAoB;AACxB,IAAM,mBAAmB,IAAI;AA4BtB,SAAS,WAAkC,CAChD,SACA,UACA,YACe;AAAA,EACf,MAAM,YAAY,WAAW;AAAA,EAG7B,MAAM,mBAAmB,QAAQ,QAAQ,QAAQ,QAAQ,cAAc;AAAA,EACvE,MAAM,cAAc,QAAQ,OAAO,gBAAgB,MAAM;AAAA,EACzD,iBAAiB,QAAQ;AAAA,EAEzB,IAAI,CAAC,aAAa;AAAA,IAChB,MAAM,aAAa,QAAQ,YAAY,gBAAgB,CAAC,iBAAiB,cAAc,qBAAqB,eAAe;AAAA,MACzH,MAAM,eAAe,QAAQ,UAAU,eAAe;AAAA,MACtD,MAAM,SAAS,QAAQ,UAAU,YAAY;AAAA,MAC7C,MAAM,aAAa,QAAQ,UAAU,gBAAgB;AAAA,MACrD,MAAM,OAAO,WAAW,IAAI,CAAC,MAAM,2BAAU,SAAS,CAAC,CAAC;AAAA,MAExD,MAAM,aAAY,sBAAsB,IAAI,YAAY;AAAA,MACxD,IAAI,CAAC,YAAW;AAAA,QACd,MAAM,QAAQ,SAAS,qCAAqC,cAAc;AAAA,MAC5E;AAAA,MAEA,MAAM,QAAQ,iBAAiB,IAAI,UAAU;AAAA,MAE7C,IAAI;AAAA,QACF,IAAI;AAAA,QAEJ,IAAI,WAAW,iBAAiB;AAAA,UAE9B,IAAI,WAAU,WAAW;AAAA,YACvB,MAAM,WAAW,WAAU,UAAU,IAAI;AAAA,YACzC,iBAAiB,IAAI,YAAY,QAAQ;AAAA,YACzC,UAAS;AAAA,UACX;AAAA,QACF,EAAO,SAAI,OAAO,WAAW,MAAM,GAAG;AAAA,UAEpC,MAAM,WAAW,OAAO,MAAM,CAAC;AAAA,UAC/B,MAAM,SAAS,WAAU,aAAa,WAAW;AAAA,UACjD,IAAI,UAAU,OAAO;AAAA,YACnB,UAAS,OAAO,KAAK,KAAK;AAAA,UAC5B;AAAA,QACF,EAAO,SAAI,OAAO,WAAW,MAAM,GAAG;AAAA,UAEpC,MAAM,WAAW,OAAO,MAAM,CAAC;AAAA,UAC/B,MAAM,SAAS,WAAU,aAAa,WAAW;AAAA,UACjD,IAAI,UAAU,OAAO;AAAA,YACnB,OAAO,KAAK,OAAO,KAAK,EAAE;AAAA,UAC5B;AAAA,UACA,UAAS;AAAA,QACX,EAAO,SAAI,OAAO,WAAW,SAAS,GAAG;AAAA,UAEvC,MAAM,aAAa,OAAO,MAAM,CAAC;AAAA,UACjC,MAAM,eAAe,WAAU,gBAAgB;AAAA,UAC/C,IAAI,cAAc;AAAA,YAChB,UAAS,aAAa,GAAG,IAAI;AAAA,UAC/B;AAAA,QACF,EAAO;AAAA,UAEL,MAAM,SAAS,WAAU,UAAU;AAAA,UACnC,IAAI,UAAU,OAAO;AAAA,YACnB,UAAS,OAAO,KAAK,OAAO,GAAG,IAAI;AAAA,UACrC;AAAA;AAAA,QAIF,IAAI,mBAAkB,SAAS;AAAA,UAC7B,MAAM,WAAW,QAAQ,WAAW;AAAA,UACpC,QACG,KAAK,CAAC,aAAa;AAAA,YAClB,MAAM,iBAAiB,uBAAQ,SAAS,QAAQ;AAAA,YAChD,SAAS,QAAQ,cAAc;AAAA,YAC/B,eAAe,QAAQ;AAAA,YACvB,QAAQ,QAAQ,mBAAmB;AAAA,WACpC,EACA,MAAM,CAAC,UAAU;AAAA,YAChB,MAAM,cAAc,uBAClB,SACA,iBAAiB,QACb,EAAE,MAAM,MAAM,MAAM,SAAS,MAAM,QAAQ,IAC3C,EAAE,SAAS,OAAO,KAAK,EAAE,CAC/B;AAAA,YACA,SAAS,OAAO,WAAW;AAAA,YAC3B,YAAY,QAAQ;AAAA,YACpB,QAAQ,QAAQ,mBAAmB;AAAA,WACpC;AAAA,UACH,OAAO,SAAS;AAAA,QAClB;AAAA,QAEA,OAAO,uBAAQ,SAAS,OAAM;AAAA,QAC9B,OAAO,OAAO;AAAA,QACd,MAAM,QAAQ,SACZ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA;AAAA,KAEH;AAAA,IACD,QAAQ,QAAQ,QAAQ,QAAQ,gBAAgB,UAAU;AAAA,IAC1D,WAAW,QAAQ;AAAA,EACrB;AAAA,EAGA,MAAM,iBAAiB,QAAQ,QAAQ,QAAQ,QAAQ,oBAAoB;AAAA,EAC3E,MAAM,YAAY,QAAQ,OAAO,cAAc,MAAM;AAAA,EACrD,eAAe,QAAQ;AAAA,EAEvB,IAAI,CAAC,WAAW;AAAA,IACd,MAAM,WAAW,QAAQ,YAAY,sBAAsB,MAAM;AAAA,MAC/D,OAAO,QAAQ,UAAU,EAAE,iBAAiB;AAAA,KAC7C;AAAA,IACD,QAAQ,QAAQ,QAAQ,QAAQ,sBAAsB,QAAQ;AAAA,IAC9D,SAAS,QAAQ;AAAA,EACnB;AAAA,EAGA,MAAM,YAAoC;AAAA,IACxC,WAAW,WAAW;AAAA,IACtB,SAAS,WAAW;AAAA,IACpB,YAAY,WAAW;AAAA,IACvB,eAAe,WAAW;AAAA,EAC5B;AAAA,EACA,sBAAsB,IAAI,WAAW,SAA8C;AAAA,EAGnF,IAAI,YAAY;AAAA,0BACQ,KAAK,UAAU,SAAS;AAAA;AAAA,UAExC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQR,IAAI,WAAW,SAAS;AAAA,IACtB,WAAW,cAAc,OAAO,KAAK,WAAW,OAAO,GAAG;AAAA,MACxD,aAAa;AAAA,MACb;AAAA,2CACqC,KAAK,UAAU,UAAU;AAAA;AAAA;AAAA,IAGhE;AAAA,EACF;AAAA,EAGA,IAAI,WAAW,YAAY;AAAA,IACzB,YAAY,UAAU,eAAe,OAAO,QAAQ,WAAW,UAAU,GAAG;AAAA,MAC1E,IAAI,WAAW,KAAK;AAAA,QAClB,aAAa;AAAA,UACX;AAAA,gDACsC;AAAA;AAAA;AAAA,MAG1C;AAAA,MACA,IAAI,WAAW,KAAK;AAAA,QAClB,aAAa;AAAA,UACX;AAAA,yCAC+B;AAAA;AAAA;AAAA,MAGnC;AAAA,IACF;AAAA,EACF;AAAA,EAGA,aAAa;AAAA;AAAA,EAIb,IAAI,WAAW,eAAe;AAAA,IAC5B,WAAW,cAAc,OAAO,KAAK,WAAW,aAAa,GAAG;AAAA,MAC9D,aAAa;AAAA,IACf,aAAa;AAAA,iDACgC;AAAA;AAAA;AAAA,IAG7C;AAAA,EACF;AAAA,EAGA,IAAI,WAAW,kBAAkB;AAAA,IAC/B,YAAY,UAAU,UAAU,OAAO,QAAQ,WAAW,gBAAgB,GAAG;AAAA,MAC3E,aAAa;AAAA,IACf,aAAa,cAAc,KAAK,UAAU,KAAK;AAAA;AAAA,IAE/C;AAAA,EACF;AAAA,EAEA,aAAa;AAAA,WACJ;AAAA;AAAA,EAIT,MAAM,SAAS,QAAQ,SAAS,SAAS;AAAA,EACzC,IAAI,OAAO,OAAO;AAAA,IAChB,MAAM,QAAQ,QAAQ,KAAK,OAAO,KAAK;AAAA,IACvC,OAAO,MAAM,QAAQ;AAAA,IACrB,MAAM,IAAI,MAAM,0BAA0B,cAAc,KAAK,UAAU,KAAK,GAAG;AAAA,EACjF;AAAA,EAIA,MAAM,cAAc,OAAO;AAAA,EAE3B,OAAO;AAAA;AAWT,IAAM,wBAAwB,IAAI;AAK3B,SAAS,gBAAmB,CACjC,SACA,gBACe;AAAA,EACf,MAAM,WAAW,QAAQ,QAAQ,gBAAgB,gBAAgB;AAAA,EACjE,IAAI,QAAQ,OAAO,QAAQ,MAAM,UAAU;AAAA,IACzC,SAAS,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA,EACA,MAAM,KAAK,QAAQ,UAAU,QAAQ;AAAA,EACrC,SAAS,QAAQ;AAAA,EACjB,OAAO,iBAAiB,IAAI,EAAE;AAAA;AAMzB,SAAS,gBAAmB,CACjC,SACA,gBACA,OACM;AAAA,EACN,MAAM,WAAW,QAAQ,QAAQ,gBAAgB,gBAAgB;AAAA,EACjE,IAAI,QAAQ,OAAO,QAAQ,MAAM,UAAU;AAAA,IACzC,SAAS,QAAQ;AAAA,IACjB,MAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAAA,EACA,MAAM,KAAK,QAAQ,UAAU,QAAQ;AAAA,EACrC,SAAS,QAAQ;AAAA,EACjB,iBAAiB,IAAI,IAAI,KAAK;AAAA;AAOzB,SAAS,oBAAuB,CAAC,YAAmC;AAAA,EACzE,OAAO,iBAAiB,IAAI,UAAU;AAAA;AAMjC,SAAS,oBAAoB,CAAC,YAA0B;AAAA,EAC7D,iBAAiB,OAAO,UAAU;AAAA;AAM7B,SAAS,qBAAqB,GAAS;AAAA,EAC5C,iBAAiB,MAAM;AAAA;",
8
+ "debugId": "4F7ECFAB7AED668F64756E2164756E21",
9
+ "names": []
10
+ }