fundus 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -2
- package/build/client/_app/immutable/assets/2.B5tQm8hR.css +1 -0
- package/build/client/_app/immutable/assets/2.B5tQm8hR.css.br +0 -0
- package/build/client/_app/immutable/assets/2.B5tQm8hR.css.gz +0 -0
- package/build/client/_app/immutable/assets/{3.ChSpCG-T.css → 3.CmXD8k9d.css} +1 -1
- package/build/client/_app/immutable/assets/3.CmXD8k9d.css.br +0 -0
- package/build/client/_app/immutable/assets/3.CmXD8k9d.css.gz +0 -0
- package/build/client/_app/immutable/chunks/BPiGyn-T.js +1 -0
- package/build/client/_app/immutable/chunks/BPiGyn-T.js.br +0 -0
- package/build/client/_app/immutable/chunks/BPiGyn-T.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BPJdVAz5.js → BoEHtxM8.js} +1 -1
- package/build/client/_app/immutable/chunks/BoEHtxM8.js.br +0 -0
- package/build/client/_app/immutable/chunks/BoEHtxM8.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C-T1_s5P.js +1 -0
- package/build/client/_app/immutable/chunks/C-T1_s5P.js.br +0 -0
- package/build/client/_app/immutable/chunks/C-T1_s5P.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CLcR3DTB.js → CeJsL6hj.js} +1 -1
- package/build/client/_app/immutable/chunks/CeJsL6hj.js.br +0 -0
- package/build/client/_app/immutable/chunks/CeJsL6hj.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CLZr1L0m.js → Cq4Yaq35.js} +2 -2
- package/build/client/_app/immutable/chunks/Cq4Yaq35.js.br +0 -0
- package/build/client/_app/immutable/chunks/{CLZr1L0m.js.gz → Cq4Yaq35.js.gz} +0 -0
- package/build/client/_app/immutable/chunks/D5sQSsUv.js +1 -0
- package/build/client/_app/immutable/chunks/D5sQSsUv.js.br +0 -0
- package/build/client/_app/immutable/chunks/D5sQSsUv.js.gz +0 -0
- package/build/client/_app/immutable/entry/{app.xrZU0FIS.js → app.BQ4TfPHG.js} +2 -2
- package/build/client/_app/immutable/entry/app.BQ4TfPHG.js.br +0 -0
- package/build/client/_app/immutable/entry/app.BQ4TfPHG.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.COP9tIRH.js +1 -0
- package/build/client/_app/immutable/entry/start.COP9tIRH.js.br +0 -0
- package/build/client/_app/immutable/entry/start.COP9tIRH.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.CftchwYV.js +2 -0
- package/build/client/_app/immutable/nodes/0.CftchwYV.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.CftchwYV.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{1.0KLmHZC4.js → 1.C8DOqctV.js} +1 -1
- package/build/client/_app/immutable/nodes/1.C8DOqctV.js.br +1 -0
- package/build/client/_app/immutable/nodes/1.C8DOqctV.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.BR8OVsS9.js +3 -0
- package/build/client/_app/immutable/nodes/2.BR8OVsS9.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.BR8OVsS9.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.BO5hcxIH.js +1 -0
- package/build/client/_app/immutable/nodes/3.BO5hcxIH.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.BO5hcxIH.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{4.CsuRmAsC.js → 4.DTaH-k-c.js} +1 -1
- package/build/client/_app/immutable/nodes/4.DTaH-k-c.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.DTaH-k-c.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/handler.js +7 -7
- package/build/index.js +7 -7
- package/build/server/chunks/chunks/asset-id.js-CFsW8jeL.js +48 -0
- package/build/server/chunks/chunks/asset-id.js-CFsW8jeL.js.map +1 -0
- package/build/server/chunks/chunks/{context.js-B77ZAVLi.js → context.js-CG2t-ufq.js} +568 -25
- package/build/server/chunks/chunks/context.js-CG2t-ufq.js.map +1 -0
- package/build/server/chunks/chunks/{library-store.js-DJ-JRE-g.js → contract.js-sHny3b-s.js} +133 -359
- package/build/server/chunks/chunks/contract.js-sHny3b-s.js.map +1 -0
- package/build/server/chunks/chunks/{core.js-EA_ysb1J.js → core.js-Clg1CHb6.js} +2 -48
- package/build/server/chunks/chunks/core.js-Clg1CHb6.js.map +1 -0
- package/build/server/chunks/chunks/{exports.js-ScnpVC8o.js → exports.js-rOfFZumP.js} +2 -2
- package/build/server/chunks/chunks/{exports.js-ScnpVC8o.js.map → exports.js-rOfFZumP.js.map} +1 -1
- package/build/server/chunks/chunks/{http.js-DyoR9XRI.js → http.js--6sDZFfm.js} +35 -3
- package/build/server/chunks/chunks/http.js--6sDZFfm.js.map +1 -0
- package/build/server/chunks/chunks/{internal.js-D_k3d8Qh.js → internal.js-DnveDsYn.js} +3 -3
- package/build/server/chunks/chunks/{internal.js-D_k3d8Qh.js.map → internal.js-DnveDsYn.js.map} +1 -1
- package/build/server/chunks/chunks/internal2.js-BlXt2rfE.js.map +1 -1
- package/build/server/chunks/chunks/raw-reconciliation.js-DOFtjkgu.js +343 -0
- package/build/server/chunks/chunks/raw-reconciliation.js-DOFtjkgu.js.map +1 -0
- package/build/server/chunks/chunks/raw-reconciliation2.js-DFwky2ou.js +11 -0
- package/build/server/chunks/chunks/raw-reconciliation2.js-DFwky2ou.js.map +1 -0
- package/build/server/chunks/chunks/{shared.js-MLULcRRJ.js → shared.js-DtvIbMLj.js} +2 -2
- package/build/server/chunks/chunks/{shared.js-MLULcRRJ.js.map → shared.js-DtvIbMLj.js.map} +1 -1
- package/build/server/chunks/chunks/{utils.js-D64X9Sx8.js → utils.js-bP1j9RdM.js} +3 -3
- package/build/server/chunks/chunks/{utils.js-D64X9Sx8.js.map → utils.js-bP1j9RdM.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-H4Pq1KAE.js → _server.ts.js-CkSErIdC.js} +7 -5
- package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-H4Pq1KAE.js.map → _server.ts.js-CkSErIdC.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-BI3KHSfE.js → _server.ts.js-BfdsBPWo.js} +11 -6
- package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-BI3KHSfE.js.map → _server.ts.js-BfdsBPWo.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/_id_/raw/{_server.ts.js-BlNYUbXX.js → _server.ts.js-D0aKDq87.js} +11 -6
- package/build/server/chunks/entries/endpoints/api/assets/_id_/raw/{_server.ts.js-BlNYUbXX.js.map → _server.ts.js-D0aKDq87.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/_id_/reimport/_server.ts.js-DsX_m2gc.js +31 -0
- package/build/server/chunks/entries/endpoints/api/assets/_id_/reimport/_server.ts.js-DsX_m2gc.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-j-_N540j.js → _server.ts.js-nfThjRxs.js} +11 -6
- package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-j-_N540j.js.map → _server.ts.js-nfThjRxs.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-BHKobzAg.js → _server.ts.js-CseHmsYB.js} +11 -6
- package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-BHKobzAg.js.map → _server.ts.js-CseHmsYB.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-BFKjIOCv.js → _server.ts.js-CHiICsyC.js} +11 -6
- package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-BFKjIOCv.js.map → _server.ts.js-CHiICsyC.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-BxZeVw8y.js → _server.ts.js-Dgf46K5u.js} +11 -6
- package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-BxZeVw8y.js.map → _server.ts.js-Dgf46K5u.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-CO36U_CT.js → _server.ts.js-DwQJUZFa.js} +11 -6
- package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-CO36U_CT.js.map → _server.ts.js-DwQJUZFa.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/imports/_server.ts.js-BnKS8nVF.js +37 -0
- package/build/server/chunks/entries/endpoints/api/imports/_server.ts.js-BnKS8nVF.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-CBlg1Bkl.js → _server.ts.js-BrDbLcyO.js} +11 -6
- package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-CBlg1Bkl.js.map → _server.ts.js-BrDbLcyO.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-DcGLCjIs.js → _server.ts.js-DIUiQuyd.js} +11 -6
- package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-DcGLCjIs.js.map → _server.ts.js-DIUiQuyd.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/raw/adopt/{_server.ts.js-AqhtjOiL.js → _server.ts.js-BrReStaf.js} +11 -6
- package/build/server/chunks/entries/endpoints/api/raw/adopt/{_server.ts.js-AqhtjOiL.js.map → _server.ts.js-BrReStaf.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/raw/edited/accept/{_server.ts.js-CSa6-DcU.js → _server.ts.js-B31iGwJ-.js} +11 -6
- package/build/server/chunks/entries/endpoints/api/raw/edited/accept/{_server.ts.js-CSa6-DcU.js.map → _server.ts.js-B31iGwJ-.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/raw/edited/dismiss/{_server.ts.js-DnzZUoAo.js → _server.ts.js-DeZQFNdj.js} +11 -6
- package/build/server/chunks/entries/endpoints/api/raw/edited/dismiss/{_server.ts.js-DnzZUoAo.js.map → _server.ts.js-DeZQFNdj.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/reconcile/{_server.ts.js-B0KMprKq.js → _server.ts.js-DhDhUU7V.js} +11 -6
- package/build/server/chunks/entries/endpoints/api/reconcile/{_server.ts.js-B0KMprKq.js.map → _server.ts.js-DhDhUU7V.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/reveal/{_server.ts.js-Dhj5O9Lv.js → _server.ts.js-DGkPIMcq.js} +11 -6
- package/build/server/chunks/entries/endpoints/api/reveal/_server.ts.js-DGkPIMcq.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-B1N9o1Ne.js → _server.ts.js-BTQgWDH1.js} +11 -6
- package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-B1N9o1Ne.js.map → _server.ts.js-BTQgWDH1.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-B6HbnRqq.js → _server.ts.js-DB3i4juR.js} +7 -5
- package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-B6HbnRqq.js.map → _server.ts.js-DB3i4juR.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/files/proxy/_...path_/{_server.ts.js-7wzPyG9v.js → _server.ts.js-kmc-gejQ.js} +11 -6
- package/build/server/chunks/entries/endpoints/files/proxy/_...path_/{_server.ts.js-7wzPyG9v.js.map → _server.ts.js-kmc-gejQ.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-BWztxYge.js → _server.ts.js-B8EE1DD9.js} +11 -6
- package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-BWztxYge.js.map → _server.ts.js-B8EE1DD9.js.map} +1 -1
- package/build/server/chunks/entries/{hooks.server.js-CVKLksJ1.js → hooks.server.js-DbBA5yYQ.js} +10 -5
- package/build/server/chunks/entries/{hooks.server.js-CVKLksJ1.js.map → hooks.server.js-DbBA5yYQ.js.map} +1 -1
- package/build/server/chunks/{handler-C22elTeC.js → handler-J6aKdov3.js} +5 -5
- package/build/server/chunks/{handler-C22elTeC.js.map → handler-J6aKdov3.js.map} +1 -1
- package/build/server/chunks/{index.js-CqN1-wfe.js → index.js-CsvWJ7Qu.js} +5 -5
- package/build/server/chunks/{index.js-CqN1-wfe.js.map → index.js-CsvWJ7Qu.js.map} +1 -1
- package/build/server/chunks/{manifest.js-5SY_cfDE.js → manifest.js-wHtZ9vlA.js} +40 -26
- package/build/server/chunks/manifest.js-wHtZ9vlA.js.map +1 -0
- package/build/server/chunks/nodes/0.js-By6-kbk6.js +11 -0
- package/build/server/chunks/nodes/0.js-By6-kbk6.js.map +1 -0
- package/build/server/chunks/nodes/1.js-CrPfmKpN.js +7 -0
- package/build/server/chunks/nodes/{1.js-B92oHDrL.js.map → 1.js-CrPfmKpN.js.map} +1 -1
- package/build/server/chunks/nodes/2.js-C-i3Y5t2.js +7 -0
- package/build/server/chunks/nodes/2.js-C-i3Y5t2.js.map +1 -0
- package/build/server/chunks/nodes/3.js-C1gcIGeV.js +7 -0
- package/build/server/chunks/nodes/{3.js-C1yCh8Tq.js.map → 3.js-C1gcIGeV.js.map} +1 -1
- package/build/server/chunks/nodes/4.js-tgwl3VD3.js +7 -0
- package/build/server/chunks/nodes/{4.js-B9BEDKwq.js.map → 4.js-tgwl3VD3.js.map} +1 -1
- package/dist/cli.js +2 -0
- package/dist/config.d.ts +1 -1
- package/dist/core/api-types.d.ts +12 -1
- package/dist/core/config.d.ts +12 -0
- package/dist/core/index.d.ts +3 -2
- package/dist/core/library.d.ts +8 -1
- package/dist/core/library.js +30 -6
- package/dist/server/cli-commands.d.ts +2 -1
- package/dist/server/cli-commands.js +155 -34
- package/dist/server/config-loader.d.ts +9 -1
- package/dist/server/config-loader.js +26 -1
- package/dist/server/http.d.ts +1 -0
- package/dist/server/http.js +37 -0
- package/dist/server/importers/contract.d.ts +29 -0
- package/dist/server/importers/contract.js +13 -0
- package/dist/server/importers/figma.d.ts +21 -0
- package/dist/server/importers/figma.js +386 -0
- package/dist/server/importers/file.d.ts +6 -0
- package/dist/server/importers/file.js +33 -0
- package/dist/server/importers/pinned-https.d.ts +23 -0
- package/dist/server/importers/pinned-https.js +60 -0
- package/dist/server/importers/registry.d.ts +12 -0
- package/dist/server/importers/registry.js +31 -0
- package/dist/server/importers.d.ts +2 -0
- package/dist/server/importers.js +7 -0
- package/dist/server/library-store.d.ts +19 -1
- package/dist/server/library-store.js +110 -14
- package/dist/server/operations.d.ts +13 -1
- package/dist/server/operations.js +159 -23
- package/package.json +1 -1
- package/build/client/_app/immutable/assets/2.AA5XNK5k.css +0 -1
- package/build/client/_app/immutable/assets/2.AA5XNK5k.css.br +0 -0
- package/build/client/_app/immutable/assets/2.AA5XNK5k.css.gz +0 -0
- package/build/client/_app/immutable/assets/3.ChSpCG-T.css.br +0 -0
- package/build/client/_app/immutable/assets/3.ChSpCG-T.css.gz +0 -0
- package/build/client/_app/immutable/chunks/BPJdVAz5.js.br +0 -0
- package/build/client/_app/immutable/chunks/BPJdVAz5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CLZr1L0m.js.br +0 -0
- package/build/client/_app/immutable/chunks/CLcR3DTB.js.br +0 -4
- package/build/client/_app/immutable/chunks/CLcR3DTB.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DkK6dXFi.js +0 -1
- package/build/client/_app/immutable/chunks/DkK6dXFi.js.br +0 -0
- package/build/client/_app/immutable/chunks/DkK6dXFi.js.gz +0 -0
- package/build/client/_app/immutable/chunks/RVmTMq_g.js +0 -1
- package/build/client/_app/immutable/chunks/RVmTMq_g.js.br +0 -0
- package/build/client/_app/immutable/chunks/RVmTMq_g.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.xrZU0FIS.js.br +0 -0
- package/build/client/_app/immutable/entry/app.xrZU0FIS.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.BT85omvY.js +0 -1
- package/build/client/_app/immutable/entry/start.BT85omvY.js.br +0 -0
- package/build/client/_app/immutable/entry/start.BT85omvY.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.BjZZ-SXT.js +0 -2
- package/build/client/_app/immutable/nodes/0.BjZZ-SXT.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.BjZZ-SXT.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.0KLmHZC4.js.br +0 -2
- package/build/client/_app/immutable/nodes/1.0KLmHZC4.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.BG8fXI4n.js +0 -3
- package/build/client/_app/immutable/nodes/2.BG8fXI4n.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.BG8fXI4n.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.DMFh-x1Y.js +0 -1
- package/build/client/_app/immutable/nodes/3.DMFh-x1Y.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.DMFh-x1Y.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.CsuRmAsC.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.CsuRmAsC.js.gz +0 -0
- package/build/server/chunks/chunks/context.js-B77ZAVLi.js.map +0 -1
- package/build/server/chunks/chunks/core.js-EA_ysb1J.js.map +0 -1
- package/build/server/chunks/chunks/http.js-DyoR9XRI.js.map +0 -1
- package/build/server/chunks/chunks/library-store.js-DJ-JRE-g.js.map +0 -1
- package/build/server/chunks/entries/endpoints/api/reveal/_server.ts.js-Dhj5O9Lv.js.map +0 -1
- package/build/server/chunks/manifest.js-5SY_cfDE.js.map +0 -1
- package/build/server/chunks/nodes/0.js-CoD1zSiQ.js +0 -11
- package/build/server/chunks/nodes/0.js-CoD1zSiQ.js.map +0 -1
- package/build/server/chunks/nodes/1.js-B92oHDrL.js +0 -7
- package/build/server/chunks/nodes/2.js-COlJ22cI.js +0 -7
- package/build/server/chunks/nodes/2.js-COlJ22cI.js.map +0 -1
- package/build/server/chunks/nodes/3.js-C1yCh8Tq.js +0 -7
- package/build/server/chunks/nodes/4.js-B9BEDKwq.js +0 -7
|
@@ -8,7 +8,7 @@ import { existsSync } from 'node:fs';
|
|
|
8
8
|
import { mkdir, readFile, rename, rm, unlink, writeFile } from 'node:fs/promises';
|
|
9
9
|
import { dirname, extname, join } from 'node:path';
|
|
10
10
|
import { createHash } from 'node:crypto';
|
|
11
|
-
import { assetIdError, collectAllReferences, createEmptyLibrary, folderNameError, folderNameOf, folderOfRawPath, folderPathError, isFolderOrDescendant, joinFolderPath, manifestColorError, manifestEmojiError, parseLibrary, referenceErrors, normalizeFolderPath, parentFolderPath, portableFolderPathKey, rawFilePathError, rawFileNameOfPath, replaceFolderPrefix, manifestNameError, serializeLibrary } from '../core/index.js';
|
|
11
|
+
import { assetIdError, collectAllReferences, canonicalizeParameters, createEmptyLibrary, folderNameError, folderNameOf, folderOfRawPath, folderPathError, isFolderOrDescendant, joinFolderPath, manifestColorError, manifestEmojiError, parseLibrary, referenceErrors, normalizeFolderPath, parentFolderPath, portableFolderPathKey, rawFilePathError, rawFileNameOfPath, replaceFolderPrefix, manifestNameError, serializeLibrary } from '../core/index.js';
|
|
12
12
|
import { manifestModuleFileName } from './codegen.js';
|
|
13
13
|
import { descriptorsByType, serverPluginForType, serverPluginsByType } from './plugins.js';
|
|
14
14
|
import { isProxyFileNameFor } from './processing/processor.js';
|
|
@@ -114,9 +114,12 @@ export class LibraryStore {
|
|
|
114
114
|
* the owning plugin's default parameters. Returns the updated library.
|
|
115
115
|
*/
|
|
116
116
|
async ingest(options) {
|
|
117
|
-
return this
|
|
117
|
+
return this.createAsset(options);
|
|
118
118
|
}
|
|
119
|
-
async
|
|
119
|
+
async createAsset(options, prepareParameters) {
|
|
120
|
+
return this.#enqueue(() => this.#createAsset(options, prepareParameters));
|
|
121
|
+
}
|
|
122
|
+
async #createAsset(options, prepareParameters) {
|
|
120
123
|
const idProblem = assetIdError(options.id);
|
|
121
124
|
if (idProblem)
|
|
122
125
|
throw new Error(idProblem);
|
|
@@ -131,21 +134,57 @@ export class LibraryStore {
|
|
|
131
134
|
}
|
|
132
135
|
const folder = options.folder === undefined ? '' : normalizeFolderPath(options.folder);
|
|
133
136
|
this.#requireFolder(library, folder);
|
|
137
|
+
const manifests = [...new Set(options.manifests ?? [])].sort();
|
|
138
|
+
for (const manifest of manifests) {
|
|
139
|
+
if (!Object.hasOwn(library.manifests, manifest)) {
|
|
140
|
+
throw new Error(`Unknown manifest "${manifest}".`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
134
143
|
const rawDirectory = join(this.#config.rawDir, folder);
|
|
135
144
|
await mkdir(rawDirectory, { recursive: true });
|
|
136
145
|
const storedName = this.#uniqueRawName(sanitizeFileName(options.fileName), folder);
|
|
137
146
|
const storedPath = folder === '' ? storedName : `${folder}/${storedName}`;
|
|
138
|
-
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
parameters
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
147
|
+
const finalPath = join(this.#config.rawDir, storedPath);
|
|
148
|
+
const temporaryPath = join(rawDirectory, `.fundus-create-${crypto.randomUUID()}.tmp`);
|
|
149
|
+
let installed = false;
|
|
150
|
+
try {
|
|
151
|
+
await writeFile(temporaryPath, options.bytes);
|
|
152
|
+
let parameters = plugin.descriptor.validateParameters(plugin.descriptor.defaultParameters(plugin.pluginConfig(this.#config)));
|
|
153
|
+
if (prepareParameters) {
|
|
154
|
+
parameters = plugin.descriptor.validateParameters(await prepareParameters({ rawPath: temporaryPath, rawFileName: storedName, parameters }));
|
|
155
|
+
}
|
|
156
|
+
const record = {
|
|
157
|
+
type: options.type,
|
|
158
|
+
raw: storedPath,
|
|
159
|
+
rawHash: sha256Hex(options.bytes),
|
|
160
|
+
parameters,
|
|
161
|
+
manifests
|
|
162
|
+
};
|
|
163
|
+
if (options.importSource) {
|
|
164
|
+
record.importSource = structuredClone(options.importSource);
|
|
165
|
+
library.version = 2;
|
|
166
|
+
}
|
|
167
|
+
library.assets[options.id] = record;
|
|
168
|
+
// Validate the complete candidate before installing the final raw path.
|
|
169
|
+
parseLibrary(serializeLibrary(library));
|
|
170
|
+
await rename(temporaryPath, finalPath);
|
|
171
|
+
installed = true;
|
|
172
|
+
await this.write(library);
|
|
173
|
+
return library;
|
|
174
|
+
}
|
|
175
|
+
catch (cause) {
|
|
176
|
+
const cleanupErrors = [];
|
|
177
|
+
if (installed)
|
|
178
|
+
await unlink(finalPath).catch((error) => cleanupErrors.push(error));
|
|
179
|
+
await unlink(temporaryPath).catch((error) => {
|
|
180
|
+
if (error.code !== 'ENOENT')
|
|
181
|
+
cleanupErrors.push(error);
|
|
182
|
+
});
|
|
183
|
+
if (cleanupErrors.length > 0) {
|
|
184
|
+
throw new AggregateError([cause, ...cleanupErrors], 'Asset creation failed and cleanup was incomplete.');
|
|
185
|
+
}
|
|
186
|
+
throw cause;
|
|
187
|
+
}
|
|
149
188
|
}
|
|
150
189
|
/**
|
|
151
190
|
* Replace one asset's raw file while preserving its identity and authored
|
|
@@ -166,6 +205,7 @@ export class LibraryStore {
|
|
|
166
205
|
}
|
|
167
206
|
const previousRaw = record.raw;
|
|
168
207
|
const previousHash = record.rawHash;
|
|
208
|
+
const previousSource = record.importSource;
|
|
169
209
|
const folder = folderOfRawPath(previousRaw);
|
|
170
210
|
const previousName = rawFileNameOfPath(previousRaw);
|
|
171
211
|
const storedName = sanitizedName === previousName ? previousName : this.#uniqueRawName(sanitizedName, folder);
|
|
@@ -188,11 +228,14 @@ export class LibraryStore {
|
|
|
188
228
|
replacementInstalled = true;
|
|
189
229
|
record.raw = nextRaw;
|
|
190
230
|
record.rawHash = sha256Hex(options.bytes);
|
|
231
|
+
delete record.importSource;
|
|
191
232
|
await this.write(library);
|
|
192
233
|
}
|
|
193
234
|
catch (cause) {
|
|
194
235
|
record.raw = previousRaw;
|
|
195
236
|
record.rawHash = previousHash;
|
|
237
|
+
if (previousSource)
|
|
238
|
+
record.importSource = previousSource;
|
|
196
239
|
if (replacementInstalled)
|
|
197
240
|
await unlink(nextPath).catch(() => { });
|
|
198
241
|
if (previousStaged)
|
|
@@ -204,6 +247,59 @@ export class LibraryStore {
|
|
|
204
247
|
await unlink(backupPath).catch(() => { });
|
|
205
248
|
return library;
|
|
206
249
|
}
|
|
250
|
+
/** CAS-protected replacement used only by a repeatable import source. */
|
|
251
|
+
async replaceRawFromImportSource(id, bytes, expected, nextSource) {
|
|
252
|
+
return this.#enqueue(async () => {
|
|
253
|
+
const library = await this.read();
|
|
254
|
+
const record = this.#requireAsset(library, id);
|
|
255
|
+
if (record.raw !== expected.raw ||
|
|
256
|
+
record.rawHash !== expected.rawHash ||
|
|
257
|
+
record.type !== expected.type ||
|
|
258
|
+
!record.importSource ||
|
|
259
|
+
canonicalizeParameters(record.importSource) !== expected.canonicalSource) {
|
|
260
|
+
throw new Error('stale-import');
|
|
261
|
+
}
|
|
262
|
+
const absolutePath = join(this.#config.rawDir, record.raw);
|
|
263
|
+
const { verifyStableRawFile } = await import('./raw-reconciliation.js');
|
|
264
|
+
try {
|
|
265
|
+
await verifyStableRawFile(absolutePath, expected.rawHash);
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
throw new Error('stale-import');
|
|
269
|
+
}
|
|
270
|
+
const token = crypto.randomUUID();
|
|
271
|
+
const temporaryPath = `${absolutePath}.fundus-reimport-${token}.tmp`;
|
|
272
|
+
const backupPath = `${absolutePath}.fundus-reimport-${token}`;
|
|
273
|
+
const previousHash = record.rawHash;
|
|
274
|
+
const previousSource = structuredClone(record.importSource);
|
|
275
|
+
let staged = false;
|
|
276
|
+
let installed = false;
|
|
277
|
+
try {
|
|
278
|
+
await writeFile(temporaryPath, bytes);
|
|
279
|
+
await rename(absolutePath, backupPath);
|
|
280
|
+
staged = true;
|
|
281
|
+
await rename(temporaryPath, absolutePath);
|
|
282
|
+
installed = true;
|
|
283
|
+
record.rawHash = sha256Hex(bytes);
|
|
284
|
+
if (nextSource)
|
|
285
|
+
record.importSource = structuredClone(nextSource);
|
|
286
|
+
await this.write(library);
|
|
287
|
+
}
|
|
288
|
+
catch (cause) {
|
|
289
|
+
record.rawHash = previousHash;
|
|
290
|
+
record.importSource = previousSource;
|
|
291
|
+
if (installed)
|
|
292
|
+
await unlink(absolutePath).catch(() => { });
|
|
293
|
+
if (staged)
|
|
294
|
+
await rename(backupPath, absolutePath);
|
|
295
|
+
await unlink(temporaryPath).catch(() => { });
|
|
296
|
+
throw cause;
|
|
297
|
+
}
|
|
298
|
+
if (staged)
|
|
299
|
+
await unlink(backupPath).catch(() => { });
|
|
300
|
+
return library;
|
|
301
|
+
});
|
|
302
|
+
}
|
|
207
303
|
/** Replace an asset's parameters (validated by the owning plugin). */
|
|
208
304
|
async updateParameters(id, parameters) {
|
|
209
305
|
return this.#enqueue(() => this.#updateParameters(id, parameters));
|
|
@@ -2,6 +2,7 @@ import { type FundusStateDto, type PatchAssetRequestDto, type PatchManifestReque
|
|
|
2
2
|
import type { ResolvedFundusConfig } from './config-loader.js';
|
|
3
3
|
import { LibraryStore, type IngestOptions, type ReplaceRawFileOptions } from './library-store.js';
|
|
4
4
|
import type { ServerPluginRegistry } from './plugins/contract.js';
|
|
5
|
+
import { SourceImporterRegistry } from './importers/registry.js';
|
|
5
6
|
/**
|
|
6
7
|
* The CLI's `--parameters` merge semantics (M7): a SHALLOW merge at the top
|
|
7
8
|
* level onto the current parameters — a nested object value replaces the whole
|
|
@@ -17,9 +18,16 @@ export interface AssetChangeOptions {
|
|
|
17
18
|
/** Replacement for the explicit manifest membership set (declarative). */
|
|
18
19
|
manifests?: string[];
|
|
19
20
|
}
|
|
21
|
+
export interface ImportAssetOptions extends AssetChangeOptions {
|
|
22
|
+
importer: string;
|
|
23
|
+
input: unknown;
|
|
24
|
+
type: string;
|
|
25
|
+
id: string;
|
|
26
|
+
folder?: string;
|
|
27
|
+
}
|
|
20
28
|
export declare class FundusOperations {
|
|
21
29
|
#private;
|
|
22
|
-
constructor(config: ResolvedFundusConfig, registry?: ServerPluginRegistry);
|
|
30
|
+
constructor(config: ResolvedFundusConfig, registry?: ServerPluginRegistry, importerRegistry?: SourceImporterRegistry);
|
|
23
31
|
get config(): ResolvedFundusConfig;
|
|
24
32
|
get store(): LibraryStore;
|
|
25
33
|
/** Read-only state snapshot, serialized with mutations but never processing or writing. */
|
|
@@ -42,6 +50,10 @@ export declare class FundusOperations {
|
|
|
42
50
|
* rolls the whole ingest back, so a failed ingest leaves nothing behind.
|
|
43
51
|
*/
|
|
44
52
|
ingest(options: IngestOptions & AssetChangeOptions): Promise<FundusStateDto>;
|
|
53
|
+
/** Materialize a source outside the operation queue, then atomically create the asset. */
|
|
54
|
+
importAsset(options: ImportAssetOptions): Promise<FundusStateDto>;
|
|
55
|
+
/** Re-materialize a persisted source with record and on-disk CAS protection. */
|
|
56
|
+
reimportAsset(id: string, input?: unknown): Promise<FundusStateDto>;
|
|
45
57
|
/** Apply a PATCH body: parameters and/or manifests and/or a rename — in that order. */
|
|
46
58
|
patchAsset(id: string, body: PatchAssetRequestDto): Promise<FundusStateDto>;
|
|
47
59
|
moveAsset(id: string, folder: string): Promise<FundusStateDto>;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* operation has exactly one implementation and there is no other save path.
|
|
7
7
|
*/
|
|
8
8
|
import { join } from 'node:path';
|
|
9
|
-
import { assetIdError, allDeliveredAssetIds, collectAllReferences, compareCodeUnits, computeLibraryMembership, folderOfRawPath, parentFolderPath, portableFolderPathKey, proposeAssetId, rawFileNameOfPath, typesForFileName } from '../core/index.js';
|
|
9
|
+
import { assetIdError, allDeliveredAssetIds, canonicalizeParameters, collectAllReferences, compareCodeUnits, computeLibraryMembership, folderOfRawPath, normalizeFolderPath, parentFolderPath, portableFolderPathKey, proposeAssetId, rawFileNameOfPath, typesForFileName } from '../core/index.js';
|
|
10
10
|
import { LibraryStore } from './library-store.js';
|
|
11
11
|
import { generateManifestModules } from './codegen.js';
|
|
12
12
|
import { descriptorsByType, serverPluginForType, serverPluginsByType } from './plugins.js';
|
|
@@ -14,6 +14,8 @@ import { processAssets, readCurrentProxy } from './processing/processor.js';
|
|
|
14
14
|
import { encodeRelativePathForUrl } from './folder-filesystem.js';
|
|
15
15
|
import { classifyRawDirectory, verifyStableRawFile } from './raw-reconciliation.js';
|
|
16
16
|
import { rawSafetyIssues } from './raw-safety.js';
|
|
17
|
+
import { serverImporters } from './importers.js';
|
|
18
|
+
import { SourceImportError } from './importers/contract.js';
|
|
17
19
|
/**
|
|
18
20
|
* The CLI's `--parameters` merge semantics (M7): a SHALLOW merge at the top
|
|
19
21
|
* level onto the current parameters — a nested object value replaces the whole
|
|
@@ -44,12 +46,14 @@ export class FundusOperations {
|
|
|
44
46
|
#config;
|
|
45
47
|
#registry;
|
|
46
48
|
#store;
|
|
49
|
+
#importers;
|
|
47
50
|
#operationQueue = Promise.resolve();
|
|
48
51
|
#pipelineQueue = Promise.resolve();
|
|
49
|
-
constructor(config, registry = serverPluginsByType) {
|
|
52
|
+
constructor(config, registry = serverPluginsByType, importerRegistry = serverImporters) {
|
|
50
53
|
this.#config = config;
|
|
51
54
|
this.#registry = registry;
|
|
52
55
|
this.#store = new LibraryStore(config, registry);
|
|
56
|
+
this.#importers = importerRegistry;
|
|
53
57
|
}
|
|
54
58
|
get config() {
|
|
55
59
|
return this.#config;
|
|
@@ -198,6 +202,7 @@ export class FundusOperations {
|
|
|
198
202
|
record.type = type;
|
|
199
203
|
record.rawHash = edited.hash;
|
|
200
204
|
record.parameters = parameters;
|
|
205
|
+
delete record.importSource;
|
|
201
206
|
return edited.assetId;
|
|
202
207
|
});
|
|
203
208
|
await this.#store.deleteProxiesOf(result.value);
|
|
@@ -217,6 +222,7 @@ export class FundusOperations {
|
|
|
217
222
|
throw new Error(`The moved file "${edited.path}" is not compatible with its current ${record.type} type; choose a compatible type and process it.`);
|
|
218
223
|
}
|
|
219
224
|
candidate.assets[edited.assetId].rawHash = edited.hash;
|
|
225
|
+
delete candidate.assets[edited.assetId].importSource;
|
|
220
226
|
return edited.assetId;
|
|
221
227
|
});
|
|
222
228
|
await this.#store.deleteProxiesOf(result.value);
|
|
@@ -233,36 +239,161 @@ export class FundusOperations {
|
|
|
233
239
|
* rolls the whole ingest back, so a failed ingest leaves nothing behind.
|
|
234
240
|
*/
|
|
235
241
|
ingest(options) {
|
|
236
|
-
return this.#enqueueOperation(() =>
|
|
242
|
+
return this.#enqueueOperation(async () => {
|
|
243
|
+
const importer = this.#importers.require('file');
|
|
244
|
+
const input = importer.validateInput({ fileName: options.fileName, bytes: options.bytes });
|
|
245
|
+
const raw = await importer.importRaw(input, {
|
|
246
|
+
config: this.#config,
|
|
247
|
+
fetch: globalThis.fetch
|
|
248
|
+
});
|
|
249
|
+
return this.#createImportedAsset(raw, options);
|
|
250
|
+
});
|
|
237
251
|
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
const
|
|
252
|
+
/** Materialize a source outside the operation queue, then atomically create the asset. */
|
|
253
|
+
async importAsset(options) {
|
|
254
|
+
const preflight = await this.#enqueueOperation(async () => {
|
|
255
|
+
const library = await this.#store.read();
|
|
256
|
+
this.#validateImportTarget(options, library);
|
|
257
|
+
if (Object.hasOwn(library.assets, options.id)) {
|
|
258
|
+
throw new SourceImportError('invalid-input', `An asset with id "${options.id}" already exists.`);
|
|
259
|
+
}
|
|
260
|
+
const importer = this.#importers.require(options.importer);
|
|
261
|
+
return { importer, input: importer.validateInput(options.input) };
|
|
262
|
+
});
|
|
263
|
+
const raw = await preflight.importer.importRaw(preflight.input, {
|
|
264
|
+
config: this.#config,
|
|
265
|
+
fetch: globalThis.fetch
|
|
266
|
+
});
|
|
267
|
+
return this.#enqueueOperation(async () => {
|
|
268
|
+
this.#validateImportedRaw(raw, options.importer);
|
|
269
|
+
return this.#createImportedAsset(raw, options);
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
/** Re-materialize a persisted source with record and on-disk CAS protection. */
|
|
273
|
+
async reimportAsset(id, input) {
|
|
274
|
+
const snapshot = await this.#enqueueOperation(async () => {
|
|
275
|
+
const library = await this.#store.read();
|
|
276
|
+
this.#requireAsset(library, id);
|
|
277
|
+
const record = library.assets[id];
|
|
278
|
+
if (!record.importSource) {
|
|
279
|
+
throw new SourceImportError('invalid-input', `Asset "${id}" has no repeatable import source.`);
|
|
280
|
+
}
|
|
281
|
+
const resolved = this.#importers.requireReimport(record.importSource);
|
|
282
|
+
try {
|
|
283
|
+
await verifyStableRawFile(join(this.#config.rawDir, record.raw), record.rawHash);
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
throw new SourceImportError('stale-import', 'The local raw file changed. Apply or discard that edit before re-importing.');
|
|
287
|
+
}
|
|
288
|
+
return {
|
|
289
|
+
importer: resolved.importer,
|
|
290
|
+
parameters: resolved.parameters,
|
|
291
|
+
input: input === undefined ? undefined : resolved.importer.validateInput(input),
|
|
292
|
+
expected: {
|
|
293
|
+
raw: record.raw,
|
|
294
|
+
rawHash: record.rawHash,
|
|
295
|
+
type: record.type,
|
|
296
|
+
canonicalSource: canonicalizeParameters(record.importSource)
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
});
|
|
300
|
+
const context = { config: this.#config, fetch: globalThis.fetch };
|
|
301
|
+
const raw = snapshot.input === undefined
|
|
302
|
+
? await snapshot.importer.reimportRaw(snapshot.parameters, context)
|
|
303
|
+
: await snapshot.importer.importRaw(snapshot.input, context);
|
|
304
|
+
if (snapshot.input !== undefined && !raw.importSource) {
|
|
305
|
+
throw new SourceImportError('invalid-response', 'The source importer did not return provenance for the updated source.');
|
|
306
|
+
}
|
|
307
|
+
return this.#enqueueOperation(async () => {
|
|
308
|
+
this.#validateImportedRaw(raw, snapshot.importer.kind);
|
|
309
|
+
const plugin = serverPluginForType(snapshot.expected.type, this.#registry);
|
|
310
|
+
if (!plugin.descriptor.accepts.includes(raw.extension)) {
|
|
311
|
+
throw new SourceImportError('invalid-response', `The ${snapshot.expected.type} type does not accept ".${raw.extension}" files.`);
|
|
312
|
+
}
|
|
313
|
+
let library;
|
|
314
|
+
try {
|
|
315
|
+
library = await this.#store.replaceRawFromImportSource(id, raw.bytes, snapshot.expected, raw.importSource);
|
|
316
|
+
}
|
|
317
|
+
catch (cause) {
|
|
318
|
+
if (cause instanceof Error && cause.message === 'stale-import') {
|
|
319
|
+
throw new SourceImportError('stale-import', 'The asset or local raw file changed while Figma was exporting. Nothing was replaced.');
|
|
320
|
+
}
|
|
321
|
+
throw cause;
|
|
322
|
+
}
|
|
323
|
+
return this.#afterMutation(library);
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
async #createImportedAsset(raw, options) {
|
|
327
|
+
this.#validateImportedRaw(raw);
|
|
328
|
+
const fileName = raw.suggestedFileName ?? `${options.id}.${raw.extension}`;
|
|
329
|
+
const plugin = serverPluginForType(options.type, this.#registry);
|
|
330
|
+
const library = await this.#store.createAsset({
|
|
331
|
+
fileName,
|
|
332
|
+
bytes: raw.bytes,
|
|
333
|
+
type: options.type,
|
|
334
|
+
id: options.id,
|
|
335
|
+
folder: options.folder,
|
|
336
|
+
manifests: options.manifests,
|
|
337
|
+
importSource: raw.importSource
|
|
338
|
+
}, async ({ rawPath, rawFileName, parameters }) => {
|
|
339
|
+
let next = parameters;
|
|
242
340
|
if (plugin.seedIngestParameters) {
|
|
243
|
-
const record = library.assets[options.id];
|
|
244
341
|
const seeded = await plugin.seedIngestParameters({
|
|
245
|
-
rawPath
|
|
246
|
-
rawFileName
|
|
247
|
-
parameters:
|
|
342
|
+
rawPath,
|
|
343
|
+
rawFileName,
|
|
344
|
+
parameters: next,
|
|
248
345
|
config: this.#config
|
|
249
346
|
});
|
|
250
|
-
if (seeded !== undefined)
|
|
251
|
-
|
|
252
|
-
}
|
|
347
|
+
if (seeded !== undefined)
|
|
348
|
+
next = seeded;
|
|
253
349
|
}
|
|
254
|
-
if (options.parametersPatch !== undefined
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
350
|
+
if (options.parametersPatch !== undefined) {
|
|
351
|
+
next = mergeParameterPatch(next, options.parametersPatch);
|
|
352
|
+
}
|
|
353
|
+
return plugin.descriptor.validateParameters(next);
|
|
354
|
+
});
|
|
355
|
+
return this.#afterMutation(library);
|
|
356
|
+
}
|
|
357
|
+
#validateImportTarget(options, library) {
|
|
358
|
+
if (typeof options.importer !== 'string' ||
|
|
359
|
+
typeof options.id !== 'string' ||
|
|
360
|
+
typeof options.type !== 'string') {
|
|
361
|
+
throw new SourceImportError('invalid-input', 'Import requires importer, type, and id strings.');
|
|
362
|
+
}
|
|
363
|
+
const problem = assetIdError(options.id);
|
|
364
|
+
if (problem)
|
|
365
|
+
throw new SourceImportError('invalid-input', problem);
|
|
366
|
+
serverPluginForType(options.type, this.#registry);
|
|
367
|
+
if (options.folder !== undefined && typeof options.folder !== 'string') {
|
|
368
|
+
throw new SourceImportError('invalid-input', 'Import folder must be a string.');
|
|
369
|
+
}
|
|
370
|
+
const folder = normalizeFolderPath(options.folder ?? '');
|
|
371
|
+
if (folder !== '' && !library.folders.includes(folder)) {
|
|
372
|
+
throw new SourceImportError('invalid-input', `Unknown folder "${folder}".`);
|
|
373
|
+
}
|
|
374
|
+
if (options.manifests !== undefined &&
|
|
375
|
+
(!Array.isArray(options.manifests) ||
|
|
376
|
+
options.manifests.some((value) => typeof value !== 'string'))) {
|
|
377
|
+
throw new SourceImportError('invalid-input', 'Import manifests must be an array of strings.');
|
|
378
|
+
}
|
|
379
|
+
for (const manifest of new Set(options.manifests ?? [])) {
|
|
380
|
+
if (!Object.hasOwn(library.manifests, manifest)) {
|
|
381
|
+
throw new SourceImportError('invalid-input', `Unknown manifest "${manifest}".`);
|
|
259
382
|
}
|
|
260
383
|
}
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
384
|
+
}
|
|
385
|
+
#validateImportedRaw(raw, importerKind) {
|
|
386
|
+
if (!(raw.bytes instanceof Uint8Array) || !/^[a-z0-9]+$/.test(raw.extension)) {
|
|
387
|
+
throw new SourceImportError('invalid-response', 'The source importer returned invalid raw data.');
|
|
388
|
+
}
|
|
389
|
+
if (raw.importSource) {
|
|
390
|
+
if (importerKind && raw.importSource.importer !== importerKind) {
|
|
391
|
+
throw new SourceImportError('invalid-response', 'The source importer returned mismatched provenance.');
|
|
392
|
+
}
|
|
393
|
+
this.#importers
|
|
394
|
+
.require(raw.importSource.importer)
|
|
395
|
+
.validateSourceParameters(raw.importSource.parameters);
|
|
264
396
|
}
|
|
265
|
-
return this.#afterMutation(library);
|
|
266
397
|
}
|
|
267
398
|
/** Apply a PATCH body: parameters and/or manifests and/or a rename — in that order. */
|
|
268
399
|
patchAsset(id, body) {
|
|
@@ -546,6 +677,9 @@ export class FundusOperations {
|
|
|
546
677
|
warnings.push('In no manifest and not referenced by any delivered asset — ' +
|
|
547
678
|
'nothing is processed or generated for it.');
|
|
548
679
|
}
|
|
680
|
+
if (record.importSource && !this.#importers.has(record.importSource.importer)) {
|
|
681
|
+
warnings.push(`Importer "${record.importSource.importer}" is unavailable; the local raw file remains usable.`);
|
|
682
|
+
}
|
|
549
683
|
let proxy = null;
|
|
550
684
|
if (delivered.has(assetId)) {
|
|
551
685
|
try {
|
|
@@ -572,6 +706,7 @@ export class FundusOperations {
|
|
|
572
706
|
folder: folderOfRawPath(record.raw),
|
|
573
707
|
rawUrl: `/files/raw/${encodeRelativePathForUrl(record.raw)}?v=${record.rawHash.slice(0, 12)}`,
|
|
574
708
|
rawHash: record.rawHash,
|
|
709
|
+
importSource: record.importSource,
|
|
575
710
|
parameters: record.parameters,
|
|
576
711
|
manifests: record.manifests,
|
|
577
712
|
passiveManifests: passiveManifestsByAsset.get(assetId) ?? [],
|
|
@@ -614,6 +749,7 @@ export class FundusOperations {
|
|
|
614
749
|
return {
|
|
615
750
|
library,
|
|
616
751
|
assets,
|
|
752
|
+
importDefaults: { figma: { scale: this.#config.import.figma.defaults.scale } },
|
|
617
753
|
issues,
|
|
618
754
|
presetNames,
|
|
619
755
|
manifestMemberships,
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.context-menu.svelte-109nkvw{z-index:200;background:var(--panel-raised);border:1px solid var(--border);border-radius:6px;width:168px;padding:4px;position:fixed;box-shadow:0 8px 24px #00000073}button.svelte-109nkvw{width:100%;color:var(--text);font:inherit;text-align:left;background:0 0;border:0;border-radius:4px;padding:6px 8px}button.svelte-109nkvw:hover,button.svelte-109nkvw:focus-visible{background:var(--accent-soft);outline:none}button.danger.svelte-109nkvw{color:var(--danger)}hr.svelte-109nkvw{background:var(--border);border:0;height:1px;margin:4px 8px}.manifest-label.svelte-1b4m5oj{align-items:center;gap:4px;min-width:0;display:inline-flex}.emoji.svelte-1b4m5oj{flex:none;line-height:1}.name.svelte-1b4m5oj{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.chip.svelte-1b4m5oj{background:color-mix(in srgb, var(--manifest-color) 20%, transparent);color:var(--manifest-color);border-radius:4px;padding:0 5px;font-size:10px}.chip.passive.svelte-1b4m5oj{border:1px dashed var(--manifest-color);background:0 0}.library-view.svelte-1uha8ag{flex:1;min-height:0;display:flex}.page.svelte-1uha8ag{flex:1;min-height:0;padding:16px;position:relative;overflow-y:auto}.selection-bar.svelte-1uha8ag,.filter-bar.svelte-1uha8ag{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.selection-bar.svelte-1uha8ag{margin-bottom:8px}.filter-bar.svelte-1uha8ag{margin-bottom:16px}.selection-summary.svelte-1uha8ag{color:var(--accent);white-space:nowrap;font-weight:600}.toggle.svelte-1uha8ag{color:var(--text-dim);align-items:center;gap:6px;display:inline-flex}.search.svelte-1uha8ag{align-items:center;gap:5px;width:220px;padding:0 6px;display:flex}.search.svelte-1uha8ag:focus-within{border-color:var(--accent)}.search-icon.svelte-1uha8ag{fill:none;width:14px;height:14px;stroke:var(--text-faint);stroke-width:1.5px;stroke-linecap:round;flex:none}.search-input.svelte-1uha8ag{min-width:0;height:100%;color:var(--text);font:inherit;background:0 0;border:0;outline:none;flex:1;padding:0}.search.svelte-1uha8ag kbd:where(.svelte-1uha8ag){border:1px solid var(--border);color:var(--text-faint);border-radius:3px;flex:none;padding:1px 4px;font:9px/14px system-ui,sans-serif}.import.svelte-1uha8ag{background:var(--accent);color:var(--text);margin-left:auto}.section.svelte-1uha8ag{margin-bottom:24px}.section.svelte-1uha8ag:last-child{margin-bottom:0}.section-emoji.svelte-1uha8ag{margin-right:6px}.grid.svelte-1uha8ag,.folder-grid.svelte-1uha8ag{grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:8px;display:grid}.folder-card.svelte-1uha8ag{background:var(--panel);border:1px solid var(--border-soft);min-width:0;height:60px;color:var(--text);text-align:left;border-radius:8px;align-items:center;gap:10px;padding:8px 10px;display:flex}.folder-card.svelte-1uha8ag:hover,.folder-card.svelte-1uha8ag:focus-visible{border-color:var(--accent);outline:none}.folder-card.drop-target.svelte-1uha8ag{border-color:var(--accent);background:var(--accent-soft);box-shadow:0 0 0 1px var(--accent)}.folder-card.dragging-folder.svelte-1uha8ag{opacity:.55}.folder-card-icon.svelte-1uha8ag{color:var(--text-dim);flex:none;align-items:center;display:flex}.folder-card-details.svelte-1uha8ag{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.folder-card-details.svelte-1uha8ag strong:where(.svelte-1uha8ag){text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.folder-card-details.svelte-1uha8ag span:where(.svelte-1uha8ag),.folder-card-arrow.svelte-1uha8ag{color:var(--text-faint)}.folder-card-arrow.svelte-1uha8ag{flex:none;font-size:18px}.card.svelte-1uha8ag{background:var(--panel);border:1px solid var(--border-soft);border-radius:8px;flex-direction:column;gap:8px;padding:8px;display:flex;position:relative}.card.selected.svelte-1uha8ag{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.asset-select.svelte-1uha8ag{z-index:1;width:16px;height:16px;accent-color:var(--accent);position:absolute;top:12px;left:12px}.card.svelte-1uha8ag:hover{border-color:var(--accent)}.thumbnail.svelte-1uha8ag{border-radius:var(--radius);justify-content:center;align-items:center;height:96px;display:flex;overflow:hidden}.meta.svelte-1uha8ag{align-items:center;gap:6px;min-width:0;display:flex}.id.svelte-1uha8ag{text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.type-badge.svelte-1uha8ag{color:var(--text-dim);border:1px solid var(--border);border-radius:4px;flex:none;margin-left:auto;padding:0 5px;font-size:10px}.badges.svelte-1uha8ag{flex-wrap:wrap;gap:4px;min-height:16px;display:flex}.badge.svelte-1uha8ag{border-radius:4px;padding:0 5px;font-size:10px}.badge.warning.svelte-1uha8ag{background:var(--warning-soft);color:var(--warning)}.empty.svelte-1uha8ag{color:var(--text-dim);text-align:center;padding:48px}.dialog-row.svelte-1uha8ag{align-items:center;gap:8px;display:flex}.dialog-row.svelte-1uha8ag span:where(.svelte-1uha8ag){width:44px;color:var(--text-dim)}.dialog-row.svelte-1uha8ag input:where(.svelte-1uha8ag){flex:1}.dialog-text.svelte-1uha8ag,.dialog-warning.svelte-1uha8ag{margin:8px 0 0}.dialog-warning.svelte-1uha8ag{color:var(--warning)}.drop-hint.svelte-1uha8ag{border:2px dashed var(--accent);color:var(--accent);pointer-events:none;background:#0d99ff14;border-radius:12px;justify-content:center;align-items:center;font-size:14px;display:flex;position:fixed;inset:48px 8px 8px}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{F as e,X as t,Y as n}from"./D65cSBhe.js";async function r(e){if(!e.ok){let t=`${e.status} ${e.statusText}`;try{let n=await e.json();n.error?.message&&(t=n.error.message)}catch{}throw Error(t)}return await e.json()}async function i(e){if(!e.ok){let t=`${e.status} ${e.statusText}`;try{let n=await e.json();n.error?.message&&(t=n.error.message)}catch{}throw Error(t)}}async function a(){return r(await fetch(`/api/state`,{cache:`no-store`}))}async function o(){return r(await fetch(`/api/reconcile`,{method:`POST`,cache:`no-store`,headers:{"Content-Type":`application/json`},body:JSON.stringify({})}))}async function s(e,t,n,i=[]){return r(await fetch(`/api/raw/adopt`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({token:e,id:t,type:n,manifests:i})}))}async function c(e,t){return r(await fetch(`/api/raw/edited/accept`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({token:e,type:t})}))}async function l(e){return r(await fetch(`/api/raw/edited/dismiss`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({token:e})}))}async function u(e,t,n,i,a=[]){let o=new FormData;o.set(`file`,e),o.set(`type`,t),o.set(`id`,n),o.set(`folder`,i);for(let e of a)o.append(`manifests`,e);return r(await fetch(`/api/assets`,{method:`POST`,body:o}))}async function d(e,t){let n=new FormData;return n.set(`file`,t),r(await fetch(`/api/assets/${encodeURIComponent(e)}/raw`,{method:`PUT`,body:n}))}async function f(e){return r(await fetch(`/api/folders`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:e})}))}async function p(e,t){return r(await fetch(`/api/folders/${encodeURIComponent(e)}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:t})}))}async function m(e,t){return r(await fetch(`/api/folders/${encodeURIComponent(e)}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({parent:t})}))}async function h(e){return r(await fetch(`/api/folders/${encodeURIComponent(e)}`,{method:`DELETE`}))}async function g(e,t){return r(await fetch(`/api/assets/${encodeURIComponent(e)}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}))}async function _(e,t){return r(await fetch(`/api/assets/move`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({assetIds:e,folder:t})}))}async function v(e){return r(await fetch(`/api/assets/${encodeURIComponent(e)}`,{method:`DELETE`}))}async function y(e){return r(await fetch(`/api/assets/delete`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({assetIds:e})}))}async function b(e){return i(await fetch(`/api/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({assetId:e})}))}async function x(e){return i(await fetch(`/api/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({folder:e})}))}async function S(e){return r(await fetch(`/api/manifests`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:e})}))}async function C(e){return r(await fetch(`/api/manifests/${encodeURIComponent(e)}`,{method:`DELETE`}))}async function w(e,t){return r(await fetch(`/api/manifests/${encodeURIComponent(e)}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}))}var T=class{#e=Promise.resolve();#t=new Map;enqueue(e){let t=this.#e.then(e,e);return this.#e=t.then(()=>{},()=>{}),t}coalesce(e,t){let n=this.#t.get(e);if(n)return n;let r=this.enqueue(t).finally(()=>{this.#t.get(e)===r&&this.#t.delete(e)});return this.#t.set(e,r),r}},E=new class{#e=new T;#t=t(null);get state(){return e(this.#t)}set state(e){n(this.#t,e,!0)}#n=t(!1);get saving(){return e(this.#n)}set saving(e){n(this.#n,e,!0)}#r=t(null);get error(){return e(this.#r)}set error(e){n(this.#r,e,!0)}#i=t(!1);get loaded(){return e(this.#i)}set loaded(e){n(this.#i,e,!0)}async refresh(){return this.#a(a)}reconcile(){return this.#a(o,!0)}#a(e,t=!1){let n=async()=>{try{this.state=await e(),this.error=null}catch(e){this.error=e instanceof Error?e.message:String(e)}finally{this.loaded=!0}};return t?this.#e.coalesce(`reconcile`,n):this.#e.enqueue(n)}mutate(e){return this.#e.enqueue(async()=>{this.saving=!0,this.error=null;try{let t=await e();return this.state=t,t}catch(e){throw this.error=e instanceof Error?e.message:String(e),e}finally{this.saving=!1}})}get manifestNames(){return Object.keys(this.state?.library.manifests??{}).sort()}manifestAppearance(e){return this.state?.library.manifests[e]??{}}get generalIssues(){return this.state?.issues.filter(e=>e.assetId===void 0).map(e=>e.message)??[]}assetById(e){return this.state?.assets.find(t=>t.id===e)??null}},D=`[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}`;RegExp(`^(?:\\.fundus-replace-${D}\\.tmp|\\.fundus-delete(?:-assets)?-${D})$`,`i`),RegExp(`\\.fundus-(?:replace-)?${D}$`,`i`);var O=[`preload`,`release`,`entries`,`constructor`,`prototype`,`hasOwnProperty`,`isPrototypeOf`,`propertyIsEnumerable`,`toLocaleString`,`toString`,`valueOf`],k=/^[a-z][A-Za-z0-9]*$/;function A(e){return k.test(e)?O.includes(e)?`"${e}" is reserved (it collides with a Manifest member name).`:null:`"${e}" is not a valid asset id — use a camelCase identifier starting with a lowercase letter (e.g. "navigationPanel").`}function j(e){return k.test(e)?O.includes(e)?`"${e}" is reserved (it collides with a Manifest member name).`:null:`"${e}" is not a valid manifest name — use a camelCase identifier starting with a lowercase letter (e.g. "mainCatalog").`}var M={type:`audio`,accepts:[`mp3`,`wav`,`m4a`,`ogg`,`flac`],defaultParameters:()=>({preset:`default`}),validateParameters(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`Audio parameters must be an object.`);let t=e;if(typeof t.preset!=`string`||t.preset.length===0)throw Error(`Audio parameters need a non-empty string "preset".`);return{preset:t.preset}}};function N(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&typeof e.$asset==`string`&&e.$asset!==``}var P={keyColor:[0,1,0],colorCutoff:.2,colorFeathering:.33,maskFeathering:1,sharpening:.5,despill:1,despillLuminanceAdd:.2},F=[`colorCutoff`,`colorFeathering`,`maskFeathering`,`sharpening`,`despill`,`despillLuminanceAdd`];function I(e){return Math.min(1,Math.max(0,e))}function L(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`"chromaKey" must be an object.`);let t=e,n=t.keyColor;if(!Array.isArray(n)||n.length!==3||n.some(e=>typeof e!=`number`||!Number.isFinite(e)))throw Error(`"chromaKey.keyColor" must be an array of three numbers (RGB, 0–1 each).`);let r={keyColor:[I(n[0]),I(n[1]),I(n[2])]};for(let e of F){let n=t[e];if(typeof n!=`number`||!Number.isFinite(n))throw Error(`"chromaKey.${e}" must be a number (0–1).`);r[e]=I(n)}return r}var R=[`mp4`,`mov`,`webm`,`m4v`];function z(e,t){if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`${e} parameters must be an object.`);let n=t;if(typeof n.preset!=`string`||n.preset.length===0)throw Error(`${e} parameters need a non-empty string "preset".`);if(n.maxWidth!==void 0&&(typeof n.maxWidth!=`number`||!Number.isInteger(n.maxWidth)||n.maxWidth<=0))throw Error(`${e} "maxWidth" must be a positive integer when set.`);return{preset:n.preset,...n.maxWidth===void 0?{}:{maxWidth:n.maxWidth}}}var B={type:`video`,accepts:[...R],defaultParameters:()=>({preset:`default`}),validateParameters(e){return z(`Video`,e)}};function V(e,t){if(t!==void 0){if(!N(t))throw Error(`"${e}" must be an asset reference ({ "$asset": "<id>" }).`);return{$asset:t.$asset}}}var H={type:`chroma-key-video`,accepts:[...R],defaultParameters:()=>({preset:`default`,chromaKey:{...P,keyColor:[...P.keyColor]}}),validateParameters(e){let t=z(`Chroma-key-video`,e),n=e,r=L(n.chromaKey),i=V(`mask`,n.mask),a=V(`fallback`,n.fallback);return{...t,chromaKey:r,...i===void 0?{}:{mask:i},...a===void 0?{}:{fallback:a}}},collectReferences(e){let t=[];return e.mask&&t.push({field:`mask`,assetId:e.mask.$asset,expectedTypes:[`image`]}),e.fallback&&t.push({field:`fallback`,assetId:e.fallback.$asset,expectedTypes:[`image`]}),t},processingParameters(e){return{preset:e.preset,...e.maxWidth===void 0?{}:{maxWidth:e.maxWidth}}}},U=[`png`,`jpg`,`jpeg`,`webp`,`avif`],W={type:`image`,accepts:[...U],defaultParameters:()=>({preset:`default`}),validateParameters(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`Image parameters must be an object.`);let t=e;if(typeof t.preset!=`string`||t.preset.length===0)throw Error(`Image parameters need a non-empty string "preset".`);if(t.targetWidth!==void 0&&(typeof t.targetWidth!=`number`||!Number.isInteger(t.targetWidth)||t.targetWidth<=0))throw Error(`Image "targetWidth" must be a positive integer when set.`);return{preset:t.preset,...t.targetWidth===void 0?{}:{targetWidth:t.targetWidth}}}},G=[`nine`,`three-horizontal`,`three-vertical`,`one`];function K(){return{top:0,right:0,bottom:0,left:0}}function q(e){return{horizontal:e===`nine`||e===`three-horizontal`,vertical:e===`nine`||e===`three-vertical`}}function J(e,t,n,r){return t===`left`?n-e.right:t===`right`?n-e.left:t===`top`?r-e.bottom:r-e.top}function Y(e,t,n,r){return J(e,t,n,r)-1}function X(e,t){if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`Slice ${e} must be an object with top/right/bottom/left.`);let n=t,r=[`top`,`right`,`bottom`,`left`],i=K();for(let t of r){let r=n[t];if(typeof r!=`number`||!Number.isInteger(r)||r<0)throw Error(`Slice ${e}.${t} must be a non-negative integer.`);i[t]=r}return i}var Z={type:`slice`,accepts:[...U],defaultParameters:()=>({mode:`nine`,insets:K(),pixelRatio:1,preset:`default`}),validateParameters(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`Slice parameters must be an object.`);let t=e;if(typeof t.mode!=`string`||!G.includes(t.mode))throw Error(`Slice "mode" must be one of ${G.map(e=>`'${e}'`).join(` | `)}.`);let n=X(`insets`,t.insets);if(typeof t.pixelRatio!=`number`||!Number.isInteger(t.pixelRatio)||t.pixelRatio<1)throw Error(`Slice "pixelRatio" must be an integer ≥ 1.`);let r=t.overdraw===void 0?void 0:X(`overdraw`,t.overdraw);if(typeof t.preset!=`string`||t.preset.length===0)throw Error(`Slice parameters need a non-empty string "preset".`);return{mode:t.mode,insets:n,pixelRatio:t.pixelRatio,...r===void 0?{}:{overdraw:r},preset:t.preset}}},Q=new class{#e=new Map;register(e){if(this.#e.has(e.type))throw Error(`Plugin type "${e.type}" is already registered.`);this.#e.set(e.type,e)}has(e){return this.#e.has(e)}values(){return[...this.#e.values()]}types(){return[...this.#e.keys()]}project(e,t){let n=Object.create(null);for(let r of this.#e.keys()){if(!Object.hasOwn(e,r))throw Error(`Registered plugin "${r}" has no ${t}.`);n[r]=e[r]}return n}};Q.register(W),Q.register(Z),Q.register(B),Q.register(H),Q.register(M);var $=Q.values();function ee(e=$){return[...new Set(e.flatMap(e=>e.accepts))].sort().map(e=>`.${e}`)}function te(e,t=$){return t.find(t=>t.type===e)?.accepts.map(e=>`.${e}`).sort()??[]}function ne(e,t=$){let n=e.slice(e.lastIndexOf(`.`)+1).toLowerCase();return t.filter(e=>e.accepts.includes(n)).map(e=>e.type)}function re(e){let t=e.replace(/\.[^.]+$/,``).replace(/(?:@|[-_])\dx$/i,``).replace(/([a-z0-9])([A-Z])/g,`$1 $2`).split(/[^a-zA-Z0-9]+/).filter(Boolean);if(t.length===0)return`asset`;let n=t.map((e,t)=>t===0?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(``).replace(/^[0-9]+/,``);return n?n.charAt(0).toLowerCase()+n.slice(1):`asset`}export{w as A,y as C,_ as D,l as E,u as F,d as M,b as N,m as O,x as P,v as S,C as T,E as _,Q as a,f as b,J as c,W as d,H as f,j as g,A as h,ne as i,p as j,g as k,Y as l,M as m,te as n,Z as o,B as p,re as r,K as s,ee as t,q as u,c as v,h as w,S as x,s as y};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{F as e,I as t,L as n,Q as r,X as i,Y as a,n as o,t as s}from"./D65cSBhe.js";var c=class{constructor(e,t){this.status=e,typeof t==`string`?this.body={message:t}:t?this.body=t:this.body={message:`Error: ${e}`}}toString(){return JSON.stringify(this.body)}},l=class{constructor(e,t){try{new Headers({location:t})}catch{throw Error(`Invalid redirect location ${JSON.stringify(t)}: this string contains characters that cannot be used in HTTP headers`)}this.status=e,this.location=t}},u=class extends Error{constructor(e,t,n){super(n),this.status=e,this.text=t}};new URL(`sveltekit-internal://`);function d(e,t){return e===`/`||t===`ignore`?e:t===`never`?e.endsWith(`/`)?e.slice(0,-1):e:t===`always`&&!e.endsWith(`/`)?e+`/`:e}function f(e){return e.split(`%25`).map(decodeURI).join(`%25`)}function p(e){for(let t in e)e[t]=decodeURIComponent(e[t]);return e}function m({href:e}){return e.split(`#`)[0]}function h(){}function ee(...e){let t=5381;for(let n of e)if(typeof n==`string`){let e=n.length;for(;e;)t=t*33^n.charCodeAt(--e)}else if(ArrayBuffer.isView(n)){let e=new Uint8Array(n.buffer,n.byteOffset,n.byteLength),r=e.length;for(;r;)t=t*33^e[--r]}else throw TypeError(`value must be a string or TypedArray`);return(t>>>0).toString(36)}new TextEncoder;function g(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}var _=window.fetch;window.fetch=(e,t)=>((e instanceof Request?e.method:t?.method||`GET`)!==`GET`&&v.delete(b(e)),_(e,t));var v=new Map;function te(e,t){let n=b(e,t),r=document.querySelector(n);if(r?.textContent){r.remove();let{body:e,...t}=JSON.parse(r.textContent);r.getAttribute(`data-b64`)!==null&&(e=g(e));let i=r.getAttribute(`data-ttl`);return i&&v.set(n,{body:e,init:t,ttl:1e3*Number(i)}),Promise.resolve(new Response(e,t))}return window.fetch(e,t)}function y(e,t,n){if(v.size>0){let t=b(e,n),r=v.get(t);if(r){if(performance.now()<r.ttl&&[`default`,`force-cache`,`only-if-cached`,void 0].includes(n?.cache))return new Response(r.body,r.init);v.delete(t)}}return window.fetch(t,n)}function b(e,t){let n=`script[data-sveltekit-fetched][data-url=${JSON.stringify(e instanceof Request?e.url:e)}]`;if(t?.headers||t?.body){let e=[];t.headers&&e.push([...new Headers(t.headers)].join(`,`)),t.body&&(typeof t.body==`string`||ArrayBuffer.isView(t.body))&&e.push(t.body),n+=`[data-hash="${ee(...e)}"]`}return n}var ne=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/,re=/^\/\((?:[^)]+)\)$/;function x(e){let t=[];return{pattern:e===`/`||re.test(e)?/^\/$/:RegExp(`^${ae(e).map(e=>{let n=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(e);if(n)return t.push({name:n[1],matcher:n[2],optional:!1,rest:!0,chained:!0}),`(?:/([^]*))?`;let r=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(e);if(r)return t.push({name:r[1],matcher:r[2],optional:!0,rest:!1,chained:!0}),`(?:/([^/]+))?`;if(!e)return;let i=e.split(/\[(.+?)\](?!\])/);return`/`+i.map((e,n)=>{if(n%2){if(e.startsWith(`x+`))return se(String.fromCharCode(parseInt(e.slice(2),16)));if(e.startsWith(`u+`))return se(String.fromCharCode(...e.slice(2).split(`-`).map(e=>parseInt(e,16))));let[,r,a,o,s]=ne.exec(e);return t.push({name:o,matcher:s,optional:!!r,rest:!!a,chained:a?n===1&&i[0]===``:!1}),a?`([^]*?)`:r?`([^/]*)?`:`([^/]+?)`}return se(e)}).join(``)}).join(``)}/?$`),params:t}}function ie(e){return e!==``&&!/^\([^)]+\)$/.test(e)}function ae(e){return e.slice(1).split(`/`).filter(ie)}function oe(e,t,n){let r={},i=e.slice(1),a=i.filter(e=>e!==void 0),o=0;for(let e=0;e<t.length;e+=1){let s=t[e],c=i[e-o];if(s.chained&&s.rest&&o&&(c=i.slice(e-o,e+1).filter(e=>e).join(`/`),o=0),c===void 0)if(s.rest)c=``;else continue;if(!s.matcher||n[s.matcher](c)){r[s.name]=c;let n=t[e+1],l=i[e+1];n&&!n.rest&&n.optional&&l&&s.chained&&(o=0),!n&&!l&&Object.keys(r).length===a.length&&(o=0);continue}if(s.optional&&s.chained){o++;continue}return}if(!o)return r}function se(e){return e.normalize().replace(/[[\]]/g,`\\$&`).replace(/%/g,`%25`).replace(/\//g,`%2[Ff]`).replace(/\?/g,`%3[Ff]`).replace(/#/g,`%23`).replace(/[.*+?^${}()|\\]/g,`\\$&`)}var ce=/\[(\[)?(\.\.\.)?(\w+?)(?:=(\w+))?\]\]?/g;function le(e,t){let n=ae(e),r=e!=`/`&&e.endsWith(`/`);return`/`+n.map(n=>n.replace(ce,(n,r,i,a)=>{let o=t[a];if(!o){if(r||i&&o!==void 0)return``;throw Error(`Missing parameter '${a}' in route ${e}`)}if(o.startsWith(`/`)||o.endsWith(`/`))throw Error(`Parameter '${a}' in route ${e} cannot start or end with a slash -- this would cause an invalid route like foo//bar`);return o})).filter(Boolean).join(`/`)+(r?`/`:``)}function ue({nodes:e,server_loads:t,dictionary:n,matchers:r}){let i=new Set(t);return Object.entries(n).map(([t,[n,i,s]])=>{let{pattern:c,params:l}=x(t),u={id:t,exec:e=>{let t=c.exec(e);if(t)return oe(t,l,r)},errors:[1,...s||[]].map(t=>e[t]),layouts:[0,...i||[]].map(o),leaf:a(n)};return u.errors.length=u.layouts.length=Math.max(u.errors.length,u.layouts.length),u});function a(t){let n=t<0;return n&&(t=~t),[n,e[t]]}function o(t){return t===void 0?t:[i.has(t),e[t]]}}function de(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function fe(e,t,n=JSON.stringify){let r=n(t);try{sessionStorage[e]=r}catch{}}var S=globalThis.__sveltekit_m9a0i9?.base??``,pe=globalThis.__sveltekit_m9a0i9?.assets??S??``,me=``;function he(...e){if(!e[0].startsWith(`/`))throw Error(`Cannot use \`resolve(...)\` with a non-absolute pathname or route ID (got "${e[0]}"). \`resolve\` is only for internal pathnames and route IDs; external URLs should be used directly.`);return S+me+le(e[0],e[1])}var ge=`1784107059646`,_e=`sveltekit:snapshot`,ve=`sveltekit:scroll`,ye=`sveltekit:states`,C=`sveltekit:history`,w=`sveltekit:navigation`,T={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},E=location.origin;function be(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){let e=document.getElementsByTagName(`base`);t=e.length?e[0].href:document.URL}return new URL(e,t)}function D(){return{x:pageXOffset,y:pageYOffset}}function O(e,t){return e.getAttribute(`data-sveltekit-${t}`)}var xe={...T,"":T.hover};function Se(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function Ce(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()===`A`&&e.hasAttribute(`href`))return e;e=Se(e)}}function we(e,t,n){let r;try{if(r=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&r.hash.match(/^#[^/]/)){let e=location.hash.split(`#`)[1]||`/`;r.hash=`#${e}${r.hash}`}}catch{}let i=e instanceof SVGAElement?e.target.baseVal:e.target,a=!r||!!i||A(r,t,n)||(e.getAttribute(`rel`)||``).split(/\s+/).includes(`external`),o=r?.origin===E&&e.hasAttribute(`download`);return{url:r,external:a,target:i,download:o}}function k(e){let t=null,n=null,r=null,i=null,a=null,o=null,s=e;for(;s&&s!==document.documentElement;)r===null&&(r=O(s,`preload-code`)),i===null&&(i=O(s,`preload-data`)),t===null&&(t=O(s,`keepfocus`)),n===null&&(n=O(s,`noscroll`)),a===null&&(a=O(s,`reload`)),o===null&&(o=O(s,`replacestate`)),s=Se(s);function c(e){switch(e){case``:case`true`:return!0;case`off`:case`false`:return!1;default:return}}return{preload_code:xe[r??`off`],preload_data:xe[i??`off`],keepfocus:c(t),noscroll:c(n),reload:c(a),replace_state:c(o)}}function Te(e){let t=r(e),n=!0;function i(){n=!0,t.update(e=>e)}function a(e){n=!1,t.set(e)}function o(e){let r;return t.subscribe(t=>{(r===void 0||n&&t!==r)&&e(r=t)})}return{notify:i,set:a,subscribe:o}}var Ee={v:h};function De(){let{set:e,subscribe:t}=r(!1);async function n(){clearTimeout(void 0);try{let t=await fetch(`${pe}/_app/version.json`,{headers:{pragma:`no-cache`,"cache-control":`no-cache`}});if(!t.ok)return!1;let n=(await t.json()).version!==ge;return n&&(e(!0),Ee.v(),clearTimeout(void 0)),n}catch{return!1}}return{subscribe:t,check:n}}function A(e,t,n){return e.origin!==E||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function Oe(e){}var ke=new Set([`load`,`prerender`,`csr`,`ssr`,`trailingSlash`,`config`]);[...ke],[...new Set([...ke])];function Ae(e){return e.filter(e=>e!=null)}function j(e,t){return e+`/`+t}function je(e){return e instanceof c||e instanceof u?e.status:500}function Me(e){return e instanceof u?e.text:`Internal Error`}var M,N,P,Ne=o.toString().includes(`$$`)||/function \w+\(\) \{\}/.test(o.toString()),Pe=`a:`;Ne?(M={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(Pe)},N={current:null},P={current:!1}):(M=new class{#e=i({});get data(){return e(this.#e)}set data(e){a(this.#e,e)}#t=i(null);get form(){return e(this.#t)}set form(e){a(this.#t,e)}#n=i(null);get error(){return e(this.#n)}set error(e){a(this.#n,e)}#r=i({});get params(){return e(this.#r)}set params(e){a(this.#r,e)}#i=i({id:null});get route(){return e(this.#i)}set route(e){a(this.#i,e)}#a=i({});get state(){return e(this.#a)}set state(e){a(this.#a,e)}#o=i(-1);get status(){return e(this.#o)}set status(e){a(this.#o,e)}#s=i(new URL(Pe));get url(){return e(this.#s)}set url(e){a(this.#s,e)}},N=new class{#e=i(null);get current(){return e(this.#e)}set current(e){a(this.#e,e)}},P=new class{#e=i(!1);get current(){return e(this.#e)}set current(e){a(this.#e,e)}},Ee.v=()=>P.current=!0);function Fe(e){Object.assign(M,e)}var{onMount:Ie,tick:Le}=s,Re=new Set([`icon`,`shortcut icon`,`apple-touch-icon`]),F=null,I=de(`sveltekit:scroll`)??{},L=de(`sveltekit:snapshot`)??{},R={url:Te({}),page:Te({}),navigating:r(null),updated:De()};function ze(e){I[e]=D()}function Be(e,t){let n=e+1;for(;I[n];)delete I[n],n+=1;for(n=t+1;L[n];)delete L[n],n+=1}function z(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(h)}async function Ve(){if(`serviceWorker`in navigator){let e=await navigator.serviceWorker.getRegistration(S||`/`);e&&await e.update()}}var He,Ue,We,B,Ge,V,Ke={},qe={},Je=[],Ye=[],H=null;function Xe(){H?.fork?.then(e=>e?.discard()),H=null,Q={element:void 0,href:void 0}}var Ze=new Map,Qe=new Set,$e=new Set,U=new Set,W={branch:[],error:null,url:null,nav:null},et=!1,tt=!1,nt=!0,G=!1,K=!1,rt=!1,it=!1,at,q,J,Y,ot=new Set,st=new Map,ct=new Map;async function lt(e,t,n){if(globalThis.__sveltekit_m9a0i9.data){let{q:e={},p:t={},l:n={},f:r={}}=globalThis.__sveltekit_m9a0i9.data;for(let t in e)Ke[t]=e[t];for(let e in n)Ke[e]=n[e];for(let e in r)Ke[e]=r[e];for(let e in t)qe[e]=t[e]}document.URL!==location.href&&(location.href=location.href),V=e,await e.hooks.init?.(),He=ue(e),B=document.documentElement,Ge=t,Ue=e.nodes[0],We=e.nodes[1],Ue(),We(),q=history.state?.[C],J=history.state?.[w],q||(q=J=Date.now(),history.replaceState({...history.state,[C]:q,[w]:J},``));let r=I[q];function i(){r&&(history.scrollRestoration=`manual`,scrollTo(r.x,r.y))}n?(i(),await Lt(Ge,n)):(await Z({type:`enter`,url:be(V.hash?Ut(new URL(location.href)):location.href),replace_state:!0}),i()),It()}function ut(){Je.length=0,it=!1}function dt(e){Ye.some(e=>e?.snapshot)&&(L[e]=Ye.map(e=>e?.snapshot?.capture()))}function ft(e){L[e]?.forEach((e,t)=>{Ye[t]?.snapshot?.restore(e)})}function pt(){ze(q),fe(ve,I),dt(J),fe(_e,L)}async function mt(e,t,r,i){let a,o;t.invalidateAll&&Xe(),await Z({type:`goto`,url:be(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:r,nav_token:i,accept:()=>{if(t.invalidateAll){it=!0,a=new Set;for(let[e,t]of st)for(let[n,r]of t)r.resource?.reset(),a.add(j(e,n));o=new Set;for(let[e,t]of ct)for(let n of t.keys())o.add(j(e,n))}t.invalidate&&t.invalidate.forEach(Ft)}}),t.invalidateAll&&n().then(n).then(()=>{for(let[e,t]of st)for(let[n,{resource:r}]of t)a?.has(j(e,n))&&r.start();for(let[e,t]of ct)for(let[n,{resource:r}]of t)o?.has(j(e,n))&&r.reconnect()})}async function ht(e){if(e.id!==H?.id){Xe();let t={};ot.add(t),H={id:e.id,token:t,promise:Tt({...e,preload:t}).then(e=>(ot.delete(t),e.type===`loaded`&&e.state.error&&Xe(),e)),fork:null}}return H.promise}async function gt(e){let t=(await X(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(e=>e[1]()))}async function _t(e,t,n){let r={params:W.params,route:{id:W.route?.id??null},url:new URL(location.href)};if(W={...e.state,nav:r},Fe(e.props.page),at=new V.root({target:t,props:{...e.props,stores:R,components:Ye},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),n){let e={from:null,to:{...r,scroll:I[q]??D()},willUnload:!1,type:`enter`,complete:Promise.resolve()};U.forEach(t=>t(e))}ft(J),tt=!0}async function vt({url:e,params:t,branch:n,errors:r,status:i,error:a,route:o,form:s}){let c=`never`;if(S&&(e.pathname===S||e.pathname===S+`/`))c=`always`;else for(let e of n)e?.slash!==void 0&&(c=e.slash);e.pathname=d(e.pathname,c),e.search=e.search;let l={type:`loaded`,state:{url:e,params:t,branch:n,error:a,route:o},props:{constructors:Ae(n).map(e=>e.node.component),page:Ht(M)}};s!==void 0&&(l.props.form=s);let u={},f=!M,p=0;for(let e=0;e<Math.max(n.length,W.branch.length);e+=1){let t=n[e],r=W.branch[e];t?.data!==r?.data&&(f=!0),t&&(u={...u,...t.data},f&&(l.props[`data_${p}`]=u),p+=1)}return(!W.url||e.href!==W.url.href||W.error!==a||s!==void 0&&s!==M.form||f)&&(l.props.page={error:a,params:t,route:{id:o?.id??null},state:{},status:i,url:new URL(e),form:s??null,data:f?u:M.data}),l}async function yt({loader:e,parent:t,url:n,params:r,route:i,server_data_node:a}){let o={dependencies:new Set,params:new Set,parent:!1,route:!1,url:!1,search_params:new Set},s=await e();return{node:s,loader:e,server:a,universal:s.universal?.load?{type:`data`,data:null,uses:o}:null,data:a?.data??null,slash:s.universal?.trailingSlash??a?.slash}}function bt(e,t,n){let r=e instanceof Request?e.url:e,i=new URL(r,n);return i.origin===n.origin&&(r=i.href.slice(n.origin.length)),{resolved:i,promise:tt?y(r,i.href,t):te(r,t)}}function xt(e,t,n,r,i,a){if(it)return!0;if(!i)return!1;if(i.parent&&e||i.route&&t||i.url&&n)return!0;for(let e of i.search_params)if(r.has(e))return!0;for(let e of i.params)if(a[e]!==W.params[e])return!0;for(let e of i.dependencies)if(Je.some(t=>t(new URL(e))))return!0;return!1}function St(e,t){return e?.type===`data`?e:e?.type===`skip`?t??null:null}function Ct(e,t){if(!e)return new Set(t.searchParams.keys());let n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(let r of n){let i=e.searchParams.getAll(r),a=t.searchParams.getAll(r);i.every(e=>a.includes(e))&&a.every(e=>i.includes(e))&&n.delete(r)}return n}function wt({error:e,url:t,route:n,params:r}){return{type:`loaded`,state:{error:e,url:t,route:n,params:r,branch:[]},props:{page:Ht(M),constructors:[]}}}async function Tt({id:e,invalidating:t,url:n,params:r,route:i,preload:a}){if(H?.id===e)return ot.delete(H.token),H.promise;let{errors:o,layouts:s,leaf:u}=i,d=[...s,u];o.forEach(e=>e?.().catch(h)),d.forEach(e=>e?.[1]().catch(h));let f=W.url?e!==At(W.url):!1,p=W.route?i.id!==W.route.id:!1,m=Ct(W.url,n),ee=!1,g=d.map(async(e,t)=>{if(!e)return;let a=W.branch[t];return e[1]===a?.loader&&!xt(ee,p,f,m,a.universal?.uses,r)?a:(ee=!0,yt({loader:e[1],url:n,params:r,route:i,parent:async()=>{let e={};for(let n=0;n<t;n+=1)Object.assign(e,(await g[n])?.data);return e},server_data_node:St(e[0]?{type:`skip`}:null,e[0]?a?.server:void 0)}))});for(let e of g)e.catch(h);let _=[];for(let e=0;e<d.length;e+=1)if(d[e])try{_.push(await g[e])}catch(t){if(t instanceof l)return{type:`redirect`,location:t.location};if(a&&ot.has(a))return wt({error:await $(t,{params:r,url:n,route:{id:i.id}}),url:n,params:r,route:i});let s=je(t),u;if(t instanceof c)u=t.body;else{if(await R.updated.check())return await Ve(),await z(n);u=await $(t,{params:r,url:n,route:{id:i.id}})}let d=await Et(e,_,o);return d?vt({url:n,params:r,branch:_.slice(0,d.idx).concat(d.node),errors:o,status:s,error:u,route:i}):await Mt(n,{id:i.id},u,s)}else _.push(void 0);return vt({url:n,params:r,branch:_,errors:o,status:200,error:null,route:i,form:t?void 0:null})}async function Et(e,t,n){for(;e--;)if(n[e]){let r=e;for(;!t[r];)--r;try{return{idx:r+1,node:{node:await n[e](),loader:n[e],data:{},server:null,universal:null}}}catch{continue}}}async function Dt({status:e,error:t,url:n,route:r}){let i={};try{return vt({url:n,params:i,branch:[await yt({loader:Ue,url:n,params:i,route:r,parent:()=>Promise.resolve({}),server_data_node:St(null)}),{node:await We(),loader:We,universal:null,server:null,data:null}],status:e,error:t,errors:[],route:null})}catch(t){if(t instanceof l){await mt(new URL(t.location,location.href),{},0);return}let a=await V.get_error_template(),o=await $(t,{url:n,params:i,route:r}),s=a({status:e,message:String(o?.message??``).replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`)}),c=new DOMParser().parseFromString(s,`text/html`);throw document.documentElement.replaceChild(document.adoptNode(c.head),document.head),document.documentElement.replaceChild(document.adoptNode(c.body),document.body),t}}async function Ot(e){let t=e.href;if(Ze.has(t))return Ze.get(t);let n;try{let r=(async()=>{let t=await V.hooks.reroute({url:new URL(e),fetch:async(t,n)=>bt(t,n,e).promise})??e;if(typeof t==`string`){let n=new URL(e);V.hash?n.hash=t:n.pathname=t,t=n}return t})();Ze.set(t,r),n=await r}catch{Ze.delete(t);return}return n}async function X(e,t){if(e&&!A(e,S,V.hash)){let n=await Ot(e);if(!n)return;let r=kt(n);for(let n of He){let i=n.exec(r);if(i)return{id:At(e),invalidating:t,route:n,params:p(i),url:e}}}}function kt(e){return f(V.hash?e.hash.replace(/^#/,``).replace(/[?#].+/,``):e.pathname.slice(S.length))||`/`}function At(e){return(V.hash?e.hash.replace(/^#/,``):e.pathname)+e.search}function jt({url:e,type:t,intent:n,delta:r,event:i,scroll:a}){let o=!1,s=Vt(W,n,e,t,a??null);r!==void 0&&(s.navigation.delta=r),i!==void 0&&(s.navigation.event=i);let c={...s.navigation,cancel:()=>{o=!0,s.reject(Error(`navigation cancelled`))}};return G||Qe.forEach(e=>e(c)),o?null:s}async function Z({type:e,url:r,popped:i,keepfocus:a,noscroll:o,replace_state:s,state:c={},redirect_count:l=0,nav_token:d={},accept:f=h,block:p=h,event:m}){let ee=Y;Y=d;let g=await X(r,!1),_=e===`enter`?Vt(W,g,r,e):jt({url:r,type:e,delta:i?.delta,intent:g,scroll:i?.scroll,event:m});if(!_){p(),Y===d&&(Y=ee);return}let v=q,te=J;f(),G=!0,tt&&_.navigation.type!==`enter`&&R.navigating.set(N.current=_.navigation);let y=g&&await Tt(g);if(!y){if(A(r,S,V.hash))return await z(r,s);y=await Mt(r,{id:null},await $(new u(404,`Not Found`,`Not found: ${r.pathname}`),{url:r,params:{},route:{id:null}}),404,s)}if(r=g?.url||r,Y!==d){_.reject(Error(`navigation aborted`));return}if(!y)return;if(y.type===`redirect`){if(l<20){await Z({type:e,url:new URL(y.location,r),popped:i,keepfocus:a,noscroll:o,replace_state:s,state:c,redirect_count:l+1,nav_token:d}),_.fulfil(void 0);return}if(y=await Dt({status:500,error:await $(Error(`Redirect loop`),{url:r,params:{},route:{id:null}}),url:r,route:{id:null}}),!y)return}else if(y.props.page.status>=400&&await R.updated.check())return await Ve(),await z(r,s);if(ut(),ze(v),dt(te),y.props.page.url.pathname!==r.pathname&&(r.pathname=y.props.page.url.pathname),c=i?i.state:c,!i){let e=+!s,t={[C]:q+=e,[w]:J+=e,[ye]:c};(s?history.replaceState:history.pushState).call(history,t,``,r),s||Be(q,J)}let b=g&&H?.id===g.id?H.fork:null;H?.fork&&!b?Xe():(H=null,Q={element:void 0,href:void 0}),y.props.page.state=c;let ne;if(tt){let e=(await Promise.all(Array.from($e,e=>e(_.navigation)))).filter(e=>typeof e==`function`);if(e.length>0){function t(){e.forEach(e=>{U.delete(e)})}e.push(t),e.forEach(e=>{U.add(e)})}let n=_.navigation.to;W={...y.state,nav:{params:n.params,route:n.route,url:n.url}},y.props.page&&(y.props.page.url=r),!a&&document.activeElement instanceof HTMLElement&&document.activeElement!==document.body&&document.activeElement.blur();let i=b&&await b;i?ne=i.commit():(F=null,at.$set(y.props),F&&Object.assign(y.props.page,F),Fe(y.props.page),ne=t?.()),rt=!0}else await _t(y,Ge,!1);let{activeElement:re}=document;if(await ne,await n(),await n(),Y!==d){_.reject(Error(`navigation aborted`));return}y.props.page&&F&&Object.assign(y.props.page,F);let x=null;if(nt){let e=i?i.scroll:o?D():null;e?scrollTo(e.x,e.y):(x=r.hash&&document.getElementById(Wt(r)))?x.scrollIntoView():scrollTo(0,0)}let ie=document.activeElement!==re&&document.activeElement!==document.body;!a&&!ie&&Bt(r,!x),nt=!0,G=!1,_.fulfil(void 0),_.navigation.to&&(_.navigation.to.scroll=D()),U.forEach(e=>e(_.navigation)),e===`popstate`&&ft(J),R.navigating.set(N.current=null)}async function Mt(e,t,n,r,i){return e.origin===E&&e.pathname===location.pathname&&!et?await Dt({status:r,error:n,url:e,route:t}):await z(e,i)}var Q={element:void 0,href:void 0};function Nt(){let e,t;B.addEventListener(`mousemove`,t=>{let n=t.target;clearTimeout(e),e=setTimeout(()=>{i(n,T.hover)},20)});function n(e){e.defaultPrevented||i(e.composedPath()[0],T.tap)}B.addEventListener(`mousedown`,n),B.addEventListener(`touchstart`,n,{passive:!0});let r=new IntersectionObserver(e=>{for(let t of e)t.isIntersecting&&(gt(new URL(t.target.href)),r.unobserve(t.target))},{threshold:0});async function i(e,n){let r=Ce(e,B),i=r===Q.element&&r?.href===Q.href&&n>=t;if(!r||i)return;let{url:a,external:o,download:s}=we(r,S,V.hash);if(o||s)return;let c=k(r),l=a&&At(W.url)===At(a);if(!(c.reload||l))if(n<=c.preload_data){Q={element:r,href:r.href},t=T.tap;let e=await X(a,!1);if(!e)return;ht(e)}else n<=c.preload_code&&(Q={element:r,href:r.href},t=n,gt(a))}function a(){r.disconnect();for(let e of B.querySelectorAll(`a`)){let{url:t,external:n,download:i}=we(e,S,V.hash);if(n||i)continue;let a=k(e);a.reload||(a.preload_code===T.viewport&&r.observe(e),a.preload_code===T.eager&>(t))}}U.add(a),a()}function $(e,t){if(e instanceof c)return e.body;let n=je(e),r=Me(e);return V.hooks.handleError({error:e,event:t,status:n,message:r})??{message:r}}function Pt(e,t={}){return e=new URL(be(e)),e.origin===E?mt(e,t,0):Promise.reject(Error(`goto: invalid URL`))}function Ft(e){if(typeof e==`function`)Je.push(e);else{let{href:t}=new URL(e,location.href);Je.push(e=>e.href===t)}}function It(){history.scrollRestoration=`manual`,addEventListener(`beforeunload`,e=>{let t=!1;if(pt(),!G){let e=Vt(W,void 0,null,`leave`),n={...e.navigation,cancel:()=>{t=!0,e.reject(Error(`navigation cancelled`))}};Qe.forEach(e=>e(n))}t?(e.preventDefault(),e.returnValue=``):history.scrollRestoration=`auto`}),addEventListener(`visibilitychange`,()=>{document.visibilityState===`hidden`&&pt()}),navigator.connection?.saveData||Nt(),B.addEventListener(`click`,async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;let n=Ce(t.composedPath()[0],B);if(!n)return;let{url:r,external:i,target:a,download:o}=we(n,S,V.hash);if(!r)return;if(a===`_parent`||a===`_top`){if(window.parent!==window)return}else if(a&&a!==`_self`)return;let s=k(n);if(!(n instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol===`https:`||r.protocol===`http:`)||o)return;let[c,l]=(V.hash?r.hash.replace(/^#/,``):r.href).split(`#`),u=c===m(location);if(i||s.reload&&(!u||!l)){jt({url:r,type:`link`,event:t})?G=!0:t.preventDefault();return}if(l!==void 0&&u){let[,i]=W.url.href.split(`#`);if(i===l){if(t.preventDefault(),l===``||l===`top`&&n.ownerDocument.getElementById(`top`)===null)scrollTo({top:0});else{let e=n.ownerDocument.getElementById(decodeURIComponent(l));e&&(e.scrollIntoView(),e.focus())}return}if(K=!0,ze(q),e(r),!s.replace_state)return;K=!1}t.preventDefault(),await new Promise(e=>{requestAnimationFrame(()=>{setTimeout(e,0)}),setTimeout(e,100)}),await Z({type:`link`,url:r,keepfocus:s.keepfocus,noscroll:s.noscroll,replace_state:s.replace_state??r.href===location.href,event:t})}),B.addEventListener(`submit`,e=>{if(e.defaultPrevented)return;let t=HTMLFormElement.prototype.cloneNode.call(e.target),n=e.submitter;if((n?.formTarget||t.target)===`_blank`||(n?.formMethod||t.method)!==`get`)return;let r=new URL(n?.hasAttribute(`formaction`)&&n?.formAction||t.action);if(A(r,S,!1))return;let i=e.target,a=k(i);if(a.reload)return;e.preventDefault(),e.stopPropagation();let o=new FormData(i,n);r.search=new URLSearchParams(o).toString(),Z({type:`form`,url:r,keepfocus:a.keepfocus,noscroll:a.noscroll,replace_state:a.replace_state??r.href===location.href,event:e})}),addEventListener(`popstate`,async t=>{if(!zt)if(t.state?.[`sveltekit:history`]){let n=t.state[C];if(Y={},n===q)return;let r=I[n],i=t.state[`sveltekit:states`]??{},a=new URL(t.state[`sveltekit:pageurl`]??location.href),o=t.state[w],s=W.url?m(location)===m(W.url):!1;if(o===J&&(rt||s)){i!==M.state&&(M.state=i),e(a),I[q]=D(),r&&scrollTo(r.x,r.y),q=n;return}let c=n-q;await Z({type:`popstate`,url:a,popped:{state:i,scroll:r,delta:c},accept:()=>{q=n,J=o},block:()=>{history.go(-c)},nav_token:Y,event:t})}else K||(e(new URL(location.href)),V.hash&&location.reload())}),addEventListener(`hashchange`,()=>{K&&(K=!1,history.replaceState({...history.state,[C]:++q,[w]:J},``,location.href))});for(let e of document.querySelectorAll(`link`))Re.has(e.rel)&&(e.href=e.href);addEventListener(`pageshow`,e=>{e.persisted&&R.navigating.set(N.current=null)});function e(e){W.url=M.url=e,R.page.set(Ht(M)),R.page.notify()}}async function Lt(e,{status:t=200,error:n,node_ids:r,params:i,route:a,server_route:o,data:s,form:c}){et=!0;let u=new URL(location.href),d;({params:i={},route:a={id:null}}=await X(u,!1)||{}),d=He.find(({id:e})=>e===a.id);let f,p=!0;try{let e=r.map(async(t,n)=>{let r=s[n];return r?.uses&&(r.uses=Rt(r.uses)),yt({loader:V.nodes[t],url:u,params:i,route:a,parent:async()=>{let t={};for(let r=0;r<n;r+=1)Object.assign(t,(await e[r]).data);return t},server_data_node:St(r)})}),o=await Promise.all(e);if(d){let e=d.layouts;for(let t=0;t<e.length;t++)e[t]||o.splice(t,0,void 0)}f=await vt({url:u,params:i,branch:o,status:t,error:n,errors:d?.errors,form:c,route:d??null})}catch(t){if(t instanceof l)return await z(new URL(t.location,location.href));f=await Dt({status:je(t),error:await $(t,{url:u,params:i,route:a}),url:u,route:a}),e.textContent=``,p=!1}f&&(f.props.page&&(f.props.page.state={}),await _t(f,e,p))}function Rt(e){return{dependencies:new Set(e?.dependencies??[]),params:new Set(e?.params??[]),parent:!!e?.parent,route:!!e?.route,url:!!e?.url,search_params:new Set(e?.search_params??[])}}var zt=!1;function Bt(e,t=!0){let n=document.querySelector(`[autofocus]`);if(n)n.focus();else{let n=Wt(e);if(n&&document.getElementById(n)){let{x:r,y:i}=D();setTimeout(()=>{let a=history.state;zt=!0,location.replace(new URL(`#${n}`,location.href)),history.replaceState(a,``,e),t&&scrollTo(r,i),zt=!1})}else{let e=document.body,t=e.getAttribute(`tabindex`);e.tabIndex=-1,e.focus({preventScroll:!0,focusVisible:!1}),t===null?e.removeAttribute(`tabindex`):e.setAttribute(`tabindex`,t)}let r=getSelection();if(r&&r.type!==`None`){let e=[];for(let t=0;t<r.rangeCount;t+=1)e.push(r.getRangeAt(t));setTimeout(()=>{if(r.rangeCount===e.length){for(let t=0;t<r.rangeCount;t+=1){let n=e[t],i=r.getRangeAt(t);if(n.commonAncestorContainer!==i.commonAncestorContainer||n.startContainer!==i.startContainer||n.endContainer!==i.endContainer||n.startOffset!==i.startOffset||n.endOffset!==i.endOffset)return}r.removeAllRanges()}})}}}function Vt(e,t,n,r,i=null){let a,o,s=new Promise((e,t)=>{a=e,o=t});return s.catch(h),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url,scroll:D()},to:n&&{params:t?.params??null,route:{id:t?.route?.id??null},url:n,scroll:i},willUnload:!t,type:r,complete:s},fulfil:a,reject:o}}function Ht(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function Ut(e){let t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function Wt(e){let t;if(V.hash){let[,,n]=e.hash.split(`#`,3);t=n??``}else t=e.hash.slice(1);return decodeURIComponent(t)}export{M as a,he as c,N as i,lt as n,P as o,R as r,Oe as s,Pt as t};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e,s as t}from"../chunks/RVmTMq_g.js";export{t as load_css,e as start};
|
|
Binary file
|