gazetta 0.5.0 → 0.7.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 (478) hide show
  1. package/admin-dist/assets/index-BO9-CXmW.css +1 -0
  2. package/admin-dist/assets/index-Ufu8zZH_.js +668 -0
  3. package/admin-dist/assets/{vendor-primevue-BnR1c_bQ.js → vendor-primevue-C0Q_YTCb.js} +330 -431
  4. package/admin-dist/assets/vendor-vue-D3wBSmDf.js +1 -0
  5. package/admin-dist/index.html +4 -4
  6. package/dist/admin-api/error-response.d.ts +21 -0
  7. package/dist/admin-api/error-response.d.ts.map +1 -0
  8. package/dist/admin-api/error-response.js +12 -0
  9. package/dist/admin-api/error-response.js.map +1 -0
  10. package/dist/admin-api/index.d.ts +19 -6
  11. package/dist/admin-api/index.d.ts.map +1 -1
  12. package/dist/admin-api/index.js +137 -21
  13. package/dist/admin-api/index.js.map +1 -1
  14. package/dist/admin-api/routes/assets.d.ts +16 -0
  15. package/dist/admin-api/routes/assets.d.ts.map +1 -0
  16. package/dist/admin-api/routes/assets.js +433 -0
  17. package/dist/admin-api/routes/assets.js.map +1 -0
  18. package/dist/admin-api/routes/compare.d.ts +2 -1
  19. package/dist/admin-api/routes/compare.d.ts.map +1 -1
  20. package/dist/admin-api/routes/compare.js +33 -24
  21. package/dist/admin-api/routes/compare.js.map +1 -1
  22. package/dist/admin-api/routes/fields.d.ts +2 -2
  23. package/dist/admin-api/routes/fields.d.ts.map +1 -1
  24. package/dist/admin-api/routes/fields.js +10 -3
  25. package/dist/admin-api/routes/fields.js.map +1 -1
  26. package/dist/admin-api/routes/fragments.d.ts +2 -3
  27. package/dist/admin-api/routes/fragments.d.ts.map +1 -1
  28. package/dist/admin-api/routes/fragments.js +120 -21
  29. package/dist/admin-api/routes/fragments.js.map +1 -1
  30. package/dist/admin-api/routes/history.d.ts +23 -0
  31. package/dist/admin-api/routes/history.d.ts.map +1 -0
  32. package/dist/admin-api/routes/history.js +143 -0
  33. package/dist/admin-api/routes/history.js.map +1 -0
  34. package/dist/admin-api/routes/pages.d.ts +2 -3
  35. package/dist/admin-api/routes/pages.d.ts.map +1 -1
  36. package/dist/admin-api/routes/pages.js +153 -22
  37. package/dist/admin-api/routes/pages.js.map +1 -1
  38. package/dist/admin-api/routes/preview.d.ts +2 -2
  39. package/dist/admin-api/routes/preview.d.ts.map +1 -1
  40. package/dist/admin-api/routes/preview.js +50 -15
  41. package/dist/admin-api/routes/preview.js.map +1 -1
  42. package/dist/admin-api/routes/publish.d.ts +2 -1
  43. package/dist/admin-api/routes/publish.d.ts.map +1 -1
  44. package/dist/admin-api/routes/publish.js +259 -79
  45. package/dist/admin-api/routes/publish.js.map +1 -1
  46. package/dist/admin-api/routes/site.d.ts +2 -2
  47. package/dist/admin-api/routes/site.d.ts.map +1 -1
  48. package/dist/admin-api/routes/site.js +27 -4
  49. package/dist/admin-api/routes/site.js.map +1 -1
  50. package/dist/admin-api/routes/templates.d.ts +2 -2
  51. package/dist/admin-api/routes/templates.d.ts.map +1 -1
  52. package/dist/admin-api/routes/templates.js +19 -9
  53. package/dist/admin-api/routes/templates.js.map +1 -1
  54. package/dist/admin-api/schemas/assets.d.ts +48 -0
  55. package/dist/admin-api/schemas/assets.d.ts.map +1 -0
  56. package/dist/admin-api/schemas/assets.js +44 -0
  57. package/dist/admin-api/schemas/assets.js.map +1 -0
  58. package/dist/admin-api/schemas/compare.d.ts +29 -0
  59. package/dist/admin-api/schemas/compare.d.ts.map +1 -0
  60. package/dist/admin-api/schemas/compare.js +30 -0
  61. package/dist/admin-api/schemas/compare.js.map +1 -0
  62. package/dist/admin-api/schemas/dependents.d.ts +15 -0
  63. package/dist/admin-api/schemas/dependents.d.ts.map +1 -0
  64. package/dist/admin-api/schemas/dependents.js +14 -0
  65. package/dist/admin-api/schemas/dependents.js.map +1 -0
  66. package/dist/admin-api/schemas/fetch.d.ts +12 -0
  67. package/dist/admin-api/schemas/fetch.d.ts.map +1 -0
  68. package/dist/admin-api/schemas/fetch.js +11 -0
  69. package/dist/admin-api/schemas/fetch.js.map +1 -0
  70. package/dist/admin-api/schemas/fields.d.ts +11 -0
  71. package/dist/admin-api/schemas/fields.d.ts.map +1 -0
  72. package/dist/admin-api/schemas/fields.js +11 -0
  73. package/dist/admin-api/schemas/fields.js.map +1 -0
  74. package/dist/admin-api/schemas/fragments.d.ts +27 -0
  75. package/dist/admin-api/schemas/fragments.d.ts.map +1 -0
  76. package/dist/admin-api/schemas/fragments.js +26 -0
  77. package/dist/admin-api/schemas/fragments.js.map +1 -0
  78. package/dist/admin-api/schemas/history.d.ts +73 -0
  79. package/dist/admin-api/schemas/history.d.ts.map +1 -0
  80. package/dist/admin-api/schemas/history.js +35 -0
  81. package/dist/admin-api/schemas/history.js.map +1 -0
  82. package/dist/admin-api/schemas/index.d.ts +34 -0
  83. package/dist/admin-api/schemas/index.d.ts.map +1 -0
  84. package/dist/admin-api/schemas/index.js +34 -0
  85. package/dist/admin-api/schemas/index.js.map +1 -0
  86. package/dist/admin-api/schemas/pages.d.ts +46 -0
  87. package/dist/admin-api/schemas/pages.d.ts.map +1 -0
  88. package/dist/admin-api/schemas/pages.js +47 -0
  89. package/dist/admin-api/schemas/pages.js.map +1 -0
  90. package/dist/admin-api/schemas/publish.d.ts +67 -0
  91. package/dist/admin-api/schemas/publish.d.ts.map +1 -0
  92. package/dist/admin-api/schemas/publish.js +60 -0
  93. package/dist/admin-api/schemas/publish.js.map +1 -0
  94. package/dist/admin-api/schemas/site.d.ts +28 -0
  95. package/dist/admin-api/schemas/site.d.ts.map +1 -0
  96. package/dist/admin-api/schemas/site.js +24 -0
  97. package/dist/admin-api/schemas/site.js.map +1 -0
  98. package/dist/admin-api/schemas/targets.d.ts +36 -0
  99. package/dist/admin-api/schemas/targets.d.ts.map +1 -0
  100. package/dist/admin-api/schemas/targets.js +19 -0
  101. package/dist/admin-api/schemas/targets.js.map +1 -0
  102. package/dist/admin-api/schemas/templates.d.ts +17 -0
  103. package/dist/admin-api/schemas/templates.d.ts.map +1 -0
  104. package/dist/admin-api/schemas/templates.js +16 -0
  105. package/dist/admin-api/schemas/templates.js.map +1 -0
  106. package/dist/admin-api/source-context.d.ts +158 -0
  107. package/dist/admin-api/source-context.d.ts.map +1 -0
  108. package/dist/admin-api/source-context.js +92 -0
  109. package/dist/admin-api/source-context.js.map +1 -0
  110. package/dist/app.js +1 -1
  111. package/dist/app.js.map +1 -1
  112. package/dist/assemble.d.ts.map +1 -1
  113. package/dist/assemble.js +4 -1
  114. package/dist/assemble.js.map +1 -1
  115. package/dist/assets/analyze-audio.d.ts +3 -0
  116. package/dist/assets/analyze-audio.d.ts.map +1 -0
  117. package/dist/assets/analyze-audio.js +80 -0
  118. package/dist/assets/analyze-audio.js.map +1 -0
  119. package/dist/assets/analyze-image.d.ts +19 -0
  120. package/dist/assets/analyze-image.d.ts.map +1 -0
  121. package/dist/assets/analyze-image.js +123 -0
  122. package/dist/assets/analyze-image.js.map +1 -0
  123. package/dist/assets/analyze.d.ts +94 -0
  124. package/dist/assets/analyze.d.ts.map +1 -0
  125. package/dist/assets/analyze.js +45 -0
  126. package/dist/assets/analyze.js.map +1 -0
  127. package/dist/assets/asset-deps.d.ts +30 -0
  128. package/dist/assets/asset-deps.d.ts.map +1 -0
  129. package/dist/assets/asset-deps.js +42 -0
  130. package/dist/assets/asset-deps.js.map +1 -0
  131. package/dist/assets/asset-paths.d.ts +155 -0
  132. package/dist/assets/asset-paths.d.ts.map +1 -0
  133. package/dist/assets/asset-paths.js +197 -0
  134. package/dist/assets/asset-paths.js.map +1 -0
  135. package/dist/assets/delete.d.ts +75 -0
  136. package/dist/assets/delete.d.ts.map +1 -0
  137. package/dist/assets/delete.js +82 -0
  138. package/dist/assets/delete.js.map +1 -0
  139. package/dist/assets/errors.d.ts +241 -0
  140. package/dist/assets/errors.d.ts.map +1 -0
  141. package/dist/assets/errors.js +300 -0
  142. package/dist/assets/errors.js.map +1 -0
  143. package/dist/assets/find-refs.d.ts +37 -0
  144. package/dist/assets/find-refs.d.ts.map +1 -0
  145. package/dist/assets/find-refs.js +35 -0
  146. package/dist/assets/find-refs.js.map +1 -0
  147. package/dist/assets/hash.d.ts +13 -0
  148. package/dist/assets/hash.d.ts.map +1 -0
  149. package/dist/assets/hash.js +43 -0
  150. package/dist/assets/hash.js.map +1 -0
  151. package/dist/assets/image-metadata.d.ts +11 -0
  152. package/dist/assets/image-metadata.d.ts.map +1 -0
  153. package/dist/assets/image-metadata.js +31 -0
  154. package/dist/assets/image-metadata.js.map +1 -0
  155. package/dist/assets/ingest-locale.d.ts +86 -0
  156. package/dist/assets/ingest-locale.d.ts.map +1 -0
  157. package/dist/assets/ingest-locale.js +209 -0
  158. package/dist/assets/ingest-locale.js.map +1 -0
  159. package/dist/assets/ingest.d.ts +96 -0
  160. package/dist/assets/ingest.d.ts.map +1 -0
  161. package/dist/assets/ingest.js +308 -0
  162. package/dist/assets/ingest.js.map +1 -0
  163. package/dist/assets/kind-compat.d.ts +34 -0
  164. package/dist/assets/kind-compat.d.ts.map +1 -0
  165. package/dist/assets/kind-compat.js +33 -0
  166. package/dist/assets/kind-compat.js.map +1 -0
  167. package/dist/assets/list.d.ts +46 -0
  168. package/dist/assets/list.d.ts.map +1 -0
  169. package/dist/assets/list.js +102 -0
  170. package/dist/assets/list.js.map +1 -0
  171. package/dist/assets/manifest-default.d.ts +56 -0
  172. package/dist/assets/manifest-default.d.ts.map +1 -0
  173. package/dist/assets/manifest-default.js +120 -0
  174. package/dist/assets/manifest-default.js.map +1 -0
  175. package/dist/assets/manifest-filename.d.ts +52 -0
  176. package/dist/assets/manifest-filename.d.ts.map +1 -0
  177. package/dist/assets/manifest-filename.js +104 -0
  178. package/dist/assets/manifest-filename.js.map +1 -0
  179. package/dist/assets/manifest-locale.d.ts +60 -0
  180. package/dist/assets/manifest-locale.d.ts.map +1 -0
  181. package/dist/assets/manifest-locale.js +206 -0
  182. package/dist/assets/manifest-locale.js.map +1 -0
  183. package/dist/assets/manifest-merge.d.ts +66 -0
  184. package/dist/assets/manifest-merge.d.ts.map +1 -0
  185. package/dist/assets/manifest-merge.js +82 -0
  186. package/dist/assets/manifest-merge.js.map +1 -0
  187. package/dist/assets/manifest.d.ts +83 -0
  188. package/dist/assets/manifest.d.ts.map +1 -0
  189. package/dist/assets/manifest.js +93 -0
  190. package/dist/assets/manifest.js.map +1 -0
  191. package/dist/assets/mime-sniff.d.ts +18 -0
  192. package/dist/assets/mime-sniff.d.ts.map +1 -0
  193. package/dist/assets/mime-sniff.js +84 -0
  194. package/dist/assets/mime-sniff.js.map +1 -0
  195. package/dist/assets/preprocess-svg.d.ts +3 -0
  196. package/dist/assets/preprocess-svg.d.ts.map +1 -0
  197. package/dist/assets/preprocess-svg.js +49 -0
  198. package/dist/assets/preprocess-svg.js.map +1 -0
  199. package/dist/assets/preprocess.d.ts +62 -0
  200. package/dist/assets/preprocess.d.ts.map +1 -0
  201. package/dist/assets/preprocess.js +86 -0
  202. package/dist/assets/preprocess.js.map +1 -0
  203. package/dist/assets/publish-plan.d.ts +41 -0
  204. package/dist/assets/publish-plan.d.ts.map +1 -0
  205. package/dist/assets/publish-plan.js +49 -0
  206. package/dist/assets/publish-plan.js.map +1 -0
  207. package/dist/assets/publish.d.ts +33 -0
  208. package/dist/assets/publish.d.ts.map +1 -0
  209. package/dist/assets/publish.js +81 -0
  210. package/dist/assets/publish.js.map +1 -0
  211. package/dist/assets/refs.d.ts +37 -0
  212. package/dist/assets/refs.d.ts.map +1 -0
  213. package/dist/assets/refs.js +33 -0
  214. package/dist/assets/refs.js.map +1 -0
  215. package/dist/assets/remove-override.d.ts +42 -0
  216. package/dist/assets/remove-override.d.ts.map +1 -0
  217. package/dist/assets/remove-override.js +53 -0
  218. package/dist/assets/remove-override.js.map +1 -0
  219. package/dist/assets/rename.d.ts +43 -0
  220. package/dist/assets/rename.d.ts.map +1 -0
  221. package/dist/assets/rename.js +271 -0
  222. package/dist/assets/rename.js.map +1 -0
  223. package/dist/assets/replace.d.ts +37 -0
  224. package/dist/assets/replace.d.ts.map +1 -0
  225. package/dist/assets/replace.js +195 -0
  226. package/dist/assets/replace.js.map +1 -0
  227. package/dist/assets/resolve.d.ts +141 -0
  228. package/dist/assets/resolve.d.ts.map +1 -0
  229. package/dist/assets/resolve.js +381 -0
  230. package/dist/assets/resolve.js.map +1 -0
  231. package/dist/assets/rewrite-manifest-asset-ref.d.ts +44 -0
  232. package/dist/assets/rewrite-manifest-asset-ref.d.ts.map +1 -0
  233. package/dist/assets/rewrite-manifest-asset-ref.js +51 -0
  234. package/dist/assets/rewrite-manifest-asset-ref.js.map +1 -0
  235. package/dist/assets/scan-manifest-for-asset.d.ts +63 -0
  236. package/dist/assets/scan-manifest-for-asset.d.ts.map +1 -0
  237. package/dist/assets/scan-manifest-for-asset.js +105 -0
  238. package/dist/assets/scan-manifest-for-asset.js.map +1 -0
  239. package/dist/assets/serve-route.d.ts +45 -0
  240. package/dist/assets/serve-route.d.ts.map +1 -0
  241. package/dist/assets/serve-route.js +123 -0
  242. package/dist/assets/serve-route.js.map +1 -0
  243. package/dist/assets/svg-sanitize.d.ts +38 -0
  244. package/dist/assets/svg-sanitize.d.ts.map +1 -0
  245. package/dist/assets/svg-sanitize.js +209 -0
  246. package/dist/assets/svg-sanitize.js.map +1 -0
  247. package/dist/assets/update-metadata.d.ts +61 -0
  248. package/dist/assets/update-metadata.d.ts.map +1 -0
  249. package/dist/assets/update-metadata.js +82 -0
  250. package/dist/assets/update-metadata.js.map +1 -0
  251. package/dist/assets/url.d.ts +82 -0
  252. package/dist/assets/url.d.ts.map +1 -0
  253. package/dist/assets/url.js +103 -0
  254. package/dist/assets/url.js.map +1 -0
  255. package/dist/assets/validate.d.ts +74 -0
  256. package/dist/assets/validate.d.ts.map +1 -0
  257. package/dist/assets/validate.js +136 -0
  258. package/dist/assets/validate.js.map +1 -0
  259. package/dist/assets/variants.d.ts +23 -0
  260. package/dist/assets/variants.d.ts.map +1 -0
  261. package/dist/assets/variants.js +74 -0
  262. package/dist/assets/variants.js.map +1 -0
  263. package/dist/cli/assets-cli.d.ts +58 -0
  264. package/dist/cli/assets-cli.d.ts.map +1 -0
  265. package/dist/cli/assets-cli.js +233 -0
  266. package/dist/cli/assets-cli.js.map +1 -0
  267. package/dist/cli/assets-display.d.ts +112 -0
  268. package/dist/cli/assets-display.d.ts.map +1 -0
  269. package/dist/cli/assets-display.js +106 -0
  270. package/dist/cli/assets-display.js.map +1 -0
  271. package/dist/cli/bootstrap.d.ts +46 -0
  272. package/dist/cli/bootstrap.d.ts.map +1 -0
  273. package/dist/cli/bootstrap.js +84 -0
  274. package/dist/cli/bootstrap.js.map +1 -0
  275. package/dist/cli/history.d.ts +45 -0
  276. package/dist/cli/history.d.ts.map +1 -0
  277. package/dist/cli/history.js +165 -0
  278. package/dist/cli/history.js.map +1 -0
  279. package/dist/cli/index.js +689 -128
  280. package/dist/cli/index.js.map +1 -1
  281. package/dist/compare.d.ts +8 -5
  282. package/dist/compare.d.ts.map +1 -1
  283. package/dist/compare.js +62 -20
  284. package/dist/compare.js.map +1 -1
  285. package/dist/content-root.d.ts +38 -0
  286. package/dist/content-root.d.ts.map +1 -0
  287. package/dist/content-root.js +29 -0
  288. package/dist/content-root.js.map +1 -0
  289. package/dist/dep-sidecars.d.ts +127 -0
  290. package/dist/dep-sidecars.d.ts.map +1 -0
  291. package/dist/dep-sidecars.js +122 -0
  292. package/dist/dep-sidecars.js.map +1 -0
  293. package/dist/editor/AssetEmbeddedWidget.d.ts +3 -0
  294. package/dist/editor/AssetEmbeddedWidget.d.ts.map +1 -0
  295. package/dist/editor/AssetEmbeddedWidget.js +146 -0
  296. package/dist/editor/AssetEmbeddedWidget.js.map +1 -0
  297. package/dist/editor/mount.d.ts +12 -1
  298. package/dist/editor/mount.d.ts.map +1 -1
  299. package/dist/editor/mount.js +96 -33
  300. package/dist/editor/mount.js.map +1 -1
  301. package/dist/format.d.ts +44 -0
  302. package/dist/format.d.ts.map +1 -0
  303. package/dist/format.js +65 -0
  304. package/dist/format.js.map +1 -0
  305. package/dist/fragment-deps.d.ts +24 -0
  306. package/dist/fragment-deps.d.ts.map +1 -0
  307. package/dist/fragment-deps.js +20 -0
  308. package/dist/fragment-deps.js.map +1 -0
  309. package/dist/hash.d.ts +34 -9
  310. package/dist/hash.d.ts.map +1 -1
  311. package/dist/hash.js +60 -21
  312. package/dist/hash.js.map +1 -1
  313. package/dist/history-provider.d.ts +49 -0
  314. package/dist/history-provider.d.ts.map +1 -0
  315. package/dist/history-provider.js +248 -0
  316. package/dist/history-provider.js.map +1 -0
  317. package/dist/history-recorder.d.ts +102 -0
  318. package/dist/history-recorder.d.ts.map +1 -0
  319. package/dist/history-recorder.js +168 -0
  320. package/dist/history-recorder.js.map +1 -0
  321. package/dist/history-restorer.d.ts +46 -0
  322. package/dist/history-restorer.d.ts.map +1 -0
  323. package/dist/history-restorer.js +137 -0
  324. package/dist/history-restorer.js.map +1 -0
  325. package/dist/history.d.ts +129 -0
  326. package/dist/history.d.ts.map +1 -0
  327. package/dist/history.js +25 -0
  328. package/dist/history.js.map +1 -0
  329. package/dist/index.d.ts +27 -7
  330. package/dist/index.d.ts.map +1 -1
  331. package/dist/index.js +16 -4
  332. package/dist/index.js.map +1 -1
  333. package/dist/locale.d.ts +94 -0
  334. package/dist/locale.d.ts.map +1 -0
  335. package/dist/locale.js +188 -0
  336. package/dist/locale.js.map +1 -0
  337. package/dist/manifest.d.ts.map +1 -1
  338. package/dist/manifest.js +16 -1
  339. package/dist/manifest.js.map +1 -1
  340. package/dist/providers/_atomic-write.d.ts +9 -0
  341. package/dist/providers/_atomic-write.d.ts.map +1 -0
  342. package/dist/providers/_atomic-write.js +72 -0
  343. package/dist/providers/_atomic-write.js.map +1 -0
  344. package/dist/providers/_rm-ignore-missing.d.ts +31 -0
  345. package/dist/providers/_rm-ignore-missing.d.ts.map +1 -0
  346. package/dist/providers/_rm-ignore-missing.js +12 -0
  347. package/dist/providers/_rm-ignore-missing.js.map +1 -0
  348. package/dist/providers/_stream-interop.d.ts +23 -0
  349. package/dist/providers/_stream-interop.d.ts.map +1 -0
  350. package/dist/providers/_stream-interop.js +21 -0
  351. package/dist/providers/_stream-interop.js.map +1 -0
  352. package/dist/providers/azure-blob.d.ts.map +1 -1
  353. package/dist/providers/azure-blob.js +60 -0
  354. package/dist/providers/azure-blob.js.map +1 -1
  355. package/dist/providers/filesystem.d.ts +4 -0
  356. package/dist/providers/filesystem.d.ts.map +1 -1
  357. package/dist/providers/filesystem.js +63 -2
  358. package/dist/providers/filesystem.js.map +1 -1
  359. package/dist/providers/s3.d.ts.map +1 -1
  360. package/dist/providers/s3.js +107 -16
  361. package/dist/providers/s3.js.map +1 -1
  362. package/dist/publish-locale.d.ts +44 -0
  363. package/dist/publish-locale.d.ts.map +1 -0
  364. package/dist/publish-locale.js +103 -0
  365. package/dist/publish-locale.js.map +1 -0
  366. package/dist/publish-rendered.d.ts +52 -21
  367. package/dist/publish-rendered.d.ts.map +1 -1
  368. package/dist/publish-rendered.js +144 -87
  369. package/dist/publish-rendered.js.map +1 -1
  370. package/dist/publish.d.ts +18 -19
  371. package/dist/publish.d.ts.map +1 -1
  372. package/dist/publish.js +41 -56
  373. package/dist/publish.js.map +1 -1
  374. package/dist/renderer.d.ts +14 -4
  375. package/dist/renderer.d.ts.map +1 -1
  376. package/dist/renderer.js +35 -23
  377. package/dist/renderer.js.map +1 -1
  378. package/dist/resolver.d.ts +17 -2
  379. package/dist/resolver.d.ts.map +1 -1
  380. package/dist/resolver.js +112 -16
  381. package/dist/resolver.js.map +1 -1
  382. package/dist/robots.d.ts +22 -0
  383. package/dist/robots.d.ts.map +1 -0
  384. package/dist/robots.js +25 -0
  385. package/dist/robots.js.map +1 -0
  386. package/dist/schema/dimensions.d.ts +78 -0
  387. package/dist/schema/dimensions.d.ts.map +1 -0
  388. package/dist/schema/dimensions.js +97 -0
  389. package/dist/schema/dimensions.js.map +1 -0
  390. package/dist/schema/helpers.d.ts +108 -0
  391. package/dist/schema/helpers.d.ts.map +1 -0
  392. package/dist/schema/helpers.js +133 -0
  393. package/dist/schema/helpers.js.map +1 -0
  394. package/dist/schema/index.d.ts +27 -0
  395. package/dist/schema/index.d.ts.map +1 -0
  396. package/dist/schema/index.js +25 -0
  397. package/dist/schema/index.js.map +1 -0
  398. package/dist/schema/types.d.ts +390 -0
  399. package/dist/schema/types.d.ts.map +1 -0
  400. package/dist/schema/types.js +25 -0
  401. package/dist/schema/types.js.map +1 -0
  402. package/dist/selector-chain.d.ts +63 -0
  403. package/dist/selector-chain.d.ts.map +1 -0
  404. package/dist/selector-chain.js +58 -0
  405. package/dist/selector-chain.js.map +1 -0
  406. package/dist/seo.d.ts +56 -0
  407. package/dist/seo.d.ts.map +1 -0
  408. package/dist/seo.js +72 -0
  409. package/dist/seo.js.map +1 -0
  410. package/dist/serve.d.ts +41 -3
  411. package/dist/serve.d.ts.map +1 -1
  412. package/dist/serve.js +206 -65
  413. package/dist/serve.js.map +1 -1
  414. package/dist/sidecars.d.ts +26 -21
  415. package/dist/sidecars.d.ts.map +1 -1
  416. package/dist/sidecars.js +143 -45
  417. package/dist/sidecars.js.map +1 -1
  418. package/dist/site-loader.d.ts +74 -6
  419. package/dist/site-loader.d.ts.map +1 -1
  420. package/dist/site-loader.js +138 -28
  421. package/dist/site-loader.js.map +1 -1
  422. package/dist/sitemap.d.ts +45 -0
  423. package/dist/sitemap.d.ts.map +1 -0
  424. package/dist/sitemap.js +67 -0
  425. package/dist/sitemap.js.map +1 -0
  426. package/dist/targets.d.ts +47 -1
  427. package/dist/targets.d.ts.map +1 -1
  428. package/dist/targets.js +83 -36
  429. package/dist/targets.js.map +1 -1
  430. package/dist/template-loader.d.ts +7 -3
  431. package/dist/template-loader.d.ts.map +1 -1
  432. package/dist/template-loader.js +27 -12
  433. package/dist/template-loader.js.map +1 -1
  434. package/dist/templates-scan-worker.js +1 -1
  435. package/dist/templates-scan-worker.js.map +1 -1
  436. package/dist/templates-scan.d.ts.map +1 -1
  437. package/dist/templates-scan.js +1 -1
  438. package/dist/templates-scan.js.map +1 -1
  439. package/dist/themes.d.ts +69 -0
  440. package/dist/themes.d.ts.map +1 -0
  441. package/dist/themes.js +85 -0
  442. package/dist/themes.js.map +1 -0
  443. package/dist/transforms/adapter.d.ts +115 -0
  444. package/dist/transforms/adapter.d.ts.map +1 -0
  445. package/dist/transforms/adapter.js +2 -0
  446. package/dist/transforms/adapter.js.map +1 -0
  447. package/dist/transforms/cloudflare.d.ts +17 -0
  448. package/dist/transforms/cloudflare.d.ts.map +1 -0
  449. package/dist/transforms/cloudflare.js +110 -0
  450. package/dist/transforms/cloudflare.js.map +1 -0
  451. package/dist/transforms/index.d.ts +24 -0
  452. package/dist/transforms/index.d.ts.map +1 -0
  453. package/dist/transforms/index.js +30 -0
  454. package/dist/transforms/index.js.map +1 -0
  455. package/dist/transforms/sharp.d.ts +3 -0
  456. package/dist/transforms/sharp.d.ts.map +1 -0
  457. package/dist/transforms/sharp.js +43 -0
  458. package/dist/transforms/sharp.js.map +1 -0
  459. package/dist/types.d.ts +241 -10
  460. package/dist/types.d.ts.map +1 -1
  461. package/dist/types.js +28 -5
  462. package/dist/types.js.map +1 -1
  463. package/dist/workers/cloudflare-r2.d.ts +11 -2
  464. package/dist/workers/cloudflare-r2.d.ts.map +1 -1
  465. package/dist/workers/cloudflare-r2.js +120 -55
  466. package/dist/workers/cloudflare-r2.js.map +1 -1
  467. package/package.json +30 -2
  468. package/admin-dist/assets/index-BZAFKsUp.js +0 -608
  469. package/admin-dist/assets/index-BpRotMuK.css +0 -1
  470. package/admin-dist/assets/vendor-vue-DSjyxCX6.js +0 -1
  471. package/dist/providers/r2.d.ts +0 -8
  472. package/dist/providers/r2.d.ts.map +0 -1
  473. package/dist/providers/r2.js +0 -83
  474. package/dist/providers/r2.js.map +0 -1
  475. package/dist/source-sidecars.d.ts +0 -13
  476. package/dist/source-sidecars.d.ts.map +0 -1
  477. package/dist/source-sidecars.js +0 -52
  478. package/dist/source-sidecars.js.map +0 -1
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Manifest field-merge primitives. Pure functions; no I/O.
3
+ *
4
+ * Two operations:
5
+ * - `applyLocaleOverrides` — shallow spread of one override on top of a
6
+ * base manifest. The override's non-undefined fields win; everything
7
+ * else falls through to the base.
8
+ * - `foldLocaleChain` — multi-overlay fold: read each chain entry and
9
+ * spread it on the previous, most-specific-LAST so most-specific
10
+ * wins per field.
11
+ *
12
+ * # Why a separate module
13
+ *
14
+ * The merge is the one piece of logic shared between embedded and
15
+ * downloadable kind resolvers (per Q3 lock). Font resolver does NOT
16
+ * use override-merge — it composes a variant union, structurally
17
+ * different. So the merge primitive lives separately and the kinds
18
+ * that share semantics compose it; the one that doesn't, doesn't.
19
+ *
20
+ * # Shallow vs deep
21
+ *
22
+ * The merge is SHALLOW. `focalPoint`, `variants`, `width`, `height` are
23
+ * atomic values from the override's perspective — partial focal-point
24
+ * overrides aren't a concept. If a locale variant carries `focalPoint`,
25
+ * its full {x, y} pair replaces the default's; you don't mix x from one
26
+ * with y from another.
27
+ *
28
+ * # Why use spread of `Partial<M>` instead of typed `LocaleOverrideManifest`
29
+ *
30
+ * Generic over manifest type so the same primitive can serve embedded
31
+ * and downloadable (and any future kind that wants override-wins
32
+ * semantics) without re-implementing per kind.
33
+ */
34
+ /**
35
+ * Spread `override`'s non-undefined fields onto `base`. Returns a new
36
+ * object — `base` is not mutated.
37
+ *
38
+ * Fields that are `undefined` in `override` do NOT shadow `base`'s value.
39
+ * That's the whole point: a locale manifest with only `alt` set should
40
+ * keep the default's everything-else.
41
+ *
42
+ * `null` is treated as a value, not "absent". `alt: null` on the override
43
+ * explicitly clears the default's alt — useful for "this locale's image
44
+ * is decorative even though the default has alt text."
45
+ */
46
+ export function applyLocaleOverrides(base, override) {
47
+ if (override === null)
48
+ return base;
49
+ const out = { ...base };
50
+ for (const [key, value] of Object.entries(override)) {
51
+ if (value === undefined)
52
+ continue;
53
+ out[key] = value;
54
+ }
55
+ return out;
56
+ }
57
+ /**
58
+ * Fold a chain of overrides onto a base. Chain order is
59
+ * most-specific-LAST so the final fold step replaces fields from
60
+ * less-specific entries.
61
+ *
62
+ * Example for active `pt-BR` with fallback `pt`:
63
+ *
64
+ * chain = [pt-manifest, pt-BR-manifest] // least-specific FIRST
65
+ * foldLocaleChain(default, chain)
66
+ *
67
+ * Step 1: apply pt overrides onto default → pt-effective
68
+ * Step 2: apply pt-BR overrides onto pt-effective → pt-BR-effective
69
+ *
70
+ * Most-specific (pt-BR) wins per field. Entries that are `null` (locale
71
+ * manifest didn't exist) are skipped — same effect as no overrides.
72
+ *
73
+ * Caller responsibility: order the chain correctly. Most-specific LAST.
74
+ */
75
+ export function foldLocaleChain(base, chain) {
76
+ let current = base;
77
+ for (const overrides of chain) {
78
+ current = applyLocaleOverrides(current, overrides);
79
+ }
80
+ return current;
81
+ }
82
+ //# sourceMappingURL=manifest-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-merge.js","sourceRoot":"","sources":["../../src/assets/manifest-merge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAAmB,IAAO,EAAE,QAA2B;IACzF,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAClC,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,CAAA;IACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,IAAI,KAAK,KAAK,SAAS;YAAE,SACxB;QAAC,GAA+B,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IAChD,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,eAAe,CAAmB,IAAO,EAAE,KAAqC;IAC9F,IAAI,OAAO,GAAG,IAAI,CAAA;IAClB,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,OAAO,GAAG,oBAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Asset manifest I/O — reading and writing `{name}.asset.json` via a
3
+ * `StorageProvider`. Pure delegation to the storage layer plus JSON
4
+ * (de)serialization; no validation of the manifest itself (that's the
5
+ * writer's job at creation time) and no dependency on the upload pipeline.
6
+ *
7
+ * Separation from the type:
8
+ * - `schema/types.ts` owns the `AssetManifest` type (data shape)
9
+ * - this file owns the I/O primitives (behavior)
10
+ *
11
+ * Separation from `ingest.ts`:
12
+ * - ingest composes hash + manifest + storage during upload
13
+ * - this module is used by ingest, the resolver, the library-list endpoint,
14
+ * and future delete/rename operations. It sits below all of them.
15
+ */
16
+ import type { StorageProvider } from '../types.js';
17
+ import type { AssetManifest } from '../schema/types.js';
18
+ import { type Selector } from '../schema/dimensions.js';
19
+ import { readDefaultManifest } from './manifest-default.js';
20
+ /**
21
+ * Where asset manifests live, relative to an `assets/` root.
22
+ *
23
+ * Default manifest: `{name}.asset.json`
24
+ * Locale variant: `{name}.asset.{locale}.json`
25
+ * Theme variant: `{name}.asset.{theme}.json`
26
+ * Locale + theme: `{name}.asset.{locale}.{theme}.json`
27
+ *
28
+ * Selector ordering follows `DIMENSION_ORDER` from `schema/dimensions.ts`.
29
+ * Pass `null` (or omit) for the default manifest.
30
+ */
31
+ export declare function manifestPath(assetName: string, selector?: Selector | null): string;
32
+ /**
33
+ * Where internal asset bytes live, given a name + 8-char hash + extension.
34
+ *
35
+ * Default bytes: `{name}-{hash}.{ext}`
36
+ * Locale bytes: `{name}-{hash}.{locale}.{ext}`
37
+ * Locale + theme bytes: `{name}-{hash}.{locale}.{theme}.{ext}`
38
+ *
39
+ * The hash always describes the bytes at THIS path — locale-bytes overrides
40
+ * have their own hash, distinct from the default's hash.
41
+ */
42
+ export declare function assetBytesPath(assetName: string, hash: string, ext: string, selector?: Selector | null): string;
43
+ /**
44
+ * Where a variant's bytes live, given name + hash + ext + target width
45
+ * (and optional selector for locale/theme variants).
46
+ *
47
+ * Default variant: `{name}-{hash}-{width}w.{ext}`
48
+ * Locale variant: `{name}-{hash}.{locale}-{width}w.{ext}`
49
+ * Locale + theme variant: `{name}-{hash}.{locale}.{theme}-{width}w.{ext}`
50
+ *
51
+ * Width suffix comes AFTER the selector suffix — the selector segments are
52
+ * part of the file's identity (which override is this), the width is part
53
+ * of the variant ladder for THAT identity. Owned here so the write side
54
+ * (ingest) and read side (asset-paths, URL construction) can't drift —
55
+ * change the scheme in one place.
56
+ */
57
+ export declare function assetVariantBytesPath(assetName: string, hash: string, ext: string, width: number, selector?: Selector | null): string;
58
+ /**
59
+ * Read an asset's default manifest. Thin alias for `readDefaultManifest`
60
+ * — kept for callers that haven't migrated yet. New code should prefer
61
+ * `readDefaultManifest` from `manifest-default.ts` directly so the
62
+ * default-vs-locale distinction is explicit at the call site.
63
+ */
64
+ export declare const readManifest: typeof readDefaultManifest;
65
+ /**
66
+ * Write an asset manifest to storage. The storage provider's `writeFile` is
67
+ * already atomic (see providers/_atomic-write.ts) — this function adds no
68
+ * atomicity of its own, just serialization.
69
+ */
70
+ export declare function writeManifest(storage: StorageProvider, assetsRoot: string, manifest: AssetManifest): Promise<void>;
71
+ /**
72
+ * Write a locale-override manifest at `{name}.asset.{...selector}.json`.
73
+ * Same atomicity contract as `writeManifest` (storage provider handles
74
+ * write-then-rename atomicity); this function only serializes + dispatches.
75
+ *
76
+ * The locale manifest type isn't bound here — callers pass any
77
+ * JSON-serializable shape that conforms to `LocaleOverrideManifest` or
78
+ * `FontLocaleAdditiveManifest`. The validators in `manifest-locale.ts`
79
+ * are responsible for read-side shape enforcement; the writer trusts
80
+ * its caller.
81
+ */
82
+ export declare function writeLocaleManifest(storage: StorageProvider, assetsRoot: string, assetName: string, selector: Selector, manifest: object): Promise<void>;
83
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/assets/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,KAAK,QAAQ,EAAkB,MAAM,yBAAyB,CAAA;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAE3D;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM,CAElF;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM,CAG/G;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,GACzB,MAAM,CAGR;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,4BAAsB,CAAA;AAE/C;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAQf"}
@@ -0,0 +1,93 @@
1
+ import { selectorSuffix } from '../schema/dimensions.js';
2
+ import { AssetStorageError } from './errors.js';
3
+ import { readDefaultManifest } from './manifest-default.js';
4
+ /**
5
+ * Where asset manifests live, relative to an `assets/` root.
6
+ *
7
+ * Default manifest: `{name}.asset.json`
8
+ * Locale variant: `{name}.asset.{locale}.json`
9
+ * Theme variant: `{name}.asset.{theme}.json`
10
+ * Locale + theme: `{name}.asset.{locale}.{theme}.json`
11
+ *
12
+ * Selector ordering follows `DIMENSION_ORDER` from `schema/dimensions.ts`.
13
+ * Pass `null` (or omit) for the default manifest.
14
+ */
15
+ export function manifestPath(assetName, selector) {
16
+ return `${assetName}.asset${selectorSuffix(selector ?? null)}.json`;
17
+ }
18
+ /**
19
+ * Where internal asset bytes live, given a name + 8-char hash + extension.
20
+ *
21
+ * Default bytes: `{name}-{hash}.{ext}`
22
+ * Locale bytes: `{name}-{hash}.{locale}.{ext}`
23
+ * Locale + theme bytes: `{name}-{hash}.{locale}.{theme}.{ext}`
24
+ *
25
+ * The hash always describes the bytes at THIS path — locale-bytes overrides
26
+ * have their own hash, distinct from the default's hash.
27
+ */
28
+ export function assetBytesPath(assetName, hash, ext, selector) {
29
+ const extPart = ext.startsWith('.') ? ext : `.${ext}`;
30
+ return `${assetName}-${hash}${selectorSuffix(selector ?? null)}${extPart}`;
31
+ }
32
+ /**
33
+ * Where a variant's bytes live, given name + hash + ext + target width
34
+ * (and optional selector for locale/theme variants).
35
+ *
36
+ * Default variant: `{name}-{hash}-{width}w.{ext}`
37
+ * Locale variant: `{name}-{hash}.{locale}-{width}w.{ext}`
38
+ * Locale + theme variant: `{name}-{hash}.{locale}.{theme}-{width}w.{ext}`
39
+ *
40
+ * Width suffix comes AFTER the selector suffix — the selector segments are
41
+ * part of the file's identity (which override is this), the width is part
42
+ * of the variant ladder for THAT identity. Owned here so the write side
43
+ * (ingest) and read side (asset-paths, URL construction) can't drift —
44
+ * change the scheme in one place.
45
+ */
46
+ export function assetVariantBytesPath(assetName, hash, ext, width, selector) {
47
+ const extPart = ext.startsWith('.') ? ext : `.${ext}`;
48
+ return `${assetName}-${hash}${selectorSuffix(selector ?? null)}-${width}w${extPart}`;
49
+ }
50
+ /**
51
+ * Read an asset's default manifest. Thin alias for `readDefaultManifest`
52
+ * — kept for callers that haven't migrated yet. New code should prefer
53
+ * `readDefaultManifest` from `manifest-default.ts` directly so the
54
+ * default-vs-locale distinction is explicit at the call site.
55
+ */
56
+ export const readManifest = readDefaultManifest;
57
+ /**
58
+ * Write an asset manifest to storage. The storage provider's `writeFile` is
59
+ * already atomic (see providers/_atomic-write.ts) — this function adds no
60
+ * atomicity of its own, just serialization.
61
+ */
62
+ export async function writeManifest(storage, assetsRoot, manifest) {
63
+ const path = `${assetsRoot}/${manifestPath(manifest.name)}`;
64
+ const serialized = `${JSON.stringify(manifest, null, 2)}\n`;
65
+ try {
66
+ await storage.writeFile(path, serialized);
67
+ }
68
+ catch (err) {
69
+ throw new AssetStorageError('write', path, err);
70
+ }
71
+ }
72
+ /**
73
+ * Write a locale-override manifest at `{name}.asset.{...selector}.json`.
74
+ * Same atomicity contract as `writeManifest` (storage provider handles
75
+ * write-then-rename atomicity); this function only serializes + dispatches.
76
+ *
77
+ * The locale manifest type isn't bound here — callers pass any
78
+ * JSON-serializable shape that conforms to `LocaleOverrideManifest` or
79
+ * `FontLocaleAdditiveManifest`. The validators in `manifest-locale.ts`
80
+ * are responsible for read-side shape enforcement; the writer trusts
81
+ * its caller.
82
+ */
83
+ export async function writeLocaleManifest(storage, assetsRoot, assetName, selector, manifest) {
84
+ const path = `${assetsRoot}/${manifestPath(assetName, selector)}`;
85
+ const serialized = `${JSON.stringify(manifest, null, 2)}\n`;
86
+ try {
87
+ await storage.writeFile(path, serialized);
88
+ }
89
+ catch (err) {
90
+ throw new AssetStorageError('write', path, err);
91
+ }
92
+ }
93
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/assets/manifest.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAiB,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAE3D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,QAA0B;IACxE,OAAO,GAAG,SAAS,SAAS,cAAc,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAA;AACrE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,IAAY,EAAE,GAAW,EAAE,QAA0B;IACrG,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAA;IACrD,OAAO,GAAG,SAAS,IAAI,IAAI,GAAG,cAAc,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,OAAO,EAAE,CAAA;AAC5E,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAAiB,EACjB,IAAY,EACZ,GAAW,EACX,KAAa,EACb,QAA0B;IAE1B,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAA;IACrD,OAAO,GAAG,SAAS,IAAI,IAAI,GAAG,cAAc,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,OAAO,EAAE,CAAA;AACtF,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,mBAAmB,CAAA;AAE/C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAwB,EACxB,UAAkB,EAClB,QAAuB;IAEvB,MAAM,IAAI,GAAG,GAAG,UAAU,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAA;IAC3D,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAA;IAC3D,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;IACjD,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAwB,EACxB,UAAkB,EAClB,SAAiB,EACjB,QAAkB,EAClB,QAAgB;IAEhB,MAAM,IAAI,GAAG,GAAG,UAAU,IAAI,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAA;IACjE,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAA;IAC3D,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;IACjD,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface MimeSniffResult {
2
+ /** The stream, replaying all original bytes. */
3
+ stream: ReadableStream<Uint8Array>;
4
+ /** Detected MIME (e.g. `"image/jpeg"`) or null when no magic-byte match. */
5
+ mime: string | null;
6
+ /** Detected canonical extension (e.g. `"jpg"`) or null when no match. */
7
+ ext: string | null;
8
+ }
9
+ /**
10
+ * Sniff the MIME type from the head of a stream, returning a pass-through
11
+ * stream that carries the full byte sequence downstream.
12
+ *
13
+ * Returns `{ mime: null, ext: null }` on unknown magic bytes, empty streams,
14
+ * or plain text that doesn't match any format. Callers handle the null
15
+ * case — this module doesn't throw.
16
+ */
17
+ export declare function sniffMimeFromStream(input: ReadableStream<Uint8Array>): Promise<MimeSniffResult>;
18
+ //# sourceMappingURL=mime-sniff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mime-sniff.d.ts","sourceRoot":"","sources":["../../src/assets/mime-sniff.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;IAClC,4EAA4E;IAC5E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,yEAAyE;IACzE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CACnB;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAmBrG"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * MIME sniffing from a byte stream — detect the type from magic bytes without
3
+ * consuming the stream. The returned stream replays every byte of the input
4
+ * (including the sample bytes used for detection); the detected MIME is
5
+ * attached once sniffing completes.
6
+ *
7
+ * Wraps `file-type`'s `fileTypeStream`, which builds an internal sample
8
+ * buffer (default 4100 bytes) without losing the originals.
9
+ *
10
+ * SVG handling: `file-type` v22+ detects SVG as `application/xml` (not the
11
+ * semantic `image/svg+xml`) because SVG is XML by syntax — magic bytes
12
+ * alone can't distinguish "SVG" from "any XML." This module promotes
13
+ * detected XML to `image/svg+xml` when the root element is `<svg>`. The
14
+ * promotion is conservative: malformed input that happens to start with
15
+ * `<svg` but isn't valid SVG will fail later sanitization, not here.
16
+ */
17
+ import { fileTypeStream } from 'file-type';
18
+ /**
19
+ * Sniff the MIME type from the head of a stream, returning a pass-through
20
+ * stream that carries the full byte sequence downstream.
21
+ *
22
+ * Returns `{ mime: null, ext: null }` on unknown magic bytes, empty streams,
23
+ * or plain text that doesn't match any format. Callers handle the null
24
+ * case — this module doesn't throw.
25
+ */
26
+ export async function sniffMimeFromStream(input) {
27
+ const sniffed = await fileTypeStream(input);
28
+ let mime = sniffed.fileType?.mime ?? null;
29
+ let ext = sniffed.fileType?.ext ?? null;
30
+ // SVG promotion. file-type returns `application/xml` for any XML;
31
+ // peek the head of the stream and check for `<svg` near the start.
32
+ if (mime === 'application/xml' || mime === null) {
33
+ const promoted = await tryPromoteSvg(sniffed);
34
+ if (promoted) {
35
+ return { stream: promoted, mime: 'image/svg+xml', ext: 'svg' };
36
+ }
37
+ }
38
+ return {
39
+ stream: sniffed,
40
+ mime,
41
+ ext,
42
+ };
43
+ }
44
+ /**
45
+ * Drain a stream into chunks, check if the head looks like SVG
46
+ * (`<svg` near the start, optionally preceded by an XML prolog and/or
47
+ * whitespace), and return a fresh replay stream when so. Returns
48
+ * `null` when the input doesn't start with an `<svg>` root.
49
+ */
50
+ async function tryPromoteSvg(stream) {
51
+ const reader = stream.getReader();
52
+ const chunks = [];
53
+ let total = 0;
54
+ let head = '';
55
+ for (;;) {
56
+ const { value, done } = await reader.read();
57
+ if (done)
58
+ break;
59
+ if (value) {
60
+ chunks.push(value);
61
+ total += value.byteLength;
62
+ if (head.length < 512) {
63
+ head += new TextDecoder('utf-8', { fatal: false }).decode(value).slice(0, 512 - head.length);
64
+ }
65
+ }
66
+ }
67
+ const looksSvg = /^\s*(?:<\?xml[^>]*\?>\s*)?(?:<!--[\s\S]*?-->\s*)?<svg[\s>]/i.test(head);
68
+ if (!looksSvg)
69
+ return null;
70
+ // Replay every byte we drained as a fresh stream.
71
+ const flat = new Uint8Array(total);
72
+ let offset = 0;
73
+ for (const chunk of chunks) {
74
+ flat.set(chunk, offset);
75
+ offset += chunk.byteLength;
76
+ }
77
+ return new ReadableStream({
78
+ start(controller) {
79
+ controller.enqueue(flat);
80
+ controller.close();
81
+ },
82
+ });
83
+ }
84
+ //# sourceMappingURL=mime-sniff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mime-sniff.js","sourceRoot":"","sources":["../../src/assets/mime-sniff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAW1C;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAiC;IACzE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,CAAA;IAC3C,IAAI,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,IAAI,CAAA;IACzC,IAAI,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,IAAI,CAAA;IAEvC,kEAAkE;IAClE,mEAAmE;IACnE,IAAI,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,OAAqC,CAAC,CAAA;QAC3E,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,KAAK,EAAE,CAAA;QAChE,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,OAAqC;QAC7C,IAAI;QACJ,GAAG;KACJ,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,aAAa,CAAC,MAAkC;IAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAA;IACjC,MAAM,MAAM,GAAiB,EAAE,CAAA;IAC/B,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,IAAI,GAAG,EAAE,CAAA;IACb,SAAS,CAAC;QACR,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;QAC3C,IAAI,IAAI;YAAE,MAAK;QACf,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClB,KAAK,IAAI,KAAK,CAAC,UAAU,CAAA;YACzB,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACtB,IAAI,IAAI,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;YAC9F,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,6DAA6D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzF,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAA;IAE1B,kDAAkD;IAClD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAA;IAClC,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACvB,MAAM,IAAI,KAAK,CAAC,UAAU,CAAA;IAC5B,CAAC;IACD,OAAO,IAAI,cAAc,CAAa;QACpC,KAAK,CAAC,UAAU;YACd,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACxB,UAAU,CAAC,KAAK,EAAE,CAAA;QACpB,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { UploadPreprocessor } from './preprocess.js';
2
+ export declare const svgPreprocessor: UploadPreprocessor;
3
+ //# sourceMappingURL=preprocess-svg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preprocess-svg.d.ts","sourceRoot":"","sources":["../../src/assets/preprocess-svg.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAuC,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAG9F,eAAO,MAAM,eAAe,EAAE,kBAqB7B,CAAA"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * SVG upload preprocessor — adapts `sanitizeSvg` to the
3
+ * `UploadPreprocessor` contract.
4
+ *
5
+ * SRP: this module owns the SVG-specific decisions for the preprocess
6
+ * pipeline (which MIMEs trigger it, how to wrap warnings, how to
7
+ * translate sanitization errors). The actual sanitization rules
8
+ * (DOMPurify config, base64 thresholds) live in `svg-sanitize.ts`
9
+ * — that's the format-specific policy module.
10
+ *
11
+ * Adding a new preprocessor follows this exact shape: one module per
12
+ * format, one matcher, one wrapper around the format's pure logic.
13
+ */
14
+ import { AssetPreprocessError } from './errors.js';
15
+ import { sanitizeSvg, SvgSanitizeError, SVG_MIME_TYPE } from './svg-sanitize.js';
16
+ export const svgPreprocessor = {
17
+ name: 'svg',
18
+ matches(mime) {
19
+ return mime === SVG_MIME_TYPE;
20
+ },
21
+ preprocess(bytes) {
22
+ try {
23
+ const result = sanitizeSvg(bytes);
24
+ return {
25
+ bytes: result.bytes,
26
+ warnings: result.warnings.map(toPreprocessWarning),
27
+ };
28
+ }
29
+ catch (err) {
30
+ if (err instanceof SvgSanitizeError) {
31
+ throw new AssetPreprocessError('svg', err.code, err);
32
+ }
33
+ // Other errors surface as-is; the registry wraps them into
34
+ // AssetPreprocessError with reason='unexpected'.
35
+ throw err;
36
+ }
37
+ },
38
+ };
39
+ function toPreprocessWarning(w) {
40
+ switch (w.code) {
41
+ case 'large-base64':
42
+ return { code: 'svg-large-base64', sizeBytes: w.sizeBytes, threshold: w.threshold };
43
+ case 'stripped-element':
44
+ return { code: 'svg-stripped-element', tag: w.tag };
45
+ case 'stripped-attribute':
46
+ return { code: 'svg-stripped-attribute', attr: w.attr, on: w.on };
47
+ }
48
+ }
49
+ //# sourceMappingURL=preprocess-svg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preprocess-svg.js","sourceRoot":"","sources":["../../src/assets/preprocess-svg.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAElD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEhF,MAAM,CAAC,MAAM,eAAe,GAAuB;IACjD,IAAI,EAAE,KAAK;IACX,OAAO,CAAC,IAAmB;QACzB,OAAO,IAAI,KAAK,aAAa,CAAA;IAC/B,CAAC;IACD,UAAU,CAAC,KAAiB;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;YACjC,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC;aACnD,CAAA;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,gBAAgB,EAAE,CAAC;gBACpC,MAAM,IAAI,oBAAoB,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;YACtD,CAAC;YACD,2DAA2D;YAC3D,iDAAiD;YACjD,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;CACF,CAAA;AAED,SAAS,mBAAmB,CAAC,CAAqD;IAChF,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,cAAc;YACjB,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAA;QACrF,KAAK,kBAAkB;YACrB,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAA;QACrD,KAAK,oBAAoB;YACvB,OAAO,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAA;IACrE,CAAC;AACH,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Non-fatal observations about how the bytes were transformed. Today
3
+ * SVG can warn about large embedded base64; future preprocessors may
4
+ * surface "EXIF orientation applied", "metadata stripped", etc.
5
+ *
6
+ * Open shape — preprocessors define their own warning codes via the
7
+ * union of all registered preprocessors. Today only SVG warnings.
8
+ */
9
+ export type PreprocessWarning = {
10
+ code: 'svg-stripped-element';
11
+ tag: string;
12
+ } | {
13
+ code: 'svg-stripped-attribute';
14
+ attr: string;
15
+ on: string;
16
+ } | {
17
+ code: 'svg-large-base64';
18
+ sizeBytes: number;
19
+ threshold: number;
20
+ };
21
+ export interface PreprocessResult {
22
+ /** Bytes after preprocessing — may be the same reference when no transform applied. */
23
+ bytes: Uint8Array;
24
+ /** Format-specific non-fatal warnings. Empty when nothing to flag. */
25
+ warnings: readonly PreprocessWarning[];
26
+ }
27
+ /**
28
+ * One format's preprocessing contract. Implementations are pure
29
+ * (no I/O, no storage, no history) so they're trivially testable.
30
+ */
31
+ export interface UploadPreprocessor {
32
+ /** Stable identifier for diagnostics (`'svg'`, `'heic'`, etc.). */
33
+ readonly name: string;
34
+ /** Whether this preprocessor applies to the given MIME. */
35
+ matches(mime: string | null): boolean;
36
+ /**
37
+ * Transform the bytes. Return new bytes (may be the same reference
38
+ * if no transformation is needed) plus any warnings. Throw
39
+ * `AssetPreprocessError` for unrecoverable input problems.
40
+ */
41
+ preprocess(bytes: Uint8Array): PreprocessResult | Promise<PreprocessResult>;
42
+ }
43
+ /**
44
+ * The default registry — what ingest uses out of the box. Order
45
+ * matters when more than one preprocessor matches; today only one
46
+ * preprocessor matches any given MIME.
47
+ *
48
+ * Adding a new format-specific preprocessor: implement
49
+ * `UploadPreprocessor`, append it here. Ingest needs no edits.
50
+ */
51
+ export declare const defaultPreprocessors: readonly UploadPreprocessor[];
52
+ /**
53
+ * Run the matching preprocessor for the given MIME. Returns the
54
+ * (possibly-transformed) bytes + any warnings; pass through unchanged
55
+ * when no preprocessor matches.
56
+ *
57
+ * Thrown errors propagate. Preprocessors throw `AssetPreprocessError`
58
+ * for client-correctable input problems; other thrown errors (e.g.
59
+ * out-of-memory during a large transform) bubble as-is.
60
+ */
61
+ export declare function runPreprocessors(bytes: Uint8Array, mime: string | null, preprocessors?: readonly UploadPreprocessor[]): Promise<PreprocessResult>;
62
+ //# sourceMappingURL=preprocess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preprocess.d.ts","sourceRoot":"","sources":["../../src/assets/preprocess.ts"],"names":[],"mappings":"AAmDA;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,wBAAwB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtE,MAAM,WAAW,gBAAgB;IAC/B,uFAAuF;IACvF,KAAK,EAAE,UAAU,CAAA;IACjB,sEAAsE;IACtE,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAA;CACvC;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,2DAA2D;IAC3D,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAA;IACrC;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;CAC5E;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,kBAAkB,EAAsB,CAAA;AAEpF;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,aAAa,GAAE,SAAS,kBAAkB,EAAyB,GAClE,OAAO,CAAC,gBAAgB,CAAC,CAc3B"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Format-specific upload preprocessing — the seam where formats register
3
+ * "transform these bytes before storage."
4
+ *
5
+ * # Why
6
+ *
7
+ * Some formats need work between MIME-sniff and storage write:
8
+ *
9
+ * - SVG: strip script tags, event handlers, external hrefs, and
10
+ * oversized embedded base64 (security + bloat — see svg-sanitize.ts)
11
+ * - HEIC: transcode to JPEG (browsers can't display HEIC) — future
12
+ * - Animated GIF: extract first frame as poster, set `animated`
13
+ * manifest flag — future
14
+ * - JPEG with EXIF: apply orientation, strip personal metadata — future
15
+ *
16
+ * Without an abstraction, every new format adds an `if (mime === '...')`
17
+ * branch to `ingestAsset`. The hot path grows with each format; format-
18
+ * specific code lives in the wrong place; tests for one format have
19
+ * to stand up the whole ingest pipeline.
20
+ *
21
+ * # Contract
22
+ *
23
+ * `UploadPreprocessor` is the open extension seam:
24
+ * - `matches(mime)` → does this preprocessor apply?
25
+ * - `preprocess(bytes)` → return new bytes (and optional warnings)
26
+ *
27
+ * Each registered preprocessor handles one MIME (or a small family —
28
+ * a future "EXIF" preprocessor might handle both `image/jpeg` and
29
+ * `image/heic`). The registry is checked in order; the first matching
30
+ * preprocessor runs and its output replaces the buffer.
31
+ *
32
+ * # SOLID lenses
33
+ *
34
+ * - SRP: each preprocessor module owns one format's preprocessing
35
+ * - OCP: adding a format = new module + register; ingest unchanged
36
+ * - LSP: every preprocessor honors the same contract — return bytes
37
+ * or throw `AssetPreprocessError`
38
+ * - ISP: callers (ingest) depend on `runPreprocessors`, not on the
39
+ * individual format modules
40
+ * - DIP: ingest depends on the abstraction; format modules implement
41
+ * it. SVG-specific knowledge lives in `preprocess-svg.ts`.
42
+ *
43
+ * # v1 scope
44
+ *
45
+ * Today's only registered preprocessor is SVG. The default registry
46
+ * (`defaultPreprocessors`) is what `ingestAsset` uses out of the box;
47
+ * tests can construct an empty registry to bypass preprocessing.
48
+ */
49
+ import { AssetPreprocessError } from './errors.js';
50
+ import { svgPreprocessor } from './preprocess-svg.js';
51
+ /**
52
+ * The default registry — what ingest uses out of the box. Order
53
+ * matters when more than one preprocessor matches; today only one
54
+ * preprocessor matches any given MIME.
55
+ *
56
+ * Adding a new format-specific preprocessor: implement
57
+ * `UploadPreprocessor`, append it here. Ingest needs no edits.
58
+ */
59
+ export const defaultPreprocessors = [svgPreprocessor];
60
+ /**
61
+ * Run the matching preprocessor for the given MIME. Returns the
62
+ * (possibly-transformed) bytes + any warnings; pass through unchanged
63
+ * when no preprocessor matches.
64
+ *
65
+ * Thrown errors propagate. Preprocessors throw `AssetPreprocessError`
66
+ * for client-correctable input problems; other thrown errors (e.g.
67
+ * out-of-memory during a large transform) bubble as-is.
68
+ */
69
+ export async function runPreprocessors(bytes, mime, preprocessors = defaultPreprocessors) {
70
+ for (const p of preprocessors) {
71
+ if (p.matches(mime)) {
72
+ try {
73
+ return await p.preprocess(bytes);
74
+ }
75
+ catch (err) {
76
+ if (err instanceof AssetPreprocessError)
77
+ throw err;
78
+ // Wrap unexpected errors so the caller always sees a typed
79
+ // surface for preprocessing failures.
80
+ throw new AssetPreprocessError(p.name, 'unexpected', err);
81
+ }
82
+ }
83
+ }
84
+ return { bytes, warnings: [] };
85
+ }
86
+ //# sourceMappingURL=preprocess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preprocess.js","sourceRoot":"","sources":["../../src/assets/preprocess.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAuCrD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAkC,CAAC,eAAe,CAAC,CAAA;AAEpF;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAiB,EACjB,IAAmB,EACnB,gBAA+C,oBAAoB;IAEnE,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC;gBACH,OAAO,MAAM,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;YAClC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,oBAAoB;oBAAE,MAAM,GAAG,CAAA;gBAClD,2DAA2D;gBAC3D,sCAAsC;gBACtC,MAAM,IAAI,oBAAoB,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,CAAA;YAC3D,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;AAChC,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Publish-plan — figures out *what* to publish before any bytes move.
3
+ *
4
+ * Single responsibility: turn a set of items being published into either
5
+ * a `Plan` (the asset names to copy + the items that referenced them) or
6
+ * a structured `missing-on-source` failure. No I/O on the destination —
7
+ * actually copying bytes is `publish.ts`'s job.
8
+ *
9
+ * Splitting the planner from the executor lets the validation failure
10
+ * short-circuit before a single stream is opened. It also lets the
11
+ * orchestrator wire publish-assets into the broader publish flow with
12
+ * full knowledge of what's about to happen — useful for ordering writes
13
+ * (assets before pages) and for surfacing per-asset progress.
14
+ */
15
+ import type { ContentRoot } from '../content-root.js';
16
+ export interface PlanInput {
17
+ /** Source content root (where pages/, fragments/, and assets/ live on the source side). */
18
+ readonly sourceRoot: ContentRoot;
19
+ /** Target content root (where pages/, fragments/, and assets/ will land on the target side). */
20
+ readonly targetRoot: ContentRoot;
21
+ /** Items being published — e.g., `['pages/home', 'fragments/header']`. */
22
+ readonly itemNames: readonly string[];
23
+ }
24
+ export type Plan = {
25
+ readonly ok: true;
26
+ readonly assets: readonly string[];
27
+ readonly itemsWithRefs: readonly string[];
28
+ } | {
29
+ readonly ok: false;
30
+ readonly reason: 'missing-on-source';
31
+ readonly missing: readonly string[];
32
+ };
33
+ /**
34
+ * Compute the set of assets to publish given the items being published,
35
+ * after running the source-existence pre-flight check.
36
+ *
37
+ * Empty refs short-circuit to `ok: true` with no assets — sites without
38
+ * media still publish fine.
39
+ */
40
+ export declare function planAssetCopy(input: PlanInput): Promise<Plan>;
41
+ //# sourceMappingURL=publish-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-plan.d.ts","sourceRoot":"","sources":["../../src/assets/publish-plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAIrD,MAAM,WAAW,SAAS;IACxB,2FAA2F;IAC3F,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAA;IAChC,gGAAgG;IAChG,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAA;IAChC,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;CACtC;AAED,MAAM,MAAM,IAAI,GACZ;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACpG;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAA;AAErG;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAenE"}