@seanhogg/builderforce-webcontainers-core 2026.10.2 → 2026.10.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 (426) hide show
  1. package/dist/build.d.ts +42 -0
  2. package/dist/build.d.ts.map +1 -0
  3. package/dist/build.js +65 -0
  4. package/dist/build.js.map +1 -0
  5. package/dist/buildHost.d.ts +31 -0
  6. package/dist/buildHost.d.ts.map +1 -0
  7. package/dist/buildHost.js +125 -0
  8. package/dist/buildHost.js.map +1 -0
  9. package/dist/buildHtml.d.ts +28 -0
  10. package/dist/buildHtml.d.ts.map +1 -0
  11. package/dist/buildHtml.js +74 -0
  12. package/dist/buildHtml.js.map +1 -0
  13. package/dist/bundler.d.ts +129 -0
  14. package/dist/bundler.d.ts.map +1 -0
  15. package/dist/bundler.js +79 -0
  16. package/dist/bundler.js.map +1 -0
  17. package/dist/check/acquire.d.ts +46 -0
  18. package/dist/check/acquire.d.ts.map +1 -0
  19. package/dist/check/acquire.js +179 -0
  20. package/dist/check/acquire.js.map +1 -0
  21. package/dist/check/compilerHost.d.ts +22 -0
  22. package/dist/check/compilerHost.d.ts.map +1 -0
  23. package/dist/check/compilerHost.js +128 -0
  24. package/dist/check/compilerHost.js.map +1 -0
  25. package/dist/check/diagnostics.d.ts +23 -0
  26. package/dist/check/diagnostics.d.ts.map +1 -0
  27. package/dist/check/diagnostics.js +28 -0
  28. package/dist/check/diagnostics.js.map +1 -0
  29. package/dist/check/index.d.ts +19 -0
  30. package/dist/check/index.d.ts.map +1 -0
  31. package/dist/check/index.js +13 -0
  32. package/dist/check/index.js.map +1 -0
  33. package/dist/check/projects.d.ts +26 -0
  34. package/dist/check/projects.d.ts.map +1 -0
  35. package/dist/check/projects.js +124 -0
  36. package/dist/check/projects.js.map +1 -0
  37. package/dist/check/shims.d.ts +29 -0
  38. package/dist/check/shims.d.ts.map +1 -0
  39. package/dist/check/shims.js +76 -0
  40. package/dist/check/shims.js.map +1 -0
  41. package/dist/check/typeStore.d.ts +57 -0
  42. package/dist/check/typeStore.d.ts.map +1 -0
  43. package/dist/check/typeStore.js +89 -0
  44. package/dist/check/typeStore.js.map +1 -0
  45. package/dist/check/typecheck.d.ts +29 -0
  46. package/dist/check/typecheck.d.ts.map +1 -0
  47. package/dist/check/typecheck.js +91 -0
  48. package/dist/check/typecheck.js.map +1 -0
  49. package/dist/compileComponent.d.ts +8 -0
  50. package/dist/compileComponent.d.ts.map +1 -0
  51. package/dist/compileComponent.js +22 -0
  52. package/dist/compileComponent.js.map +1 -0
  53. package/dist/compileScript.d.ts +19 -4
  54. package/dist/compileScript.d.ts.map +1 -1
  55. package/dist/compileScript.js +37 -12
  56. package/dist/compileScript.js.map +1 -1
  57. package/dist/components.d.ts +41 -0
  58. package/dist/components.d.ts.map +1 -0
  59. package/dist/components.js +14 -0
  60. package/dist/components.js.map +1 -0
  61. package/dist/detectProject.d.ts +3 -0
  62. package/dist/detectProject.d.ts.map +1 -1
  63. package/dist/detectProject.js +16 -6
  64. package/dist/detectProject.js.map +1 -1
  65. package/dist/devServer.d.ts +5 -2
  66. package/dist/devServer.d.ts.map +1 -1
  67. package/dist/devServer.js +10 -6
  68. package/dist/devServer.js.map +1 -1
  69. package/dist/hash.d.ts +2 -0
  70. package/dist/hash.d.ts.map +1 -0
  71. package/dist/hash.js +22 -0
  72. package/dist/hash.js.map +1 -0
  73. package/dist/index.d.ts +24 -6
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +14 -3
  76. package/dist/index.js.map +1 -1
  77. package/dist/installer/bins.d.ts +24 -0
  78. package/dist/installer/bins.d.ts.map +1 -0
  79. package/dist/installer/bins.js +56 -0
  80. package/dist/installer/bins.js.map +1 -0
  81. package/dist/installer/index.d.ts +14 -0
  82. package/dist/installer/index.d.ts.map +1 -0
  83. package/dist/installer/index.js +9 -0
  84. package/dist/installer/index.js.map +1 -0
  85. package/dist/installer/install.d.ts +46 -0
  86. package/dist/installer/install.d.ts.map +1 -0
  87. package/dist/installer/install.js +245 -0
  88. package/dist/installer/install.js.map +1 -0
  89. package/dist/installer/lockfile.d.ts +49 -0
  90. package/dist/installer/lockfile.d.ts.map +1 -0
  91. package/dist/installer/lockfile.js +110 -0
  92. package/dist/installer/lockfile.js.map +1 -0
  93. package/dist/installer/registry.d.ts +84 -0
  94. package/dist/installer/registry.d.ts.map +1 -0
  95. package/dist/installer/registry.js +130 -0
  96. package/dist/installer/registry.js.map +1 -0
  97. package/dist/installer/semver.d.ts +38 -0
  98. package/dist/installer/semver.d.ts.map +1 -0
  99. package/dist/installer/semver.js +187 -0
  100. package/dist/installer/semver.js.map +1 -0
  101. package/dist/installer/spec.d.ts +30 -0
  102. package/dist/installer/spec.d.ts.map +1 -0
  103. package/dist/installer/spec.js +30 -0
  104. package/dist/installer/spec.js.map +1 -0
  105. package/dist/installer/tar.d.ts +17 -0
  106. package/dist/installer/tar.d.ts.map +1 -0
  107. package/dist/installer/tar.js +150 -0
  108. package/dist/installer/tar.js.map +1 -0
  109. package/dist/installer/tree.d.ts +48 -0
  110. package/dist/installer/tree.d.ts.map +1 -0
  111. package/dist/installer/tree.js +179 -0
  112. package/dist/installer/tree.js.map +1 -0
  113. package/dist/node/assert.d.ts +15 -0
  114. package/dist/node/assert.d.ts.map +1 -0
  115. package/dist/node/assert.js +137 -0
  116. package/dist/node/assert.js.map +1 -0
  117. package/dist/node/buffer.d.ts +84 -0
  118. package/dist/node/buffer.d.ts.map +1 -0
  119. package/dist/node/buffer.js +304 -0
  120. package/dist/node/buffer.js.map +1 -0
  121. package/dist/node/builtins.d.ts +25 -0
  122. package/dist/node/builtins.d.ts.map +1 -0
  123. package/dist/node/builtins.js +101 -0
  124. package/dist/node/builtins.js.map +1 -0
  125. package/dist/node/callable.d.ts +13 -0
  126. package/dist/node/callable.d.ts.map +1 -0
  127. package/dist/node/callable.js +26 -0
  128. package/dist/node/callable.js.map +1 -0
  129. package/dist/node/childProcess.d.ts +13 -0
  130. package/dist/node/childProcess.d.ts.map +1 -0
  131. package/dist/node/childProcess.js +143 -0
  132. package/dist/node/childProcess.js.map +1 -0
  133. package/dist/node/crypto.d.ts +3 -0
  134. package/dist/node/crypto.d.ts.map +1 -0
  135. package/dist/node/crypto.js +180 -0
  136. package/dist/node/crypto.js.map +1 -0
  137. package/dist/node/esm.d.ts +9 -0
  138. package/dist/node/esm.d.ts.map +1 -0
  139. package/dist/node/esm.js +202 -0
  140. package/dist/node/esm.js.map +1 -0
  141. package/dist/node/events.d.ts +40 -0
  142. package/dist/node/events.d.ts.map +1 -0
  143. package/dist/node/events.js +160 -0
  144. package/dist/node/events.js.map +1 -0
  145. package/dist/node/fs/index.d.ts +7 -0
  146. package/dist/node/fs/index.d.ts.map +1 -0
  147. package/dist/node/fs/index.js +270 -0
  148. package/dist/node/fs/index.js.map +1 -0
  149. package/dist/node/fs/stats.d.ts +93 -0
  150. package/dist/node/fs/stats.d.ts.map +1 -0
  151. package/dist/node/fs/stats.js +104 -0
  152. package/dist/node/fs/stats.js.map +1 -0
  153. package/dist/node/fs/sync.d.ts +98 -0
  154. package/dist/node/fs/sync.d.ts.map +1 -0
  155. package/dist/node/fs/sync.js +348 -0
  156. package/dist/node/fs/sync.js.map +1 -0
  157. package/dist/node/hashes.d.ts +15 -0
  158. package/dist/node/hashes.d.ts.map +1 -0
  159. package/dist/node/hashes.js +195 -0
  160. package/dist/node/hashes.js.map +1 -0
  161. package/dist/node/http/client.d.ts +35 -0
  162. package/dist/node/http/client.d.ts.map +1 -0
  163. package/dist/node/http/client.js +161 -0
  164. package/dist/node/http/client.js.map +1 -0
  165. package/dist/node/http/index.d.ts +5 -0
  166. package/dist/node/http/index.d.ts.map +1 -0
  167. package/dist/node/http/index.js +125 -0
  168. package/dist/node/http/index.js.map +1 -0
  169. package/dist/node/http/server.d.ts +135 -0
  170. package/dist/node/http/server.d.ts.map +1 -0
  171. package/dist/node/http/server.js +308 -0
  172. package/dist/node/http/server.js.map +1 -0
  173. package/dist/node/http/status.d.ts +3 -0
  174. package/dist/node/http/status.d.ts.map +1 -0
  175. package/dist/node/http/status.js +13 -0
  176. package/dist/node/http/status.js.map +1 -0
  177. package/dist/node/inspect.d.ts +22 -0
  178. package/dist/node/inspect.d.ts.map +1 -0
  179. package/dist/node/inspect.js +172 -0
  180. package/dist/node/inspect.js.map +1 -0
  181. package/dist/node/loader.d.ts +91 -0
  182. package/dist/node/loader.d.ts.map +1 -0
  183. package/dist/node/loader.js +265 -0
  184. package/dist/node/loader.js.map +1 -0
  185. package/dist/node/loop.d.ts +71 -0
  186. package/dist/node/loop.d.ts.map +1 -0
  187. package/dist/node/loop.js +189 -0
  188. package/dist/node/loop.js.map +1 -0
  189. package/dist/node/misc.d.ts +10 -0
  190. package/dist/node/misc.d.ts.map +1 -0
  191. package/dist/node/misc.js +256 -0
  192. package/dist/node/misc.js.map +1 -0
  193. package/dist/node/path.d.ts +14 -0
  194. package/dist/node/path.d.ts.map +1 -0
  195. package/dist/node/path.js +128 -0
  196. package/dist/node/path.js.map +1 -0
  197. package/dist/node/process.d.ts +31 -0
  198. package/dist/node/process.d.ts.map +1 -0
  199. package/dist/node/process.js +309 -0
  200. package/dist/node/process.js.map +1 -0
  201. package/dist/node/program.d.ts +19 -0
  202. package/dist/node/program.d.ts.map +1 -0
  203. package/dist/node/program.js +165 -0
  204. package/dist/node/program.js.map +1 -0
  205. package/dist/node/readline.d.ts +2 -0
  206. package/dist/node/readline.d.ts.map +1 -0
  207. package/dist/node/readline.js +155 -0
  208. package/dist/node/readline.js.map +1 -0
  209. package/dist/node/resolve.d.ts +45 -0
  210. package/dist/node/resolve.d.ts.map +1 -0
  211. package/dist/node/resolve.js +206 -0
  212. package/dist/node/resolve.js.map +1 -0
  213. package/dist/node/runtime.d.ts +40 -0
  214. package/dist/node/runtime.d.ts.map +1 -0
  215. package/dist/node/runtime.js +149 -0
  216. package/dist/node/runtime.js.map +1 -0
  217. package/dist/node/stream/index.d.ts +52 -0
  218. package/dist/node/stream/index.d.ts.map +1 -0
  219. package/dist/node/stream/index.js +184 -0
  220. package/dist/node/stream/index.js.map +1 -0
  221. package/dist/node/stream/readable.d.ts +83 -0
  222. package/dist/node/stream/readable.d.ts.map +1 -0
  223. package/dist/node/stream/readable.js +325 -0
  224. package/dist/node/stream/readable.js.map +1 -0
  225. package/dist/node/stream/writable.d.ts +80 -0
  226. package/dist/node/stream/writable.d.ts.map +1 -0
  227. package/dist/node/stream/writable.js +224 -0
  228. package/dist/node/stream/writable.js.map +1 -0
  229. package/dist/node/urlqs.d.ts +22 -0
  230. package/dist/node/urlqs.d.ts.map +1 -0
  231. package/dist/node/urlqs.js +165 -0
  232. package/dist/node/urlqs.js.map +1 -0
  233. package/dist/node/util.d.ts +37 -0
  234. package/dist/node/util.d.ts.map +1 -0
  235. package/dist/node/util.js +160 -0
  236. package/dist/node/util.js.map +1 -0
  237. package/dist/node/zlib.d.ts +2 -0
  238. package/dist/node/zlib.d.ts.map +1 -0
  239. package/dist/node/zlib.js +133 -0
  240. package/dist/node/zlib.js.map +1 -0
  241. package/dist/packageCdn.d.ts +12 -0
  242. package/dist/packageCdn.d.ts.map +1 -1
  243. package/dist/packageCdn.js +3 -1
  244. package/dist/packageCdn.js.map +1 -1
  245. package/dist/projectConfig.d.ts +6 -2
  246. package/dist/projectConfig.d.ts.map +1 -1
  247. package/dist/projectConfig.js +32 -8
  248. package/dist/projectConfig.js.map +1 -1
  249. package/dist/shell/builtins.d.ts +23 -0
  250. package/dist/shell/builtins.d.ts.map +1 -0
  251. package/dist/shell/builtins.js +131 -0
  252. package/dist/shell/builtins.js.map +1 -0
  253. package/dist/shell/context.d.ts +41 -0
  254. package/dist/shell/context.d.ts.map +1 -0
  255. package/dist/shell/context.js +65 -0
  256. package/dist/shell/context.js.map +1 -0
  257. package/dist/shell/devHandoff.d.ts +18 -0
  258. package/dist/shell/devHandoff.d.ts.map +1 -0
  259. package/dist/shell/devHandoff.js +36 -0
  260. package/dist/shell/devHandoff.js.map +1 -0
  261. package/dist/shell/exec.d.ts +67 -0
  262. package/dist/shell/exec.d.ts.map +1 -0
  263. package/dist/shell/exec.js +247 -0
  264. package/dist/shell/exec.js.map +1 -0
  265. package/dist/shell/expand.d.ts +28 -0
  266. package/dist/shell/expand.d.ts.map +1 -0
  267. package/dist/shell/expand.js +149 -0
  268. package/dist/shell/expand.js.map +1 -0
  269. package/dist/shell/fileCommands.d.ts +10 -0
  270. package/dist/shell/fileCommands.d.ts.map +1 -0
  271. package/dist/shell/fileCommands.js +208 -0
  272. package/dist/shell/fileCommands.js.map +1 -0
  273. package/dist/shell/lineEditor.d.ts +43 -0
  274. package/dist/shell/lineEditor.d.ts.map +1 -0
  275. package/dist/shell/lineEditor.js +234 -0
  276. package/dist/shell/lineEditor.js.map +1 -0
  277. package/dist/shell/npm.d.ts +6 -0
  278. package/dist/shell/npm.d.ts.map +1 -0
  279. package/dist/shell/npm.js +234 -0
  280. package/dist/shell/npm.js.map +1 -0
  281. package/dist/shell/parse.d.ts +73 -0
  282. package/dist/shell/parse.d.ts.map +1 -0
  283. package/dist/shell/parse.js +300 -0
  284. package/dist/shell/parse.js.map +1 -0
  285. package/dist/shell/program.d.ts +12 -0
  286. package/dist/shell/program.d.ts.map +1 -0
  287. package/dist/shell/program.js +219 -0
  288. package/dist/shell/program.js.map +1 -0
  289. package/dist/shell/textCommands.d.ts +15 -0
  290. package/dist/shell/textCommands.d.ts.map +1 -0
  291. package/dist/shell/textCommands.js +185 -0
  292. package/dist/shell/textCommands.js.map +1 -0
  293. package/dist/styleModules.d.ts +6 -0
  294. package/dist/styleModules.d.ts.map +1 -1
  295. package/dist/styleModules.js +14 -4
  296. package/dist/styleModules.js.map +1 -1
  297. package/dist/svelteCompiler.d.ts +28 -0
  298. package/dist/svelteCompiler.d.ts.map +1 -0
  299. package/dist/svelteCompiler.js +13 -0
  300. package/dist/svelteCompiler.js.map +1 -0
  301. package/dist/system/commands.d.ts +26 -0
  302. package/dist/system/commands.d.ts.map +1 -0
  303. package/dist/system/commands.js +53 -0
  304. package/dist/system/commands.js.map +1 -0
  305. package/dist/system/index.d.ts +23 -0
  306. package/dist/system/index.d.ts.map +1 -0
  307. package/dist/system/index.js +16 -0
  308. package/dist/system/index.js.map +1 -0
  309. package/dist/system/kernel.d.ts +54 -0
  310. package/dist/system/kernel.d.ts.map +1 -0
  311. package/dist/system/kernel.js +81 -0
  312. package/dist/system/kernel.js.map +1 -0
  313. package/dist/system/ports.d.ts +32 -0
  314. package/dist/system/ports.d.ts.map +1 -0
  315. package/dist/system/ports.js +57 -0
  316. package/dist/system/ports.js.map +1 -0
  317. package/dist/system/process.d.ts +32 -0
  318. package/dist/system/process.d.ts.map +1 -0
  319. package/dist/system/process.js +130 -0
  320. package/dist/system/process.js.map +1 -0
  321. package/dist/system/programs.d.ts +10 -0
  322. package/dist/system/programs.d.ts.map +1 -0
  323. package/dist/system/programs.js +22 -0
  324. package/dist/system/programs.js.map +1 -0
  325. package/dist/system/terminal.d.ts +45 -0
  326. package/dist/system/terminal.d.ts.map +1 -0
  327. package/dist/system/terminal.js +127 -0
  328. package/dist/system/terminal.js.map +1 -0
  329. package/dist/system/types.d.ts +100 -0
  330. package/dist/system/types.d.ts.map +1 -0
  331. package/dist/system/types.js +2 -0
  332. package/dist/system/types.js.map +1 -0
  333. package/dist/vfs.d.ts +28 -4
  334. package/dist/vfs.d.ts.map +1 -1
  335. package/dist/vfs.js +95 -32
  336. package/dist/vfs.js.map +1 -1
  337. package/dist/vueCompiler.d.ts +75 -0
  338. package/dist/vueCompiler.d.ts.map +1 -0
  339. package/dist/vueCompiler.js +67 -0
  340. package/dist/vueCompiler.js.map +1 -0
  341. package/package.json +18 -2
  342. package/src/build.ts +105 -0
  343. package/src/buildHost.ts +154 -0
  344. package/src/buildHtml.ts +101 -0
  345. package/src/bundler.ts +190 -0
  346. package/src/check/acquire.ts +212 -0
  347. package/src/check/compilerHost.ts +138 -0
  348. package/src/check/diagnostics.ts +48 -0
  349. package/src/check/index.ts +28 -0
  350. package/src/check/projects.ts +149 -0
  351. package/src/check/shims.ts +88 -0
  352. package/src/check/typeStore.ts +103 -0
  353. package/src/check/typecheck.ts +134 -0
  354. package/src/compileComponent.ts +21 -0
  355. package/src/compileScript.ts +42 -13
  356. package/src/components.ts +59 -0
  357. package/src/detectProject.ts +18 -6
  358. package/src/devServer.ts +13 -8
  359. package/src/hash.ts +22 -0
  360. package/src/index.ts +35 -6
  361. package/src/installer/bins.ts +64 -0
  362. package/src/installer/index.ts +13 -0
  363. package/src/installer/install.ts +275 -0
  364. package/src/installer/lockfile.ts +146 -0
  365. package/src/installer/registry.ts +175 -0
  366. package/src/installer/semver.ts +190 -0
  367. package/src/installer/spec.ts +53 -0
  368. package/src/installer/tar.ts +155 -0
  369. package/src/installer/tree.ts +236 -0
  370. package/src/node/assert.ts +127 -0
  371. package/src/node/buffer.ts +304 -0
  372. package/src/node/builtins.ts +123 -0
  373. package/src/node/callable.ts +25 -0
  374. package/src/node/childProcess.ts +164 -0
  375. package/src/node/crypto.ts +187 -0
  376. package/src/node/esm.ts +196 -0
  377. package/src/node/events.ts +176 -0
  378. package/src/node/fs/index.ts +277 -0
  379. package/src/node/fs/stats.ts +110 -0
  380. package/src/node/fs/sync.ts +335 -0
  381. package/src/node/hashes.ts +171 -0
  382. package/src/node/http/client.ts +173 -0
  383. package/src/node/http/index.ts +122 -0
  384. package/src/node/http/server.ts +308 -0
  385. package/src/node/http/status.ts +13 -0
  386. package/src/node/inspect.ts +166 -0
  387. package/src/node/loader.ts +293 -0
  388. package/src/node/loop.ts +193 -0
  389. package/src/node/misc.ts +250 -0
  390. package/src/node/path.ts +135 -0
  391. package/src/node/process.ts +324 -0
  392. package/src/node/program.ts +170 -0
  393. package/src/node/readline.ts +157 -0
  394. package/src/node/resolve.ts +216 -0
  395. package/src/node/runtime.ts +184 -0
  396. package/src/node/stream/index.ts +196 -0
  397. package/src/node/stream/readable.ts +345 -0
  398. package/src/node/stream/writable.ts +244 -0
  399. package/src/node/urlqs.ts +162 -0
  400. package/src/node/util.ts +145 -0
  401. package/src/node/zlib.ts +145 -0
  402. package/src/packageCdn.ts +11 -1
  403. package/src/projectConfig.ts +34 -7
  404. package/src/shell/builtins.ts +141 -0
  405. package/src/shell/context.ts +89 -0
  406. package/src/shell/devHandoff.ts +49 -0
  407. package/src/shell/exec.ts +268 -0
  408. package/src/shell/expand.ts +145 -0
  409. package/src/shell/fileCommands.ts +206 -0
  410. package/src/shell/lineEditor.ts +233 -0
  411. package/src/shell/npm.ts +229 -0
  412. package/src/shell/parse.ts +295 -0
  413. package/src/shell/program.ts +223 -0
  414. package/src/shell/textCommands.ts +177 -0
  415. package/src/styleModules.ts +15 -4
  416. package/src/svelteCompiler.ts +31 -0
  417. package/src/system/commands.ts +72 -0
  418. package/src/system/index.ts +22 -0
  419. package/src/system/kernel.ts +106 -0
  420. package/src/system/ports.ts +73 -0
  421. package/src/system/process.ts +158 -0
  422. package/src/system/programs.ts +31 -0
  423. package/src/system/terminal.ts +135 -0
  424. package/src/system/types.ts +103 -0
  425. package/src/vfs.ts +92 -28
  426. package/src/vueCompiler.ts +121 -0
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Node's EventEmitter. Most of the Node API surface (streams, servers, child
3
+ * processes, `process` itself) is built on it, so it is written faithfully:
4
+ * listener order, `once` wrappers that `removeListener` can find, the throw on
5
+ * an unhandled `'error'`, and `newListener`/`removeListener` events.
6
+ */
7
+
8
+ import { callable } from './callable.js';
9
+
10
+ export type Listener = (...args: any[]) => unknown;
11
+ interface OnceWrapper extends Listener {
12
+ listener: Listener;
13
+ }
14
+
15
+ /** The class itself, for subclassing inside the runtime; user code gets {@link EventEmitter}. */
16
+ export class EventEmitterBase {
17
+ static defaultMaxListeners = 10;
18
+ static readonly errorMonitor = Symbol('events.errorMonitor');
19
+ // `declare`: no class-field initialiser, so a bare `EventEmitter.call(this)` and
20
+ // `new` set up the same state (see callable.ts).
21
+ declare _events: Map<string | symbol, Listener[]>;
22
+ declare _maxListeners?: number;
23
+
24
+ constructor() {
25
+ initEmitter(this);
26
+ }
27
+
28
+ /** Resolve with the arguments of the next `event` (rejects on `'error'`). */
29
+ static once(emitter: EventEmitterBase, event: string | symbol): Promise<unknown[]> {
30
+ return new Promise((resolve, reject) => {
31
+ const onError = (error: unknown) => {
32
+ emitter.removeListener(event, onEvent);
33
+ reject(error);
34
+ };
35
+ const onEvent = (...args: unknown[]) => {
36
+ if (event !== 'error') emitter.removeListener('error', onError);
37
+ resolve(args);
38
+ };
39
+ emitter.once(event, onEvent);
40
+ if (event !== 'error') emitter.once('error', onError);
41
+ });
42
+ }
43
+
44
+ static listenerCount(emitter: EventEmitterBase, event: string | symbol): number {
45
+ return emitter.listenerCount(event);
46
+ }
47
+
48
+ addListener(event: string | symbol, listener: Listener): this {
49
+ return this._add(event, listener, false);
50
+ }
51
+
52
+ on(event: string | symbol, listener: Listener): this {
53
+ return this._add(event, listener, false);
54
+ }
55
+
56
+ prependListener(event: string | symbol, listener: Listener): this {
57
+ return this._add(event, listener, true);
58
+ }
59
+
60
+ once(event: string | symbol, listener: Listener): this {
61
+ return this._add(event, this._onceWrap(event, listener), false);
62
+ }
63
+
64
+ prependOnceListener(event: string | symbol, listener: Listener): this {
65
+ return this._add(event, this._onceWrap(event, listener), true);
66
+ }
67
+
68
+ removeListener(event: string | symbol, listener: Listener): this {
69
+ const list = this._events?.get(event);
70
+ if (!list) return this;
71
+ for (let i = list.length - 1; i >= 0; i--) {
72
+ const entry = list[i]!;
73
+ if (entry === listener || (entry as OnceWrapper).listener === listener) {
74
+ list.splice(i, 1);
75
+ if (!list.length) this._events.delete(event);
76
+ if (this._events.has('removeListener')) this.emit('removeListener', event, listener);
77
+ break;
78
+ }
79
+ }
80
+ return this;
81
+ }
82
+
83
+ off(event: string | symbol, listener: Listener): this {
84
+ return this.removeListener(event, listener);
85
+ }
86
+
87
+ removeAllListeners(event?: string | symbol): this {
88
+ if (!this._events) return this;
89
+ if (event === undefined) this._events.clear();
90
+ else this._events.delete(event);
91
+ return this;
92
+ }
93
+
94
+ emit(event: string | symbol, ...args: unknown[]): boolean {
95
+ const list = this._events?.get(event);
96
+ if (event === 'error') {
97
+ this._events?.get(EventEmitterBase.errorMonitor)?.slice().forEach((l) => l.apply(this, args));
98
+ if (!list?.length) {
99
+ const error = args[0];
100
+ if (error instanceof Error) throw error;
101
+ const wrapped = new Error(`Unhandled error. (${String(error)})`) as Error & { context?: unknown };
102
+ wrapped.context = error;
103
+ throw wrapped;
104
+ }
105
+ }
106
+ if (!list?.length) return false;
107
+ for (const listener of list.slice()) listener.apply(this, args);
108
+ return true;
109
+ }
110
+
111
+ listeners(event: string | symbol): Listener[] {
112
+ return (this._events?.get(event) ?? []).map((l) => (l as OnceWrapper).listener ?? l);
113
+ }
114
+
115
+ rawListeners(event: string | symbol): Listener[] {
116
+ return [...(this._events?.get(event) ?? [])];
117
+ }
118
+
119
+ listenerCount(event: string | symbol): number {
120
+ return this._events?.get(event)?.length ?? 0;
121
+ }
122
+
123
+ eventNames(): Array<string | symbol> {
124
+ return [...(this._events?.keys() ?? [])];
125
+ }
126
+
127
+ setMaxListeners(n: number): this {
128
+ this._maxListeners = n;
129
+ return this;
130
+ }
131
+
132
+ getMaxListeners(): number {
133
+ return this._maxListeners ?? EventEmitterBase.defaultMaxListeners;
134
+ }
135
+
136
+ private _add(event: string | symbol, listener: Listener, prepend: boolean): this {
137
+ if (typeof listener !== 'function') throw new TypeError('The "listener" argument must be of type function');
138
+ // Subclasses created with util.inherits + EventEmitter.call(this) arrive here
139
+ // without the constructor's field initialisers having run on them.
140
+ if (!this._events) this._events = new Map();
141
+ if (this._events.has('newListener')) this.emit('newListener', event, (listener as OnceWrapper).listener ?? listener);
142
+ const list = this._events.get(event) ?? [];
143
+ if (prepend) list.unshift(listener);
144
+ else list.push(listener);
145
+ this._events.set(event, list);
146
+ return this;
147
+ }
148
+
149
+ private _onceWrap(event: string | symbol, listener: Listener): OnceWrapper {
150
+ let fired = false;
151
+ const wrapper = ((...args: unknown[]) => {
152
+ if (fired) return undefined;
153
+ fired = true;
154
+ this.removeListener(event, wrapper);
155
+ return listener.apply(this, args);
156
+ }) as OnceWrapper;
157
+ wrapper.listener = listener;
158
+ return wrapper;
159
+ }
160
+ }
161
+
162
+ function initEmitter(self: { _events?: Map<string | symbol, Listener[]> }): void {
163
+ if (!self._events || !(self._events instanceof Map)) self._events = new Map();
164
+ }
165
+
166
+ export const EventEmitter = callable(EventEmitterBase, initEmitter);
167
+ export type EventEmitter = EventEmitterBase;
168
+
169
+ /** The `events` module object: the class, with Node's statics hung on it. */
170
+ export function createEventsModule(): Record<string, unknown> {
171
+ const mod = EventEmitter as unknown as Record<string, unknown>;
172
+ mod.EventEmitter = EventEmitter;
173
+ mod.once = EventEmitterBase.once;
174
+ mod.defaultMaxListeners = EventEmitterBase.defaultMaxListeners;
175
+ return mod;
176
+ }
@@ -0,0 +1,277 @@
1
+ /**
2
+ * The `fs` module: the sync API (sync.ts) plus callback, promise and stream
3
+ * forms derived from it, and `watch` over the VFS's change events.
4
+ *
5
+ * Async forms complete on a microtask. That is enough to keep ordering
6
+ * Node-like (callbacks never run synchronously) and, because microtasks always
7
+ * drain before the runtime's exit check, a chain of fs callbacks can never be
8
+ * cut short by the process exiting.
9
+ */
10
+ import { EventEmitterBase } from '../events.js';
11
+ import { Buffer } from '../buffer.js';
12
+ import { Readable } from '../stream/readable.js';
13
+ import { Writable } from '../stream/writable.js';
14
+ import { createSyncFs, type FsContext, type SyncFs } from './sync.js';
15
+ import { Dirent, Stats, constants } from './stats.js';
16
+ import { normalizePath } from '../../paths.js';
17
+
18
+ export interface FsModuleContext extends FsContext {
19
+ /** Keep the process alive (a watcher is open); call the result to let go. */
20
+ hold(): () => void;
21
+ }
22
+
23
+ type Fn = (...args: any[]) => any;
24
+
25
+ const CHUNK = 64 * 1024;
26
+
27
+ function lastCallback(args: unknown[]): Fn | undefined {
28
+ return typeof args[args.length - 1] === 'function' ? (args.pop() as Fn) : undefined;
29
+ }
30
+
31
+ export function createFsModule(ctx: FsModuleContext): Record<string, any> {
32
+ const sync = createSyncFs(ctx);
33
+
34
+ const toCallback = (fn: Fn, shape: (result: any, args: any[]) => any[] = (r) => [r]) =>
35
+ (...args: any[]) => {
36
+ const cb = lastCallback(args);
37
+ queueMicrotask(() => {
38
+ let result: unknown;
39
+ try {
40
+ result = fn(...args);
41
+ } catch (error) {
42
+ cb?.(error);
43
+ return;
44
+ }
45
+ cb?.(null, ...shape(result, args));
46
+ });
47
+ };
48
+
49
+ const toPromise = (fn: Fn) => async (...args: any[]) => fn(...args);
50
+
51
+ class ReadStream extends Readable {
52
+ bytesRead = 0;
53
+ readonly path: string;
54
+ fd: number | null = null;
55
+ pending = true;
56
+ private data?: Uint8Array;
57
+ private offset: number;
58
+ private readonly endAt: number;
59
+
60
+ constructor(path: string | URL, options: { start?: number; end?: number; encoding?: string; highWaterMark?: number; fd?: number } | string = {}) {
61
+ const opts = typeof options === 'string' ? { encoding: options } : options;
62
+ super({ highWaterMark: opts.highWaterMark ?? CHUNK, encoding: opts.encoding });
63
+ this.path = typeof options === 'object' && opts.fd !== undefined ? '' : sync._resolve(path);
64
+ this.offset = opts.start ?? 0;
65
+ this.endAt = opts.end ?? Infinity;
66
+ queueMicrotask(() => {
67
+ try {
68
+ const contents = sync.readFileSync(this.path) as Buffer;
69
+ this.data = contents;
70
+ this.fd = -1;
71
+ this.pending = false;
72
+ this.emit('open', this.fd);
73
+ this.emit('ready');
74
+ this._pull();
75
+ } catch (error) {
76
+ this.destroy(error as Error);
77
+ }
78
+ });
79
+ }
80
+
81
+ override _read(): void {
82
+ if (!this.data) {
83
+ this._readableState.reading = false; // retried once the file is loaded
84
+ return;
85
+ }
86
+ const end = Math.min(this.data.length, this.endAt + 1);
87
+ if (this.offset >= end) {
88
+ this.push(null);
89
+ return;
90
+ }
91
+ const chunk = this.data.subarray(this.offset, Math.min(end, this.offset + this._readableState.highWaterMark));
92
+ this.offset += chunk.length;
93
+ this.bytesRead += chunk.length;
94
+ this.push(Buffer.from(chunk));
95
+ }
96
+
97
+ close(callback?: Fn): void {
98
+ this.destroy();
99
+ if (callback) this.once('close', callback);
100
+ }
101
+ }
102
+
103
+ class WriteStream extends Writable {
104
+ bytesWritten = 0;
105
+ readonly path: string;
106
+ pending = false;
107
+ private started = false;
108
+
109
+ constructor(path: string | URL, private readonly options: { flags?: string; encoding?: string } | string = {}) {
110
+ super({ decodeStrings: true });
111
+ this.path = sync._resolve(path);
112
+ queueMicrotask(() => {
113
+ try {
114
+ this.open();
115
+ this.emit('open', -1);
116
+ this.emit('ready');
117
+ } catch (error) {
118
+ this.destroy(error as Error);
119
+ }
120
+ });
121
+ }
122
+
123
+ private open(): void {
124
+ if (this.started) return;
125
+ this.started = true;
126
+ const flags = typeof this.options === 'object' ? this.options.flags ?? 'w' : 'w';
127
+ if (!flags.startsWith('a') || !ctx.vfs.isFile(this.path)) sync.writeFileSync(this.path, '', { flag: flags.includes('x') ? 'wx' : 'w' });
128
+ }
129
+
130
+ override _write(chunk: Buffer, _encoding: string, callback: (error?: Error | null) => void): void {
131
+ try {
132
+ this.open();
133
+ sync.appendFileSync(this.path, chunk);
134
+ this.bytesWritten += chunk.length;
135
+ callback();
136
+ } catch (error) {
137
+ callback(error as Error);
138
+ }
139
+ }
140
+
141
+ close(callback?: Fn): void {
142
+ this.end();
143
+ if (callback) this.once('close', callback);
144
+ }
145
+ }
146
+
147
+ class FSWatcher extends EventEmitterBase {
148
+ private readonly release: () => void;
149
+ private readonly unwatch: () => void;
150
+
151
+ constructor(path: string, recursive: boolean, listener?: Fn) {
152
+ super();
153
+ const root = normalizePath(path);
154
+ if (listener) this.on('change', listener);
155
+ this.release = ctx.hold();
156
+ this.unwatch = ctx.vfs.watch((change) => {
157
+ const p = change.path;
158
+ const inside = p === root || p.startsWith(root === '/' ? '/' : root + '/');
159
+ if (!inside) return;
160
+ const rel = p === root ? p.slice(p.lastIndexOf('/') + 1) : p.slice(root.length + (root === '/' ? 0 : 1));
161
+ if (!recursive && rel.includes('/')) return;
162
+ this.emit('change', change.type === 'write' && !change.created ? 'change' : 'rename', rel);
163
+ });
164
+ }
165
+
166
+ close(): void {
167
+ this.unwatch();
168
+ this.release();
169
+ this.emit('close');
170
+ }
171
+
172
+ ref(): this { return this; }
173
+ unref(): this { return this; }
174
+ }
175
+
176
+ const watch = (path: string | URL, options?: Fn | string | { recursive?: boolean }, listener?: Fn) => {
177
+ if (typeof options === 'function') [listener, options] = [options, undefined];
178
+ const resolved = sync._resolve(path);
179
+ if (!ctx.vfs.exists(resolved)) throw sync.statSync(resolved); // throws ENOENT
180
+ return new FSWatcher(resolved, typeof options === 'object' && !!options?.recursive, listener);
181
+ };
182
+
183
+ const fileWatchers = new Map<string, { watcher: FSWatcher; listeners: Fn[] }>();
184
+ const watchFile = (path: string, options: Fn | object, listener?: Fn) => {
185
+ const fn = (typeof options === 'function' ? options : listener)!;
186
+ const resolved = sync._resolve(path);
187
+ let entry = fileWatchers.get(resolved);
188
+ if (!entry) {
189
+ const watcher = new FSWatcher(resolved, false);
190
+ const current = { watcher, listeners: [] as Fn[] };
191
+ let previous = sync.statSync(resolved, { throwIfNoEntry: false }) ?? new Stats(resolved, 'file', 0, 0);
192
+ watcher.on('change', () => {
193
+ const next = sync.statSync(resolved, { throwIfNoEntry: false }) ?? new Stats(resolved, 'file', 0, 0);
194
+ for (const l of current.listeners) l(next, previous);
195
+ previous = next;
196
+ });
197
+ fileWatchers.set(resolved, (entry = current));
198
+ }
199
+ entry.listeners.push(fn as Fn);
200
+ return entry.watcher;
201
+ };
202
+ const unwatchFile = (path: string, listener?: Fn) => {
203
+ const resolved = sync._resolve(path);
204
+ const entry = fileWatchers.get(resolved);
205
+ if (!entry) return;
206
+ entry.listeners = listener ? entry.listeners.filter((l) => l !== listener) : [];
207
+ if (!entry.listeners.length) {
208
+ entry.watcher.close();
209
+ fileWatchers.delete(resolved);
210
+ }
211
+ };
212
+
213
+ const fs: Record<string, any> = { ...sync, constants, Stats, Dirent, ReadStream, WriteStream, FSWatcher, F_OK: 0, R_OK: 4, W_OK: 2, X_OK: 1 };
214
+ delete fs._resolve;
215
+
216
+ for (const name of Object.keys(sync)) {
217
+ if (!name.endsWith('Sync')) continue;
218
+ const base = name.slice(0, -4);
219
+ const fn = (sync as unknown as Record<string, Fn>)[name]!;
220
+ if (base === 'exists') fs.exists = (p: string, cb: Fn) => queueMicrotask(() => cb(sync.existsSync(p)));
221
+ else if (base === 'read') fs.read = toCallback(fn, (n, args) => [n, args[1]]);
222
+ else if (base === 'write') fs.write = toCallback(fn, (n, args) => [n, args[1]]);
223
+ else fs[base] = toCallback(fn);
224
+ }
225
+ fs.realpath.native = fs.realpath;
226
+ fs.createReadStream = (path: string, options?: object | string) => new ReadStream(path, options as object);
227
+ fs.createWriteStream = (path: string, options?: object | string) => new WriteStream(path, options as object);
228
+ fs.watch = watch;
229
+ fs.watchFile = watchFile;
230
+ fs.unwatchFile = unwatchFile;
231
+
232
+ const promises: Record<string, any> = { constants };
233
+ for (const name of Object.keys(sync)) {
234
+ if (!name.endsWith('Sync') || name === 'existsSync') continue;
235
+ promises[name.slice(0, -4)] = toPromise((sync as unknown as Record<string, Fn>)[name]!);
236
+ }
237
+ promises.open = async (path: string, flags?: string) => fileHandle(sync, sync.openSync(path, flags), sync._resolve(path));
238
+ promises.watch = (path: string, options?: { recursive?: boolean; signal?: AbortSignal }) => watchIterator(watch(path, options), options?.signal);
239
+ fs.promises = promises;
240
+ return fs;
241
+ }
242
+
243
+ function fileHandle(sync: SyncFs, fd: number, path: string) {
244
+ return {
245
+ fd,
246
+ readFile: async (options?: string | { encoding?: string }) => sync.readFileSync(fd, options),
247
+ writeFile: async (data: string | Uint8Array) => void sync.writeFileSync(path, data),
248
+ appendFile: async (data: string | Uint8Array) => void sync.appendFileSync(path, data),
249
+ read: async (buffer: Uint8Array, offset?: number, length?: number, position?: number | null) => ({ bytesRead: sync.readSync(fd, buffer, offset, length, position), buffer }),
250
+ write: async (data: string | Uint8Array, ...rest: any[]) => ({ bytesWritten: sync.writeSync(fd, data, ...rest), buffer: data }),
251
+ stat: async () => sync.fstatSync(fd),
252
+ truncate: async (length?: number) => sync.ftruncateSync(fd, length),
253
+ sync: async () => undefined,
254
+ datasync: async () => undefined,
255
+ chmod: async () => undefined,
256
+ close: async () => sync.closeSync(fd),
257
+ };
258
+ }
259
+
260
+ async function* watchIterator(watcher: { on(e: string, l: Fn): unknown; close(): void }, signal?: AbortSignal) {
261
+ const queue: Array<{ eventType: string; filename: string }> = [];
262
+ let wake: (() => void) | undefined;
263
+ watcher.on('change', (eventType: string, filename: string) => {
264
+ queue.push({ eventType, filename });
265
+ wake?.();
266
+ });
267
+ signal?.addEventListener('abort', () => wake?.());
268
+ try {
269
+ while (!signal?.aborted) {
270
+ if (queue.length) yield queue.shift()!;
271
+ else await new Promise<void>((resolve) => (wake = resolve));
272
+ }
273
+ } finally {
274
+ watcher.close();
275
+ }
276
+ }
277
+
@@ -0,0 +1,110 @@
1
+ /**
2
+ * The value types of the fs module: Node-shaped errors (`code`, `errno`,
3
+ * `syscall`, `path` — callers branch on `code === 'ENOENT'`), `Stats`,
4
+ * `Dirent` and `fs.constants`.
5
+ */
6
+
7
+ const ERRNO: Record<string, [number, string]> = {
8
+ ENOENT: [-2, 'no such file or directory'],
9
+ EEXIST: [-17, 'file already exists'],
10
+ EISDIR: [-21, 'illegal operation on a directory'],
11
+ ENOTDIR: [-20, 'not a directory'],
12
+ ENOTEMPTY: [-39, 'directory not empty'],
13
+ EBADF: [-9, 'bad file descriptor'],
14
+ EINVAL: [-22, 'invalid argument'],
15
+ EPERM: [-1, 'operation not permitted'],
16
+ EACCES: [-13, 'permission denied'],
17
+ ENOSYS: [-38, 'function not implemented'],
18
+ };
19
+
20
+ export interface FsError extends Error {
21
+ code: string;
22
+ errno: number;
23
+ syscall: string;
24
+ path?: string;
25
+ dest?: string;
26
+ }
27
+
28
+ export function fsError(code: keyof typeof ERRNO | string, syscall: string, path?: string, dest?: string): FsError {
29
+ const [errno, text] = ERRNO[code] ?? [-1, code.toLowerCase()];
30
+ const where = path === undefined ? '' : dest === undefined ? ` '${path}'` : ` '${path}' -> '${dest}'`;
31
+ const error = new Error(`${code}: ${text}, ${syscall}${where}`) as FsError;
32
+ error.code = code;
33
+ error.errno = errno;
34
+ error.syscall = syscall;
35
+ if (path !== undefined) error.path = path;
36
+ if (dest !== undefined) error.dest = dest;
37
+ return error;
38
+ }
39
+
40
+ function inode(path: string): number {
41
+ let hash = 5381;
42
+ for (let i = 0; i < path.length; i++) hash = ((hash * 33) ^ path.charCodeAt(i)) >>> 0;
43
+ return hash;
44
+ }
45
+
46
+ const S_IFREG = 0o100000;
47
+ const S_IFDIR = 0o040000;
48
+
49
+ export class Stats {
50
+ dev = 2049;
51
+ ino: number;
52
+ mode: number;
53
+ nlink = 1;
54
+ uid = 1000;
55
+ gid = 1000;
56
+ rdev = 0;
57
+ size: number;
58
+ blksize = 4096;
59
+ blocks: number;
60
+ atimeMs: number;
61
+ mtimeMs: number;
62
+ ctimeMs: number;
63
+ birthtimeMs: number;
64
+ atime: Date;
65
+ mtime: Date;
66
+ ctime: Date;
67
+ birthtime: Date;
68
+
69
+ constructor(path: string, kind: 'file' | 'directory', size: number, mtimeMs: number) {
70
+ this.ino = inode(path);
71
+ this.mode = kind === 'file' ? S_IFREG | 0o644 : S_IFDIR | 0o755;
72
+ this.size = size;
73
+ this.blocks = Math.ceil(size / 512);
74
+ this.atimeMs = this.mtimeMs = this.ctimeMs = this.birthtimeMs = mtimeMs;
75
+ this.atime = new Date(mtimeMs);
76
+ this.mtime = new Date(mtimeMs);
77
+ this.ctime = new Date(mtimeMs);
78
+ this.birthtime = new Date(mtimeMs);
79
+ }
80
+
81
+ isFile(): boolean { return (this.mode & 0o170000) === S_IFREG; }
82
+ isDirectory(): boolean { return (this.mode & 0o170000) === S_IFDIR; }
83
+ isSymbolicLink(): boolean { return false; }
84
+ isBlockDevice(): boolean { return false; }
85
+ isCharacterDevice(): boolean { return false; }
86
+ isFIFO(): boolean { return false; }
87
+ isSocket(): boolean { return false; }
88
+ }
89
+
90
+ export class Dirent {
91
+ constructor(readonly name: string, readonly parentPath: string, private readonly kind: 'file' | 'directory') {}
92
+ get path(): string { return this.parentPath; }
93
+ isFile(): boolean { return this.kind === 'file'; }
94
+ isDirectory(): boolean { return this.kind === 'directory'; }
95
+ isSymbolicLink(): boolean { return false; }
96
+ isBlockDevice(): boolean { return false; }
97
+ isCharacterDevice(): boolean { return false; }
98
+ isFIFO(): boolean { return false; }
99
+ isSocket(): boolean { return false; }
100
+ }
101
+
102
+ export const constants = {
103
+ F_OK: 0, R_OK: 4, W_OK: 2, X_OK: 1,
104
+ O_RDONLY: 0, O_WRONLY: 1, O_RDWR: 2, O_CREAT: 64, O_EXCL: 128, O_NOCTTY: 256, O_TRUNC: 512, O_APPEND: 1024,
105
+ O_DIRECTORY: 65536, O_NOFOLLOW: 131072, O_SYNC: 1052672, O_DSYNC: 4096, O_NONBLOCK: 2048,
106
+ S_IFMT: 0o170000, S_IFREG, S_IFDIR, S_IFCHR: 0o020000, S_IFBLK: 0o060000, S_IFIFO: 0o010000, S_IFLNK: 0o120000, S_IFSOCK: 0o140000,
107
+ S_IRWXU: 0o700, S_IRUSR: 0o400, S_IWUSR: 0o200, S_IXUSR: 0o100,
108
+ COPYFILE_EXCL: 1, COPYFILE_FICLONE: 2, COPYFILE_FICLONE_FORCE: 4,
109
+ UV_FS_COPYFILE_EXCL: 1,
110
+ };