almostnode 0.1.0

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 (216) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +731 -0
  3. package/dist/__sw__.js +394 -0
  4. package/dist/ai-chatbot-demo-entry.d.ts +6 -0
  5. package/dist/ai-chatbot-demo-entry.d.ts.map +1 -0
  6. package/dist/ai-chatbot-demo.d.ts +42 -0
  7. package/dist/ai-chatbot-demo.d.ts.map +1 -0
  8. package/dist/assets/runtime-worker-D9x_Ddwz.js +60543 -0
  9. package/dist/assets/runtime-worker-D9x_Ddwz.js.map +1 -0
  10. package/dist/convex-app-demo-entry.d.ts +6 -0
  11. package/dist/convex-app-demo-entry.d.ts.map +1 -0
  12. package/dist/convex-app-demo.d.ts +68 -0
  13. package/dist/convex-app-demo.d.ts.map +1 -0
  14. package/dist/cors-proxy.d.ts +46 -0
  15. package/dist/cors-proxy.d.ts.map +1 -0
  16. package/dist/create-runtime.d.ts +42 -0
  17. package/dist/create-runtime.d.ts.map +1 -0
  18. package/dist/demo.d.ts +6 -0
  19. package/dist/demo.d.ts.map +1 -0
  20. package/dist/dev-server.d.ts +97 -0
  21. package/dist/dev-server.d.ts.map +1 -0
  22. package/dist/frameworks/next-dev-server.d.ts +202 -0
  23. package/dist/frameworks/next-dev-server.d.ts.map +1 -0
  24. package/dist/frameworks/vite-dev-server.d.ts +85 -0
  25. package/dist/frameworks/vite-dev-server.d.ts.map +1 -0
  26. package/dist/index.cjs +14965 -0
  27. package/dist/index.cjs.map +1 -0
  28. package/dist/index.d.ts +71 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.mjs +14867 -0
  31. package/dist/index.mjs.map +1 -0
  32. package/dist/next-demo.d.ts +49 -0
  33. package/dist/next-demo.d.ts.map +1 -0
  34. package/dist/npm/index.d.ts +71 -0
  35. package/dist/npm/index.d.ts.map +1 -0
  36. package/dist/npm/registry.d.ts +66 -0
  37. package/dist/npm/registry.d.ts.map +1 -0
  38. package/dist/npm/resolver.d.ts +52 -0
  39. package/dist/npm/resolver.d.ts.map +1 -0
  40. package/dist/npm/tarball.d.ts +29 -0
  41. package/dist/npm/tarball.d.ts.map +1 -0
  42. package/dist/runtime-interface.d.ts +90 -0
  43. package/dist/runtime-interface.d.ts.map +1 -0
  44. package/dist/runtime.d.ts +103 -0
  45. package/dist/runtime.d.ts.map +1 -0
  46. package/dist/sandbox-helpers.d.ts +43 -0
  47. package/dist/sandbox-helpers.d.ts.map +1 -0
  48. package/dist/sandbox-runtime.d.ts +65 -0
  49. package/dist/sandbox-runtime.d.ts.map +1 -0
  50. package/dist/server-bridge.d.ts +89 -0
  51. package/dist/server-bridge.d.ts.map +1 -0
  52. package/dist/shims/assert.d.ts +51 -0
  53. package/dist/shims/assert.d.ts.map +1 -0
  54. package/dist/shims/async_hooks.d.ts +37 -0
  55. package/dist/shims/async_hooks.d.ts.map +1 -0
  56. package/dist/shims/buffer.d.ts +20 -0
  57. package/dist/shims/buffer.d.ts.map +1 -0
  58. package/dist/shims/child_process-browser.d.ts +92 -0
  59. package/dist/shims/child_process-browser.d.ts.map +1 -0
  60. package/dist/shims/child_process.d.ts +93 -0
  61. package/dist/shims/child_process.d.ts.map +1 -0
  62. package/dist/shims/chokidar.d.ts +55 -0
  63. package/dist/shims/chokidar.d.ts.map +1 -0
  64. package/dist/shims/cluster.d.ts +52 -0
  65. package/dist/shims/cluster.d.ts.map +1 -0
  66. package/dist/shims/crypto.d.ts +122 -0
  67. package/dist/shims/crypto.d.ts.map +1 -0
  68. package/dist/shims/dgram.d.ts +34 -0
  69. package/dist/shims/dgram.d.ts.map +1 -0
  70. package/dist/shims/diagnostics_channel.d.ts +80 -0
  71. package/dist/shims/diagnostics_channel.d.ts.map +1 -0
  72. package/dist/shims/dns.d.ts +87 -0
  73. package/dist/shims/dns.d.ts.map +1 -0
  74. package/dist/shims/domain.d.ts +25 -0
  75. package/dist/shims/domain.d.ts.map +1 -0
  76. package/dist/shims/esbuild.d.ts +105 -0
  77. package/dist/shims/esbuild.d.ts.map +1 -0
  78. package/dist/shims/events.d.ts +37 -0
  79. package/dist/shims/events.d.ts.map +1 -0
  80. package/dist/shims/fs.d.ts +115 -0
  81. package/dist/shims/fs.d.ts.map +1 -0
  82. package/dist/shims/fsevents.d.ts +67 -0
  83. package/dist/shims/fsevents.d.ts.map +1 -0
  84. package/dist/shims/http.d.ts +217 -0
  85. package/dist/shims/http.d.ts.map +1 -0
  86. package/dist/shims/http2.d.ts +81 -0
  87. package/dist/shims/http2.d.ts.map +1 -0
  88. package/dist/shims/https.d.ts +36 -0
  89. package/dist/shims/https.d.ts.map +1 -0
  90. package/dist/shims/inspector.d.ts +25 -0
  91. package/dist/shims/inspector.d.ts.map +1 -0
  92. package/dist/shims/module.d.ts +22 -0
  93. package/dist/shims/module.d.ts.map +1 -0
  94. package/dist/shims/net.d.ts +100 -0
  95. package/dist/shims/net.d.ts.map +1 -0
  96. package/dist/shims/os.d.ts +159 -0
  97. package/dist/shims/os.d.ts.map +1 -0
  98. package/dist/shims/path.d.ts +72 -0
  99. package/dist/shims/path.d.ts.map +1 -0
  100. package/dist/shims/perf_hooks.d.ts +50 -0
  101. package/dist/shims/perf_hooks.d.ts.map +1 -0
  102. package/dist/shims/process.d.ts +93 -0
  103. package/dist/shims/process.d.ts.map +1 -0
  104. package/dist/shims/querystring.d.ts +23 -0
  105. package/dist/shims/querystring.d.ts.map +1 -0
  106. package/dist/shims/readdirp.d.ts +52 -0
  107. package/dist/shims/readdirp.d.ts.map +1 -0
  108. package/dist/shims/readline.d.ts +62 -0
  109. package/dist/shims/readline.d.ts.map +1 -0
  110. package/dist/shims/rollup.d.ts +34 -0
  111. package/dist/shims/rollup.d.ts.map +1 -0
  112. package/dist/shims/sentry.d.ts +163 -0
  113. package/dist/shims/sentry.d.ts.map +1 -0
  114. package/dist/shims/stream.d.ts +181 -0
  115. package/dist/shims/stream.d.ts.map +1 -0
  116. package/dist/shims/tls.d.ts +53 -0
  117. package/dist/shims/tls.d.ts.map +1 -0
  118. package/dist/shims/tty.d.ts +30 -0
  119. package/dist/shims/tty.d.ts.map +1 -0
  120. package/dist/shims/url.d.ts +64 -0
  121. package/dist/shims/url.d.ts.map +1 -0
  122. package/dist/shims/util.d.ts +106 -0
  123. package/dist/shims/util.d.ts.map +1 -0
  124. package/dist/shims/v8.d.ts +73 -0
  125. package/dist/shims/v8.d.ts.map +1 -0
  126. package/dist/shims/vfs-adapter.d.ts +126 -0
  127. package/dist/shims/vfs-adapter.d.ts.map +1 -0
  128. package/dist/shims/vm.d.ts +45 -0
  129. package/dist/shims/vm.d.ts.map +1 -0
  130. package/dist/shims/worker_threads.d.ts +66 -0
  131. package/dist/shims/worker_threads.d.ts.map +1 -0
  132. package/dist/shims/ws.d.ts +66 -0
  133. package/dist/shims/ws.d.ts.map +1 -0
  134. package/dist/shims/zlib.d.ts +161 -0
  135. package/dist/shims/zlib.d.ts.map +1 -0
  136. package/dist/transform.d.ts +24 -0
  137. package/dist/transform.d.ts.map +1 -0
  138. package/dist/virtual-fs.d.ts +226 -0
  139. package/dist/virtual-fs.d.ts.map +1 -0
  140. package/dist/vite-demo.d.ts +35 -0
  141. package/dist/vite-demo.d.ts.map +1 -0
  142. package/dist/vite-sw.js +132 -0
  143. package/dist/worker/runtime-worker.d.ts +8 -0
  144. package/dist/worker/runtime-worker.d.ts.map +1 -0
  145. package/dist/worker-runtime.d.ts +50 -0
  146. package/dist/worker-runtime.d.ts.map +1 -0
  147. package/package.json +85 -0
  148. package/src/ai-chatbot-demo-entry.ts +244 -0
  149. package/src/ai-chatbot-demo.ts +509 -0
  150. package/src/convex-app-demo-entry.ts +1107 -0
  151. package/src/convex-app-demo.ts +1316 -0
  152. package/src/cors-proxy.ts +81 -0
  153. package/src/create-runtime.ts +147 -0
  154. package/src/demo.ts +304 -0
  155. package/src/dev-server.ts +274 -0
  156. package/src/frameworks/next-dev-server.ts +2224 -0
  157. package/src/frameworks/vite-dev-server.ts +702 -0
  158. package/src/index.ts +101 -0
  159. package/src/next-demo.ts +1784 -0
  160. package/src/npm/index.ts +347 -0
  161. package/src/npm/registry.ts +152 -0
  162. package/src/npm/resolver.ts +385 -0
  163. package/src/npm/tarball.ts +209 -0
  164. package/src/runtime-interface.ts +103 -0
  165. package/src/runtime.ts +1046 -0
  166. package/src/sandbox-helpers.ts +173 -0
  167. package/src/sandbox-runtime.ts +252 -0
  168. package/src/server-bridge.ts +426 -0
  169. package/src/shims/assert.ts +664 -0
  170. package/src/shims/async_hooks.ts +86 -0
  171. package/src/shims/buffer.ts +75 -0
  172. package/src/shims/child_process-browser.ts +217 -0
  173. package/src/shims/child_process.ts +463 -0
  174. package/src/shims/chokidar.ts +313 -0
  175. package/src/shims/cluster.ts +67 -0
  176. package/src/shims/crypto.ts +830 -0
  177. package/src/shims/dgram.ts +47 -0
  178. package/src/shims/diagnostics_channel.ts +196 -0
  179. package/src/shims/dns.ts +172 -0
  180. package/src/shims/domain.ts +58 -0
  181. package/src/shims/esbuild.ts +805 -0
  182. package/src/shims/events.ts +195 -0
  183. package/src/shims/fs.ts +803 -0
  184. package/src/shims/fsevents.ts +63 -0
  185. package/src/shims/http.ts +904 -0
  186. package/src/shims/http2.ts +96 -0
  187. package/src/shims/https.ts +86 -0
  188. package/src/shims/inspector.ts +30 -0
  189. package/src/shims/module.ts +82 -0
  190. package/src/shims/net.ts +359 -0
  191. package/src/shims/os.ts +195 -0
  192. package/src/shims/path.ts +199 -0
  193. package/src/shims/perf_hooks.ts +92 -0
  194. package/src/shims/process.ts +346 -0
  195. package/src/shims/querystring.ts +97 -0
  196. package/src/shims/readdirp.ts +228 -0
  197. package/src/shims/readline.ts +110 -0
  198. package/src/shims/rollup.ts +80 -0
  199. package/src/shims/sentry.ts +133 -0
  200. package/src/shims/stream.ts +1126 -0
  201. package/src/shims/tls.ts +95 -0
  202. package/src/shims/tty.ts +64 -0
  203. package/src/shims/url.ts +171 -0
  204. package/src/shims/util.ts +312 -0
  205. package/src/shims/v8.ts +113 -0
  206. package/src/shims/vfs-adapter.ts +402 -0
  207. package/src/shims/vm.ts +83 -0
  208. package/src/shims/worker_threads.ts +111 -0
  209. package/src/shims/ws.ts +382 -0
  210. package/src/shims/zlib.ts +289 -0
  211. package/src/transform.ts +313 -0
  212. package/src/types/external.d.ts +67 -0
  213. package/src/virtual-fs.ts +903 -0
  214. package/src/vite-demo.ts +577 -0
  215. package/src/worker/runtime-worker.ts +128 -0
  216. package/src/worker-runtime.ts +145 -0
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Virtual File System - In-memory file tree with POSIX-like operations
3
+ */
4
+ import type { VFSSnapshot } from './runtime-interface';
5
+ export interface FSNode {
6
+ type: 'file' | 'directory';
7
+ content?: Uint8Array;
8
+ children?: Map<string, FSNode>;
9
+ }
10
+ type VFSChangeListener = (path: string, content: string) => void;
11
+ type VFSDeleteListener = (path: string) => void;
12
+ export interface Stats {
13
+ isFile(): boolean;
14
+ isDirectory(): boolean;
15
+ isSymbolicLink(): boolean;
16
+ isBlockDevice(): boolean;
17
+ isCharacterDevice(): boolean;
18
+ isFIFO(): boolean;
19
+ isSocket(): boolean;
20
+ size: number;
21
+ mode: number;
22
+ mtime: Date;
23
+ atime: Date;
24
+ ctime: Date;
25
+ birthtime: Date;
26
+ mtimeMs: number;
27
+ atimeMs: number;
28
+ ctimeMs: number;
29
+ birthtimeMs: number;
30
+ nlink: number;
31
+ uid: number;
32
+ gid: number;
33
+ dev: number;
34
+ ino: number;
35
+ rdev: number;
36
+ blksize: number;
37
+ blocks: number;
38
+ }
39
+ export type WatchEventType = 'change' | 'rename';
40
+ export type WatchListener = (eventType: WatchEventType, filename: string | null) => void;
41
+ export interface FSWatcher {
42
+ close(): void;
43
+ ref(): this;
44
+ unref(): this;
45
+ }
46
+ /**
47
+ * Create a Node.js-style error with code property
48
+ */
49
+ export interface NodeError extends Error {
50
+ code: string;
51
+ errno: number;
52
+ syscall: string;
53
+ path?: string;
54
+ }
55
+ export declare function createNodeError(code: 'ENOENT' | 'ENOTDIR' | 'EISDIR' | 'EEXIST' | 'ENOTEMPTY', syscall: string, path: string, message?: string): NodeError;
56
+ export declare class VirtualFS {
57
+ private root;
58
+ private encoder;
59
+ private decoder;
60
+ private watchers;
61
+ private eventListeners;
62
+ constructor();
63
+ /**
64
+ * Add event listener (for change notifications to workers)
65
+ */
66
+ on(event: 'change', listener: VFSChangeListener): this;
67
+ on(event: 'delete', listener: VFSDeleteListener): this;
68
+ /**
69
+ * Remove event listener
70
+ */
71
+ off(event: 'change', listener: VFSChangeListener): this;
72
+ off(event: 'delete', listener: VFSDeleteListener): this;
73
+ /**
74
+ * Emit event to listeners
75
+ */
76
+ private emit;
77
+ /**
78
+ * Serialize the entire file tree to a snapshot (for worker transfer)
79
+ */
80
+ toSnapshot(): VFSSnapshot;
81
+ private serializeNode;
82
+ /**
83
+ * Create a VirtualFS from a snapshot
84
+ */
85
+ static fromSnapshot(snapshot: VFSSnapshot): VirtualFS;
86
+ /**
87
+ * Internal write that optionally emits events
88
+ */
89
+ private writeFileSyncInternal;
90
+ /**
91
+ * Normalize path - resolve . and .. segments, ensure leading /
92
+ */
93
+ private normalizePath;
94
+ /**
95
+ * Get path segments from normalized path
96
+ */
97
+ private getPathSegments;
98
+ /**
99
+ * Get parent directory path
100
+ */
101
+ private getParentPath;
102
+ /**
103
+ * Get basename from path
104
+ */
105
+ private getBasename;
106
+ /**
107
+ * Get node at path, returns undefined if not found
108
+ */
109
+ private getNode;
110
+ /**
111
+ * Get or create directory at path (for mkdir -p behavior)
112
+ */
113
+ private ensureDirectory;
114
+ /**
115
+ * Check if path exists
116
+ */
117
+ existsSync(path: string): boolean;
118
+ /**
119
+ * Get stats for path
120
+ */
121
+ statSync(path: string): Stats;
122
+ /**
123
+ * lstatSync - same as statSync for our virtual FS (no symlinks)
124
+ */
125
+ lstatSync(path: string): Stats;
126
+ /**
127
+ * Read file contents as Uint8Array
128
+ */
129
+ readFileSync(path: string): Uint8Array;
130
+ readFileSync(path: string, encoding: 'utf8' | 'utf-8'): string;
131
+ /**
132
+ * Write data to file, creating parent directories as needed
133
+ */
134
+ writeFileSync(path: string, data: string | Uint8Array): void;
135
+ /**
136
+ * Create directory, optionally with recursive parent creation
137
+ */
138
+ mkdirSync(path: string, options?: {
139
+ recursive?: boolean;
140
+ }): void;
141
+ /**
142
+ * Read directory contents
143
+ */
144
+ readdirSync(path: string): string[];
145
+ /**
146
+ * Remove file
147
+ */
148
+ unlinkSync(path: string): void;
149
+ /**
150
+ * Remove directory (must be empty)
151
+ */
152
+ rmdirSync(path: string): void;
153
+ /**
154
+ * Rename/move file or directory
155
+ */
156
+ renameSync(oldPath: string, newPath: string): void;
157
+ /**
158
+ * Read file with optional options parameter
159
+ */
160
+ readFile(path: string, optionsOrCallback?: {
161
+ encoding?: string;
162
+ } | ((err: Error | null, data?: Uint8Array | string) => void), callback?: (err: Error | null, data?: Uint8Array | string) => void): void;
163
+ /**
164
+ * Async stat
165
+ */
166
+ stat(path: string, callback: (err: Error | null, stats?: Stats) => void): void;
167
+ /**
168
+ * Async lstat
169
+ */
170
+ lstat(path: string, callback: (err: Error | null, stats?: Stats) => void): void;
171
+ /**
172
+ * Async readdir
173
+ */
174
+ readdir(path: string, optionsOrCallback?: {
175
+ withFileTypes?: boolean;
176
+ } | ((err: Error | null, files?: string[]) => void), callback?: (err: Error | null, files?: string[]) => void): void;
177
+ /**
178
+ * Async realpath
179
+ */
180
+ realpath(path: string, callback: (err: Error | null, resolvedPath?: string) => void): void;
181
+ /**
182
+ * Sync realpath - in our VFS, just normalize the path
183
+ */
184
+ realpathSync(path: string): string;
185
+ /**
186
+ * Watch for file changes
187
+ */
188
+ watch(filename: string, optionsOrListener?: {
189
+ persistent?: boolean;
190
+ recursive?: boolean;
191
+ encoding?: string;
192
+ } | WatchListener, listener?: WatchListener): FSWatcher;
193
+ /**
194
+ * Notify watchers of file changes
195
+ */
196
+ private notifyWatchers;
197
+ /**
198
+ * Access check - in our VFS, always succeeds if file exists
199
+ */
200
+ accessSync(path: string, mode?: number): void;
201
+ /**
202
+ * Async access
203
+ */
204
+ access(path: string, modeOrCallback?: number | ((err: Error | null) => void), callback?: (err: Error | null) => void): void;
205
+ /**
206
+ * Copy file
207
+ */
208
+ copyFileSync(src: string, dest: string): void;
209
+ /**
210
+ * Create read stream - simplified implementation
211
+ */
212
+ createReadStream(path: string): {
213
+ on: (event: string, cb: (...args: unknown[]) => void) => void;
214
+ pipe: (dest: unknown) => unknown;
215
+ };
216
+ /**
217
+ * Create write stream - simplified implementation
218
+ */
219
+ createWriteStream(path: string): {
220
+ write: (data: string | Uint8Array) => boolean;
221
+ end: (data?: string | Uint8Array) => void;
222
+ on: (event: string, cb: (...args: unknown[]) => void) => void;
223
+ };
224
+ }
225
+ export {};
226
+ //# sourceMappingURL=virtual-fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-fs.d.ts","sourceRoot":"","sources":["../src/virtual-fs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Vite Demo - Running Vite in the browser using our Node.js shims
3
+ */
4
+ import { VirtualFS } from './virtual-fs';
5
+ import { Runtime } from './runtime';
6
+ import { PackageManager } from './npm';
7
+ import { ViteDevServer } from './frameworks/vite-dev-server';
8
+ export declare function createViteProject(vfs: VirtualFS): void;
9
+ export declare function initViteDemo(outputElement: HTMLElement, iframeElement: HTMLIFrameElement | null): Promise<{
10
+ vfs: VirtualFS;
11
+ runtime: Runtime;
12
+ npm: PackageManager;
13
+ }>;
14
+ /**
15
+ * Install Vite into the virtual file system
16
+ */
17
+ export declare function installVite(npm: PackageManager, log: (message: string) => void): Promise<void>;
18
+ /**
19
+ * Try to run Vite's createServer
20
+ */
21
+ export declare function runVite(runtime: Runtime, log: (message: string) => void): Promise<unknown>;
22
+ /**
23
+ * Start the dev server using Service Worker approach
24
+ * This is the recommended way to run the preview - no npm install required!
25
+ */
26
+ export declare function startDevServer(vfs: VirtualFS, options?: {
27
+ port?: number;
28
+ log?: (message: string) => void;
29
+ }): Promise<{
30
+ server: ViteDevServer;
31
+ url: string;
32
+ stop: () => void;
33
+ }>;
34
+ export { VirtualFS, Runtime, PackageManager, ViteDevServer };
35
+ //# sourceMappingURL=vite-demo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-demo.d.ts","sourceRoot":"","sources":["../src/vite-demo.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAK7D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAwTtD;AAGD,wBAAsB,YAAY,CAChC,aAAa,EAAE,WAAW,EAC1B,aAAa,EAAE,iBAAiB,GAAG,IAAI,GACtC,OAAO,CAAC;IAAE,GAAG,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,cAAc,CAAA;CAAE,CAAC,CAyCpE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAC7B,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAC7B,OAAO,CAAC,OAAO,CAAC,CAuDlB;AAyBD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,SAAS,EACd,OAAO,GAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5B,GACL,OAAO,CAAC;IACT,MAAM,EAAE,aAAa,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB,CAAC,CAqDD;AA0BD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Service Worker for Vite dev server in browser
3
+ * Intercepts requests to the virtual Vite server and forwards them to the main thread
4
+ */
5
+
6
+ const VITE_ORIGIN = self.location.origin;
7
+ const CACHE_NAME = 'vite-sw-v1';
8
+
9
+ // Map of pending requests
10
+ const pendingRequests = new Map();
11
+ let requestId = 0;
12
+
13
+ // BroadcastChannel for communication with main thread
14
+ const channel = new BroadcastChannel('vite-server');
15
+
16
+ // Listen for messages from main thread
17
+ channel.addEventListener('message', (event) => {
18
+ const { type, requestId: reqId, response, error } = event.data;
19
+
20
+ if (type === 'response' && pendingRequests.has(reqId)) {
21
+ const { resolve, reject } = pendingRequests.get(reqId);
22
+ pendingRequests.delete(reqId);
23
+
24
+ if (error) {
25
+ reject(new Error(error));
26
+ } else {
27
+ resolve(
28
+ new Response(response.body, {
29
+ status: response.status || 200,
30
+ statusText: response.statusText || 'OK',
31
+ headers: new Headers(response.headers || {}),
32
+ })
33
+ );
34
+ }
35
+ }
36
+ });
37
+
38
+ // Install event - take control immediately
39
+ self.addEventListener('install', (event) => {
40
+ event.waitUntil(self.skipWaiting());
41
+ });
42
+
43
+ // Activate event - claim all clients
44
+ self.addEventListener('activate', (event) => {
45
+ event.waitUntil(
46
+ Promise.all([
47
+ self.clients.claim(),
48
+ // Clear old caches
49
+ caches.keys().then((cacheNames) =>
50
+ Promise.all(
51
+ cacheNames
52
+ .filter((name) => name !== CACHE_NAME)
53
+ .map((name) => caches.delete(name))
54
+ )
55
+ ),
56
+ ])
57
+ );
58
+ });
59
+
60
+ // Fetch event - intercept requests to Vite dev server paths
61
+ self.addEventListener('fetch', (event) => {
62
+ const url = new URL(event.request.url);
63
+
64
+ // Only intercept requests to our origin
65
+ if (url.origin !== VITE_ORIGIN) {
66
+ return;
67
+ }
68
+
69
+ // Check if this is a Vite-related path
70
+ const vitePatterns = [
71
+ /^\/@vite\//,
72
+ /^\/@id\//,
73
+ /^\/@fs\//,
74
+ /^\/node_modules\/.vite\//,
75
+ /^\/src\//,
76
+ /\.(js|ts|jsx|tsx|css|scss|sass|less|vue|svelte)(\?.*)?$/,
77
+ /^\/\?.*$/,
78
+ /^\/__vite_/,
79
+ ];
80
+
81
+ const isViteRequest = vitePatterns.some((pattern) => pattern.test(url.pathname));
82
+
83
+ if (!isViteRequest) {
84
+ return;
85
+ }
86
+
87
+ event.respondWith(handleViteRequest(event.request, url));
88
+ });
89
+
90
+ async function handleViteRequest(request, url) {
91
+ const reqId = ++requestId;
92
+
93
+ // Create a promise that will be resolved when we get a response
94
+ const responsePromise = new Promise((resolve, reject) => {
95
+ pendingRequests.set(reqId, { resolve, reject });
96
+
97
+ // Timeout after 30 seconds
98
+ setTimeout(() => {
99
+ if (pendingRequests.has(reqId)) {
100
+ pendingRequests.delete(reqId);
101
+ reject(new Error('Request timeout'));
102
+ }
103
+ }, 30000);
104
+ });
105
+
106
+ // Send request to main thread
107
+ channel.postMessage({
108
+ type: 'request',
109
+ requestId: reqId,
110
+ url: url.href,
111
+ method: request.method,
112
+ headers: Object.fromEntries(request.headers.entries()),
113
+ // Note: We can't easily clone the body in all cases, handle in main thread
114
+ });
115
+
116
+ try {
117
+ return await responsePromise;
118
+ } catch (error) {
119
+ console.error('[vite-sw] Request failed:', error);
120
+ return new Response(`Service Worker Error: ${error.message}`, {
121
+ status: 500,
122
+ headers: { 'Content-Type': 'text/plain' },
123
+ });
124
+ }
125
+ }
126
+
127
+ // Handle messages from clients (pages)
128
+ self.addEventListener('message', (event) => {
129
+ if (event.data === 'skipWaiting') {
130
+ self.skipWaiting();
131
+ }
132
+ });
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Runtime Worker - Runs the Just Node runtime in a Web Worker
3
+ *
4
+ * This worker receives code execution requests from the main thread
5
+ * and runs them in isolation, preventing UI blocking.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=runtime-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-worker.d.ts","sourceRoot":"","sources":["../../src/worker/runtime-worker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * WorkerRuntime - Runs code in a Web Worker for non-blocking execution
3
+ *
4
+ * This class provides the same IRuntime interface as Runtime,
5
+ * but executes code in a separate Web Worker thread.
6
+ */
7
+ import type { VirtualFS } from './virtual-fs';
8
+ import type { IRuntime, IExecuteResult, IRuntimeOptions } from './runtime-interface';
9
+ /**
10
+ * WorkerRuntime - Executes code in a Web Worker
11
+ */
12
+ export declare class WorkerRuntime implements IRuntime {
13
+ private worker;
14
+ private workerApi;
15
+ private vfs;
16
+ private options;
17
+ private initialized;
18
+ private changeListener;
19
+ private deleteListener;
20
+ constructor(vfs: VirtualFS, options?: IRuntimeOptions);
21
+ /**
22
+ * Initialize the worker with VFS snapshot and options
23
+ */
24
+ private initWorker;
25
+ /**
26
+ * Set up listeners for VFS changes to sync to worker
27
+ */
28
+ private setupVFSListeners;
29
+ /**
30
+ * Execute code in the worker
31
+ */
32
+ execute(code: string, filename?: string): Promise<IExecuteResult>;
33
+ /**
34
+ * Run a file from the VFS in the worker
35
+ */
36
+ runFile(filename: string): Promise<IExecuteResult>;
37
+ /**
38
+ * Clear the module cache in the worker
39
+ */
40
+ clearCache(): void;
41
+ /**
42
+ * Get the VFS (main thread instance)
43
+ */
44
+ getVFS(): VirtualFS;
45
+ /**
46
+ * Terminate the worker
47
+ */
48
+ terminate(): void;
49
+ }
50
+ //# sourceMappingURL=worker-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-runtime.d.ts","sourceRoot":"","sources":["../src/worker-runtime.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAe,MAAM,qBAAqB,CAAC;AAelG;;GAEG;AACH,qBAAa,aAAc,YAAW,QAAQ;IAC5C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,cAAc,CAA0D;IAChF,OAAO,CAAC,cAAc,CAAyC;gBAEnD,GAAG,EAAE,SAAS,EAAE,OAAO,GAAE,eAAoB;IAqBzD;;OAEG;YACW,UAAU;IAqBxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAczB;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAKvE;;OAEG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAKxD;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,MAAM,IAAI,SAAS;IAInB;;OAEG;IACH,SAAS,IAAI,IAAI;CAalB"}
package/package.json ADDED
@@ -0,0 +1,85 @@
1
+ {
2
+ "name": "almostnode",
3
+ "version": "0.1.0",
4
+ "description": "Node.js in your browser. Just like that.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "keywords": [
8
+ "node",
9
+ "browser",
10
+ "runtime",
11
+ "virtual-filesystem",
12
+ "sandbox",
13
+ "vite",
14
+ "nextjs",
15
+ "hmr",
16
+ "typescript"
17
+ ],
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/user/almostnode.git"
21
+ },
22
+ "homepage": "https://github.com/user/almostnode#readme",
23
+ "bugs": {
24
+ "url": "https://github.com/user/almostnode/issues"
25
+ },
26
+ "author": "",
27
+ "engines": {
28
+ "node": ">=20.0.0"
29
+ },
30
+ "main": "./dist/index.cjs",
31
+ "module": "./dist/index.mjs",
32
+ "types": "./dist/index.d.ts",
33
+ "exports": {
34
+ ".": {
35
+ "import": {
36
+ "types": "./dist/index.d.ts",
37
+ "default": "./dist/index.mjs"
38
+ },
39
+ "require": {
40
+ "types": "./dist/index.d.ts",
41
+ "default": "./dist/index.cjs"
42
+ }
43
+ }
44
+ },
45
+ "files": [
46
+ "src",
47
+ "dist"
48
+ ],
49
+ "sideEffects": false,
50
+ "scripts": {
51
+ "dev": "vite",
52
+ "build": "vite build",
53
+ "build:lib": "vite build --config vite.lib.config.js",
54
+ "build:types": "tsc --project tsconfig.build.json",
55
+ "build:publish": "npm run build:lib && npm run build:types",
56
+ "preview": "vite preview",
57
+ "test": "vitest",
58
+ "test:run": "vitest run",
59
+ "test:e2e": "playwright test",
60
+ "test:e2e:ui": "playwright test --ui",
61
+ "test:e2e:debug": "playwright test --debug",
62
+ "sandbox": "vite --port 3002 --config vite.sandbox.config.js",
63
+ "sandbox:demo": "echo 'Run in two terminals:\\n Terminal 1: npm run sandbox (serves sandbox on port 3002)\\n Terminal 2: npm run dev (serves main app on port 5173)\\nThen open: http://localhost:5173/examples/sandbox-next-demo.html'",
64
+ "prepublishOnly": "npm run test:run && npm run build:publish"
65
+ },
66
+ "dependencies": {
67
+ "brotli": "^1.3.3",
68
+ "brotli-wasm": "^3.0.1",
69
+ "comlink": "^4.4.2",
70
+ "just-bash": "^2.7.0",
71
+ "pako": "^2.1.0",
72
+ "resolve.exports": "^2.0.3",
73
+ "vite-plugin-top-level-await": "^1.6.0",
74
+ "vite-plugin-wasm": "^3.5.0"
75
+ },
76
+ "devDependencies": {
77
+ "@playwright/test": "^1.58.0",
78
+ "@types/node": "^25.0.10",
79
+ "@types/pako": "^2.0.4",
80
+ "jsdom": "^27.4.0",
81
+ "typescript": "^5.9.3",
82
+ "vite": "^5.4.0",
83
+ "vitest": "^4.0.18"
84
+ }
85
+ }