fundus 0.0.2 → 0.0.4

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 (303) hide show
  1. package/README.md +73 -0
  2. package/build/client/_app/immutable/assets/0.DLhIsYA_.css.br +0 -0
  3. package/build/client/_app/immutable/assets/0.DLhIsYA_.css.gz +0 -0
  4. package/build/client/_app/immutable/assets/2.ohi-TClG.css +1 -0
  5. package/build/client/_app/immutable/assets/2.ohi-TClG.css.br +0 -0
  6. package/build/client/_app/immutable/assets/2.ohi-TClG.css.gz +0 -0
  7. package/build/client/_app/immutable/assets/3.JwgtcTEd.css +1 -0
  8. package/build/client/_app/immutable/assets/3.JwgtcTEd.css.br +0 -0
  9. package/build/client/_app/immutable/assets/3.JwgtcTEd.css.gz +0 -0
  10. package/build/client/_app/immutable/assets/4.p004hmEN.css +1 -0
  11. package/build/client/_app/immutable/assets/4.p004hmEN.css.br +0 -0
  12. package/build/client/_app/immutable/assets/4.p004hmEN.css.gz +0 -0
  13. package/build/client/_app/immutable/assets/ConfirmDialog.BdKlitwi.css +1 -0
  14. package/build/client/_app/immutable/assets/ConfirmDialog.BdKlitwi.css.br +0 -0
  15. package/build/client/_app/immutable/assets/ConfirmDialog.BdKlitwi.css.gz +0 -0
  16. package/build/client/_app/immutable/assets/LibraryContextMenu.CMefGNE2.css +1 -0
  17. package/build/client/_app/immutable/assets/LibraryContextMenu.CMefGNE2.css.br +0 -0
  18. package/build/client/_app/immutable/assets/LibraryContextMenu.CMefGNE2.css.gz +0 -0
  19. package/build/client/_app/immutable/chunks/Bjy-W4x2.js.br +0 -0
  20. package/build/client/_app/immutable/chunks/Bjy-W4x2.js.gz +0 -0
  21. package/build/client/_app/immutable/chunks/CNRz3sSw.js.br +0 -0
  22. package/build/client/_app/immutable/chunks/CNRz3sSw.js.gz +0 -0
  23. package/build/client/_app/immutable/chunks/CO4RBJfa.js.br +0 -0
  24. package/build/client/_app/immutable/chunks/CO4RBJfa.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/DOpBpjxS.js +108 -0
  26. package/build/client/_app/immutable/chunks/DOpBpjxS.js.br +0 -0
  27. package/build/client/_app/immutable/chunks/DOpBpjxS.js.gz +0 -0
  28. package/{dist/editor/_app/immutable/chunks/BfPE5wdt.js → build/client/_app/immutable/chunks/DVEQFclp.js} +1 -1
  29. package/build/client/_app/immutable/chunks/DVEQFclp.js.br +1 -0
  30. package/build/client/_app/immutable/chunks/DVEQFclp.js.gz +0 -0
  31. package/{dist/editor/_app/immutable/chunks/DjvOiDmq.js → build/client/_app/immutable/chunks/DiFoWL2c.js} +1 -1
  32. package/build/client/_app/immutable/chunks/DiFoWL2c.js.br +0 -0
  33. package/build/client/_app/immutable/chunks/DiFoWL2c.js.gz +0 -0
  34. package/build/client/_app/immutable/chunks/DkADHpZF.js +1 -0
  35. package/build/client/_app/immutable/chunks/DkADHpZF.js.br +0 -0
  36. package/build/client/_app/immutable/chunks/DkADHpZF.js.gz +0 -0
  37. package/build/client/_app/immutable/chunks/xihTtKlq.js.br +1 -0
  38. package/build/client/_app/immutable/chunks/xihTtKlq.js.gz +0 -0
  39. package/{dist/editor/_app/immutable/entry/app.BkqbfI8n.js → build/client/_app/immutable/entry/app.CKgtYXQb.js} +2 -2
  40. package/build/client/_app/immutable/entry/app.CKgtYXQb.js.br +0 -0
  41. package/build/client/_app/immutable/entry/app.CKgtYXQb.js.gz +0 -0
  42. package/build/client/_app/immutable/entry/start.CYZu5qE1.js +1 -0
  43. package/build/client/_app/immutable/entry/start.CYZu5qE1.js.br +0 -0
  44. package/build/client/_app/immutable/entry/start.CYZu5qE1.js.gz +0 -0
  45. package/{dist/editor/_app/immutable/nodes/0.xdMI5GEU.js → build/client/_app/immutable/nodes/0.I_1SApYQ.js} +1 -1
  46. package/build/client/_app/immutable/nodes/0.I_1SApYQ.js.br +0 -0
  47. package/build/client/_app/immutable/nodes/0.I_1SApYQ.js.gz +0 -0
  48. package/{dist/editor/_app/immutable/nodes/1.D9p2tfoJ.js → build/client/_app/immutable/nodes/1.v6eUTnWq.js} +1 -1
  49. package/build/client/_app/immutable/nodes/1.v6eUTnWq.js.br +2 -0
  50. package/build/client/_app/immutable/nodes/1.v6eUTnWq.js.gz +0 -0
  51. package/build/client/_app/immutable/nodes/2.DoA7Dfl-.js +3 -0
  52. package/build/client/_app/immutable/nodes/2.DoA7Dfl-.js.br +0 -0
  53. package/build/client/_app/immutable/nodes/2.DoA7Dfl-.js.gz +0 -0
  54. package/build/client/_app/immutable/nodes/3.C-DO70Bs.js +1 -0
  55. package/build/client/_app/immutable/nodes/3.C-DO70Bs.js.br +0 -0
  56. package/build/client/_app/immutable/nodes/3.C-DO70Bs.js.gz +0 -0
  57. package/build/client/_app/immutable/nodes/4.CALOuSyz.js +2 -0
  58. package/build/client/_app/immutable/nodes/4.CALOuSyz.js.br +0 -0
  59. package/build/client/_app/immutable/nodes/4.CALOuSyz.js.gz +0 -0
  60. package/build/client/_app/version.json +1 -0
  61. package/build/client/_app/version.json.br +0 -0
  62. package/build/client/_app/version.json.gz +0 -0
  63. package/build/env.js +100 -0
  64. package/build/env.js.map +1 -0
  65. package/build/handler.js +22 -0
  66. package/build/handler.js.map +1 -0
  67. package/build/index.js +145 -0
  68. package/build/index.js.map +1 -0
  69. package/build/server/chunks/chunks/context.js-BUZqFfWG.js +429 -0
  70. package/build/server/chunks/chunks/context.js-BUZqFfWG.js.map +1 -0
  71. package/build/server/chunks/chunks/core.js-xfrkaQpS.js +458 -0
  72. package/build/server/chunks/chunks/core.js-xfrkaQpS.js.map +1 -0
  73. package/build/server/chunks/chunks/env.js-l0sNRNKZ.js +2 -0
  74. package/build/server/chunks/chunks/env.js-l0sNRNKZ.js.map +1 -0
  75. package/build/server/chunks/chunks/exports.js-C0rwMMtk.js +152 -0
  76. package/build/server/chunks/chunks/exports.js-C0rwMMtk.js.map +1 -0
  77. package/build/server/chunks/chunks/folder-path.js-ytx9ucgg.js +64 -0
  78. package/build/server/chunks/chunks/folder-path.js-ytx9ucgg.js.map +1 -0
  79. package/build/server/chunks/chunks/http.js-DvopzwKh.js +100 -0
  80. package/build/server/chunks/chunks/http.js-DvopzwKh.js.map +1 -0
  81. package/build/server/chunks/chunks/internal.js-DGo2jPcg.js +5753 -0
  82. package/build/server/chunks/chunks/internal.js-DGo2jPcg.js.map +1 -0
  83. package/build/server/chunks/chunks/internal2.js-BlXt2rfE.js +22 -0
  84. package/build/server/chunks/chunks/internal2.js-BlXt2rfE.js.map +1 -0
  85. package/{dist/operations-DYM-5KVl.js → build/server/chunks/chunks/library-store.js-ZLudCJlT.js} +463 -492
  86. package/build/server/chunks/chunks/library-store.js-ZLudCJlT.js.map +1 -0
  87. package/build/server/chunks/chunks/manifest-appearance.js-DTk355LQ.js +146 -0
  88. package/build/server/chunks/chunks/manifest-appearance.js-DTk355LQ.js.map +1 -0
  89. package/build/server/chunks/chunks/routing.js-y-tryuip.js +213 -0
  90. package/build/server/chunks/chunks/routing.js-y-tryuip.js.map +1 -0
  91. package/build/server/chunks/chunks/shared.js-B1gC9MiJ.js +255 -0
  92. package/build/server/chunks/chunks/shared.js-B1gC9MiJ.js.map +1 -0
  93. package/build/server/chunks/chunks/utils.js-DnEJ3UjO.js +1048 -0
  94. package/build/server/chunks/chunks/utils.js-DnEJ3UjO.js.map +1 -0
  95. package/build/server/chunks/entries/endpoints/api/_...path_/_server.ts.js-Cq5gXVQT.js +27 -0
  96. package/build/server/chunks/entries/endpoints/api/_...path_/_server.ts.js-Cq5gXVQT.js.map +1 -0
  97. package/build/server/chunks/entries/endpoints/api/assets/_id_/_server.ts.js-RXbedi8q.js +24 -0
  98. package/build/server/chunks/entries/endpoints/api/assets/_id_/_server.ts.js-RXbedi8q.js.map +1 -0
  99. package/build/server/chunks/entries/endpoints/api/assets/_server.ts.js-D7Qae9vU.js +45 -0
  100. package/build/server/chunks/entries/endpoints/api/assets/_server.ts.js-D7Qae9vU.js.map +1 -0
  101. package/build/server/chunks/entries/endpoints/api/assets/delete/_server.ts.js-DtO20kgB.js +31 -0
  102. package/build/server/chunks/entries/endpoints/api/assets/delete/_server.ts.js-DtO20kgB.js.map +1 -0
  103. package/build/server/chunks/entries/endpoints/api/assets/move/_server.ts.js-BUebPbd5.js +31 -0
  104. package/build/server/chunks/entries/endpoints/api/assets/move/_server.ts.js-BUebPbd5.js.map +1 -0
  105. package/build/server/chunks/entries/endpoints/api/folders/_path_/_server.ts.js-BjT2qPMT.js +38 -0
  106. package/build/server/chunks/entries/endpoints/api/folders/_path_/_server.ts.js-BjT2qPMT.js.map +1 -0
  107. package/build/server/chunks/entries/endpoints/api/folders/_server.ts.js-DYRLsoT7.js +31 -0
  108. package/build/server/chunks/entries/endpoints/api/folders/_server.ts.js-DYRLsoT7.js.map +1 -0
  109. package/build/server/chunks/entries/endpoints/api/manifests/_name_/_server.ts.js-BbN2fGNN.js +24 -0
  110. package/build/server/chunks/entries/endpoints/api/manifests/_name_/_server.ts.js-BbN2fGNN.js.map +1 -0
  111. package/build/server/chunks/entries/endpoints/api/manifests/_server.ts.js-b_MKZ41b.js +31 -0
  112. package/build/server/chunks/entries/endpoints/api/manifests/_server.ts.js-b_MKZ41b.js.map +1 -0
  113. package/build/server/chunks/entries/endpoints/api/state/_server.ts.js-evEfMpvn.js +24 -0
  114. package/build/server/chunks/entries/endpoints/api/state/_server.ts.js-evEfMpvn.js.map +1 -0
  115. package/build/server/chunks/entries/endpoints/files/_...path_/_server.ts.js-C04XE_1w.js +27 -0
  116. package/build/server/chunks/entries/endpoints/files/_...path_/_server.ts.js-C04XE_1w.js.map +1 -0
  117. package/build/server/chunks/entries/endpoints/files/proxy/_...path_/_server.ts.js-DB8TdoEv.js +24 -0
  118. package/build/server/chunks/entries/endpoints/files/proxy/_...path_/_server.ts.js-DB8TdoEv.js.map +1 -0
  119. package/build/server/chunks/entries/endpoints/files/raw/_...path_/_server.ts.js-BrpaijZO.js +24 -0
  120. package/build/server/chunks/entries/endpoints/files/raw/_...path_/_server.ts.js-BrpaijZO.js.map +1 -0
  121. package/build/server/chunks/entries/hooks.server.js-BJJwZW_I.js +23 -0
  122. package/build/server/chunks/entries/hooks.server.js-BJJwZW_I.js.map +1 -0
  123. package/build/server/chunks/handler-DnbS2t1B.js +1475 -0
  124. package/build/server/chunks/handler-DnbS2t1B.js.map +1 -0
  125. package/build/server/chunks/index.js-g77q3Boj.js +3789 -0
  126. package/build/server/chunks/index.js-g77q3Boj.js.map +1 -0
  127. package/build/server/chunks/manifest.js-qmEXbstS.js +149 -0
  128. package/build/server/chunks/manifest.js-qmEXbstS.js.map +1 -0
  129. package/build/server/chunks/nodes/0.js-Bk6IZ-vD.js +11 -0
  130. package/build/server/chunks/nodes/0.js-Bk6IZ-vD.js.map +1 -0
  131. package/build/server/chunks/nodes/1.js-H-qwo4GJ.js +7 -0
  132. package/build/server/chunks/nodes/1.js-H-qwo4GJ.js.map +1 -0
  133. package/build/server/chunks/nodes/2.js-DRpXVLwp.js +7 -0
  134. package/build/server/chunks/nodes/2.js-DRpXVLwp.js.map +1 -0
  135. package/build/server/chunks/nodes/3.js-CDEzNFeU.js +7 -0
  136. package/build/server/chunks/nodes/3.js-CDEzNFeU.js.map +1 -0
  137. package/build/server/chunks/nodes/4.js-BKL7LSSm.js +7 -0
  138. package/build/server/chunks/nodes/4.js-BKL7LSSm.js.map +1 -0
  139. package/build/shims.js +33 -0
  140. package/build/shims.js.map +1 -0
  141. package/dist/cli.d.ts +2 -1
  142. package/dist/cli.js +116 -1336
  143. package/dist/config.d.ts +3 -2
  144. package/dist/config.js +2 -2
  145. package/dist/core/api-types.d.ts +141 -0
  146. package/dist/core/api-types.js +1 -0
  147. package/dist/core/asset-id.d.ts +28 -0
  148. package/dist/core/asset-id.js +59 -0
  149. package/dist/core/asset-reference.d.ts +23 -0
  150. package/dist/core/asset-reference.js +15 -0
  151. package/dist/core/canonicalize.d.ts +9 -0
  152. package/dist/core/canonicalize.js +36 -0
  153. package/dist/core/chroma-key.d.ts +30 -0
  154. package/dist/core/chroma-key.js +55 -0
  155. package/dist/core/config.d.ts +35 -0
  156. package/dist/core/config.js +4 -0
  157. package/dist/core/folder-path.d.ts +19 -0
  158. package/dist/core/folder-path.js +86 -0
  159. package/dist/core/index.d.ts +33 -499
  160. package/dist/core/index.js +17 -962
  161. package/dist/core/ingest.d.ts +24 -0
  162. package/dist/core/ingest.js +42 -0
  163. package/dist/core/library.d.ts +54 -0
  164. package/dist/core/library.js +138 -0
  165. package/dist/core/manifest-appearance.d.ts +35 -0
  166. package/dist/core/manifest-appearance.js +123 -0
  167. package/dist/core/manifest-entry.d.ts +104 -0
  168. package/dist/core/manifest-entry.js +1 -0
  169. package/dist/core/manifest-membership.d.ts +56 -0
  170. package/dist/core/manifest-membership.js +54 -0
  171. package/dist/core/plugins/audio.d.ts +26 -0
  172. package/dist/core/plugins/audio.js +44 -0
  173. package/dist/core/plugins/chroma-key-video.d.ts +29 -0
  174. package/dist/core/plugins/chroma-key-video.js +69 -0
  175. package/dist/core/plugins/contract.d.ts +35 -0
  176. package/dist/core/plugins/contract.js +1 -0
  177. package/dist/core/plugins/image.d.ts +30 -0
  178. package/dist/core/plugins/image.js +45 -0
  179. package/dist/core/plugins/registry.d.ts +16 -0
  180. package/dist/core/plugins/registry.js +52 -0
  181. package/dist/core/plugins/slice.d.ts +22 -0
  182. package/dist/core/plugins/slice.js +60 -0
  183. package/dist/core/plugins/video.d.ts +45 -0
  184. package/dist/core/plugins/video.js +77 -0
  185. package/dist/core/reference-graph.d.ts +41 -0
  186. package/dist/core/reference-graph.js +138 -0
  187. package/dist/core/slice-data.d.ts +61 -0
  188. package/dist/core/slice-data.js +49 -0
  189. package/dist/runtime/chroma-key-gl.d.ts +40 -22
  190. package/dist/runtime/chroma-key-gl.js +189 -183
  191. package/dist/runtime/components/ChromaKeyVideo.svelte +3 -3
  192. package/dist/runtime/components/ChromaKeyVideo.svelte.d.ts +21 -0
  193. package/dist/runtime/components/Image.svelte +1 -1
  194. package/dist/runtime/components/Image.svelte.d.ts +9 -0
  195. package/dist/runtime/components/Slice.svelte +1 -1
  196. package/dist/runtime/components/Slice.svelte.d.ts +19 -0
  197. package/dist/runtime/components/SliceCanvas.svelte +3 -3
  198. package/dist/runtime/components/SliceCanvas.svelte.d.ts +10 -0
  199. package/dist/runtime/components/SliceDom.svelte +3 -3
  200. package/dist/runtime/components/SliceDom.svelte.d.ts +10 -0
  201. package/dist/runtime/components/Video.svelte +2 -2
  202. package/dist/runtime/components/Video.svelte.d.ts +18 -0
  203. package/dist/runtime/geometry.d.ts +55 -35
  204. package/dist/runtime/geometry.js +186 -191
  205. package/dist/runtime/index.d.ts +9 -9
  206. package/dist/runtime/index.js +9 -9
  207. package/dist/runtime/kind-handlers.d.ts +33 -30
  208. package/dist/runtime/kind-handlers.js +85 -67
  209. package/dist/runtime/manifest.d.ts +53 -47
  210. package/dist/runtime/manifest.js +133 -113
  211. package/dist/runtime/observe-border-box-size.d.ts +1 -4
  212. package/dist/runtime/observe-border-box-size.js +9 -10
  213. package/dist/runtime/preload-registry.d.ts +22 -8
  214. package/dist/runtime/preload-registry.js +65 -62
  215. package/dist/server/build.d.ts +8 -0
  216. package/dist/server/build.js +25 -0
  217. package/dist/server/check.d.ts +24 -0
  218. package/dist/server/check.js +199 -0
  219. package/dist/server/cli-commands.d.ts +25 -0
  220. package/dist/server/cli-commands.js +1178 -0
  221. package/dist/server/cli-init.d.ts +3 -0
  222. package/dist/server/cli-init.js +53 -0
  223. package/dist/server/cli-io.d.ts +46 -0
  224. package/dist/server/cli-io.js +105 -0
  225. package/dist/server/codegen.d.ts +58 -0
  226. package/dist/server/codegen.js +185 -0
  227. package/dist/server/config-loader.d.ts +35 -0
  228. package/dist/server/config-loader.js +79 -0
  229. package/dist/server/context.d.ts +8 -0
  230. package/dist/server/context.js +19 -0
  231. package/dist/server/folder-filesystem.d.ts +7 -0
  232. package/dist/server/folder-filesystem.js +39 -0
  233. package/dist/server/http.d.ts +12 -0
  234. package/dist/server/http.js +100 -0
  235. package/dist/server/index.d.ts +17 -0
  236. package/dist/server/index.js +9 -0
  237. package/dist/server/job-hash.d.ts +10 -0
  238. package/dist/server/job-hash.js +23 -0
  239. package/dist/server/library-store.d.ts +82 -0
  240. package/dist/server/library-store.js +763 -0
  241. package/dist/server/operations.d.ts +87 -0
  242. package/dist/server/operations.js +427 -0
  243. package/dist/server/plugins/audio.d.ts +8 -0
  244. package/dist/server/plugins/audio.js +41 -0
  245. package/dist/server/plugins/chroma-key-video.d.ts +9 -0
  246. package/dist/server/plugins/chroma-key-video.js +40 -0
  247. package/dist/server/plugins/config.d.ts +13 -0
  248. package/dist/server/plugins/config.js +32 -0
  249. package/dist/server/plugins/contract.d.ts +114 -0
  250. package/dist/server/plugins/contract.js +16 -0
  251. package/dist/server/plugins/image.d.ts +9 -0
  252. package/dist/server/plugins/image.js +43 -0
  253. package/dist/server/plugins/slice.d.ts +15 -0
  254. package/dist/server/plugins/slice.js +76 -0
  255. package/dist/server/plugins/video.d.ts +7 -0
  256. package/dist/server/plugins/video.js +54 -0
  257. package/dist/server/plugins.d.ts +23 -0
  258. package/dist/server/plugins.js +35 -0
  259. package/dist/server/processing/audio-processing.d.ts +17 -0
  260. package/dist/server/processing/audio-processing.js +46 -0
  261. package/dist/server/processing/ffmpeg.d.ts +9 -0
  262. package/dist/server/processing/ffmpeg.js +50 -0
  263. package/dist/server/processing/image-processing.d.ts +16 -0
  264. package/dist/server/processing/image-processing.js +26 -0
  265. package/dist/server/processing/media-probe.d.ts +15 -0
  266. package/dist/server/processing/media-probe.js +27 -0
  267. package/dist/server/processing/processor.d.ts +50 -0
  268. package/dist/server/processing/processor.js +158 -0
  269. package/dist/server/processing/video-processing.d.ts +35 -0
  270. package/dist/server/processing/video-processing.js +87 -0
  271. package/dist/server/server.d.ts +13 -0
  272. package/dist/server/server.js +57 -0
  273. package/dist/server/start.d.ts +13 -0
  274. package/dist/server/start.js +80 -0
  275. package/package.json +31 -16
  276. package/dist/build-CZYFLLvl.js +0 -191
  277. package/dist/core/image-Dqmz8FXS.js +0 -54
  278. package/dist/core/reference-graph-CjuHbLDw.d.ts +0 -280
  279. package/dist/core/testing.d.ts +0 -27
  280. package/dist/core/testing.js +0 -80
  281. package/dist/editor/200.html +0 -37
  282. package/dist/editor/_app/immutable/assets/2.DIbbW7U1.css +0 -1
  283. package/dist/editor/_app/immutable/assets/3.C-9vFQ9A.css +0 -1
  284. package/dist/editor/_app/immutable/assets/4.BS8ElpOV.css +0 -1
  285. package/dist/editor/_app/immutable/assets/ConfirmDialog.CHEISE-L.css +0 -1
  286. package/dist/editor/_app/immutable/assets/LibraryContextMenu.CDjCmdV-.css +0 -1
  287. package/dist/editor/_app/immutable/chunks/Cx6qtxJg.js +0 -1
  288. package/dist/editor/_app/immutable/chunks/DjdrdRzT.js +0 -1
  289. package/dist/editor/_app/immutable/chunks/n7mvYc42.js +0 -5
  290. package/dist/editor/_app/immutable/entry/start.C8HHOLly.js +0 -1
  291. package/dist/editor/_app/immutable/nodes/2.BrA0Hyzu.js +0 -3
  292. package/dist/editor/_app/immutable/nodes/3.WO7tZH_d.js +0 -104
  293. package/dist/editor/_app/immutable/nodes/4.DQtx17aW.js +0 -2
  294. package/dist/editor/_app/version.json +0 -1
  295. package/dist/index.d.ts +0 -370
  296. package/dist/index.js +0 -4
  297. package/dist/start-Bhnqt9Dc.js +0 -279
  298. package/dist/start-D2IXOrni.js +0 -2
  299. /package/{dist/editor → build/client}/_app/immutable/assets/0.DLhIsYA_.css +0 -0
  300. /package/{dist/editor → build/client}/_app/immutable/chunks/Bjy-W4x2.js +0 -0
  301. /package/{dist/editor → build/client}/_app/immutable/chunks/CNRz3sSw.js +0 -0
  302. /package/{dist/editor → build/client}/_app/immutable/chunks/CO4RBJfa.js +0 -0
  303. /package/{dist/editor → build/client}/_app/immutable/chunks/xihTtKlq.js +0 -0
@@ -1,279 +0,0 @@
1
- import { r as assertSafeRelativeFilePath, t as FundusOperations, w as loadConfig } from "./operations-DYM-5KVl.js";
2
- import { readFile, stat } from "node:fs/promises";
3
- import { extname, join, resolve, sep } from "node:path";
4
- import { existsSync } from "node:fs";
5
- import { createServer } from "node:http";
6
- //#region src/server.ts
7
- /**
8
- * The local Fundus HTTP server: REST under `/api/`, raw and proxy files under
9
- * `/files/`, and the prebuilt editor SPA at `/` when its build is available.
10
- */
11
- const CONTENT_TYPES = {
12
- ".png": "image/png",
13
- ".jpg": "image/jpeg",
14
- ".jpeg": "image/jpeg",
15
- ".webp": "image/webp",
16
- ".gif": "image/gif",
17
- ".avif": "image/avif",
18
- ".svg": "image/svg+xml",
19
- ".html": "text/html; charset=utf-8",
20
- ".js": "text/javascript; charset=utf-8",
21
- ".css": "text/css; charset=utf-8",
22
- ".json": "application/json; charset=utf-8",
23
- ".ico": "image/x-icon",
24
- ".woff2": "font/woff2",
25
- ".mp4": "video/mp4",
26
- ".m4v": "video/mp4",
27
- ".mov": "video/quicktime",
28
- ".webm": "video/webm",
29
- ".mp3": "audio/mpeg",
30
- ".wav": "audio/wav",
31
- ".m4a": "audio/mp4",
32
- ".ogg": "audio/ogg",
33
- ".flac": "audio/flac"
34
- };
35
- function contentTypeFor(fileName) {
36
- return CONTENT_TYPES[extname(fileName).toLowerCase()] ?? "application/octet-stream";
37
- }
38
- function errorResponse(cause, status) {
39
- const body = { error: { message: cause instanceof Error ? cause.message : String(cause) } };
40
- return Response.json(body, { status });
41
- }
42
- /**
43
- * Parse a single-range HTTP `Range: bytes=…` header against a known size.
44
- * Returns the inclusive `[start, end]` byte range, `null` when there is no (or
45
- * an unhandled multi-)range header — serve the whole file — or `'unsatisfiable'`
46
- * when the header is syntactically a range but falls outside the file (→ 416).
47
- * Only the single-range forms browsers actually send while seeking are handled:
48
- * `bytes=start-end`, `bytes=start-`, and the `bytes=-suffix` tail form.
49
- */
50
- function parseByteRange(rangeHeader, size) {
51
- if (!rangeHeader) return null;
52
- const match = /^bytes=(\d*)-(\d*)$/.exec(rangeHeader.trim());
53
- if (!match || match[1] === "" && match[2] === "") return null;
54
- if (size === 0) return "unsatisfiable";
55
- let start;
56
- let end;
57
- if (match[1] === "") {
58
- const suffix = Number(match[2]);
59
- start = Math.max(0, size - suffix);
60
- end = size - 1;
61
- } else {
62
- start = Number(match[1]);
63
- end = match[2] === "" ? size - 1 : Math.min(Number(match[2]), size - 1);
64
- }
65
- if (start > end || start >= size) return "unsatisfiable";
66
- return {
67
- start,
68
- end
69
- };
70
- }
71
- async function serveSingleFile(directory, fileName, request) {
72
- try {
73
- assertSafeRelativeFilePath(fileName);
74
- } catch (cause) {
75
- return errorResponse(cause, 400);
76
- }
77
- const filePath = join(directory, fileName);
78
- if (!existsSync(filePath)) return errorResponse(/* @__PURE__ */ new Error(`File "${fileName}" not found.`), 404);
79
- const bytes = new Uint8Array(await readFile(filePath));
80
- const size = bytes.byteLength;
81
- const headers = {
82
- "Content-Type": contentTypeFor(fileName),
83
- "Cache-Control": "no-store",
84
- "Accept-Ranges": "bytes"
85
- };
86
- const range = parseByteRange(request.headers.get("Range"), size);
87
- if (range === "unsatisfiable") return new Response(null, {
88
- status: 416,
89
- headers: {
90
- ...headers,
91
- "Content-Range": `bytes */${size}`
92
- }
93
- });
94
- if (range) {
95
- const slice = bytes.subarray(range.start, range.end + 1);
96
- return new Response(slice, {
97
- status: 206,
98
- headers: {
99
- ...headers,
100
- "Content-Range": `bytes ${range.start}-${range.end}/${size}`,
101
- "Content-Length": String(slice.byteLength)
102
- }
103
- });
104
- }
105
- return new Response(bytes, { headers: {
106
- ...headers,
107
- "Content-Length": String(size)
108
- } });
109
- }
110
- function startServer(options) {
111
- const operations = new FundusOperations(options.config);
112
- const editorBuildDirectory = options.editorBuildDirectory ?? null;
113
- async function serveEditor(pathname) {
114
- if (editorBuildDirectory) {
115
- const relative = pathname === "/" ? "index.html" : pathname.slice(1);
116
- const buildRoot = resolve(editorBuildDirectory);
117
- const filePath = resolve(buildRoot, relative);
118
- if ((filePath === buildRoot || filePath.startsWith(`${buildRoot}${sep}`)) && !relative.includes("..")) {
119
- if ((await stat(filePath).catch(() => null))?.isFile()) {
120
- const bytes = await readFile(filePath);
121
- return new Response(new Uint8Array(bytes), { headers: { "Content-Type": contentTypeFor(filePath) } });
122
- }
123
- }
124
- const fallbackPath = join(editorBuildDirectory, "200.html");
125
- if (existsSync(fallbackPath)) {
126
- const bytes = await readFile(fallbackPath);
127
- return new Response(new Uint8Array(bytes), { headers: { "Content-Type": "text/html; charset=utf-8" } });
128
- }
129
- }
130
- return errorResponse(/* @__PURE__ */ new Error("The prebuilt Fundus editor is unavailable."), 500);
131
- }
132
- async function handle(request) {
133
- const pathname = new URL(request.url).pathname;
134
- const method = request.method.toUpperCase();
135
- try {
136
- if (pathname === "/api/state" && method === "GET") return Response.json(await operations.state());
137
- if (pathname === "/api/assets" && method === "POST") {
138
- const formData = await request.formData();
139
- const file = formData.get("file");
140
- const type = formData.get("type");
141
- const id = formData.get("id");
142
- const folder = formData.get("folder");
143
- if (!(file instanceof File)) return errorResponse(/* @__PURE__ */ new Error("Multipart field \"file\" must be a file."), 400);
144
- if (typeof type !== "string" || typeof id !== "string") return errorResponse(/* @__PURE__ */ new Error("Multipart fields \"type\" and \"id\" are required."), 400);
145
- const bytes = new Uint8Array(await file.arrayBuffer());
146
- if (folder !== null && typeof folder !== "string") return errorResponse(/* @__PURE__ */ new Error("Multipart field \"folder\" must be a string."), 400);
147
- return Response.json(await operations.ingest({
148
- fileName: file.name,
149
- bytes,
150
- type,
151
- id,
152
- folder: folder ?? ""
153
- }));
154
- }
155
- if (pathname === "/api/assets/move" && method === "POST") {
156
- const body = await request.json();
157
- if (!Array.isArray(body.assetIds) || body.assetIds.some((id) => typeof id !== "string") || typeof body.folder !== "string") return errorResponse(/* @__PURE__ */ new Error("\"assetIds\" must be an array of strings and \"folder\" must be a string."), 400);
158
- return Response.json(await operations.moveAssets(body.assetIds, body.folder));
159
- }
160
- if (pathname === "/api/assets/delete" && method === "POST") {
161
- const body = await request.json();
162
- if (!Array.isArray(body.assetIds) || body.assetIds.some((id) => typeof id !== "string")) return errorResponse(/* @__PURE__ */ new Error("\"assetIds\" must be an array of strings."), 400);
163
- return Response.json(await operations.deleteAssets(body.assetIds));
164
- }
165
- const assetMatch = pathname.match(/^\/api\/assets\/([^/]+)$/);
166
- if (assetMatch) {
167
- const id = decodeURIComponent(assetMatch[1]);
168
- if (method === "PATCH") {
169
- const body = await request.json();
170
- return Response.json(await operations.patchAsset(id, body));
171
- }
172
- if (method === "DELETE") return Response.json(await operations.deleteAsset(id));
173
- }
174
- if (pathname === "/api/manifests" && method === "POST") {
175
- const body = await request.json();
176
- if (typeof body.name !== "string") return errorResponse(/* @__PURE__ */ new Error("\"name\" must be a string."), 400);
177
- return Response.json(await operations.createManifest(body.name));
178
- }
179
- if (pathname === "/api/folders" && method === "POST") {
180
- const body = await request.json();
181
- if (typeof body.path !== "string") return errorResponse(/* @__PURE__ */ new Error("\"path\" must be a string."), 400);
182
- return Response.json(await operations.createFolder(body.path));
183
- }
184
- const folderMatch = pathname.match(/^\/api\/folders\/([^/]+)$/);
185
- if (folderMatch) {
186
- const folder = decodeURIComponent(folderMatch[1]);
187
- if (method === "PATCH") {
188
- const body = await request.json();
189
- if (body.name === void 0 === (body.parent === void 0)) return errorResponse(/* @__PURE__ */ new Error("Provide exactly one of \"name\" or \"parent\"."), 400);
190
- if (body.name !== void 0) {
191
- if (typeof body.name !== "string") return errorResponse(/* @__PURE__ */ new Error("\"name\" must be a string."), 400);
192
- return Response.json(await operations.renameFolder(folder, body.name));
193
- }
194
- if (typeof body.parent !== "string") return errorResponse(/* @__PURE__ */ new Error("\"parent\" must be a string."), 400);
195
- return Response.json(await operations.moveFolder(folder, body.parent));
196
- }
197
- if (method === "DELETE") return Response.json(await operations.deleteFolder(folder));
198
- }
199
- const manifestMatch = pathname.match(/^\/api\/manifests\/([^/]+)$/);
200
- if (manifestMatch) {
201
- const name = decodeURIComponent(manifestMatch[1]);
202
- if (method === "PATCH") {
203
- const body = await request.json();
204
- return Response.json(await operations.patchManifest(name, body));
205
- }
206
- if (method === "DELETE") return Response.json(await operations.deleteManifest(name));
207
- }
208
- const rawMatch = pathname.match(/^\/files\/raw\/(.+)$/);
209
- if (rawMatch && method === "GET") return serveSingleFile(options.config.rawDir, decodeURIComponent(rawMatch[1]), request);
210
- const proxyMatch = pathname.match(/^\/files\/proxy\/(.+)$/);
211
- if (proxyMatch && method === "GET") return serveSingleFile(options.config.proxyDir, decodeURIComponent(proxyMatch[1]), request);
212
- if (pathname.startsWith("/api/") || pathname.startsWith("/files/")) return errorResponse(/* @__PURE__ */ new Error(`No route for ${method} ${pathname}.`), 404);
213
- return serveEditor(pathname);
214
- } catch (cause) {
215
- return errorResponse(cause, 400);
216
- }
217
- }
218
- const server = createServer(async (incoming, outgoing) => {
219
- try {
220
- await writeWebResponse(outgoing, await handle(await nodeRequestToWebRequest(incoming, options.port)));
221
- } catch (cause) {
222
- await writeWebResponse(outgoing, errorResponse(cause, 500));
223
- }
224
- });
225
- server.listen(options.port);
226
- const address = server.address();
227
- return {
228
- port: typeof address === "object" && address ? address.port : options.port,
229
- stop: () => {
230
- server.close();
231
- server.closeAllConnections();
232
- }
233
- };
234
- }
235
- async function nodeRequestToWebRequest(request, fallbackPort) {
236
- const host = request.headers.host ?? `localhost:${fallbackPort}`;
237
- const method = request.method ?? "GET";
238
- const body = method === "GET" || method === "HEAD" ? void 0 : request;
239
- return new Request(`http://${host}${request.url ?? "/"}`, {
240
- method,
241
- headers: request.headers,
242
- body,
243
- duplex: body ? "half" : void 0
244
- });
245
- }
246
- async function writeWebResponse(response, webResponse) {
247
- response.statusCode = webResponse.status;
248
- webResponse.headers.forEach((value, name) => response.setHeader(name, value));
249
- if (!webResponse.body) {
250
- response.end();
251
- return;
252
- }
253
- response.end(Buffer.from(await webResponse.arrayBuffer()));
254
- }
255
- //#endregion
256
- //#region src/start.ts
257
- /**
258
- * `fundus start` serves the prebuilt editor and API for a host project.
259
- */
260
- async function runStart(projectRoot) {
261
- const apiPort = Number(process.env.FUNDUS_API_PORT) || 5176;
262
- const config = await loadConfig(projectRoot);
263
- const editorBuildDirectory = join(import.meta.dirname, "editor");
264
- if (!existsSync(join(editorBuildDirectory, "200.html"))) throw new Error(`The prebuilt Fundus editor is missing from ${editorBuildDirectory}. Reinstall the fundus package or report a packaging error.`);
265
- const server = startServer({
266
- config,
267
- port: apiPort,
268
- editorBuildDirectory
269
- });
270
- console.log(`fundus editor: http://localhost:${server.port} (project: ${projectRoot})`);
271
- const stop = () => {
272
- server.stop();
273
- process.exit(0);
274
- };
275
- process.on("SIGINT", stop);
276
- process.on("SIGTERM", stop);
277
- }
278
- //#endregion
279
- export { runStart as t };
@@ -1,2 +0,0 @@
1
- import { t as runStart } from "./start-Bhnqt9Dc.js";
2
- export { runStart };