@seanhogg/builderforce-webcontainers-core 2026.10.1 → 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 (431) 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 +16 -8
  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/html.d.ts +8 -0
  74. package/dist/html.d.ts.map +1 -1
  75. package/dist/html.js +17 -1
  76. package/dist/html.js.map +1 -1
  77. package/dist/index.d.ts +25 -7
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +15 -4
  80. package/dist/index.js.map +1 -1
  81. package/dist/installer/bins.d.ts +24 -0
  82. package/dist/installer/bins.d.ts.map +1 -0
  83. package/dist/installer/bins.js +56 -0
  84. package/dist/installer/bins.js.map +1 -0
  85. package/dist/installer/index.d.ts +14 -0
  86. package/dist/installer/index.d.ts.map +1 -0
  87. package/dist/installer/index.js +9 -0
  88. package/dist/installer/index.js.map +1 -0
  89. package/dist/installer/install.d.ts +46 -0
  90. package/dist/installer/install.d.ts.map +1 -0
  91. package/dist/installer/install.js +245 -0
  92. package/dist/installer/install.js.map +1 -0
  93. package/dist/installer/lockfile.d.ts +49 -0
  94. package/dist/installer/lockfile.d.ts.map +1 -0
  95. package/dist/installer/lockfile.js +110 -0
  96. package/dist/installer/lockfile.js.map +1 -0
  97. package/dist/installer/registry.d.ts +84 -0
  98. package/dist/installer/registry.d.ts.map +1 -0
  99. package/dist/installer/registry.js +130 -0
  100. package/dist/installer/registry.js.map +1 -0
  101. package/dist/installer/semver.d.ts +38 -0
  102. package/dist/installer/semver.d.ts.map +1 -0
  103. package/dist/installer/semver.js +187 -0
  104. package/dist/installer/semver.js.map +1 -0
  105. package/dist/installer/spec.d.ts +30 -0
  106. package/dist/installer/spec.d.ts.map +1 -0
  107. package/dist/installer/spec.js +30 -0
  108. package/dist/installer/spec.js.map +1 -0
  109. package/dist/installer/tar.d.ts +17 -0
  110. package/dist/installer/tar.d.ts.map +1 -0
  111. package/dist/installer/tar.js +150 -0
  112. package/dist/installer/tar.js.map +1 -0
  113. package/dist/installer/tree.d.ts +48 -0
  114. package/dist/installer/tree.d.ts.map +1 -0
  115. package/dist/installer/tree.js +179 -0
  116. package/dist/installer/tree.js.map +1 -0
  117. package/dist/node/assert.d.ts +15 -0
  118. package/dist/node/assert.d.ts.map +1 -0
  119. package/dist/node/assert.js +137 -0
  120. package/dist/node/assert.js.map +1 -0
  121. package/dist/node/buffer.d.ts +84 -0
  122. package/dist/node/buffer.d.ts.map +1 -0
  123. package/dist/node/buffer.js +304 -0
  124. package/dist/node/buffer.js.map +1 -0
  125. package/dist/node/builtins.d.ts +25 -0
  126. package/dist/node/builtins.d.ts.map +1 -0
  127. package/dist/node/builtins.js +101 -0
  128. package/dist/node/builtins.js.map +1 -0
  129. package/dist/node/callable.d.ts +13 -0
  130. package/dist/node/callable.d.ts.map +1 -0
  131. package/dist/node/callable.js +26 -0
  132. package/dist/node/callable.js.map +1 -0
  133. package/dist/node/childProcess.d.ts +13 -0
  134. package/dist/node/childProcess.d.ts.map +1 -0
  135. package/dist/node/childProcess.js +143 -0
  136. package/dist/node/childProcess.js.map +1 -0
  137. package/dist/node/crypto.d.ts +3 -0
  138. package/dist/node/crypto.d.ts.map +1 -0
  139. package/dist/node/crypto.js +180 -0
  140. package/dist/node/crypto.js.map +1 -0
  141. package/dist/node/esm.d.ts +9 -0
  142. package/dist/node/esm.d.ts.map +1 -0
  143. package/dist/node/esm.js +202 -0
  144. package/dist/node/esm.js.map +1 -0
  145. package/dist/node/events.d.ts +40 -0
  146. package/dist/node/events.d.ts.map +1 -0
  147. package/dist/node/events.js +160 -0
  148. package/dist/node/events.js.map +1 -0
  149. package/dist/node/fs/index.d.ts +7 -0
  150. package/dist/node/fs/index.d.ts.map +1 -0
  151. package/dist/node/fs/index.js +270 -0
  152. package/dist/node/fs/index.js.map +1 -0
  153. package/dist/node/fs/stats.d.ts +93 -0
  154. package/dist/node/fs/stats.d.ts.map +1 -0
  155. package/dist/node/fs/stats.js +104 -0
  156. package/dist/node/fs/stats.js.map +1 -0
  157. package/dist/node/fs/sync.d.ts +98 -0
  158. package/dist/node/fs/sync.d.ts.map +1 -0
  159. package/dist/node/fs/sync.js +348 -0
  160. package/dist/node/fs/sync.js.map +1 -0
  161. package/dist/node/hashes.d.ts +15 -0
  162. package/dist/node/hashes.d.ts.map +1 -0
  163. package/dist/node/hashes.js +195 -0
  164. package/dist/node/hashes.js.map +1 -0
  165. package/dist/node/http/client.d.ts +35 -0
  166. package/dist/node/http/client.d.ts.map +1 -0
  167. package/dist/node/http/client.js +161 -0
  168. package/dist/node/http/client.js.map +1 -0
  169. package/dist/node/http/index.d.ts +5 -0
  170. package/dist/node/http/index.d.ts.map +1 -0
  171. package/dist/node/http/index.js +125 -0
  172. package/dist/node/http/index.js.map +1 -0
  173. package/dist/node/http/server.d.ts +135 -0
  174. package/dist/node/http/server.d.ts.map +1 -0
  175. package/dist/node/http/server.js +308 -0
  176. package/dist/node/http/server.js.map +1 -0
  177. package/dist/node/http/status.d.ts +3 -0
  178. package/dist/node/http/status.d.ts.map +1 -0
  179. package/dist/node/http/status.js +13 -0
  180. package/dist/node/http/status.js.map +1 -0
  181. package/dist/node/inspect.d.ts +22 -0
  182. package/dist/node/inspect.d.ts.map +1 -0
  183. package/dist/node/inspect.js +172 -0
  184. package/dist/node/inspect.js.map +1 -0
  185. package/dist/node/loader.d.ts +91 -0
  186. package/dist/node/loader.d.ts.map +1 -0
  187. package/dist/node/loader.js +265 -0
  188. package/dist/node/loader.js.map +1 -0
  189. package/dist/node/loop.d.ts +71 -0
  190. package/dist/node/loop.d.ts.map +1 -0
  191. package/dist/node/loop.js +189 -0
  192. package/dist/node/loop.js.map +1 -0
  193. package/dist/node/misc.d.ts +10 -0
  194. package/dist/node/misc.d.ts.map +1 -0
  195. package/dist/node/misc.js +256 -0
  196. package/dist/node/misc.js.map +1 -0
  197. package/dist/node/path.d.ts +14 -0
  198. package/dist/node/path.d.ts.map +1 -0
  199. package/dist/node/path.js +128 -0
  200. package/dist/node/path.js.map +1 -0
  201. package/dist/node/process.d.ts +31 -0
  202. package/dist/node/process.d.ts.map +1 -0
  203. package/dist/node/process.js +309 -0
  204. package/dist/node/process.js.map +1 -0
  205. package/dist/node/program.d.ts +19 -0
  206. package/dist/node/program.d.ts.map +1 -0
  207. package/dist/node/program.js +165 -0
  208. package/dist/node/program.js.map +1 -0
  209. package/dist/node/readline.d.ts +2 -0
  210. package/dist/node/readline.d.ts.map +1 -0
  211. package/dist/node/readline.js +155 -0
  212. package/dist/node/readline.js.map +1 -0
  213. package/dist/node/resolve.d.ts +45 -0
  214. package/dist/node/resolve.d.ts.map +1 -0
  215. package/dist/node/resolve.js +206 -0
  216. package/dist/node/resolve.js.map +1 -0
  217. package/dist/node/runtime.d.ts +40 -0
  218. package/dist/node/runtime.d.ts.map +1 -0
  219. package/dist/node/runtime.js +149 -0
  220. package/dist/node/runtime.js.map +1 -0
  221. package/dist/node/stream/index.d.ts +52 -0
  222. package/dist/node/stream/index.d.ts.map +1 -0
  223. package/dist/node/stream/index.js +184 -0
  224. package/dist/node/stream/index.js.map +1 -0
  225. package/dist/node/stream/readable.d.ts +83 -0
  226. package/dist/node/stream/readable.d.ts.map +1 -0
  227. package/dist/node/stream/readable.js +325 -0
  228. package/dist/node/stream/readable.js.map +1 -0
  229. package/dist/node/stream/writable.d.ts +80 -0
  230. package/dist/node/stream/writable.d.ts.map +1 -0
  231. package/dist/node/stream/writable.js +224 -0
  232. package/dist/node/stream/writable.js.map +1 -0
  233. package/dist/node/urlqs.d.ts +22 -0
  234. package/dist/node/urlqs.d.ts.map +1 -0
  235. package/dist/node/urlqs.js +165 -0
  236. package/dist/node/urlqs.js.map +1 -0
  237. package/dist/node/util.d.ts +37 -0
  238. package/dist/node/util.d.ts.map +1 -0
  239. package/dist/node/util.js +160 -0
  240. package/dist/node/util.js.map +1 -0
  241. package/dist/node/zlib.d.ts +2 -0
  242. package/dist/node/zlib.d.ts.map +1 -0
  243. package/dist/node/zlib.js +133 -0
  244. package/dist/node/zlib.js.map +1 -0
  245. package/dist/packageCdn.d.ts +12 -0
  246. package/dist/packageCdn.d.ts.map +1 -1
  247. package/dist/packageCdn.js +3 -1
  248. package/dist/packageCdn.js.map +1 -1
  249. package/dist/projectConfig.d.ts +6 -2
  250. package/dist/projectConfig.d.ts.map +1 -1
  251. package/dist/projectConfig.js +32 -8
  252. package/dist/projectConfig.js.map +1 -1
  253. package/dist/shell/builtins.d.ts +23 -0
  254. package/dist/shell/builtins.d.ts.map +1 -0
  255. package/dist/shell/builtins.js +131 -0
  256. package/dist/shell/builtins.js.map +1 -0
  257. package/dist/shell/context.d.ts +41 -0
  258. package/dist/shell/context.d.ts.map +1 -0
  259. package/dist/shell/context.js +65 -0
  260. package/dist/shell/context.js.map +1 -0
  261. package/dist/shell/devHandoff.d.ts +18 -0
  262. package/dist/shell/devHandoff.d.ts.map +1 -0
  263. package/dist/shell/devHandoff.js +36 -0
  264. package/dist/shell/devHandoff.js.map +1 -0
  265. package/dist/shell/exec.d.ts +67 -0
  266. package/dist/shell/exec.d.ts.map +1 -0
  267. package/dist/shell/exec.js +247 -0
  268. package/dist/shell/exec.js.map +1 -0
  269. package/dist/shell/expand.d.ts +28 -0
  270. package/dist/shell/expand.d.ts.map +1 -0
  271. package/dist/shell/expand.js +149 -0
  272. package/dist/shell/expand.js.map +1 -0
  273. package/dist/shell/fileCommands.d.ts +10 -0
  274. package/dist/shell/fileCommands.d.ts.map +1 -0
  275. package/dist/shell/fileCommands.js +208 -0
  276. package/dist/shell/fileCommands.js.map +1 -0
  277. package/dist/shell/lineEditor.d.ts +43 -0
  278. package/dist/shell/lineEditor.d.ts.map +1 -0
  279. package/dist/shell/lineEditor.js +234 -0
  280. package/dist/shell/lineEditor.js.map +1 -0
  281. package/dist/shell/npm.d.ts +6 -0
  282. package/dist/shell/npm.d.ts.map +1 -0
  283. package/dist/shell/npm.js +234 -0
  284. package/dist/shell/npm.js.map +1 -0
  285. package/dist/shell/parse.d.ts +73 -0
  286. package/dist/shell/parse.d.ts.map +1 -0
  287. package/dist/shell/parse.js +300 -0
  288. package/dist/shell/parse.js.map +1 -0
  289. package/dist/shell/program.d.ts +12 -0
  290. package/dist/shell/program.d.ts.map +1 -0
  291. package/dist/shell/program.js +219 -0
  292. package/dist/shell/program.js.map +1 -0
  293. package/dist/shell/textCommands.d.ts +15 -0
  294. package/dist/shell/textCommands.d.ts.map +1 -0
  295. package/dist/shell/textCommands.js +185 -0
  296. package/dist/shell/textCommands.js.map +1 -0
  297. package/dist/styleModules.d.ts +6 -0
  298. package/dist/styleModules.d.ts.map +1 -1
  299. package/dist/styleModules.js +14 -4
  300. package/dist/styleModules.js.map +1 -1
  301. package/dist/svelteCompiler.d.ts +28 -0
  302. package/dist/svelteCompiler.d.ts.map +1 -0
  303. package/dist/svelteCompiler.js +13 -0
  304. package/dist/svelteCompiler.js.map +1 -0
  305. package/dist/system/commands.d.ts +26 -0
  306. package/dist/system/commands.d.ts.map +1 -0
  307. package/dist/system/commands.js +53 -0
  308. package/dist/system/commands.js.map +1 -0
  309. package/dist/system/index.d.ts +23 -0
  310. package/dist/system/index.d.ts.map +1 -0
  311. package/dist/system/index.js +16 -0
  312. package/dist/system/index.js.map +1 -0
  313. package/dist/system/kernel.d.ts +54 -0
  314. package/dist/system/kernel.d.ts.map +1 -0
  315. package/dist/system/kernel.js +81 -0
  316. package/dist/system/kernel.js.map +1 -0
  317. package/dist/system/ports.d.ts +32 -0
  318. package/dist/system/ports.d.ts.map +1 -0
  319. package/dist/system/ports.js +57 -0
  320. package/dist/system/ports.js.map +1 -0
  321. package/dist/system/process.d.ts +32 -0
  322. package/dist/system/process.d.ts.map +1 -0
  323. package/dist/system/process.js +130 -0
  324. package/dist/system/process.js.map +1 -0
  325. package/dist/system/programs.d.ts +10 -0
  326. package/dist/system/programs.d.ts.map +1 -0
  327. package/dist/system/programs.js +22 -0
  328. package/dist/system/programs.js.map +1 -0
  329. package/dist/system/terminal.d.ts +45 -0
  330. package/dist/system/terminal.d.ts.map +1 -0
  331. package/dist/system/terminal.js +127 -0
  332. package/dist/system/terminal.js.map +1 -0
  333. package/dist/system/types.d.ts +100 -0
  334. package/dist/system/types.d.ts.map +1 -0
  335. package/dist/system/types.js +2 -0
  336. package/dist/system/types.js.map +1 -0
  337. package/dist/vfs.d.ts +28 -4
  338. package/dist/vfs.d.ts.map +1 -1
  339. package/dist/vfs.js +95 -32
  340. package/dist/vfs.js.map +1 -1
  341. package/dist/vueCompiler.d.ts +75 -0
  342. package/dist/vueCompiler.d.ts.map +1 -0
  343. package/dist/vueCompiler.js +67 -0
  344. package/dist/vueCompiler.js.map +1 -0
  345. package/package.json +18 -2
  346. package/src/build.ts +105 -0
  347. package/src/buildHost.ts +154 -0
  348. package/src/buildHtml.ts +101 -0
  349. package/src/bundler.ts +190 -0
  350. package/src/check/acquire.ts +212 -0
  351. package/src/check/compilerHost.ts +138 -0
  352. package/src/check/diagnostics.ts +48 -0
  353. package/src/check/index.ts +28 -0
  354. package/src/check/projects.ts +149 -0
  355. package/src/check/shims.ts +88 -0
  356. package/src/check/typeStore.ts +103 -0
  357. package/src/check/typecheck.ts +134 -0
  358. package/src/compileComponent.ts +21 -0
  359. package/src/compileScript.ts +42 -13
  360. package/src/components.ts +59 -0
  361. package/src/detectProject.ts +18 -6
  362. package/src/devServer.ts +19 -10
  363. package/src/hash.ts +22 -0
  364. package/src/html.ts +19 -1
  365. package/src/index.ts +36 -7
  366. package/src/installer/bins.ts +64 -0
  367. package/src/installer/index.ts +13 -0
  368. package/src/installer/install.ts +275 -0
  369. package/src/installer/lockfile.ts +146 -0
  370. package/src/installer/registry.ts +175 -0
  371. package/src/installer/semver.ts +190 -0
  372. package/src/installer/spec.ts +53 -0
  373. package/src/installer/tar.ts +155 -0
  374. package/src/installer/tree.ts +236 -0
  375. package/src/node/assert.ts +127 -0
  376. package/src/node/buffer.ts +304 -0
  377. package/src/node/builtins.ts +123 -0
  378. package/src/node/callable.ts +25 -0
  379. package/src/node/childProcess.ts +164 -0
  380. package/src/node/crypto.ts +187 -0
  381. package/src/node/esm.ts +196 -0
  382. package/src/node/events.ts +176 -0
  383. package/src/node/fs/index.ts +277 -0
  384. package/src/node/fs/stats.ts +110 -0
  385. package/src/node/fs/sync.ts +335 -0
  386. package/src/node/hashes.ts +171 -0
  387. package/src/node/http/client.ts +173 -0
  388. package/src/node/http/index.ts +122 -0
  389. package/src/node/http/server.ts +308 -0
  390. package/src/node/http/status.ts +13 -0
  391. package/src/node/inspect.ts +166 -0
  392. package/src/node/loader.ts +293 -0
  393. package/src/node/loop.ts +193 -0
  394. package/src/node/misc.ts +250 -0
  395. package/src/node/path.ts +135 -0
  396. package/src/node/process.ts +324 -0
  397. package/src/node/program.ts +170 -0
  398. package/src/node/readline.ts +157 -0
  399. package/src/node/resolve.ts +216 -0
  400. package/src/node/runtime.ts +184 -0
  401. package/src/node/stream/index.ts +196 -0
  402. package/src/node/stream/readable.ts +345 -0
  403. package/src/node/stream/writable.ts +244 -0
  404. package/src/node/urlqs.ts +162 -0
  405. package/src/node/util.ts +145 -0
  406. package/src/node/zlib.ts +145 -0
  407. package/src/packageCdn.ts +11 -1
  408. package/src/projectConfig.ts +34 -7
  409. package/src/shell/builtins.ts +141 -0
  410. package/src/shell/context.ts +89 -0
  411. package/src/shell/devHandoff.ts +49 -0
  412. package/src/shell/exec.ts +268 -0
  413. package/src/shell/expand.ts +145 -0
  414. package/src/shell/fileCommands.ts +206 -0
  415. package/src/shell/lineEditor.ts +233 -0
  416. package/src/shell/npm.ts +229 -0
  417. package/src/shell/parse.ts +295 -0
  418. package/src/shell/program.ts +223 -0
  419. package/src/shell/textCommands.ts +177 -0
  420. package/src/styleModules.ts +15 -4
  421. package/src/svelteCompiler.ts +31 -0
  422. package/src/system/commands.ts +72 -0
  423. package/src/system/index.ts +22 -0
  424. package/src/system/kernel.ts +106 -0
  425. package/src/system/ports.ts +73 -0
  426. package/src/system/process.ts +158 -0
  427. package/src/system/programs.ts +31 -0
  428. package/src/system/terminal.ts +135 -0
  429. package/src/system/types.ts +103 -0
  430. package/src/vfs.ts +92 -28
  431. package/src/vueCompiler.ts +121 -0
package/dist/vfs.d.ts CHANGED
@@ -12,15 +12,21 @@ export interface FileSystemTree {
12
12
  /** A flat `{ 'src/main.tsx': '...' }` map, the other shape callers commonly hold. */
13
13
  export type FlatFiles = Record<string, FileContent>;
14
14
  export interface FsChange {
15
- type: 'write' | 'remove';
15
+ /** `mkdir` is an explicitly created (possibly empty) directory. */
16
+ type: 'write' | 'remove' | 'mkdir';
16
17
  path: string;
17
18
  /** For a write: the file did not exist before. A new file can change how imports resolve. */
18
19
  created?: boolean;
19
20
  }
20
21
  /**
21
- * An in-memory file system. Files only — a directory exists while it contains a
22
- * file, which keeps the store a single map and makes "is this a directory?" a
23
- * prefix check rather than a second structure to keep consistent.
22
+ * An in-memory file system. Files are the store; a directory exists while it
23
+ * contains something, or because it was created explicitly with `mkdir` (shells
24
+ * and Node programs create empty directories, a preview never needs to).
25
+ *
26
+ * A directory index (dir → child names) is maintained alongside the files, so
27
+ * `isDirectory`/`readdir` stay O(1)/O(children) even with a populated
28
+ * `node_modules` of tens of thousands of files — module resolution probes those
29
+ * constantly.
24
30
  *
25
31
  * Every write bumps a per-file version, so a transform cache can key on
26
32
  * (path, version) instead of hashing contents.
@@ -28,6 +34,11 @@ export interface FsChange {
28
34
  export declare class VirtualFileSystem {
29
35
  private readonly files;
30
36
  private readonly versions;
37
+ private readonly mtimes;
38
+ /** dir → names of its direct children (files and directories). */
39
+ private readonly children;
40
+ /** Directories created with `mkdir`: they outlive their last file. */
41
+ private readonly explicit;
31
42
  private readonly listeners;
32
43
  private clock;
33
44
  writeFile(path: string, contents: FileContent): void;
@@ -36,14 +47,20 @@ export declare class VirtualFileSystem {
36
47
  isFile(path: string): boolean;
37
48
  isDirectory(path: string): boolean;
38
49
  exists(path: string): boolean;
50
+ /** Create a directory (and its parents). A no-op when it already exists. */
51
+ mkdir(path: string): void;
39
52
  /** Direct children of a directory (files and sub-directories), sorted. */
40
53
  readdir(path: string): string[];
41
54
  /** Every file path, sorted. */
42
55
  list(): string[];
56
+ /** Directories created explicitly with `mkdir` — what `list()` cannot reproduce. */
57
+ explicitDirectories(): string[];
43
58
  /** Remove a file, or a directory and everything under it. */
44
59
  rm(path: string): void;
45
60
  /** The file's version (bumped on every write), or undefined when absent. */
46
61
  version(path: string): number | undefined;
62
+ /** When the file was last written (epoch ms), or undefined when absent. */
63
+ mtime(path: string): number | undefined;
47
64
  /**
48
65
  * Write many files at once. Takes either the nested WebContainer tree or a flat
49
66
  * path→contents map — or a mix, since each entry is judged on its own.
@@ -52,6 +69,13 @@ export declare class VirtualFileSystem {
52
69
  /** Flat snapshot keyed without the leading slash (`src/main.tsx`). */
53
70
  toFlat(): FlatFiles;
54
71
  watch(listener: (change: FsChange) => void): () => void;
72
+ private removeFile;
73
+ /** Register `key` under its parent, creating implicit ancestors as needed. */
74
+ private link;
75
+ private ensureDir;
76
+ /** Detach `key` from its parent, pruning implicit ancestors left empty. */
77
+ private unlink;
78
+ private unlinkDir;
55
79
  private emit;
56
80
  }
57
81
  //# sourceMappingURL=vfs.d.ts.map
package/dist/vfs.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"vfs.d.ts","sourceRoot":"","sources":["../src/vfs.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;AAE9C,oFAAoF;AACpF,MAAM,WAAW,cAAc;IAC7B,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE;YAAE,QAAQ,EAAE,WAAW,CAAA;SAAE,CAAA;KAAE,GAAG;QAAE,SAAS,EAAE,cAAc,CAAA;KAAE,CAAC;CACrF;AAED,qFAAqF;AACrF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEpD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,6FAA6F;IAC7F,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAID;;;;;;;GAOG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkC;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IACnE,OAAO,CAAC,KAAK,CAAK;IAElB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;IAQpD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI/C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAM1C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI7B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAQlC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI7B,0EAA0E;IAC1E,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAa/B,+BAA+B;IAC/B,IAAI,IAAI,MAAM,EAAE;IAIhB,6DAA6D;IAC7D,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAYtB,4EAA4E;IAC5E,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIzC;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,EAAE,EAAE,SAAM,GAAG,IAAI;IASxD,sEAAsE;IACtE,MAAM,IAAI,SAAS;IAMnB,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;IAKvD,OAAO,CAAC,IAAI;CAGb"}
1
+ {"version":3,"file":"vfs.d.ts","sourceRoot":"","sources":["../src/vfs.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;AAE9C,oFAAoF;AACpF,MAAM,WAAW,cAAc;IAC7B,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE;YAAE,QAAQ,EAAE,WAAW,CAAA;SAAE,CAAA;KAAE,GAAG;QAAE,SAAS,EAAE,cAAc,CAAA;KAAE,CAAC;CACrF;AAED,qFAAqF;AACrF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEpD,MAAM,WAAW,QAAQ;IACvB,mEAAmE;IACnE,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,6FAA6F;IAC7F,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAID;;;;;;;;;;;;GAYG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkC;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,kEAAkE;IAClE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoD;IAC7E,sEAAsE;IACtE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IACnE,OAAO,CAAC,KAAK,CAAK;IAElB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;IAWpD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI/C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAM1C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI7B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIlC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI7B,4EAA4E;IAC5E,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAWzB,0EAA0E;IAC1E,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAI/B,+BAA+B;IAC/B,IAAI,IAAI,MAAM,EAAE;IAIhB,oFAAoF;IACpF,mBAAmB,IAAI,MAAM,EAAE;IAI/B,6DAA6D;IAC7D,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IActB,4EAA4E;IAC5E,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIzC,2EAA2E;IAC3E,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIvC;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,EAAE,EAAE,SAAM,GAAG,IAAI;IAYxD,sEAAsE;IACtE,MAAM,IAAI,SAAS;IAMnB,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;IAKvD,OAAO,CAAC,UAAU;IAQlB,8EAA8E;IAC9E,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,SAAS;IAOjB,2EAA2E;IAC3E,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,IAAI;CAGb"}
package/dist/vfs.js CHANGED
@@ -1,9 +1,14 @@
1
- import { normalizePath, join } from './paths.js';
1
+ import { normalizePath, join, dirname } from './paths.js';
2
2
  const decoder = new TextDecoder();
3
3
  /**
4
- * An in-memory file system. Files only — a directory exists while it contains a
5
- * file, which keeps the store a single map and makes "is this a directory?" a
6
- * prefix check rather than a second structure to keep consistent.
4
+ * An in-memory file system. Files are the store; a directory exists while it
5
+ * contains something, or because it was created explicitly with `mkdir` (shells
6
+ * and Node programs create empty directories, a preview never needs to).
7
+ *
8
+ * A directory index (dir → child names) is maintained alongside the files, so
9
+ * `isDirectory`/`readdir` stay O(1)/O(children) even with a populated
10
+ * `node_modules` of tens of thousands of files — module resolution probes those
11
+ * constantly.
7
12
  *
8
13
  * Every write bumps a per-file version, so a transform cache can key on
9
14
  * (path, version) instead of hashing contents.
@@ -11,13 +16,23 @@ const decoder = new TextDecoder();
11
16
  export class VirtualFileSystem {
12
17
  files = new Map();
13
18
  versions = new Map();
19
+ mtimes = new Map();
20
+ /** dir → names of its direct children (files and directories). */
21
+ children = new Map([['/', new Set()]]);
22
+ /** Directories created with `mkdir`: they outlive their last file. */
23
+ explicit = new Set();
14
24
  listeners = new Set();
15
25
  clock = 0;
16
26
  writeFile(path, contents) {
17
27
  const key = normalizePath(path);
28
+ if (key === '/' || this.children.has(key))
29
+ throw new Error(`EISDIR: illegal operation on a directory, open '${key}'`);
18
30
  const created = !this.files.has(key);
31
+ if (created)
32
+ this.link(key);
19
33
  this.files.set(key, contents);
20
34
  this.versions.set(key, ++this.clock);
35
+ this.mtimes.set(key, Date.now());
21
36
  this.emit({ type: 'write', path: key, created });
22
37
  }
23
38
  readFile(path) {
@@ -33,53 +48,64 @@ export class VirtualFileSystem {
33
48
  return this.files.has(normalizePath(path));
34
49
  }
35
50
  isDirectory(path) {
36
- const key = normalizePath(path);
37
- if (key === '/')
38
- return true;
39
- const prefix = key + '/';
40
- for (const file of this.files.keys())
41
- if (file.startsWith(prefix))
42
- return true;
43
- return false;
51
+ return this.children.has(normalizePath(path));
44
52
  }
45
53
  exists(path) {
46
54
  return this.isFile(path) || this.isDirectory(path);
47
55
  }
56
+ /** Create a directory (and its parents). A no-op when it already exists. */
57
+ mkdir(path) {
58
+ const key = normalizePath(path);
59
+ if (this.files.has(key))
60
+ throw new Error(`EEXIST: file already exists, mkdir '${key}'`);
61
+ if (key === '/')
62
+ return;
63
+ const existed = this.children.has(key);
64
+ this.explicit.add(key);
65
+ if (existed)
66
+ return;
67
+ this.ensureDir(key);
68
+ this.emit({ type: 'mkdir', path: key });
69
+ }
48
70
  /** Direct children of a directory (files and sub-directories), sorted. */
49
71
  readdir(path) {
50
- const key = normalizePath(path);
51
- const prefix = key === '/' ? '/' : key + '/';
52
- const names = new Set();
53
- for (const file of this.files.keys()) {
54
- if (!file.startsWith(prefix))
55
- continue;
56
- const rest = file.slice(prefix.length);
57
- const name = rest.split('/')[0];
58
- if (name)
59
- names.add(name);
60
- }
61
- return [...names].sort();
72
+ return [...(this.children.get(normalizePath(path)) ?? [])].sort();
62
73
  }
63
74
  /** Every file path, sorted. */
64
75
  list() {
65
76
  return [...this.files.keys()].sort();
66
77
  }
78
+ /** Directories created explicitly with `mkdir` — what `list()` cannot reproduce. */
79
+ explicitDirectories() {
80
+ return [...this.explicit].sort();
81
+ }
67
82
  /** Remove a file, or a directory and everything under it. */
68
83
  rm(path) {
69
84
  const key = normalizePath(path);
70
- const prefix = key === '/' ? '/' : key + '/';
71
- for (const file of [...this.files.keys()]) {
72
- if (file === key || file.startsWith(prefix)) {
73
- this.files.delete(file);
74
- this.versions.delete(file);
75
- this.emit({ type: 'remove', path: file });
76
- }
85
+ if (this.files.has(key)) {
86
+ this.removeFile(key);
87
+ return;
77
88
  }
89
+ if (!this.children.has(key))
90
+ return;
91
+ for (const name of [...(this.children.get(key) ?? [])])
92
+ this.rm(key === '/' ? '/' + name : `${key}/${name}`);
93
+ if (key === '/')
94
+ return;
95
+ const wasExplicit = this.explicit.delete(key);
96
+ if (this.children.has(key))
97
+ this.unlinkDir(key);
98
+ if (wasExplicit)
99
+ this.emit({ type: 'remove', path: key });
78
100
  }
79
101
  /** The file's version (bumped on every write), or undefined when absent. */
80
102
  version(path) {
81
103
  return this.versions.get(normalizePath(path));
82
104
  }
105
+ /** When the file was last written (epoch ms), or undefined when absent. */
106
+ mtime(path) {
107
+ return this.mtimes.get(normalizePath(path));
108
+ }
83
109
  /**
84
110
  * Write many files at once. Takes either the nested WebContainer tree or a flat
85
111
  * path→contents map — or a mix, since each entry is judged on its own.
@@ -91,8 +117,10 @@ export class VirtualFileSystem {
91
117
  this.writeFile(path, entry);
92
118
  else if ('file' in entry)
93
119
  this.writeFile(path, entry.file.contents);
94
- else
120
+ else {
121
+ this.mkdir(path);
95
122
  this.mount(entry.directory, path);
123
+ }
96
124
  }
97
125
  }
98
126
  /** Flat snapshot keyed without the leading slash (`src/main.tsx`). */
@@ -106,6 +134,41 @@ export class VirtualFileSystem {
106
134
  this.listeners.add(listener);
107
135
  return () => this.listeners.delete(listener);
108
136
  }
137
+ removeFile(key) {
138
+ this.files.delete(key);
139
+ this.versions.delete(key);
140
+ this.mtimes.delete(key);
141
+ this.unlink(key);
142
+ this.emit({ type: 'remove', path: key });
143
+ }
144
+ /** Register `key` under its parent, creating implicit ancestors as needed. */
145
+ link(key) {
146
+ const parent = dirname(key);
147
+ this.ensureDir(parent);
148
+ this.children.get(parent).add(key.slice(key.lastIndexOf('/') + 1));
149
+ }
150
+ ensureDir(dir) {
151
+ if (this.children.has(dir))
152
+ return;
153
+ if (this.files.has(dir))
154
+ throw new Error(`ENOTDIR: not a directory, '${dir}'`);
155
+ this.children.set(dir, new Set());
156
+ this.link(dir);
157
+ }
158
+ /** Detach `key` from its parent, pruning implicit ancestors left empty. */
159
+ unlink(key) {
160
+ const parent = dirname(key);
161
+ const siblings = this.children.get(parent);
162
+ if (!siblings)
163
+ return;
164
+ siblings.delete(key.slice(key.lastIndexOf('/') + 1));
165
+ if (siblings.size === 0 && parent !== '/' && !this.explicit.has(parent))
166
+ this.unlinkDir(parent);
167
+ }
168
+ unlinkDir(dir) {
169
+ this.children.delete(dir);
170
+ this.unlink(dir);
171
+ }
109
172
  emit(change) {
110
173
  for (const listener of this.listeners)
111
174
  listener(change);
package/dist/vfs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"vfs.js","sourceRoot":"","sources":["../src/vfs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vfs.js","sourceRoot":"","sources":["../src/vfs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import type { ComponentCompiler } from './components.js';
2
+ /**
3
+ * Vue single-file components through `@vue/compiler-sfc` — the same steps
4
+ * `@vitejs/plugin-vue` takes, minus HMR: script (with `<script setup>` and its
5
+ * template inlined), a separate render function for options-API components, and
6
+ * each `<style>` compiled with the component's scope id.
7
+ */
8
+ interface VueBlock {
9
+ content: string;
10
+ lang?: string;
11
+ }
12
+ interface VueStyleBlock extends VueBlock {
13
+ scoped?: boolean;
14
+ }
15
+ export interface VueDescriptor {
16
+ script: VueBlock | null;
17
+ scriptSetup: VueBlock | null;
18
+ template: VueBlock | null;
19
+ styles: VueStyleBlock[];
20
+ }
21
+ type Problem = string | {
22
+ message: string;
23
+ };
24
+ /**
25
+ * The script's binding analysis, passed from compileScript to compileTemplate
26
+ * untouched. Opaque here (`any`) so the real compiler's precise type fits.
27
+ */
28
+ type BindingMetadata = any;
29
+ /** The subset of `@vue/compiler-sfc` used (its browser build has the same API). */
30
+ export interface VueCompilerSfcLike {
31
+ parse(source: string, options: {
32
+ filename: string;
33
+ sourceMap: boolean;
34
+ }): {
35
+ descriptor: VueDescriptor;
36
+ errors: Problem[];
37
+ };
38
+ compileScript(descriptor: VueDescriptor, options: {
39
+ id: string;
40
+ inlineTemplate: boolean;
41
+ genDefaultAs: string;
42
+ isProd: boolean;
43
+ sourceMap: boolean;
44
+ }): {
45
+ content: string;
46
+ bindings?: BindingMetadata;
47
+ };
48
+ compileTemplate(options: {
49
+ source: string;
50
+ filename: string;
51
+ id: string;
52
+ scoped: boolean;
53
+ isProd: boolean;
54
+ compilerOptions: {
55
+ bindingMetadata?: BindingMetadata;
56
+ isTS?: boolean;
57
+ };
58
+ }): {
59
+ code: string;
60
+ errors: Problem[];
61
+ };
62
+ compileStyle(options: {
63
+ source: string;
64
+ filename: string;
65
+ id: string;
66
+ scoped: boolean;
67
+ isProd: boolean;
68
+ }): {
69
+ code: string;
70
+ errors: Problem[];
71
+ };
72
+ }
73
+ export declare function createVueCompiler(sfc: VueCompilerSfcLike): ComponentCompiler;
74
+ export {};
75
+ //# sourceMappingURL=vueCompiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vueCompiler.d.ts","sourceRoot":"","sources":["../src/vueCompiler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAIzD;;;;;GAKG;AAEH,UAAU,QAAQ;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,aAAc,SAAQ,QAAQ;IACtC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,KAAK,OAAO,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAC5C;;;GAGG;AACH,KAAK,eAAe,GAAG,GAAG,CAAC;AAE3B,mFAAmF;AACnF,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG;QAAE,UAAU,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;IAC3H,aAAa,CACX,UAAU,EAAE,aAAa,EACzB,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,GAC1G;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,eAAe,CAAA;KAAE,CAAC;IACnD,eAAe,CAAC,OAAO,EAAE;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;QAChB,eAAe,EAAE;YAAE,eAAe,CAAC,EAAE,eAAe,CAAC;YAAC,IAAI,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC;KACxE,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;IACxC,YAAY,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,GAAG;QACzG,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,EAAE,CAAC;KACnB,CAAC;CACH;AASD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,kBAAkB,GAAG,iBAAiB,CA0D5E"}
@@ -0,0 +1,67 @@
1
+ import { contentHash } from './hash.js';
2
+ const SCRIPT_LOADERS = { js: 'js', jsx: 'jsx', ts: 'ts', tsx: 'tsx' };
3
+ function fail(path, problems) {
4
+ const first = problems[0];
5
+ throw new Error(`${path}: ${typeof first === 'string' ? first : first?.message ?? 'Vue compile error'}`);
6
+ }
7
+ export function createVueCompiler(sfc) {
8
+ return {
9
+ compile(source, { path, dev }) {
10
+ const { descriptor, errors } = sfc.parse(source, { filename: path, sourceMap: false });
11
+ if (errors.length)
12
+ fail(path, errors);
13
+ for (const style of descriptor.styles) {
14
+ if (style.lang && style.lang !== 'css') {
15
+ throw new Error(`${path}: <style lang="${style.lang}"> needs a CSS preprocessor this runtime does not have yet.`);
16
+ }
17
+ }
18
+ // Stable per file, so the scope attribute does not change between reloads.
19
+ const id = contentHash(path);
20
+ const scoped = descriptor.styles.some((style) => style.scoped);
21
+ const lang = descriptor.scriptSetup?.lang ?? descriptor.script?.lang ?? 'js';
22
+ const loader = SCRIPT_LOADERS[lang];
23
+ if (!loader)
24
+ throw new Error(`${path}: <script lang="${lang}"> is not supported.`);
25
+ const parts = [];
26
+ let bindings;
27
+ if (descriptor.script || descriptor.scriptSetup) {
28
+ const script = sfc.compileScript(descriptor, { id, inlineTemplate: true, genDefaultAs: '_sfc_main', isProd: !dev, sourceMap: false });
29
+ parts.push(script.content);
30
+ bindings = script.bindings;
31
+ }
32
+ else {
33
+ parts.push('const _sfc_main = {};');
34
+ }
35
+ // `<script setup>` inlines its template; anything else needs a render function.
36
+ if (descriptor.template && !descriptor.scriptSetup) {
37
+ const template = sfc.compileTemplate({
38
+ source: descriptor.template.content,
39
+ filename: path,
40
+ id,
41
+ scoped,
42
+ isProd: !dev,
43
+ compilerOptions: { bindingMetadata: bindings, isTS: loader === 'ts' || loader === 'tsx' },
44
+ });
45
+ if (template.errors.length)
46
+ fail(path, template.errors);
47
+ parts.push(template.code.replace(/\bexport (function|const) render\b/, '$1 _sfc_render'));
48
+ parts.push('_sfc_main.render = _sfc_render;');
49
+ }
50
+ if (scoped)
51
+ parts.push(`_sfc_main.__scopeId = ${JSON.stringify(`data-v-${id}`)};`);
52
+ if (dev)
53
+ parts.push(`_sfc_main.__file = ${JSON.stringify(path)};`);
54
+ parts.push('export default _sfc_main;');
55
+ const css = descriptor.styles
56
+ .map((style) => {
57
+ const out = sfc.compileStyle({ source: style.content, filename: path, id: `data-v-${id}`, scoped: !!style.scoped, isProd: !dev });
58
+ if (out.errors.length)
59
+ fail(path, out.errors);
60
+ return out.code;
61
+ })
62
+ .join('\n');
63
+ return { code: parts.join('\n'), loader, css };
64
+ },
65
+ };
66
+ }
67
+ //# sourceMappingURL=vueCompiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vueCompiler.js","sourceRoot":"","sources":["../src/vueCompiler.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seanhogg/builderforce-webcontainers-core",
3
- "version": "2026.10.1",
3
+ "version": "2026.10.3",
4
4
  "description": "BuilderForce WebContainers — core. A runtime-agnostic in-browser dev server: virtual file system, module resolution, import rewriting to a package CDN, CSS/JSON/asset modules and project detection. No COOP/COEP required.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -9,6 +9,10 @@
9
9
  ".": {
10
10
  "types": "./dist/index.d.ts",
11
11
  "import": "./dist/index.js"
12
+ },
13
+ "./check": {
14
+ "types": "./dist/check/index.d.ts",
15
+ "import": "./dist/check/index.js"
12
16
  }
13
17
  },
14
18
  "type": "module",
@@ -52,10 +56,22 @@
52
56
  "registry": "https://registry.npmjs.org"
53
57
  },
54
58
  "dependencies": {
55
- "es-module-lexer": "^1.5.4"
59
+ "es-module-lexer": "^1.5.4",
60
+ "fflate": "^0.8.2"
61
+ },
62
+ "peerDependencies": {
63
+ "typescript": ">=5.0.0"
64
+ },
65
+ "peerDependenciesMeta": {
66
+ "typescript": {
67
+ "optional": true
68
+ }
56
69
  },
57
70
  "devDependencies": {
71
+ "@types/node": "^20",
72
+ "@vue/compiler-sfc": "^3.5.0",
58
73
  "esbuild": "^0.24.0",
74
+ "svelte": "^5.0.0",
59
75
  "typescript": "^5.5.0",
60
76
  "vitest": "^2.1.0"
61
77
  },
package/src/build.ts ADDED
@@ -0,0 +1,105 @@
1
+ import { VirtualFileSystem, type FileSystemTree, type FlatFiles } from './vfs.js';
2
+ import type { Bundler, BundleOutput } from './bundler.js';
3
+ import type { PackageCdnFactory } from './packageCdn.js';
4
+ import { esmShCdnFactory } from './packageCdn.js';
5
+ import { noComponentCompilers, type ComponentCompilers } from './components.js';
6
+ import { detectProject, type ProjectProfile } from './detectProject.js';
7
+ import { readProjectConfig } from './projectConfig.js';
8
+ import { buildDefine } from './compileScript.js';
9
+ import { createBuildHost } from './buildHost.js';
10
+ import { findHtmlEntries, rewriteBuiltHtml } from './buildHtml.js';
11
+
12
+ /**
13
+ * `npm run build`, in the browser: the project in, a deployable static site out.
14
+ *
15
+ * The output needs no server and no node_modules — packages load from the CDN at
16
+ * the same pinned, deduped URLs the dev server uses (production builds) — so it
17
+ * can be uploaded as-is to any static host. Every file under `assets/` has a
18
+ * content hash in its name and can be cached forever.
19
+ */
20
+ export interface BuildOptions {
21
+ /** The project: a file system, or files as `mount()` takes them. */
22
+ files: VirtualFileSystem | FlatFiles | FileSystemTree;
23
+ bundler: Bundler;
24
+ /** Package CDN factory (called with `dev: false`). Default: esm.sh. */
25
+ cdn?: PackageCdnFactory;
26
+ /** `.vue` / `.svelte` compilers, needed when the project has components. */
27
+ components?: ComponentCompilers;
28
+ /**
29
+ * Where the site will be served from. `./` (default) works from any directory;
30
+ * an absolute base (`/app/`, `https://cdn.example.com/site/`) is used verbatim.
31
+ */
32
+ base?: string;
33
+ /** Default true. */
34
+ minify?: boolean;
35
+ }
36
+
37
+ export interface BuiltFile {
38
+ /** Relative to the site root (`index.html`, `assets/main-1a2b3c4d.js`). */
39
+ path: string;
40
+ data: Uint8Array;
41
+ }
42
+
43
+ export interface BuildResult {
44
+ files: BuiltFile[];
45
+ profile: ProjectProfile;
46
+ }
47
+
48
+ const encoder = new TextEncoder();
49
+
50
+ function toFileSystem(files: BuildOptions['files']): VirtualFileSystem {
51
+ if (files instanceof VirtualFileSystem) return files;
52
+ const fs = new VirtualFileSystem();
53
+ fs.mount(files);
54
+ return fs;
55
+ }
56
+
57
+ /** `''`, `.` and `./` all mean relative; anything else gets its trailing slash. */
58
+ export function normalizeBase(base: string | undefined): string {
59
+ if (!base || base === '.' || base === './') return './';
60
+ return base.endsWith('/') ? base : `${base}/`;
61
+ }
62
+
63
+ function toBytes(contents: string | Uint8Array): Uint8Array {
64
+ return typeof contents === 'string' ? encoder.encode(contents) : contents;
65
+ }
66
+
67
+ export async function buildProject(options: BuildOptions): Promise<BuildResult> {
68
+ const fs = toFileSystem(options.files);
69
+ const base = normalizeBase(options.base);
70
+ const profile = detectProject(fs);
71
+ if (!profile.supported || !profile.htmlPath) throw new Error(profile.reason ?? 'This project cannot be built here.');
72
+
73
+ const config = readProjectConfig(fs, 'production');
74
+ const cdn = (options.cdn ?? esmShCdnFactory)(config.dependencies, { dev: false });
75
+ const html = fs.readText(profile.htmlPath) ?? '';
76
+ const entries = findHtmlEntries(fs, html, profile.htmlPath);
77
+ // CRA pages carry no module script; the dev server injects the entry, so does the build.
78
+ const inject = profile.entry && !entries.some((entry) => entry.tag === 'script') ? profile.entry : undefined;
79
+ const entryPoints = [...new Set([...entries.map((entry) => entry.path), ...(inject ? [inject] : [])])];
80
+
81
+ const host = createBuildHost({ fs, config, cdn, components: options.components ?? noComponentCompilers, publicDir: profile.publicDir, base });
82
+ const bundled: BundleOutput = entryPoints.length
83
+ ? await options.bundler.bundle({
84
+ entryPoints,
85
+ host,
86
+ define: buildDefine(config, base, 'production'),
87
+ jsx: config.jsx,
88
+ minify: options.minify ?? true,
89
+ })
90
+ : { files: [], entries: {} };
91
+
92
+ const out = new Map<string, Uint8Array>();
93
+ // public/ first, so a generated file of the same name wins.
94
+ const publicPrefix = `${profile.publicDir}/`;
95
+ for (const path of fs.list()) {
96
+ if (path.startsWith(publicPrefix) && path !== profile.htmlPath) out.set(path.slice(publicPrefix.length), toBytes(fs.readFile(path) ?? ''));
97
+ }
98
+ for (const [path, data] of host.assets) out.set(path, data);
99
+ for (const file of bundled.files) out.set(file.path, file.contents);
100
+ const page = rewriteBuiltHtml(html, { base, entries, outputs: bundled.entries, inject });
101
+ out.set('index.html', encoder.encode(page));
102
+
103
+ const files = [...out].map(([path, data]) => ({ path, data })).sort((a, b) => a.path.localeCompare(b.path));
104
+ return { files, profile };
105
+ }