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
package/dist/hash.d.ts CHANGED
@@ -1,19 +1,44 @@
1
1
  import type { FragmentManifest, PageManifest } from './types.js';
2
- export declare function sidecarNameFor(hash: string): string;
2
+ /** Build a hash sidecar filename, optionally locale-suffixed. */
3
+ export declare function sidecarNameFor(hash: string, locale?: string): string;
4
+ /** Parse a hash sidecar filename. Returns { hash, locale? } or null. */
3
5
  export declare function parseSidecarName(entryName: string): string | null;
6
+ /** Parse locale from a hash sidecar filename. */
7
+ export declare function parseSidecarLocale(entryName: string): string | undefined;
4
8
  /**
5
9
  * Filename-safe encoding for fragment/template names. Fragments can be
6
- * subfolder-qualified (e.g. "buttons/primary"); we replace / with __ so the
7
- * name works as a filename component and stays readable in listings.
10
+ * subfolder-qualified (e.g. "buttons/primary"); we replace `/` with `.`
11
+ * so the name works as a filename component and stays readable in
12
+ * listings.
13
+ *
14
+ * Why `.`: per operations.md, refs are lowercase-kebab-case — `.` is
15
+ * explicitly avoided in ref names ("confuses URL routing"), so using
16
+ * it as the path separator in encoded form is collision-free with
17
+ * the legal input alphabet (letters, digits, `-`, `_`, `/`).
18
+ *
19
+ * The prior `/` ↔ `__` scheme was ambiguous for any input containing
20
+ * `_` (a legitimate character in names like `my_fragment`) — a lone
21
+ * `_` adjacent to `/` encoded to `___` and decoded ambiguously.
22
+ *
23
+ * We reject `.` in inputs at encode time. It's already documented as
24
+ * off-limits in ref names; enforcing it here turns a silent
25
+ * round-trip bug into a loud error for anyone who tries.
8
26
  */
9
27
  export declare function encodeRefName(name: string): string;
10
28
  export declare function decodeRefName(name: string): string;
11
- /** `.uses-header` for a page/fragment that references @header. */
12
- export declare function usesSidecarNameFor(fragmentName: string): string;
13
- export declare function parseUsesSidecarName(entryName: string): string | null;
14
- /** `.tpl-page-default` for a page/fragment rendered with that template. */
15
- export declare function templateSidecarNameFor(templateName: string): string;
16
- export declare function parseTemplateSidecarName(entryName: string): string | null;
29
+ /** Compact ISO timestamp for `.pub-` sidecar filenames: `20260417T220000Z`. */
30
+ export declare function compactTimestamp(date?: Date): string;
31
+ /** Parse compact timestamp back to ISO string: `2026-04-17T22:00:00Z`. */
32
+ export declare function parseCompactTimestamp(compact: string): string;
33
+ export interface PubSidecar {
34
+ lastPublished: string;
35
+ noindex: boolean;
36
+ }
37
+ /** `.pub-20260417T220000Z`, `.pub-20260417T220000Z-noindex`, or `.pub-20260417T220000Z.fr` */
38
+ export declare function pubSidecarNameFor(date?: Date, noindex?: boolean, locale?: string): string;
39
+ export declare function parsePubSidecarName(entryName: string): PubSidecar | null;
40
+ /** Parse locale from a pub sidecar filename. */
41
+ export declare function parsePubSidecarLocale(entryName: string): string | undefined;
17
42
  export interface HashManifestOptions {
18
43
  templateHashes: Map<string, string>;
19
44
  /** Fragment content hashes — include only for static-mode page hashing. */
@@ -1 +1 @@
1
- {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAMhF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGjE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AACD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE/D;AACD,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGrE;AAED,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEnE;AACD,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGzE;AAmCD,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,2EAA2E;IAC3E,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACrC;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,YAAY,GAAG,gBAAgB,EACzC,IAAI,EAAE,mBAAmB,GACxB,MAAM,CASR"}
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAKhF,iEAAiE;AACjE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGjE;AAED,iDAAiD;AACjD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGxE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQlD;AACD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAKhE;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,IAAiB,EAAE,OAAO,UAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAGnG;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAOxE;AAED,gDAAgD;AAChD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG3E;AAmCD,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,2EAA2E;IAC3E,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACrC;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,gBAAgB,EAAE,IAAI,EAAE,mBAAmB,GAAG,MAAM,CASzG"}
package/dist/hash.js CHANGED
@@ -1,40 +1,79 @@
1
1
  import { createHash } from 'node:crypto';
2
- const SIDECAR_RE = /^\.([0-9a-f]{8})\.hash$/;
3
- const USES_SIDECAR_RE = /^\.uses-(.+)$/;
4
- const TPL_SIDECAR_RE = /^\.tpl-(.+)$/;
5
- export function sidecarNameFor(hash) {
6
- return `.${hash}.hash`;
2
+ const SIDECAR_RE = /^\.([0-9a-f]{8})\.hash(?:\.([a-z]{2}(?:-[a-z]+)?))?$/;
3
+ const PUB_SIDECAR_RE = /^\.pub-(\d{8}T\d{6}Z)(-noindex)?(?:\.([a-z]{2}(?:-[a-z]+)?))?$/;
4
+ /** Build a hash sidecar filename, optionally locale-suffixed. */
5
+ export function sidecarNameFor(hash, locale) {
6
+ return locale ? `.${hash}.hash.${locale}` : `.${hash}.hash`;
7
7
  }
8
+ /** Parse a hash sidecar filename. Returns { hash, locale? } or null. */
8
9
  export function parseSidecarName(entryName) {
9
10
  const m = SIDECAR_RE.exec(entryName);
10
11
  return m ? m[1] : null;
11
12
  }
13
+ /** Parse locale from a hash sidecar filename. */
14
+ export function parseSidecarLocale(entryName) {
15
+ const m = SIDECAR_RE.exec(entryName);
16
+ return m?.[2] ?? undefined;
17
+ }
12
18
  /**
13
19
  * Filename-safe encoding for fragment/template names. Fragments can be
14
- * subfolder-qualified (e.g. "buttons/primary"); we replace / with __ so the
15
- * name works as a filename component and stays readable in listings.
20
+ * subfolder-qualified (e.g. "buttons/primary"); we replace `/` with `.`
21
+ * so the name works as a filename component and stays readable in
22
+ * listings.
23
+ *
24
+ * Why `.`: per operations.md, refs are lowercase-kebab-case — `.` is
25
+ * explicitly avoided in ref names ("confuses URL routing"), so using
26
+ * it as the path separator in encoded form is collision-free with
27
+ * the legal input alphabet (letters, digits, `-`, `_`, `/`).
28
+ *
29
+ * The prior `/` ↔ `__` scheme was ambiguous for any input containing
30
+ * `_` (a legitimate character in names like `my_fragment`) — a lone
31
+ * `_` adjacent to `/` encoded to `___` and decoded ambiguously.
32
+ *
33
+ * We reject `.` in inputs at encode time. It's already documented as
34
+ * off-limits in ref names; enforcing it here turns a silent
35
+ * round-trip bug into a loud error for anyone who tries.
16
36
  */
17
37
  export function encodeRefName(name) {
18
- return name.replace(/\//g, '__');
38
+ if (name.includes('.')) {
39
+ throw new Error(`Invalid reference name "${name}": dot is reserved for path encoding. ` +
40
+ `Use lowercase-kebab-case with / for subfolders (e.g. "buttons/primary").`);
41
+ }
42
+ return name.replace(/\//g, '.');
19
43
  }
20
44
  export function decodeRefName(name) {
21
- return name.replace(/__/g, '/');
45
+ return name.replace(/\./g, '/');
22
46
  }
23
- /** `.uses-header` for a page/fragment that references @header. */
24
- export function usesSidecarNameFor(fragmentName) {
25
- return `.uses-${encodeRefName(fragmentName)}`;
47
+ /** Compact ISO timestamp for `.pub-` sidecar filenames: `20260417T220000Z`. */
48
+ export function compactTimestamp(date = new Date()) {
49
+ return date
50
+ .toISOString()
51
+ .replace(/[-:]/g, '')
52
+ .replace(/\.\d{3}/, '');
26
53
  }
27
- export function parseUsesSidecarName(entryName) {
28
- const m = USES_SIDECAR_RE.exec(entryName);
29
- return m ? decodeRefName(m[1]) : null;
54
+ /** Parse compact timestamp back to ISO string: `2026-04-17T22:00:00Z`. */
55
+ export function parseCompactTimestamp(compact) {
56
+ // 20260417T220000Z 2026-04-17T22:00:00Z
57
+ return `${compact.slice(0, 4)}-${compact.slice(4, 6)}-${compact.slice(6, 8)}T${compact.slice(9, 11)}:${compact.slice(11, 13)}:${compact.slice(13, 15)}Z`;
30
58
  }
31
- /** `.tpl-page-default` for a page/fragment rendered with that template. */
32
- export function templateSidecarNameFor(templateName) {
33
- return `.tpl-${encodeRefName(templateName)}`;
59
+ /** `.pub-20260417T220000Z`, `.pub-20260417T220000Z-noindex`, or `.pub-20260417T220000Z.fr` */
60
+ export function pubSidecarNameFor(date = new Date(), noindex = false, locale) {
61
+ const base = `.pub-${compactTimestamp(date)}${noindex ? '-noindex' : ''}`;
62
+ return locale ? `${base}.${locale}` : base;
63
+ }
64
+ export function parsePubSidecarName(entryName) {
65
+ const m = PUB_SIDECAR_RE.exec(entryName);
66
+ if (!m)
67
+ return null;
68
+ return {
69
+ lastPublished: parseCompactTimestamp(m[1]),
70
+ noindex: !!m[2],
71
+ };
34
72
  }
35
- export function parseTemplateSidecarName(entryName) {
36
- const m = TPL_SIDECAR_RE.exec(entryName);
37
- return m ? decodeRefName(m[1]) : null;
73
+ /** Parse locale from a pub sidecar filename. */
74
+ export function parsePubSidecarLocale(entryName) {
75
+ const m = PUB_SIDECAR_RE.exec(entryName);
76
+ return m?.[3] ?? undefined;
38
77
  }
39
78
  /**
40
79
  * Walk the component tree and substitute template/fragment refs with their
package/dist/hash.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * HistoryProvider implementation on top of any StorageProvider.
3
+ *
4
+ * Layout per target (inside `.gazetta/history/` under the target's
5
+ * storage root):
6
+ *
7
+ * index.json { nextId: N, revisions: ['rev-0001', ...] }
8
+ * revisions/rev-NNNN.json one manifest per revision — metadata +
9
+ * items map (itemPath → blob hash)
10
+ * objects/<hh>/<rest> content-addressed blobs (SHA-256, sharded
11
+ * by first 2 hex chars)
12
+ *
13
+ * Design-decisions.md #18:
14
+ * - One uniform approach across all providers (no native versioning).
15
+ * - Content-addressed blobs → unchanged items share storage across
16
+ * revisions; storage scales with unique content, not revision count.
17
+ * - Soft undo only — every restore writes a new forward revision.
18
+ * - Retention default 50; oldest evicted on write.
19
+ *
20
+ * SRP: this module owns .gazetta/history/ layout and retention. Nothing
21
+ * else. The write pipeline (save/publish) calls `recordRevision`; undo/
22
+ * rollback call `readRevision` + `readBlob`. Restore happens outside —
23
+ * this module doesn't touch the content tree.
24
+ */
25
+ import type { StorageProvider } from './types.js';
26
+ import type { HistoryProvider } from './history.js';
27
+ export interface CreateHistoryProviderOptions {
28
+ /** Storage under which `.gazetta/history/` lives. Usually the target's storage. */
29
+ storage: StorageProvider;
30
+ /**
31
+ * Path prefix where history lives. Default: `.gazetta/history`. Callers
32
+ * with a rooted storage (filesystem target with `path:`) pass the
33
+ * default; anything more exotic (e.g. history under a sub-prefix)
34
+ * overrides.
35
+ */
36
+ rootPath?: string;
37
+ /**
38
+ * Maximum number of revisions to keep; older ones evicted on write.
39
+ * Default: `DEFAULT_HISTORY_RETENTION` (50). Pass < 1 → clamped to 1
40
+ * (zero retention would self-evict every write).
41
+ */
42
+ retention?: number;
43
+ }
44
+ /**
45
+ * Build a HistoryProvider backed by the given storage. No I/O happens
46
+ * at construction time — everything is lazy on first call.
47
+ */
48
+ export declare function createHistoryProvider(opts: CreateHistoryProviderOptions): HistoryProvider;
49
+ //# sourceMappingURL=history-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-provider.d.ts","sourceRoot":"","sources":["../src/history-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,KAAK,EAAe,eAAe,EAA6C,MAAM,cAAc,CAAA;AAG3G,MAAM,WAAW,4BAA4B;IAC3C,mFAAmF;IACnF,OAAO,EAAE,eAAe,CAAA;IACxB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAgBD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,4BAA4B,GAAG,eAAe,CA6NzF"}
@@ -0,0 +1,248 @@
1
+ /**
2
+ * HistoryProvider implementation on top of any StorageProvider.
3
+ *
4
+ * Layout per target (inside `.gazetta/history/` under the target's
5
+ * storage root):
6
+ *
7
+ * index.json { nextId: N, revisions: ['rev-0001', ...] }
8
+ * revisions/rev-NNNN.json one manifest per revision — metadata +
9
+ * items map (itemPath → blob hash)
10
+ * objects/<hh>/<rest> content-addressed blobs (SHA-256, sharded
11
+ * by first 2 hex chars)
12
+ *
13
+ * Design-decisions.md #18:
14
+ * - One uniform approach across all providers (no native versioning).
15
+ * - Content-addressed blobs → unchanged items share storage across
16
+ * revisions; storage scales with unique content, not revision count.
17
+ * - Soft undo only — every restore writes a new forward revision.
18
+ * - Retention default 50; oldest evicted on write.
19
+ *
20
+ * SRP: this module owns .gazetta/history/ layout and retention. Nothing
21
+ * else. The write pipeline (save/publish) calls `recordRevision`; undo/
22
+ * rollback call `readRevision` + `readBlob`. Restore happens outside —
23
+ * this module doesn't touch the content tree.
24
+ */
25
+ import { createHash } from 'node:crypto';
26
+ import { DEFAULT_HISTORY_RETENTION } from './types.js';
27
+ /**
28
+ * Build a HistoryProvider backed by the given storage. No I/O happens
29
+ * at construction time — everything is lazy on first call.
30
+ */
31
+ export function createHistoryProvider(opts) {
32
+ const { storage } = opts;
33
+ const root = opts.rootPath ?? '.gazetta/history';
34
+ const retention = Math.max(1, opts.retention ?? DEFAULT_HISTORY_RETENTION);
35
+ const indexPath = join(root, 'index.json');
36
+ /** Read the index or return an empty one if it doesn't exist yet. */
37
+ async function readIndex() {
38
+ if (!(await storage.exists(indexPath))) {
39
+ return { revisions: [] };
40
+ }
41
+ const parsed = JSON.parse(await storage.readFile(indexPath));
42
+ // Forward-compat: tolerate legacy `nextId` by ignoring it. Old indexes
43
+ // (from the numeric-id era) continue to read cleanly, new writes use
44
+ // the timestamp scheme. No migration pass needed — retention naturally
45
+ // evicts the legacy ids over time.
46
+ return { revisions: parsed.revisions ?? [] };
47
+ }
48
+ /**
49
+ * Ensure the parent directory exists before writing. Object-store
50
+ * providers (R2, S3) ignore mkdir. Filesystem requires it because
51
+ * `writeFile` fails on missing parents, and our sharded blob paths
52
+ * (objects/<hh>/<rest>) plus revisions/rev-NNNN.json live in dirs
53
+ * that don't exist until the first write.
54
+ */
55
+ async function writeWithParents(path, content) {
56
+ const parent = path.substring(0, path.lastIndexOf('/'));
57
+ if (parent)
58
+ await storage.mkdir(parent);
59
+ await storage.writeFile(path, content);
60
+ }
61
+ async function writeIndex(idx) {
62
+ await writeWithParents(indexPath, JSON.stringify(idx, null, 2) + '\n');
63
+ }
64
+ function blobPath(hash) {
65
+ // Shard by first two hex chars — keeps any one `objects/` subdirectory
66
+ // from ballooning past a few thousand entries on large sites.
67
+ return join(root, 'objects', hash.slice(0, 2), hash.slice(2));
68
+ }
69
+ function revisionPath(id) {
70
+ return join(root, 'revisions', `${id}.json`);
71
+ }
72
+ /**
73
+ * SHA-256 hex of the content. Strong enough that collisions can be
74
+ * ignored for practical purposes (blob identity), cheap enough at
75
+ * our scale (tens of KB per item, hundreds of items per revision).
76
+ *
77
+ * Accepts both text and bytes per Q9 lock. Text encodes UTF-8 first
78
+ * — matches the bytes that would be written through `writeFile`,
79
+ * so a string blob and a `Uint8Array` of its UTF-8 encoding hash
80
+ * to the same value (and dedupe correctly).
81
+ */
82
+ function hashContent(content) {
83
+ const bytes = content instanceof Uint8Array ? content : Buffer.from(content, 'utf-8');
84
+ return createHash('sha256').update(bytes).digest('hex');
85
+ }
86
+ /**
87
+ * Allocate a fresh revision id. Scheme: `rev-<unixMillis>`, with a
88
+ * `-<seq>` suffix on same-millisecond collisions ("rev-1760...050",
89
+ * "rev-1760...050-2", ...). Collision tracking uses the current
90
+ * index's revisions list — assumes no concurrent writers against
91
+ * the same target (already true: Gazetta never has two admins
92
+ * writing the same target's history simultaneously).
93
+ *
94
+ * Why millis + suffix rather than a monotonic counter:
95
+ * - Retention evictions leave you with a window of revisions you
96
+ * can date-read from the filename alone.
97
+ * - No counter to overflow or reset when history is disabled then
98
+ * re-enabled.
99
+ * - Lex-sort = chrono sort (13-digit ms are fixed-width through
100
+ * year 5138 AD).
101
+ *
102
+ * `_clock` is injectable for deterministic tests — production uses
103
+ * Date.now(). Stays private to createHistoryProvider.
104
+ */
105
+ function formatId(existing, now) {
106
+ const base = `rev-${now}`;
107
+ if (!existing.some(id => id === base || id.startsWith(`${base}-`)))
108
+ return base;
109
+ // Same-millisecond collision: bump the suffix. Start from 2 so the
110
+ // first duplicate gets `-2` (matches the mental model "base, then
111
+ // the second, then the third").
112
+ let seq = 2;
113
+ while (existing.includes(`${base}-${seq}`))
114
+ seq += 1;
115
+ return `${base}-${seq}`;
116
+ }
117
+ /**
118
+ * Write any blob that's not already stored. Returns the hash. Dedup
119
+ * check is a single `exists()` — cheaper than reading the existing
120
+ * blob to confirm equal content (hashes collide vanishingly).
121
+ *
122
+ * Always goes through `writeBytes` — text content is encoded UTF-8
123
+ * first. Uniform bytes-in / bytes-out means binary blobs (asset
124
+ * bytes, variants, fonts) round-trip without a string detour, and
125
+ * text blobs round-trip through their UTF-8 encoding (same bytes
126
+ * `writeFile` would have stored).
127
+ */
128
+ async function writeBlob(content) {
129
+ const hash = hashContent(content);
130
+ const path = blobPath(hash);
131
+ if (await storage.exists(path))
132
+ return hash;
133
+ const parent = path.substring(0, path.lastIndexOf('/'));
134
+ if (parent)
135
+ await storage.mkdir(parent);
136
+ const bytes = content instanceof Uint8Array ? content : Buffer.from(content, 'utf-8');
137
+ await storage.writeBytes(path, bytes);
138
+ return hash;
139
+ }
140
+ async function recordRevision(input) {
141
+ const idx = await readIndex();
142
+ const id = formatId(idx.revisions, Date.now());
143
+ // Write blobs (dedup via content-addressing) and build the
144
+ // path → hash snapshot.
145
+ const snapshot = {};
146
+ // Deterministic order so rev manifests diff cleanly on inspection.
147
+ const sortedEntries = [...input.items.entries()].sort((a, b) => a[0].localeCompare(b[0]));
148
+ for (const [path, content] of sortedEntries) {
149
+ snapshot[path] = await writeBlob(content);
150
+ }
151
+ const manifest = {
152
+ id,
153
+ timestamp: new Date().toISOString(),
154
+ operation: input.operation,
155
+ author: input.author,
156
+ source: input.source,
157
+ items: [...input.items.keys()].sort(),
158
+ message: input.message,
159
+ restoredFrom: input.restoredFrom,
160
+ snapshot,
161
+ };
162
+ await writeWithParents(revisionPath(id), JSON.stringify(manifest, null, 2) + '\n');
163
+ // Update the index (append) then apply retention. Do the index
164
+ // write last so a mid-write failure leaves orphan blobs and an
165
+ // orphan manifest (both harmless) rather than a dangling index
166
+ // entry pointing at a missing manifest.
167
+ idx.revisions.push(id);
168
+ await writeIndex(idx);
169
+ await applyRetention(idx);
170
+ // Return the public Revision shape (no snapshot).
171
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
172
+ const { snapshot: _snapshot, ...revision } = manifest;
173
+ return revision;
174
+ }
175
+ /**
176
+ * Evict oldest revisions to fit `retention`. Deletes manifests; blobs
177
+ * become eligible for GC if no remaining revision references them.
178
+ * GC is lazy — blob files stay until an explicit GC pass, which is
179
+ * fine for v1 (disk is cheap; a future `gazetta gc` command can walk
180
+ * all manifests and prune orphans).
181
+ */
182
+ async function applyRetention(idx) {
183
+ const excess = idx.revisions.length - retention;
184
+ if (excess <= 0)
185
+ return;
186
+ const toEvict = idx.revisions.slice(0, excess);
187
+ idx.revisions = idx.revisions.slice(excess);
188
+ for (const id of toEvict) {
189
+ const path = revisionPath(id);
190
+ if (await storage.exists(path))
191
+ await storage.rm(path);
192
+ }
193
+ await writeIndex(idx);
194
+ }
195
+ async function listRevisions(limit) {
196
+ const idx = await readIndex();
197
+ const ids = [...idx.revisions].reverse(); // newest first
198
+ const sliced = typeof limit === 'number' ? ids.slice(0, limit) : ids;
199
+ // Read manifests in parallel; strip snapshot for the summary list.
200
+ return Promise.all(sliced.map(async (id) => {
201
+ const m = await readManifest(id);
202
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
203
+ const { snapshot: _snapshot, ...rev } = m;
204
+ return rev;
205
+ }));
206
+ }
207
+ async function readManifest(id) {
208
+ return JSON.parse(await storage.readFile(revisionPath(id)));
209
+ }
210
+ async function readRevision(id) {
211
+ return readManifest(id);
212
+ }
213
+ async function readBlob(hash) {
214
+ // Bytes-in / bytes-out — binary blobs (asset bytes, variants,
215
+ // fonts) round-trip without a string-decode detour; text blobs
216
+ // (manifests, YAML, etc.) come back as their UTF-8 byte form
217
+ // and callers that expect text decode at the boundary.
218
+ return storage.readBytes(blobPath(hash));
219
+ }
220
+ async function deleteRevision(id) {
221
+ const idx = await readIndex();
222
+ const at = idx.revisions.indexOf(id);
223
+ if (at === -1)
224
+ return;
225
+ idx.revisions.splice(at, 1);
226
+ await writeIndex(idx);
227
+ const path = revisionPath(id);
228
+ if (await storage.exists(path))
229
+ await storage.rm(path);
230
+ // Orphan blobs left for lazy GC — see applyRetention rationale.
231
+ }
232
+ return {
233
+ recordRevision,
234
+ listRevisions,
235
+ readRevision,
236
+ readBlob,
237
+ deleteRevision,
238
+ };
239
+ }
240
+ /**
241
+ * `posix.join` behavior without importing it — keeps the module self-
242
+ * contained and works identically across platforms. Storage providers
243
+ * normalize separators internally, but our stored paths are POSIX.
244
+ */
245
+ function join(...parts) {
246
+ return parts.filter(Boolean).join('/').replace(/\/+/g, '/');
247
+ }
248
+ //# sourceMappingURL=history-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-provider.js","sourceRoot":"","sources":["../src/history-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAGxC,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAkCtD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAkC;IACtE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,IAAI,kBAAkB,CAAA;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,IAAI,yBAAyB,CAAC,CAAA;IAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;IAE1C,qEAAqE;IACrE,KAAK,UAAU,SAAS;QACtB,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YACvC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAA;QAC1B,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAuC,CAAA;QAClG,uEAAuE;QACvE,qEAAqE;QACrE,uEAAuE;QACvE,mCAAmC;QACnC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,CAAA;IAC9C,CAAC;IAED;;;;;;OAMG;IACH,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,OAAe;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAA;QACvD,IAAI,MAAM;YAAE,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACxC,CAAC;IAED,KAAK,UAAU,UAAU,CAAC,GAAiB;QACzC,MAAM,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IACxE,CAAC;IAED,SAAS,QAAQ,CAAC,IAAY;QAC5B,uEAAuE;QACvE,8DAA8D;QAC9D,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/D,CAAC;IAED,SAAS,YAAY,CAAC,EAAU;QAC9B,OAAO,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;IAC9C,CAAC;IAED;;;;;;;;;OASG;IACH,SAAS,WAAW,CAAC,OAAoB;QACvC,MAAM,KAAK,GAAG,OAAO,YAAY,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACrF,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACzD,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,SAAS,QAAQ,CAAC,QAA2B,EAAE,GAAW;QACxD,MAAM,IAAI,GAAG,OAAO,GAAG,EAAE,CAAA;QACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;QAC/E,mEAAmE;QACnE,kEAAkE;QAClE,gCAAgC;QAChC,IAAI,GAAG,GAAG,CAAC,CAAA;QACX,OAAO,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC;YAAE,GAAG,IAAI,CAAC,CAAA;QACpD,OAAO,GAAG,IAAI,IAAI,GAAG,EAAE,CAAA;IACzB,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,UAAU,SAAS,CAAC,OAAoB;QAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;QACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC3B,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAA;QACvD,IAAI,MAAM;YAAE,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,KAAK,GAAG,OAAO,YAAY,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACrF,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACrC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,UAAU,cAAc,CAAC,KAAoB;QAChD,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAA;QAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;QAE9C,2DAA2D;QAC3D,wBAAwB;QACxB,MAAM,QAAQ,GAA2B,EAAE,CAAA;QAC3C,mEAAmE;QACnE,MAAM,aAAa,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACzF,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,aAAa,EAAE,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAA;QAC3C,CAAC;QAED,MAAM,QAAQ,GAAqB;YACjC,EAAE;YACF,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YACrC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,QAAQ;SACT,CAAA;QACD,MAAM,gBAAgB,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;QAElF,+DAA+D;QAC/D,+DAA+D;QAC/D,+DAA+D;QAC/D,wCAAwC;QACxC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACtB,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;QACrB,MAAM,cAAc,CAAC,GAAG,CAAC,CAAA;QAEzB,kDAAkD;QAClD,6DAA6D;QAC7D,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAA;QACrD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,UAAU,cAAc,CAAC,GAAiB;QAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,CAAA;QAC/C,IAAI,MAAM,IAAI,CAAC;YAAE,OAAM;QACvB,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QAC9C,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAC3C,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,CAAC,CAAA;YAC7B,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;gBAAE,MAAM,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QACxD,CAAC;QACD,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IAED,KAAK,UAAU,aAAa,CAAC,KAAc;QACzC,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAA;QAC7B,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAA,CAAC,eAAe;QACxD,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QACpE,mEAAmE;QACnE,OAAO,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAC,EAAE,EAAC,EAAE;YACpB,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC,EAAE,CAAC,CAAA;YAChC,6DAA6D;YAC7D,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,CAAA;YACzC,OAAO,GAAG,CAAA;QACZ,CAAC,CAAC,CACH,CAAA;IACH,CAAC;IAED,KAAK,UAAU,YAAY,CAAC,EAAU;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAqB,CAAA;IACjF,CAAC;IAED,KAAK,UAAU,YAAY,CAAC,EAAU;QACpC,OAAO,YAAY,CAAC,EAAE,CAAC,CAAA;IACzB,CAAC;IAED,KAAK,UAAU,QAAQ,CAAC,IAAY;QAClC,8DAA8D;QAC9D,+DAA+D;QAC/D,6DAA6D;QAC7D,uDAAuD;QACvD,OAAO,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;IAC1C,CAAC;IAED,KAAK,UAAU,cAAc,CAAC,EAAU;QACtC,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAA;QAC7B,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACpC,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,OAAM;QACrB,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QAC3B,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;QACrB,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,CAAC,CAAA;QAC7B,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,MAAM,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QACtD,gEAAgE;IAClE,CAAC;IAED,OAAO;QACL,cAAc;QACd,aAAa;QACb,YAAY;QACZ,QAAQ;QACR,cAAc;KACf,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,IAAI,CAAC,GAAG,KAAe;IAC9B,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAC7D,CAAC"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Higher-level helper for recording revisions on a target.
3
+ *
4
+ * The bare `HistoryProvider.recordRevision` takes a full
5
+ * `items: Map<path, content>` snapshot. That's fine for testing but
6
+ * wasteful at runtime: every save of one page would re-hash and
7
+ * re-list every page + fragment on the target. This helper does the
8
+ * right thing:
9
+ *
10
+ * - First revision on a target: walks the content tree once to
11
+ * snapshot every manifest (page.json, fragment.json, site.yaml).
12
+ * - Subsequent revisions: reads the previous snapshot and overlays
13
+ * the delta (changed items the caller passes in). `readBlob` for
14
+ * each carried-over path gives us the content for the new
15
+ * revision's items map — at which point `recordRevision` dedupes
16
+ * the unchanged blobs via content-addressing, so no new storage.
17
+ *
18
+ * SRP: this module owns the "what goes in a revision snapshot"
19
+ * decision. `HistoryProvider` owns layout. Callers (admin-api save /
20
+ * admin-api publish / CLI publish) just describe *what they wrote*
21
+ * and we construct the revision.
22
+ */
23
+ import type { BlobContent, HistoryProvider, RevisionOperation } from './history.js';
24
+ import type { ContentRoot } from './content-root.js';
25
+ /** A single item that was written in this save/publish. */
26
+ export interface WrittenItem {
27
+ /** Path relative to the content root, e.g. `pages/home/page.json`. */
28
+ path: string;
29
+ /**
30
+ * Current content as stored. `string` for text items (manifests,
31
+ * YAML), `Uint8Array` for binary items (asset bytes, variants).
32
+ * `null` marks a deletion.
33
+ */
34
+ content: BlobContent | null;
35
+ }
36
+ /**
37
+ * Location to scan when building the first revision's baseline
38
+ * snapshot. Each entry names a directory under the content root and
39
+ * the manifest filename to capture from every subdirectory.
40
+ */
41
+ export interface ScanLocation {
42
+ /** Directory relative to the content root, e.g. `pages` or `fragments`. */
43
+ dir: string;
44
+ /** Manifest filename to capture, e.g. `page.json` or `fragment.json`. */
45
+ manifest: string;
46
+ }
47
+ /**
48
+ * Built-in content locations Gazetta knows about today. Callers can
49
+ * pass a superset (e.g. for future data/*, templates/*) — the list is
50
+ * part of `RecordWriteOptions` so this module stays open for extension
51
+ * without changes when new content kinds land.
52
+ */
53
+ export declare const DEFAULT_SCAN_LOCATIONS: readonly ScanLocation[];
54
+ /**
55
+ * Flat files at the content root to capture in the baseline snapshot
56
+ * (no per-subdirectory recursion). `site.yaml` is the only one today.
57
+ */
58
+ export declare const DEFAULT_SCAN_ROOT_FILES: readonly string[];
59
+ export interface RecordWriteOptions {
60
+ /** HistoryProvider for the target we're recording on. */
61
+ history: HistoryProvider;
62
+ /** Content root of the target — used to scan on first revision. */
63
+ contentRoot: ContentRoot;
64
+ operation: RevisionOperation;
65
+ /** Items the save/publish wrote (and optionally deleted). */
66
+ items: WrittenItem[];
67
+ /** Author identifier passed through to the manifest. */
68
+ author?: string;
69
+ /** Source target name (for publish). */
70
+ source?: string;
71
+ /** Optional human-readable note. */
72
+ message?: string;
73
+ /** For rollback/restore: the revision id this one restored from. */
74
+ restoredFrom?: string;
75
+ /**
76
+ * Override the directories walked during the first-revision baseline
77
+ * scan. Defaults to `DEFAULT_SCAN_LOCATIONS` (pages + fragments).
78
+ * Pass a superset if the site has extra authored content (e.g.
79
+ * custom `data/*.json` dirs); pass `[]` to skip directory scanning
80
+ * entirely (only root files + explicit items are captured).
81
+ */
82
+ scanLocations?: readonly ScanLocation[];
83
+ /**
84
+ * Override the flat files captured from the content root. Defaults
85
+ * to `DEFAULT_SCAN_ROOT_FILES` (`site.yaml`). Missing files are
86
+ * silently skipped so empty publish-targets still record cleanly.
87
+ */
88
+ scanRootFiles?: readonly string[];
89
+ }
90
+ /**
91
+ * Build + record a revision for the given write. Reads the previous
92
+ * snapshot (if any), overlays the delta, and calls
93
+ * `history.recordRevision`. Returns the recorded Revision.
94
+ *
95
+ * Callers are expected to have already written the items to the
96
+ * target's storage before invoking this; the recorder reads back via
97
+ * the HistoryProvider's dedup path (blobs it has already seen just
98
+ * `exists()` and skip) so the happy path is cheap on repeated saves
99
+ * of the same item.
100
+ */
101
+ export declare function recordWrite(opts: RecordWriteOptions): Promise<import("./history.js").Revision>;
102
+ //# sourceMappingURL=history-recorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-recorder.d.ts","sourceRoot":"","sources":["../src/history-recorder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAiB,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAClG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,OAAO,EAAE,WAAW,GAAG,IAAI,CAAA;CAC5B;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,2EAA2E;IAC3E,GAAG,EAAE,MAAM,CAAA;IACX,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,YAAY,EAGzD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EAAkB,CAAA;AAEvE,MAAM,WAAW,kBAAkB;IACjC,yDAAyD;IACzD,OAAO,EAAE,eAAe,CAAA;IACxB,mEAAmE;IACnE,WAAW,EAAE,WAAW,CAAA;IACxB,SAAS,EAAE,iBAAiB,CAAA;IAC5B,6DAA6D;IAC7D,KAAK,EAAE,WAAW,EAAE,CAAA;IACpB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,SAAS,YAAY,EAAE,CAAA;IACvC;;;;OAIG;IACH,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAClC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,kBAAkB,4CAmCzD"}