fundus 0.14.0 → 0.16.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.
Files changed (238) hide show
  1. package/README.md +121 -0
  2. package/build/client/_app/immutable/assets/2.X44Wyac-.css +1 -0
  3. package/build/client/_app/immutable/assets/2.X44Wyac-.css.br +0 -0
  4. package/build/client/_app/immutable/assets/2.X44Wyac-.css.gz +0 -0
  5. package/build/client/_app/immutable/assets/{3.C6xo25uI.css → 3.66PJT3JC.css} +1 -1
  6. package/build/client/_app/immutable/assets/3.66PJT3JC.css.br +0 -0
  7. package/build/client/_app/immutable/assets/3.66PJT3JC.css.gz +0 -0
  8. package/build/client/_app/immutable/assets/{AssetSourceMenu.IjDdjx3o.css → AssetSourceMenu.B5fzYfym.css} +1 -1
  9. package/build/client/_app/immutable/assets/AssetSourceMenu.B5fzYfym.css.br +0 -0
  10. package/build/client/_app/immutable/assets/AssetSourceMenu.B5fzYfym.css.gz +0 -0
  11. package/build/client/_app/immutable/chunks/B06eqbax.js +108 -0
  12. package/build/client/_app/immutable/chunks/B06eqbax.js.br +0 -0
  13. package/build/client/_app/immutable/chunks/B06eqbax.js.gz +0 -0
  14. package/build/client/_app/immutable/chunks/{dNO-9VOT.js → B97y-eFA.js} +1 -1
  15. package/build/client/_app/immutable/chunks/B97y-eFA.js.br +0 -0
  16. package/build/client/_app/immutable/chunks/B97y-eFA.js.gz +0 -0
  17. package/build/client/_app/immutable/chunks/BmOjTxFk.js +1 -0
  18. package/build/client/_app/immutable/chunks/BmOjTxFk.js.br +0 -0
  19. package/build/client/_app/immutable/chunks/BmOjTxFk.js.gz +0 -0
  20. package/build/client/_app/immutable/chunks/C9MzfQz6.js +2 -0
  21. package/build/client/_app/immutable/chunks/C9MzfQz6.js.br +0 -0
  22. package/build/client/_app/immutable/chunks/C9MzfQz6.js.gz +0 -0
  23. package/build/client/_app/immutable/chunks/CcuyGBqj.js +1 -0
  24. package/build/client/_app/immutable/chunks/CcuyGBqj.js.br +0 -0
  25. package/build/client/_app/immutable/chunks/CcuyGBqj.js.gz +0 -0
  26. package/build/client/_app/immutable/chunks/{77p2oEJ1.js → D6c2mfMB.js} +1 -1
  27. package/build/client/_app/immutable/chunks/D6c2mfMB.js.br +2 -0
  28. package/build/client/_app/immutable/chunks/D6c2mfMB.js.gz +0 -0
  29. package/build/client/_app/immutable/chunks/DY9QjkXW.js +1 -0
  30. package/build/client/_app/immutable/chunks/DY9QjkXW.js.br +0 -0
  31. package/build/client/_app/immutable/chunks/DY9QjkXW.js.gz +0 -0
  32. package/build/client/_app/immutable/chunks/Z8rcWjXZ.js +3 -0
  33. package/build/client/_app/immutable/chunks/Z8rcWjXZ.js.br +0 -0
  34. package/build/client/_app/immutable/chunks/Z8rcWjXZ.js.gz +0 -0
  35. package/build/client/_app/immutable/entry/app.V1MmmICK.js +2 -0
  36. package/build/client/_app/immutable/entry/app.V1MmmICK.js.br +0 -0
  37. package/build/client/_app/immutable/entry/app.V1MmmICK.js.gz +0 -0
  38. package/build/client/_app/immutable/entry/start.BbyflZUw.js +1 -0
  39. package/build/client/_app/immutable/entry/start.BbyflZUw.js.br +0 -0
  40. package/build/client/_app/immutable/entry/start.BbyflZUw.js.gz +0 -0
  41. package/build/client/_app/immutable/nodes/0.BJOUVkow.js +1 -0
  42. package/build/client/_app/immutable/nodes/0.BJOUVkow.js.br +0 -0
  43. package/build/client/_app/immutable/nodes/0.BJOUVkow.js.gz +0 -0
  44. package/build/client/_app/immutable/nodes/1.BqoPRvUU.js +1 -0
  45. package/build/client/_app/immutable/nodes/1.BqoPRvUU.js.br +0 -0
  46. package/build/client/_app/immutable/nodes/1.BqoPRvUU.js.gz +0 -0
  47. package/build/client/_app/immutable/nodes/2.BSUVFDfW.js +3 -0
  48. package/build/client/_app/immutable/nodes/2.BSUVFDfW.js.br +0 -0
  49. package/build/client/_app/immutable/nodes/2.BSUVFDfW.js.gz +0 -0
  50. package/build/client/_app/immutable/nodes/3.B6beFiTQ.js +1 -0
  51. package/build/client/_app/immutable/nodes/3.B6beFiTQ.js.br +0 -0
  52. package/build/client/_app/immutable/nodes/3.B6beFiTQ.js.gz +0 -0
  53. package/build/client/_app/immutable/nodes/4.Dt96q8V4.js +2 -0
  54. package/build/client/_app/immutable/nodes/4.Dt96q8V4.js.br +0 -0
  55. package/build/client/_app/immutable/nodes/4.Dt96q8V4.js.gz +0 -0
  56. package/build/client/_app/version.json +1 -1
  57. package/build/client/_app/version.json.br +0 -0
  58. package/build/client/_app/version.json.gz +0 -0
  59. package/build/handler.js +8 -7
  60. package/build/handler.js.map +1 -1
  61. package/build/index.js +8 -7
  62. package/build/index.js.map +1 -1
  63. package/build/server/chunks/chunks/{context.js-CVuTSPjH.js → context.js-BXaBgcZT.js} +627 -134
  64. package/build/server/chunks/chunks/context.js-BXaBgcZT.js.map +1 -0
  65. package/build/server/chunks/chunks/{contract.js-itFN0Gon.js → contract.js-IY1F-HE_.js} +94 -58
  66. package/build/server/chunks/chunks/contract.js-IY1F-HE_.js.map +1 -0
  67. package/build/server/chunks/chunks/{core.js-CABVXpby.js → core.js-D1sYC_78.js} +144 -143
  68. package/build/server/chunks/chunks/core.js-D1sYC_78.js.map +1 -0
  69. package/build/server/chunks/chunks/{exports.js-B13PkE0J.js → exports.js-B5DLeNXr.js} +2 -2
  70. package/build/server/chunks/chunks/{exports.js-B13PkE0J.js.map → exports.js-B5DLeNXr.js.map} +1 -1
  71. package/build/server/chunks/chunks/{http.js-ChQRRKfZ.js → http.js-CzB9Igb0.js} +2 -2
  72. package/build/server/chunks/chunks/{http.js-ChQRRKfZ.js.map → http.js-CzB9Igb0.js.map} +1 -1
  73. package/build/server/chunks/chunks/{internal.js-DlKoWKM-.js → internal.js-HE35Pm1C.js} +5 -3
  74. package/build/server/chunks/chunks/internal.js-HE35Pm1C.js.map +1 -0
  75. package/build/server/chunks/chunks/internal2.js-BlXt2rfE.js.map +1 -1
  76. package/build/server/chunks/chunks/{manifest-membership.js-BnSECWpJ.js → manifest-membership.js-Cm_2fU-Z.js} +2 -2
  77. package/build/server/chunks/chunks/{manifest-membership.js-BnSECWpJ.js.map → manifest-membership.js-Cm_2fU-Z.js.map} +1 -1
  78. package/build/server/chunks/chunks/{raw-reconciliation.js-ZEOCk_jA.js → raw-reconciliation.js-1_IwPhKb.js} +3 -3
  79. package/build/server/chunks/chunks/raw-reconciliation.js-1_IwPhKb.js.map +1 -0
  80. package/build/server/chunks/chunks/{raw-reconciliation2.js-CscuoBC2.js → raw-reconciliation2.js-CcO9li5n.js} +2 -2
  81. package/build/server/chunks/chunks/{raw-reconciliation2.js-CscuoBC2.js.map → raw-reconciliation2.js-CcO9li5n.js.map} +1 -1
  82. package/build/server/chunks/chunks/{shared.js-DKt4pwWi.js → shared.js-MR8sPPTu.js} +2 -2
  83. package/build/server/chunks/chunks/{shared.js-DKt4pwWi.js.map → shared.js-MR8sPPTu.js.map} +1 -1
  84. package/build/server/chunks/chunks/{utils.js-BYMC-4Wt.js → utils.js-C2UFBITa.js} +3 -3
  85. package/build/server/chunks/chunks/{utils.js-BYMC-4Wt.js.map → utils.js-C2UFBITa.js.map} +1 -1
  86. package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-z988EDp2.js → _server.ts.js-BnRJ5Qnd.js} +6 -6
  87. package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-z988EDp2.js.map → _server.ts.js-BnRJ5Qnd.js.map} +1 -1
  88. package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-C68ru6gS.js → _server.ts.js-BZPR6n5n.js} +9 -7
  89. package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-C68ru6gS.js.map → _server.ts.js-BZPR6n5n.js.map} +1 -1
  90. package/build/server/chunks/entries/endpoints/api/assets/_id_/raw/{_server.ts.js-C0tk6RFk.js → _server.ts.js-DiBS3A0C.js} +9 -7
  91. package/build/server/chunks/entries/endpoints/api/assets/_id_/raw/{_server.ts.js-C0tk6RFk.js.map → _server.ts.js-DiBS3A0C.js.map} +1 -1
  92. package/build/server/chunks/entries/endpoints/api/assets/_id_/reimport/{_server.ts.js-I03oZuo8.js → _server.ts.js-LOO6qm2-.js} +9 -7
  93. package/build/server/chunks/entries/endpoints/api/assets/_id_/reimport/{_server.ts.js-I03oZuo8.js.map → _server.ts.js-LOO6qm2-.js.map} +1 -1
  94. package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-BsQB8YDq.js → _server.ts.js-CRtJJoSs.js} +9 -7
  95. package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-BsQB8YDq.js.map → _server.ts.js-CRtJJoSs.js.map} +1 -1
  96. package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-CJuFE6Fb.js → _server.ts.js-Ds4zCZ9H.js} +9 -7
  97. package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-CJuFE6Fb.js.map → _server.ts.js-Ds4zCZ9H.js.map} +1 -1
  98. package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-DuOZRRiA.js → _server.ts.js-DD4N8pcj.js} +9 -7
  99. package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-DuOZRRiA.js.map → _server.ts.js-DD4N8pcj.js.map} +1 -1
  100. package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-DGzYpQbv.js → _server.ts.js-CZev9aYz.js} +9 -7
  101. package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-DGzYpQbv.js.map → _server.ts.js-CZev9aYz.js.map} +1 -1
  102. package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-B045QoCA.js → _server.ts.js-MBDVW0q1.js} +9 -7
  103. package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-B045QoCA.js.map → _server.ts.js-MBDVW0q1.js.map} +1 -1
  104. package/build/server/chunks/entries/endpoints/api/imports/{_server.ts.js-HUkVdz19.js → _server.ts.js-C7naXnsR.js} +9 -7
  105. package/build/server/chunks/entries/endpoints/api/imports/{_server.ts.js-HUkVdz19.js.map → _server.ts.js-C7naXnsR.js.map} +1 -1
  106. package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-ry509mom.js → _server.ts.js-DuGyRdf3.js} +9 -7
  107. package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-ry509mom.js.map → _server.ts.js-DuGyRdf3.js.map} +1 -1
  108. package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-DU0J7U25.js → _server.ts.js-0-ZCt0qH.js} +9 -7
  109. package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-DU0J7U25.js.map → _server.ts.js-0-ZCt0qH.js.map} +1 -1
  110. package/build/server/chunks/entries/endpoints/api/raw/adopt/{_server.ts.js-AZIV2PIn.js → _server.ts.js-DFYU_sZL.js} +9 -7
  111. package/build/server/chunks/entries/endpoints/api/raw/adopt/{_server.ts.js-AZIV2PIn.js.map → _server.ts.js-DFYU_sZL.js.map} +1 -1
  112. package/build/server/chunks/entries/endpoints/api/raw/edited/accept/{_server.ts.js-CDL0hCfM.js → _server.ts.js-BqJpK0sJ.js} +9 -7
  113. package/build/server/chunks/entries/endpoints/api/raw/edited/accept/{_server.ts.js-CDL0hCfM.js.map → _server.ts.js-BqJpK0sJ.js.map} +1 -1
  114. package/build/server/chunks/entries/endpoints/api/raw/edited/dismiss/{_server.ts.js-B13c17fq.js → _server.ts.js--LSqADJp.js} +9 -7
  115. package/build/server/chunks/entries/endpoints/api/raw/edited/dismiss/{_server.ts.js-B13c17fq.js.map → _server.ts.js--LSqADJp.js.map} +1 -1
  116. package/build/server/chunks/entries/endpoints/api/reconcile/{_server.ts.js-BCxjyAGC.js → _server.ts.js-DcL8nYDM.js} +9 -7
  117. package/build/server/chunks/entries/endpoints/api/reconcile/{_server.ts.js-BCxjyAGC.js.map → _server.ts.js-DcL8nYDM.js.map} +1 -1
  118. package/build/server/chunks/entries/endpoints/api/reveal/{_server.ts.js-BveeMZc2.js → _server.ts.js-72OcyLfP.js} +9 -7
  119. package/build/server/chunks/entries/endpoints/api/reveal/{_server.ts.js-BveeMZc2.js.map → _server.ts.js-72OcyLfP.js.map} +1 -1
  120. package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-BZjTd9a0.js → _server.ts.js-D0bOxmG0.js} +9 -7
  121. package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-BZjTd9a0.js.map → _server.ts.js-D0bOxmG0.js.map} +1 -1
  122. package/build/server/chunks/entries/endpoints/api/usage/{_server.ts.js-BbTfPvC9.js → _server.ts.js-BjDVCRNV.js} +9 -7
  123. package/build/server/chunks/entries/endpoints/api/usage/{_server.ts.js-BbTfPvC9.js.map → _server.ts.js-BjDVCRNV.js.map} +1 -1
  124. package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-8VPJMLBk.js → _server.ts.js-CndfoXXd.js} +6 -6
  125. package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-8VPJMLBk.js.map → _server.ts.js-CndfoXXd.js.map} +1 -1
  126. package/build/server/chunks/entries/endpoints/files/proxy/_...path_/{_server.ts.js-BqR2J2sB.js → _server.ts.js-Ck1mgbk5.js} +9 -7
  127. package/build/server/chunks/entries/endpoints/files/proxy/_...path_/{_server.ts.js-BqR2J2sB.js.map → _server.ts.js-Ck1mgbk5.js.map} +1 -1
  128. package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-DbA28dCY.js → _server.ts.js-lZ9oP8tz.js} +9 -7
  129. package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-DbA28dCY.js.map → _server.ts.js-lZ9oP8tz.js.map} +1 -1
  130. package/build/server/chunks/entries/{hooks.server.js-9PBc_3Jh.js → hooks.server.js-DQ6l2RSK.js} +8 -6
  131. package/build/server/chunks/entries/{hooks.server.js-9PBc_3Jh.js.map → hooks.server.js-DQ6l2RSK.js.map} +1 -1
  132. package/build/server/chunks/{handler-XxBNCHhb.js → handler-Dfk_4a-r.js} +5 -5
  133. package/build/server/chunks/{handler-XxBNCHhb.js.map → handler-Dfk_4a-r.js.map} +1 -1
  134. package/build/server/chunks/{index.js-B_76Gq5Y.js → index.js-O3Wl1zok.js} +5 -5
  135. package/build/server/chunks/{index.js-B_76Gq5Y.js.map → index.js-O3Wl1zok.js.map} +1 -1
  136. package/build/server/chunks/{manifest.js-C2MZZt3o.js → manifest.js-51nEZnKQ.js} +29 -29
  137. package/build/server/chunks/{manifest.js-C2MZZt3o.js.map → manifest.js-51nEZnKQ.js.map} +1 -1
  138. package/build/server/chunks/nodes/{0.js-BLURyWmd.js → 0.js-DjqMfDtB.js} +2 -2
  139. package/build/server/chunks/nodes/{0.js-BLURyWmd.js.map → 0.js-DjqMfDtB.js.map} +1 -1
  140. package/build/server/chunks/nodes/1.js-BwfSLYJH.js +7 -0
  141. package/build/server/chunks/nodes/{1.js-CITI7d3d.js.map → 1.js-BwfSLYJH.js.map} +1 -1
  142. package/build/server/chunks/nodes/2.js-buHbEytf.js +7 -0
  143. package/build/server/chunks/nodes/2.js-buHbEytf.js.map +1 -0
  144. package/build/server/chunks/nodes/3.js-D7_hF0qp.js +7 -0
  145. package/build/server/chunks/nodes/3.js-D7_hF0qp.js.map +1 -0
  146. package/build/server/chunks/nodes/4.js-D58M2chZ.js +7 -0
  147. package/build/server/chunks/nodes/{4.js-BRlAiVnn.js.map → 4.js-D58M2chZ.js.map} +1 -1
  148. package/dist/config.d.ts +3 -3
  149. package/dist/config.js +2 -2
  150. package/dist/core/api-types.d.ts +22 -2
  151. package/dist/core/config.d.ts +82 -0
  152. package/dist/core/config.js +9 -0
  153. package/dist/core/index.d.ts +10 -5
  154. package/dist/core/index.js +5 -2
  155. package/dist/core/library-validation.d.ts +13 -0
  156. package/dist/core/library-validation.js +48 -0
  157. package/dist/core/library.d.ts +19 -0
  158. package/dist/core/library.js +4 -4
  159. package/dist/core/manifest-membership.d.ts +2 -2
  160. package/dist/core/package-declaration.d.ts +43 -0
  161. package/dist/core/package-declaration.js +80 -0
  162. package/dist/core/package-merge.d.ts +65 -0
  163. package/dist/core/package-merge.js +173 -0
  164. package/dist/core/reference-graph.d.ts +3 -3
  165. package/dist/runtime/components/Image.svelte +5 -6
  166. package/dist/runtime/components/Image.svelte.d.ts +2 -3
  167. package/dist/server/build.js +26 -11
  168. package/dist/server/check.d.ts +13 -3
  169. package/dist/server/check.js +112 -24
  170. package/dist/server/codegen.d.ts +3 -1
  171. package/dist/server/codegen.js +18 -0
  172. package/dist/server/config-loader.d.ts +35 -1
  173. package/dist/server/config-loader.js +185 -4
  174. package/dist/server/library-store.d.ts +11 -1
  175. package/dist/server/library-store.js +42 -60
  176. package/dist/server/operations.js +162 -47
  177. package/package.json +1 -1
  178. package/build/client/_app/immutable/assets/2.C-1MfvLQ.css +0 -1
  179. package/build/client/_app/immutable/assets/2.C-1MfvLQ.css.br +0 -0
  180. package/build/client/_app/immutable/assets/2.C-1MfvLQ.css.gz +0 -0
  181. package/build/client/_app/immutable/assets/3.C6xo25uI.css.br +0 -0
  182. package/build/client/_app/immutable/assets/3.C6xo25uI.css.gz +0 -0
  183. package/build/client/_app/immutable/assets/AssetSourceMenu.IjDdjx3o.css.br +0 -0
  184. package/build/client/_app/immutable/assets/AssetSourceMenu.IjDdjx3o.css.gz +0 -0
  185. package/build/client/_app/immutable/chunks/77p2oEJ1.js.br +0 -0
  186. package/build/client/_app/immutable/chunks/77p2oEJ1.js.gz +0 -0
  187. package/build/client/_app/immutable/chunks/B9HdDE5n.js +0 -1
  188. package/build/client/_app/immutable/chunks/B9HdDE5n.js.br +0 -0
  189. package/build/client/_app/immutable/chunks/B9HdDE5n.js.gz +0 -0
  190. package/build/client/_app/immutable/chunks/B_PWcB6g.js +0 -108
  191. package/build/client/_app/immutable/chunks/B_PWcB6g.js.br +0 -0
  192. package/build/client/_app/immutable/chunks/B_PWcB6g.js.gz +0 -0
  193. package/build/client/_app/immutable/chunks/Q50krHyn.js +0 -2
  194. package/build/client/_app/immutable/chunks/Q50krHyn.js.br +0 -0
  195. package/build/client/_app/immutable/chunks/Q50krHyn.js.gz +0 -0
  196. package/build/client/_app/immutable/chunks/RgXSPQ_h.js +0 -1
  197. package/build/client/_app/immutable/chunks/RgXSPQ_h.js.br +0 -0
  198. package/build/client/_app/immutable/chunks/RgXSPQ_h.js.gz +0 -0
  199. package/build/client/_app/immutable/chunks/YpiA5Xry.js +0 -3
  200. package/build/client/_app/immutable/chunks/YpiA5Xry.js.br +0 -0
  201. package/build/client/_app/immutable/chunks/YpiA5Xry.js.gz +0 -0
  202. package/build/client/_app/immutable/chunks/dNO-9VOT.js.br +0 -0
  203. package/build/client/_app/immutable/chunks/dNO-9VOT.js.gz +0 -0
  204. package/build/client/_app/immutable/chunks/hUfV2O0k.js +0 -1
  205. package/build/client/_app/immutable/chunks/hUfV2O0k.js.br +0 -0
  206. package/build/client/_app/immutable/chunks/hUfV2O0k.js.gz +0 -0
  207. package/build/client/_app/immutable/entry/app.BsvwTApt.js +0 -2
  208. package/build/client/_app/immutable/entry/app.BsvwTApt.js.br +0 -0
  209. package/build/client/_app/immutable/entry/app.BsvwTApt.js.gz +0 -0
  210. package/build/client/_app/immutable/entry/start.BdjLMMsY.js +0 -1
  211. package/build/client/_app/immutable/entry/start.BdjLMMsY.js.br +0 -0
  212. package/build/client/_app/immutable/entry/start.BdjLMMsY.js.gz +0 -0
  213. package/build/client/_app/immutable/nodes/0.CjQfQrD6.js +0 -1
  214. package/build/client/_app/immutable/nodes/0.CjQfQrD6.js.br +0 -0
  215. package/build/client/_app/immutable/nodes/0.CjQfQrD6.js.gz +0 -0
  216. package/build/client/_app/immutable/nodes/1.DyPcUKIh.js +0 -1
  217. package/build/client/_app/immutable/nodes/1.DyPcUKIh.js.br +0 -2
  218. package/build/client/_app/immutable/nodes/1.DyPcUKIh.js.gz +0 -0
  219. package/build/client/_app/immutable/nodes/2.CworwA2R.js +0 -3
  220. package/build/client/_app/immutable/nodes/2.CworwA2R.js.br +0 -0
  221. package/build/client/_app/immutable/nodes/2.CworwA2R.js.gz +0 -0
  222. package/build/client/_app/immutable/nodes/3.BKqbML1T.js +0 -1
  223. package/build/client/_app/immutable/nodes/3.BKqbML1T.js.br +0 -0
  224. package/build/client/_app/immutable/nodes/3.BKqbML1T.js.gz +0 -0
  225. package/build/client/_app/immutable/nodes/4.Cmigd8CT.js +0 -2
  226. package/build/client/_app/immutable/nodes/4.Cmigd8CT.js.br +0 -0
  227. package/build/client/_app/immutable/nodes/4.Cmigd8CT.js.gz +0 -0
  228. package/build/server/chunks/chunks/context.js-CVuTSPjH.js.map +0 -1
  229. package/build/server/chunks/chunks/contract.js-itFN0Gon.js.map +0 -1
  230. package/build/server/chunks/chunks/core.js-CABVXpby.js.map +0 -1
  231. package/build/server/chunks/chunks/internal.js-DlKoWKM-.js.map +0 -1
  232. package/build/server/chunks/chunks/raw-reconciliation.js-ZEOCk_jA.js.map +0 -1
  233. package/build/server/chunks/nodes/1.js-CITI7d3d.js +0 -7
  234. package/build/server/chunks/nodes/2.js-DAls5TjF.js +0 -7
  235. package/build/server/chunks/nodes/2.js-DAls5TjF.js.map +0 -1
  236. package/build/server/chunks/nodes/3.js-CesAmg_E.js +0 -7
  237. package/build/server/chunks/nodes/3.js-CesAmg_E.js.map +0 -1
  238. package/build/server/chunks/nodes/4.js-BRlAiVnn.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, 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
- 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 (!Object.hasOwn(library.manifests, manifest)) {
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 = 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 }));
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,
@@ -360,8 +367,9 @@ export class LibraryStore {
360
367
  const library = await this.read();
361
368
  const record = this.#requireAsset(library, id);
362
369
  const unique = [...new Set(manifests)];
370
+ const validManifests = this.#validManifestNames(library);
363
371
  for (const name of unique) {
364
- if (!Object.hasOwn(library.manifests, name)) {
372
+ if (!validManifests.has(name)) {
365
373
  throw new Error(`Unknown manifest "${name}".`);
366
374
  }
367
375
  }
@@ -815,7 +823,14 @@ export class LibraryStore {
815
823
  * type, dangling raw pointer, invalid parameters, unknown manifest names,
816
824
  * and reference errors (dangling target, type mismatch, cycles).
817
825
  */
818
- async validate(library) {
826
+ async validate(library, options = {}) {
827
+ // The default preserves single-root behaviour (host === effective). When
828
+ // merging Packages, disk/host checks run on the host library with
829
+ // `flatSpace: false`, while the flat-space checks (id/type/parameters/
830
+ // membership/appearance/references) run separately over the *effective*
831
+ // library — host override records store partial parameters that only
832
+ // validate once merged, and references may cross the host/Package boundary.
833
+ const flatSpace = options.flatSpace ?? true;
819
834
  const issues = [];
820
835
  const folderKeys = new Map();
821
836
  for (const folder of library.folders) {
@@ -845,53 +860,7 @@ export class LibraryStore {
845
860
  }
846
861
  }
847
862
  }
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
863
  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
864
  try {
896
865
  assertSafeRelativeFilePath(record.raw);
897
866
  }
@@ -911,13 +880,11 @@ export class LibraryStore {
911
880
  message: `Raw file "${record.raw}" is missing from the raw directory.`
912
881
  });
913
882
  }
914
- for (const manifest of record.manifests) {
915
- if (!library.manifests[manifest]) {
916
- issues.push({ assetId, message: `Unknown manifest "${manifest}".` });
917
- }
918
- }
919
883
  }
920
- issues.push(...referenceErrors(library, collectAllReferences(library, descriptorsByType(this.#registry))));
884
+ if (flatSpace) {
885
+ issues.push(...flatLibraryIssues(library, descriptorsByType(this.#registry)));
886
+ issues.push(...manifestModuleCollisionIssues(library.manifests));
887
+ }
921
888
  return issues;
922
889
  }
923
890
  async #deleteProxiesOf(assetId) {
@@ -940,6 +907,21 @@ export class LibraryStore {
940
907
  }
941
908
  return library.assets[id];
942
909
  }
910
+ /**
911
+ * Valid manifest names for asset membership: the host library's own manifests
912
+ * plus any a configured Package introduces. The effective (merged) library
913
+ * unions both, so a host asset (or slot fill) may be placed into a
914
+ * Package-introduced manifest — validating against the host manifests alone
915
+ * would wrongly reject that placement.
916
+ */
917
+ #validManifestNames(library) {
918
+ const names = new Set(Object.keys(library.manifests));
919
+ for (const pkg of this.#config.packages ?? []) {
920
+ for (const name of Object.keys(pkg.declaration.manifests))
921
+ names.add(name);
922
+ }
923
+ return names;
924
+ }
943
925
  /** Resolve a non-colliding raw file name, appending `-1`, `-2`, … before the extension. */
944
926
  #uniqueRawName(fileName, folder) {
945
927
  if (!existsSync(join(this.#config.rawDir, folder, fileName)))
@@ -7,9 +7,10 @@
7
7
  */
8
8
  import { readFile } from 'node:fs/promises';
9
9
  import { join } from 'node:path';
10
- import { assetIdError, allDeliveredAssetIds, canonicalizeParameters, collectAllReferences, compareCodeUnits, computeLibraryMembership, folderOfRawPath, normalizeFolderPath, parentFolderPath, portableFolderPathKey, proposeAssetId, rawFileNameOfPath, serializeLibrary, typesForFileName } from '../core/index.js';
10
+ import { assetIdError, allDeliveredAssetIds, canonicalizeParameters, collectAllReferences, compareCodeUnits, computeLibraryMembership, flatLibraryIssues, folderOfRawPath, materializeLibrary, mergePackages, normalizeFolderPath, parentFolderPath, portableFolderPathKey, proposeAssetId, rawFileNameOfPath, serializeLibrary, typesForFileName } from '../core/index.js';
11
11
  import { LibraryStore } from './library-store.js';
12
- import { generateManifestModules, locateGeneratedAssetDeclaration, manifestModuleFileName } from './codegen.js';
12
+ import { generateManifestModules, locateGeneratedAssetDeclaration, manifestModuleCollisionIssues, manifestModuleFileName } from './codegen.js';
13
+ import { packageSlotFindings } from './check.js';
13
14
  import { descriptorsByType, serverPluginForType, serverPluginsByType } from './plugins.js';
14
15
  import { processAssets, readCurrentProxy } from './processing/processor.js';
15
16
  import { encodeRelativePathForUrl } from './folder-filesystem.js';
@@ -489,36 +490,65 @@ export class FundusOperations {
489
490
  this.#validateImportedRaw(raw);
490
491
  const fileName = raw.suggestedFileName ?? `${options.id}.${raw.extension}`;
491
492
  const plugin = serverPluginForType(options.type, this.#registry);
492
- const library = await this.#store.createAsset({
493
- fileName,
494
- bytes: raw.bytes,
495
- type: options.type,
496
- id: options.id,
497
- folder: options.folder,
498
- manifests: options.manifests,
499
- importSource: raw.importSource
500
- }, async ({ rawPath, rawFileName, parameters }) => {
501
- let next = parameters;
502
- if (plugin.seedIngestParameters) {
503
- const seeded = await plugin.seedIngestParameters({
504
- rawPath,
505
- rawFileName,
506
- parameters: next,
507
- config: this.#config
508
- });
509
- if (seeded !== undefined)
510
- next = seeded;
511
- }
512
- // Source scale is a default: an explicit parametersPatch below still wins.
493
+ // Filling a Package slot writes a host override that inherits the Package's
494
+ // parameters via the deep merge, so the override is partial. Byte-derived
495
+ // fields the Package can't author — the slice pixelRatio from the import
496
+ // scale — must still be supplied here; an explicit patch then wins.
497
+ const packageBase = this.#packageBase(await this.#store.read(), options.id);
498
+ if (packageBase && packageBase.type !== options.type) {
499
+ throw new SourceImportError('invalid-input', `Filling slot "${options.id}" requires the package type "${packageBase.type}", not "${options.type}".`);
500
+ }
501
+ let slotOverride = {};
502
+ if (packageBase) {
513
503
  const pixelRatio = figmaSlicePixelRatio(raw, options.type);
514
504
  if (pixelRatio !== undefined) {
515
- next = mergeParameterPatch(next, { pixelRatio });
505
+ slotOverride = mergeParameterPatch(slotOverride, { pixelRatio });
516
506
  }
517
507
  if (options.parametersPatch !== undefined) {
518
- next = mergeParameterPatch(next, options.parametersPatch);
508
+ slotOverride = mergeParameterPatch(slotOverride, options.parametersPatch);
519
509
  }
520
- return plugin.descriptor.validateParameters(next);
521
- });
510
+ }
511
+ const library = packageBase
512
+ ? await this.#store.createAsset({
513
+ fileName,
514
+ bytes: raw.bytes,
515
+ type: options.type,
516
+ id: options.id,
517
+ folder: options.folder,
518
+ manifests: options.manifests,
519
+ importSource: raw.importSource,
520
+ parametersOverride: slotOverride
521
+ })
522
+ : await this.#store.createAsset({
523
+ fileName,
524
+ bytes: raw.bytes,
525
+ type: options.type,
526
+ id: options.id,
527
+ folder: options.folder,
528
+ manifests: options.manifests,
529
+ importSource: raw.importSource
530
+ }, async ({ rawPath, rawFileName, parameters }) => {
531
+ let next = parameters;
532
+ if (plugin.seedIngestParameters) {
533
+ const seeded = await plugin.seedIngestParameters({
534
+ rawPath,
535
+ rawFileName,
536
+ parameters: next,
537
+ config: this.#config
538
+ });
539
+ if (seeded !== undefined)
540
+ next = seeded;
541
+ }
542
+ // Source scale is a default: an explicit parametersPatch below still wins.
543
+ const pixelRatio = figmaSlicePixelRatio(raw, options.type);
544
+ if (pixelRatio !== undefined) {
545
+ next = mergeParameterPatch(next, { pixelRatio });
546
+ }
547
+ if (options.parametersPatch !== undefined) {
548
+ next = mergeParameterPatch(next, options.parametersPatch);
549
+ }
550
+ return plugin.descriptor.validateParameters(next);
551
+ });
522
552
  return this.#afterMutation(library);
523
553
  }
524
554
  #validateImportTarget(options, library) {
@@ -543,8 +573,10 @@ export class FundusOperations {
543
573
  options.manifests.some((value) => typeof value !== 'string'))) {
544
574
  throw new SourceImportError('invalid-input', 'Import manifests must be an array of strings.');
545
575
  }
576
+ // A placement may target a Package-introduced manifest (host + package union).
577
+ const validManifests = this.#effectiveOf(library).effective.manifests;
546
578
  for (const manifest of new Set(options.manifests ?? [])) {
547
- if (!Object.hasOwn(library.manifests, manifest)) {
579
+ if (!Object.hasOwn(validManifests, manifest)) {
548
580
  throw new SourceImportError('invalid-input', `Unknown manifest "${manifest}".`);
549
581
  }
550
582
  }
@@ -568,7 +600,9 @@ export class FundusOperations {
568
600
  }
569
601
  async #patchAsset(id, body) {
570
602
  let library = await this.#store.read();
571
- this.#requireAsset(library, id);
603
+ // A pure Package asset is read-only; fill/override it by importing bytes
604
+ // with its id. Host assets and existing overrides patch normally.
605
+ this.#assertHostAsset(library, id, 'editing it');
572
606
  if (body.parameters !== undefined) {
573
607
  library = await this.#store.updateParameters(id, body.parameters);
574
608
  }
@@ -787,12 +821,19 @@ export class FundusOperations {
787
821
  async #runAfterMutation(library) {
788
822
  const pipelineIssues = [];
789
823
  const classification = await this.#classifyRawDirectory(library);
790
- const ordinaryIssues = await this.#store.validate(library);
824
+ const { effective, provenance, mergeFindings } = this.#effectiveOf(library);
825
+ const materialized = materializeLibrary(effective);
826
+ const ordinaryIssues = [
827
+ ...(await this.#store.validate(library, { flatSpace: false })),
828
+ ...this.#flatIssues(effective, provenance, mergeFindings)
829
+ ];
791
830
  const safetyIssues = this.#rawSafetyIssues(library, classification);
792
831
  if (ordinaryIssues.length === 0 && safetyIssues.length === 0) {
793
832
  try {
794
- const report = await processAssets(this.#config, library, this.#registry);
795
- await generateManifestModules(this.#config, library, report.proxies, this.#registry);
833
+ // Codegen runs over the merged, materialized library so the dev server
834
+ // writes the same modules `fundus build`/`fundus check` expect.
835
+ const report = await processAssets(this.#config, materialized, this.#registry);
836
+ await generateManifestModules(this.#config, materialized, report.proxies, this.#registry);
796
837
  }
797
838
  catch (cause) {
798
839
  pipelineIssues.push({
@@ -808,13 +849,15 @@ export class FundusOperations {
808
849
  state: await this.#snapshotState(latestLibrary, latestClassification, pipelineIssues)
809
850
  };
810
851
  }
811
- async #buildState(library, issues, classification) {
852
+ async #buildState(host, library, provenance, issues, classification) {
812
853
  const [gitBranch, changedGitAssets] = await Promise.all([
813
854
  currentGitBranch(this.#config.projectRoot),
814
- gitAssetChanges(this.#config.projectRoot, this.#config.library, library)
855
+ // Git diff over the host library only — Package assets are not host-owned
856
+ // and would otherwise all read as "new".
857
+ gitAssetChanges(this.#config.projectRoot, this.#config.library, host)
815
858
  ]);
816
859
  const referencesByAsset = collectAllReferences(library, descriptorsByType(this.#registry));
817
- const duplicatesByAsset = await this.#duplicateDetector.find(library, this.#config.rawDir);
860
+ const duplicatesByAsset = await this.#duplicateDetector.find(host, this.#config.rawDir);
818
861
  const membershipByManifest = computeLibraryMembership(library, referencesByAsset);
819
862
  const delivered = allDeliveredAssetIds(membershipByManifest);
820
863
  // Per asset: the manifests it is a passive member of, with attribution.
@@ -837,6 +880,14 @@ export class FundusOperations {
837
880
  const assets = [];
838
881
  for (const assetId of Object.keys(library.assets).sort(compareCodeUnits)) {
839
882
  const record = library.assets[assetId];
883
+ const prov = provenance[assetId] ?? { source: 'host' };
884
+ const origin = prov.source === 'host'
885
+ ? { kind: 'host' }
886
+ : prov.source === 'package'
887
+ ? { kind: 'package', origin: prov.origin }
888
+ : { kind: 'override', origin: prov.origin };
889
+ // An unfilled Package slot carries no bytes.
890
+ const isSlot = record.raw === undefined;
840
891
  const warnings = [];
841
892
  for (const issue of issues) {
842
893
  if (issue.assetId === assetId)
@@ -844,8 +895,9 @@ export class FundusOperations {
844
895
  }
845
896
  // Unreachable: no explicit membership AND no passive membership in any
846
897
  // manifest — nothing delivers the asset. A passively delivered asset is
847
- // fine (it ships inlined into its referrers) and must not warn.
848
- if (record.manifests.length === 0 && !delivered.has(assetId)) {
898
+ // fine (it ships inlined into its referrers) and must not warn. An inert
899
+ // unfilled Package slot is not a host mistake and must not warn.
900
+ if (record.manifests.length === 0 && !delivered.has(assetId) && !isSlot) {
849
901
  warnings.push('In no manifest and not referenced by any delivered asset — ' +
850
902
  'nothing is processed or generated for it.');
851
903
  }
@@ -853,7 +905,7 @@ export class FundusOperations {
853
905
  warnings.push(`Importer "${record.importSource.importer}" is unavailable; the local raw file remains usable.`);
854
906
  }
855
907
  let proxy = null;
856
- if (delivered.has(assetId)) {
908
+ if (delivered.has(assetId) && !isSlot) {
857
909
  try {
858
910
  const currentProxy = await readCurrentProxy(assetId, record, this.#config, this.#registry);
859
911
  if (currentProxy) {
@@ -871,13 +923,17 @@ export class FundusOperations {
871
923
  warnings.push(cause instanceof Error ? cause.message : String(cause));
872
924
  }
873
925
  }
926
+ const raw = record.raw ?? '';
927
+ const rawHash = record.rawHash ?? '';
874
928
  assets.push({
875
929
  id: assetId,
876
930
  type: record.type,
877
- raw: record.raw,
878
- folder: folderOfRawPath(record.raw),
879
- rawUrl: `/files/raw/${encodeRelativePathForUrl(record.raw)}?v=${record.rawHash.slice(0, 12)}`,
880
- rawHash: record.rawHash,
931
+ raw,
932
+ folder: folderOfRawPath(raw),
933
+ rawUrl: isSlot
934
+ ? ''
935
+ : `/files/raw/${encodeRelativePathForUrl(raw)}?v=${rawHash.slice(0, 12)}`,
936
+ rawHash,
881
937
  gitStatus: changedGitAssets.get(assetId) ?? null,
882
938
  importSource: record.importSource,
883
939
  parameters: record.parameters,
@@ -892,7 +948,9 @@ export class FundusOperations {
892
948
  assetId: reference.assetId
893
949
  })),
894
950
  incoming: incomingByAsset.get(assetId) ?? []
895
- }
951
+ },
952
+ origin,
953
+ overridden: origin.kind === 'override'
896
954
  });
897
955
  }
898
956
  // Per manifest: the membership picture for the manifests view, and the
@@ -923,7 +981,7 @@ export class FundusOperations {
923
981
  presetNames[type] = names;
924
982
  presetCapabilities[type] = Object.fromEntries(names.map((name) => [name, plugin.presetCapabilities?.(presets[name]) ?? {}]));
925
983
  }
926
- const rawIngestionQueue = this.#buildRawIngestionQueue(library, classification);
984
+ const rawIngestionQueue = this.#buildRawIngestionQueue(host, classification);
927
985
  return {
928
986
  gitBranch,
929
987
  library,
@@ -934,7 +992,8 @@ export class FundusOperations {
934
992
  presetCapabilities,
935
993
  manifestMemberships,
936
994
  manifestDeliveredBytes,
937
- rawIngestionQueue
995
+ rawIngestionQueue,
996
+ packageOrigins: this.#config.packages.map((pkg) => pkg.origin).sort(compareCodeUnits)
938
997
  };
939
998
  }
940
999
  #compatibleTypes(path) {
@@ -947,8 +1006,10 @@ export class FundusOperations {
947
1006
  return rawSafetyIssues(library, classification, (path) => this.#compatibleTypes(path));
948
1007
  }
949
1008
  async #snapshotState(library, classification, extraIssues = []) {
1009
+ const { effective, provenance, mergeFindings } = this.#effectiveOf(library);
950
1010
  const issues = [
951
- ...(await this.#store.validate(library)),
1011
+ ...(await this.#store.validate(library, { flatSpace: false })),
1012
+ ...this.#flatIssues(effective, provenance, mergeFindings),
952
1013
  ...this.#rawSafetyIssues(library, classification),
953
1014
  ...extraIssues
954
1015
  ];
@@ -960,7 +1021,7 @@ export class FundusOperations {
960
1021
  seen.add(key);
961
1022
  return true;
962
1023
  });
963
- return this.#buildState(library, uniqueIssues, classification);
1024
+ return this.#buildState(library, effective, provenance, uniqueIssues, classification);
964
1025
  }
965
1026
  #canAutoReconcile(classification, retry = false) {
966
1027
  return (classification.complete &&
@@ -1066,6 +1127,60 @@ export class FundusOperations {
1066
1127
  throw new Error(`Unknown asset "${id}".`);
1067
1128
  }
1068
1129
  }
1130
+ /** Merge the configured Packages under the host library (host wins). */
1131
+ #effectiveOf(host) {
1132
+ const { library, provenance, findings } = mergePackages(host, this.#config.packages ?? []);
1133
+ return { effective: library, provenance, mergeFindings: findings };
1134
+ }
1135
+ /**
1136
+ * The Package base record for `id` when `id` is a read-only Package asset the
1137
+ * host has not yet filled — i.e. this create is a *slot fill*. Returns null
1138
+ * for a plain new host asset.
1139
+ */
1140
+ #packageBase(host, id) {
1141
+ if (Object.hasOwn(host.assets, id))
1142
+ return null;
1143
+ const { effective, provenance } = this.#effectiveOf(host);
1144
+ if (provenance[id]?.source === 'package')
1145
+ return { type: effective.assets[id].type };
1146
+ return null;
1147
+ }
1148
+ /**
1149
+ * Flat-space validation over the effective library: merge errors, id/type/
1150
+ * parameter/membership/appearance/reference checks, module collisions, and
1151
+ * delivered-slot findings. Disk/host checks stay in `store.validate(host,
1152
+ * { flatSpace: false })`.
1153
+ */
1154
+ #flatIssues(effective, provenance, mergeFindings) {
1155
+ const referencesByAsset = collectAllReferences(effective, descriptorsByType(this.#registry));
1156
+ const membership = computeLibraryMembership(effective, referencesByAsset);
1157
+ return [
1158
+ ...mergeFindings
1159
+ .filter((finding) => finding.kind !== 'package-overridden')
1160
+ .map((finding) => ({ assetId: finding.assetId, message: finding.message })),
1161
+ ...flatLibraryIssues(effective, descriptorsByType(this.#registry)),
1162
+ ...manifestModuleCollisionIssues(effective.manifests),
1163
+ ...packageSlotFindings(effective, provenance, membership).map((finding) => ({
1164
+ assetId: finding.assetId,
1165
+ message: finding.message
1166
+ }))
1167
+ ];
1168
+ }
1169
+ /**
1170
+ * Whether an id is a read-only Package asset the host has not overridden.
1171
+ * Such ids can be filled/overridden (write a host record) but not mutated,
1172
+ * renamed, moved, or deleted in place.
1173
+ */
1174
+ #assertHostAsset(host, id, action) {
1175
+ if (Object.hasOwn(host.assets, id))
1176
+ return;
1177
+ const { provenance } = this.#effectiveOf(host);
1178
+ const prov = provenance[id];
1179
+ if (prov && prov.source !== 'host') {
1180
+ throw new Error(`Asset "${id}" is provided by package "${prov.origin}"; ${action} is not available. Override it by importing or uploading bytes with this id.`);
1181
+ }
1182
+ throw new Error(`Unknown asset "${id}".`);
1183
+ }
1069
1184
  /**
1070
1185
  * Apply a CLI asset change to the store, validating the resulting library
1071
1186
  * on an in-memory candidate first — nothing is persisted when the change
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fundus",
3
- "version": "0.14.0",
3
+ "version": "0.16.0",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1 +0,0 @@
1
- .submenu-anchor.svelte-13hq4tl{position:relative}button.svelte-13hq4tl{width:100%;color:var(--text);font:inherit;text-align:left;white-space:nowrap;background:0 0;border:0;border-radius:4px;padding:6px 8px}button.svelte-13hq4tl:hover,button.svelte-13hq4tl:focus-visible{background:var(--accent-soft);outline:none}.submenu-anchor.svelte-13hq4tl:has(.submenu:where(.svelte-13hq4tl))>.submenu-trigger:where(.svelte-13hq4tl){background:var(--accent-soft);outline:none}button.svelte-13hq4tl:disabled{color:var(--text-faint);background:0 0}.submenu-trigger.svelte-13hq4tl{justify-content:space-between;align-items:center;gap:12px;display:flex}.arrow.svelte-13hq4tl{color:var(--text-faint);font-size:16px;line-height:12px}.submenu.svelte-13hq4tl{z-index:1;background:var(--panel-raised);border:1px solid var(--border);border-radius:6px;min-width:168px;max-width:320px;padding:4px;position:absolute;top:-5px;left:calc(100% - 4px);overflow-y:auto;box-shadow:0 8px 24px #00000073}.submenu.opens-left.svelte-13hq4tl{left:auto;right:calc(100% - 4px)}.submenu.svelte-13hq4tl button:where(.svelte-13hq4tl){text-overflow:ellipsis;overflow:hidden}hr.svelte-13hq4tl{background:var(--border);border:0;height:1px;margin:4px 8px}.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}.browse-select.svelte-dr99ka{border-radius:4px;align-items:center;min-width:0;height:24px;padding:0 6px 0 0;display:inline-flex}.browse-select.svelte-dr99ka:focus-within{border-color:var(--accent)}.browse-select.filter-active.svelte-dr99ka{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}.browse-select.filter-active.svelte-dr99ka .icon-slot:where(.svelte-dr99ka){color:var(--accent)}.icon-slot.svelte-dr99ka{width:24px;height:24px;color:var(--text-dim);-webkit-user-select:none;user-select:none;flex:none;justify-content:center;align-items:center;display:flex}select.svelte-dr99ka{background:0 0;border:0;outline:none;min-width:0;height:100%;margin:0;padding:0 6px 0 0}.filter-field .popover-anchor{width:100%}.multi-select-trigger.svelte-1yxb8yh{text-align:left;border-radius:4px;align-items:center;gap:5px;width:100%;min-width:0;height:24px;padding:0 6px 0 0;display:flex}.multi-select-trigger.filter-active.svelte-1yxb8yh{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}.icon-slot.svelte-1yxb8yh{width:24px;height:24px;color:var(--text-dim);flex:none;place-items:center;display:grid}.filter-active.svelte-1yxb8yh .icon-slot:where(.svelte-1yxb8yh){color:var(--accent)}.summary.svelte-1yxb8yh{min-width:0;color:var(--text);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.filter-active.svelte-1yxb8yh .summary:where(.svelte-1yxb8yh){color:var(--accent)}.selected-count.svelte-1yxb8yh{background:var(--accent);min-width:15px;height:15px;color:var(--text);border-radius:999px;flex:none;place-items:center;padding:0 4px;font-size:9px;font-weight:700;display:grid}.multi-select-menu.svelte-1yxb8yh{width:max(160px, var(--multi-select-width,100%));min-width:160px}.menu-header.svelte-1yxb8yh{border-bottom:1px solid var(--border-soft);color:var(--text-dim);justify-content:space-between;align-items:center;gap:12px;padding:1px 4px 6px;font-size:10px;display:flex}.menu-header.svelte-1yxb8yh button:where(.svelte-1yxb8yh){color:var(--accent);font:inherit;background:0 0;border:0;padding:1px 2px}.menu-header.svelte-1yxb8yh button:where(.svelte-1yxb8yh):disabled{opacity:.4;cursor:default}.options.svelte-1yxb8yh{max-height:224px;padding-top:4px;overflow-y:auto}.options.svelte-1yxb8yh label:where(.svelte-1yxb8yh){border-radius:var(--radius-small);min-width:0;height:26px;color:var(--text);cursor:pointer;align-items:center;gap:7px;padding:0 5px;display:flex}.options.svelte-1yxb8yh label:where(.svelte-1yxb8yh):hover,.options.svelte-1yxb8yh label:where(.svelte-1yxb8yh):focus-within{background:var(--accent-soft)}.options.svelte-1yxb8yh label.selected:where(.svelte-1yxb8yh){color:var(--accent)}.options.svelte-1yxb8yh input:where(.svelte-1yxb8yh){width:12px;height:12px;accent-color:var(--accent);flex:none;margin:0}.options.svelte-1yxb8yh span:where(.svelte-1yxb8yh){text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.browse-checkbox.svelte-sa6meb{cursor:pointer;align-items:center;min-width:0;height:24px;display:inline-flex}.browse-checkbox.svelte-sa6meb:focus-within .value:where(.svelte-sa6meb){color:var(--accent)}.icon-slot.svelte-sa6meb{-webkit-user-select:none;user-select:none;flex:none;justify-content:center;align-items:center;width:24px;height:24px;display:flex}.value.svelte-sa6meb{min-width:0;color:var(--text);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:11px;line-height:14px;overflow:hidden}input.svelte-sa6meb{width:12px;height:12px;accent-color:var(--accent);margin: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}.library-toolbar.svelte-1uha8ag{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:16px;display:flex}.library-toolbar.svelte-1uha8ag .control{border-radius:var(--radius-small);height:24px}.selection-controls.svelte-1uha8ag{align-items:center;gap:8px;display:inline-flex}.selection-action.svelte-1uha8ag:disabled{opacity:.45;cursor:default}.selection-action.svelte-1uha8ag{justify-content:center;align-items:center;display:inline-flex}.selection-summary.svelte-1uha8ag{color:var(--accent);white-space:nowrap;font-weight:600}.preview-size-control.svelte-1uha8ag{height:24px;color:var(--text-dim);cursor:default;align-items:center;gap:6px;margin-left:auto;padding:0 7px;display:inline-flex}.preview-size-icon.svelte-1uha8ag{fill:currentColor;flex:none;width:14px;height:14px}.preview-size-icon.dense.svelte-1uha8ag{color:var(--text-faint)}.preview-size-icon.dense.svelte-1uha8ag rect:where(.svelte-1uha8ag){rx:.75px;width:3px;height:3px}.preview-size-icon.roomy.svelte-1uha8ag rect:where(.svelte-1uha8ag){rx:1.25px}.preview-size-range.svelte-1uha8ag{appearance:none;cursor:pointer;background:0 0;flex:none;width:104px;height:14px;margin:0;padding:0}.preview-size-range.svelte-1uha8ag::-webkit-slider-runnable-track{background:linear-gradient(to right, var(--accent) 0 var(--preview-size-progress), var(--border) var(--preview-size-progress) 100%);border-radius:999px;height:3px}.preview-size-range.svelte-1uha8ag::-moz-range-track{background:var(--border);border-radius:999px;height:3px}.preview-size-range.svelte-1uha8ag::-moz-range-progress{background:var(--accent);border-radius:999px;height:3px}.preview-size-range.svelte-1uha8ag::-webkit-slider-thumb{border:2px solid var(--panel-raised);appearance:none;background:var(--accent);width:12px;height:12px;box-shadow:0 0 0 1px var(--accent);border-radius:50%;margin-top:-4.5px}.preview-size-range.svelte-1uha8ag::-moz-range-thumb{border:2px solid var(--panel-raised);background:var(--accent);width:8px;height:8px;box-shadow:0 0 0 1px var(--accent);border-radius:50%}.preview-size-range.svelte-1uha8ag:focus-visible{outline:none}.preview-size-range.svelte-1uha8ag:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 1px var(--accent), 0 0 0 4px var(--accent-soft)}.preview-size-range.svelte-1uha8ag:focus-visible::-moz-range-thumb{box-shadow:0 0 0 1px var(--accent), 0 0 0 4px var(--accent-soft)}.search.svelte-1uha8ag{flex:0 0 240px;align-items:center;gap:4px;width:240px;min-width:200px;height:24px;padding:0 6px 0 0;display:flex}.search.svelte-1uha8ag:focus-within{border-color:var(--accent)}.search.filter-active.svelte-1uha8ag{border-color:var(--accent);background:var(--accent-soft)}.search.filter-active.svelte-1uha8ag .search-icon-slot:where(.svelte-1uha8ag),.search.filter-active.svelte-1uha8ag kbd:where(.svelte-1uha8ag){color:var(--accent)}.search.filter-active.svelte-1uha8ag kbd:where(.svelte-1uha8ag){border-color:var(--accent)}.search-icon-slot.svelte-1uha8ag{width:24px;height:24px;color:var(--text-dim);flex:none;justify-content:center;align-items:center;display:flex}.search-icon.svelte-1uha8ag{fill:none;stroke:currentColor;stroke-width:1.5px;stroke-linecap:round;flex:none;width:14px;height:14px}.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-input.svelte-1uha8ag::-webkit-search-cancel-button{appearance:none;background:var(--text-dim);cursor:pointer;width:12px;height:12px;margin:0;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath d='m3 3 8 8m0-8-8 8' fill='none' stroke='black' stroke-linecap='round' stroke-width='2.25'/%3E%3C/svg%3E") 50%/12px 12px no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath d='m3 3 8 8m0-8-8 8' fill='none' stroke='black' stroke-linecap='round' stroke-width='2.25'/%3E%3C/svg%3E") 50%/12px 12px no-repeat}.search.filter-active.svelte-1uha8ag .search-input:where(.svelte-1uha8ag)::-webkit-search-cancel-button{background:var(--accent)}.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}.toolbar-button.svelte-1uha8ag,.import-trigger.svelte-1uha8ag{white-space:nowrap;justify-content:center;align-items:center;gap:6px;display:inline-flex}.toolbar-button.active.svelte-1uha8ag{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}.filter-count.svelte-1uha8ag{background:var(--accent);min-width:16px;height:16px;color:var(--text);border-radius:999px;place-items:center;padding:0 4px;font-size:10px;font-weight:700;display:inline-grid}.filters-popover.svelte-1uha8ag{width:min(480px,100vw - 24px)}.popover-header.svelte-1uha8ag{border-bottom:1px solid var(--border-soft);justify-content:space-between;align-items:center;gap:16px;padding:2px 2px 10px;display:flex}.popover-header.svelte-1uha8ag strong:where(.svelte-1uha8ag){color:var(--text);font-size:11px;font-weight:400}.clear-filters.svelte-1uha8ag{color:var(--accent);font:inherit;background:0 0;border:0;padding:2px 4px;font-size:11px}.clear-filters.svelte-1uha8ag:disabled{opacity:.4;cursor:default}.filter-grid.svelte-1uha8ag{grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;padding:10px 2px;display:grid}.filter-field.svelte-1uha8ag{flex-direction:column;gap:4px;min-width:0;display:flex}.filter-field.svelte-1uha8ag>span:where(.svelte-1uha8ag){color:#ffffffb2;letter-spacing:.27px;-webkit-user-select:none;user-select:none;font-size:9px;font-weight:500;line-height:14px}.filter-field.svelte-1uha8ag .browse-select,.filter-field.svelte-1uha8ag .browse-checkbox{width:100%}.filter-field.svelte-1uha8ag .browse-select select{flex:1;width:100%}.filter-options-grid.svelte-1uha8ag{padding-top:0;padding-bottom:2px}.filter-options-grid.svelte-1uha8ag .browse-checkbox,.filter-options-grid.svelte-1uha8ag .browse-checkbox .icon-slot{height:14px}.filter-options-grid.svelte-1uha8ag .browse-checkbox .icon-slot{justify-content:flex-start;align-items:flex-start;width:18px}@media (width<=560px){.filter-grid.svelte-1uha8ag{grid-template-columns:1fr}}@media (width<=1056px){.search.svelte-1uha8ag{flex-basis:100%;order:10;width:100%}}.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{gap:8px;display:grid}.grid.svelte-1uha8ag{grid-template-columns:repeat(auto-fill, minmax(min(100%, var(--preview-card-width)), 1fr))}.folder-grid.svelte-1uha8ag{grid-template-columns:repeat(auto-fill,minmax(160px,1fr))}.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:clamp(4px,5cqi,8px);padding:clamp(4px,5cqi,8px);display:flex;position:relative;container-type:inline-size}.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:clamp(6px,8cqi,12px);left:clamp(6px,8cqi,12px)}.card.svelte-1uha8ag:hover{border-color:var(--accent)}.thumbnail.svelte-1uha8ag{width:100%;height:min(var(--preview-card-height), 66.667cqi);border-radius:var(--radius);justify-content:center;align-items:center;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)}@container (width<=109px){.type-badge.svelte-1uha8ag{display:none}.badges.svelte-1uha8ag{flex-wrap:nowrap;overflow:hidden}}@container (width<=79px){.card.svelte-1uha8ag>.overlay{background:var(--accent);border:0;width:6px;height:6px;padding:0;font-size:0;top:5px;left:auto;right:5px;transform:none}.card.svelte-1uha8ag>.overlay.edited{background:var(--warning)}.asset-select.svelte-1uha8ag{width:8px;height:8px;top:0;left:0;transform:translate(-8%,8%)}.meta.svelte-1uha8ag,.badges.svelte-1uha8ag{display:none}}.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}
@@ -1 +0,0 @@
1
- import{A as e,J as t,M as n,U as r,a as i,ct as a,d as o,k as s,v as c}from"./YpiA5Xry.js";import"./xihTtKlq.js";var l=n(`<span> </span>`);function u(n,u){let d=i(u,`overlay`,3,!1);var f=l();let p;var m=t(f,!0);a(f),r(()=>{o(f,`title`,u.title),p=c(f,1,`svelte-d2mzbr`,null,p,{edited:u.kind===`edited`,overlay:d()}),s(m,u.kind===`new`?`New`:`Edited`)}),e(n,f)}export{u as t};