@scelar/nodepod 1.0.2 → 1.0.3

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 (70) hide show
  1. package/dist/__tests__/bench/integration.bench.d.ts +1 -0
  2. package/dist/__tests__/bench/memory-volume.bench.d.ts +1 -0
  3. package/dist/__tests__/bench/polyfills.bench.d.ts +1 -0
  4. package/dist/__tests__/bench/script-engine.bench.d.ts +1 -0
  5. package/dist/__tests__/bench/shell.bench.d.ts +1 -0
  6. package/dist/__tests__/bench/syntax-transforms.bench.d.ts +1 -0
  7. package/dist/__tests__/bench/version-resolver.bench.d.ts +1 -0
  8. package/dist/__tests__/buffer.test.d.ts +1 -0
  9. package/dist/__tests__/byte-encoding.test.d.ts +1 -0
  10. package/dist/__tests__/digest.test.d.ts +1 -0
  11. package/dist/__tests__/events.test.d.ts +1 -0
  12. package/dist/__tests__/memory-volume.test.d.ts +1 -0
  13. package/dist/__tests__/path.test.d.ts +1 -0
  14. package/dist/__tests__/process.test.d.ts +1 -0
  15. package/dist/__tests__/script-engine.test.d.ts +1 -0
  16. package/dist/__tests__/shell-builtins.test.d.ts +1 -0
  17. package/dist/__tests__/shell-interpreter.test.d.ts +1 -0
  18. package/dist/__tests__/shell-parser.test.d.ts +1 -0
  19. package/dist/__tests__/stream.test.d.ts +1 -0
  20. package/dist/__tests__/syntax-transforms.test.d.ts +1 -0
  21. package/dist/__tests__/version-resolver.test.d.ts +1 -0
  22. package/dist/{child_process-Dopvyd-E.js → child_process-D6oDN2MX.js} +4 -4
  23. package/dist/{child_process-Dopvyd-E.js.map → child_process-D6oDN2MX.js.map} +1 -1
  24. package/dist/{child_process-B38qoN6R.cjs → child_process-hmVqFcF7.cjs} +5 -5
  25. package/dist/{child_process-B38qoN6R.cjs.map → child_process-hmVqFcF7.cjs.map} +1 -1
  26. package/dist/{index--Qr8LVpQ.js → index-Ale2oba_.js} +240 -136
  27. package/dist/index-Ale2oba_.js.map +1 -0
  28. package/dist/{index-cnitc68U.cjs → index-BO1i013L.cjs} +236 -191
  29. package/dist/index-BO1i013L.cjs.map +1 -0
  30. package/dist/index.cjs +1 -1
  31. package/dist/index.mjs +1 -1
  32. package/dist/script-engine.d.ts +2 -0
  33. package/dist/syntax-transforms.d.ts +1 -0
  34. package/package.json +97 -95
  35. package/src/__tests__/bench/integration.bench.ts +117 -0
  36. package/src/__tests__/bench/memory-volume.bench.ts +115 -0
  37. package/src/__tests__/bench/polyfills.bench.ts +147 -0
  38. package/src/__tests__/bench/script-engine.bench.ts +104 -0
  39. package/src/__tests__/bench/shell.bench.ts +101 -0
  40. package/src/__tests__/bench/syntax-transforms.bench.ts +82 -0
  41. package/src/__tests__/bench/version-resolver.bench.ts +95 -0
  42. package/src/__tests__/buffer.test.ts +273 -0
  43. package/src/__tests__/byte-encoding.test.ts +98 -0
  44. package/src/__tests__/digest.test.ts +44 -0
  45. package/src/__tests__/events.test.ts +245 -0
  46. package/src/__tests__/memory-volume.test.ts +443 -0
  47. package/src/__tests__/path.test.ts +181 -0
  48. package/src/__tests__/process.test.ts +129 -0
  49. package/src/__tests__/script-engine.test.ts +229 -0
  50. package/src/__tests__/shell-builtins.test.ts +357 -0
  51. package/src/__tests__/shell-interpreter.test.ts +157 -0
  52. package/src/__tests__/shell-parser.test.ts +204 -0
  53. package/src/__tests__/stream.test.ts +142 -0
  54. package/src/__tests__/syntax-transforms.test.ts +158 -0
  55. package/src/__tests__/version-resolver.test.ts +184 -0
  56. package/src/constants/cdn-urls.ts +18 -18
  57. package/src/helpers/byte-encoding.ts +51 -39
  58. package/src/memory-volume.ts +962 -941
  59. package/src/module-transformer.ts +368 -368
  60. package/src/packages/installer.ts +396 -396
  61. package/src/polyfills/buffer.ts +633 -628
  62. package/src/polyfills/esbuild.ts +854 -854
  63. package/src/polyfills/events.ts +282 -276
  64. package/src/polyfills/process.ts +695 -690
  65. package/src/polyfills/readline.ts +692 -692
  66. package/src/polyfills/tty.ts +71 -71
  67. package/src/script-engine.ts +3396 -3375
  68. package/src/syntax-transforms.ts +543 -561
  69. package/dist/index--Qr8LVpQ.js.map +0 -1
  70. package/dist/index-cnitc68U.cjs.map +0 -1
@@ -0,0 +1,98 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import {
3
+ bytesToBase64,
4
+ base64ToBytes,
5
+ bytesToHex,
6
+ bytesToLatin1,
7
+ } from "../helpers/byte-encoding";
8
+
9
+ const textEncoder = new TextEncoder();
10
+
11
+ describe("bytesToBase64 / base64ToBytes", () => {
12
+ it("round-trips an ASCII string", () => {
13
+ const data = textEncoder.encode("Hello World");
14
+ const b64 = bytesToBase64(data);
15
+ const back = base64ToBytes(b64);
16
+ expect(back).toEqual(data);
17
+ });
18
+
19
+ it("round-trips an empty array", () => {
20
+ expect(bytesToBase64(new Uint8Array(0))).toBe("");
21
+ expect(base64ToBytes("")).toEqual(new Uint8Array(0));
22
+ });
23
+
24
+ it("round-trips all 256 byte values", () => {
25
+ const data = new Uint8Array(256);
26
+ for (let i = 0; i < 256; i++) data[i] = i;
27
+ const b64 = bytesToBase64(data);
28
+ const back = base64ToBytes(b64);
29
+ expect(back).toEqual(data);
30
+ });
31
+
32
+ it("round-trips a large buffer (> SEGMENT_SIZE 8192 bytes)", () => {
33
+ const data = new Uint8Array(20000);
34
+ for (let i = 0; i < data.length; i++) data[i] = i % 256;
35
+ const b64 = bytesToBase64(data);
36
+ const back = base64ToBytes(b64);
37
+ expect(back).toEqual(data);
38
+ });
39
+
40
+ it("handles binary data with null bytes", () => {
41
+ const data = new Uint8Array([0, 0, 0, 255, 0, 128]);
42
+ const back = base64ToBytes(bytesToBase64(data));
43
+ expect(back).toEqual(data);
44
+ });
45
+
46
+ it("matches native btoa output for ASCII", () => {
47
+ const str = "test string 123";
48
+ const data = textEncoder.encode(str);
49
+ expect(bytesToBase64(data)).toBe(btoa(str));
50
+ });
51
+ });
52
+
53
+ describe("bytesToHex", () => {
54
+ it("converts empty array to empty string", () => {
55
+ expect(bytesToHex(new Uint8Array(0))).toBe("");
56
+ });
57
+
58
+ it("converts known byte values correctly", () => {
59
+ expect(bytesToHex(new Uint8Array([0, 255, 128, 1]))).toBe("00ff8001");
60
+ });
61
+
62
+ it("produces lowercase hex digits", () => {
63
+ const hex = bytesToHex(new Uint8Array([0xab, 0xcd, 0xef]));
64
+ expect(hex).toBe("abcdef");
65
+ expect(hex).toBe(hex.toLowerCase());
66
+ });
67
+
68
+ it("handles single byte", () => {
69
+ expect(bytesToHex(new Uint8Array([10]))).toBe("0a");
70
+ });
71
+ });
72
+
73
+ describe("bytesToLatin1", () => {
74
+ it("converts empty array to empty string", () => {
75
+ expect(bytesToLatin1(new Uint8Array(0))).toBe("");
76
+ });
77
+
78
+ it("converts byte values to latin1 code points", () => {
79
+ expect(bytesToLatin1(new Uint8Array([72, 101, 108, 108, 111]))).toBe(
80
+ "Hello",
81
+ );
82
+ });
83
+
84
+ it("preserves high bytes (128-255) as single chars", () => {
85
+ const data = new Uint8Array([0xe9]);
86
+ const result = bytesToLatin1(data);
87
+ expect(result).toBe("\xe9");
88
+ expect(result.charCodeAt(0)).toBe(0xe9);
89
+ });
90
+
91
+ it("handles large buffer (> SEGMENT_SIZE)", () => {
92
+ const data = new Uint8Array(10000);
93
+ for (let i = 0; i < data.length; i++) data[i] = 65;
94
+ const result = bytesToLatin1(data);
95
+ expect(result.length).toBe(10000);
96
+ expect(result).toBe("A".repeat(10000));
97
+ });
98
+ });
@@ -0,0 +1,44 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { quickDigest } from "../helpers/digest";
3
+
4
+ describe("quickDigest", () => {
5
+ it("returns a string", () => {
6
+ expect(typeof quickDigest("hello")).toBe("string");
7
+ });
8
+
9
+ it("returns consistent results for same input", () => {
10
+ expect(quickDigest("hello")).toBe(quickDigest("hello"));
11
+ expect(quickDigest("test/path/file.js")).toBe(
12
+ quickDigest("test/path/file.js"),
13
+ );
14
+ });
15
+
16
+ it("returns different results for different inputs", () => {
17
+ expect(quickDigest("hello")).not.toBe(quickDigest("world"));
18
+ expect(quickDigest("a")).not.toBe(quickDigest("b"));
19
+ });
20
+
21
+ it("handles empty string", () => {
22
+ const result = quickDigest("");
23
+ expect(typeof result).toBe("string");
24
+ expect(result.length).toBeGreaterThan(0);
25
+ });
26
+
27
+ it("handles very long strings", () => {
28
+ const long = "x".repeat(100_000);
29
+ const result = quickDigest(long);
30
+ expect(typeof result).toBe("string");
31
+ });
32
+
33
+ it("handles unicode", () => {
34
+ const result = quickDigest("🎉🚀日本語");
35
+ expect(typeof result).toBe("string");
36
+ expect(result.length).toBeGreaterThan(0);
37
+ });
38
+
39
+ it("returns base-36 encoded string", () => {
40
+ const result = quickDigest("some input");
41
+ // djb2 can go negative, hence the -?
42
+ expect(result).toMatch(/^-?[0-9a-z]+$/);
43
+ });
44
+ });
@@ -0,0 +1,245 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import eventModule, { EventEmitter } from "../polyfills/events";
3
+
4
+ describe("EventEmitter", () => {
5
+ describe("on/emit", () => {
6
+ it("emits event and calls listener", () => {
7
+ const ee = new EventEmitter();
8
+ const fn = vi.fn();
9
+ ee.on("test", fn);
10
+ ee.emit("test");
11
+ expect(fn).toHaveBeenCalledOnce();
12
+ });
13
+
14
+ it("passes arguments to listener", () => {
15
+ const ee = new EventEmitter();
16
+ const fn = vi.fn();
17
+ ee.on("data", fn);
18
+ ee.emit("data", 1, "two", { three: 3 });
19
+ expect(fn).toHaveBeenCalledWith(1, "two", { three: 3 });
20
+ });
21
+
22
+ it("handles multiple listeners on same event", () => {
23
+ const ee = new EventEmitter();
24
+ const fn1 = vi.fn();
25
+ const fn2 = vi.fn();
26
+ ee.on("x", fn1);
27
+ ee.on("x", fn2);
28
+ ee.emit("x");
29
+ expect(fn1).toHaveBeenCalled();
30
+ expect(fn2).toHaveBeenCalled();
31
+ });
32
+
33
+ it("returns true when listeners exist, false otherwise", () => {
34
+ const ee = new EventEmitter();
35
+ expect(ee.emit("nope")).toBe(false);
36
+ ee.on("yep", () => {});
37
+ expect(ee.emit("yep")).toBe(true);
38
+ });
39
+ });
40
+
41
+ describe("once", () => {
42
+ it("listener fires only once", () => {
43
+ const ee = new EventEmitter();
44
+ const fn = vi.fn();
45
+ ee.once("one", fn);
46
+ ee.emit("one");
47
+ ee.emit("one");
48
+ expect(fn).toHaveBeenCalledOnce();
49
+ });
50
+
51
+ it("is removed after first emit", () => {
52
+ const ee = new EventEmitter();
53
+ ee.once("x", () => {});
54
+ expect(ee.listenerCount("x")).toBe(1);
55
+ ee.emit("x");
56
+ expect(ee.listenerCount("x")).toBe(0);
57
+ });
58
+ });
59
+
60
+ describe("removeListener / off", () => {
61
+ it("removes specific listener", () => {
62
+ const ee = new EventEmitter();
63
+ const fn = vi.fn();
64
+ ee.on("x", fn);
65
+ ee.removeListener("x", fn);
66
+ ee.emit("x");
67
+ expect(fn).not.toHaveBeenCalled();
68
+ });
69
+
70
+ it("does not remove other listeners on same event", () => {
71
+ const ee = new EventEmitter();
72
+ const fn1 = vi.fn();
73
+ const fn2 = vi.fn();
74
+ ee.on("x", fn1);
75
+ ee.on("x", fn2);
76
+ ee.off("x", fn1);
77
+ ee.emit("x");
78
+ expect(fn1).not.toHaveBeenCalled();
79
+ expect(fn2).toHaveBeenCalled();
80
+ });
81
+ });
82
+
83
+ describe("removeAllListeners", () => {
84
+ it("removes all listeners for a specific event", () => {
85
+ const ee = new EventEmitter();
86
+ ee.on("a", () => {});
87
+ ee.on("a", () => {});
88
+ ee.on("b", () => {});
89
+ ee.removeAllListeners("a");
90
+ expect(ee.listenerCount("a")).toBe(0);
91
+ expect(ee.listenerCount("b")).toBe(1);
92
+ });
93
+
94
+ it("removes all listeners for all events when no arg", () => {
95
+ const ee = new EventEmitter();
96
+ ee.on("a", () => {});
97
+ ee.on("b", () => {});
98
+ ee.removeAllListeners();
99
+ expect(ee.eventNames()).toEqual([]);
100
+ });
101
+ });
102
+
103
+ describe("error event", () => {
104
+ it("throws Error when emitting 'error' with no listeners", () => {
105
+ const ee = new EventEmitter();
106
+ expect(() => ee.emit("error", new Error("boom"))).toThrow("boom");
107
+ });
108
+
109
+ it("throws generic error when payload is not an Error", () => {
110
+ const ee = new EventEmitter();
111
+ expect(() => ee.emit("error", "string")).toThrow("Unhandled error event");
112
+ });
113
+
114
+ it("does not throw when error listener is registered", () => {
115
+ const ee = new EventEmitter();
116
+ ee.on("error", () => {});
117
+ expect(() => ee.emit("error", new Error("handled"))).not.toThrow();
118
+ });
119
+ });
120
+
121
+ describe("Object.create pattern", () => {
122
+ it("works when created via Object.create(EventEmitter.prototype)", () => {
123
+ const obj = Object.create(EventEmitter.prototype);
124
+ const fn = vi.fn();
125
+ obj.on("test", fn);
126
+ obj.emit("test", 42);
127
+ expect(fn).toHaveBeenCalledWith(42);
128
+ });
129
+ });
130
+
131
+ describe("listenerCount", () => {
132
+ it("returns 0 for event with no listeners", () => {
133
+ const ee = new EventEmitter();
134
+ expect(ee.listenerCount("nope")).toBe(0);
135
+ });
136
+
137
+ it("returns correct count", () => {
138
+ const ee = new EventEmitter();
139
+ ee.on("x", () => {});
140
+ ee.on("x", () => {});
141
+ expect(ee.listenerCount("x")).toBe(2);
142
+ });
143
+ });
144
+
145
+ describe("eventNames", () => {
146
+ it("returns empty array initially", () => {
147
+ const ee = new EventEmitter();
148
+ expect(ee.eventNames()).toEqual([]);
149
+ });
150
+
151
+ it("returns array of event names with listeners", () => {
152
+ const ee = new EventEmitter();
153
+ ee.on("a", () => {});
154
+ ee.on("b", () => {});
155
+ expect(ee.eventNames().sort()).toEqual(["a", "b"]);
156
+ });
157
+ });
158
+
159
+ describe("prependListener", () => {
160
+ it("adds listener to beginning of list", () => {
161
+ const order: number[] = [];
162
+ const ee = new EventEmitter();
163
+ ee.on("x", () => order.push(1));
164
+ ee.prependListener("x", () => order.push(2));
165
+ ee.emit("x");
166
+ expect(order).toEqual([2, 1]);
167
+ });
168
+ });
169
+
170
+ describe("prependOnceListener", () => {
171
+ it("fires once and was prepended", () => {
172
+ const order: number[] = [];
173
+ const ee = new EventEmitter();
174
+ ee.on("x", () => order.push(1));
175
+ ee.prependOnceListener("x", () => order.push(2));
176
+ ee.emit("x");
177
+ ee.emit("x");
178
+ expect(order).toEqual([2, 1, 1]);
179
+ });
180
+ });
181
+
182
+ describe("setMaxListeners / getMaxListeners", () => {
183
+ it("defaults to 10", () => {
184
+ const ee = new EventEmitter();
185
+ expect(ee.getMaxListeners()).toBe(10);
186
+ });
187
+
188
+ it("can be changed", () => {
189
+ const ee = new EventEmitter();
190
+ ee.setMaxListeners(50);
191
+ expect(ee.getMaxListeners()).toBe(50);
192
+ });
193
+ });
194
+
195
+ describe("listeners / rawListeners", () => {
196
+ it("returns copy of listener array", () => {
197
+ const ee = new EventEmitter();
198
+ const fn = () => {};
199
+ ee.on("x", fn);
200
+ const list = ee.listeners("x");
201
+ expect(list).toEqual([fn]);
202
+ list.pop();
203
+ expect(ee.listenerCount("x")).toBe(1);
204
+ });
205
+ });
206
+
207
+ describe("static EventEmitter.once()", () => {
208
+ it("returns a Promise that resolves on event", async () => {
209
+ const ee = new EventEmitter();
210
+ const p = eventModule.once(ee, "data");
211
+ ee.emit("data", 42, "extra");
212
+ const result = await p;
213
+ expect(result).toEqual([42, "extra"]);
214
+ });
215
+
216
+ it("rejects on error event", async () => {
217
+ const ee = new EventEmitter();
218
+ const p = eventModule.once(ee, "data");
219
+ ee.emit("error", new Error("fail"));
220
+ await expect(p).rejects.toThrow("fail");
221
+ });
222
+ });
223
+
224
+ describe("static EventEmitter.listenerCount()", () => {
225
+ it("returns count from target", () => {
226
+ const ee = new EventEmitter();
227
+ ee.on("x", () => {});
228
+ ee.on("x", () => {});
229
+ expect(eventModule.listenerCount(ee, "x")).toBe(2);
230
+ });
231
+ });
232
+
233
+ describe("module export shape", () => {
234
+ it("has EventEmitter as both default.EventEmitter and named export", () => {
235
+ expect(eventModule.EventEmitter).toBe(EventEmitter);
236
+ });
237
+
238
+ it("has static once, on, getEventListeners, listenerCount", () => {
239
+ expect(typeof eventModule.once).toBe("function");
240
+ expect(typeof eventModule.on).toBe("function");
241
+ expect(typeof eventModule.getEventListeners).toBe("function");
242
+ expect(typeof eventModule.listenerCount).toBe("function");
243
+ });
244
+ });
245
+ });