@ricsam/quickjs-core 0.2.0 → 0.2.2

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 (63) hide show
  1. package/dist/cjs/blob.cjs +197 -0
  2. package/dist/cjs/blob.cjs.map +10 -0
  3. package/dist/cjs/class-builder.cjs +244 -0
  4. package/dist/cjs/class-builder.cjs.map +10 -0
  5. package/dist/cjs/dom-exception.cjs +95 -0
  6. package/dist/cjs/dom-exception.cjs.map +10 -0
  7. package/dist/cjs/file.cjs +234 -0
  8. package/dist/cjs/file.cjs.map +10 -0
  9. package/dist/cjs/function-builder.cjs +70 -0
  10. package/dist/cjs/function-builder.cjs.map +10 -0
  11. package/dist/cjs/index.cjs +22 -22
  12. package/dist/cjs/index.cjs.map +2 -2
  13. package/dist/cjs/marshal.cjs +191 -0
  14. package/dist/cjs/marshal.cjs.map +10 -0
  15. package/dist/cjs/package.json +1 -1
  16. package/dist/cjs/readable-stream.cjs +588 -0
  17. package/dist/cjs/readable-stream.cjs.map +10 -0
  18. package/dist/cjs/scope.cjs +76 -0
  19. package/dist/cjs/scope.cjs.map +10 -0
  20. package/dist/cjs/transform-stream.cjs +152 -0
  21. package/dist/cjs/transform-stream.cjs.map +10 -0
  22. package/dist/cjs/types.cjs +39 -0
  23. package/dist/cjs/types.cjs.map +10 -0
  24. package/dist/cjs/unmarshal.cjs +254 -0
  25. package/dist/cjs/unmarshal.cjs.map +10 -0
  26. package/dist/cjs/url-search-params.cjs +165 -0
  27. package/dist/cjs/url-search-params.cjs.map +10 -0
  28. package/dist/cjs/url.cjs +183 -0
  29. package/dist/cjs/url.cjs.map +10 -0
  30. package/dist/cjs/writable-stream.cjs +513 -0
  31. package/dist/cjs/writable-stream.cjs.map +10 -0
  32. package/dist/mjs/blob.mjs +166 -0
  33. package/dist/mjs/blob.mjs.map +10 -0
  34. package/dist/mjs/class-builder.mjs +213 -0
  35. package/dist/mjs/class-builder.mjs.map +10 -0
  36. package/dist/mjs/dom-exception.mjs +64 -0
  37. package/dist/mjs/dom-exception.mjs.map +10 -0
  38. package/dist/mjs/file.mjs +203 -0
  39. package/dist/mjs/file.mjs.map +10 -0
  40. package/dist/mjs/function-builder.mjs +39 -0
  41. package/dist/mjs/function-builder.mjs.map +10 -0
  42. package/dist/mjs/index.mjs +22 -22
  43. package/dist/mjs/index.mjs.map +2 -2
  44. package/dist/mjs/marshal.mjs +160 -0
  45. package/dist/mjs/marshal.mjs.map +10 -0
  46. package/dist/mjs/package.json +1 -1
  47. package/dist/mjs/readable-stream.mjs +557 -0
  48. package/dist/mjs/readable-stream.mjs.map +10 -0
  49. package/dist/mjs/scope.mjs +45 -0
  50. package/dist/mjs/scope.mjs.map +10 -0
  51. package/dist/mjs/transform-stream.mjs +121 -0
  52. package/dist/mjs/transform-stream.mjs.map +10 -0
  53. package/dist/mjs/types.mjs +8 -0
  54. package/dist/mjs/types.mjs.map +10 -0
  55. package/dist/mjs/unmarshal.mjs +223 -0
  56. package/dist/mjs/unmarshal.mjs.map +10 -0
  57. package/dist/mjs/url-search-params.mjs +134 -0
  58. package/dist/mjs/url-search-params.mjs.map +10 -0
  59. package/dist/mjs/url.mjs +152 -0
  60. package/dist/mjs/url.mjs.map +10 -0
  61. package/dist/mjs/writable-stream.mjs +482 -0
  62. package/dist/mjs/writable-stream.mjs.map +10 -0
  63. package/package.json +1 -1
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/unmarshal.ts"],
4
+ "sourcesContent": [
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { UnmarshalOptions } from \"./types.cjs\";\nimport { marshal } from \"./marshal.cjs\";\n\n// Track duped handles per context so they can be cleaned up\nconst contextDupedHandles = new WeakMap<QuickJSContext, Set<QuickJSHandle>>();\n\n/**\n * Get or create the set of duped handles for a context\n */\nfunction getDupedHandles(context: QuickJSContext): Set<QuickJSHandle> {\n let handles = contextDupedHandles.get(context);\n if (!handles) {\n handles = new Set();\n contextDupedHandles.set(context, handles);\n }\n return handles;\n}\n\n/**\n * Clean up all duped handles for a context\n * Should be called before disposing the context\n */\nexport function cleanupUnmarshaledHandles(context: QuickJSContext): void {\n const handles = contextDupedHandles.get(context);\n if (handles) {\n for (const handle of handles) {\n try {\n handle.dispose();\n } catch {\n // Handle may already be disposed\n }\n }\n handles.clear();\n contextDupedHandles.delete(context);\n }\n}\n\n/**\n * Unmarshal a QuickJS handle to a JavaScript value\n *\n * @example\n * const value = unmarshal(context, handle);\n */\nexport function unmarshal(\n context: QuickJSContext,\n handle: QuickJSHandle,\n options: UnmarshalOptions = {}\n): unknown {\n const maxDepth = options.maxDepth ?? 10;\n const seen = new WeakMap<QuickJSHandle, object>();\n\n function unmarshalValue(h: QuickJSHandle, depth: number): unknown {\n if (depth > maxDepth) {\n throw new Error(`Maximum unmarshalling depth of ${maxDepth} exceeded`);\n }\n\n // Try custom unmarshaller first\n if (options.custom) {\n const customResult = options.custom(h, context);\n if (customResult !== undefined) {\n return customResult;\n }\n }\n\n const type = context.typeof(h);\n\n // Handle primitives\n if (type === \"undefined\") {\n return undefined;\n }\n\n // Check for null (typeof returns \"object\" for null)\n const dumpedValue = context.dump(h);\n if (dumpedValue === null) {\n return null;\n }\n\n if (type === \"boolean\") {\n return dumpedValue as boolean;\n }\n if (type === \"number\") {\n return dumpedValue as number;\n }\n if (type === \"string\") {\n return dumpedValue as string;\n }\n\n // Handle bigint\n if (typeof dumpedValue === \"bigint\") {\n return dumpedValue;\n }\n\n // Handle functions - return a wrapper that calls back into QuickJS\n if (type === \"function\") {\n // Dup the handle so it stays alive after unmarshalling\n // This is necessary because the caller may dispose the original handle\n const fnHandle = h.dup();\n // Track the duped handle for cleanup\n getDupedHandles(context).add(fnHandle);\n const wrapper = (...args: unknown[]) => {\n const argHandles = args.map((arg) => marshal(context, arg));\n try {\n const result = context.callFunction(fnHandle, context.undefined, ...argHandles);\n if (result.error) {\n const errorValue = context.dump(result.error);\n result.error.dispose();\n throw new Error(\n typeof errorValue === \"object\" && errorValue !== null\n ? (errorValue as { message?: string }).message || String(errorValue)\n : String(errorValue)\n );\n }\n const value = unmarshalValue(result.value, depth + 1);\n result.value.dispose();\n return value;\n } finally {\n for (const argHandle of argHandles) {\n argHandle.dispose();\n }\n }\n };\n // Attach a dispose method to clean up the handle when the function is no longer needed\n (wrapper as unknown as { __dispose__: () => void }).__dispose__ = () => {\n fnHandle.dispose();\n };\n return wrapper;\n }\n\n // Handle objects\n if (type === \"object\") {\n // Check for circular reference\n if (seen.has(h)) {\n return seen.get(h);\n }\n\n // Check if it's an array\n const lengthHandle = context.getProp(h, \"length\");\n const lengthType = context.typeof(lengthHandle);\n lengthHandle.dispose();\n\n if (lengthType === \"number\") {\n // Check for Array by looking for Array.isArray\n const arrayIsArray = context.getProp(context.global, \"Array\");\n const isArrayFn = context.getProp(arrayIsArray, \"isArray\");\n const isArrayResult = context.callFunction(isArrayFn, context.undefined, h);\n arrayIsArray.dispose();\n isArrayFn.dispose();\n\n let isArray = false;\n if (!isArrayResult.error) {\n isArray = context.dump(isArrayResult.value) === true;\n isArrayResult.value.dispose();\n } else {\n isArrayResult.error.dispose();\n }\n\n if (isArray) {\n const arr: unknown[] = [];\n seen.set(h, arr);\n\n const len = context.getNumber(context.getProp(h, \"length\"));\n const lenHandle = context.getProp(h, \"length\");\n const length = context.getNumber(lenHandle);\n lenHandle.dispose();\n\n for (let i = 0; i < length; i++) {\n const elementHandle = context.getProp(h, i);\n arr[i] = unmarshalValue(elementHandle, depth + 1);\n elementHandle.dispose();\n }\n return arr;\n }\n }\n\n // Check if it's a Date\n const dateConstructor = context.getProp(context.global, \"Date\");\n const isDateResult = context.evalCode(`(function(obj, Date) { return obj instanceof Date; })`);\n if (!isDateResult.error) {\n const checkResult = context.callFunction(\n isDateResult.value,\n context.undefined,\n h,\n dateConstructor\n );\n isDateResult.value.dispose();\n\n if (!checkResult.error && context.dump(checkResult.value) === true) {\n checkResult.value.dispose();\n dateConstructor.dispose();\n\n const getTimeHandle = context.getProp(h, \"getTime\");\n const timeResult = context.callFunction(getTimeHandle, h);\n getTimeHandle.dispose();\n\n if (!timeResult.error) {\n const timestamp = context.getNumber(timeResult.value);\n timeResult.value.dispose();\n return new Date(timestamp);\n }\n if (timeResult.error) timeResult.error.dispose();\n }\n if (checkResult.error) checkResult.error.dispose();\n else if (checkResult.value) checkResult.value.dispose();\n } else {\n isDateResult.error.dispose();\n }\n dateConstructor.dispose();\n\n // Check if it's a Uint8Array\n const uint8ArrayConstructor = context.getProp(context.global, \"Uint8Array\");\n const isUint8ArrayResult = context.evalCode(`(function(obj, U8) { return obj instanceof U8; })`);\n if (!isUint8ArrayResult.error) {\n const checkResult = context.callFunction(\n isUint8ArrayResult.value,\n context.undefined,\n h,\n uint8ArrayConstructor\n );\n isUint8ArrayResult.value.dispose();\n\n if (!checkResult.error && context.dump(checkResult.value) === true) {\n checkResult.value.dispose();\n uint8ArrayConstructor.dispose();\n\n // Get the Uint8Array bytes\n const arrayBuffer = context.getArrayBuffer(h);\n if (arrayBuffer) {\n return new Uint8Array(arrayBuffer.value);\n }\n // Fall through to plain object handling if getArrayBuffer fails\n } else {\n if (checkResult.error) checkResult.error.dispose();\n else checkResult.value.dispose();\n uint8ArrayConstructor.dispose();\n }\n } else {\n isUint8ArrayResult.error.dispose();\n uint8ArrayConstructor.dispose();\n }\n\n // Check if it's an ArrayBuffer\n const arrayBufferConstructor = context.getProp(context.global, \"ArrayBuffer\");\n const isArrayBufferResult = context.evalCode(`(function(obj, AB) { return obj instanceof AB; })`);\n if (!isArrayBufferResult.error) {\n const checkResult = context.callFunction(\n isArrayBufferResult.value,\n context.undefined,\n h,\n arrayBufferConstructor\n );\n isArrayBufferResult.value.dispose();\n\n if (!checkResult.error && context.dump(checkResult.value) === true) {\n checkResult.value.dispose();\n arrayBufferConstructor.dispose();\n\n // Get the ArrayBuffer bytes directly\n const arrayBuffer = context.getArrayBuffer(h);\n if (arrayBuffer) {\n return arrayBuffer.value.slice(0);\n }\n // Fall through to plain object handling if getArrayBuffer fails\n } else {\n if (checkResult.error) checkResult.error.dispose();\n else checkResult.value.dispose();\n arrayBufferConstructor.dispose();\n }\n } else {\n isArrayBufferResult.error.dispose();\n arrayBufferConstructor.dispose();\n }\n\n // Plain object\n const obj: Record<string, unknown> = {};\n seen.set(h, obj);\n\n // Get own enumerable properties\n const keysResult = context.evalCode(`(function(obj) { return Object.keys(obj); })`);\n if (!keysResult.error) {\n const keysArrayHandle = context.callFunction(keysResult.value, context.undefined, h);\n keysResult.value.dispose();\n\n if (!keysArrayHandle.error) {\n const keysArray = unmarshalValue(keysArrayHandle.value, depth + 1) as string[];\n keysArrayHandle.value.dispose();\n\n for (const key of keysArray) {\n const propHandle = context.getProp(h, key);\n obj[key] = unmarshalValue(propHandle, depth + 1);\n propHandle.dispose();\n }\n } else {\n keysArrayHandle.error.dispose();\n }\n } else {\n keysResult.error.dispose();\n }\n\n return obj;\n }\n\n // Fallback to dump for unknown types\n return dumpedValue;\n }\n\n return unmarshalValue(handle, 0);\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "DBC78D31C4F4935E64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,165 @@
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/url-search-params.ts
31
+ var exports_url_search_params = {};
32
+ __export(exports_url_search_params, {
33
+ createURLSearchParamsClass: () => createURLSearchParamsClass
34
+ });
35
+ module.exports = __toCommonJS(exports_url_search_params);
36
+ var import_class_builder = require("./class-builder.cjs");
37
+ function parseQueryString(query) {
38
+ const cleanQuery = query.startsWith("?") ? query.slice(1) : query;
39
+ if (!cleanQuery)
40
+ return [];
41
+ const params = [];
42
+ for (const pair of cleanQuery.split("&")) {
43
+ if (!pair)
44
+ continue;
45
+ const eqIndex = pair.indexOf("=");
46
+ if (eqIndex === -1) {
47
+ params.push([decodeURIComponent(pair), ""]);
48
+ } else {
49
+ const key = decodeURIComponent(pair.slice(0, eqIndex));
50
+ const value = decodeURIComponent(pair.slice(eqIndex + 1));
51
+ params.push([key, value]);
52
+ }
53
+ }
54
+ return params;
55
+ }
56
+ function createURLSearchParamsClass(context, stateMap) {
57
+ return import_class_builder.defineClass(context, stateMap, {
58
+ name: "URLSearchParams",
59
+ construct: (args) => {
60
+ const init = args[0];
61
+ let params = [];
62
+ if (init === undefined || init === null) {
63
+ params = [];
64
+ } else if (typeof init === "string") {
65
+ params = parseQueryString(init);
66
+ } else if (Array.isArray(init)) {
67
+ for (const pair of init) {
68
+ if (Array.isArray(pair) && pair.length >= 2) {
69
+ params.push([String(pair[0]), String(pair[1])]);
70
+ }
71
+ }
72
+ } else if (typeof init === "object") {
73
+ if ("params" in init && Array.isArray(init.params)) {
74
+ params = [...init.params];
75
+ } else {
76
+ for (const [key, value] of Object.entries(init)) {
77
+ params.push([String(key), String(value)]);
78
+ }
79
+ }
80
+ }
81
+ return { params };
82
+ },
83
+ properties: {
84
+ size: {
85
+ get() {
86
+ return this.params.length;
87
+ }
88
+ }
89
+ },
90
+ methods: {
91
+ append(name, value) {
92
+ this.params.push([String(name), String(value)]);
93
+ },
94
+ delete(name, value) {
95
+ const nameStr = String(name);
96
+ if (value !== undefined) {
97
+ const valueStr = String(value);
98
+ this.params = this.params.filter(([k, v]) => !(k === nameStr && v === valueStr));
99
+ } else {
100
+ this.params = this.params.filter(([k]) => k !== nameStr);
101
+ }
102
+ },
103
+ get(name) {
104
+ const nameStr = String(name);
105
+ const entry = this.params.find(([k]) => k === nameStr);
106
+ return entry ? entry[1] : null;
107
+ },
108
+ getAll(name) {
109
+ const nameStr = String(name);
110
+ return this.params.filter(([k]) => k === nameStr).map(([, v]) => v);
111
+ },
112
+ has(name, value) {
113
+ const nameStr = String(name);
114
+ if (value !== undefined) {
115
+ const valueStr = String(value);
116
+ return this.params.some(([k, v]) => k === nameStr && v === valueStr);
117
+ }
118
+ return this.params.some(([k]) => k === nameStr);
119
+ },
120
+ set(name, value) {
121
+ const nameStr = String(name);
122
+ const valueStr = String(value);
123
+ const firstIndex = this.params.findIndex(([k]) => k === nameStr);
124
+ this.params = this.params.filter(([k]) => k !== nameStr);
125
+ if (firstIndex >= 0 && firstIndex <= this.params.length) {
126
+ this.params.splice(firstIndex, 0, [nameStr, valueStr]);
127
+ } else {
128
+ this.params.push([nameStr, valueStr]);
129
+ }
130
+ },
131
+ sort() {
132
+ this.params.sort((a, b) => {
133
+ if (a[0] < b[0])
134
+ return -1;
135
+ if (a[0] > b[0])
136
+ return 1;
137
+ return 0;
138
+ });
139
+ },
140
+ toString() {
141
+ return this.params.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`).join("&");
142
+ },
143
+ entries() {
144
+ return [...this.params];
145
+ },
146
+ keys() {
147
+ return this.params.map(([k]) => k);
148
+ },
149
+ values() {
150
+ return this.params.map(([, v]) => v);
151
+ },
152
+ forEach(callback) {
153
+ if (typeof callback !== "function") {
154
+ throw new TypeError("callback must be a function");
155
+ }
156
+ for (const [name, value] of this.params) {
157
+ callback(value, name, this);
158
+ }
159
+ }
160
+ }
161
+ });
162
+ }
163
+ })
164
+
165
+ //# debugId=FD596EAEA7D7E0F364756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/url-search-params.ts"],
4
+ "sourcesContent": [
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"./types.cjs\";\nimport { defineClass } from \"./class-builder.cjs\";\n\n/**\n * Internal state for URLSearchParams\n */\nexport interface URLSearchParamsState {\n params: [string, string][];\n}\n\n/**\n * Parse a query string into key-value pairs\n */\nfunction parseQueryString(query: string): [string, string][] {\n // Remove leading ? if present\n const cleanQuery = query.startsWith(\"?\") ? query.slice(1) : query;\n if (!cleanQuery) return [];\n\n const params: [string, string][] = [];\n for (const pair of cleanQuery.split(\"&\")) {\n if (!pair) continue;\n const eqIndex = pair.indexOf(\"=\");\n if (eqIndex === -1) {\n // Key with no value\n params.push([decodeURIComponent(pair), \"\"]);\n } else {\n const key = decodeURIComponent(pair.slice(0, eqIndex));\n const value = decodeURIComponent(pair.slice(eqIndex + 1));\n params.push([key, value]);\n }\n }\n return params;\n}\n\n/**\n * Create the URLSearchParams class for QuickJS\n */\nexport function createURLSearchParamsClass(\n context: QuickJSContext,\n stateMap: StateMap\n): QuickJSHandle {\n return defineClass<URLSearchParamsState>(context, stateMap, {\n name: \"URLSearchParams\",\n construct: (args) => {\n const init = args[0];\n let params: [string, string][] = [];\n\n if (init === undefined || init === null) {\n // Empty params\n params = [];\n } else if (typeof init === \"string\") {\n // Parse query string\n params = parseQueryString(init);\n } else if (Array.isArray(init)) {\n // Array of [key, value] pairs\n for (const pair of init) {\n if (Array.isArray(pair) && pair.length >= 2) {\n params.push([String(pair[0]), String(pair[1])]);\n }\n }\n } else if (typeof init === \"object\") {\n // Check if it's another URLSearchParamsState\n if (\"params\" in init && Array.isArray(init.params)) {\n params = [...(init as URLSearchParamsState).params];\n } else {\n // Plain object\n for (const [key, value] of Object.entries(init)) {\n params.push([String(key), String(value)]);\n }\n }\n }\n\n return { params };\n },\n properties: {\n size: {\n get(this: URLSearchParamsState) {\n return this.params.length;\n },\n },\n },\n methods: {\n append(this: URLSearchParamsState, name: unknown, value: unknown) {\n this.params.push([String(name), String(value)]);\n },\n delete(this: URLSearchParamsState, name: unknown, value?: unknown) {\n const nameStr = String(name);\n if (value !== undefined) {\n // Delete only entries with matching name AND value\n const valueStr = String(value);\n this.params = this.params.filter(\n ([k, v]) => !(k === nameStr && v === valueStr)\n );\n } else {\n // Delete all entries with matching name\n this.params = this.params.filter(([k]) => k !== nameStr);\n }\n },\n get(this: URLSearchParamsState, name: unknown): string | null {\n const nameStr = String(name);\n const entry = this.params.find(([k]) => k === nameStr);\n return entry ? entry[1] : null;\n },\n getAll(this: URLSearchParamsState, name: unknown): string[] {\n const nameStr = String(name);\n return this.params.filter(([k]) => k === nameStr).map(([, v]) => v);\n },\n has(this: URLSearchParamsState, name: unknown, value?: unknown): boolean {\n const nameStr = String(name);\n if (value !== undefined) {\n const valueStr = String(value);\n return this.params.some(([k, v]) => k === nameStr && v === valueStr);\n }\n return this.params.some(([k]) => k === nameStr);\n },\n set(this: URLSearchParamsState, name: unknown, value: unknown) {\n const nameStr = String(name);\n const valueStr = String(value);\n // Remove all existing entries with this name\n const firstIndex = this.params.findIndex(([k]) => k === nameStr);\n this.params = this.params.filter(([k]) => k !== nameStr);\n // Insert the new value at the first position (or end if not found)\n if (firstIndex >= 0 && firstIndex <= this.params.length) {\n this.params.splice(firstIndex, 0, [nameStr, valueStr]);\n } else {\n this.params.push([nameStr, valueStr]);\n }\n },\n sort(this: URLSearchParamsState) {\n this.params.sort((a, b) => {\n if (a[0] < b[0]) return -1;\n if (a[0] > b[0]) return 1;\n return 0;\n });\n },\n toString(this: URLSearchParamsState): string {\n return this.params\n .map(\n ([key, value]) =>\n `${encodeURIComponent(key)}=${encodeURIComponent(value)}`\n )\n .join(\"&\");\n },\n entries(this: URLSearchParamsState): [string, string][] {\n return [...this.params];\n },\n keys(this: URLSearchParamsState): string[] {\n return this.params.map(([k]) => k);\n },\n values(this: URLSearchParamsState): string[] {\n return this.params.map(([, v]) => v);\n },\n forEach(this: URLSearchParamsState, callback: unknown) {\n if (typeof callback !== \"function\") {\n throw new TypeError(\"callback must be a function\");\n }\n for (const [name, value] of this.params) {\n (callback as (value: string, name: string, parent: URLSearchParamsState) => void)(\n value,\n name,\n this\n );\n }\n },\n },\n });\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "FD596EAEA7D7E0F364756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,183 @@
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/url.ts
31
+ var exports_url = {};
32
+ __export(exports_url, {
33
+ createURLClass: () => createURLClass,
34
+ addURLSearchParamsGetter: () => addURLSearchParamsGetter
35
+ });
36
+ module.exports = __toCommonJS(exports_url);
37
+ var import_class_builder = require("./class-builder.cjs");
38
+ function createURLClass(context, stateMap) {
39
+ return import_class_builder.defineClass(context, stateMap, {
40
+ name: "URL",
41
+ construct: (args) => {
42
+ const urlString = args[0];
43
+ const base = args[1];
44
+ if (urlString === undefined) {
45
+ throw new TypeError("Failed to construct 'URL': 1 argument required, but only 0 present.");
46
+ }
47
+ let parsed;
48
+ try {
49
+ if (base !== undefined) {
50
+ const baseStr = typeof base === "object" && base !== null && "href" in base ? base.href : String(base);
51
+ parsed = new globalThis.URL(String(urlString), baseStr);
52
+ } else {
53
+ parsed = new globalThis.URL(String(urlString));
54
+ }
55
+ } catch (e) {
56
+ throw new TypeError(`Failed to construct 'URL': Invalid URL`);
57
+ }
58
+ return {
59
+ hash: parsed.hash,
60
+ host: parsed.host,
61
+ hostname: parsed.hostname,
62
+ href: parsed.href,
63
+ origin: parsed.origin,
64
+ password: parsed.password,
65
+ pathname: parsed.pathname,
66
+ port: parsed.port,
67
+ protocol: parsed.protocol,
68
+ search: parsed.search,
69
+ username: parsed.username
70
+ };
71
+ },
72
+ properties: {
73
+ hash: {
74
+ get() {
75
+ return this.hash;
76
+ }
77
+ },
78
+ host: {
79
+ get() {
80
+ return this.host;
81
+ }
82
+ },
83
+ hostname: {
84
+ get() {
85
+ return this.hostname;
86
+ }
87
+ },
88
+ href: {
89
+ get() {
90
+ return this.href;
91
+ }
92
+ },
93
+ origin: {
94
+ get() {
95
+ return this.origin;
96
+ }
97
+ },
98
+ password: {
99
+ get() {
100
+ return this.password;
101
+ }
102
+ },
103
+ pathname: {
104
+ get() {
105
+ return this.pathname;
106
+ }
107
+ },
108
+ port: {
109
+ get() {
110
+ return this.port;
111
+ }
112
+ },
113
+ protocol: {
114
+ get() {
115
+ return this.protocol;
116
+ }
117
+ },
118
+ search: {
119
+ get() {
120
+ return this.search;
121
+ }
122
+ },
123
+ username: {
124
+ get() {
125
+ return this.username;
126
+ }
127
+ }
128
+ },
129
+ methods: {
130
+ toString() {
131
+ return this.href;
132
+ },
133
+ toJSON() {
134
+ return this.href;
135
+ },
136
+ __getSearch__() {
137
+ return this.search;
138
+ }
139
+ },
140
+ staticMethods: {
141
+ canParse(url, base) {
142
+ try {
143
+ if (base !== undefined) {
144
+ new globalThis.URL(String(url), String(base));
145
+ } else {
146
+ new globalThis.URL(String(url));
147
+ }
148
+ return true;
149
+ } catch {
150
+ return false;
151
+ }
152
+ }
153
+ }
154
+ });
155
+ }
156
+ function addURLSearchParamsGetter(context) {
157
+ const result = context.evalCode(`
158
+ (function() {
159
+ const searchParamsCache = new Map();
160
+
161
+ Object.defineProperty(URL.prototype, 'searchParams', {
162
+ get: function() {
163
+ const instanceId = this.__instanceId__;
164
+ if (!searchParamsCache.has(instanceId)) {
165
+ searchParamsCache.set(instanceId, new URLSearchParams(this.__getSearch__()));
166
+ }
167
+ return searchParamsCache.get(instanceId);
168
+ },
169
+ enumerable: true,
170
+ configurable: true
171
+ });
172
+ })();
173
+ `);
174
+ if (result.error) {
175
+ const err = context.dump(result.error);
176
+ result.error.dispose();
177
+ throw new Error(`Failed to add searchParams getter: ${JSON.stringify(err)}`);
178
+ }
179
+ result.value.dispose();
180
+ }
181
+ })
182
+
183
+ //# debugId=C3940F5C588B349864756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/url.ts"],
4
+ "sourcesContent": [
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"./types.cjs\";\nimport { defineClass } from \"./class-builder.cjs\";\n\n/**\n * Internal state for URL\n */\nexport interface URLState {\n hash: string;\n host: string;\n hostname: string;\n href: string;\n origin: string;\n password: string;\n pathname: string;\n port: string;\n protocol: string;\n search: string;\n username: string;\n}\n\n/**\n * Create the URL class for QuickJS\n *\n * Note: The searchParams property is added separately via evalCode\n * after this class is registered, as it needs to return a URLSearchParams instance.\n */\nexport function createURLClass(\n context: QuickJSContext,\n stateMap: StateMap\n): QuickJSHandle {\n return defineClass<URLState>(context, stateMap, {\n name: \"URL\",\n construct: (args) => {\n const urlString = args[0];\n const base = args[1];\n\n if (urlString === undefined) {\n throw new TypeError(\"Failed to construct 'URL': 1 argument required, but only 0 present.\");\n }\n\n let parsed: globalThis.URL;\n try {\n if (base !== undefined) {\n // Handle base URL\n const baseStr = typeof base === \"object\" && base !== null && \"href\" in base\n ? (base as URLState).href\n : String(base);\n parsed = new globalThis.URL(String(urlString), baseStr);\n } else {\n parsed = new globalThis.URL(String(urlString));\n }\n } catch (e) {\n throw new TypeError(`Failed to construct 'URL': Invalid URL`);\n }\n\n return {\n hash: parsed.hash,\n host: parsed.host,\n hostname: parsed.hostname,\n href: parsed.href,\n origin: parsed.origin,\n password: parsed.password,\n pathname: parsed.pathname,\n port: parsed.port,\n protocol: parsed.protocol,\n search: parsed.search,\n username: parsed.username,\n };\n },\n properties: {\n hash: {\n get(this: URLState) {\n return this.hash;\n },\n },\n host: {\n get(this: URLState) {\n return this.host;\n },\n },\n hostname: {\n get(this: URLState) {\n return this.hostname;\n },\n },\n href: {\n get(this: URLState) {\n return this.href;\n },\n },\n origin: {\n get(this: URLState) {\n return this.origin;\n },\n },\n password: {\n get(this: URLState) {\n return this.password;\n },\n },\n pathname: {\n get(this: URLState) {\n return this.pathname;\n },\n },\n port: {\n get(this: URLState) {\n return this.port;\n },\n },\n protocol: {\n get(this: URLState) {\n return this.protocol;\n },\n },\n search: {\n get(this: URLState) {\n return this.search;\n },\n },\n username: {\n get(this: URLState) {\n return this.username;\n },\n },\n },\n methods: {\n toString(this: URLState): string {\n return this.href;\n },\n toJSON(this: URLState): string {\n return this.href;\n },\n // Private method to get search for URLSearchParams creation\n __getSearch__(this: URLState): string {\n return this.search;\n },\n },\n staticMethods: {\n canParse(url: unknown, base?: unknown): boolean {\n try {\n if (base !== undefined) {\n new globalThis.URL(String(url), String(base));\n } else {\n new globalThis.URL(String(url));\n }\n return true;\n } catch {\n return false;\n }\n },\n },\n });\n}\n\n/**\n * Add searchParams getter to URL prototype using evalCode\n * This must be called after both URL and URLSearchParams are registered as globals\n */\nexport function addURLSearchParamsGetter(context: QuickJSContext): void {\n // Use a WeakMap-like pattern with a Map keyed by instance ID\n // Each URL instance will cache its URLSearchParams\n const result = context.evalCode(`\n (function() {\n const searchParamsCache = new Map();\n\n Object.defineProperty(URL.prototype, 'searchParams', {\n get: function() {\n const instanceId = this.__instanceId__;\n if (!searchParamsCache.has(instanceId)) {\n searchParamsCache.set(instanceId, new URLSearchParams(this.__getSearch__()));\n }\n return searchParamsCache.get(instanceId);\n },\n enumerable: true,\n configurable: true\n });\n })();\n `);\n\n if (result.error) {\n const err = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Failed to add searchParams getter: ${JSON.stringify(err)}`);\n }\n result.value.dispose();\n}\n"
6
+ ],
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE4B,IAA5B;AAyBO,SAAS,cAAc,CAC5B,SACA,UACe;AAAA,EACf,OAAO,iCAAsB,SAAS,UAAU;AAAA,IAC9C,MAAM;AAAA,IACN,WAAW,CAAC,SAAS;AAAA,MACnB,MAAM,YAAY,KAAK;AAAA,MACvB,MAAM,OAAO,KAAK;AAAA,MAElB,IAAI,cAAc,WAAW;AAAA,QAC3B,MAAM,IAAI,UAAU,qEAAqE;AAAA,MAC3F;AAAA,MAEA,IAAI;AAAA,MACJ,IAAI;AAAA,QACF,IAAI,SAAS,WAAW;AAAA,UAEtB,MAAM,UAAU,OAAO,SAAS,YAAY,SAAS,QAAQ,UAAU,OAClE,KAAkB,OACnB,OAAO,IAAI;AAAA,UACf,SAAS,IAAI,WAAW,IAAI,OAAO,SAAS,GAAG,OAAO;AAAA,QACxD,EAAO;AAAA,UACL,SAAS,IAAI,WAAW,IAAI,OAAO,SAAS,CAAC;AAAA;AAAA,QAE/C,OAAO,GAAG;AAAA,QACV,MAAM,IAAI,UAAU,wCAAwC;AAAA;AAAA,MAG9D,OAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,MAAM,OAAO;AAAA,QACb,UAAU,OAAO;AAAA,QACjB,MAAM,OAAO;AAAA,QACb,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO;AAAA,QACjB,MAAM,OAAO;AAAA,QACb,UAAU,OAAO;AAAA,QACjB,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,MACnB;AAAA;AAAA,IAEF,YAAY;AAAA,MACV,MAAM;AAAA,QACJ,GAAG,GAAiB;AAAA,UAClB,OAAO,KAAK;AAAA;AAAA,MAEhB;AAAA,MACA,MAAM;AAAA,QACJ,GAAG,GAAiB;AAAA,UAClB,OAAO,KAAK;AAAA;AAAA,MAEhB;AAAA,MACA,UAAU;AAAA,QACR,GAAG,GAAiB;AAAA,UAClB,OAAO,KAAK;AAAA;AAAA,MAEhB;AAAA,MACA,MAAM;AAAA,QACJ,GAAG,GAAiB;AAAA,UAClB,OAAO,KAAK;AAAA;AAAA,MAEhB;AAAA,MACA,QAAQ;AAAA,QACN,GAAG,GAAiB;AAAA,UAClB,OAAO,KAAK;AAAA;AAAA,MAEhB;AAAA,MACA,UAAU;AAAA,QACR,GAAG,GAAiB;AAAA,UAClB,OAAO,KAAK;AAAA;AAAA,MAEhB;AAAA,MACA,UAAU;AAAA,QACR,GAAG,GAAiB;AAAA,UAClB,OAAO,KAAK;AAAA;AAAA,MAEhB;AAAA,MACA,MAAM;AAAA,QACJ,GAAG,GAAiB;AAAA,UAClB,OAAO,KAAK;AAAA;AAAA,MAEhB;AAAA,MACA,UAAU;AAAA,QACR,GAAG,GAAiB;AAAA,UAClB,OAAO,KAAK;AAAA;AAAA,MAEhB;AAAA,MACA,QAAQ;AAAA,QACN,GAAG,GAAiB;AAAA,UAClB,OAAO,KAAK;AAAA;AAAA,MAEhB;AAAA,MACA,UAAU;AAAA,QACR,GAAG,GAAiB;AAAA,UAClB,OAAO,KAAK;AAAA;AAAA,MAEhB;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,QAAQ,GAAyB;AAAA,QAC/B,OAAO,KAAK;AAAA;AAAA,MAEd,MAAM,GAAyB;AAAA,QAC7B,OAAO,KAAK;AAAA;AAAA,MAGd,aAAa,GAAyB;AAAA,QACpC,OAAO,KAAK;AAAA;AAAA,IAEhB;AAAA,IACA,eAAe;AAAA,MACb,QAAQ,CAAC,KAAc,MAAyB;AAAA,QAC9C,IAAI;AAAA,UACF,IAAI,SAAS,WAAW;AAAA,YACtB,IAAI,WAAW,IAAI,OAAO,GAAG,GAAG,OAAO,IAAI,CAAC;AAAA,UAC9C,EAAO;AAAA,YACL,IAAI,WAAW,IAAI,OAAO,GAAG,CAAC;AAAA;AAAA,UAEhC,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA;AAAA;AAAA,IAGb;AAAA,EACF,CAAC;AAAA;AAOI,SAAS,wBAAwB,CAAC,SAA+B;AAAA,EAGtE,MAAM,SAAS,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAgB/B;AAAA,EAED,IAAI,OAAO,OAAO;AAAA,IAChB,MAAM,MAAM,QAAQ,KAAK,OAAO,KAAK;AAAA,IACrC,OAAO,MAAM,QAAQ;AAAA,IACrB,MAAM,IAAI,MAAM,sCAAsC,KAAK,UAAU,GAAG,GAAG;AAAA,EAC7E;AAAA,EACA,OAAO,MAAM,QAAQ;AAAA;",
8
+ "debugId": "C3940F5C588B349864756E2164756E21",
9
+ "names": []
10
+ }