@ricsam/quickjs-core 0.2.13 → 0.2.15
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/dist/cjs/class-builder.cjs +42 -5
- package/dist/cjs/class-builder.cjs.map +3 -3
- package/dist/cjs/class-helpers.cjs +16 -2
- package/dist/cjs/class-helpers.cjs.map +3 -3
- package/dist/cjs/coerce.cjs +320 -0
- package/dist/cjs/coerce.cjs.map +10 -0
- package/dist/cjs/file.cjs +2 -1
- package/dist/cjs/file.cjs.map +3 -3
- package/dist/cjs/index.cjs +18 -2
- package/dist/cjs/index.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/unmarshal.cjs +105 -6
- package/dist/cjs/unmarshal.cjs.map +3 -3
- package/dist/cjs/url.cjs +109 -16
- package/dist/cjs/url.cjs.map +3 -3
- package/dist/mjs/class-builder.mjs +42 -5
- package/dist/mjs/class-builder.mjs.map +3 -3
- package/dist/mjs/class-helpers.mjs +16 -2
- package/dist/mjs/class-helpers.mjs.map +3 -3
- package/dist/mjs/coerce.mjs +292 -0
- package/dist/mjs/coerce.mjs.map +10 -0
- package/dist/mjs/file.mjs +2 -1
- package/dist/mjs/file.mjs.map +3 -3
- package/dist/mjs/index.mjs +36 -5
- package/dist/mjs/index.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/mjs/unmarshal.mjs +105 -6
- package/dist/mjs/unmarshal.mjs.map +3 -3
- package/dist/mjs/url.mjs +109 -16
- package/dist/mjs/url.mjs.map +3 -3
- package/dist/types/class-helpers.d.ts +32 -0
- package/dist/types/coerce.d.ts +98 -0
- package/dist/types/index.d.ts +5 -3
- package/dist/types/url.d.ts +9 -1
- package/package.json +1 -1
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// packages/core/src/coerce.ts
|
|
3
|
+
import {
|
|
4
|
+
isInstanceOf,
|
|
5
|
+
getClassInstanceState
|
|
6
|
+
} from "./class-helpers.mjs";
|
|
7
|
+
function createCoercer(name, detect, extract) {
|
|
8
|
+
const coercer = {
|
|
9
|
+
name,
|
|
10
|
+
safeParse(value) {
|
|
11
|
+
if (!detect(value)) {
|
|
12
|
+
return {
|
|
13
|
+
success: false,
|
|
14
|
+
error: `Expected ${name}, got ${typeof value}`
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
return { success: true, value: extract(value) };
|
|
19
|
+
} catch (e) {
|
|
20
|
+
return {
|
|
21
|
+
success: false,
|
|
22
|
+
error: e instanceof Error ? e.message : String(e)
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
parse(value) {
|
|
27
|
+
const result = this.safeParse(value);
|
|
28
|
+
if (!result.success) {
|
|
29
|
+
throw new TypeError(result.error);
|
|
30
|
+
}
|
|
31
|
+
return result.value;
|
|
32
|
+
},
|
|
33
|
+
is(value) {
|
|
34
|
+
return detect(value);
|
|
35
|
+
},
|
|
36
|
+
or(other) {
|
|
37
|
+
return createCoercer(`${name} | ${other.name}`, (v) => detect(v) || other.is(v), (v) => detect(v) ? extract(v) : other.parse(v));
|
|
38
|
+
},
|
|
39
|
+
transform(fn) {
|
|
40
|
+
return createCoercer(`${name}.transform`, detect, (v) => fn(extract(v)));
|
|
41
|
+
},
|
|
42
|
+
optional() {
|
|
43
|
+
return createCoercer(`${name}?`, (v) => v === undefined || v === null || detect(v), (v) => v === undefined || v === null ? undefined : extract(v));
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
return coercer;
|
|
47
|
+
}
|
|
48
|
+
function classCoercer(className) {
|
|
49
|
+
return createCoercer(className, (value) => isInstanceOf(value, className), (value) => {
|
|
50
|
+
const state = getClassInstanceState(value);
|
|
51
|
+
if (!state) {
|
|
52
|
+
throw new Error(`Failed to get state for ${className} instance`);
|
|
53
|
+
}
|
|
54
|
+
return state;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function instanceOrShape(className, shapeCheck, shapeToState) {
|
|
58
|
+
return createCoercer(`${className} | ${className}Shape`, (value) => isInstanceOf(value, className) || shapeCheck(value), (value) => {
|
|
59
|
+
if (isInstanceOf(value, className)) {
|
|
60
|
+
const state = getClassInstanceState(value);
|
|
61
|
+
if (!state) {
|
|
62
|
+
throw new Error(`Failed to get state for ${className} instance`);
|
|
63
|
+
}
|
|
64
|
+
return state;
|
|
65
|
+
}
|
|
66
|
+
return shapeToState(value);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function isURLShape(value) {
|
|
70
|
+
return value !== null && typeof value === "object" && "href" in value && typeof value.href === "string";
|
|
71
|
+
}
|
|
72
|
+
function extractURLData(url) {
|
|
73
|
+
return {
|
|
74
|
+
href: url.href,
|
|
75
|
+
protocol: url.protocol,
|
|
76
|
+
host: url.host,
|
|
77
|
+
hostname: url.hostname,
|
|
78
|
+
port: url.port,
|
|
79
|
+
pathname: url.pathname,
|
|
80
|
+
search: url.search,
|
|
81
|
+
hash: url.hash,
|
|
82
|
+
origin: url.origin,
|
|
83
|
+
username: url.username,
|
|
84
|
+
password: url.password
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
var coerceURL = createCoercer("URL", (value) => {
|
|
88
|
+
if (typeof value === "string")
|
|
89
|
+
return true;
|
|
90
|
+
if (isInstanceOf(value, "URL"))
|
|
91
|
+
return true;
|
|
92
|
+
if (isURLShape(value))
|
|
93
|
+
return true;
|
|
94
|
+
return false;
|
|
95
|
+
}, (value) => {
|
|
96
|
+
if (typeof value === "string") {
|
|
97
|
+
const url = new globalThis.URL(value);
|
|
98
|
+
return extractURLData(url);
|
|
99
|
+
}
|
|
100
|
+
if (isInstanceOf(value, "URL")) {
|
|
101
|
+
const state = getClassInstanceState(value);
|
|
102
|
+
if (state)
|
|
103
|
+
return state;
|
|
104
|
+
}
|
|
105
|
+
if (isURLShape(value)) {
|
|
106
|
+
const url = new globalThis.URL(value.href);
|
|
107
|
+
return extractURLData(url);
|
|
108
|
+
}
|
|
109
|
+
throw new Error("Cannot coerce to URL");
|
|
110
|
+
});
|
|
111
|
+
function coerceToURLString(value) {
|
|
112
|
+
const result = coerceURL.safeParse(value);
|
|
113
|
+
if (result.success) {
|
|
114
|
+
return result.value.href;
|
|
115
|
+
}
|
|
116
|
+
return String(value);
|
|
117
|
+
}
|
|
118
|
+
function isHeadersState(value) {
|
|
119
|
+
return value !== null && typeof value === "object" && "headers" in value && value.headers instanceof Map;
|
|
120
|
+
}
|
|
121
|
+
var coerceHeaders = createCoercer("Headers", (value) => {
|
|
122
|
+
if (value === null || value === undefined)
|
|
123
|
+
return true;
|
|
124
|
+
if (isInstanceOf(value, "Headers"))
|
|
125
|
+
return true;
|
|
126
|
+
if (isHeadersState(value))
|
|
127
|
+
return true;
|
|
128
|
+
if (Array.isArray(value))
|
|
129
|
+
return true;
|
|
130
|
+
if (typeof value === "object")
|
|
131
|
+
return true;
|
|
132
|
+
return false;
|
|
133
|
+
}, (value) => {
|
|
134
|
+
if (value === null || value === undefined) {
|
|
135
|
+
return { headers: new Map };
|
|
136
|
+
}
|
|
137
|
+
if (isInstanceOf(value, "Headers")) {
|
|
138
|
+
const state = getClassInstanceState(value);
|
|
139
|
+
if (state) {
|
|
140
|
+
return { headers: new Map(state.headers) };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (isHeadersState(value)) {
|
|
144
|
+
return { headers: new Map(value.headers) };
|
|
145
|
+
}
|
|
146
|
+
if (Array.isArray(value)) {
|
|
147
|
+
const headers = new Map;
|
|
148
|
+
for (const pair of value) {
|
|
149
|
+
if (Array.isArray(pair) && pair.length >= 2) {
|
|
150
|
+
const key = String(pair[0]).toLowerCase();
|
|
151
|
+
const existing = headers.get(key) || [];
|
|
152
|
+
existing.push(String(pair[1]));
|
|
153
|
+
headers.set(key, existing);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return { headers };
|
|
157
|
+
}
|
|
158
|
+
if (typeof value === "object" && value !== null) {
|
|
159
|
+
const headers = new Map;
|
|
160
|
+
for (const [key, val] of Object.entries(value)) {
|
|
161
|
+
if (key === "__instanceId__" || key === "__className__" || key === "__isDefineClassInstance__") {
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
const normalizedKey = key.toLowerCase();
|
|
165
|
+
if (Array.isArray(val)) {
|
|
166
|
+
headers.set(normalizedKey, val.map(String));
|
|
167
|
+
} else if (val !== undefined && val !== null) {
|
|
168
|
+
headers.set(normalizedKey, [String(val)]);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return { headers };
|
|
172
|
+
}
|
|
173
|
+
throw new Error("Cannot coerce to Headers");
|
|
174
|
+
});
|
|
175
|
+
function coerceBody(value) {
|
|
176
|
+
if (value === null || value === undefined)
|
|
177
|
+
return null;
|
|
178
|
+
if (typeof value === "string")
|
|
179
|
+
return new TextEncoder().encode(value);
|
|
180
|
+
if (value instanceof ArrayBuffer)
|
|
181
|
+
return new Uint8Array(value);
|
|
182
|
+
if (value instanceof Uint8Array)
|
|
183
|
+
return value;
|
|
184
|
+
if (ArrayBuffer.isView(value)) {
|
|
185
|
+
return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
186
|
+
}
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
var coerceRequestInit = createCoercer("RequestInit", (value) => {
|
|
190
|
+
if (value === null || value === undefined)
|
|
191
|
+
return true;
|
|
192
|
+
if (isInstanceOf(value, "Request"))
|
|
193
|
+
return true;
|
|
194
|
+
if (typeof value === "object")
|
|
195
|
+
return true;
|
|
196
|
+
return false;
|
|
197
|
+
}, (value) => {
|
|
198
|
+
if (value === null || value === undefined) {
|
|
199
|
+
return {};
|
|
200
|
+
}
|
|
201
|
+
if (isInstanceOf(value, "Request")) {
|
|
202
|
+
const state = getClassInstanceState(value);
|
|
203
|
+
if (state) {
|
|
204
|
+
return {
|
|
205
|
+
method: state.method,
|
|
206
|
+
headersState: state.headersState ? { headers: new Map(state.headersState.headers) } : undefined,
|
|
207
|
+
body: state.body ? new Uint8Array(state.body) : null,
|
|
208
|
+
cache: state.cache,
|
|
209
|
+
credentials: state.credentials,
|
|
210
|
+
integrity: state.integrity,
|
|
211
|
+
keepalive: state.keepalive,
|
|
212
|
+
mode: state.mode,
|
|
213
|
+
redirect: state.redirect,
|
|
214
|
+
referrer: state.referrer,
|
|
215
|
+
referrerPolicy: state.referrerPolicy,
|
|
216
|
+
signal: state.signal
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
const obj = value;
|
|
221
|
+
const result = {};
|
|
222
|
+
if ("method" in obj && typeof obj.method === "string") {
|
|
223
|
+
result.method = obj.method.toUpperCase();
|
|
224
|
+
}
|
|
225
|
+
if ("headers" in obj && obj.headers !== undefined) {
|
|
226
|
+
const headersResult = coerceHeaders.safeParse(obj.headers);
|
|
227
|
+
if (headersResult.success) {
|
|
228
|
+
result.headersState = headersResult.value;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if ("body" in obj) {
|
|
232
|
+
result.body = coerceBody(obj.body);
|
|
233
|
+
}
|
|
234
|
+
if ("cache" in obj)
|
|
235
|
+
result.cache = String(obj.cache);
|
|
236
|
+
if ("credentials" in obj)
|
|
237
|
+
result.credentials = String(obj.credentials);
|
|
238
|
+
if ("integrity" in obj)
|
|
239
|
+
result.integrity = String(obj.integrity);
|
|
240
|
+
if ("keepalive" in obj)
|
|
241
|
+
result.keepalive = Boolean(obj.keepalive);
|
|
242
|
+
if ("mode" in obj)
|
|
243
|
+
result.mode = String(obj.mode);
|
|
244
|
+
if ("redirect" in obj)
|
|
245
|
+
result.redirect = String(obj.redirect);
|
|
246
|
+
if ("referrer" in obj)
|
|
247
|
+
result.referrer = String(obj.referrer);
|
|
248
|
+
if ("referrerPolicy" in obj)
|
|
249
|
+
result.referrerPolicy = String(obj.referrerPolicy);
|
|
250
|
+
if ("signal" in obj)
|
|
251
|
+
result.signal = obj.signal;
|
|
252
|
+
return result;
|
|
253
|
+
});
|
|
254
|
+
var coerceResponseInit = createCoercer("ResponseInit", (value) => {
|
|
255
|
+
if (value === null || value === undefined)
|
|
256
|
+
return true;
|
|
257
|
+
if (typeof value === "object")
|
|
258
|
+
return true;
|
|
259
|
+
return false;
|
|
260
|
+
}, (value) => {
|
|
261
|
+
if (value === null || value === undefined) {
|
|
262
|
+
return {};
|
|
263
|
+
}
|
|
264
|
+
const obj = value;
|
|
265
|
+
const result = {};
|
|
266
|
+
if ("status" in obj && typeof obj.status === "number") {
|
|
267
|
+
result.status = obj.status;
|
|
268
|
+
}
|
|
269
|
+
if ("statusText" in obj && typeof obj.statusText === "string") {
|
|
270
|
+
result.statusText = obj.statusText;
|
|
271
|
+
}
|
|
272
|
+
if ("headers" in obj && obj.headers !== undefined) {
|
|
273
|
+
const headersResult = coerceHeaders.safeParse(obj.headers);
|
|
274
|
+
if (headersResult.success) {
|
|
275
|
+
result.headersState = headersResult.value;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return result;
|
|
279
|
+
});
|
|
280
|
+
export {
|
|
281
|
+
instanceOrShape,
|
|
282
|
+
createCoercer,
|
|
283
|
+
coerceURL,
|
|
284
|
+
coerceToURLString,
|
|
285
|
+
coerceResponseInit,
|
|
286
|
+
coerceRequestInit,
|
|
287
|
+
coerceHeaders,
|
|
288
|
+
coerceBody,
|
|
289
|
+
classCoercer
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
//# debugId=36191DB684878DA664756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/coerce.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Coercion system for QuickJS class instances\n *\n * Provides a Zod-like API for detecting and extracting values from\n * class instances, plain objects, and primitive values.\n *\n * This enables consistent handling of class instances across the codebase,\n * reducing duplication and ensuring reliable type detection.\n */\n\nimport {\n isDefineClassInstance,\n isInstanceOf,\n getClassInstanceState,\n} from \"./class-helpers.mjs\";\nimport { getInstanceStateById } from \"./instance-state.mjs\";\n\n/**\n * Result of a coercion attempt\n */\nexport type CoercionResult<T> =\n | { success: true; value: T }\n | { success: false; error: string };\n\n/**\n * A coercer that can transform unknown values into a specific type\n */\nexport interface Coercer<T> {\n /** The name of this coercer (for error messages) */\n readonly name: string;\n\n /** Attempt to coerce a value, returning a result object */\n safeParse(value: unknown): CoercionResult<T>;\n\n /** Coerce a value, throwing on failure */\n parse(value: unknown): T;\n\n /** Check if a value can be coerced without actually coercing */\n is(value: unknown): boolean;\n\n /** Create a new coercer with a fallback */\n or<U>(other: Coercer<U>): Coercer<T | U>;\n\n /** Transform the coerced value */\n transform<U>(fn: (value: T) => U): Coercer<U>;\n\n /** Make the coercer optional (allows undefined/null) */\n optional(): Coercer<T | undefined>;\n}\n\n/**\n * Create a base coercer from detection and extraction functions\n */\nexport function createCoercer<T>(\n name: string,\n detect: (value: unknown) => boolean,\n extract: (value: unknown) => T\n): Coercer<T> {\n const coercer: Coercer<T> = {\n name,\n\n safeParse(value: unknown): CoercionResult<T> {\n if (!detect(value)) {\n return {\n success: false,\n error: `Expected ${name}, got ${typeof value}`,\n };\n }\n try {\n return { success: true, value: extract(value) };\n } catch (e) {\n return {\n success: false,\n error: e instanceof Error ? e.message : String(e),\n };\n }\n },\n\n parse(value: unknown): T {\n const result = this.safeParse(value);\n if (!result.success) {\n throw new TypeError(result.error);\n }\n return result.value;\n },\n\n is(value: unknown): boolean {\n return detect(value);\n },\n\n or<U>(other: Coercer<U>): Coercer<T | U> {\n return createCoercer<T | U>(\n `${name} | ${other.name}`,\n (v) => detect(v) || other.is(v),\n (v) => (detect(v) ? extract(v) : other.parse(v))\n );\n },\n\n transform<U>(fn: (value: T) => U): Coercer<U> {\n return createCoercer<U>(`${name}.transform`, detect, (v) =>\n fn(extract(v))\n );\n },\n\n optional(): Coercer<T | undefined> {\n return createCoercer<T | undefined>(\n `${name}?`,\n (v) => v === undefined || v === null || detect(v),\n (v) => (v === undefined || v === null ? undefined : extract(v))\n );\n },\n };\n\n return coercer;\n}\n\n/**\n * Create a coercer for a QuickJS class instance\n */\nexport function classCoercer<TState>(className: string): Coercer<TState> {\n return createCoercer<TState>(\n className,\n (value) => isInstanceOf(value, className),\n (value) => {\n const state = getClassInstanceState<TState>(value);\n if (!state) {\n throw new Error(`Failed to get state for ${className} instance`);\n }\n return state;\n }\n );\n}\n\n/**\n * Coerce a value that could be a class instance OR have a specific shape\n */\nexport function instanceOrShape<TState, TShape>(\n className: string,\n shapeCheck: (value: unknown) => value is TShape,\n shapeToState: (value: TShape) => TState\n): Coercer<TState> {\n return createCoercer<TState>(\n `${className} | ${className}Shape`,\n (value) => isInstanceOf(value, className) || shapeCheck(value),\n (value) => {\n if (isInstanceOf(value, className)) {\n const state = getClassInstanceState<TState>(value);\n if (!state) {\n throw new Error(`Failed to get state for ${className} instance`);\n }\n return state;\n }\n return shapeToState(value as TShape);\n }\n );\n}\n\n// ============================================\n// URL Coercion\n// ============================================\n\nexport interface URLCoerced {\n href: string;\n protocol: string;\n host: string;\n hostname: string;\n port: string;\n pathname: string;\n search: string;\n hash: string;\n origin: string;\n username: string;\n password: string;\n}\n\n/** Check if value has URL-like shape */\nfunction isURLShape(value: unknown): value is { href: string } {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"href\" in value &&\n typeof (value as { href: unknown }).href === \"string\"\n );\n}\n\nfunction extractURLData(url: globalThis.URL): URLCoerced {\n return {\n href: url.href,\n protocol: url.protocol,\n host: url.host,\n hostname: url.hostname,\n port: url.port,\n pathname: url.pathname,\n search: url.search,\n hash: url.hash,\n origin: url.origin,\n username: url.username,\n password: url.password,\n };\n}\n\n/** Coerce a value to URL data */\nexport const coerceURL = createCoercer<URLCoerced>(\n \"URL\",\n (value) => {\n if (typeof value === \"string\") return true;\n if (isInstanceOf(value, \"URL\")) return true;\n if (isURLShape(value)) return true;\n return false;\n },\n (value) => {\n // String - parse as URL\n if (typeof value === \"string\") {\n const url = new globalThis.URL(value);\n return extractURLData(url);\n }\n\n // QuickJS URL instance - get state\n if (isInstanceOf(value, \"URL\")) {\n const state = getClassInstanceState<URLCoerced>(value);\n if (state) return state;\n }\n\n // URL-like shape (has href)\n if (isURLShape(value)) {\n const url = new globalThis.URL(value.href);\n return extractURLData(url);\n }\n\n throw new Error(\"Cannot coerce to URL\");\n }\n);\n\n/** Get just the href string from a URL-like value */\nexport function coerceToURLString(value: unknown): string {\n const result = coerceURL.safeParse(value);\n if (result.success) {\n return result.value.href;\n }\n return String(value);\n}\n\n// ============================================\n// Headers Coercion\n// ============================================\n\nexport interface HeadersCoerced {\n headers: Map<string, string[]>;\n}\n\n/** Check if value is HeadersState shape */\nfunction isHeadersState(value: unknown): value is HeadersCoerced {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"headers\" in value &&\n (value as { headers: unknown }).headers instanceof Map\n );\n}\n\n/** Coerce a value to Headers data */\nexport const coerceHeaders = createCoercer<HeadersCoerced>(\n \"Headers\",\n (value) => {\n if (value === null || value === undefined) return true; // Empty headers\n if (isInstanceOf(value, \"Headers\")) return true;\n if (isHeadersState(value)) return true;\n if (Array.isArray(value)) return true;\n if (typeof value === \"object\") return true;\n return false;\n },\n (value) => {\n // Null/undefined - empty headers\n if (value === null || value === undefined) {\n return { headers: new Map() };\n }\n\n // QuickJS Headers instance\n if (isInstanceOf(value, \"Headers\")) {\n const state = getClassInstanceState<HeadersCoerced>(value);\n if (state) {\n return { headers: new Map(state.headers) };\n }\n }\n\n // Already HeadersState shape\n if (isHeadersState(value)) {\n return { headers: new Map(value.headers) };\n }\n\n // Array of [key, value] pairs\n if (Array.isArray(value)) {\n const headers = new Map<string, string[]>();\n for (const pair of value) {\n if (Array.isArray(pair) && pair.length >= 2) {\n const key = String(pair[0]).toLowerCase();\n const existing = headers.get(key) || [];\n existing.push(String(pair[1]));\n headers.set(key, existing);\n }\n }\n return { headers };\n }\n\n // Plain object - but skip defineClass marker properties\n if (typeof value === \"object\" && value !== null) {\n const headers = new Map<string, string[]>();\n for (const [key, val] of Object.entries(value)) {\n // Skip internal properties\n if (\n key === \"__instanceId__\" ||\n key === \"__className__\" ||\n key === \"__isDefineClassInstance__\"\n ) {\n continue;\n }\n const normalizedKey = key.toLowerCase();\n if (Array.isArray(val)) {\n headers.set(normalizedKey, val.map(String));\n } else if (val !== undefined && val !== null) {\n headers.set(normalizedKey, [String(val)]);\n }\n }\n return { headers };\n }\n\n throw new Error(\"Cannot coerce to Headers\");\n }\n);\n\n// ============================================\n// Body Coercion\n// ============================================\n\n/** Coerce body to Uint8Array */\nexport function coerceBody(value: unknown): Uint8Array | null {\n if (value === null || value === undefined) return null;\n if (typeof value === \"string\") return new TextEncoder().encode(value);\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\n if (value instanceof Uint8Array) return value;\n if (ArrayBuffer.isView(value)) {\n return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n }\n return null;\n}\n\n// ============================================\n// Request Init Coercion\n// ============================================\n\nexport interface RequestInitCoerced {\n method?: string;\n headersState?: HeadersCoerced;\n body?: Uint8Array | null;\n cache?: string;\n credentials?: string;\n destination?: string;\n integrity?: string;\n keepalive?: boolean;\n mode?: string;\n redirect?: string;\n referrer?: string;\n referrerPolicy?: string;\n signal?: unknown;\n}\n\n/** Coerce a value to Request init data (for use as RequestInit second arg) */\nexport const coerceRequestInit = createCoercer<RequestInitCoerced>(\n \"RequestInit\",\n (value) => {\n if (value === null || value === undefined) return true;\n if (isInstanceOf(value, \"Request\")) return true;\n if (typeof value === \"object\") return true;\n return false;\n },\n (value) => {\n if (value === null || value === undefined) {\n return {};\n }\n\n // QuickJS Request instance - extract state (excluding url)\n if (isInstanceOf(value, \"Request\")) {\n const state = getClassInstanceState<{\n method: string;\n headersState: HeadersCoerced;\n body: Uint8Array | null;\n cache: string;\n credentials: string;\n integrity: string;\n keepalive: boolean;\n mode: string;\n redirect: string;\n referrer: string;\n referrerPolicy: string;\n signal: unknown;\n }>(value);\n if (state) {\n // Return all properties EXCEPT url (let caller decide if they want it)\n return {\n method: state.method,\n headersState: state.headersState\n ? { headers: new Map(state.headersState.headers) }\n : undefined,\n body: state.body ? new Uint8Array(state.body) : null,\n cache: state.cache,\n credentials: state.credentials,\n integrity: state.integrity,\n keepalive: state.keepalive,\n mode: state.mode,\n redirect: state.redirect,\n referrer: state.referrer,\n referrerPolicy: state.referrerPolicy,\n signal: state.signal,\n };\n }\n }\n\n // Plain object with potential Request-like properties\n const obj = value as Record<string, unknown>;\n const result: RequestInitCoerced = {};\n\n if (\"method\" in obj && typeof obj.method === \"string\") {\n result.method = obj.method.toUpperCase();\n }\n if (\"headers\" in obj && obj.headers !== undefined) {\n const headersResult = coerceHeaders.safeParse(obj.headers);\n if (headersResult.success) {\n result.headersState = headersResult.value;\n }\n }\n if (\"body\" in obj) {\n result.body = coerceBody(obj.body);\n }\n if (\"cache\" in obj) result.cache = String(obj.cache);\n if (\"credentials\" in obj) result.credentials = String(obj.credentials);\n if (\"integrity\" in obj) result.integrity = String(obj.integrity);\n if (\"keepalive\" in obj) result.keepalive = Boolean(obj.keepalive);\n if (\"mode\" in obj) result.mode = String(obj.mode);\n if (\"redirect\" in obj) result.redirect = String(obj.redirect);\n if (\"referrer\" in obj) result.referrer = String(obj.referrer);\n if (\"referrerPolicy\" in obj)\n result.referrerPolicy = String(obj.referrerPolicy);\n if (\"signal\" in obj) result.signal = obj.signal;\n\n return result;\n }\n);\n\n// ============================================\n// Response Init Coercion\n// ============================================\n\nexport interface ResponseInitCoerced {\n status?: number;\n statusText?: string;\n headersState?: HeadersCoerced;\n}\n\n/** Coerce a value to Response init data */\nexport const coerceResponseInit = createCoercer<ResponseInitCoerced>(\n \"ResponseInit\",\n (value) => {\n if (value === null || value === undefined) return true;\n if (typeof value === \"object\") return true;\n return false;\n },\n (value) => {\n if (value === null || value === undefined) {\n return {};\n }\n\n const obj = value as Record<string, unknown>;\n const result: ResponseInitCoerced = {};\n\n if (\"status\" in obj && typeof obj.status === \"number\") {\n result.status = obj.status;\n }\n if (\"statusText\" in obj && typeof obj.statusText === \"string\") {\n result.statusText = obj.statusText;\n }\n if (\"headers\" in obj && obj.headers !== undefined) {\n const headersResult = coerceHeaders.safeParse(obj.headers);\n if (headersResult.success) {\n result.headersState = headersResult.value;\n }\n }\n\n return result;\n }\n);\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "36191DB684878DA664756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
package/dist/mjs/file.mjs
CHANGED
|
@@ -45,6 +45,7 @@ function concatenateParts(parts) {
|
|
|
45
45
|
function createFileClass(context, stateMap, _blobClass) {
|
|
46
46
|
return defineClass(context, stateMap, {
|
|
47
47
|
name: "File",
|
|
48
|
+
extends: _blobClass,
|
|
48
49
|
construct: (args) => {
|
|
49
50
|
const fileBits = args[0];
|
|
50
51
|
const fileName = args[1];
|
|
@@ -200,4 +201,4 @@ export {
|
|
|
200
201
|
createFile
|
|
201
202
|
};
|
|
202
203
|
|
|
203
|
-
//# debugId=
|
|
204
|
+
//# debugId=4DA4A4C486D4406A64756E2164756E21
|
package/dist/mjs/file.mjs.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/file.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"./types.mjs\";\nimport { defineClass } from \"./class-builder.mjs\";\n\ninterface FileInternalState {\n parts: Uint8Array[];\n type: string;\n size: number;\n name: string;\n lastModified: number;\n webkitRelativePath: string;\n}\n\n/**\n * Normalize file 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 { parts: Uint8Array[] }).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 File class for QuickJS (extends Blob)\n */\nexport function createFileClass(\n context: QuickJSContext,\n stateMap: StateMap,\n _blobClass: QuickJSHandle\n): QuickJSHandle {\n return defineClass<FileInternalState>(context, stateMap, {\n name: \"File\",\n construct: (args) => {\n const fileBits = args[0] as unknown[] | undefined;\n const fileName = args[1] as string;\n const options = args[2] as { type?: string; lastModified?: number } | undefined;\n\n const parts = fileBits ? normalizeParts(fileBits) : [];\n const size = parts.reduce((sum, part) => sum + part.length, 0);\n const type = options?.type ?? \"\";\n const lastModified = options?.lastModified ?? Date.now();\n\n return {\n parts,\n type,\n size,\n name: String(fileName),\n lastModified,\n webkitRelativePath: \"\",\n };\n },\n properties: {\n size: {\n get(this: FileInternalState) {\n return this.size;\n },\n },\n type: {\n get(this: FileInternalState) {\n return this.type;\n },\n },\n name: {\n get(this: FileInternalState) {\n return this.name;\n },\n },\n lastModified: {\n get(this: FileInternalState) {\n return this.lastModified;\n },\n },\n webkitRelativePath: {\n get(this: FileInternalState) {\n return this.webkitRelativePath;\n },\n },\n },\n methods: {\n async text(this: FileInternalState): Promise<string> {\n const data = concatenateParts(this.parts);\n return new TextDecoder().decode(data);\n },\n async arrayBuffer(this: FileInternalState): 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: FileInternalState): Promise<Uint8Array> {\n return concatenateParts(this.parts);\n },\n slice(\n this: FileInternalState,\n start?: unknown,\n end?: unknown,\n contentType?: unknown\n ): object {\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 a Blob-like state (not a File, as per spec)\n return {\n parts: [sliced],\n type: typeof contentType === \"string\" ? contentType : this.type,\n size: sliced.length,\n };\n },\n stream(this: FileInternalState): object {\n const data = concatenateParts(this.parts);\n let offset = 0;\n const chunkSize = 65536; // 64KB chunks\n\n return {\n pull: (controller: { enqueue: (chunk: unknown) => void; close: () => void }) => {\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 File in QuickJS from host data\n */\nexport function createFile(\n context: QuickJSContext,\n stateMap: StateMap,\n parts: BlobPart[],\n name: string,\n options?: FilePropertyBag\n): QuickJSHandle {\n // Get the File constructor from global\n const FileConstructor = context.getProp(context.global, \"File\");\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 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 name\n const nameHandle = context.newString(name);\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 if (options?.lastModified !== undefined) {\n const lastModifiedHandle = context.newNumber(options.lastModified);\n context.setProp(optionsHandle, \"lastModified\", lastModifiedHandle);\n lastModifiedHandle.dispose();\n }\n\n FileConstructor.dispose();\n\n // Set temporary globals for evalCode\n context.setProp(context.global, \"__tempFileParts__\", partsHandle);\n context.setProp(context.global, \"__tempFileName__\", nameHandle);\n context.setProp(context.global, \"__tempFileOptions__\", optionsHandle);\n partsHandle.dispose();\n nameHandle.dispose();\n optionsHandle.dispose();\n\n // Create File using evalCode with 'new' (callFunction doesn't work with constructors)\n const result = context.evalCode(\n \"new File(__tempFileParts__, __tempFileName__, __tempFileOptions__)\"\n );\n\n // Clean up temporary globals\n const cleanup1 = context.evalCode(\"delete globalThis.__tempFileParts__\");\n const cleanup2 = context.evalCode(\"delete globalThis.__tempFileName__\");\n const cleanup3 = context.evalCode(\"delete globalThis.__tempFileOptions__\");\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 if (cleanup3.error) cleanup3.error.dispose();\n else cleanup3.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 File: ${errorMsg}`);\n }\n\n return result.value;\n}\n"
|
|
5
|
+
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"./types.mjs\";\nimport { defineClass } from \"./class-builder.mjs\";\n\ninterface FileInternalState {\n parts: Uint8Array[];\n type: string;\n size: number;\n name: string;\n lastModified: number;\n webkitRelativePath: string;\n}\n\n/**\n * Normalize file 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 { parts: Uint8Array[] }).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 File class for QuickJS (extends Blob)\n */\nexport function createFileClass(\n context: QuickJSContext,\n stateMap: StateMap,\n _blobClass: QuickJSHandle\n): QuickJSHandle {\n return defineClass<FileInternalState>(context, stateMap, {\n name: \"File\",\n extends: _blobClass,\n construct: (args) => {\n const fileBits = args[0] as unknown[] | undefined;\n const fileName = args[1] as string;\n const options = args[2] as { type?: string; lastModified?: number } | undefined;\n\n const parts = fileBits ? normalizeParts(fileBits) : [];\n const size = parts.reduce((sum, part) => sum + part.length, 0);\n const type = options?.type ?? \"\";\n const lastModified = options?.lastModified ?? Date.now();\n\n return {\n parts,\n type,\n size,\n name: String(fileName),\n lastModified,\n webkitRelativePath: \"\",\n };\n },\n properties: {\n size: {\n get(this: FileInternalState) {\n return this.size;\n },\n },\n type: {\n get(this: FileInternalState) {\n return this.type;\n },\n },\n name: {\n get(this: FileInternalState) {\n return this.name;\n },\n },\n lastModified: {\n get(this: FileInternalState) {\n return this.lastModified;\n },\n },\n webkitRelativePath: {\n get(this: FileInternalState) {\n return this.webkitRelativePath;\n },\n },\n },\n methods: {\n async text(this: FileInternalState): Promise<string> {\n const data = concatenateParts(this.parts);\n return new TextDecoder().decode(data);\n },\n async arrayBuffer(this: FileInternalState): 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: FileInternalState): Promise<Uint8Array> {\n return concatenateParts(this.parts);\n },\n slice(\n this: FileInternalState,\n start?: unknown,\n end?: unknown,\n contentType?: unknown\n ): object {\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 a Blob-like state (not a File, as per spec)\n return {\n parts: [sliced],\n type: typeof contentType === \"string\" ? contentType : this.type,\n size: sliced.length,\n };\n },\n stream(this: FileInternalState): object {\n const data = concatenateParts(this.parts);\n let offset = 0;\n const chunkSize = 65536; // 64KB chunks\n\n return {\n pull: (controller: { enqueue: (chunk: unknown) => void; close: () => void }) => {\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 File in QuickJS from host data\n */\nexport function createFile(\n context: QuickJSContext,\n stateMap: StateMap,\n parts: BlobPart[],\n name: string,\n options?: FilePropertyBag\n): QuickJSHandle {\n // Get the File constructor from global\n const FileConstructor = context.getProp(context.global, \"File\");\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 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 name\n const nameHandle = context.newString(name);\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 if (options?.lastModified !== undefined) {\n const lastModifiedHandle = context.newNumber(options.lastModified);\n context.setProp(optionsHandle, \"lastModified\", lastModifiedHandle);\n lastModifiedHandle.dispose();\n }\n\n FileConstructor.dispose();\n\n // Set temporary globals for evalCode\n context.setProp(context.global, \"__tempFileParts__\", partsHandle);\n context.setProp(context.global, \"__tempFileName__\", nameHandle);\n context.setProp(context.global, \"__tempFileOptions__\", optionsHandle);\n partsHandle.dispose();\n nameHandle.dispose();\n optionsHandle.dispose();\n\n // Create File using evalCode with 'new' (callFunction doesn't work with constructors)\n const result = context.evalCode(\n \"new File(__tempFileParts__, __tempFileName__, __tempFileOptions__)\"\n );\n\n // Clean up temporary globals\n const cleanup1 = context.evalCode(\"delete globalThis.__tempFileParts__\");\n const cleanup2 = context.evalCode(\"delete globalThis.__tempFileName__\");\n const cleanup3 = context.evalCode(\"delete globalThis.__tempFileOptions__\");\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 if (cleanup3.error) cleanup3.error.dispose();\n else cleanup3.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 File: ${errorMsg}`);\n }\n\n return result.value;\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "4DA4A4C486D4406A64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/mjs/index.mjs
CHANGED
|
@@ -15,7 +15,7 @@ import { createBlobClass } from "./blob.mjs";
|
|
|
15
15
|
import { createFileClass } from "./file.mjs";
|
|
16
16
|
import { createDOMExceptionClass } from "./dom-exception.mjs";
|
|
17
17
|
import { createURLSearchParamsClass } from "./url-search-params.mjs";
|
|
18
|
-
import { createURLClass,
|
|
18
|
+
import { createURLClass, addURLSearchParamsLinkage } from "./url.mjs";
|
|
19
19
|
import { INTERNAL_STATE } from "./types.mjs";
|
|
20
20
|
import { withScope, withScopeAsync } from "./scope.mjs";
|
|
21
21
|
import { marshal, isHandle, getHandleType } from "./marshal.mjs";
|
|
@@ -37,7 +37,12 @@ import {
|
|
|
37
37
|
isInstanceOf,
|
|
38
38
|
getClassInstanceState,
|
|
39
39
|
getInstanceId,
|
|
40
|
-
getClassName
|
|
40
|
+
getClassName,
|
|
41
|
+
createClassTypeGuard,
|
|
42
|
+
isUnmarshalledRequest,
|
|
43
|
+
isUnmarshalledResponse,
|
|
44
|
+
isUnmarshalledHeaders,
|
|
45
|
+
isUnmarshalledFormData
|
|
41
46
|
} from "./class-helpers.mjs";
|
|
42
47
|
import {
|
|
43
48
|
nextInstanceId,
|
|
@@ -54,7 +59,18 @@ import { createWritableStream } from "./streams/writable-stream.mjs";
|
|
|
54
59
|
import { createBlob } from "./blob.mjs";
|
|
55
60
|
import { createFile } from "./file.mjs";
|
|
56
61
|
import { createURLSearchParamsClass as createURLSearchParamsClass2 } from "./url-search-params.mjs";
|
|
57
|
-
import { createURLClass as createURLClass2, addURLSearchParamsGetter as addURLSearchParamsGetter2 } from "./url.mjs";
|
|
62
|
+
import { createURLClass as createURLClass2, addURLSearchParamsLinkage as addURLSearchParamsLinkage2, addURLSearchParamsGetter as addURLSearchParamsGetter2 } from "./url.mjs";
|
|
63
|
+
import {
|
|
64
|
+
createCoercer,
|
|
65
|
+
classCoercer,
|
|
66
|
+
instanceOrShape,
|
|
67
|
+
coerceURL,
|
|
68
|
+
coerceToURLString,
|
|
69
|
+
coerceHeaders,
|
|
70
|
+
coerceBody,
|
|
71
|
+
coerceRequestInit,
|
|
72
|
+
coerceResponseInit
|
|
73
|
+
} from "./coerce.mjs";
|
|
58
74
|
function setupCore(context, options) {
|
|
59
75
|
const stateMap = options?.stateMap ?? createStateMap();
|
|
60
76
|
const handles = [];
|
|
@@ -104,7 +120,7 @@ function setupCore(context, options) {
|
|
|
104
120
|
const URLClass = createURLClass(context, stateMap);
|
|
105
121
|
context.setProp(context.global, "URL", URLClass);
|
|
106
122
|
URLClass.dispose();
|
|
107
|
-
|
|
123
|
+
addURLSearchParamsLinkage(context);
|
|
108
124
|
const textEncodingCode = `
|
|
109
125
|
(function() {
|
|
110
126
|
class TextEncoder {
|
|
@@ -239,9 +255,14 @@ export {
|
|
|
239
255
|
registerInstance,
|
|
240
256
|
nextInstanceId,
|
|
241
257
|
marshal,
|
|
258
|
+
isUnmarshalledResponse,
|
|
259
|
+
isUnmarshalledRequest,
|
|
260
|
+
isUnmarshalledHeaders,
|
|
261
|
+
isUnmarshalledFormData,
|
|
242
262
|
isInstanceOf,
|
|
243
263
|
isHandle,
|
|
244
264
|
isDefineClassInstance,
|
|
265
|
+
instanceOrShape,
|
|
245
266
|
getState,
|
|
246
267
|
getInstanceStateById,
|
|
247
268
|
getInstanceState,
|
|
@@ -260,14 +281,24 @@ export {
|
|
|
260
281
|
createStateMap2 as createStateMap,
|
|
261
282
|
createReadableStream2 as createReadableStream,
|
|
262
283
|
createFile,
|
|
284
|
+
createCoercer,
|
|
285
|
+
createClassTypeGuard,
|
|
263
286
|
createBlob,
|
|
264
287
|
consumeReadableStream,
|
|
288
|
+
coerceURL,
|
|
289
|
+
coerceToURLString,
|
|
290
|
+
coerceResponseInit,
|
|
291
|
+
coerceRequestInit,
|
|
292
|
+
coerceHeaders,
|
|
293
|
+
coerceBody,
|
|
265
294
|
clearAllInstanceState,
|
|
266
295
|
cleanupUnmarshaledHandles,
|
|
267
296
|
cleanupInstanceState2 as cleanupInstanceStateById,
|
|
268
297
|
cleanupInstanceState,
|
|
298
|
+
classCoercer,
|
|
299
|
+
addURLSearchParamsLinkage2 as addURLSearchParamsLinkage,
|
|
269
300
|
addURLSearchParamsGetter2 as addURLSearchParamsGetter,
|
|
270
301
|
INTERNAL_STATE
|
|
271
302
|
};
|
|
272
303
|
|
|
273
|
-
//# debugId=
|
|
304
|
+
//# debugId=F1D8DE89A0C3E63864756E2164756E21
|
package/dist/mjs/index.mjs.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { SetupCoreOptions, CoreHandle, StateMap } from \"./types.mjs\";\nimport { createStateMap } from \"./class-builder.mjs\";\nimport {\n createReadableStreamClass,\n createReadableStreamDefaultReaderClass,\n createReadableStream,\n} from \"./streams/readable-stream.mjs\";\nimport {\n createWritableStreamClass,\n createWritableStreamDefaultWriterClass,\n} from \"./streams/writable-stream.mjs\";\nimport { createTransformStreamClass } from \"./streams/transform-stream.mjs\";\nimport { createBlobClass } from \"./blob.mjs\";\nimport { createFileClass } from \"./file.mjs\";\nimport { createDOMExceptionClass } from \"./dom-exception.mjs\";\nimport { createURLSearchParamsClass } from \"./url-search-params.mjs\";\nimport { createURLClass, addURLSearchParamsGetter } from \"./url.mjs\";\n\n/**\n * Setup core APIs in a QuickJS context\n *\n * Injects the following globals:\n * - ReadableStream, WritableStream, TransformStream\n * - ReadableStreamDefaultReader, WritableStreamDefaultWriter\n * - Blob\n * - File\n * - DOMException\n * - URL, URLSearchParams\n * - TextEncoder, TextDecoder\n *\n * @example\n * const handle = setupCore(context);\n *\n * context.evalCode(`\n * const blob = new Blob([\"hello\", \" \", \"world\"], { type: \"text/plain\" });\n * const text = await blob.text(); // \"hello world\"\n *\n * const stream = new ReadableStream({\n * start(controller) {\n * controller.enqueue(\"chunk1\");\n * controller.enqueue(\"chunk2\");\n * controller.close();\n * }\n * });\n * `);\n */\nexport function setupCore(\n context: QuickJSContext,\n options?: SetupCoreOptions\n): CoreHandle {\n const stateMap = options?.stateMap ?? createStateMap();\n const handles: { name: string; handle: QuickJSHandle }[] = [];\n\n // Create ReadableStreamDefaultReader class first\n const ReadableStreamDefaultReader = createReadableStreamDefaultReaderClass(\n context,\n stateMap\n );\n context.setProp(\n context.global,\n \"ReadableStreamDefaultReader\",\n ReadableStreamDefaultReader\n );\n ReadableStreamDefaultReader.dispose();\n\n // Create ReadableStream class\n const readerClassRef = context.getProp(context.global, \"ReadableStreamDefaultReader\");\n const ReadableStream = createReadableStreamClass(\n context,\n stateMap,\n readerClassRef\n );\n readerClassRef.dispose();\n context.setProp(context.global, \"ReadableStream\", ReadableStream);\n ReadableStream.dispose();\n\n // Create WritableStreamDefaultWriter class first\n const WritableStreamDefaultWriter = createWritableStreamDefaultWriterClass(\n context,\n stateMap\n );\n context.setProp(\n context.global,\n \"WritableStreamDefaultWriter\",\n WritableStreamDefaultWriter\n );\n WritableStreamDefaultWriter.dispose();\n\n // Create WritableStream class\n const writerClassRef = context.getProp(context.global, \"WritableStreamDefaultWriter\");\n const WritableStream = createWritableStreamClass(\n context,\n stateMap,\n writerClassRef\n );\n writerClassRef.dispose();\n context.setProp(context.global, \"WritableStream\", WritableStream);\n WritableStream.dispose();\n\n // Create TransformStream class\n const TransformStream = createTransformStreamClass(context, stateMap);\n context.setProp(context.global, \"TransformStream\", TransformStream);\n TransformStream.dispose();\n\n // Create Blob class with stream factory\n const BlobClass = createBlobClass(context, stateMap, (source) =>\n createReadableStream(context, stateMap, source)\n );\n context.setProp(context.global, \"Blob\", BlobClass);\n BlobClass.dispose();\n\n // Create File class (extends Blob)\n const blobClassRef = context.getProp(context.global, \"Blob\");\n const FileClass = createFileClass(context, stateMap, blobClassRef);\n blobClassRef.dispose();\n context.setProp(context.global, \"File\", FileClass);\n FileClass.dispose();\n\n // Create DOMException class\n const DOMExceptionClass = createDOMExceptionClass(context, stateMap);\n context.setProp(context.global, \"DOMException\", DOMExceptionClass);\n DOMExceptionClass.dispose();\n\n // Create URLSearchParams class\n const URLSearchParamsClass = createURLSearchParamsClass(context, stateMap);\n context.setProp(context.global, \"URLSearchParams\", URLSearchParamsClass);\n URLSearchParamsClass.dispose();\n\n // Add Symbol.iterator support for URLSearchParams\n const urlSearchParamsIteratorResult = context.evalCode(`\n URLSearchParams.prototype[Symbol.iterator] = function() {\n return this.entries()[Symbol.iterator]();\n };\n `);\n if (urlSearchParamsIteratorResult.error) {\n urlSearchParamsIteratorResult.error.dispose();\n } else {\n urlSearchParamsIteratorResult.value.dispose();\n }\n\n // Create URL class (depends on URLSearchParams)\n const URLClass = createURLClass(context, stateMap);\n context.setProp(context.global, \"URL\", URLClass);\n URLClass.dispose();\n\n // Add searchParams getter to URL that returns URLSearchParams instance\n addURLSearchParamsGetter(context);\n\n // TextEncoder/TextDecoder - pure JS implementation for UTF-8\n const textEncodingCode = `\n(function() {\n class TextEncoder {\n constructor(encoding = \"utf-8\") {\n if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n throw new RangeError(\"The encoding label provided is invalid.\");\n }\n this.encoding = \"utf-8\";\n }\n\n encode(input = \"\") {\n const str = String(input);\n const bytes = [];\n\n for (let i = 0; i < str.length; i++) {\n let charCode = str.charCodeAt(i);\n\n if (charCode < 0x80) {\n bytes.push(charCode);\n } else if (charCode < 0x800) {\n bytes.push(0xC0 | (charCode >> 6));\n bytes.push(0x80 | (charCode & 0x3F));\n } else if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n const nextCharCode = str.charCodeAt(++i);\n if (nextCharCode >= 0xDC00 && nextCharCode <= 0xDFFF) {\n const codePoint = 0x10000 + ((charCode - 0xD800) << 10) + (nextCharCode - 0xDC00);\n bytes.push(0xF0 | (codePoint >> 18));\n bytes.push(0x80 | ((codePoint >> 12) & 0x3F));\n bytes.push(0x80 | ((codePoint >> 6) & 0x3F));\n bytes.push(0x80 | (codePoint & 0x3F));\n }\n } else if (charCode < 0x10000) {\n bytes.push(0xE0 | (charCode >> 12));\n bytes.push(0x80 | ((charCode >> 6) & 0x3F));\n bytes.push(0x80 | (charCode & 0x3F));\n }\n }\n\n return new Uint8Array(bytes);\n }\n\n encodeInto(source, destination) {\n const encoded = this.encode(source);\n const len = Math.min(encoded.length, destination.length);\n destination.set(encoded.subarray(0, len));\n return { read: source.length, written: len };\n }\n }\n\n class TextDecoder {\n constructor(encoding = \"utf-8\", options = {}) {\n if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n throw new RangeError(\"The encoding label provided is invalid.\");\n }\n this.encoding = \"utf-8\";\n this.fatal = Boolean(options.fatal);\n this.ignoreBOM = Boolean(options.ignoreBOM);\n }\n\n decode(input, options = {}) {\n if (!input) return \"\";\n\n let bytes;\n if (input instanceof ArrayBuffer) {\n bytes = new Uint8Array(input);\n } else if (ArrayBuffer.isView(input)) {\n bytes = new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n } else if (input instanceof Uint8Array) {\n bytes = input;\n } else {\n throw new TypeError(\"The provided value is not of type '(ArrayBuffer or ArrayBufferView)'\");\n }\n\n let offset = 0;\n if (!this.ignoreBOM && bytes.length >= 3 &&\n bytes[0] === 0xEF && bytes[1] === 0xBB && bytes[2] === 0xBF) {\n offset = 3;\n }\n\n let result = \"\";\n for (let i = offset; i < bytes.length;) {\n const byte1 = bytes[i++];\n\n if (byte1 < 0x80) {\n result += String.fromCharCode(byte1);\n } else if ((byte1 & 0xE0) === 0xC0) {\n const byte2 = bytes[i++] & 0x3F;\n result += String.fromCharCode(((byte1 & 0x1F) << 6) | byte2);\n } else if ((byte1 & 0xF0) === 0xE0) {\n const byte2 = bytes[i++] & 0x3F;\n const byte3 = bytes[i++] & 0x3F;\n result += String.fromCharCode(((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3);\n } else if ((byte1 & 0xF8) === 0xF0) {\n const byte2 = bytes[i++] & 0x3F;\n const byte3 = bytes[i++] & 0x3F;\n const byte4 = bytes[i++] & 0x3F;\n const codePoint = ((byte1 & 0x07) << 18) | (byte2 << 12) | (byte3 << 6) | byte4;\n const adjusted = codePoint - 0x10000;\n result += String.fromCharCode(0xD800 + (adjusted >> 10), 0xDC00 + (adjusted & 0x3FF));\n }\n }\n\n return result;\n }\n }\n\n globalThis.TextEncoder = TextEncoder;\n globalThis.TextDecoder = TextDecoder;\n})();\n`;\n\n const textEncodingResult = context.evalCode(textEncodingCode);\n if (textEncodingResult.error) {\n console.error(\"Failed to setup TextEncoder/TextDecoder\");\n textEncodingResult.error.dispose();\n } else {\n textEncodingResult.value.dispose();\n }\n\n /**\n * @returns CoreHandle with shared stateMap and dispose method\n *\n * **dispose() behavior:**\n * - Clears internal handle tracking array\n * - Does NOT dispose globals (ReadableStream, Blob, etc.) - they are owned\n * by context.global and cleaned up by context.dispose()\n * - Call before context.dispose() to release internal references\n *\n * @see PATTERNS.md for implementation patterns\n */\n return {\n stateMap,\n dispose() {\n // Note: handles set on global (ReadableStream, Blob, etc.) are NOT disposed here\n // They are owned by the global object and will be cleaned up by context.dispose()\n // Disposing them before context disposal causes QuickJS GC assertion failures\n handles.length = 0;\n },\n };\n}\n\n// Re-export types\nexport type {\n Scope,\n MarshalOptions,\n UnmarshalOptions,\n PropertyDescriptor,\n ClassDefinition,\n StateMap,\n SetupCoreOptions,\n CoreHandle,\n QuickJSContext,\n QuickJSHandle,\n QuickJSRuntime,\n} from \"./types.mjs\";\nexport { INTERNAL_STATE } from \"./types.mjs\";\n\n// Re-export utilities\nexport { withScope, withScopeAsync } from \"./scope.mjs\";\nexport { marshal, isHandle, getHandleType } from \"./marshal.mjs\";\nexport { unmarshal, cleanupUnmarshaledHandles } from \"./unmarshal.mjs\";\nexport { defineFunction, defineAsyncFunction } from \"./function-builder.mjs\";\nexport {\n defineClass,\n createStateMap,\n getState,\n setState,\n getInstanceState,\n setInstanceState,\n getInstanceStateById,\n cleanupInstanceState,\n clearAllInstanceState,\n} from \"./class-builder.mjs\";\n\n// Re-export class instance helpers for cross-class access\nexport {\n isDefineClassInstance,\n isInstanceOf,\n getClassInstanceState,\n getInstanceId,\n getClassName,\n} from \"./class-helpers.mjs\";\nexport type { DefineClassInstance } from \"./class-helpers.mjs\";\n\n// Re-export instance state management\nexport {\n nextInstanceId,\n registerInstance,\n getInstanceMetadata,\n getInstanceClassName,\n cleanupInstanceState as cleanupInstanceStateById,\n} from \"./instance-state.mjs\";\nexport type { InstanceMetadata } from \"./instance-state.mjs\";\n\n// Re-export stream utilities\nexport {\n createReadableStream,\n consumeReadableStream,\n} from \"./streams/readable-stream.mjs\";\nexport { createWritableStream } from \"./streams/writable-stream.mjs\";\n\n// Re-export Blob/File utilities\nexport { createBlob } from \"./blob.mjs\";\nexport { createFile } from \"./file.mjs\";\n\n// Re-export URL utilities\nexport { createURLSearchParamsClass } from \"./url-search-params.mjs\";\nexport type { URLSearchParamsState } from \"./url-search-params.mjs\";\nexport { createURLClass, addURLSearchParamsGetter } from \"./url.mjs\";\nexport type { URLState } from \"./url.mjs\";\n"
|
|
5
|
+
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { SetupCoreOptions, CoreHandle, StateMap } from \"./types.mjs\";\nimport { createStateMap } from \"./class-builder.mjs\";\nimport {\n createReadableStreamClass,\n createReadableStreamDefaultReaderClass,\n createReadableStream,\n} from \"./streams/readable-stream.mjs\";\nimport {\n createWritableStreamClass,\n createWritableStreamDefaultWriterClass,\n} from \"./streams/writable-stream.mjs\";\nimport { createTransformStreamClass } from \"./streams/transform-stream.mjs\";\nimport { createBlobClass } from \"./blob.mjs\";\nimport { createFileClass } from \"./file.mjs\";\nimport { createDOMExceptionClass } from \"./dom-exception.mjs\";\nimport { createURLSearchParamsClass } from \"./url-search-params.mjs\";\nimport { createURLClass, addURLSearchParamsLinkage, addURLSearchParamsGetter } from \"./url.mjs\";\n\n/**\n * Setup core APIs in a QuickJS context\n *\n * Injects the following globals:\n * - ReadableStream, WritableStream, TransformStream\n * - ReadableStreamDefaultReader, WritableStreamDefaultWriter\n * - Blob\n * - File\n * - DOMException\n * - URL, URLSearchParams\n * - TextEncoder, TextDecoder\n *\n * @example\n * const handle = setupCore(context);\n *\n * context.evalCode(`\n * const blob = new Blob([\"hello\", \" \", \"world\"], { type: \"text/plain\" });\n * const text = await blob.text(); // \"hello world\"\n *\n * const stream = new ReadableStream({\n * start(controller) {\n * controller.enqueue(\"chunk1\");\n * controller.enqueue(\"chunk2\");\n * controller.close();\n * }\n * });\n * `);\n */\nexport function setupCore(\n context: QuickJSContext,\n options?: SetupCoreOptions\n): CoreHandle {\n const stateMap = options?.stateMap ?? createStateMap();\n const handles: { name: string; handle: QuickJSHandle }[] = [];\n\n // Create ReadableStreamDefaultReader class first\n const ReadableStreamDefaultReader = createReadableStreamDefaultReaderClass(\n context,\n stateMap\n );\n context.setProp(\n context.global,\n \"ReadableStreamDefaultReader\",\n ReadableStreamDefaultReader\n );\n ReadableStreamDefaultReader.dispose();\n\n // Create ReadableStream class\n const readerClassRef = context.getProp(context.global, \"ReadableStreamDefaultReader\");\n const ReadableStream = createReadableStreamClass(\n context,\n stateMap,\n readerClassRef\n );\n readerClassRef.dispose();\n context.setProp(context.global, \"ReadableStream\", ReadableStream);\n ReadableStream.dispose();\n\n // Create WritableStreamDefaultWriter class first\n const WritableStreamDefaultWriter = createWritableStreamDefaultWriterClass(\n context,\n stateMap\n );\n context.setProp(\n context.global,\n \"WritableStreamDefaultWriter\",\n WritableStreamDefaultWriter\n );\n WritableStreamDefaultWriter.dispose();\n\n // Create WritableStream class\n const writerClassRef = context.getProp(context.global, \"WritableStreamDefaultWriter\");\n const WritableStream = createWritableStreamClass(\n context,\n stateMap,\n writerClassRef\n );\n writerClassRef.dispose();\n context.setProp(context.global, \"WritableStream\", WritableStream);\n WritableStream.dispose();\n\n // Create TransformStream class\n const TransformStream = createTransformStreamClass(context, stateMap);\n context.setProp(context.global, \"TransformStream\", TransformStream);\n TransformStream.dispose();\n\n // Create Blob class with stream factory\n const BlobClass = createBlobClass(context, stateMap, (source) =>\n createReadableStream(context, stateMap, source)\n );\n context.setProp(context.global, \"Blob\", BlobClass);\n BlobClass.dispose();\n\n // Create File class (extends Blob)\n const blobClassRef = context.getProp(context.global, \"Blob\");\n const FileClass = createFileClass(context, stateMap, blobClassRef);\n blobClassRef.dispose();\n context.setProp(context.global, \"File\", FileClass);\n FileClass.dispose();\n\n // Create DOMException class\n const DOMExceptionClass = createDOMExceptionClass(context, stateMap);\n context.setProp(context.global, \"DOMException\", DOMExceptionClass);\n DOMExceptionClass.dispose();\n\n // Create URLSearchParams class\n const URLSearchParamsClass = createURLSearchParamsClass(context, stateMap);\n context.setProp(context.global, \"URLSearchParams\", URLSearchParamsClass);\n URLSearchParamsClass.dispose();\n\n // Add Symbol.iterator support for URLSearchParams\n const urlSearchParamsIteratorResult = context.evalCode(`\n URLSearchParams.prototype[Symbol.iterator] = function() {\n return this.entries()[Symbol.iterator]();\n };\n `);\n if (urlSearchParamsIteratorResult.error) {\n urlSearchParamsIteratorResult.error.dispose();\n } else {\n urlSearchParamsIteratorResult.value.dispose();\n }\n\n // Create URL class (depends on URLSearchParams)\n const URLClass = createURLClass(context, stateMap);\n context.setProp(context.global, \"URL\", URLClass);\n URLClass.dispose();\n\n // Add searchParams getter to URL that returns URLSearchParams instance\n // Uses JavaScript closures to sync URLSearchParams mutations back to URL\n addURLSearchParamsLinkage(context);\n\n // TextEncoder/TextDecoder - pure JS implementation for UTF-8\n const textEncodingCode = `\n(function() {\n class TextEncoder {\n constructor(encoding = \"utf-8\") {\n if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n throw new RangeError(\"The encoding label provided is invalid.\");\n }\n this.encoding = \"utf-8\";\n }\n\n encode(input = \"\") {\n const str = String(input);\n const bytes = [];\n\n for (let i = 0; i < str.length; i++) {\n let charCode = str.charCodeAt(i);\n\n if (charCode < 0x80) {\n bytes.push(charCode);\n } else if (charCode < 0x800) {\n bytes.push(0xC0 | (charCode >> 6));\n bytes.push(0x80 | (charCode & 0x3F));\n } else if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n const nextCharCode = str.charCodeAt(++i);\n if (nextCharCode >= 0xDC00 && nextCharCode <= 0xDFFF) {\n const codePoint = 0x10000 + ((charCode - 0xD800) << 10) + (nextCharCode - 0xDC00);\n bytes.push(0xF0 | (codePoint >> 18));\n bytes.push(0x80 | ((codePoint >> 12) & 0x3F));\n bytes.push(0x80 | ((codePoint >> 6) & 0x3F));\n bytes.push(0x80 | (codePoint & 0x3F));\n }\n } else if (charCode < 0x10000) {\n bytes.push(0xE0 | (charCode >> 12));\n bytes.push(0x80 | ((charCode >> 6) & 0x3F));\n bytes.push(0x80 | (charCode & 0x3F));\n }\n }\n\n return new Uint8Array(bytes);\n }\n\n encodeInto(source, destination) {\n const encoded = this.encode(source);\n const len = Math.min(encoded.length, destination.length);\n destination.set(encoded.subarray(0, len));\n return { read: source.length, written: len };\n }\n }\n\n class TextDecoder {\n constructor(encoding = \"utf-8\", options = {}) {\n if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n throw new RangeError(\"The encoding label provided is invalid.\");\n }\n this.encoding = \"utf-8\";\n this.fatal = Boolean(options.fatal);\n this.ignoreBOM = Boolean(options.ignoreBOM);\n }\n\n decode(input, options = {}) {\n if (!input) return \"\";\n\n let bytes;\n if (input instanceof ArrayBuffer) {\n bytes = new Uint8Array(input);\n } else if (ArrayBuffer.isView(input)) {\n bytes = new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n } else if (input instanceof Uint8Array) {\n bytes = input;\n } else {\n throw new TypeError(\"The provided value is not of type '(ArrayBuffer or ArrayBufferView)'\");\n }\n\n let offset = 0;\n if (!this.ignoreBOM && bytes.length >= 3 &&\n bytes[0] === 0xEF && bytes[1] === 0xBB && bytes[2] === 0xBF) {\n offset = 3;\n }\n\n let result = \"\";\n for (let i = offset; i < bytes.length;) {\n const byte1 = bytes[i++];\n\n if (byte1 < 0x80) {\n result += String.fromCharCode(byte1);\n } else if ((byte1 & 0xE0) === 0xC0) {\n const byte2 = bytes[i++] & 0x3F;\n result += String.fromCharCode(((byte1 & 0x1F) << 6) | byte2);\n } else if ((byte1 & 0xF0) === 0xE0) {\n const byte2 = bytes[i++] & 0x3F;\n const byte3 = bytes[i++] & 0x3F;\n result += String.fromCharCode(((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3);\n } else if ((byte1 & 0xF8) === 0xF0) {\n const byte2 = bytes[i++] & 0x3F;\n const byte3 = bytes[i++] & 0x3F;\n const byte4 = bytes[i++] & 0x3F;\n const codePoint = ((byte1 & 0x07) << 18) | (byte2 << 12) | (byte3 << 6) | byte4;\n const adjusted = codePoint - 0x10000;\n result += String.fromCharCode(0xD800 + (adjusted >> 10), 0xDC00 + (adjusted & 0x3FF));\n }\n }\n\n return result;\n }\n }\n\n globalThis.TextEncoder = TextEncoder;\n globalThis.TextDecoder = TextDecoder;\n})();\n`;\n\n const textEncodingResult = context.evalCode(textEncodingCode);\n if (textEncodingResult.error) {\n console.error(\"Failed to setup TextEncoder/TextDecoder\");\n textEncodingResult.error.dispose();\n } else {\n textEncodingResult.value.dispose();\n }\n\n /**\n * @returns CoreHandle with shared stateMap and dispose method\n *\n * **dispose() behavior:**\n * - Clears internal handle tracking array\n * - Does NOT dispose globals (ReadableStream, Blob, etc.) - they are owned\n * by context.global and cleaned up by context.dispose()\n * - Call before context.dispose() to release internal references\n *\n * @see PATTERNS.md for implementation patterns\n */\n return {\n stateMap,\n dispose() {\n // Note: handles set on global (ReadableStream, Blob, etc.) are NOT disposed here\n // They are owned by the global object and will be cleaned up by context.dispose()\n // Disposing them before context disposal causes QuickJS GC assertion failures\n handles.length = 0;\n },\n };\n}\n\n// Re-export types\nexport type {\n Scope,\n MarshalOptions,\n UnmarshalOptions,\n PropertyDescriptor,\n ClassDefinition,\n StateMap,\n SetupCoreOptions,\n CoreHandle,\n QuickJSContext,\n QuickJSHandle,\n QuickJSRuntime,\n} from \"./types.mjs\";\nexport { INTERNAL_STATE } from \"./types.mjs\";\n\n// Re-export utilities\nexport { withScope, withScopeAsync } from \"./scope.mjs\";\nexport { marshal, isHandle, getHandleType } from \"./marshal.mjs\";\nexport { unmarshal, cleanupUnmarshaledHandles } from \"./unmarshal.mjs\";\nexport { defineFunction, defineAsyncFunction } from \"./function-builder.mjs\";\nexport {\n defineClass,\n createStateMap,\n getState,\n setState,\n getInstanceState,\n setInstanceState,\n getInstanceStateById,\n cleanupInstanceState,\n clearAllInstanceState,\n} from \"./class-builder.mjs\";\n\n// Re-export class instance helpers for cross-class access\nexport {\n isDefineClassInstance,\n isInstanceOf,\n getClassInstanceState,\n getInstanceId,\n getClassName,\n createClassTypeGuard,\n isUnmarshalledRequest,\n isUnmarshalledResponse,\n isUnmarshalledHeaders,\n isUnmarshalledFormData,\n} from \"./class-helpers.mjs\";\nexport type { DefineClassInstance, TypedClassInstance } from \"./class-helpers.mjs\";\n\n// Re-export instance state management\nexport {\n nextInstanceId,\n registerInstance,\n getInstanceMetadata,\n getInstanceClassName,\n cleanupInstanceState as cleanupInstanceStateById,\n} from \"./instance-state.mjs\";\nexport type { InstanceMetadata } from \"./instance-state.mjs\";\n\n// Re-export stream utilities\nexport {\n createReadableStream,\n consumeReadableStream,\n} from \"./streams/readable-stream.mjs\";\nexport { createWritableStream } from \"./streams/writable-stream.mjs\";\n\n// Re-export Blob/File utilities\nexport { createBlob } from \"./blob.mjs\";\nexport { createFile } from \"./file.mjs\";\n\n// Re-export URL utilities\nexport { createURLSearchParamsClass } from \"./url-search-params.mjs\";\nexport type { URLSearchParamsState } from \"./url-search-params.mjs\";\nexport { createURLClass, addURLSearchParamsLinkage, addURLSearchParamsGetter } from \"./url.mjs\";\nexport type { URLState } from \"./url.mjs\";\n\n// Re-export coercion utilities\nexport {\n createCoercer,\n classCoercer,\n instanceOrShape,\n coerceURL,\n coerceToURLString,\n coerceHeaders,\n coerceBody,\n coerceRequestInit,\n coerceResponseInit,\n} from \"./coerce.mjs\";\nexport type {\n Coercer,\n CoercionResult,\n URLCoerced,\n HeadersCoerced,\n RequestInitCoerced,\n ResponseInitCoerced,\n} from \"./coerce.mjs\";\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAIA;AACA;AACA;AACA;AACA;AACA;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAIA;AACA;AACA;AACA;AACA;AACA;AAiSA;AAGA;AACA;AACA;AACA;AACA;AAAA;AAAA,oBAEE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAK0B;AAAA;AAK1B;AAAA,0BACE;AAAA;AAAA;AAGF;AAGA;AACA;AAGA,uCAAS;AAET,2BAAS,8CAAgB,wDAA2B;AAIpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAjUO,SAAS,SAAS,CACvB,SACA,SACY;AAAA,EACZ,MAAM,WAAW,SAAS,YAAY,eAAe;AAAA,EACrD,MAAM,UAAqD,CAAC;AAAA,EAG5D,MAAM,8BAA8B,uCAClC,SACA,QACF;AAAA,EACA,QAAQ,QACN,QAAQ,QACR,+BACA,2BACF;AAAA,EACA,4BAA4B,QAAQ;AAAA,EAGpC,MAAM,iBAAiB,QAAQ,QAAQ,QAAQ,QAAQ,6BAA6B;AAAA,EACpF,MAAM,iBAAiB,0BACrB,SACA,UACA,cACF;AAAA,EACA,eAAe,QAAQ;AAAA,EACvB,QAAQ,QAAQ,QAAQ,QAAQ,kBAAkB,cAAc;AAAA,EAChE,eAAe,QAAQ;AAAA,EAGvB,MAAM,8BAA8B,uCAClC,SACA,QACF;AAAA,EACA,QAAQ,QACN,QAAQ,QACR,+BACA,2BACF;AAAA,EACA,4BAA4B,QAAQ;AAAA,EAGpC,MAAM,iBAAiB,QAAQ,QAAQ,QAAQ,QAAQ,6BAA6B;AAAA,EACpF,MAAM,iBAAiB,0BACrB,SACA,UACA,cACF;AAAA,EACA,eAAe,QAAQ;AAAA,EACvB,QAAQ,QAAQ,QAAQ,QAAQ,kBAAkB,cAAc;AAAA,EAChE,eAAe,QAAQ;AAAA,EAGvB,MAAM,kBAAkB,2BAA2B,SAAS,QAAQ;AAAA,EACpE,QAAQ,QAAQ,QAAQ,QAAQ,mBAAmB,eAAe;AAAA,EAClE,gBAAgB,QAAQ;AAAA,EAGxB,MAAM,YAAY,gBAAgB,SAAS,UAAU,CAAC,WACpD,qBAAqB,SAAS,UAAU,MAAM,CAChD;AAAA,EACA,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA,EACjD,UAAU,QAAQ;AAAA,EAGlB,MAAM,eAAe,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;AAAA,EAC3D,MAAM,YAAY,gBAAgB,SAAS,UAAU,YAAY;AAAA,EACjE,aAAa,QAAQ;AAAA,EACrB,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA,EACjD,UAAU,QAAQ;AAAA,EAGlB,MAAM,oBAAoB,wBAAwB,SAAS,QAAQ;AAAA,EACnE,QAAQ,QAAQ,QAAQ,QAAQ,gBAAgB,iBAAiB;AAAA,EACjE,kBAAkB,QAAQ;AAAA,EAG1B,MAAM,uBAAuB,2BAA2B,SAAS,QAAQ;AAAA,EACzE,QAAQ,QAAQ,QAAQ,QAAQ,mBAAmB,oBAAoB;AAAA,EACvE,qBAAqB,QAAQ;AAAA,EAG7B,MAAM,gCAAgC,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA,GAItD;AAAA,EACD,IAAI,8BAA8B,OAAO;AAAA,IACvC,8BAA8B,MAAM,QAAQ;AAAA,EAC9C,EAAO;AAAA,IACL,8BAA8B,MAAM,QAAQ;AAAA;AAAA,EAI9C,MAAM,WAAW,eAAe,SAAS,QAAQ;AAAA,EACjD,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,QAAQ;AAAA,EAC/C,SAAS,QAAQ;AAAA,EAIjB,0BAA0B,OAAO;AAAA,EAGjC,MAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+GzB,MAAM,qBAAqB,QAAQ,SAAS,gBAAgB;AAAA,EAC5D,IAAI,mBAAmB,OAAO;AAAA,IAC5B,QAAQ,MAAM,yCAAyC;AAAA,IACvD,mBAAmB,MAAM,QAAQ;AAAA,EACnC,EAAO;AAAA,IACL,mBAAmB,MAAM,QAAQ;AAAA;AAAA,EAcnC,OAAO;AAAA,IACL;AAAA,IACA,OAAO,GAAG;AAAA,MAIR,QAAQ,SAAS;AAAA;AAAA,EAErB;AAAA;",
|
|
8
|
+
"debugId": "F1D8DE89A0C3E63864756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/mjs/package.json
CHANGED