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
package/dist/server/check.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { type Library, type ValidationIssueDto } from '../core/index.js';
|
|
1
|
+
import { type EffectiveLibrary, type Library, type LibraryMembership, type MergeProvenance, type ValidationIssueDto } from '../core/index.js';
|
|
2
2
|
import { type RawClassification } from './raw-reconciliation.js';
|
|
3
3
|
import type { ServerPluginRegistry } from './plugins/contract.js';
|
|
4
4
|
/** One machine-readable check finding (the `--json` failure-list shape, M9). */
|
|
5
5
|
export interface CheckFinding {
|
|
6
6
|
/** The failure category. */
|
|
7
|
-
kind: 'validation' | 'proxy-missing' | 'proxy-unresolvable' | 'proxy-orphaned' | 'module-missing' | 'module-out-of-sync' | 'module-stray' | 'module-regeneration-failed' | 'unreachable-asset' | 'potential-image-duplicate' | 'raw-hash-drift' | 'raw-type-incompatible' | 'raw-scan-incomplete' | 'raw-unmanaged';
|
|
7
|
+
kind: 'validation' | 'proxy-missing' | 'proxy-unresolvable' | 'proxy-orphaned' | 'module-missing' | 'module-out-of-sync' | 'module-stray' | 'module-regeneration-failed' | 'unreachable-asset' | 'potential-image-duplicate' | 'raw-hash-drift' | 'raw-type-incompatible' | 'raw-scan-incomplete' | 'raw-unmanaged' | 'slot-unfilled' | 'slot-unmaterialized' | 'package-conflict' | 'package-type-mismatch';
|
|
8
8
|
message: string;
|
|
9
9
|
/** The asset the finding concerns, where applicable. */
|
|
10
10
|
assetId?: string;
|
|
@@ -26,9 +26,19 @@ export interface CheckReport {
|
|
|
26
26
|
manifestCount: number;
|
|
27
27
|
}
|
|
28
28
|
export interface CheckAdvisory {
|
|
29
|
-
kind: 'usage-not-configured';
|
|
29
|
+
kind: 'usage-not-configured' | 'package-overridden';
|
|
30
30
|
message: string;
|
|
31
|
+
/** The asset a `package-overridden` advisory concerns. */
|
|
32
|
+
assetId?: string;
|
|
31
33
|
}
|
|
32
34
|
export declare function runCheck(projectRoot: string, registry?: ServerPluginRegistry): Promise<CheckReport>;
|
|
33
35
|
/** Pure expansion of a raw classification into canonical hard check findings. */
|
|
34
36
|
export declare function rawCheckFindings(library: Library, raw: RawClassification, registry: ServerPluginRegistry, validationIssues: ValidationIssueDto[]): CheckFinding[];
|
|
37
|
+
/**
|
|
38
|
+
* The delivered-slot contract: a Package slot that is delivered (explicit member
|
|
39
|
+
* or in a delivered manifest's reference closure) but has no host-supplied bytes
|
|
40
|
+
* must be filled. A slot with an `importSource` is `slot-unmaterialized` (run
|
|
41
|
+
* import); a slot with nothing is `slot-unfilled`. Inert (undelivered) slots
|
|
42
|
+
* produce no finding.
|
|
43
|
+
*/
|
|
44
|
+
export declare function packageSlotFindings(library: EffectiveLibrary, provenance: MergeProvenance, membership: LibraryMembership): CheckFinding[];
|
package/dist/server/check.js
CHANGED
|
@@ -10,13 +10,13 @@
|
|
|
10
10
|
import { existsSync } from 'node:fs';
|
|
11
11
|
import { readFile } from 'node:fs/promises';
|
|
12
12
|
import { join } from 'node:path';
|
|
13
|
-
import { collectAllReferences, compareCodeUnits, computeLibraryMembership, rawFileNameOfPath, typesForFileName } from '../core/index.js';
|
|
13
|
+
import { allDeliveredAssetIds, collectAllReferences, compareCodeUnits, computeLibraryMembership, flatLibraryIssues, materializeLibrary, mergePackages, rawFileNameOfPath, typesForFileName } from '../core/index.js';
|
|
14
14
|
import { loadConfig, USAGE_NOT_CONFIGURED_MESSAGE } from './config-loader.js';
|
|
15
15
|
import { LibraryStore } from './library-store.js';
|
|
16
16
|
import { classifyRawDirectory } from './raw-reconciliation.js';
|
|
17
|
-
import { buildManifestEntries, manifestModuleFileName, renderManifestModule, strayGeneratedModuleNames } from './codegen.js';
|
|
17
|
+
import { buildManifestEntries, manifestModuleCollisionIssues, manifestModuleFileName, renderManifestModule, strayGeneratedModuleNames } from './codegen.js';
|
|
18
18
|
import { descriptorsByType, serverPluginsByType } from './plugins.js';
|
|
19
|
-
import {
|
|
19
|
+
import { expectedProxyRelativePath, isProxyFileName, readCurrentProxy } from './processing/processor.js';
|
|
20
20
|
import { listRelativeFiles } from './folder-filesystem.js';
|
|
21
21
|
import { ImageDuplicateDetector } from './image-duplicates.js';
|
|
22
22
|
/** The human rendering of a finding — `[assetId] message`, as `fundus check` prints it. */
|
|
@@ -26,18 +26,47 @@ export function formatCheckFinding(finding) {
|
|
|
26
26
|
export async function runCheck(projectRoot, registry = serverPluginsByType) {
|
|
27
27
|
const config = await loadConfig(projectRoot);
|
|
28
28
|
const store = new LibraryStore(config, registry);
|
|
29
|
-
const
|
|
29
|
+
const host = await store.read();
|
|
30
|
+
// Merge Packages under the host into one in-memory effective library. Raw
|
|
31
|
+
// scans stay on the host (it owns the bytes); everything id-space runs over
|
|
32
|
+
// the effective library; processing/codegen run over the materialized subset.
|
|
33
|
+
const { library: effective, provenance, findings: mergeFindings } = mergePackages(host, config.packages ?? []);
|
|
34
|
+
const materialized = materializeLibrary(effective);
|
|
30
35
|
const report = {
|
|
31
36
|
errors: [],
|
|
32
37
|
warnings: [],
|
|
33
38
|
advisories: config.usage === null
|
|
34
39
|
? [{ kind: 'usage-not-configured', message: USAGE_NOT_CONFIGURED_MESSAGE }]
|
|
35
40
|
: [],
|
|
36
|
-
assetCount: Object.keys(
|
|
37
|
-
manifestCount: Object.keys(
|
|
41
|
+
assetCount: Object.keys(effective.assets).length,
|
|
42
|
+
manifestCount: Object.keys(effective.manifests).length
|
|
38
43
|
};
|
|
39
|
-
//
|
|
40
|
-
|
|
44
|
+
// Merge findings: collisions/type-mismatches are hard errors; an active
|
|
45
|
+
// override is an auditable, non-fatal advisory.
|
|
46
|
+
for (const finding of mergeFindings) {
|
|
47
|
+
if (finding.kind === 'package-overridden') {
|
|
48
|
+
report.advisories.push({
|
|
49
|
+
kind: 'package-overridden',
|
|
50
|
+
message: finding.message,
|
|
51
|
+
assetId: finding.assetId
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
report.errors.push({
|
|
56
|
+
kind: finding.kind,
|
|
57
|
+
message: finding.message,
|
|
58
|
+
assetId: finding.assetId
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// 1. Library validation. Disk/host checks run on the host library; flat-space
|
|
63
|
+
// checks (id/type/parameters/membership/appearance/references + module
|
|
64
|
+
// collisions) run over the effective library.
|
|
65
|
+
const issues = [
|
|
66
|
+
...(await store.validate(host, { flatSpace: false })),
|
|
67
|
+
...flatLibraryIssues(effective, descriptorsByType(registry)),
|
|
68
|
+
...manifestModuleCollisionIssues(effective.manifests)
|
|
69
|
+
];
|
|
41
70
|
const validationKeys = new Set();
|
|
42
71
|
for (const issue of issues) {
|
|
43
72
|
const key = `${issue.assetId ?? ''}|${issue.message}`;
|
|
@@ -51,16 +80,24 @@ export async function runCheck(projectRoot, registry = serverPluginsByType) {
|
|
|
51
80
|
});
|
|
52
81
|
}
|
|
53
82
|
const descriptors = Object.values(registry).map((plugin) => plugin.descriptor);
|
|
54
|
-
const raw = await classifyRawDirectory(config.rawDir,
|
|
55
|
-
report.errors.push(...rawCheckFindings(
|
|
83
|
+
const raw = await classifyRawDirectory(config.rawDir, host, (path) => typesForFileName(path, descriptors).length > 0);
|
|
84
|
+
report.errors.push(...rawCheckFindings(host, raw, registry, issues));
|
|
85
|
+
// Delivered set + membership over the effective library, so delivered slots
|
|
86
|
+
// are analysed and cross-Package references resolve.
|
|
87
|
+
const referencesByAsset = collectAllReferences(effective, descriptorsByType(registry));
|
|
88
|
+
const membership = computeLibraryMembership(effective, referencesByAsset);
|
|
89
|
+
const delivered = allDeliveredAssetIds(membership);
|
|
90
|
+
report.errors.push(...packageSlotFindings(effective, provenance, membership));
|
|
56
91
|
// 2. Proxies: every delivered asset's expected proxy exists (staleness is a
|
|
57
|
-
// name check), and the proxy directory holds no orphans.
|
|
58
|
-
|
|
92
|
+
// name check), and the proxy directory holds no orphans. Raw-less delivered
|
|
93
|
+
// slots are covered by the slot findings above and skipped here.
|
|
59
94
|
const expectedProxyPaths = new Set();
|
|
60
95
|
const proxies = {};
|
|
61
96
|
let proxiesComplete = true;
|
|
62
97
|
for (const assetId of [...delivered].sort(compareCodeUnits)) {
|
|
63
|
-
const record =
|
|
98
|
+
const record = materialized.assets[assetId];
|
|
99
|
+
if (!record)
|
|
100
|
+
continue;
|
|
64
101
|
let proxy;
|
|
65
102
|
try {
|
|
66
103
|
proxy = await readCurrentProxy(assetId, record, config, registry);
|
|
@@ -108,12 +145,12 @@ export async function runCheck(projectRoot, registry = serverPluginsByType) {
|
|
|
108
145
|
// regeneration. Only meaningful when validation passed and every proxy
|
|
109
146
|
// exists — otherwise regeneration is impossible and already reported.
|
|
110
147
|
if (report.errors.length === 0 && proxiesComplete) {
|
|
111
|
-
await checkGeneratedModules(report,
|
|
112
|
-
await checkStrayModules(report,
|
|
148
|
+
await checkGeneratedModules(report, materialized, config, proxies, registry);
|
|
149
|
+
await checkStrayModules(report, materialized, config);
|
|
113
150
|
}
|
|
114
151
|
// 4. Advisory warnings. Raw drift is always a hard CI failure.
|
|
115
|
-
collectUnreachableAssets(report,
|
|
116
|
-
collectPotentialImageDuplicates(report, await new ImageDuplicateDetector().find(
|
|
152
|
+
collectUnreachableAssets(report, effective, provenance, delivered);
|
|
153
|
+
collectPotentialImageDuplicates(report, await new ImageDuplicateDetector().find(host, config.rawDir));
|
|
117
154
|
report.errors.sort((left, right) => compareCodeUnits(`${left.fileName ?? ''}|${left.assetId ?? ''}|${left.kind}|${left.message}`, `${right.fileName ?? ''}|${right.assetId ?? ''}|${right.kind}|${right.message}`));
|
|
118
155
|
report.warnings.sort((left, right) => compareCodeUnits(`${left.assetId ?? ''}|${left.kind}|${left.message}`, `${right.assetId ?? ''}|${right.kind}|${right.message}`));
|
|
119
156
|
return report;
|
|
@@ -254,15 +291,66 @@ async function checkStrayModules(report, library, config) {
|
|
|
254
291
|
* no explicit membership AND no passive membership in any manifest. An asset
|
|
255
292
|
* that is only passively delivered (referenced by a delivered asset) is fine.
|
|
256
293
|
*/
|
|
257
|
-
function collectUnreachableAssets(report, library, delivered) {
|
|
294
|
+
function collectUnreachableAssets(report, library, provenance, delivered) {
|
|
295
|
+
for (const [assetId, record] of Object.entries(library.assets)) {
|
|
296
|
+
if (record.manifests.length !== 0 || delivered.has(assetId))
|
|
297
|
+
continue;
|
|
298
|
+
// An inert, unfilled Package slot is not a host mistake — a Package ships
|
|
299
|
+
// a superset of slots and the app delivers a subset. Only host/override
|
|
300
|
+
// assets (and filled slots) warn.
|
|
301
|
+
if (record.raw === undefined && provenance[assetId]?.source === 'package')
|
|
302
|
+
continue;
|
|
303
|
+
report.warnings.push({
|
|
304
|
+
kind: 'unreachable-asset',
|
|
305
|
+
message: 'In no manifest and not referenced by any delivered asset — ' +
|
|
306
|
+
'nothing is processed or generated for it.',
|
|
307
|
+
assetId
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* The delivered-slot contract: a Package slot that is delivered (explicit member
|
|
313
|
+
* or in a delivered manifest's reference closure) but has no host-supplied bytes
|
|
314
|
+
* must be filled. A slot with an `importSource` is `slot-unmaterialized` (run
|
|
315
|
+
* import); a slot with nothing is `slot-unfilled`. Inert (undelivered) slots
|
|
316
|
+
* produce no finding.
|
|
317
|
+
*/
|
|
318
|
+
export function packageSlotFindings(library, provenance, membership) {
|
|
319
|
+
const deliveringManifests = new Map();
|
|
320
|
+
for (const [name, manifestMembership] of Object.entries(membership)) {
|
|
321
|
+
for (const assetId of manifestMembership.deliveredAssetIds) {
|
|
322
|
+
const names = deliveringManifests.get(assetId) ?? [];
|
|
323
|
+
names.push(name);
|
|
324
|
+
deliveringManifests.set(assetId, names);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
const findings = [];
|
|
258
328
|
for (const [assetId, record] of Object.entries(library.assets)) {
|
|
259
|
-
if (record.
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
329
|
+
if (record.raw !== undefined)
|
|
330
|
+
continue;
|
|
331
|
+
const names = deliveringManifests.get(assetId);
|
|
332
|
+
if (!names || names.length === 0)
|
|
333
|
+
continue;
|
|
334
|
+
const originRecord = provenance[assetId];
|
|
335
|
+
const origin = originRecord && originRecord.source !== 'host' ? originRecord.origin : 'a package';
|
|
336
|
+
const deliveredBy = [...names]
|
|
337
|
+
.sort(compareCodeUnits)
|
|
338
|
+
.map((name) => `"${name}"`)
|
|
339
|
+
.join(', ');
|
|
340
|
+
if (record.importSource !== undefined) {
|
|
341
|
+
findings.push({
|
|
342
|
+
kind: 'slot-unmaterialized',
|
|
343
|
+
assetId,
|
|
344
|
+
message: `Slot "${assetId}" (from ${origin}) has an import source but no bytes yet — run import to fill it. Delivered by: ${deliveredBy}.`
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
findings.push({
|
|
349
|
+
kind: 'slot-unfilled',
|
|
350
|
+
assetId,
|
|
351
|
+
message: `Slot "${assetId}" (from ${origin}) has no bytes, import source, or host override. Delivered by: ${deliveredBy}.`
|
|
265
352
|
});
|
|
266
353
|
}
|
|
267
354
|
}
|
|
355
|
+
return findings;
|
|
268
356
|
}
|
|
@@ -6,8 +6,8 @@ export declare const ASSET_HELP = "fundus asset \u2014 inspect and mutate assets
|
|
|
6
6
|
export declare const ASSET_LIST_HELP: string;
|
|
7
7
|
export declare const ASSET_SHOW_HELP = "fundus asset show \u2014 one asset in detail\n\nUsage: fundus asset show <id> [--json]\n\nPrints the asset's raw file, content hash, parameters, explicit +\npassive manifest memberships, proxy status, reference edges (outgoing\nand incoming), and warnings.\n\nFlags:\n --json print {\"ok\": true, \"asset\": <AssetStateDto>}\n --help this help\n\nRead-only: nothing is processed or written.\n\nExample:\n fundus asset show navigationPanel --json\n";
|
|
8
8
|
export declare const ASSET_INGEST_HELP: string;
|
|
9
|
-
export declare const ASSET_REIMPORT_HELP = "fundus asset reimport \u2014 refresh an asset from its saved source\n\nUsage: fundus asset reimport <id> [--json]\n fundus asset reimport <id> --figma-link <selection-link> [--scale <1|2|3|4>] [--json]\n fundus asset reimport <id> --scale <1|2|3|4> [--json]\n\nWithout overrides, re-materializes the persisted importer source
|
|
10
|
-
export declare const ASSET_REPLACE_HELP = "fundus asset replace \u2014 replace an asset's raw file\n\nUsage: fundus asset replace <id> <file|figma-selection-link>\n [--from <file|figma>] [--scale <1|2|3|4>] [--json]\n\nReplaces the stored raw file and content hash while preserving the asset's\nid, type, folder, parameters, references, and manifest memberships. The new\nsource must be accepted by the existing asset type. File replacement remains\nthe default and disconnects any saved source. Figma replacement stores the new\nselection as a repeatable source. Runs the full autosave chain, so delivered
|
|
9
|
+
export declare const ASSET_REIMPORT_HELP = "fundus asset reimport \u2014 refresh an asset from its saved source\n\nUsage: fundus asset reimport <id> [--json]\n fundus asset reimport <id> --figma-link <selection-link> [--scale <1|2|3|4>] [--json]\n fundus asset reimport <id> --figma-tag <newTag> [--figma-file <key|link>] [--scale <1|2|3|4>] [--json]\n fundus asset reimport <id> --figma-file <key|link> [--scale <1|2|3|4>] [--json]\n fundus asset reimport <id> --scale <1|2|3|4> [--json]\n\nWithout overrides, re-materializes the persisted importer source (a Figma tag\nasset re-scans its file for the tagged node, self-healing after node moves).\nA Figma override may update the source or scale; omitted values are preserved.\nAsset type, parameters, folder, and manifests remain unchanged. Raw-file drift\nor concurrent changes abort without overwriting local edits.\n\nNode vs tag assets accept different overrides. A node asset takes --figma-link\n(and --scale); --figma-tag and --figma-file are rejected. A tag asset takes\n--figma-tag to change its tag, --figma-file to re-point in place to another\ndocument, and --scale; --figma-link is rejected. Because the tag IS the asset\nid, changing it with --figma-tag renames the asset to the new tag (the new id\nmust be valid and unused).\n\nFlags:\n --figma-link <link> node asset only: replace the persisted file/node selection\n --figma-tag <newTag> tag asset only: change the tag, renaming the asset to the\n new tag (the tag is the asset id)\n --figma-file <key|link>\n tag asset only: re-point in place to another file (raw\n key or a Figma link)\n --scale <1|2|3|4> replace the persisted Figma export scale\n --json print {\"ok\": true, \"asset\": <AssetStateDto>, \"issues\": [\u2026]}\n --help this help\n\nExample:\n fundus asset reimport navigationPanel\n fundus asset reimport navigationPanel --figma-link '<new-selection-link>'\n fundus asset reimport navigationPanel --figma-tag mainNavigationPanel\n fundus asset reimport navigationPanel --figma-file def456\n fundus asset reimport navigationPanel --scale 4\n fundus asset reimport navigationPanel --figma-link '<new-selection-link>' --scale 4 --json\n";
|
|
10
|
+
export declare const ASSET_REPLACE_HELP = "fundus asset replace \u2014 replace an asset's raw file\n\nUsage: fundus asset replace <id> <file|figma-selection-link>\n [--from <file|figma>] [--scale <1|2|3|4>] [--json]\n fundus asset replace <id> --from figma --figma-tag <tag>\n [--figma-file <key|link>] [--scale <1|2|3|4>] [--json]\n\nReplaces the stored raw file and content hash while preserving the asset's\nid, type, folder, parameters, references, and manifest memberships. The new\nsource must be accepted by the existing asset type. File replacement remains\nthe default and disconnects any saved source. Figma replacement stores the new\nselection (node mode) or tag (tag mode) as a repeatable source. A tag\nreplacement must resolve to the asset's own id, so it can only re-point the\nsame asset's own tag. Runs the full autosave chain, so delivered assets are\nreprocessed and manifests regenerated.\n\nFlags:\n --from <file|figma> replacement source; default: file\n --figma-tag <tag> Figma tag mode: replace from the node tagged with this\n Fundus asset id (takes no positional link)\n --figma-file <key|link>\n fileKey for tag mode as a raw key or a Figma link;\n defaults to import.figma.defaultFileKey from\n fundus.config.ts\n --scale <1|2|3|4> Figma export scale; default:\n import.figma.defaults.scale from fundus.config.ts\n --json print {\"ok\": true, \"asset\": <AssetStateDto>, \"issues\": [\u2026]}\n --help this help\n\nExample:\n fundus asset replace navigationPanel ./exports/navigation_panel_v2.png --json\n fundus asset replace navigationPanel \\\n 'https://www.figma.com/design/abc/UI?node-id=12-34' --from figma --scale 3 --json\n fundus asset replace navigationPanel --from figma \\\n --figma-tag navigationPanel --figma-file abc --scale 3 --json\n";
|
|
11
11
|
export declare const ASSET_SET_HELP = "fundus asset set \u2014 update an asset's parameters and/or memberships\n\nUsage: fundus asset set <id> [--parameters <json>] [--manifests <a,b>]\n [--compression-x <0-100>] [--compression-y <0-100>] [--json]\n\nAt least one change flag is required. Runs the full autosave chain\n(write library \u2192 process \u2192 regenerate manifest modules).\n\nFlags:\n --parameters <json> SHALLOW MERGE at the top level onto the current\n parameters, then plugin validation:\n {\"preset\": \"webp-hq\"} sets one field,\n keeps the others\n {\"chromaKey\": {\u2026}} replaces the whole\n chromaKey object\n {\"mask\": null} clears an optional\n field\n {\"mask\": {\"$asset\": \"someImage\"}}\n sets an asset\n reference\n --manifests <a,b> REPLACES the explicit membership set (declarative,\n idempotent); --manifests \"\" clears it\n --compression-x <0-100>\n --compression-y <0-100>\n set one Slice stretch-compression axis while preserving\n the omitted axis; setting both axes to 0 removes\n compression. These values override compression supplied\n through --parameters in the same invocation\n --json print {\"ok\": true, \"asset\": <AssetStateDto>, \"issues\": [\u2026]}\n --help this help\n\nThe mutation is validated first and rejected (exit 1, nothing written)\nif it would leave the library invalid \u2014 e.g. a reference to a missing\nasset, a reference cycle, or an unknown manifest name. Ingest reference\ntargets before pointing at them.\n\nExample:\n fundus asset set navigationPanel --compression-x 75 --compression-y 25 --json\n fundus asset set characterIdle \\\n --parameters '{\"mask\": {\"$asset\": \"characterIdleMask\"}}' --json\n";
|
|
12
12
|
export declare const ASSET_RENAME_HELP = "fundus asset rename \u2014 rename an asset id\n\nUsage: fundus asset rename <id> <newId> [--json]\n\nRenames the asset's id (the raw file keeps its name \u2014 ids are the\nstable key) and re-hashes its proxy under the new id via the autosave\nchain. Fails if another asset references <id> \u2014 update the referrers\nfirst \u2014 or if <newId> is taken or invalid.\n\nFlags:\n --json print {\"ok\": true, \"asset\": <AssetStateDto>, \"issues\": [\u2026]}\n --help this help\n\nExample:\n fundus asset rename sidebarPanel navigationPanel --json\n";
|
|
13
13
|
export declare const ASSET_DELETE_HELP = "fundus asset delete \u2014 delete an asset\n\nUsage: fundus asset delete <id> [--json]\n\nDeletes the library record, its raw file, and its proxies, then\nregenerates the affected manifest modules. Fails if another asset\nreferences it \u2014 remove the references first.\n\nFlags:\n --json print {\"ok\": true, \"deletedAssetId\": \"<id>\", \"issues\": [\u2026]}\n --help this help\n\nExample:\n fundus asset delete obsoleteBanner --json\n";
|