fundus 0.15.0 → 0.17.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 +158 -1
- package/build/client/_app/immutable/assets/2.X44Wyac-.css +1 -0
- package/build/client/_app/immutable/assets/2.X44Wyac-.css.br +0 -0
- package/build/client/_app/immutable/assets/2.X44Wyac-.css.gz +0 -0
- package/build/client/_app/immutable/assets/{3.C6xo25uI.css → 3.66PJT3JC.css} +1 -1
- package/build/client/_app/immutable/assets/3.66PJT3JC.css.br +0 -0
- package/build/client/_app/immutable/assets/3.66PJT3JC.css.gz +0 -0
- package/build/client/_app/immutable/assets/{AssetSourceMenu.IjDdjx3o.css → AssetSourceMenu.Buj2UxUg.css} +1 -1
- package/build/client/_app/immutable/assets/AssetSourceMenu.Buj2UxUg.css.br +0 -0
- package/build/client/_app/immutable/assets/AssetSourceMenu.Buj2UxUg.css.gz +0 -0
- package/build/client/_app/immutable/chunks/{VX-Uq_b9.js → 5fq8ySvR.js} +1 -1
- package/build/client/_app/immutable/chunks/5fq8ySvR.js.br +0 -0
- package/build/client/_app/immutable/chunks/5fq8ySvR.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BcVZHIBD.js +1 -0
- package/build/client/_app/immutable/chunks/BcVZHIBD.js.br +0 -0
- package/build/client/_app/immutable/chunks/BcVZHIBD.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DXiUbZ9S.js +2 -0
- package/build/client/_app/immutable/chunks/DXiUbZ9S.js.br +0 -0
- package/build/client/_app/immutable/chunks/DXiUbZ9S.js.gz +0 -0
- package/build/client/_app/immutable/chunks/H5KnxQLQ.js +108 -0
- package/build/client/_app/immutable/chunks/H5KnxQLQ.js.br +0 -0
- package/build/client/_app/immutable/chunks/H5KnxQLQ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{-8MKoIIe.js → jEVVu5G9.js} +1 -1
- package/build/client/_app/immutable/chunks/jEVVu5G9.js.br +0 -0
- package/build/client/_app/immutable/chunks/jEVVu5G9.js.gz +0 -0
- package/build/client/_app/immutable/entry/{app.CJpgt8H5.js → app.Z9n2k33I.js} +2 -2
- package/build/client/_app/immutable/entry/app.Z9n2k33I.js.br +0 -0
- package/build/client/_app/immutable/entry/app.Z9n2k33I.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.DGo1uhI2.js +1 -0
- package/build/client/_app/immutable/entry/start.DGo1uhI2.js.br +0 -0
- package/build/client/_app/immutable/entry/start.DGo1uhI2.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.DiZpkhxP.js +1 -0
- package/build/client/_app/immutable/nodes/0.DiZpkhxP.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.DiZpkhxP.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{1.D6OhgXcC.js → 1.rgoSlmPu.js} +1 -1
- package/build/client/_app/immutable/nodes/1.rgoSlmPu.js.br +2 -0
- package/build/client/_app/immutable/nodes/1.rgoSlmPu.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.Dzp3a3be.js +3 -0
- package/build/client/_app/immutable/nodes/2.Dzp3a3be.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.Dzp3a3be.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.mSsa2TDI.js +1 -0
- package/build/client/_app/immutable/nodes/3.mSsa2TDI.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.mSsa2TDI.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.4oRGPYr4.js +2 -0
- package/build/client/_app/immutable/nodes/4.4oRGPYr4.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.4oRGPYr4.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 +8 -7
- package/build/handler.js.map +1 -1
- package/build/index.js +8 -7
- package/build/index.js.map +1 -1
- package/build/server/chunks/chunks/{context.js-CVuTSPjH.js → context.js-Dh0ibRIF.js} +818 -136
- package/build/server/chunks/chunks/context.js-Dh0ibRIF.js.map +1 -0
- package/build/server/chunks/chunks/{contract.js-itFN0Gon.js → contract.js-_LTMZBo2.js} +156 -58
- package/build/server/chunks/chunks/contract.js-_LTMZBo2.js.map +1 -0
- package/build/server/chunks/chunks/{core.js-CABVXpby.js → core.js-CTyKR4bu.js} +145 -156
- package/build/server/chunks/chunks/core.js-CTyKR4bu.js.map +1 -0
- package/build/server/chunks/chunks/{exports.js-VRV1_yEb.js → exports.js-gz2aNXzz.js} +2 -2
- package/build/server/chunks/chunks/{exports.js-VRV1_yEb.js.map → exports.js-gz2aNXzz.js.map} +1 -1
- package/build/server/chunks/chunks/{http.js-ChQRRKfZ.js → http.js-BiqUcAuu.js} +3 -2
- package/build/server/chunks/chunks/http.js-BiqUcAuu.js.map +1 -0
- package/build/server/chunks/chunks/{internal.js-qXxDe7VN.js → internal.js-DoH0cN5N.js} +5 -3
- package/build/server/chunks/chunks/internal.js-DoH0cN5N.js.map +1 -0
- package/build/server/chunks/chunks/internal2.js-BlXt2rfE.js.map +1 -1
- package/build/server/chunks/chunks/{manifest-membership.js-BnSECWpJ.js → manifest-membership.js-at1ixQdW.js} +10 -3
- package/build/server/chunks/chunks/manifest-membership.js-at1ixQdW.js.map +1 -0
- package/build/server/chunks/chunks/{raw-reconciliation.js-ZEOCk_jA.js → raw-reconciliation.js-CUH8IIJx.js} +3 -3
- package/build/server/chunks/chunks/raw-reconciliation.js-CUH8IIJx.js.map +1 -0
- package/build/server/chunks/chunks/{raw-reconciliation2.js-CscuoBC2.js → raw-reconciliation2.js-z4xl5zw2.js} +2 -2
- package/build/server/chunks/chunks/{raw-reconciliation2.js-CscuoBC2.js.map → raw-reconciliation2.js-z4xl5zw2.js.map} +1 -1
- package/build/server/chunks/chunks/{shared.js-DnEOHbgT.js → shared.js-CI-ZkPQn.js} +2 -2
- package/build/server/chunks/chunks/{shared.js-DnEOHbgT.js.map → shared.js-CI-ZkPQn.js.map} +1 -1
- package/build/server/chunks/chunks/{utils.js-lNH0hKSx.js → utils.js-gXYLxRG9.js} +3 -3
- package/build/server/chunks/chunks/{utils.js-lNH0hKSx.js.map → utils.js-gXYLxRG9.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-z988EDp2.js → _server.ts.js-CdDjuW0r.js} +6 -6
- package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-z988EDp2.js.map → _server.ts.js-CdDjuW0r.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-C68ru6gS.js → _server.ts.js-OWM1eORG.js} +9 -7
- package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-C68ru6gS.js.map → _server.ts.js-OWM1eORG.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/_id_/raw/{_server.ts.js-C0tk6RFk.js → _server.ts.js-DoG-7ZpZ.js} +9 -7
- package/build/server/chunks/entries/endpoints/api/assets/_id_/raw/{_server.ts.js-C0tk6RFk.js.map → _server.ts.js-DoG-7ZpZ.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/_id_/reimport/{_server.ts.js-I03oZuo8.js → _server.ts.js-CAWjVeGd.js} +9 -7
- package/build/server/chunks/entries/endpoints/api/assets/_id_/reimport/{_server.ts.js-I03oZuo8.js.map → _server.ts.js-CAWjVeGd.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/_id_/retag/_server.ts.js-CqS4aALY.js +38 -0
- package/build/server/chunks/entries/endpoints/api/assets/_id_/retag/_server.ts.js-CqS4aALY.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-BsQB8YDq.js → _server.ts.js-Bo_EsYXJ.js} +9 -7
- package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-BsQB8YDq.js.map → _server.ts.js-Bo_EsYXJ.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-CJuFE6Fb.js → _server.ts.js-DW4w0XAr.js} +9 -7
- package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-CJuFE6Fb.js.map → _server.ts.js-DW4w0XAr.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-DuOZRRiA.js → _server.ts.js-_MiNPnSy.js} +9 -7
- package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-DuOZRRiA.js.map → _server.ts.js-_MiNPnSy.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-DGzYpQbv.js → _server.ts.js-DwbrQnBc.js} +9 -7
- package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-DGzYpQbv.js.map → _server.ts.js-DwbrQnBc.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-B045QoCA.js → _server.ts.js-CEnHQf3b.js} +9 -7
- package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-B045QoCA.js.map → _server.ts.js-CEnHQf3b.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/imports/{_server.ts.js-HUkVdz19.js → _server.ts.js-BZDuJZtF.js} +9 -7
- package/build/server/chunks/entries/endpoints/api/imports/{_server.ts.js-HUkVdz19.js.map → _server.ts.js-BZDuJZtF.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-ry509mom.js → _server.ts.js-DRgdpKKd.js} +9 -7
- package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-ry509mom.js.map → _server.ts.js-DRgdpKKd.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-DU0J7U25.js → _server.ts.js-CP5QyIhz.js} +9 -7
- package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-DU0J7U25.js.map → _server.ts.js-CP5QyIhz.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/raw/adopt/{_server.ts.js-AZIV2PIn.js → _server.ts.js-BKEvt065.js} +9 -7
- package/build/server/chunks/entries/endpoints/api/raw/adopt/{_server.ts.js-AZIV2PIn.js.map → _server.ts.js-BKEvt065.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/raw/edited/accept/{_server.ts.js-CDL0hCfM.js → _server.ts.js-C_zihkDS.js} +9 -7
- package/build/server/chunks/entries/endpoints/api/raw/edited/accept/{_server.ts.js-CDL0hCfM.js.map → _server.ts.js-C_zihkDS.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/raw/edited/dismiss/{_server.ts.js-B13c17fq.js → _server.ts.js-watkBmy6.js} +9 -7
- package/build/server/chunks/entries/endpoints/api/raw/edited/dismiss/{_server.ts.js-B13c17fq.js.map → _server.ts.js-watkBmy6.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/reconcile/{_server.ts.js-BCxjyAGC.js → _server.ts.js-YtumLIou.js} +9 -7
- package/build/server/chunks/entries/endpoints/api/reconcile/{_server.ts.js-BCxjyAGC.js.map → _server.ts.js-YtumLIou.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/reveal/{_server.ts.js-BveeMZc2.js → _server.ts.js-Dkouuu-M.js} +9 -7
- package/build/server/chunks/entries/endpoints/api/reveal/{_server.ts.js-BveeMZc2.js.map → _server.ts.js-Dkouuu-M.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-BZjTd9a0.js → _server.ts.js-DwsEQeuf.js} +9 -7
- package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-BZjTd9a0.js.map → _server.ts.js-DwsEQeuf.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/usage/{_server.ts.js-BbTfPvC9.js → _server.ts.js-CdQxfhV3.js} +9 -7
- package/build/server/chunks/entries/endpoints/api/usage/{_server.ts.js-BbTfPvC9.js.map → _server.ts.js-CdQxfhV3.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-8VPJMLBk.js → _server.ts.js-DDdMocWj.js} +6 -6
- package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-8VPJMLBk.js.map → _server.ts.js-DDdMocWj.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/files/proxy/_...path_/{_server.ts.js-BqR2J2sB.js → _server.ts.js-DbzjbH32.js} +9 -7
- package/build/server/chunks/entries/endpoints/files/proxy/_...path_/{_server.ts.js-BqR2J2sB.js.map → _server.ts.js-DbzjbH32.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-DbA28dCY.js → _server.ts.js-K_JbXZsU.js} +9 -7
- package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-DbA28dCY.js.map → _server.ts.js-K_JbXZsU.js.map} +1 -1
- package/build/server/chunks/entries/{hooks.server.js-9PBc_3Jh.js → hooks.server.js-DgZAVFbQ.js} +8 -6
- package/build/server/chunks/entries/{hooks.server.js-9PBc_3Jh.js.map → hooks.server.js-DgZAVFbQ.js.map} +1 -1
- package/build/server/chunks/{handler-BHt7eOOX.js → handler-CFkKak8t.js} +5 -5
- package/build/server/chunks/{handler-BHt7eOOX.js.map → handler-CFkKak8t.js.map} +1 -1
- package/build/server/chunks/{index.js-DcVaL-Ja.js → index.js-B1IroJH5.js} +5 -5
- package/build/server/chunks/{index.js-DcVaL-Ja.js.map → index.js-B1IroJH5.js.map} +1 -1
- package/build/server/chunks/{manifest.js-DgjSU4wg.js → manifest.js-DNDBsrEU.js} +36 -29
- package/build/server/chunks/manifest.js-DNDBsrEU.js.map +1 -0
- package/build/server/chunks/nodes/{0.js-BgTB-_Zt.js → 0.js-CZ3mZUZl.js} +2 -2
- package/build/server/chunks/nodes/{0.js-BgTB-_Zt.js.map → 0.js-CZ3mZUZl.js.map} +1 -1
- package/build/server/chunks/nodes/1.js-BmDzLKxV.js +7 -0
- package/build/server/chunks/nodes/{1.js-DNabcIPP.js.map → 1.js-BmDzLKxV.js.map} +1 -1
- package/build/server/chunks/nodes/2.js-Dirm-bY-.js +7 -0
- package/build/server/chunks/nodes/2.js-Dirm-bY-.js.map +1 -0
- package/build/server/chunks/nodes/3.js-DOqHmSWt.js +7 -0
- package/build/server/chunks/nodes/3.js-DOqHmSWt.js.map +1 -0
- package/build/server/chunks/nodes/4.js-C8pmF8IP.js +7 -0
- package/build/server/chunks/nodes/{4.js-BE7ZG9vA.js.map → 4.js-C8pmF8IP.js.map} +1 -1
- package/dist/config.d.ts +3 -3
- package/dist/config.js +2 -2
- package/dist/core/api-types.d.ts +24 -3
- package/dist/core/config.d.ts +84 -0
- package/dist/core/config.js +9 -0
- package/dist/core/index.d.ts +10 -5
- package/dist/core/index.js +5 -2
- package/dist/core/ingest.d.ts +1 -6
- package/dist/core/ingest.js +4 -21
- package/dist/core/library-validation.d.ts +13 -0
- package/dist/core/library-validation.js +48 -0
- package/dist/core/library.d.ts +19 -0
- package/dist/core/library.js +4 -4
- package/dist/core/manifest-membership.d.ts +2 -2
- package/dist/core/package-declaration.d.ts +43 -0
- package/dist/core/package-declaration.js +80 -0
- package/dist/core/package-merge.d.ts +65 -0
- package/dist/core/package-merge.js +173 -0
- package/dist/core/propose-asset-id.d.ts +10 -0
- package/dist/core/propose-asset-id.js +25 -0
- package/dist/core/reference-graph.d.ts +3 -3
- package/dist/server/build.js +26 -11
- package/dist/server/check.d.ts +13 -3
- package/dist/server/check.js +112 -24
- package/dist/server/cli-commands.d.ts +2 -2
- package/dist/server/cli-commands.js +213 -29
- package/dist/server/codegen.d.ts +3 -1
- package/dist/server/codegen.js +18 -0
- package/dist/server/config-loader.d.ts +36 -1
- package/dist/server/config-loader.js +190 -4
- package/dist/server/http.js +1 -0
- package/dist/server/importers/figma.d.ts +26 -3
- package/dist/server/importers/figma.js +114 -1
- package/dist/server/library-store.d.ts +20 -1
- package/dist/server/library-store.js +121 -60
- package/dist/server/operations.d.ts +12 -0
- package/dist/server/operations.js +283 -48
- package/package.json +1 -1
- package/build/client/_app/immutable/assets/2.C-1MfvLQ.css +0 -1
- package/build/client/_app/immutable/assets/2.C-1MfvLQ.css.br +0 -0
- package/build/client/_app/immutable/assets/2.C-1MfvLQ.css.gz +0 -0
- package/build/client/_app/immutable/assets/3.C6xo25uI.css.br +0 -0
- package/build/client/_app/immutable/assets/3.C6xo25uI.css.gz +0 -0
- package/build/client/_app/immutable/assets/AssetSourceMenu.IjDdjx3o.css.br +0 -0
- package/build/client/_app/immutable/assets/AssetSourceMenu.IjDdjx3o.css.gz +0 -0
- package/build/client/_app/immutable/chunks/-8MKoIIe.js.br +0 -0
- package/build/client/_app/immutable/chunks/-8MKoIIe.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D1wFzWdi.js +0 -108
- package/build/client/_app/immutable/chunks/D1wFzWdi.js.br +0 -0
- package/build/client/_app/immutable/chunks/D1wFzWdi.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DmQb0SN8.js +0 -2
- package/build/client/_app/immutable/chunks/DmQb0SN8.js.br +0 -0
- package/build/client/_app/immutable/chunks/DmQb0SN8.js.gz +0 -0
- package/build/client/_app/immutable/chunks/N1X6Qzcl.js +0 -1
- package/build/client/_app/immutable/chunks/N1X6Qzcl.js.br +0 -0
- package/build/client/_app/immutable/chunks/N1X6Qzcl.js.gz +0 -0
- package/build/client/_app/immutable/chunks/VX-Uq_b9.js.br +0 -1
- package/build/client/_app/immutable/chunks/VX-Uq_b9.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.CJpgt8H5.js.br +0 -0
- package/build/client/_app/immutable/entry/app.CJpgt8H5.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.DToPJitz.js +0 -1
- package/build/client/_app/immutable/entry/start.DToPJitz.js.br +0 -1
- package/build/client/_app/immutable/entry/start.DToPJitz.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.Co4Hh8k6.js +0 -1
- package/build/client/_app/immutable/nodes/0.Co4Hh8k6.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.Co4Hh8k6.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.D6OhgXcC.js.br +0 -3
- package/build/client/_app/immutable/nodes/1.D6OhgXcC.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.sBDjyIQu.js +0 -3
- package/build/client/_app/immutable/nodes/2.sBDjyIQu.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.sBDjyIQu.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.DDt73kMC.js +0 -1
- package/build/client/_app/immutable/nodes/3.DDt73kMC.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.DDt73kMC.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.FsXXhVSP.js +0 -2
- package/build/client/_app/immutable/nodes/4.FsXXhVSP.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.FsXXhVSP.js.gz +0 -0
- package/build/server/chunks/chunks/context.js-CVuTSPjH.js.map +0 -1
- package/build/server/chunks/chunks/contract.js-itFN0Gon.js.map +0 -1
- package/build/server/chunks/chunks/core.js-CABVXpby.js.map +0 -1
- package/build/server/chunks/chunks/http.js-ChQRRKfZ.js.map +0 -1
- package/build/server/chunks/chunks/internal.js-qXxDe7VN.js.map +0 -1
- package/build/server/chunks/chunks/manifest-membership.js-BnSECWpJ.js.map +0 -1
- package/build/server/chunks/chunks/raw-reconciliation.js-ZEOCk_jA.js.map +0 -1
- package/build/server/chunks/manifest.js-DgjSU4wg.js.map +0 -1
- package/build/server/chunks/nodes/1.js-DNabcIPP.js +0 -7
- package/build/server/chunks/nodes/2.js-CcVBvLSR.js +0 -7
- package/build/server/chunks/nodes/2.js-CcVBvLSR.js.map +0 -1
- package/build/server/chunks/nodes/3.js-DreG5rig.js +0 -7
- package/build/server/chunks/nodes/3.js-DreG5rig.js.map +0 -1
- package/build/server/chunks/nodes/4.js-BE7ZG9vA.js +0 -7
|
@@ -8,8 +8,8 @@ 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,
|
|
12
|
-
import { manifestModuleFileName } from './codegen.js';
|
|
11
|
+
import { assetIdError, canonicalizeParameters, createEmptyLibrary, flatLibraryIssues, folderNameError, folderNameOf, folderOfRawPath, folderPathError, isFolderOrDescendant, joinFolderPath, manifestColorError, manifestEmojiError, parseLibrary, normalizeFolderPath, parentFolderPath, portableFolderPathKey, rawFilePathError, rawFileNameOfPath, replaceFolderPrefix, manifestNameError, serializeLibrary } from '../core/index.js';
|
|
12
|
+
import { manifestModuleCollisionIssues, manifestModuleFileName } from './codegen.js';
|
|
13
13
|
import { descriptorsByType, serverPluginForType, serverPluginsByType } from './plugins.js';
|
|
14
14
|
import { isProxyFileNameFor } from './processing/processor.js';
|
|
15
15
|
import { ensureManagedFolder, listRelativeFiles, syncManagedFolders } from './folder-filesystem.js';
|
|
@@ -135,8 +135,9 @@ export class LibraryStore {
|
|
|
135
135
|
const folder = options.folder === undefined ? '' : normalizeFolderPath(options.folder);
|
|
136
136
|
this.#requireFolder(library, folder);
|
|
137
137
|
const manifests = [...new Set(options.manifests ?? [])].sort();
|
|
138
|
+
const validManifests = this.#validManifestNames(library);
|
|
138
139
|
for (const manifest of manifests) {
|
|
139
|
-
if (!
|
|
140
|
+
if (!validManifests.has(manifest)) {
|
|
140
141
|
throw new Error(`Unknown manifest "${manifest}".`);
|
|
141
142
|
}
|
|
142
143
|
}
|
|
@@ -149,9 +150,15 @@ export class LibraryStore {
|
|
|
149
150
|
let installed = false;
|
|
150
151
|
try {
|
|
151
152
|
await writeFile(temporaryPath, options.bytes);
|
|
152
|
-
let parameters
|
|
153
|
-
if (
|
|
154
|
-
parameters =
|
|
153
|
+
let parameters;
|
|
154
|
+
if (options.parametersOverride !== undefined) {
|
|
155
|
+
parameters = options.parametersOverride;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
parameters = plugin.descriptor.validateParameters(plugin.descriptor.defaultParameters(plugin.pluginConfig(this.#config)));
|
|
159
|
+
if (prepareParameters) {
|
|
160
|
+
parameters = plugin.descriptor.validateParameters(await prepareParameters({ rawPath: temporaryPath, rawFileName: storedName, parameters }));
|
|
161
|
+
}
|
|
155
162
|
}
|
|
156
163
|
const record = {
|
|
157
164
|
type: options.type,
|
|
@@ -341,6 +348,85 @@ export class LibraryStore {
|
|
|
341
348
|
return library;
|
|
342
349
|
});
|
|
343
350
|
}
|
|
351
|
+
/**
|
|
352
|
+
* CAS-protected raw swap for a Figma tag source that may also rename the
|
|
353
|
+
* asset. In tag mode the tag IS the id, so changing the tag moves the library
|
|
354
|
+
* key. The raw swap and the (optional) key move happen in ONE queued critical
|
|
355
|
+
* section and ONE `write`, so no inconsistent intermediate state is ever
|
|
356
|
+
* persisted; on any error the record and raw file are rolled back and the key
|
|
357
|
+
* move (in-memory only until `write`) is discarded.
|
|
358
|
+
*/
|
|
359
|
+
async repointTagAsset(oldId, newId, bytes, expected, nextSource, updateParameters) {
|
|
360
|
+
return this.#enqueue(async () => {
|
|
361
|
+
const library = await this.read();
|
|
362
|
+
const record = this.#requireAsset(library, oldId);
|
|
363
|
+
if (record.raw !== expected.raw ||
|
|
364
|
+
record.rawHash !== expected.rawHash ||
|
|
365
|
+
record.type !== expected.type ||
|
|
366
|
+
!record.importSource ||
|
|
367
|
+
canonicalizeParameters(record.importSource) !== expected.canonicalSource) {
|
|
368
|
+
throw new Error('stale-import');
|
|
369
|
+
}
|
|
370
|
+
const renamed = newId !== oldId;
|
|
371
|
+
if (renamed && Object.hasOwn(library.assets, newId)) {
|
|
372
|
+
throw new Error(`An asset with id "${newId}" already exists.`);
|
|
373
|
+
}
|
|
374
|
+
const absolutePath = join(this.#config.rawDir, record.raw);
|
|
375
|
+
const { verifyStableRawFile } = await import('./raw-reconciliation.js');
|
|
376
|
+
try {
|
|
377
|
+
await verifyStableRawFile(absolutePath, expected.rawHash);
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
throw new Error('stale-import');
|
|
381
|
+
}
|
|
382
|
+
const token = crypto.randomUUID();
|
|
383
|
+
const temporaryPath = `${absolutePath}.fundus-retag-${token}.tmp`;
|
|
384
|
+
const backupPath = `${absolutePath}.fundus-retag-${token}`;
|
|
385
|
+
const previousHash = record.rawHash;
|
|
386
|
+
const previousSource = structuredClone(record.importSource);
|
|
387
|
+
const previousParameters = structuredClone(record.parameters);
|
|
388
|
+
let staged = false;
|
|
389
|
+
let installed = false;
|
|
390
|
+
try {
|
|
391
|
+
await writeFile(temporaryPath, bytes);
|
|
392
|
+
await rename(absolutePath, backupPath);
|
|
393
|
+
staged = true;
|
|
394
|
+
await rename(temporaryPath, absolutePath);
|
|
395
|
+
installed = true;
|
|
396
|
+
record.rawHash = sha256Hex(bytes);
|
|
397
|
+
if (nextSource)
|
|
398
|
+
record.importSource = structuredClone(nextSource);
|
|
399
|
+
if (updateParameters)
|
|
400
|
+
record.parameters = updateParameters(record.parameters);
|
|
401
|
+
if (renamed) {
|
|
402
|
+
delete library.assets[oldId];
|
|
403
|
+
library.assets[newId] = record;
|
|
404
|
+
}
|
|
405
|
+
await this.write(library);
|
|
406
|
+
}
|
|
407
|
+
catch (cause) {
|
|
408
|
+
record.rawHash = previousHash;
|
|
409
|
+
record.importSource = previousSource;
|
|
410
|
+
record.parameters = previousParameters;
|
|
411
|
+
if (renamed) {
|
|
412
|
+
delete library.assets[newId];
|
|
413
|
+
library.assets[oldId] = record;
|
|
414
|
+
}
|
|
415
|
+
if (installed)
|
|
416
|
+
await unlink(absolutePath).catch(() => { });
|
|
417
|
+
if (staged)
|
|
418
|
+
await rename(backupPath, absolutePath);
|
|
419
|
+
await unlink(temporaryPath).catch(() => { });
|
|
420
|
+
throw cause;
|
|
421
|
+
}
|
|
422
|
+
if (staged)
|
|
423
|
+
await unlink(backupPath).catch(() => { });
|
|
424
|
+
// The old id's proxies are orphans after a rename (pruning also covers it).
|
|
425
|
+
if (renamed)
|
|
426
|
+
await this.#deleteProxiesOf(oldId);
|
|
427
|
+
return library;
|
|
428
|
+
});
|
|
429
|
+
}
|
|
344
430
|
/** Replace an asset's parameters (validated by the owning plugin). */
|
|
345
431
|
async updateParameters(id, parameters) {
|
|
346
432
|
return this.#enqueue(() => this.#updateParameters(id, parameters));
|
|
@@ -360,8 +446,9 @@ export class LibraryStore {
|
|
|
360
446
|
const library = await this.read();
|
|
361
447
|
const record = this.#requireAsset(library, id);
|
|
362
448
|
const unique = [...new Set(manifests)];
|
|
449
|
+
const validManifests = this.#validManifestNames(library);
|
|
363
450
|
for (const name of unique) {
|
|
364
|
-
if (!
|
|
451
|
+
if (!validManifests.has(name)) {
|
|
365
452
|
throw new Error(`Unknown manifest "${name}".`);
|
|
366
453
|
}
|
|
367
454
|
}
|
|
@@ -815,7 +902,14 @@ export class LibraryStore {
|
|
|
815
902
|
* type, dangling raw pointer, invalid parameters, unknown manifest names,
|
|
816
903
|
* and reference errors (dangling target, type mismatch, cycles).
|
|
817
904
|
*/
|
|
818
|
-
async validate(library) {
|
|
905
|
+
async validate(library, options = {}) {
|
|
906
|
+
// The default preserves single-root behaviour (host === effective). When
|
|
907
|
+
// merging Packages, disk/host checks run on the host library with
|
|
908
|
+
// `flatSpace: false`, while the flat-space checks (id/type/parameters/
|
|
909
|
+
// membership/appearance/references) run separately over the *effective*
|
|
910
|
+
// library — host override records store partial parameters that only
|
|
911
|
+
// validate once merged, and references may cross the host/Package boundary.
|
|
912
|
+
const flatSpace = options.flatSpace ?? true;
|
|
819
913
|
const issues = [];
|
|
820
914
|
const folderKeys = new Map();
|
|
821
915
|
for (const folder of library.folders) {
|
|
@@ -845,53 +939,7 @@ export class LibraryStore {
|
|
|
845
939
|
}
|
|
846
940
|
}
|
|
847
941
|
}
|
|
848
|
-
for (const [name, record] of Object.entries(library.manifests)) {
|
|
849
|
-
const nameProblem = manifestNameError(name);
|
|
850
|
-
if (nameProblem)
|
|
851
|
-
issues.push({ message: nameProblem });
|
|
852
|
-
if (record.color !== undefined) {
|
|
853
|
-
const colorProblem = manifestColorError(record.color);
|
|
854
|
-
if (colorProblem)
|
|
855
|
-
issues.push({ message: `Manifest "${name}": ${colorProblem}` });
|
|
856
|
-
}
|
|
857
|
-
if (record.emoji !== undefined) {
|
|
858
|
-
const emojiProblem = manifestEmojiError(record.emoji);
|
|
859
|
-
if (emojiProblem)
|
|
860
|
-
issues.push({ message: `Manifest "${name}": ${emojiProblem}` });
|
|
861
|
-
}
|
|
862
|
-
}
|
|
863
|
-
const namesByModuleFile = new Map();
|
|
864
|
-
for (const name of Object.keys(library.manifests)) {
|
|
865
|
-
const fileName = manifestModuleFileName(name);
|
|
866
|
-
const existingName = namesByModuleFile.get(fileName);
|
|
867
|
-
if (existingName !== undefined) {
|
|
868
|
-
issues.push({
|
|
869
|
-
message: `Manifests "${existingName}" and "${name}" would both generate "${fileName}".`
|
|
870
|
-
});
|
|
871
|
-
}
|
|
872
|
-
else {
|
|
873
|
-
namesByModuleFile.set(fileName, name);
|
|
874
|
-
}
|
|
875
|
-
}
|
|
876
942
|
for (const [assetId, record] of Object.entries(library.assets)) {
|
|
877
|
-
const idProblem = assetIdError(assetId);
|
|
878
|
-
if (idProblem)
|
|
879
|
-
issues.push({ assetId, message: idProblem });
|
|
880
|
-
const plugin = this.#registry[record.type];
|
|
881
|
-
if (!plugin) {
|
|
882
|
-
issues.push({ assetId, message: `Unknown asset type "${record.type}".` });
|
|
883
|
-
}
|
|
884
|
-
else {
|
|
885
|
-
try {
|
|
886
|
-
plugin.descriptor.validateParameters(record.parameters);
|
|
887
|
-
}
|
|
888
|
-
catch (cause) {
|
|
889
|
-
issues.push({
|
|
890
|
-
assetId,
|
|
891
|
-
message: `Invalid parameters: ${cause instanceof Error ? cause.message : String(cause)}`
|
|
892
|
-
});
|
|
893
|
-
}
|
|
894
|
-
}
|
|
895
943
|
try {
|
|
896
944
|
assertSafeRelativeFilePath(record.raw);
|
|
897
945
|
}
|
|
@@ -911,13 +959,11 @@ export class LibraryStore {
|
|
|
911
959
|
message: `Raw file "${record.raw}" is missing from the raw directory.`
|
|
912
960
|
});
|
|
913
961
|
}
|
|
914
|
-
for (const manifest of record.manifests) {
|
|
915
|
-
if (!library.manifests[manifest]) {
|
|
916
|
-
issues.push({ assetId, message: `Unknown manifest "${manifest}".` });
|
|
917
|
-
}
|
|
918
|
-
}
|
|
919
962
|
}
|
|
920
|
-
|
|
963
|
+
if (flatSpace) {
|
|
964
|
+
issues.push(...flatLibraryIssues(library, descriptorsByType(this.#registry)));
|
|
965
|
+
issues.push(...manifestModuleCollisionIssues(library.manifests));
|
|
966
|
+
}
|
|
921
967
|
return issues;
|
|
922
968
|
}
|
|
923
969
|
async #deleteProxiesOf(assetId) {
|
|
@@ -940,6 +986,21 @@ export class LibraryStore {
|
|
|
940
986
|
}
|
|
941
987
|
return library.assets[id];
|
|
942
988
|
}
|
|
989
|
+
/**
|
|
990
|
+
* Valid manifest names for asset membership: the host library's own manifests
|
|
991
|
+
* plus any a configured Package introduces. The effective (merged) library
|
|
992
|
+
* unions both, so a host asset (or slot fill) may be placed into a
|
|
993
|
+
* Package-introduced manifest — validating against the host manifests alone
|
|
994
|
+
* would wrongly reject that placement.
|
|
995
|
+
*/
|
|
996
|
+
#validManifestNames(library) {
|
|
997
|
+
const names = new Set(Object.keys(library.manifests));
|
|
998
|
+
for (const pkg of this.#config.packages ?? []) {
|
|
999
|
+
for (const name of Object.keys(pkg.declaration.manifests))
|
|
1000
|
+
names.add(name);
|
|
1001
|
+
}
|
|
1002
|
+
return names;
|
|
1003
|
+
}
|
|
943
1004
|
/** Resolve a non-colliding raw file name, appending `-1`, `-2`, … before the extension. */
|
|
944
1005
|
#uniqueRawName(fileName, folder) {
|
|
945
1006
|
if (!existsSync(join(this.#config.rawDir, folder, fileName)))
|
|
@@ -66,6 +66,18 @@ export declare class FundusOperations {
|
|
|
66
66
|
reimportAsset(id: string, input?: unknown): Promise<FundusStateDto>;
|
|
67
67
|
/** Materialize a new source, then atomically replace an existing asset's raw file. */
|
|
68
68
|
replaceRawFromSource(id: string, options: ReplaceRawFromSourceOptions): Promise<FundusStateDto>;
|
|
69
|
+
/**
|
|
70
|
+
* Edit a Figma tag asset's tag, fileKey, and/or scale in place. Because in tag
|
|
71
|
+
* mode the tag IS the asset id, changing the tag renames the asset (moves the
|
|
72
|
+
* library key); changing only fileKey/scale is an in-place re-point. Mirrors
|
|
73
|
+
* `reimportAsset`'s three phases: preflight in the queue, materialize outside
|
|
74
|
+
* it, then commit atomically through `store.repointTagAsset`.
|
|
75
|
+
*/
|
|
76
|
+
retagFigmaAsset(id: string, input: {
|
|
77
|
+
tag?: string;
|
|
78
|
+
fileKey?: string;
|
|
79
|
+
scale?: 1 | 2 | 3 | 4;
|
|
80
|
+
}): Promise<FundusStateDto>;
|
|
69
81
|
/** Apply a PATCH body: parameters and/or manifests and/or a rename — in that order. */
|
|
70
82
|
patchAsset(id: string, body: PatchAssetRequestDto): Promise<FundusStateDto>;
|
|
71
83
|
moveAsset(id: string, folder: string): Promise<FundusStateDto>;
|