fundus 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -0
- package/build/client/_app/immutable/assets/0.DLhIsYA_.css.br +0 -0
- package/build/client/_app/immutable/assets/0.DLhIsYA_.css.gz +0 -0
- package/build/client/_app/immutable/assets/2.wavcNhPC.css +1 -0
- package/build/client/_app/immutable/assets/2.wavcNhPC.css.br +0 -0
- package/build/client/_app/immutable/assets/2.wavcNhPC.css.gz +0 -0
- package/build/client/_app/immutable/assets/3.Cjh_fXPY.css +1 -0
- package/build/client/_app/immutable/assets/3.Cjh_fXPY.css.br +0 -0
- package/build/client/_app/immutable/assets/3.Cjh_fXPY.css.gz +0 -0
- package/build/client/_app/immutable/assets/4.p004hmEN.css +1 -0
- package/build/client/_app/immutable/assets/4.p004hmEN.css.br +0 -0
- package/build/client/_app/immutable/assets/4.p004hmEN.css.gz +0 -0
- package/build/client/_app/immutable/assets/ConfirmDialog.BdKlitwi.css +1 -0
- package/build/client/_app/immutable/assets/ConfirmDialog.BdKlitwi.css.br +0 -0
- package/build/client/_app/immutable/assets/ConfirmDialog.BdKlitwi.css.gz +0 -0
- package/build/client/_app/immutable/assets/LibraryContextMenu.zyZtpKzC.css +1 -0
- package/build/client/_app/immutable/assets/LibraryContextMenu.zyZtpKzC.css.br +0 -0
- package/build/client/_app/immutable/assets/LibraryContextMenu.zyZtpKzC.css.gz +0 -0
- package/build/client/_app/immutable/chunks/BiIto6ft.js +1 -0
- package/build/client/_app/immutable/chunks/BiIto6ft.js.br +0 -0
- package/build/client/_app/immutable/chunks/BiIto6ft.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bjy-W4x2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bjy-W4x2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CNRz3sSw.js.br +0 -0
- package/build/client/_app/immutable/chunks/CNRz3sSw.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CO4RBJfa.js.br +0 -0
- package/build/client/_app/immutable/chunks/CO4RBJfa.js.gz +0 -0
- package/{dist/editor/_app/immutable/chunks/DjvOiDmq.js → build/client/_app/immutable/chunks/CvY6YsFE.js} +1 -1
- package/build/client/_app/immutable/chunks/CvY6YsFE.js.br +0 -0
- package/build/client/_app/immutable/chunks/CvY6YsFE.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DL0_39Ys.js +5 -0
- package/build/client/_app/immutable/chunks/DL0_39Ys.js.br +0 -0
- package/build/client/_app/immutable/chunks/DL0_39Ys.js.gz +0 -0
- package/{dist/editor/_app/immutable/chunks/BfPE5wdt.js → build/client/_app/immutable/chunks/DQ8SXFaX.js} +1 -1
- package/build/client/_app/immutable/chunks/DQ8SXFaX.js.br +0 -0
- package/build/client/_app/immutable/chunks/DQ8SXFaX.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DjdrdRzT.js.br +0 -0
- package/build/client/_app/immutable/chunks/DjdrdRzT.js.gz +0 -0
- package/build/client/_app/immutable/chunks/xihTtKlq.js.br +1 -0
- package/build/client/_app/immutable/chunks/xihTtKlq.js.gz +0 -0
- package/{dist/editor/_app/immutable/entry/app.BkqbfI8n.js → build/client/_app/immutable/entry/app.ubN0v9bN.js} +2 -2
- package/build/client/_app/immutable/entry/app.ubN0v9bN.js.br +0 -0
- package/build/client/_app/immutable/entry/app.ubN0v9bN.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.BW8dBDh6.js +1 -0
- package/build/client/_app/immutable/entry/start.BW8dBDh6.js.br +0 -0
- package/build/client/_app/immutable/entry/start.BW8dBDh6.js.gz +0 -0
- package/{dist/editor/_app/immutable/nodes/0.xdMI5GEU.js → build/client/_app/immutable/nodes/0.Dr5ijCIl.js} +1 -1
- package/build/client/_app/immutable/nodes/0.Dr5ijCIl.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.Dr5ijCIl.js.gz +0 -0
- package/{dist/editor/_app/immutable/nodes/1.D9p2tfoJ.js → build/client/_app/immutable/nodes/1.DiIGIRAb.js} +1 -1
- package/build/client/_app/immutable/nodes/1.DiIGIRAb.js.br +3 -0
- package/build/client/_app/immutable/nodes/1.DiIGIRAb.js.gz +0 -0
- package/{dist/editor/_app/immutable/nodes/2.BrA0Hyzu.js → build/client/_app/immutable/nodes/2.B8KYmQcV.js} +3 -3
- package/build/client/_app/immutable/nodes/2.B8KYmQcV.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.B8KYmQcV.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.B1jc7arT.js +104 -0
- package/build/client/_app/immutable/nodes/3.B1jc7arT.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.B1jc7arT.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.BPK9n1mH.js +2 -0
- package/build/client/_app/immutable/nodes/4.BPK9n1mH.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.BPK9n1mH.js.gz +0 -0
- package/build/client/_app/version.json +1 -0
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/env.js +100 -0
- package/build/env.js.map +1 -0
- package/build/handler.js +22 -0
- package/build/handler.js.map +1 -0
- package/build/index.js +145 -0
- package/build/index.js.map +1 -0
- package/build/server/chunks/chunks/context.js-Bw4WWLhG.js +443 -0
- package/build/server/chunks/chunks/context.js-Bw4WWLhG.js.map +1 -0
- package/build/server/chunks/chunks/core.js-DDntpb72.js +409 -0
- package/build/server/chunks/chunks/core.js-DDntpb72.js.map +1 -0
- package/build/server/chunks/chunks/env.js-l0sNRNKZ.js +2 -0
- package/build/server/chunks/chunks/env.js-l0sNRNKZ.js.map +1 -0
- package/build/server/chunks/chunks/exports.js-CLTzaOxn.js +152 -0
- package/build/server/chunks/chunks/exports.js-CLTzaOxn.js.map +1 -0
- package/build/server/chunks/chunks/folder-path.js-ytx9ucgg.js +64 -0
- package/build/server/chunks/chunks/folder-path.js-ytx9ucgg.js.map +1 -0
- package/build/server/chunks/chunks/http.js-Dxoa-jtP.js +100 -0
- package/build/server/chunks/chunks/http.js-Dxoa-jtP.js.map +1 -0
- package/build/server/chunks/chunks/internal.js-BDBSzJId.js +5753 -0
- package/build/server/chunks/chunks/internal.js-BDBSzJId.js.map +1 -0
- package/build/server/chunks/chunks/internal2.js-BlXt2rfE.js +22 -0
- package/build/server/chunks/chunks/internal2.js-BlXt2rfE.js.map +1 -0
- package/{dist/operations-DYM-5KVl.js → build/server/chunks/chunks/library-store.js-BP8cL-qD.js} +344 -444
- package/build/server/chunks/chunks/library-store.js-BP8cL-qD.js.map +1 -0
- package/build/server/chunks/chunks/manifest-appearance.js-DTk355LQ.js +146 -0
- package/build/server/chunks/chunks/manifest-appearance.js-DTk355LQ.js.map +1 -0
- package/build/server/chunks/chunks/routing.js-y-tryuip.js +213 -0
- package/build/server/chunks/chunks/routing.js-y-tryuip.js.map +1 -0
- package/build/server/chunks/chunks/shared.js-BWXgl1Xf.js +255 -0
- package/build/server/chunks/chunks/shared.js-BWXgl1Xf.js.map +1 -0
- package/build/server/chunks/chunks/utils.js-9oI5Oz0w.js +1048 -0
- package/build/server/chunks/chunks/utils.js-9oI5Oz0w.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/_...path_/_server.ts.js-WknZVW_S.js +27 -0
- package/build/server/chunks/entries/endpoints/api/_...path_/_server.ts.js-WknZVW_S.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/assets/_id_/_server.ts.js-BrZ__-HZ.js +24 -0
- package/build/server/chunks/entries/endpoints/api/assets/_id_/_server.ts.js-BrZ__-HZ.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/assets/_server.ts.js-PqADGPXc.js +45 -0
- package/build/server/chunks/entries/endpoints/api/assets/_server.ts.js-PqADGPXc.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/assets/delete/_server.ts.js-OqoE5PN-.js +31 -0
- package/build/server/chunks/entries/endpoints/api/assets/delete/_server.ts.js-OqoE5PN-.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/assets/move/_server.ts.js-CJ08e1ho.js +31 -0
- package/build/server/chunks/entries/endpoints/api/assets/move/_server.ts.js-CJ08e1ho.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/folders/_path_/_server.ts.js-DdF3eK2I.js +38 -0
- package/build/server/chunks/entries/endpoints/api/folders/_path_/_server.ts.js-DdF3eK2I.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/folders/_server.ts.js-Cxt6jsJ5.js +31 -0
- package/build/server/chunks/entries/endpoints/api/folders/_server.ts.js-Cxt6jsJ5.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/manifests/_name_/_server.ts.js-BWVM2Ntl.js +24 -0
- package/build/server/chunks/entries/endpoints/api/manifests/_name_/_server.ts.js-BWVM2Ntl.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/manifests/_server.ts.js-Z2bM-qHM.js +31 -0
- package/build/server/chunks/entries/endpoints/api/manifests/_server.ts.js-Z2bM-qHM.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/state/_server.ts.js-BX9H2Z34.js +24 -0
- package/build/server/chunks/entries/endpoints/api/state/_server.ts.js-BX9H2Z34.js.map +1 -0
- package/build/server/chunks/entries/endpoints/files/_...path_/_server.ts.js-BWHDZ8mz.js +27 -0
- package/build/server/chunks/entries/endpoints/files/_...path_/_server.ts.js-BWHDZ8mz.js.map +1 -0
- package/build/server/chunks/entries/endpoints/files/proxy/_...path_/_server.ts.js-CR_7mndO.js +24 -0
- package/build/server/chunks/entries/endpoints/files/proxy/_...path_/_server.ts.js-CR_7mndO.js.map +1 -0
- package/build/server/chunks/entries/endpoints/files/raw/_...path_/_server.ts.js-Cw1PDBvb.js +24 -0
- package/build/server/chunks/entries/endpoints/files/raw/_...path_/_server.ts.js-Cw1PDBvb.js.map +1 -0
- package/build/server/chunks/entries/hooks.server.js-BHoE0yBi.js +23 -0
- package/build/server/chunks/entries/hooks.server.js-BHoE0yBi.js.map +1 -0
- package/build/server/chunks/handler-10cx4zHn.js +1475 -0
- package/build/server/chunks/handler-10cx4zHn.js.map +1 -0
- package/build/server/chunks/index.js-DvPfiC00.js +3789 -0
- package/build/server/chunks/index.js-DvPfiC00.js.map +1 -0
- package/build/server/chunks/manifest.js-DoPjUnzD.js +149 -0
- package/build/server/chunks/manifest.js-DoPjUnzD.js.map +1 -0
- package/build/server/chunks/nodes/0.js-Di3qgAtW.js +11 -0
- package/build/server/chunks/nodes/0.js-Di3qgAtW.js.map +1 -0
- package/build/server/chunks/nodes/1.js-BlWSFIA8.js +7 -0
- package/build/server/chunks/nodes/1.js-BlWSFIA8.js.map +1 -0
- package/build/server/chunks/nodes/2.js-CO9nSPUN.js +7 -0
- package/build/server/chunks/nodes/2.js-CO9nSPUN.js.map +1 -0
- package/build/server/chunks/nodes/3.js-C2D6xpEO.js +7 -0
- package/build/server/chunks/nodes/3.js-C2D6xpEO.js.map +1 -0
- package/build/server/chunks/nodes/4.js-B3IuagJW.js +7 -0
- package/build/server/chunks/nodes/4.js-B3IuagJW.js.map +1 -0
- package/build/shims.js +33 -0
- package/build/shims.js.map +1 -0
- package/dist/cli.d.ts +2 -1
- package/dist/cli.js +109 -1332
- package/dist/config.d.ts +3 -2
- package/dist/config.js +2 -2
- package/dist/core/api-types.d.ts +141 -0
- package/dist/core/api-types.js +1 -0
- package/dist/core/asset-id.d.ts +28 -0
- package/dist/core/asset-id.js +59 -0
- package/dist/core/asset-reference.d.ts +23 -0
- package/dist/core/asset-reference.js +15 -0
- package/dist/core/canonicalize.d.ts +9 -0
- package/dist/core/canonicalize.js +36 -0
- package/dist/core/chroma-key.d.ts +30 -0
- package/dist/core/chroma-key.js +55 -0
- package/dist/core/config.d.ts +35 -0
- package/dist/core/config.js +4 -0
- package/dist/core/folder-path.d.ts +19 -0
- package/dist/core/folder-path.js +86 -0
- package/dist/core/index.d.ts +33 -499
- package/dist/core/index.js +17 -962
- package/dist/core/ingest.d.ts +18 -0
- package/dist/core/ingest.js +58 -0
- package/dist/core/library.d.ts +54 -0
- package/dist/core/library.js +138 -0
- package/dist/core/manifest-appearance.d.ts +35 -0
- package/dist/core/manifest-appearance.js +123 -0
- package/dist/core/manifest-entry.d.ts +104 -0
- package/dist/core/manifest-entry.js +1 -0
- package/dist/core/manifest-membership.d.ts +56 -0
- package/dist/core/manifest-membership.js +54 -0
- package/dist/core/plugins/audio.d.ts +26 -0
- package/dist/core/plugins/audio.js +44 -0
- package/dist/core/plugins/chroma-key-video.d.ts +29 -0
- package/dist/core/plugins/chroma-key-video.js +69 -0
- package/dist/core/plugins/contract.d.ts +35 -0
- package/dist/core/plugins/contract.js +1 -0
- package/dist/core/plugins/image.d.ts +30 -0
- package/dist/core/plugins/image.js +45 -0
- package/dist/core/plugins/slice.d.ts +22 -0
- package/dist/core/plugins/slice.js +60 -0
- package/dist/core/plugins/video.d.ts +45 -0
- package/dist/core/plugins/video.js +77 -0
- package/dist/core/reference-graph.d.ts +41 -0
- package/dist/core/reference-graph.js +138 -0
- package/dist/core/slice-data.d.ts +61 -0
- package/dist/core/slice-data.js +49 -0
- package/dist/runtime/chroma-key-gl.d.ts +40 -22
- package/dist/runtime/chroma-key-gl.js +189 -183
- package/dist/runtime/components/ChromaKeyVideo.svelte +3 -3
- package/dist/runtime/components/ChromaKeyVideo.svelte.d.ts +21 -0
- package/dist/runtime/components/Image.svelte +1 -1
- package/dist/runtime/components/Image.svelte.d.ts +9 -0
- package/dist/runtime/components/Slice.svelte +1 -1
- package/dist/runtime/components/Slice.svelte.d.ts +19 -0
- package/dist/runtime/components/SliceCanvas.svelte +3 -3
- package/dist/runtime/components/SliceCanvas.svelte.d.ts +10 -0
- package/dist/runtime/components/SliceDom.svelte +3 -3
- package/dist/runtime/components/SliceDom.svelte.d.ts +10 -0
- package/dist/runtime/components/Video.svelte +2 -2
- package/dist/runtime/components/Video.svelte.d.ts +18 -0
- package/dist/runtime/geometry.d.ts +55 -35
- package/dist/runtime/geometry.js +186 -191
- package/dist/runtime/index.d.ts +9 -9
- package/dist/runtime/index.js +9 -9
- package/dist/runtime/kind-handlers.d.ts +33 -24
- package/dist/runtime/kind-handlers.js +74 -65
- package/dist/runtime/manifest.d.ts +53 -47
- package/dist/runtime/manifest.js +133 -113
- package/dist/runtime/observe-border-box-size.d.ts +1 -4
- package/dist/runtime/observe-border-box-size.js +9 -10
- package/dist/runtime/preload-registry.d.ts +22 -8
- package/dist/runtime/preload-registry.js +65 -62
- package/dist/server/build.d.ts +8 -0
- package/dist/server/build.js +25 -0
- package/dist/server/check.d.ts +24 -0
- package/dist/server/check.js +199 -0
- package/dist/server/cli-commands.d.ts +25 -0
- package/dist/server/cli-commands.js +1178 -0
- package/dist/server/cli-init.d.ts +3 -0
- package/dist/server/cli-init.js +53 -0
- package/dist/server/cli-io.d.ts +46 -0
- package/dist/server/cli-io.js +105 -0
- package/dist/server/codegen.d.ts +58 -0
- package/dist/server/codegen.js +185 -0
- package/dist/server/config-loader.d.ts +34 -0
- package/dist/server/config-loader.js +103 -0
- package/dist/server/context.d.ts +8 -0
- package/dist/server/context.js +19 -0
- package/dist/server/folder-filesystem.d.ts +7 -0
- package/dist/server/folder-filesystem.js +39 -0
- package/dist/server/http.d.ts +12 -0
- package/dist/server/http.js +100 -0
- package/dist/server/index.d.ts +16 -0
- package/dist/server/index.js +9 -0
- package/dist/server/job-hash.d.ts +10 -0
- package/dist/server/job-hash.js +23 -0
- package/dist/server/library-store.d.ts +82 -0
- package/dist/server/library-store.js +763 -0
- package/dist/server/operations.d.ts +87 -0
- package/dist/server/operations.js +427 -0
- package/dist/server/plugins/audio.d.ts +7 -0
- package/dist/server/plugins/audio.js +27 -0
- package/dist/server/plugins/chroma-key-video.d.ts +9 -0
- package/dist/server/plugins/chroma-key-video.js +38 -0
- package/dist/server/plugins/contract.d.ts +100 -0
- package/dist/server/plugins/contract.js +16 -0
- package/dist/server/plugins/image.d.ts +8 -0
- package/dist/server/plugins/image.js +30 -0
- package/dist/server/plugins/slice.d.ts +14 -0
- package/dist/server/plugins/slice.js +63 -0
- package/dist/server/plugins/video.d.ts +6 -0
- package/dist/server/plugins/video.js +29 -0
- package/dist/server/plugins.d.ts +23 -0
- package/dist/server/plugins.js +33 -0
- package/dist/server/processing/audio-processing.d.ts +17 -0
- package/dist/server/processing/audio-processing.js +46 -0
- package/dist/server/processing/ffmpeg.d.ts +9 -0
- package/dist/server/processing/ffmpeg.js +50 -0
- package/dist/server/processing/image-processing.d.ts +16 -0
- package/dist/server/processing/image-processing.js +26 -0
- package/dist/server/processing/media-probe.d.ts +15 -0
- package/dist/server/processing/media-probe.js +27 -0
- package/dist/server/processing/processor.d.ts +50 -0
- package/dist/server/processing/processor.js +158 -0
- package/dist/server/processing/video-processing.d.ts +35 -0
- package/dist/server/processing/video-processing.js +87 -0
- package/dist/server/server.d.ts +13 -0
- package/dist/server/server.js +57 -0
- package/dist/server/start.d.ts +1 -0
- package/dist/server/start.js +33 -0
- package/package.json +29 -16
- package/dist/build-CZYFLLvl.js +0 -191
- package/dist/core/image-Dqmz8FXS.js +0 -54
- package/dist/core/reference-graph-CjuHbLDw.d.ts +0 -280
- package/dist/core/testing.d.ts +0 -27
- package/dist/core/testing.js +0 -80
- package/dist/editor/200.html +0 -37
- package/dist/editor/_app/immutable/assets/2.DIbbW7U1.css +0 -1
- package/dist/editor/_app/immutable/assets/3.C-9vFQ9A.css +0 -1
- package/dist/editor/_app/immutable/assets/4.BS8ElpOV.css +0 -1
- package/dist/editor/_app/immutable/assets/ConfirmDialog.CHEISE-L.css +0 -1
- package/dist/editor/_app/immutable/assets/LibraryContextMenu.CDjCmdV-.css +0 -1
- package/dist/editor/_app/immutable/chunks/Cx6qtxJg.js +0 -1
- package/dist/editor/_app/immutable/chunks/n7mvYc42.js +0 -5
- package/dist/editor/_app/immutable/entry/start.C8HHOLly.js +0 -1
- package/dist/editor/_app/immutable/nodes/3.WO7tZH_d.js +0 -104
- package/dist/editor/_app/immutable/nodes/4.DQtx17aW.js +0 -2
- package/dist/editor/_app/version.json +0 -1
- package/dist/index.d.ts +0 -370
- package/dist/index.js +0 -4
- package/dist/start-Bhnqt9Dc.js +0 -279
- package/dist/start-D2IXOrni.js +0 -2
- /package/{dist/editor → build/client}/_app/immutable/assets/0.DLhIsYA_.css +0 -0
- /package/{dist/editor → build/client}/_app/immutable/chunks/Bjy-W4x2.js +0 -0
- /package/{dist/editor → build/client}/_app/immutable/chunks/CNRz3sSw.js +0 -0
- /package/{dist/editor → build/client}/_app/immutable/chunks/CO4RBJfa.js +0 -0
- /package/{dist/editor → build/client}/_app/immutable/chunks/DjdrdRzT.js +0 -0
- /package/{dist/editor → build/client}/_app/immutable/chunks/xihTtKlq.js +0 -0
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
import { r as rawFileNameOfPath, f as folderOfRawPath } from './folder-path.js-ytx9ucgg.js';
|
|
2
|
+
import { s as serverPluginsByType, L as LibraryStore, a as serverPluginForType, p as processAssets, g as generateManifestModules, c as collectAllReferences, d as descriptorsByType, b as computeLibraryMembership, e as allDeliveredAssetIds, f as compareCodeUnits, r as readCurrentProxy, h as encodeRelativePathForUrl } from './library-store.js-BP8cL-qD.js';
|
|
3
|
+
import { A as AUDIO_BUILT_IN_PRESETS, V as VIDEO_BUILT_IN_PRESETS, S as SLICE_BUILT_IN_PRESETS, I as IMAGE_BUILT_IN_PRESETS, f as validateAudioPreset, g as validateVideoPreset, h as validateImagePreset } from './core.js-DDntpb72.js';
|
|
4
|
+
import { isAbsolute, resolve, join } from 'node:path';
|
|
5
|
+
import { existsSync } from 'node:fs';
|
|
6
|
+
import { createJiti } from 'jiti';
|
|
7
|
+
|
|
8
|
+
//#region src/lib/server/config-loader.ts
|
|
9
|
+
/**
|
|
10
|
+
* Loads and resolves the host's `fundus.config.ts` through jiti, validates
|
|
11
|
+
* the shape, resolves all paths to
|
|
12
|
+
* absolute, and merges the built-in plugin preset defaults under the host's.
|
|
13
|
+
*/
|
|
14
|
+
function isRecord(value) {
|
|
15
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
16
|
+
}
|
|
17
|
+
function requiredString(config, key) {
|
|
18
|
+
const value = config[key];
|
|
19
|
+
if (typeof value !== "string" || value.length === 0) throw new Error(`fundus.config: "${key}" must be a non-empty string.`);
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
function resolvePath(projectRoot, value) {
|
|
23
|
+
return isAbsolute(value) ? value : resolve(projectRoot, value);
|
|
24
|
+
}
|
|
25
|
+
function mergePresets(label, builtIn, pluginConfig, validatePreset) {
|
|
26
|
+
const merged = { ...builtIn };
|
|
27
|
+
if (pluginConfig === void 0) return merged;
|
|
28
|
+
if (!isRecord(pluginConfig)) throw new Error(`fundus.config: "plugins.${label}" must be an object.`);
|
|
29
|
+
if (pluginConfig.presets === void 0) return merged;
|
|
30
|
+
if (!isRecord(pluginConfig.presets)) throw new Error(`fundus.config: "plugins.${label}.presets" must be an object.`);
|
|
31
|
+
for (const [name, preset] of Object.entries(pluginConfig.presets)) merged[name] = validatePreset(name, preset);
|
|
32
|
+
return merged;
|
|
33
|
+
}
|
|
34
|
+
/** `plugins.video.ffmpegPath` / `ffprobePath`: optional system-binary overrides. */
|
|
35
|
+
function binaryPathOverride(projectRoot, pluginConfig, key) {
|
|
36
|
+
if (!isRecord(pluginConfig) || pluginConfig[key] === void 0) return null;
|
|
37
|
+
const value = pluginConfig[key];
|
|
38
|
+
if (typeof value !== "string" || value.length === 0) throw new Error(`fundus.config: "plugins.video.${key}" must be a non-empty string.`);
|
|
39
|
+
return resolvePath(projectRoot, value);
|
|
40
|
+
}
|
|
41
|
+
/** Pure resolution step (testable without a config file on disk). */
|
|
42
|
+
function resolveConfig(projectRoot, value) {
|
|
43
|
+
if (!isRecord(value)) throw new Error("fundus.config must default-export a configuration object.");
|
|
44
|
+
const proxyBasePath = requiredString(value, "proxyBasePath");
|
|
45
|
+
if (!proxyBasePath.endsWith("/")) throw new Error("fundus.config: \"proxyBasePath\" must end with \"/\".");
|
|
46
|
+
const plugins = value.plugins === void 0 ? {} : value.plugins;
|
|
47
|
+
if (!isRecord(plugins)) throw new Error("fundus.config: \"plugins\" must be an object.");
|
|
48
|
+
return {
|
|
49
|
+
rawDir: resolvePath(projectRoot, requiredString(value, "rawDir")),
|
|
50
|
+
proxyDir: resolvePath(projectRoot, requiredString(value, "proxyDir")),
|
|
51
|
+
library: resolvePath(projectRoot, requiredString(value, "library")),
|
|
52
|
+
manifestsDir: resolvePath(projectRoot, requiredString(value, "manifestsDir")),
|
|
53
|
+
proxyBasePath,
|
|
54
|
+
plugins: {
|
|
55
|
+
image: { presets: mergePresets("image", IMAGE_BUILT_IN_PRESETS, plugins.image, validateImagePreset) },
|
|
56
|
+
slice: { presets: mergePresets("slice", SLICE_BUILT_IN_PRESETS, plugins.slice, validateImagePreset) },
|
|
57
|
+
video: {
|
|
58
|
+
presets: mergePresets("video", VIDEO_BUILT_IN_PRESETS, plugins.video, validateVideoPreset),
|
|
59
|
+
ffmpegPath: binaryPathOverride(projectRoot, plugins.video, "ffmpegPath"),
|
|
60
|
+
ffprobePath: binaryPathOverride(projectRoot, plugins.video, "ffprobePath")
|
|
61
|
+
},
|
|
62
|
+
audio: { presets: mergePresets("audio", AUDIO_BUILT_IN_PRESETS, plugins.audio, validateAudioPreset) }
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/** Load `fundus.config.ts` from the host project root. */
|
|
67
|
+
async function loadConfig(projectRoot) {
|
|
68
|
+
const root = resolve(projectRoot);
|
|
69
|
+
const configPath = resolve(root, "fundus.config.ts");
|
|
70
|
+
if (!existsSync(configPath)) throw new Error(`No fundus.config.ts found in ${root}.`);
|
|
71
|
+
let module;
|
|
72
|
+
try {
|
|
73
|
+
module = await createJiti(import.meta.url, { interopDefault: false }).import(configPath);
|
|
74
|
+
} catch (cause) {
|
|
75
|
+
throw new Error(`Cannot load fundus.config.ts: ${cause instanceof Error ? cause.message : String(cause)}`);
|
|
76
|
+
}
|
|
77
|
+
return resolveConfig(root, isRecord(module) && "default" in module ? module.default : module);
|
|
78
|
+
}
|
|
79
|
+
//#endregion
|
|
80
|
+
//#region src/lib/server/operations.ts
|
|
81
|
+
/**
|
|
82
|
+
* The one operations layer: builds the state payload and runs
|
|
83
|
+
* every mutation through the autosave chain — write library → process affected
|
|
84
|
+
* assets → regenerate codegen → return fresh state. Both the REST server
|
|
85
|
+
* and the CLI consume this class, so every
|
|
86
|
+
* operation has exactly one implementation and there is no other save path.
|
|
87
|
+
*/
|
|
88
|
+
/**
|
|
89
|
+
* The CLI's `--parameters` merge semantics (M7): a SHALLOW merge at the top
|
|
90
|
+
* level onto the current parameters — a nested object value replaces the whole
|
|
91
|
+
* current object under that key, a top-level `null` clears an optional field,
|
|
92
|
+
* and an asset reference is set with the normal `{"$asset": "<id>"}` marker.
|
|
93
|
+
* The merged result still passes the owning plugin's full validation.
|
|
94
|
+
*/
|
|
95
|
+
function mergeParameterPatch(currentParameters, patch) {
|
|
96
|
+
if (typeof patch !== "object" || patch === null || Array.isArray(patch)) throw new Error("The parameter patch must be a JSON object, e.g. {\"preset\": \"default\"}.");
|
|
97
|
+
const merged = typeof currentParameters === "object" && currentParameters !== null && !Array.isArray(currentParameters) ? { ...currentParameters } : {};
|
|
98
|
+
for (const [key, value] of Object.entries(patch)) if (value === null) delete merged[key];
|
|
99
|
+
else merged[key] = value;
|
|
100
|
+
return merged;
|
|
101
|
+
}
|
|
102
|
+
var FundusOperations = class {
|
|
103
|
+
#config;
|
|
104
|
+
#registry;
|
|
105
|
+
#store;
|
|
106
|
+
constructor(config, registry = serverPluginsByType) {
|
|
107
|
+
this.#config = config;
|
|
108
|
+
this.#registry = registry;
|
|
109
|
+
this.#store = new LibraryStore(config, registry);
|
|
110
|
+
}
|
|
111
|
+
get config() {
|
|
112
|
+
return this.#config;
|
|
113
|
+
}
|
|
114
|
+
get store() {
|
|
115
|
+
return this.#store;
|
|
116
|
+
}
|
|
117
|
+
/** Read-only state snapshot (no processing). */
|
|
118
|
+
async state() {
|
|
119
|
+
return this.#buildState(await this.#store.read(), []);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Ingest an upload: store the raw file + record, then let the owning
|
|
123
|
+
* plugin's optional `seedIngestParameters` derive better starting
|
|
124
|
+
* parameters from the stored raw file (slices: insets from the image
|
|
125
|
+
* dimensions, pixel ratio from the file name — the schema default can't
|
|
126
|
+
* know either). The CLI additionally applies a parameter patch and/or an
|
|
127
|
+
* explicit membership set in the same operation; a failing application
|
|
128
|
+
* rolls the whole ingest back, so a failed ingest leaves nothing behind.
|
|
129
|
+
*/
|
|
130
|
+
async ingest(options) {
|
|
131
|
+
let library = await this.#store.ingest(options);
|
|
132
|
+
try {
|
|
133
|
+
const plugin = serverPluginForType(options.type, this.#registry);
|
|
134
|
+
if (plugin.seedIngestParameters) {
|
|
135
|
+
const record = library.assets[options.id];
|
|
136
|
+
const seeded = await plugin.seedIngestParameters({
|
|
137
|
+
rawPath: join(this.#config.rawDir, record.raw),
|
|
138
|
+
rawFileName: rawFileNameOfPath(record.raw),
|
|
139
|
+
parameters: plugin.descriptor.validateParameters(record.parameters),
|
|
140
|
+
config: this.#config
|
|
141
|
+
});
|
|
142
|
+
if (seeded !== void 0) library = await this.#store.updateParameters(options.id, seeded);
|
|
143
|
+
}
|
|
144
|
+
if (options.parametersPatch !== void 0 || options.manifests !== void 0) library = await this.#applyAssetChanges(library, options.id, {
|
|
145
|
+
parametersPatch: options.parametersPatch,
|
|
146
|
+
manifests: options.manifests
|
|
147
|
+
});
|
|
148
|
+
} catch (cause) {
|
|
149
|
+
await this.#store.deleteAsset(options.id);
|
|
150
|
+
throw cause;
|
|
151
|
+
}
|
|
152
|
+
return this.#afterMutation(library);
|
|
153
|
+
}
|
|
154
|
+
/** Apply a PATCH body: parameters and/or manifests and/or a rename — in that order. */
|
|
155
|
+
async patchAsset(id, body) {
|
|
156
|
+
let library = await this.#store.read();
|
|
157
|
+
this.#requireAsset(library, id);
|
|
158
|
+
if (body.parameters !== void 0) library = await this.#store.updateParameters(id, body.parameters);
|
|
159
|
+
if (body.manifests !== void 0) {
|
|
160
|
+
if (!Array.isArray(body.manifests) || body.manifests.some((name) => typeof name !== "string")) throw new Error("\"manifests\" must be an array of manifest names.");
|
|
161
|
+
library = await this.#store.setManifests(id, body.manifests);
|
|
162
|
+
}
|
|
163
|
+
if (body.renameTo !== void 0) {
|
|
164
|
+
if (typeof body.renameTo !== "string") throw new Error("\"renameTo\" must be a string.");
|
|
165
|
+
library = await this.#store.renameAsset(id, body.renameTo);
|
|
166
|
+
}
|
|
167
|
+
if (body.folder !== void 0) {
|
|
168
|
+
if (typeof body.folder !== "string") throw new Error("\"folder\" must be a string.");
|
|
169
|
+
library = await this.#store.moveAsset(body.renameTo ?? id, body.folder);
|
|
170
|
+
}
|
|
171
|
+
return this.#afterMutation(library);
|
|
172
|
+
}
|
|
173
|
+
async moveAsset(id, folder) {
|
|
174
|
+
return this.#afterMutation(await this.#store.moveAsset(id, folder));
|
|
175
|
+
}
|
|
176
|
+
/** Move a selected asset set as one editor action and roll back on any failure. */
|
|
177
|
+
async moveAssets(assetIds, folder) {
|
|
178
|
+
const uniqueIds = [...new Set(assetIds)];
|
|
179
|
+
if (uniqueIds.length === 0) throw new Error("At least one asset id is required.");
|
|
180
|
+
const originalFolders = /* @__PURE__ */ new Map();
|
|
181
|
+
const library = await this.#store.read();
|
|
182
|
+
for (const id of uniqueIds) {
|
|
183
|
+
this.#requireAsset(library, id);
|
|
184
|
+
originalFolders.set(id, folderOfRawPath(library.assets[id].raw));
|
|
185
|
+
}
|
|
186
|
+
const movedIds = [];
|
|
187
|
+
try {
|
|
188
|
+
let updated = library;
|
|
189
|
+
for (const id of uniqueIds) {
|
|
190
|
+
if (originalFolders.get(id) === folder) continue;
|
|
191
|
+
updated = await this.#store.moveAsset(id, folder);
|
|
192
|
+
movedIds.push(id);
|
|
193
|
+
}
|
|
194
|
+
return this.#afterMutation(updated);
|
|
195
|
+
} catch (cause) {
|
|
196
|
+
for (const id of movedIds.reverse()) await this.#store.moveAsset(id, originalFolders.get(id) ?? "");
|
|
197
|
+
throw cause;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
async createFolder(path) {
|
|
201
|
+
return this.#afterMutation(await this.#store.createFolder(path));
|
|
202
|
+
}
|
|
203
|
+
async renameFolder(path, newName) {
|
|
204
|
+
return this.#afterMutation(await this.#store.renameFolder(path, newName));
|
|
205
|
+
}
|
|
206
|
+
async moveFolder(path, parent) {
|
|
207
|
+
return this.#afterMutation(await this.#store.moveFolder(path, parent));
|
|
208
|
+
}
|
|
209
|
+
async deleteFolder(path) {
|
|
210
|
+
const result = await this.#store.deleteFolder(path);
|
|
211
|
+
return this.#afterMutation(result.library);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* CLI-facing asset update (M7): shallow-merge a parameter patch and/or
|
|
215
|
+
* replace the explicit manifest membership — validating the *result* before
|
|
216
|
+
* anything is persisted, so a change that would leave the library invalid
|
|
217
|
+
* (dangling or cyclic reference, unknown manifest, invalid parameters) is
|
|
218
|
+
* rejected with nothing written. The REST `patchAsset` keeps the editor's
|
|
219
|
+
* lenient replace semantics.
|
|
220
|
+
*/
|
|
221
|
+
async setAsset(id, changes) {
|
|
222
|
+
const library = await this.#store.read();
|
|
223
|
+
this.#requireAsset(library, id);
|
|
224
|
+
return this.#afterMutation(await this.#applyAssetChanges(library, id, changes));
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* CLI-facing rename (M7): rejects a rename that would break references —
|
|
228
|
+
* a referrer keeps pointing at the old id, so renaming a referenced asset
|
|
229
|
+
* introduces dangling-reference errors. Update the referrers first.
|
|
230
|
+
*/
|
|
231
|
+
async renameAsset(id, newId) {
|
|
232
|
+
const library = await this.#store.read();
|
|
233
|
+
this.#requireAsset(library, id);
|
|
234
|
+
if (newId !== id && !Object.hasOwn(library.assets, newId)) {
|
|
235
|
+
const candidate = structuredClone(library);
|
|
236
|
+
candidate.assets[newId] = candidate.assets[id];
|
|
237
|
+
delete candidate.assets[id];
|
|
238
|
+
await this.#assertNoIntroducedIssues(library, candidate);
|
|
239
|
+
}
|
|
240
|
+
return this.#afterMutation(await this.#store.renameAsset(id, newId));
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Delete an asset: the record, its raw file, and its proxies. With
|
|
244
|
+
* `failOnIntroducedIssues` (the CLI), a delete that would break references
|
|
245
|
+
* (the asset is a reference target) is rejected before anything —
|
|
246
|
+
* including the raw file — is removed; the REST route stays lenient.
|
|
247
|
+
*/
|
|
248
|
+
async deleteAsset(id, options) {
|
|
249
|
+
if (options?.failOnIntroducedIssues) {
|
|
250
|
+
const library = await this.#store.read();
|
|
251
|
+
this.#requireAsset(library, id);
|
|
252
|
+
const candidate = structuredClone(library);
|
|
253
|
+
delete candidate.assets[id];
|
|
254
|
+
await this.#assertNoIntroducedIssues(library, candidate);
|
|
255
|
+
}
|
|
256
|
+
return this.#afterMutation(await this.#store.deleteAsset(id));
|
|
257
|
+
}
|
|
258
|
+
/** Delete a selected asset set as one lenient editor mutation. */
|
|
259
|
+
async deleteAssets(assetIds) {
|
|
260
|
+
const uniqueIds = [...new Set(assetIds)];
|
|
261
|
+
if (uniqueIds.length === 0) throw new Error("At least one asset id is required.");
|
|
262
|
+
return this.#afterMutation(await this.#store.deleteAssets(uniqueIds));
|
|
263
|
+
}
|
|
264
|
+
async createManifest(name) {
|
|
265
|
+
return this.#afterMutation(await this.#store.createManifest(name));
|
|
266
|
+
}
|
|
267
|
+
async setManifestAppearance(name, appearance) {
|
|
268
|
+
return this.#afterMutation(await this.#store.setManifestAppearance(name, appearance));
|
|
269
|
+
}
|
|
270
|
+
/** Apply a PATCH body: appearance fields and/or a rename — in that order. */
|
|
271
|
+
async patchManifest(name, body) {
|
|
272
|
+
let library = await this.#store.setManifestAppearance(name, {
|
|
273
|
+
color: body.color,
|
|
274
|
+
emoji: body.emoji
|
|
275
|
+
});
|
|
276
|
+
if (body.renameTo !== void 0) {
|
|
277
|
+
if (typeof body.renameTo !== "string") throw new Error("\"renameTo\" must be a string.");
|
|
278
|
+
library = await this.#store.renameManifest(name, body.renameTo);
|
|
279
|
+
}
|
|
280
|
+
return this.#afterMutation(library);
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Rename a manifest: rewrites every asset's membership and replaces the
|
|
284
|
+
* generated module (the old one is pruned as a stray). Host code importing
|
|
285
|
+
* the module must be updated by hand — both the file name and the exported
|
|
286
|
+
* const change with the manifest name.
|
|
287
|
+
*/
|
|
288
|
+
async renameManifest(name, newName) {
|
|
289
|
+
return this.#afterMutation(await this.#store.renameManifest(name, newName));
|
|
290
|
+
}
|
|
291
|
+
async deleteManifest(name) {
|
|
292
|
+
return this.#afterMutation(await this.#store.deleteManifest(name));
|
|
293
|
+
}
|
|
294
|
+
/** The autosave chain tail: process + regenerate, then report fresh state. */
|
|
295
|
+
async #afterMutation(library) {
|
|
296
|
+
const pipelineIssues = [];
|
|
297
|
+
const issues = await this.#store.validate(library);
|
|
298
|
+
if (issues.length === 0) try {
|
|
299
|
+
const report = await processAssets(this.#config, library, this.#registry);
|
|
300
|
+
await generateManifestModules(this.#config, library, report.proxies, this.#registry);
|
|
301
|
+
} catch (cause) {
|
|
302
|
+
pipelineIssues.push({ message: `Processing failed: ${cause instanceof Error ? cause.message : String(cause)}` });
|
|
303
|
+
}
|
|
304
|
+
return this.#buildState(library, pipelineIssues, issues);
|
|
305
|
+
}
|
|
306
|
+
async #buildState(library, extraIssues, precomputedIssues) {
|
|
307
|
+
const issues = [...precomputedIssues ?? await this.#store.validate(library), ...extraIssues];
|
|
308
|
+
const referencesByAsset = collectAllReferences(library, descriptorsByType(this.#registry));
|
|
309
|
+
const membershipByManifest = computeLibraryMembership(library, referencesByAsset);
|
|
310
|
+
const delivered = allDeliveredAssetIds(membershipByManifest);
|
|
311
|
+
const passiveManifestsByAsset = /* @__PURE__ */ new Map();
|
|
312
|
+
for (const manifestName of Object.keys(library.manifests).sort(compareCodeUnits)) for (const passiveMember of membershipByManifest[manifestName].passiveMembers) {
|
|
313
|
+
const passiveManifests = passiveManifestsByAsset.get(passiveMember.assetId) ?? [];
|
|
314
|
+
passiveManifests.push({
|
|
315
|
+
manifest: manifestName,
|
|
316
|
+
via: passiveMember.via
|
|
317
|
+
});
|
|
318
|
+
passiveManifestsByAsset.set(passiveMember.assetId, passiveManifests);
|
|
319
|
+
}
|
|
320
|
+
const incomingByAsset = /* @__PURE__ */ new Map();
|
|
321
|
+
for (const [referrerId, references] of Object.entries(referencesByAsset)) for (const reference of references) {
|
|
322
|
+
const incoming = incomingByAsset.get(reference.assetId) ?? [];
|
|
323
|
+
incoming.push({
|
|
324
|
+
field: reference.field,
|
|
325
|
+
assetId: referrerId
|
|
326
|
+
});
|
|
327
|
+
incomingByAsset.set(reference.assetId, incoming);
|
|
328
|
+
}
|
|
329
|
+
const assets = [];
|
|
330
|
+
for (const assetId of Object.keys(library.assets).sort(compareCodeUnits)) {
|
|
331
|
+
const record = library.assets[assetId];
|
|
332
|
+
const warnings = [];
|
|
333
|
+
for (const issue of issues) if (issue.assetId === assetId) warnings.push(issue.message);
|
|
334
|
+
if (record.manifests.length === 0 && !delivered.has(assetId)) warnings.push("In no manifest and not referenced by any delivered asset — nothing is processed or generated for it.");
|
|
335
|
+
let proxy = null;
|
|
336
|
+
if (delivered.has(assetId)) try {
|
|
337
|
+
const currentProxy = await readCurrentProxy(assetId, record, this.#config, this.#registry);
|
|
338
|
+
if (currentProxy) proxy = {
|
|
339
|
+
url: `/files/proxy/${encodeRelativePathForUrl(currentProxy.relativePath)}`,
|
|
340
|
+
upToDate: true,
|
|
341
|
+
...currentProxy
|
|
342
|
+
};
|
|
343
|
+
else warnings.push("Proxy is stale or missing — it will be (re)processed on the next save.");
|
|
344
|
+
} catch (cause) {
|
|
345
|
+
warnings.push(cause instanceof Error ? cause.message : String(cause));
|
|
346
|
+
}
|
|
347
|
+
assets.push({
|
|
348
|
+
id: assetId,
|
|
349
|
+
type: record.type,
|
|
350
|
+
raw: record.raw,
|
|
351
|
+
folder: folderOfRawPath(record.raw),
|
|
352
|
+
rawUrl: `/files/raw/${encodeRelativePathForUrl(record.raw)}`,
|
|
353
|
+
rawHash: record.rawHash,
|
|
354
|
+
parameters: record.parameters,
|
|
355
|
+
manifests: record.manifests,
|
|
356
|
+
passiveManifests: passiveManifestsByAsset.get(assetId) ?? [],
|
|
357
|
+
proxy,
|
|
358
|
+
warnings,
|
|
359
|
+
references: {
|
|
360
|
+
outgoing: referencesByAsset[assetId].map((reference) => ({
|
|
361
|
+
field: reference.field,
|
|
362
|
+
assetId: reference.assetId
|
|
363
|
+
})),
|
|
364
|
+
incoming: incomingByAsset.get(assetId) ?? []
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
const proxySizeByAssetId = new Map(assets.filter((asset) => asset.proxy).map((asset) => [asset.id, asset.proxy?.fileSize ?? 0]));
|
|
369
|
+
const manifestMemberships = {};
|
|
370
|
+
const manifestDeliveredBytes = {};
|
|
371
|
+
for (const manifestName of Object.keys(library.manifests).sort(compareCodeUnits)) {
|
|
372
|
+
const membership = membershipByManifest[manifestName];
|
|
373
|
+
manifestMemberships[manifestName] = {
|
|
374
|
+
explicitMemberIds: membership.explicitMemberIds,
|
|
375
|
+
passiveMembers: membership.passiveMembers
|
|
376
|
+
};
|
|
377
|
+
let deliveredBytes = 0;
|
|
378
|
+
for (const deliveredAssetId of membership.deliveredAssetIds) deliveredBytes += proxySizeByAssetId.get(deliveredAssetId) ?? 0;
|
|
379
|
+
manifestDeliveredBytes[manifestName] = deliveredBytes;
|
|
380
|
+
}
|
|
381
|
+
const presetNames = {};
|
|
382
|
+
for (const [type, plugin] of Object.entries(this.#registry)) presetNames[type] = Object.keys(plugin.presets(this.#config)).sort();
|
|
383
|
+
return {
|
|
384
|
+
library,
|
|
385
|
+
assets,
|
|
386
|
+
issues,
|
|
387
|
+
presetNames,
|
|
388
|
+
manifestMemberships,
|
|
389
|
+
manifestDeliveredBytes
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
#requireAsset(library, id) {
|
|
393
|
+
if (!Object.hasOwn(library.assets, id)) throw new Error(`Unknown asset "${id}".`);
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Apply a CLI asset change to the store, validating the resulting library
|
|
397
|
+
* on an in-memory candidate first — nothing is persisted when the change
|
|
398
|
+
* would introduce validation issues. Pre-existing issues never block an
|
|
399
|
+
* unrelated mutation (only *introduced* issues are rejected).
|
|
400
|
+
*/
|
|
401
|
+
async #applyAssetChanges(library, id, changes) {
|
|
402
|
+
const candidate = structuredClone(library);
|
|
403
|
+
const candidateRecord = candidate.assets[id];
|
|
404
|
+
if (changes.parametersPatch !== void 0) candidateRecord.parameters = serverPluginForType(candidateRecord.type, this.#registry).descriptor.validateParameters(mergeParameterPatch(candidateRecord.parameters, changes.parametersPatch));
|
|
405
|
+
if (changes.manifests !== void 0) candidateRecord.manifests = [...new Set(changes.manifests)].sort();
|
|
406
|
+
await this.#assertNoIntroducedIssues(library, candidate);
|
|
407
|
+
let updated = library;
|
|
408
|
+
if (changes.parametersPatch !== void 0) updated = await this.#store.updateParameters(id, candidateRecord.parameters);
|
|
409
|
+
if (changes.manifests !== void 0) updated = await this.#store.setManifests(id, changes.manifests);
|
|
410
|
+
return updated;
|
|
411
|
+
}
|
|
412
|
+
/** Reject a candidate library that has validation issues the current one lacks. */
|
|
413
|
+
async #assertNoIntroducedIssues(library, candidate) {
|
|
414
|
+
const existingIssueKeys = new Set((await this.#store.validate(library)).map((issue) => `${issue.assetId ?? ""}|${issue.message}`));
|
|
415
|
+
const introduced = (await this.#store.validate(candidate)).filter((issue) => !existingIssueKeys.has(`${issue.assetId ?? ""}|${issue.message}`));
|
|
416
|
+
if (introduced.length > 0) {
|
|
417
|
+
const lines = introduced.map((issue) => ` - ${issue.assetId ? `[${issue.assetId}] ` : ""}${issue.message}`);
|
|
418
|
+
throw new Error(`Rejected — the change would leave the library invalid (nothing was written):\n${lines.join("\n")}`);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
};
|
|
422
|
+
//#endregion
|
|
423
|
+
//#region src/lib/server/context.ts
|
|
424
|
+
var context;
|
|
425
|
+
function initializeFundusContext() {
|
|
426
|
+
context ??= createFundusContext();
|
|
427
|
+
return context;
|
|
428
|
+
}
|
|
429
|
+
function getFundusContext() {
|
|
430
|
+
return initializeFundusContext();
|
|
431
|
+
}
|
|
432
|
+
async function createFundusContext() {
|
|
433
|
+
const projectRoot = process.env.FUNDUS_PROJECT_ROOT;
|
|
434
|
+
if (!projectRoot || !isAbsolute(projectRoot)) throw new Error("FUNDUS_PROJECT_ROOT must be set to an absolute host project directory.");
|
|
435
|
+
const config = await loadConfig(projectRoot);
|
|
436
|
+
return {
|
|
437
|
+
config,
|
|
438
|
+
operations: new FundusOperations(config)
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
export { getFundusContext as g, initializeFundusContext as i };
|
|
443
|
+
//# sourceMappingURL=context.js-Bw4WWLhG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js-Bw4WWLhG.js","sources":["../../../../.svelte-kit/output/server/chunks/context.js"],"sourcesContent":["import { d as rawFileNameOfPath, i as folderOfRawPath } from \"./folder-path.js\";\nimport { a as encodeRelativePathForUrl, c as serverPluginForType, d as computeLibraryMembership, f as collectAllReferences, i as readCurrentProxy, l as serverPluginsByType, o as generateManifestModules, p as compareCodeUnits, r as processAssets, s as descriptorsByType, t as LibraryStore, u as allDeliveredAssetIds } from \"./library-store.js\";\nimport { b as validateAudioPreset, f as validateImagePreset, h as validateVideoPreset, m as VIDEO_BUILT_IN_PRESETS, r as SLICE_BUILT_IN_PRESETS, u as IMAGE_BUILT_IN_PRESETS, v as AUDIO_BUILT_IN_PRESETS } from \"./core.js\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { createJiti } from \"jiti\";\n//#region src/lib/server/config-loader.ts\n/**\n* Loads and resolves the host's `fundus.config.ts` through jiti, validates\n* the shape, resolves all paths to\n* absolute, and merges the built-in plugin preset defaults under the host's.\n*/\nfunction isRecord(value) {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction requiredString(config, key) {\n\tconst value = config[key];\n\tif (typeof value !== \"string\" || value.length === 0) throw new Error(`fundus.config: \"${key}\" must be a non-empty string.`);\n\treturn value;\n}\nfunction resolvePath(projectRoot, value) {\n\treturn isAbsolute(value) ? value : resolve(projectRoot, value);\n}\nfunction mergePresets(label, builtIn, pluginConfig, validatePreset) {\n\tconst merged = { ...builtIn };\n\tif (pluginConfig === void 0) return merged;\n\tif (!isRecord(pluginConfig)) throw new Error(`fundus.config: \"plugins.${label}\" must be an object.`);\n\tif (pluginConfig.presets === void 0) return merged;\n\tif (!isRecord(pluginConfig.presets)) throw new Error(`fundus.config: \"plugins.${label}.presets\" must be an object.`);\n\tfor (const [name, preset] of Object.entries(pluginConfig.presets)) merged[name] = validatePreset(name, preset);\n\treturn merged;\n}\n/** `plugins.video.ffmpegPath` / `ffprobePath`: optional system-binary overrides. */\nfunction binaryPathOverride(projectRoot, pluginConfig, key) {\n\tif (!isRecord(pluginConfig) || pluginConfig[key] === void 0) return null;\n\tconst value = pluginConfig[key];\n\tif (typeof value !== \"string\" || value.length === 0) throw new Error(`fundus.config: \"plugins.video.${key}\" must be a non-empty string.`);\n\treturn resolvePath(projectRoot, value);\n}\n/** Pure resolution step (testable without a config file on disk). */\nfunction resolveConfig(projectRoot, value) {\n\tif (!isRecord(value)) throw new Error(\"fundus.config must default-export a configuration object.\");\n\tconst proxyBasePath = requiredString(value, \"proxyBasePath\");\n\tif (!proxyBasePath.endsWith(\"/\")) throw new Error(\"fundus.config: \\\"proxyBasePath\\\" must end with \\\"/\\\".\");\n\tconst plugins = value.plugins === void 0 ? {} : value.plugins;\n\tif (!isRecord(plugins)) throw new Error(\"fundus.config: \\\"plugins\\\" must be an object.\");\n\treturn {\n\t\trawDir: resolvePath(projectRoot, requiredString(value, \"rawDir\")),\n\t\tproxyDir: resolvePath(projectRoot, requiredString(value, \"proxyDir\")),\n\t\tlibrary: resolvePath(projectRoot, requiredString(value, \"library\")),\n\t\tmanifestsDir: resolvePath(projectRoot, requiredString(value, \"manifestsDir\")),\n\t\tproxyBasePath,\n\t\tplugins: {\n\t\t\timage: { presets: mergePresets(\"image\", IMAGE_BUILT_IN_PRESETS, plugins.image, validateImagePreset) },\n\t\t\tslice: { presets: mergePresets(\"slice\", SLICE_BUILT_IN_PRESETS, plugins.slice, validateImagePreset) },\n\t\t\tvideo: {\n\t\t\t\tpresets: mergePresets(\"video\", VIDEO_BUILT_IN_PRESETS, plugins.video, validateVideoPreset),\n\t\t\t\tffmpegPath: binaryPathOverride(projectRoot, plugins.video, \"ffmpegPath\"),\n\t\t\t\tffprobePath: binaryPathOverride(projectRoot, plugins.video, \"ffprobePath\")\n\t\t\t},\n\t\t\taudio: { presets: mergePresets(\"audio\", AUDIO_BUILT_IN_PRESETS, plugins.audio, validateAudioPreset) }\n\t\t}\n\t};\n}\n/** Load `fundus.config.ts` from the host project root. */\nasync function loadConfig(projectRoot) {\n\tconst root = resolve(projectRoot);\n\tconst configPath = resolve(root, \"fundus.config.ts\");\n\tif (!existsSync(configPath)) throw new Error(`No fundus.config.ts found in ${root}.`);\n\tlet module;\n\ttry {\n\t\tmodule = await createJiti(import.meta.url, { interopDefault: false }).import(configPath);\n\t} catch (cause) {\n\t\tthrow new Error(`Cannot load fundus.config.ts: ${cause instanceof Error ? cause.message : String(cause)}`);\n\t}\n\treturn resolveConfig(root, isRecord(module) && \"default\" in module ? module.default : module);\n}\n//#endregion\n//#region src/lib/server/operations.ts\n/**\n* The one operations layer: builds the state payload and runs\n* every mutation through the autosave chain — write library → process affected\n* assets → regenerate codegen → return fresh state. Both the REST server\n* and the CLI consume this class, so every\n* operation has exactly one implementation and there is no other save path.\n*/\n/**\n* The CLI's `--parameters` merge semantics (M7): a SHALLOW merge at the top\n* level onto the current parameters — a nested object value replaces the whole\n* current object under that key, a top-level `null` clears an optional field,\n* and an asset reference is set with the normal `{\"$asset\": \"<id>\"}` marker.\n* The merged result still passes the owning plugin's full validation.\n*/\nfunction mergeParameterPatch(currentParameters, patch) {\n\tif (typeof patch !== \"object\" || patch === null || Array.isArray(patch)) throw new Error(\"The parameter patch must be a JSON object, e.g. {\\\"preset\\\": \\\"default\\\"}.\");\n\tconst merged = typeof currentParameters === \"object\" && currentParameters !== null && !Array.isArray(currentParameters) ? { ...currentParameters } : {};\n\tfor (const [key, value] of Object.entries(patch)) if (value === null) delete merged[key];\n\telse merged[key] = value;\n\treturn merged;\n}\nvar FundusOperations = class {\n\t#config;\n\t#registry;\n\t#store;\n\tconstructor(config, registry = serverPluginsByType) {\n\t\tthis.#config = config;\n\t\tthis.#registry = registry;\n\t\tthis.#store = new LibraryStore(config, registry);\n\t}\n\tget config() {\n\t\treturn this.#config;\n\t}\n\tget store() {\n\t\treturn this.#store;\n\t}\n\t/** Read-only state snapshot (no processing). */\n\tasync state() {\n\t\treturn this.#buildState(await this.#store.read(), []);\n\t}\n\t/**\n\t* Ingest an upload: store the raw file + record, then let the owning\n\t* plugin's optional `seedIngestParameters` derive better starting\n\t* parameters from the stored raw file (slices: insets from the image\n\t* dimensions, pixel ratio from the file name — the schema default can't\n\t* know either). The CLI additionally applies a parameter patch and/or an\n\t* explicit membership set in the same operation; a failing application\n\t* rolls the whole ingest back, so a failed ingest leaves nothing behind.\n\t*/\n\tasync ingest(options) {\n\t\tlet library = await this.#store.ingest(options);\n\t\ttry {\n\t\t\tconst plugin = serverPluginForType(options.type, this.#registry);\n\t\t\tif (plugin.seedIngestParameters) {\n\t\t\t\tconst record = library.assets[options.id];\n\t\t\t\tconst seeded = await plugin.seedIngestParameters({\n\t\t\t\t\trawPath: join(this.#config.rawDir, record.raw),\n\t\t\t\t\trawFileName: rawFileNameOfPath(record.raw),\n\t\t\t\t\tparameters: plugin.descriptor.validateParameters(record.parameters),\n\t\t\t\t\tconfig: this.#config\n\t\t\t\t});\n\t\t\t\tif (seeded !== void 0) library = await this.#store.updateParameters(options.id, seeded);\n\t\t\t}\n\t\t\tif (options.parametersPatch !== void 0 || options.manifests !== void 0) library = await this.#applyAssetChanges(library, options.id, {\n\t\t\t\tparametersPatch: options.parametersPatch,\n\t\t\t\tmanifests: options.manifests\n\t\t\t});\n\t\t} catch (cause) {\n\t\t\tawait this.#store.deleteAsset(options.id);\n\t\t\tthrow cause;\n\t\t}\n\t\treturn this.#afterMutation(library);\n\t}\n\t/** Apply a PATCH body: parameters and/or manifests and/or a rename — in that order. */\n\tasync patchAsset(id, body) {\n\t\tlet library = await this.#store.read();\n\t\tthis.#requireAsset(library, id);\n\t\tif (body.parameters !== void 0) library = await this.#store.updateParameters(id, body.parameters);\n\t\tif (body.manifests !== void 0) {\n\t\t\tif (!Array.isArray(body.manifests) || body.manifests.some((name) => typeof name !== \"string\")) throw new Error(\"\\\"manifests\\\" must be an array of manifest names.\");\n\t\t\tlibrary = await this.#store.setManifests(id, body.manifests);\n\t\t}\n\t\tif (body.renameTo !== void 0) {\n\t\t\tif (typeof body.renameTo !== \"string\") throw new Error(\"\\\"renameTo\\\" must be a string.\");\n\t\t\tlibrary = await this.#store.renameAsset(id, body.renameTo);\n\t\t}\n\t\tif (body.folder !== void 0) {\n\t\t\tif (typeof body.folder !== \"string\") throw new Error(\"\\\"folder\\\" must be a string.\");\n\t\t\tlibrary = await this.#store.moveAsset(body.renameTo ?? id, body.folder);\n\t\t}\n\t\treturn this.#afterMutation(library);\n\t}\n\tasync moveAsset(id, folder) {\n\t\treturn this.#afterMutation(await this.#store.moveAsset(id, folder));\n\t}\n\t/** Move a selected asset set as one editor action and roll back on any failure. */\n\tasync moveAssets(assetIds, folder) {\n\t\tconst uniqueIds = [...new Set(assetIds)];\n\t\tif (uniqueIds.length === 0) throw new Error(\"At least one asset id is required.\");\n\t\tconst originalFolders = /* @__PURE__ */ new Map();\n\t\tconst library = await this.#store.read();\n\t\tfor (const id of uniqueIds) {\n\t\t\tthis.#requireAsset(library, id);\n\t\t\toriginalFolders.set(id, folderOfRawPath(library.assets[id].raw));\n\t\t}\n\t\tconst movedIds = [];\n\t\ttry {\n\t\t\tlet updated = library;\n\t\t\tfor (const id of uniqueIds) {\n\t\t\t\tif (originalFolders.get(id) === folder) continue;\n\t\t\t\tupdated = await this.#store.moveAsset(id, folder);\n\t\t\t\tmovedIds.push(id);\n\t\t\t}\n\t\t\treturn this.#afterMutation(updated);\n\t\t} catch (cause) {\n\t\t\tfor (const id of movedIds.reverse()) await this.#store.moveAsset(id, originalFolders.get(id) ?? \"\");\n\t\t\tthrow cause;\n\t\t}\n\t}\n\tasync createFolder(path) {\n\t\treturn this.#afterMutation(await this.#store.createFolder(path));\n\t}\n\tasync renameFolder(path, newName) {\n\t\treturn this.#afterMutation(await this.#store.renameFolder(path, newName));\n\t}\n\tasync moveFolder(path, parent) {\n\t\treturn this.#afterMutation(await this.#store.moveFolder(path, parent));\n\t}\n\tasync deleteFolder(path) {\n\t\tconst result = await this.#store.deleteFolder(path);\n\t\treturn this.#afterMutation(result.library);\n\t}\n\t/**\n\t* CLI-facing asset update (M7): shallow-merge a parameter patch and/or\n\t* replace the explicit manifest membership — validating the *result* before\n\t* anything is persisted, so a change that would leave the library invalid\n\t* (dangling or cyclic reference, unknown manifest, invalid parameters) is\n\t* rejected with nothing written. The REST `patchAsset` keeps the editor's\n\t* lenient replace semantics.\n\t*/\n\tasync setAsset(id, changes) {\n\t\tconst library = await this.#store.read();\n\t\tthis.#requireAsset(library, id);\n\t\treturn this.#afterMutation(await this.#applyAssetChanges(library, id, changes));\n\t}\n\t/**\n\t* CLI-facing rename (M7): rejects a rename that would break references —\n\t* a referrer keeps pointing at the old id, so renaming a referenced asset\n\t* introduces dangling-reference errors. Update the referrers first.\n\t*/\n\tasync renameAsset(id, newId) {\n\t\tconst library = await this.#store.read();\n\t\tthis.#requireAsset(library, id);\n\t\tif (newId !== id && !Object.hasOwn(library.assets, newId)) {\n\t\t\tconst candidate = structuredClone(library);\n\t\t\tcandidate.assets[newId] = candidate.assets[id];\n\t\t\tdelete candidate.assets[id];\n\t\t\tawait this.#assertNoIntroducedIssues(library, candidate);\n\t\t}\n\t\treturn this.#afterMutation(await this.#store.renameAsset(id, newId));\n\t}\n\t/**\n\t* Delete an asset: the record, its raw file, and its proxies. With\n\t* `failOnIntroducedIssues` (the CLI), a delete that would break references\n\t* (the asset is a reference target) is rejected before anything —\n\t* including the raw file — is removed; the REST route stays lenient.\n\t*/\n\tasync deleteAsset(id, options) {\n\t\tif (options?.failOnIntroducedIssues) {\n\t\t\tconst library = await this.#store.read();\n\t\t\tthis.#requireAsset(library, id);\n\t\t\tconst candidate = structuredClone(library);\n\t\t\tdelete candidate.assets[id];\n\t\t\tawait this.#assertNoIntroducedIssues(library, candidate);\n\t\t}\n\t\treturn this.#afterMutation(await this.#store.deleteAsset(id));\n\t}\n\t/** Delete a selected asset set as one lenient editor mutation. */\n\tasync deleteAssets(assetIds) {\n\t\tconst uniqueIds = [...new Set(assetIds)];\n\t\tif (uniqueIds.length === 0) throw new Error(\"At least one asset id is required.\");\n\t\treturn this.#afterMutation(await this.#store.deleteAssets(uniqueIds));\n\t}\n\tasync createManifest(name) {\n\t\treturn this.#afterMutation(await this.#store.createManifest(name));\n\t}\n\tasync setManifestAppearance(name, appearance) {\n\t\treturn this.#afterMutation(await this.#store.setManifestAppearance(name, appearance));\n\t}\n\t/** Apply a PATCH body: appearance fields and/or a rename — in that order. */\n\tasync patchManifest(name, body) {\n\t\tlet library = await this.#store.setManifestAppearance(name, {\n\t\t\tcolor: body.color,\n\t\t\temoji: body.emoji\n\t\t});\n\t\tif (body.renameTo !== void 0) {\n\t\t\tif (typeof body.renameTo !== \"string\") throw new Error(\"\\\"renameTo\\\" must be a string.\");\n\t\t\tlibrary = await this.#store.renameManifest(name, body.renameTo);\n\t\t}\n\t\treturn this.#afterMutation(library);\n\t}\n\t/**\n\t* Rename a manifest: rewrites every asset's membership and replaces the\n\t* generated module (the old one is pruned as a stray). Host code importing\n\t* the module must be updated by hand — both the file name and the exported\n\t* const change with the manifest name.\n\t*/\n\tasync renameManifest(name, newName) {\n\t\treturn this.#afterMutation(await this.#store.renameManifest(name, newName));\n\t}\n\tasync deleteManifest(name) {\n\t\treturn this.#afterMutation(await this.#store.deleteManifest(name));\n\t}\n\t/** The autosave chain tail: process + regenerate, then report fresh state. */\n\tasync #afterMutation(library) {\n\t\tconst pipelineIssues = [];\n\t\tconst issues = await this.#store.validate(library);\n\t\tif (issues.length === 0) try {\n\t\t\tconst report = await processAssets(this.#config, library, this.#registry);\n\t\t\tawait generateManifestModules(this.#config, library, report.proxies, this.#registry);\n\t\t} catch (cause) {\n\t\t\tpipelineIssues.push({ message: `Processing failed: ${cause instanceof Error ? cause.message : String(cause)}` });\n\t\t}\n\t\treturn this.#buildState(library, pipelineIssues, issues);\n\t}\n\tasync #buildState(library, extraIssues, precomputedIssues) {\n\t\tconst issues = [...precomputedIssues ?? await this.#store.validate(library), ...extraIssues];\n\t\tconst referencesByAsset = collectAllReferences(library, descriptorsByType(this.#registry));\n\t\tconst membershipByManifest = computeLibraryMembership(library, referencesByAsset);\n\t\tconst delivered = allDeliveredAssetIds(membershipByManifest);\n\t\tconst passiveManifestsByAsset = /* @__PURE__ */ new Map();\n\t\tfor (const manifestName of Object.keys(library.manifests).sort(compareCodeUnits)) for (const passiveMember of membershipByManifest[manifestName].passiveMembers) {\n\t\t\tconst passiveManifests = passiveManifestsByAsset.get(passiveMember.assetId) ?? [];\n\t\t\tpassiveManifests.push({\n\t\t\t\tmanifest: manifestName,\n\t\t\t\tvia: passiveMember.via\n\t\t\t});\n\t\t\tpassiveManifestsByAsset.set(passiveMember.assetId, passiveManifests);\n\t\t}\n\t\tconst incomingByAsset = /* @__PURE__ */ new Map();\n\t\tfor (const [referrerId, references] of Object.entries(referencesByAsset)) for (const reference of references) {\n\t\t\tconst incoming = incomingByAsset.get(reference.assetId) ?? [];\n\t\t\tincoming.push({\n\t\t\t\tfield: reference.field,\n\t\t\t\tassetId: referrerId\n\t\t\t});\n\t\t\tincomingByAsset.set(reference.assetId, incoming);\n\t\t}\n\t\tconst assets = [];\n\t\tfor (const assetId of Object.keys(library.assets).sort(compareCodeUnits)) {\n\t\t\tconst record = library.assets[assetId];\n\t\t\tconst warnings = [];\n\t\t\tfor (const issue of issues) if (issue.assetId === assetId) warnings.push(issue.message);\n\t\t\tif (record.manifests.length === 0 && !delivered.has(assetId)) warnings.push(\"In no manifest and not referenced by any delivered asset — nothing is processed or generated for it.\");\n\t\t\tlet proxy = null;\n\t\t\tif (delivered.has(assetId)) try {\n\t\t\t\tconst currentProxy = await readCurrentProxy(assetId, record, this.#config, this.#registry);\n\t\t\t\tif (currentProxy) proxy = {\n\t\t\t\t\turl: `/files/proxy/${encodeRelativePathForUrl(currentProxy.relativePath)}`,\n\t\t\t\t\tupToDate: true,\n\t\t\t\t\t...currentProxy\n\t\t\t\t};\n\t\t\t\telse warnings.push(\"Proxy is stale or missing — it will be (re)processed on the next save.\");\n\t\t\t} catch (cause) {\n\t\t\t\twarnings.push(cause instanceof Error ? cause.message : String(cause));\n\t\t\t}\n\t\t\tassets.push({\n\t\t\t\tid: assetId,\n\t\t\t\ttype: record.type,\n\t\t\t\traw: record.raw,\n\t\t\t\tfolder: folderOfRawPath(record.raw),\n\t\t\t\trawUrl: `/files/raw/${encodeRelativePathForUrl(record.raw)}`,\n\t\t\t\trawHash: record.rawHash,\n\t\t\t\tparameters: record.parameters,\n\t\t\t\tmanifests: record.manifests,\n\t\t\t\tpassiveManifests: passiveManifestsByAsset.get(assetId) ?? [],\n\t\t\t\tproxy,\n\t\t\t\twarnings,\n\t\t\t\treferences: {\n\t\t\t\t\toutgoing: referencesByAsset[assetId].map((reference) => ({\n\t\t\t\t\t\tfield: reference.field,\n\t\t\t\t\t\tassetId: reference.assetId\n\t\t\t\t\t})),\n\t\t\t\t\tincoming: incomingByAsset.get(assetId) ?? []\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tconst proxySizeByAssetId = new Map(assets.filter((asset) => asset.proxy).map((asset) => [asset.id, asset.proxy?.fileSize ?? 0]));\n\t\tconst manifestMemberships = {};\n\t\tconst manifestDeliveredBytes = {};\n\t\tfor (const manifestName of Object.keys(library.manifests).sort(compareCodeUnits)) {\n\t\t\tconst membership = membershipByManifest[manifestName];\n\t\t\tmanifestMemberships[manifestName] = {\n\t\t\t\texplicitMemberIds: membership.explicitMemberIds,\n\t\t\t\tpassiveMembers: membership.passiveMembers\n\t\t\t};\n\t\t\tlet deliveredBytes = 0;\n\t\t\tfor (const deliveredAssetId of membership.deliveredAssetIds) deliveredBytes += proxySizeByAssetId.get(deliveredAssetId) ?? 0;\n\t\t\tmanifestDeliveredBytes[manifestName] = deliveredBytes;\n\t\t}\n\t\tconst presetNames = {};\n\t\tfor (const [type, plugin] of Object.entries(this.#registry)) presetNames[type] = Object.keys(plugin.presets(this.#config)).sort();\n\t\treturn {\n\t\t\tlibrary,\n\t\t\tassets,\n\t\t\tissues,\n\t\t\tpresetNames,\n\t\t\tmanifestMemberships,\n\t\t\tmanifestDeliveredBytes\n\t\t};\n\t}\n\t#requireAsset(library, id) {\n\t\tif (!Object.hasOwn(library.assets, id)) throw new Error(`Unknown asset \"${id}\".`);\n\t}\n\t/**\n\t* Apply a CLI asset change to the store, validating the resulting library\n\t* on an in-memory candidate first — nothing is persisted when the change\n\t* would introduce validation issues. Pre-existing issues never block an\n\t* unrelated mutation (only *introduced* issues are rejected).\n\t*/\n\tasync #applyAssetChanges(library, id, changes) {\n\t\tconst candidate = structuredClone(library);\n\t\tconst candidateRecord = candidate.assets[id];\n\t\tif (changes.parametersPatch !== void 0) candidateRecord.parameters = serverPluginForType(candidateRecord.type, this.#registry).descriptor.validateParameters(mergeParameterPatch(candidateRecord.parameters, changes.parametersPatch));\n\t\tif (changes.manifests !== void 0) candidateRecord.manifests = [...new Set(changes.manifests)].sort();\n\t\tawait this.#assertNoIntroducedIssues(library, candidate);\n\t\tlet updated = library;\n\t\tif (changes.parametersPatch !== void 0) updated = await this.#store.updateParameters(id, candidateRecord.parameters);\n\t\tif (changes.manifests !== void 0) updated = await this.#store.setManifests(id, changes.manifests);\n\t\treturn updated;\n\t}\n\t/** Reject a candidate library that has validation issues the current one lacks. */\n\tasync #assertNoIntroducedIssues(library, candidate) {\n\t\tconst existingIssueKeys = new Set((await this.#store.validate(library)).map((issue) => `${issue.assetId ?? \"\"}|${issue.message}`));\n\t\tconst introduced = (await this.#store.validate(candidate)).filter((issue) => !existingIssueKeys.has(`${issue.assetId ?? \"\"}|${issue.message}`));\n\t\tif (introduced.length > 0) {\n\t\t\tconst lines = introduced.map((issue) => ` - ${issue.assetId ? `[${issue.assetId}] ` : \"\"}${issue.message}`);\n\t\t\tthrow new Error(`Rejected — the change would leave the library invalid (nothing was written):\\n${lines.join(\"\\n\")}`);\n\t\t}\n\t}\n};\n//#endregion\n//#region src/lib/server/context.ts\nvar context;\nfunction initializeFundusContext() {\n\tcontext ??= createFundusContext();\n\treturn context;\n}\nfunction getFundusContext() {\n\treturn initializeFundusContext();\n}\nasync function createFundusContext() {\n\tconst projectRoot = process.env.FUNDUS_PROJECT_ROOT;\n\tif (!projectRoot || !isAbsolute(projectRoot)) throw new Error(\"FUNDUS_PROJECT_ROOT must be set to an absolute host project directory.\");\n\tconst config = await loadConfig(projectRoot);\n\treturn {\n\t\tconfig,\n\t\toperations: new FundusOperations(config)\n\t};\n}\n//#endregion\nexport { initializeFundusContext as n, getFundusContext as t };\n"],"names":[],"mappings":";;;;;;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,QAAQ,CAAC,KAAK,EAAE;AACzB,CAAC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAC5E;AACA,SAAS,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE;AACrC,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;AAC1B,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,gBAAgB,EAAE,GAAG,CAAC,6BAA6B,CAAC,CAAC;AAC5H,CAAC,OAAO,KAAK;AACb;AACA,SAAS,WAAW,CAAC,WAAW,EAAE,KAAK,EAAE;AACzC,CAAC,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC;AAC/D;AACA,SAAS,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE;AACpE,CAAC,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE;AAC9B,CAAC,IAAI,YAAY,KAAK,MAAM,EAAE,OAAO,MAAM;AAC3C,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,wBAAwB,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC;AACrG,CAAC,IAAI,YAAY,CAAC,OAAO,KAAK,MAAM,EAAE,OAAO,MAAM;AACnD,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,wBAAwB,EAAE,KAAK,CAAC,4BAA4B,CAAC,CAAC;AACrH,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC;AAC/G,CAAC,OAAO,MAAM;AACd;AACA;AACA,SAAS,kBAAkB,CAAC,WAAW,EAAE,YAAY,EAAE,GAAG,EAAE;AAC5D,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,MAAM,EAAE,OAAO,IAAI;AACzE,CAAC,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC;AAChC,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,8BAA8B,EAAE,GAAG,CAAC,6BAA6B,CAAC,CAAC;AAC1I,CAAC,OAAO,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC;AACvC;AACA;AACA,SAAS,aAAa,CAAC,WAAW,EAAE,KAAK,EAAE;AAC3C,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC;AACnG,CAAC,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,EAAE,eAAe,CAAC;AAC7D,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC;AAC3G,CAAC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,KAAK,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO;AAC9D,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC;AACzF,CAAC,OAAO;AACR,EAAE,MAAM,EAAE,WAAW,CAAC,WAAW,EAAE,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AACnE,EAAE,QAAQ,EAAE,WAAW,CAAC,WAAW,EAAE,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;AACvE,EAAE,OAAO,EAAE,WAAW,CAAC,WAAW,EAAE,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AACrE,EAAE,YAAY,EAAE,WAAW,CAAC,WAAW,EAAE,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;AAC/E,EAAE,aAAa;AACf,EAAE,OAAO,EAAE;AACX,GAAG,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,sBAAsB,EAAE,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,EAAE;AACxG,GAAG,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,sBAAsB,EAAE,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,EAAE;AACxG,GAAG,KAAK,EAAE;AACV,IAAI,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,sBAAsB,EAAE,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC;AAC9F,IAAI,UAAU,EAAE,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC;AAC5E,IAAI,WAAW,EAAE,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC,KAAK,EAAE,aAAa;AAC7E,IAAI;AACJ,GAAG,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,sBAAsB,EAAE,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC;AACtG;AACA,EAAE;AACF;AACA;AACA,eAAe,UAAU,CAAC,WAAW,EAAE;AACvC,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC;AAClC,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,kBAAkB,CAAC;AACrD,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,6BAA6B,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACtF,CAAC,IAAI,MAAM;AACX,CAAC,IAAI;AACL,EAAE,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;AAC1F,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE;AACjB,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,8BAA8B,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC5G,CAAC;AACD,CAAC,OAAO,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,SAAS,IAAI,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,mBAAmB,CAAC,iBAAiB,EAAE,KAAK,EAAE;AACvD,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC;AACvK,CAAC,MAAM,MAAM,GAAG,OAAO,iBAAiB,KAAK,QAAQ,IAAI,iBAAiB,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,iBAAiB,EAAE,GAAG,EAAE;AACxJ,CAAC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,KAAK,IAAI,EAAE,OAAO,MAAM,CAAC,GAAG,CAAC;AACzF,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK;AACzB,CAAC,OAAO,MAAM;AACd;AACA,IAAI,gBAAgB,GAAG,MAAM;AAC7B,CAAC,OAAO;AACR,CAAC,SAAS;AACV,CAAC,MAAM;AACP,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,GAAG,mBAAmB,EAAE;AACrD,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM;AACvB,EAAE,IAAI,CAAC,SAAS,GAAG,QAAQ;AAC3B,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;AAClD,CAAC;AACD,CAAC,IAAI,MAAM,GAAG;AACd,EAAE,OAAO,IAAI,CAAC,OAAO;AACrB,CAAC;AACD,CAAC,IAAI,KAAK,GAAG;AACb,EAAE,OAAO,IAAI,CAAC,MAAM;AACpB,CAAC;AACD;AACA,CAAC,MAAM,KAAK,GAAG;AACf,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;AACvD,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,MAAM,CAAC,OAAO,EAAE;AACvB,EAAE,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;AACjD,EAAE,IAAI;AACN,GAAG,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;AACnE,GAAG,IAAI,MAAM,CAAC,oBAAoB,EAAE;AACpC,IAAI,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;AAC7C,IAAI,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC;AACrD,KAAK,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC;AACnD,KAAK,WAAW,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC;AAC/C,KAAK,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC;AACxE,KAAK,MAAM,EAAE,IAAI,CAAC;AAClB,KAAK,CAAC;AACN,IAAI,IAAI,MAAM,KAAK,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC;AAC3F,GAAG;AACH,GAAG,IAAI,OAAO,CAAC,eAAe,KAAK,KAAK,CAAC,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE;AACxI,IAAI,eAAe,EAAE,OAAO,CAAC,eAAe;AAC5C,IAAI,SAAS,EAAE,OAAO,CAAC;AACvB,IAAI,CAAC;AACL,EAAE,CAAC,CAAC,OAAO,KAAK,EAAE;AAClB,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;AAC5C,GAAG,MAAM,KAAK;AACd,EAAE;AACF,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;AACrC,CAAC;AACD;AACA,CAAC,MAAM,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE;AAC5B,EAAE,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AACxC,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;AACjC,EAAE,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;AACnG,EAAE,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,EAAE;AACjC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,QAAQ,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC;AACtK,GAAG,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC;AAC/D,EAAE;AACF,EAAE,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE;AAChC,GAAG,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC;AAC3F,GAAG,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC;AAC7D,EAAE;AACF,EAAE,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE;AAC9B,GAAG,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC;AACvF,GAAG,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC;AAC1E,EAAE;AACF,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;AACrC,CAAC;AACD,CAAC,MAAM,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE;AAC7B,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AACrE,CAAC;AACD;AACA,CAAC,MAAM,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE;AACpC,EAAE,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC1C,EAAE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC;AACnF,EAAE,MAAM,eAAe,mBAAmB,IAAI,GAAG,EAAE;AACnD,EAAE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AAC1C,EAAE,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE;AAC9B,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;AAClC,GAAG,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;AACnE,EAAE;AACF,EAAE,MAAM,QAAQ,GAAG,EAAE;AACrB,EAAE,IAAI;AACN,GAAG,IAAI,OAAO,GAAG,OAAO;AACxB,GAAG,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE;AAC/B,IAAI,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE;AAC5C,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC;AACrD,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;AACrB,GAAG;AACH,GAAG,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;AACtC,EAAE,CAAC,CAAC,OAAO,KAAK,EAAE;AAClB,GAAG,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;AACtG,GAAG,MAAM,KAAK;AACd,EAAE;AACF,CAAC;AACD,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE;AAC1B,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAClE,CAAC;AACD,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE;AACnC,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC3E,CAAC;AACD,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE;AAChC,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACxE,CAAC;AACD,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE;AAC1B,EAAE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC;AACrD,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC;AAC5C,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE;AAC7B,EAAE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AAC1C,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;AACjC,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;AACjF,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE;AAC9B,EAAE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AAC1C,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;AACjC,EAAE,IAAI,KAAK,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;AAC7D,GAAG,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC;AAC7C,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;AACjD,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;AAC9B,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,EAAE,SAAS,CAAC;AAC3D,EAAE;AACF,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AACtE,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE;AAChC,EAAE,IAAI,OAAO,EAAE,sBAAsB,EAAE;AACvC,GAAG,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AAC3C,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;AAClC,GAAG,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC;AAC7C,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;AAC9B,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,EAAE,SAAS,CAAC;AAC3D,EAAE;AACF,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AAC/D,CAAC;AACD;AACA,CAAC,MAAM,YAAY,CAAC,QAAQ,EAAE;AAC9B,EAAE,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC1C,EAAE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC;AACnF,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;AACvE,CAAC;AACD,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE;AAC5B,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC;AACD,CAAC,MAAM,qBAAqB,CAAC,IAAI,EAAE,UAAU,EAAE;AAC/C,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACvF,CAAC;AACD;AACA,CAAC,MAAM,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE;AACjC,EAAE,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE;AAC9D,GAAG,KAAK,EAAE,IAAI,CAAC,KAAK;AACpB,GAAG,KAAK,EAAE,IAAI,CAAC;AACf,GAAG,CAAC;AACJ,EAAE,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE;AAChC,GAAG,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC;AAC3F,GAAG,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;AAClE,EAAE;AACF,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;AACrC,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE;AACrC,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7E,CAAC;AACD,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE;AAC5B,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC;AACD;AACA,CAAC,MAAM,cAAc,CAAC,OAAO,EAAE;AAC/B,EAAE,MAAM,cAAc,GAAG,EAAE;AAC3B,EAAE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;AACpD,EAAE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,IAAI;AAC/B,GAAG,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;AAC5E,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;AACvF,EAAE,CAAC,CAAC,OAAO,KAAK,EAAE;AAClB,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,mBAAmB,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACnH,EAAE;AACF,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC;AAC1D,CAAC;AACD,CAAC,MAAM,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE;AAC5D,EAAE,MAAM,MAAM,GAAG,CAAC,GAAG,iBAAiB,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,WAAW,CAAC;AAC9F,EAAE,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC5F,EAAE,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,OAAO,EAAE,iBAAiB,CAAC;AACnF,EAAE,MAAM,SAAS,GAAG,oBAAoB,CAAC,oBAAoB,CAAC;AAC9D,EAAE,MAAM,uBAAuB,mBAAmB,IAAI,GAAG,EAAE;AAC3D,EAAE,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,KAAK,MAAM,aAAa,IAAI,oBAAoB,CAAC,YAAY,CAAC,CAAC,cAAc,EAAE;AACnK,GAAG,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE;AACpF,GAAG,gBAAgB,CAAC,IAAI,CAAC;AACzB,IAAI,QAAQ,EAAE,YAAY;AAC1B,IAAI,GAAG,EAAE,aAAa,CAAC;AACvB,IAAI,CAAC;AACL,GAAG,uBAAuB,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,gBAAgB,CAAC;AACvE,EAAE;AACF,EAAE,MAAM,eAAe,mBAAmB,IAAI,GAAG,EAAE;AACnD,EAAE,KAAK,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;AAChH,GAAG,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE;AAChE,GAAG,QAAQ,CAAC,IAAI,CAAC;AACjB,IAAI,KAAK,EAAE,SAAS,CAAC,KAAK;AAC1B,IAAI,OAAO,EAAE;AACb,IAAI,CAAC;AACL,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC;AACnD,EAAE;AACF,EAAE,MAAM,MAAM,GAAG,EAAE;AACnB,EAAE,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE;AAC5E,GAAG,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;AACzC,GAAG,MAAM,QAAQ,GAAG,EAAE;AACtB,GAAG,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AAC1F,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,sGAAsG,CAAC;AACtL,GAAG,IAAI,KAAK,GAAG,IAAI;AACnB,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI;AACnC,IAAI,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;AAC9F,IAAI,IAAI,YAAY,EAAE,KAAK,GAAG;AAC9B,KAAK,GAAG,EAAE,CAAC,aAAa,EAAE,wBAAwB,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;AAC/E,KAAK,QAAQ,EAAE,IAAI;AACnB,KAAK,GAAG;AACR,KAAK;AACL,SAAS,QAAQ,CAAC,IAAI,CAAC,wEAAwE,CAAC;AAChG,GAAG,CAAC,CAAC,OAAO,KAAK,EAAE;AACnB,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AACzE,GAAG;AACH,GAAG,MAAM,CAAC,IAAI,CAAC;AACf,IAAI,EAAE,EAAE,OAAO;AACf,IAAI,IAAI,EAAE,MAAM,CAAC,IAAI;AACrB,IAAI,GAAG,EAAE,MAAM,CAAC,GAAG;AACnB,IAAI,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC;AACvC,IAAI,MAAM,EAAE,CAAC,WAAW,EAAE,wBAAwB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAChE,IAAI,OAAO,EAAE,MAAM,CAAC,OAAO;AAC3B,IAAI,UAAU,EAAE,MAAM,CAAC,UAAU;AACjC,IAAI,SAAS,EAAE,MAAM,CAAC,SAAS;AAC/B,IAAI,gBAAgB,EAAE,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;AAChE,IAAI,KAAK;AACT,IAAI,QAAQ;AACZ,IAAI,UAAU,EAAE;AAChB,KAAK,QAAQ,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,MAAM;AAC9D,MAAM,KAAK,EAAE,SAAS,CAAC,KAAK;AAC5B,MAAM,OAAO,EAAE,SAAS,CAAC;AACzB,MAAM,CAAC,CAAC;AACR,KAAK,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI;AAC/C;AACA,IAAI,CAAC;AACL,EAAE;AACF,EAAE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;AAClI,EAAE,MAAM,mBAAmB,GAAG,EAAE;AAChC,EAAE,MAAM,sBAAsB,GAAG,EAAE;AACnC,EAAE,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE;AACpF,GAAG,MAAM,UAAU,GAAG,oBAAoB,CAAC,YAAY,CAAC;AACxD,GAAG,mBAAmB,CAAC,YAAY,CAAC,GAAG;AACvC,IAAI,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;AACnD,IAAI,cAAc,EAAE,UAAU,CAAC;AAC/B,IAAI;AACJ,GAAG,IAAI,cAAc,GAAG,CAAC;AACzB,GAAG,KAAK,MAAM,gBAAgB,IAAI,UAAU,CAAC,iBAAiB,EAAE,cAAc,IAAI,kBAAkB,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC;AAC/H,GAAG,sBAAsB,CAAC,YAAY,CAAC,GAAG,cAAc;AACxD,EAAE;AACF,EAAE,MAAM,WAAW,GAAG,EAAE;AACxB,EAAE,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE;AACnI,EAAE,OAAO;AACT,GAAG,OAAO;AACV,GAAG,MAAM;AACT,GAAG,MAAM;AACT,GAAG,WAAW;AACd,GAAG,mBAAmB;AACtB,GAAG;AACH,GAAG;AACH,CAAC;AACD,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,EAAE;AAC5B,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AACnF,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,MAAM,kBAAkB,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE;AAChD,EAAE,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC;AAC5C,EAAE,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;AAC9C,EAAE,IAAI,OAAO,CAAC,eAAe,KAAK,MAAM,EAAE,eAAe,CAAC,UAAU,GAAG,mBAAmB,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;AACxO,EAAE,IAAI,OAAO,CAAC,SAAS,KAAK,MAAM,EAAE,eAAe,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE;AACtG,EAAE,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,EAAE,SAAS,CAAC;AAC1D,EAAE,IAAI,OAAO,GAAG,OAAO;AACvB,EAAE,IAAI,OAAO,CAAC,eAAe,KAAK,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE,eAAe,CAAC,UAAU,CAAC;AACtH,EAAE,IAAI,OAAO,CAAC,SAAS,KAAK,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC;AACnG,EAAE,OAAO,OAAO;AAChB,CAAC;AACD;AACA,CAAC,MAAM,yBAAyB,CAAC,OAAO,EAAE,SAAS,EAAE;AACrD,EAAE,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACpI,EAAE,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACjJ,EAAE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7B,GAAG,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/G,GAAG,MAAM,IAAI,KAAK,CAAC,CAAC,8EAA8E,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACvH,EAAE;AACF,CAAC;AACD,CAAC;AACD;AACA;AACA,IAAI,OAAO;AACX,SAAS,uBAAuB,GAAG;AACnC,CAAC,OAAO,KAAK,mBAAmB,EAAE;AAClC,CAAC,OAAO,OAAO;AACf;AACA,SAAS,gBAAgB,GAAG;AAC5B,CAAC,OAAO,uBAAuB,EAAE;AACjC;AACA,eAAe,mBAAmB,GAAG;AACrC,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB;AACpD,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC;AACxI,CAAC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC;AAC7C,CAAC,OAAO;AACR,EAAE,MAAM;AACR,EAAE,UAAU,EAAE,IAAI,gBAAgB,CAAC,MAAM;AACzC,EAAE;AACF;;;;"}
|