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,61 @@
1
+ /**
2
+ * Update an asset's metadata (alt today; tags, focalPoint, title,
3
+ * description as those land).
4
+ *
5
+ * Single responsibility: merge a metadata patch into the existing
6
+ * default manifest, validate, persist, record history. Doesn't touch
7
+ * bytes, doesn't enumerate paths, doesn't scan refs.
8
+ *
9
+ * Three-state alt semantics (per design-media.md):
10
+ * - patch.alt === undefined → leave alt unchanged (caller didn't send it)
11
+ * - patch.alt === "string" → meaningful description
12
+ * - patch.alt === "" → intentionally decorative
13
+ * - patch.alt === null → not set (resolver falls back to '')
14
+ *
15
+ * The discriminator is `'alt' in patch` vs `patch.alt`. JS-level distinct
16
+ * meaning of "absent" vs "explicit null". The HTTP layer translates
17
+ * between JSON's `null` (explicit) and field-not-present (absent) so the
18
+ * three-state contract survives the wire.
19
+ */
20
+ import type { ContentRoot } from '../content-root.js';
21
+ import type { HistoryProvider } from '../history.js';
22
+ import type { AssetManifest } from '../schema/types.js';
23
+ import type { StorageProvider } from '../types.js';
24
+ /**
25
+ * Patch shape — every field optional; only present fields are applied.
26
+ * Undefined = "don't change," explicit `null` = "set to null state."
27
+ */
28
+ export interface AssetMetadataPatch {
29
+ /** Three-state alt (string | "" | null). Absent in patch = unchanged. */
30
+ alt?: string | null;
31
+ /**
32
+ * Focal point in normalized coordinates (0–1). Two-state:
33
+ * - `{ x, y }` → set it
34
+ * - `null` → clear (manifest field becomes absent, falls back
35
+ * to center at render time)
36
+ * - omitted → unchanged
37
+ */
38
+ focalPoint?: {
39
+ x: number;
40
+ y: number;
41
+ } | null;
42
+ }
43
+ export interface UpdateAssetMetadataInput {
44
+ storage: StorageProvider;
45
+ assetsRoot: string;
46
+ assetName: string;
47
+ patch: AssetMetadataPatch;
48
+ history?: HistoryProvider;
49
+ contentRoot?: ContentRoot;
50
+ author?: string;
51
+ }
52
+ /**
53
+ * Apply a metadata patch to the asset's default manifest. Throws:
54
+ * - `AssetManifestNotFoundError` — asset doesn't exist
55
+ * - `AssetStorageError` — manifest write failed
56
+ *
57
+ * Returns the updated manifest so callers can re-summarize for the
58
+ * client without an extra round-trip.
59
+ */
60
+ export declare function updateAssetMetadata(input: UpdateAssetMetadataInput): Promise<AssetManifest>;
61
+ //# sourceMappingURL=update-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-metadata.d.ts","sourceRoot":"","sources":["../../src/assets/update-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAEpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAIlD;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAE7C;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,eAAe,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,kBAAkB,CAAA;IACzB,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,aAAa,CAAC,CAyDjG"}
@@ -0,0 +1,82 @@
1
+ import { recordWrite } from '../history-recorder.js';
2
+ import { manifestPath, readManifest, writeManifest } from './manifest.js';
3
+ import { AssetStorageError } from './errors.js';
4
+ /**
5
+ * Apply a metadata patch to the asset's default manifest. Throws:
6
+ * - `AssetManifestNotFoundError` — asset doesn't exist
7
+ * - `AssetStorageError` — manifest write failed
8
+ *
9
+ * Returns the updated manifest so callers can re-summarize for the
10
+ * client without an extra round-trip.
11
+ */
12
+ export async function updateAssetMetadata(input) {
13
+ const current = await readManifest(input.storage, input.assetsRoot, input.assetName);
14
+ // Apply patch: only fields explicitly present in the patch object
15
+ // overwrite the manifest. Each new metadata field adds one
16
+ // `'field' in input.patch` clause here.
17
+ const next = { ...current };
18
+ if ('alt' in input.patch) {
19
+ next.alt = input.patch.alt ?? null;
20
+ }
21
+ if ('focalPoint' in input.patch) {
22
+ const fp = input.patch.focalPoint;
23
+ if (fp === null) {
24
+ // Clear → remove the field so the manifest serializes without it.
25
+ delete next.focalPoint;
26
+ }
27
+ else if (fp !== undefined) {
28
+ // Range-check (0–1 inclusive). Invalid input is a programmer
29
+ // error at this layer — the route validator should reject before
30
+ // calling. Defensive throw rather than silent clamp.
31
+ if (fp.x < 0 || fp.x > 1 || fp.y < 0 || fp.y > 1) {
32
+ throw new Error(`Focal point out of range: x=${fp.x}, y=${fp.y} (must be 0–1)`);
33
+ }
34
+ next.focalPoint = { x: fp.x, y: fp.y };
35
+ }
36
+ }
37
+ // Short-circuit no-op patches: identical manifest = identical history
38
+ // entry, but the recorder doesn't dedup entries that produce the same
39
+ // snapshot, so we'd accumulate empty revisions. Skip if nothing changed.
40
+ if (sameManifest(current, next))
41
+ return current;
42
+ const path = `${input.assetsRoot}/${manifestPath(next.name)}`;
43
+ const serialized = `${JSON.stringify(next, null, 2)}\n`;
44
+ // Record history BEFORE the write — same pattern as ingest/replace.
45
+ // First-time baseline scan must capture pre-op state.
46
+ if (input.history) {
47
+ if (!input.contentRoot) {
48
+ throw new Error('updateAssetMetadata: history requires contentRoot');
49
+ }
50
+ const items = [{ path, content: serialized }];
51
+ await recordWrite({
52
+ history: input.history,
53
+ contentRoot: input.contentRoot,
54
+ operation: 'save',
55
+ author: input.author,
56
+ items,
57
+ message: `Update metadata for ${input.assetName}`,
58
+ });
59
+ }
60
+ try {
61
+ await writeManifest(input.storage, input.assetsRoot, next);
62
+ }
63
+ catch (err) {
64
+ throw new AssetStorageError('write', path, err);
65
+ }
66
+ return next;
67
+ }
68
+ function sameManifest(a, b) {
69
+ // Cheap deep-equal for the fields a metadata patch can change. Avoids
70
+ // a full JSON.stringify compare for the hot no-op path.
71
+ if (a.alt !== b.alt)
72
+ return false;
73
+ return sameFocalPoint(a.focalPoint, b.focalPoint);
74
+ }
75
+ function sameFocalPoint(a, b) {
76
+ if (a === undefined && b === undefined)
77
+ return true;
78
+ if (a === undefined || b === undefined)
79
+ return false;
80
+ return a.x === b.x && a.y === b.y;
81
+ }
82
+ //# sourceMappingURL=update-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-metadata.js","sourceRoot":"","sources":["../../src/assets/update-metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Asset URL construction — pure function from (siteUrl, asset manifest
3
+ * fields, extension) to the URL the template emits.
4
+ *
5
+ * Kept separate from `resolve.ts` because:
6
+ * - The resolver composes manifest I/O + URL construction + override merging.
7
+ * URL construction is the only piece that's purely computational.
8
+ * - Future transform adapters (Cloudflare Images, imgproxy) build URLs too —
9
+ * they share the `{name}-{hash}.{ext}` origin-URL shape and wrap it. Having
10
+ * that builder in one place means adapters compose rather than duplicate.
11
+ *
12
+ * Output is root-relative when `siteUrl` is absent, absolute when present.
13
+ * Root-relative works anywhere; absolute is needed for targets that live on
14
+ * a different origin from the admin (CDN-split deployments).
15
+ */
16
+ /** Path prefix (relative to storage root) where internal asset bytes live. */
17
+ export declare const ASSETS_URL_PREFIX = "/assets";
18
+ import { type Selector } from '../schema/dimensions.js';
19
+ export interface BuildAssetUrlInput {
20
+ /** Asset name (the canonical identifier). */
21
+ name: string;
22
+ /**
23
+ * 8-char SHA-256 prefix of the bytes (matches the manifest `hash`).
24
+ * For locale-bytes overrides this is the OVERRIDE's hash, distinct
25
+ * from the default's hash.
26
+ */
27
+ hash: string;
28
+ /** File extension without the dot (e.g., `"jpg"`). */
29
+ ext: string;
30
+ /**
31
+ * Optional site URL — absolute URL prefix for targets served from a separate
32
+ * origin (e.g., `"https://cdn.example.com"`). When absent, the returned URL
33
+ * is root-relative.
34
+ */
35
+ siteUrl?: string;
36
+ /**
37
+ * Optional selector — when set, builds the URL for a locale/theme override.
38
+ * Path becomes `/assets/{name}-{hash}.{locale}[.{theme}].{ext}`. Null/omitted
39
+ * = default-bytes URL.
40
+ */
41
+ selector?: Selector | null;
42
+ }
43
+ /**
44
+ * Construct the public URL for an internal asset. Path pattern is
45
+ * `{ASSETS_URL_PREFIX}/{name}-{hash}[.{locale}][.{theme}].{ext}`, optionally
46
+ * prefixed with `siteUrl`.
47
+ *
48
+ * Normalizes trailing slashes — `siteUrl: "https://cdn.example.com/"` and
49
+ * `siteUrl: "https://cdn.example.com"` both produce the same URL.
50
+ */
51
+ export declare function buildAssetUrl(input: BuildAssetUrlInput): string;
52
+ /**
53
+ * Construct the public URL for a variant whose filename is already
54
+ * known (from the manifest's `variants[].path`). The filename is
55
+ * already hash-encoded and width-suffixed at ingest time, so this
56
+ * helper is just a prefix composer — keeps siteUrl normalization in
57
+ * one place.
58
+ */
59
+ export declare function buildVariantUrl(variantPath: string, siteUrl?: string): string;
60
+ /**
61
+ * Build the responsive `srcset` string from a manifest's variant list.
62
+ * Each variant contributes one `<url> <width>w` descriptor; the browser
63
+ * picks the best match for the viewport. Joined with `", "` per the
64
+ * HTML `srcset` spec.
65
+ *
66
+ * Lives here (not in `resolve.ts`) because URL composition — including
67
+ * this multi-variant flavor — is the `url.ts` module's single
68
+ * responsibility. Future transform adapters (Cloudflare Images,
69
+ * imgproxy) that build their own srcset ladders will compose this or
70
+ * substitute their own from the same module.
71
+ */
72
+ export declare function buildSrcset(variants: readonly {
73
+ width: number;
74
+ path: string;
75
+ }[], siteUrl?: string): string;
76
+ /**
77
+ * Derive a file extension from a MIME type for the v1 allowlist.
78
+ * Returns `null` for unknown MIMEs — callers should already have validated
79
+ * MIME before reaching URL construction, so this is a defensive fallback.
80
+ */
81
+ export declare function extFromMime(mime: string): string | null;
82
+ //# sourceMappingURL=url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/assets/url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,YAAY,CAAA;AAE1C,OAAO,EAAE,KAAK,QAAQ,EAAkB,MAAM,yBAAyB,CAAA;AAEvE,MAAM,WAAW,kBAAkB;IACjC,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,sDAAsD;IACtD,GAAG,EAAE,MAAM,CAAA;IACX;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;CAC3B;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAQ/D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAK7E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,SAAS;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1G;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgCvD"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Asset URL construction — pure function from (siteUrl, asset manifest
3
+ * fields, extension) to the URL the template emits.
4
+ *
5
+ * Kept separate from `resolve.ts` because:
6
+ * - The resolver composes manifest I/O + URL construction + override merging.
7
+ * URL construction is the only piece that's purely computational.
8
+ * - Future transform adapters (Cloudflare Images, imgproxy) build URLs too —
9
+ * they share the `{name}-{hash}.{ext}` origin-URL shape and wrap it. Having
10
+ * that builder in one place means adapters compose rather than duplicate.
11
+ *
12
+ * Output is root-relative when `siteUrl` is absent, absolute when present.
13
+ * Root-relative works anywhere; absolute is needed for targets that live on
14
+ * a different origin from the admin (CDN-split deployments).
15
+ */
16
+ /** Path prefix (relative to storage root) where internal asset bytes live. */
17
+ export const ASSETS_URL_PREFIX = '/assets';
18
+ import { selectorSuffix } from '../schema/dimensions.js';
19
+ /**
20
+ * Construct the public URL for an internal asset. Path pattern is
21
+ * `{ASSETS_URL_PREFIX}/{name}-{hash}[.{locale}][.{theme}].{ext}`, optionally
22
+ * prefixed with `siteUrl`.
23
+ *
24
+ * Normalizes trailing slashes — `siteUrl: "https://cdn.example.com/"` and
25
+ * `siteUrl: "https://cdn.example.com"` both produce the same URL.
26
+ */
27
+ export function buildAssetUrl(input) {
28
+ const suffix = selectorSuffix(input.selector ?? null);
29
+ const path = `${ASSETS_URL_PREFIX}/${input.name}-${input.hash}${suffix}.${input.ext}`;
30
+ if (!input.siteUrl)
31
+ return path;
32
+ // Strip trailing slash from siteUrl before appending the root-relative path.
33
+ const base = input.siteUrl.endsWith('/') ? input.siteUrl.slice(0, -1) : input.siteUrl;
34
+ return `${base}${path}`;
35
+ }
36
+ /**
37
+ * Construct the public URL for a variant whose filename is already
38
+ * known (from the manifest's `variants[].path`). The filename is
39
+ * already hash-encoded and width-suffixed at ingest time, so this
40
+ * helper is just a prefix composer — keeps siteUrl normalization in
41
+ * one place.
42
+ */
43
+ export function buildVariantUrl(variantPath, siteUrl) {
44
+ const path = `${ASSETS_URL_PREFIX}/${variantPath}`;
45
+ if (!siteUrl)
46
+ return path;
47
+ const base = siteUrl.endsWith('/') ? siteUrl.slice(0, -1) : siteUrl;
48
+ return `${base}${path}`;
49
+ }
50
+ /**
51
+ * Build the responsive `srcset` string from a manifest's variant list.
52
+ * Each variant contributes one `<url> <width>w` descriptor; the browser
53
+ * picks the best match for the viewport. Joined with `", "` per the
54
+ * HTML `srcset` spec.
55
+ *
56
+ * Lives here (not in `resolve.ts`) because URL composition — including
57
+ * this multi-variant flavor — is the `url.ts` module's single
58
+ * responsibility. Future transform adapters (Cloudflare Images,
59
+ * imgproxy) that build their own srcset ladders will compose this or
60
+ * substitute their own from the same module.
61
+ */
62
+ export function buildSrcset(variants, siteUrl) {
63
+ return variants.map(v => `${buildVariantUrl(v.path, siteUrl)} ${v.width}w`).join(', ');
64
+ }
65
+ /**
66
+ * Derive a file extension from a MIME type for the v1 allowlist.
67
+ * Returns `null` for unknown MIMEs — callers should already have validated
68
+ * MIME before reaching URL construction, so this is a defensive fallback.
69
+ */
70
+ export function extFromMime(mime) {
71
+ switch (mime) {
72
+ // Images
73
+ case 'image/jpeg':
74
+ return 'jpg';
75
+ case 'image/png':
76
+ return 'png';
77
+ case 'image/svg+xml':
78
+ return 'svg';
79
+ case 'image/gif':
80
+ return 'gif';
81
+ // Audio
82
+ case 'audio/mpeg':
83
+ return 'mp3';
84
+ case 'audio/wav':
85
+ case 'audio/x-wav':
86
+ return 'wav';
87
+ case 'audio/flac':
88
+ case 'audio/x-flac':
89
+ return 'flac';
90
+ case 'audio/ogg':
91
+ return 'ogg';
92
+ case 'audio/opus':
93
+ return 'opus';
94
+ case 'audio/aac':
95
+ return 'aac';
96
+ case 'audio/mp4':
97
+ case 'audio/x-m4a':
98
+ return 'm4a';
99
+ default:
100
+ return null;
101
+ }
102
+ }
103
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/assets/url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,8EAA8E;AAC9E,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAA;AAE1C,OAAO,EAAiB,cAAc,EAAE,MAAM,yBAAyB,CAAA;AA2BvE;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAA;IACrD,MAAM,IAAI,GAAG,GAAG,iBAAiB,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,CAAA;IACrF,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IAE/B,6EAA6E;IAC7E,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAA;IACrF,OAAO,GAAG,IAAI,GAAG,IAAI,EAAE,CAAA;AACzB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB,EAAE,OAAgB;IACnE,MAAM,IAAI,GAAG,GAAG,iBAAiB,IAAI,WAAW,EAAE,CAAA;IAClD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IACzB,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IACnE,OAAO,GAAG,IAAI,GAAG,IAAI,EAAE,CAAA;AACzB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,WAAW,CAAC,QAAoD,EAAE,OAAgB;IAChG,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACxF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,QAAQ,IAAI,EAAE,CAAC;QACb,SAAS;QACT,KAAK,YAAY;YACf,OAAO,KAAK,CAAA;QACd,KAAK,WAAW;YACd,OAAO,KAAK,CAAA;QACd,KAAK,eAAe;YAClB,OAAO,KAAK,CAAA;QACd,KAAK,WAAW;YACd,OAAO,KAAK,CAAA;QACd,QAAQ;QACR,KAAK,YAAY;YACf,OAAO,KAAK,CAAA;QACd,KAAK,WAAW,CAAC;QACjB,KAAK,aAAa;YAChB,OAAO,KAAK,CAAA;QACd,KAAK,YAAY,CAAC;QAClB,KAAK,cAAc;YACjB,OAAO,MAAM,CAAA;QACf,KAAK,WAAW;YACd,OAAO,KAAK,CAAA;QACd,KAAK,YAAY;YACf,OAAO,MAAM,CAAA;QACf,KAAK,WAAW;YACd,OAAO,KAAK,CAAA;QACd,KAAK,WAAW,CAAC;QACjB,KAAK,aAAa;YAChB,OAAO,KAAK,CAAA;QACd;YACE,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Default per-asset upload size cap — 50 MB. Sites override per target
3
+ * via `targets.{name}.assets.maxBytes` in `site.yaml`. Targets that
4
+ * don't override get this value.
5
+ *
6
+ * Why a default at all (per Q5):
7
+ * - DoS / OOM bound: ingest buffers the full upload in memory today
8
+ * (`collectBytes` in ingest.ts). Concurrent uploads × cap = peak
9
+ * memory; without a cap, one careless or malicious client can
10
+ * exhaust the admin process.
11
+ * - Storage-cost protection: a 200 MB raw photo × variant ladder ×
12
+ * locale overrides quickly compounds. The cap forces explicit
13
+ * opt-in for unusual sizes.
14
+ * - Worker-tier ceiling: Cloudflare Workers Free/Pro have a 100 MB
15
+ * response body limit — a target on that tier can't serve assets
16
+ * above it via the worker. Sites should lower the cap below the
17
+ * worker tier they're on.
18
+ *
19
+ * 50 MB is conservative for image-only v1. Sites with raw-photo
20
+ * workflows (24-48 MP camera output) have headroom; sites on free
21
+ * worker tiers should reduce explicitly.
22
+ */
23
+ export declare const DEFAULT_ASSET_MAX_BYTES: number;
24
+ /**
25
+ * @deprecated Renamed to `DEFAULT_ASSET_MAX_BYTES`. Use the per-target
26
+ * config (`targets.{name}.assets.maxBytes`) for site-specific limits;
27
+ * this constant is the fallback default. Kept exported until the next
28
+ * major version so external callers (tests, integrations) don't break.
29
+ */
30
+ export declare const ASSET_MAX_BYTES: number;
31
+ /**
32
+ * v1 MIME allowlist. Image side: JPEG, PNG, SVG, GIF. Audio side:
33
+ * MP3, WAV, FLAC, Opus, AAC, M4A, OGG.
34
+ *
35
+ * - SVG is sanitized before persistence (`svg-sanitize.ts`)
36
+ * - GIF is checked for animation by `animatedImageAnalyzer`
37
+ * - Audio MIMEs are analyzed by `audioAnalyzer` for duration
38
+ * (`music-metadata`); personal-metadata stripping is a v1.5
39
+ * opt-in via a future preprocessor surface
40
+ *
41
+ * Animated WebP/AVIF, video, and documents widen via this set in
42
+ * v1.1+. The analyzer/preprocessor abstractions accommodate each
43
+ * format-specific need without orchestrator edits.
44
+ */
45
+ export declare const ALLOWED_MIMES: Set<string>;
46
+ export interface UploadCandidate {
47
+ /** Desired asset name (what the author chose, pre-slug). */
48
+ name: string;
49
+ /** Bytes received so far; the stream is still flowing. */
50
+ claimedSize: number;
51
+ /** MIME sniffed from the bytes. Null when sniffing failed. */
52
+ sniffedMime: string | null;
53
+ }
54
+ /**
55
+ * Per-target validation policy. Today carries the size cap; future
56
+ * fields (allowed MIMEs subset, name pattern overrides) extend this
57
+ * interface without changing the validator's signature.
58
+ */
59
+ export interface UploadPolicy {
60
+ /** Override the default per-target. When undefined, uses DEFAULT_ASSET_MAX_BYTES. */
61
+ maxBytes?: number;
62
+ }
63
+ /**
64
+ * Validate an upload candidate against the per-target policy. Throws
65
+ * the specific `AssetValidationError` subclass for the first failure
66
+ * encountered — policy enforces fail-fast so the HTTP route returns a
67
+ * single, specific reason to the client.
68
+ *
69
+ * `policy` is optional — callers that haven't migrated to per-target
70
+ * config get the default size cap. Once asset routes thread the
71
+ * target config through, `policy` is always present.
72
+ */
73
+ export declare function validateUpload(candidate: UploadCandidate, policy?: UploadPolicy): void;
74
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/assets/validate.ts"],"names":[],"mappings":"AAwBA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,uBAAuB,QAAmB,CAAA;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,QAA0B,CAAA;AAEtD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,aAAa,aAiBxB,CAAA;AAWF,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAA;IACZ,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAA;IACnB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,eAAe,EAAE,MAAM,GAAE,YAAiB,GAAG,IAAI,CAI1F"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Asset-upload validation policy. Pure — takes a candidate (name, claimed
3
+ * size, claimed MIME, sniffed MIME) and throws a typed validation error on
4
+ * the first failure. No I/O, no storage, no network.
5
+ *
6
+ * Keeping this pure means:
7
+ * - Tests are trivial: pass candidate data in, assert the thrown class
8
+ * - The same policy applies whether the caller is the HTTP route, a CLI
9
+ * import command, or the future paste-URL handler
10
+ * - Policy evolves in one place
11
+ *
12
+ * Each validation failure throws a distinct `AssetValidationError`
13
+ * subclass (`AssetNameInvalidError`, `AssetPathTraversalError`, etc.).
14
+ * Callers that want to group all input-validation failures uniformly can
15
+ * still pattern-match on the base `AssetValidationError`.
16
+ */
17
+ import { AssetMimeMismatchError, AssetNameInvalidError, AssetNameReservedError, AssetPathTraversalError, AssetSizeExceededError, } from './errors.js';
18
+ /**
19
+ * Default per-asset upload size cap — 50 MB. Sites override per target
20
+ * via `targets.{name}.assets.maxBytes` in `site.yaml`. Targets that
21
+ * don't override get this value.
22
+ *
23
+ * Why a default at all (per Q5):
24
+ * - DoS / OOM bound: ingest buffers the full upload in memory today
25
+ * (`collectBytes` in ingest.ts). Concurrent uploads × cap = peak
26
+ * memory; without a cap, one careless or malicious client can
27
+ * exhaust the admin process.
28
+ * - Storage-cost protection: a 200 MB raw photo × variant ladder ×
29
+ * locale overrides quickly compounds. The cap forces explicit
30
+ * opt-in for unusual sizes.
31
+ * - Worker-tier ceiling: Cloudflare Workers Free/Pro have a 100 MB
32
+ * response body limit — a target on that tier can't serve assets
33
+ * above it via the worker. Sites should lower the cap below the
34
+ * worker tier they're on.
35
+ *
36
+ * 50 MB is conservative for image-only v1. Sites with raw-photo
37
+ * workflows (24-48 MP camera output) have headroom; sites on free
38
+ * worker tiers should reduce explicitly.
39
+ */
40
+ export const DEFAULT_ASSET_MAX_BYTES = 50 * 1024 * 1024;
41
+ /**
42
+ * @deprecated Renamed to `DEFAULT_ASSET_MAX_BYTES`. Use the per-target
43
+ * config (`targets.{name}.assets.maxBytes`) for site-specific limits;
44
+ * this constant is the fallback default. Kept exported until the next
45
+ * major version so external callers (tests, integrations) don't break.
46
+ */
47
+ export const ASSET_MAX_BYTES = DEFAULT_ASSET_MAX_BYTES;
48
+ /**
49
+ * v1 MIME allowlist. Image side: JPEG, PNG, SVG, GIF. Audio side:
50
+ * MP3, WAV, FLAC, Opus, AAC, M4A, OGG.
51
+ *
52
+ * - SVG is sanitized before persistence (`svg-sanitize.ts`)
53
+ * - GIF is checked for animation by `animatedImageAnalyzer`
54
+ * - Audio MIMEs are analyzed by `audioAnalyzer` for duration
55
+ * (`music-metadata`); personal-metadata stripping is a v1.5
56
+ * opt-in via a future preprocessor surface
57
+ *
58
+ * Animated WebP/AVIF, video, and documents widen via this set in
59
+ * v1.1+. The analyzer/preprocessor abstractions accommodate each
60
+ * format-specific need without orchestrator edits.
61
+ */
62
+ export const ALLOWED_MIMES = new Set([
63
+ // Images
64
+ 'image/jpeg',
65
+ 'image/png',
66
+ 'image/svg+xml',
67
+ 'image/gif',
68
+ // Audio
69
+ 'audio/mpeg',
70
+ 'audio/wav',
71
+ 'audio/x-wav',
72
+ 'audio/flac',
73
+ 'audio/x-flac',
74
+ 'audio/ogg',
75
+ 'audio/opus',
76
+ 'audio/aac',
77
+ 'audio/mp4',
78
+ 'audio/x-m4a',
79
+ ]);
80
+ /** Asset-name validation: lowercase ASCII-safe characters. */
81
+ const VALID_NAME = /^[a-z0-9][a-z0-9\-_]*(?:\.[a-z0-9]+)?$/;
82
+ /** Max chars per asset name. */
83
+ const MAX_NAME_LENGTH = 200;
84
+ /** Reserved name patterns — authors can't upload anything that would collide with internals. */
85
+ const RESERVED_PREFIXES = ['.', '_refs/', '.gazetta/'];
86
+ const RESERVED_SUFFIXES = ['.asset.json'];
87
+ /**
88
+ * Validate an upload candidate against the per-target policy. Throws
89
+ * the specific `AssetValidationError` subclass for the first failure
90
+ * encountered — policy enforces fail-fast so the HTTP route returns a
91
+ * single, specific reason to the client.
92
+ *
93
+ * `policy` is optional — callers that haven't migrated to per-target
94
+ * config get the default size cap. Once asset routes thread the
95
+ * target config through, `policy` is always present.
96
+ */
97
+ export function validateUpload(candidate, policy = {}) {
98
+ assertName(candidate.name);
99
+ assertSize(candidate.claimedSize, policy.maxBytes ?? DEFAULT_ASSET_MAX_BYTES);
100
+ assertMime(candidate.sniffedMime);
101
+ }
102
+ function assertName(name) {
103
+ if (name.length === 0 || name.length > MAX_NAME_LENGTH) {
104
+ throw new AssetNameInvalidError(name, `Asset name must be 1–${MAX_NAME_LENGTH} characters (got ${name.length})`);
105
+ }
106
+ // Path-traversal: `..`, leading `/`, or backslash anywhere
107
+ if (name.includes('..') || name.startsWith('/') || name.includes('\\')) {
108
+ throw new AssetPathTraversalError(name);
109
+ }
110
+ // Reserved prefixes and suffixes
111
+ for (const prefix of RESERVED_PREFIXES) {
112
+ if (name.startsWith(prefix)) {
113
+ throw new AssetNameReservedError(name, prefix, 'prefix');
114
+ }
115
+ }
116
+ for (const suffix of RESERVED_SUFFIXES) {
117
+ if (name.endsWith(suffix)) {
118
+ throw new AssetNameReservedError(name, suffix, 'suffix');
119
+ }
120
+ }
121
+ // Character rules (lowercase ASCII, digits, hyphens, underscores, optional extension)
122
+ if (!VALID_NAME.test(name)) {
123
+ throw new AssetNameInvalidError(name, `Asset name must be lowercase ASCII letters/digits/hyphens/underscores with optional extension: ${name}`);
124
+ }
125
+ }
126
+ function assertSize(claimedSize, maxBytes) {
127
+ if (claimedSize <= 0 || claimedSize > maxBytes) {
128
+ throw new AssetSizeExceededError(claimedSize, maxBytes);
129
+ }
130
+ }
131
+ function assertMime(sniffedMime) {
132
+ if (!sniffedMime || !ALLOWED_MIMES.has(sniffedMime)) {
133
+ throw new AssetMimeMismatchError(sniffedMime, [...ALLOWED_MIMES]);
134
+ }
135
+ }
136
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/assets/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /** The v1 srcset ladder. Ordered ascending — callers rely on this. */
2
+ export declare const VARIANT_WIDTHS: readonly number[];
3
+ export interface GeneratedVariant {
4
+ /** Target width this variant was rendered at. */
5
+ width: number;
6
+ /** The resized image bytes. */
7
+ bytes: Uint8Array;
8
+ }
9
+ /**
10
+ * Generate responsive variants from a source image buffer. Produces one
11
+ * variant per `VARIANT_WIDTHS` entry that is ≤ the source image's width.
12
+ *
13
+ * Same output format as the input (JPEG stays JPEG, PNG stays PNG) —
14
+ * re-compression is implicit via sharp's encoder, which applies its
15
+ * quality defaults. Explicit quality/compression tuning is deferred to
16
+ * a future image-pipeline config module.
17
+ *
18
+ * Throws whatever sharp throws on unreadable input — the caller is
19
+ * responsible for treating that as a hard ingest failure (per v1
20
+ * contract: rollback + fail the upload).
21
+ */
22
+ export declare function generateVariants(source: Uint8Array): Promise<GeneratedVariant[]>;
23
+ //# sourceMappingURL=variants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variants.d.ts","sourceRoot":"","sources":["../../src/assets/variants.ts"],"names":[],"mappings":"AAkBA,sEAAsE;AACtE,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAA2B,CAAA;AAEvE,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAA;IACb,+BAA+B;IAC/B,KAAK,EAAE,UAAU,CAAA;CAClB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAsBtF"}