gazetta 0.6.0 → 0.8.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 (983) hide show
  1. package/admin-dist/assets/index-CBeq0rRb.js +693 -0
  2. package/admin-dist/assets/index-Dtg1dTZQ.css +1 -0
  3. package/admin-dist/assets/rolldown-runtime-BYbx6iT9.js +1 -0
  4. package/admin-dist/assets/{vendor-primevue-C0Q_YTCb.js → vendor-primevue-CBGHkaXv.js} +183 -39
  5. package/admin-dist/assets/{vendor-react-BipDVGow.js → vendor-react-BdW_kNCG.js} +2 -2
  6. package/admin-dist/assets/vendor-rjsf-lN2SztQt.js +33 -0
  7. package/admin-dist/assets/vendor-tiptap-C36yDquB.js +141 -0
  8. package/admin-dist/assets/vendor-vue-Bt5uR1VW.js +1 -0
  9. package/admin-dist/assets/workbox-window.prod.es5-DGMtIXHc.js +2 -0
  10. package/admin-dist/index.html +8 -8
  11. package/admin-dist/sw.js +1 -0
  12. package/dist/admin-api/archived-name-conflict.d.ts +31 -0
  13. package/dist/admin-api/archived-name-conflict.d.ts.map +1 -0
  14. package/dist/admin-api/archived-name-conflict.js +226 -0
  15. package/dist/admin-api/archived-name-conflict.js.map +1 -0
  16. package/dist/admin-api/cache-stats-logger.d.ts +83 -0
  17. package/dist/admin-api/cache-stats-logger.d.ts.map +1 -0
  18. package/dist/admin-api/cache-stats-logger.js +59 -0
  19. package/dist/admin-api/cache-stats-logger.js.map +1 -0
  20. package/dist/admin-api/error-response.d.ts +21 -0
  21. package/dist/admin-api/error-response.d.ts.map +1 -0
  22. package/dist/admin-api/error-response.js +12 -0
  23. package/dist/admin-api/error-response.js.map +1 -0
  24. package/dist/admin-api/hook-audit-emitter.d.ts +38 -0
  25. package/dist/admin-api/hook-audit-emitter.d.ts.map +1 -0
  26. package/dist/admin-api/hook-audit-emitter.js +21 -0
  27. package/dist/admin-api/hook-audit-emitter.js.map +1 -0
  28. package/dist/admin-api/index.d.ts +84 -2
  29. package/dist/admin-api/index.d.ts.map +1 -1
  30. package/dist/admin-api/index.js +257 -32
  31. package/dist/admin-api/index.js.map +1 -1
  32. package/dist/admin-api/middleware/audit.d.ts +25 -0
  33. package/dist/admin-api/middleware/audit.d.ts.map +1 -0
  34. package/dist/admin-api/middleware/audit.js +65 -0
  35. package/dist/admin-api/middleware/audit.js.map +1 -0
  36. package/dist/admin-api/middleware/capability.d.ts +8 -0
  37. package/dist/admin-api/middleware/capability.d.ts.map +1 -0
  38. package/dist/admin-api/middleware/capability.js +65 -0
  39. package/dist/admin-api/middleware/capability.js.map +1 -0
  40. package/dist/admin-api/middleware/principal.d.ts +18 -0
  41. package/dist/admin-api/middleware/principal.d.ts.map +1 -0
  42. package/dist/admin-api/middleware/principal.js +128 -0
  43. package/dist/admin-api/middleware/principal.js.map +1 -0
  44. package/dist/admin-api/routes/archive-review.d.ts +80 -0
  45. package/dist/admin-api/routes/archive-review.d.ts.map +1 -0
  46. package/dist/admin-api/routes/archive-review.js +70 -0
  47. package/dist/admin-api/routes/archive-review.js.map +1 -0
  48. package/dist/admin-api/routes/archive.d.ts +145 -0
  49. package/dist/admin-api/routes/archive.d.ts.map +1 -0
  50. package/dist/admin-api/routes/archive.js +540 -0
  51. package/dist/admin-api/routes/archive.js.map +1 -0
  52. package/dist/admin-api/routes/assets.d.ts +21 -0
  53. package/dist/admin-api/routes/assets.d.ts.map +1 -0
  54. package/dist/admin-api/routes/assets.js +586 -0
  55. package/dist/admin-api/routes/assets.js.map +1 -0
  56. package/dist/admin-api/routes/audit.d.ts +71 -0
  57. package/dist/admin-api/routes/audit.d.ts.map +1 -0
  58. package/dist/admin-api/routes/audit.js +178 -0
  59. package/dist/admin-api/routes/audit.js.map +1 -0
  60. package/dist/admin-api/routes/compare.d.ts.map +1 -1
  61. package/dist/admin-api/routes/compare.js +3 -2
  62. package/dist/admin-api/routes/compare.js.map +1 -1
  63. package/dist/admin-api/routes/fields.d.ts.map +1 -1
  64. package/dist/admin-api/routes/fields.js +2 -1
  65. package/dist/admin-api/routes/fields.js.map +1 -1
  66. package/dist/admin-api/routes/fragments.d.ts +13 -1
  67. package/dist/admin-api/routes/fragments.d.ts.map +1 -1
  68. package/dist/admin-api/routes/fragments.js +128 -67
  69. package/dist/admin-api/routes/fragments.js.map +1 -1
  70. package/dist/admin-api/routes/health.d.ts +60 -0
  71. package/dist/admin-api/routes/health.d.ts.map +1 -0
  72. package/dist/admin-api/routes/health.js +65 -0
  73. package/dist/admin-api/routes/health.js.map +1 -0
  74. package/dist/admin-api/routes/history.d.ts +2 -1
  75. package/dist/admin-api/routes/history.d.ts.map +1 -1
  76. package/dist/admin-api/routes/history.js +26 -4
  77. package/dist/admin-api/routes/history.js.map +1 -1
  78. package/dist/admin-api/routes/pages.d.ts +20 -1
  79. package/dist/admin-api/routes/pages.d.ts.map +1 -1
  80. package/dist/admin-api/routes/pages.js +158 -85
  81. package/dist/admin-api/routes/pages.js.map +1 -1
  82. package/dist/admin-api/routes/preview.d.ts.map +1 -1
  83. package/dist/admin-api/routes/preview.js +56 -17
  84. package/dist/admin-api/routes/preview.js.map +1 -1
  85. package/dist/admin-api/routes/publish.d.ts +19 -1
  86. package/dist/admin-api/routes/publish.d.ts.map +1 -1
  87. package/dist/admin-api/routes/publish.js +548 -99
  88. package/dist/admin-api/routes/publish.js.map +1 -1
  89. package/dist/admin-api/routes/rename.d.ts +62 -0
  90. package/dist/admin-api/routes/rename.d.ts.map +1 -0
  91. package/dist/admin-api/routes/rename.js +366 -0
  92. package/dist/admin-api/routes/rename.js.map +1 -0
  93. package/dist/admin-api/routes/site.d.ts.map +1 -1
  94. package/dist/admin-api/routes/site.js +6 -18
  95. package/dist/admin-api/routes/site.js.map +1 -1
  96. package/dist/admin-api/routes/system.d.ts +23 -0
  97. package/dist/admin-api/routes/system.d.ts.map +1 -0
  98. package/dist/admin-api/routes/system.js +115 -0
  99. package/dist/admin-api/routes/system.js.map +1 -0
  100. package/dist/admin-api/routes/templates.d.ts +11 -1
  101. package/dist/admin-api/routes/templates.d.ts.map +1 -1
  102. package/dist/admin-api/routes/templates.js +36 -3
  103. package/dist/admin-api/routes/templates.js.map +1 -1
  104. package/dist/admin-api/routes/validation.d.ts +47 -0
  105. package/dist/admin-api/routes/validation.d.ts.map +1 -0
  106. package/dist/admin-api/routes/validation.js +120 -0
  107. package/dist/admin-api/routes/validation.js.map +1 -0
  108. package/dist/admin-api/schemas/archive.d.ts +124 -0
  109. package/dist/admin-api/schemas/archive.d.ts.map +1 -0
  110. package/dist/admin-api/schemas/archive.js +93 -0
  111. package/dist/admin-api/schemas/archive.js.map +1 -0
  112. package/dist/admin-api/schemas/assets.d.ts +64 -0
  113. package/dist/admin-api/schemas/assets.d.ts.map +1 -0
  114. package/dist/admin-api/schemas/assets.js +59 -0
  115. package/dist/admin-api/schemas/assets.js.map +1 -0
  116. package/dist/admin-api/schemas/audit.d.ts +175 -0
  117. package/dist/admin-api/schemas/audit.d.ts.map +1 -0
  118. package/dist/admin-api/schemas/audit.js +91 -0
  119. package/dist/admin-api/schemas/audit.js.map +1 -0
  120. package/dist/admin-api/schemas/error.d.ts +94 -0
  121. package/dist/admin-api/schemas/error.d.ts.map +1 -0
  122. package/dist/admin-api/schemas/error.js +79 -0
  123. package/dist/admin-api/schemas/error.js.map +1 -0
  124. package/dist/admin-api/schemas/fragments.d.ts +2 -0
  125. package/dist/admin-api/schemas/fragments.d.ts.map +1 -1
  126. package/dist/admin-api/schemas/fragments.js +4 -0
  127. package/dist/admin-api/schemas/fragments.js.map +1 -1
  128. package/dist/admin-api/schemas/index.d.ts +10 -0
  129. package/dist/admin-api/schemas/index.d.ts.map +1 -1
  130. package/dist/admin-api/schemas/index.js +10 -0
  131. package/dist/admin-api/schemas/index.js.map +1 -1
  132. package/dist/admin-api/schemas/pages.d.ts +2 -0
  133. package/dist/admin-api/schemas/pages.d.ts.map +1 -1
  134. package/dist/admin-api/schemas/pages.js +11 -0
  135. package/dist/admin-api/schemas/pages.js.map +1 -1
  136. package/dist/admin-api/schemas/rename.d.ts +77 -0
  137. package/dist/admin-api/schemas/rename.d.ts.map +1 -0
  138. package/dist/admin-api/schemas/rename.js +75 -0
  139. package/dist/admin-api/schemas/rename.js.map +1 -0
  140. package/dist/admin-api/schemas/site.d.ts +3 -2
  141. package/dist/admin-api/schemas/site.d.ts.map +1 -1
  142. package/dist/admin-api/schemas/site.js +3 -2
  143. package/dist/admin-api/schemas/site.js.map +1 -1
  144. package/dist/admin-api/schemas/system.d.ts +28 -0
  145. package/dist/admin-api/schemas/system.d.ts.map +1 -0
  146. package/dist/admin-api/schemas/system.js +35 -0
  147. package/dist/admin-api/schemas/system.js.map +1 -0
  148. package/dist/admin-api/schemas/targets.d.ts +55 -0
  149. package/dist/admin-api/schemas/targets.d.ts.map +1 -1
  150. package/dist/admin-api/schemas/targets.js +46 -0
  151. package/dist/admin-api/schemas/targets.js.map +1 -1
  152. package/dist/admin-api/schemas/templates.d.ts +54 -0
  153. package/dist/admin-api/schemas/templates.d.ts.map +1 -1
  154. package/dist/admin-api/schemas/templates.js +21 -0
  155. package/dist/admin-api/schemas/templates.js.map +1 -1
  156. package/dist/admin-api/schemas/validation.d.ts +101 -0
  157. package/dist/admin-api/schemas/validation.d.ts.map +1 -0
  158. package/dist/admin-api/schemas/validation.js +57 -0
  159. package/dist/admin-api/schemas/validation.js.map +1 -0
  160. package/dist/admin-api/source-context.d.ts +66 -17
  161. package/dist/admin-api/source-context.d.ts.map +1 -1
  162. package/dist/admin-api/source-context.js +43 -8
  163. package/dist/admin-api/source-context.js.map +1 -1
  164. package/dist/ai/adapter-scaffold.d.ts +63 -0
  165. package/dist/ai/adapter-scaffold.d.ts.map +1 -0
  166. package/dist/ai/adapter-scaffold.js +89 -0
  167. package/dist/ai/adapter-scaffold.js.map +1 -0
  168. package/dist/ai/compose-prompt.d.ts +50 -0
  169. package/dist/ai/compose-prompt.d.ts.map +1 -0
  170. package/dist/ai/compose-prompt.js +49 -0
  171. package/dist/ai/compose-prompt.js.map +1 -0
  172. package/dist/ai/errors.d.ts +65 -0
  173. package/dist/ai/errors.d.ts.map +1 -0
  174. package/dist/ai/errors.js +59 -0
  175. package/dist/ai/errors.js.map +1 -0
  176. package/dist/ai/index.d.ts +17 -0
  177. package/dist/ai/index.d.ts.map +1 -0
  178. package/dist/ai/index.js +16 -0
  179. package/dist/ai/index.js.map +1 -0
  180. package/dist/ai/provider.d.ts +76 -0
  181. package/dist/ai/provider.d.ts.map +1 -0
  182. package/dist/ai/provider.js +13 -0
  183. package/dist/ai/provider.js.map +1 -0
  184. package/dist/ai/refusal.d.ts +50 -0
  185. package/dist/ai/refusal.d.ts.map +1 -0
  186. package/dist/ai/refusal.js +100 -0
  187. package/dist/ai/refusal.js.map +1 -0
  188. package/dist/ai/vision-prep.d.ts +32 -0
  189. package/dist/ai/vision-prep.d.ts.map +1 -0
  190. package/dist/ai/vision-prep.js +113 -0
  191. package/dist/ai/vision-prep.js.map +1 -0
  192. package/dist/alt/adapter.d.ts +140 -0
  193. package/dist/alt/adapter.d.ts.map +1 -0
  194. package/dist/alt/adapter.js +7 -0
  195. package/dist/alt/adapter.js.map +1 -0
  196. package/dist/alt/anthropic.d.ts +63 -0
  197. package/dist/alt/anthropic.d.ts.map +1 -0
  198. package/dist/alt/anthropic.js +147 -0
  199. package/dist/alt/anthropic.js.map +1 -0
  200. package/dist/alt/config.d.ts +67 -0
  201. package/dist/alt/config.d.ts.map +1 -0
  202. package/dist/alt/config.js +41 -0
  203. package/dist/alt/config.js.map +1 -0
  204. package/dist/alt/factory.d.ts +19 -0
  205. package/dist/alt/factory.d.ts.map +1 -0
  206. package/dist/alt/factory.js +69 -0
  207. package/dist/alt/factory.js.map +1 -0
  208. package/dist/alt/null-adapter.d.ts +3 -0
  209. package/dist/alt/null-adapter.d.ts.map +1 -0
  210. package/dist/alt/null-adapter.js +43 -0
  211. package/dist/alt/null-adapter.js.map +1 -0
  212. package/dist/alt/ollama.d.ts +40 -0
  213. package/dist/alt/ollama.d.ts.map +1 -0
  214. package/dist/alt/ollama.js +139 -0
  215. package/dist/alt/ollama.js.map +1 -0
  216. package/dist/alt/openai.d.ts +46 -0
  217. package/dist/alt/openai.d.ts.map +1 -0
  218. package/dist/alt/openai.js +118 -0
  219. package/dist/alt/openai.js.map +1 -0
  220. package/dist/alt/prompt-policies.d.ts +79 -0
  221. package/dist/alt/prompt-policies.d.ts.map +1 -0
  222. package/dist/alt/prompt-policies.js +67 -0
  223. package/dist/alt/prompt-policies.js.map +1 -0
  224. package/dist/alt/route-handler.d.ts +56 -0
  225. package/dist/alt/route-handler.d.ts.map +1 -0
  226. package/dist/alt/route-handler.js +122 -0
  227. package/dist/alt/route-handler.js.map +1 -0
  228. package/dist/alt/suggester.d.ts +57 -0
  229. package/dist/alt/suggester.d.ts.map +1 -0
  230. package/dist/alt/suggester.js +133 -0
  231. package/dist/alt/suggester.js.map +1 -0
  232. package/dist/app.js +1 -1
  233. package/dist/app.js.map +1 -1
  234. package/dist/archive-aliases.d.ts +79 -0
  235. package/dist/archive-aliases.d.ts.map +1 -0
  236. package/dist/archive-aliases.js +60 -0
  237. package/dist/archive-aliases.js.map +1 -0
  238. package/dist/archive-helpers.d.ts +73 -0
  239. package/dist/archive-helpers.d.ts.map +1 -0
  240. package/dist/archive-helpers.js +94 -0
  241. package/dist/archive-helpers.js.map +1 -0
  242. package/dist/assets/analyze-audio.d.ts +3 -0
  243. package/dist/assets/analyze-audio.d.ts.map +1 -0
  244. package/dist/assets/analyze-audio.js +80 -0
  245. package/dist/assets/analyze-audio.js.map +1 -0
  246. package/dist/assets/analyze-image.d.ts +19 -0
  247. package/dist/assets/analyze-image.d.ts.map +1 -0
  248. package/dist/assets/analyze-image.js +123 -0
  249. package/dist/assets/analyze-image.js.map +1 -0
  250. package/dist/assets/analyze.d.ts +94 -0
  251. package/dist/assets/analyze.d.ts.map +1 -0
  252. package/dist/assets/analyze.js +45 -0
  253. package/dist/assets/analyze.js.map +1 -0
  254. package/dist/assets/asset-deps.d.ts +30 -0
  255. package/dist/assets/asset-deps.d.ts.map +1 -0
  256. package/dist/assets/asset-deps.js +42 -0
  257. package/dist/assets/asset-deps.js.map +1 -0
  258. package/dist/assets/asset-paths.d.ts +155 -0
  259. package/dist/assets/asset-paths.d.ts.map +1 -0
  260. package/dist/assets/asset-paths.js +197 -0
  261. package/dist/assets/asset-paths.js.map +1 -0
  262. package/dist/assets/delete.d.ts +75 -0
  263. package/dist/assets/delete.d.ts.map +1 -0
  264. package/dist/assets/delete.js +82 -0
  265. package/dist/assets/delete.js.map +1 -0
  266. package/dist/assets/errors.d.ts +241 -0
  267. package/dist/assets/errors.d.ts.map +1 -0
  268. package/dist/assets/errors.js +300 -0
  269. package/dist/assets/errors.js.map +1 -0
  270. package/dist/assets/find-refs.d.ts +37 -0
  271. package/dist/assets/find-refs.d.ts.map +1 -0
  272. package/dist/assets/find-refs.js +35 -0
  273. package/dist/assets/find-refs.js.map +1 -0
  274. package/dist/assets/hash.d.ts +13 -0
  275. package/dist/assets/hash.d.ts.map +1 -0
  276. package/dist/assets/hash.js +43 -0
  277. package/dist/assets/hash.js.map +1 -0
  278. package/dist/assets/image-metadata.d.ts +11 -0
  279. package/dist/assets/image-metadata.d.ts.map +1 -0
  280. package/dist/assets/image-metadata.js +31 -0
  281. package/dist/assets/image-metadata.js.map +1 -0
  282. package/dist/assets/ingest-locale.d.ts +86 -0
  283. package/dist/assets/ingest-locale.d.ts.map +1 -0
  284. package/dist/assets/ingest-locale.js +209 -0
  285. package/dist/assets/ingest-locale.js.map +1 -0
  286. package/dist/assets/ingest.d.ts +96 -0
  287. package/dist/assets/ingest.d.ts.map +1 -0
  288. package/dist/assets/ingest.js +308 -0
  289. package/dist/assets/ingest.js.map +1 -0
  290. package/dist/assets/kind-compat.d.ts +34 -0
  291. package/dist/assets/kind-compat.d.ts.map +1 -0
  292. package/dist/assets/kind-compat.js +33 -0
  293. package/dist/assets/kind-compat.js.map +1 -0
  294. package/dist/assets/list.d.ts +46 -0
  295. package/dist/assets/list.d.ts.map +1 -0
  296. package/dist/assets/list.js +102 -0
  297. package/dist/assets/list.js.map +1 -0
  298. package/dist/assets/manifest-default.d.ts +56 -0
  299. package/dist/assets/manifest-default.d.ts.map +1 -0
  300. package/dist/assets/manifest-default.js +120 -0
  301. package/dist/assets/manifest-default.js.map +1 -0
  302. package/dist/assets/manifest-filename.d.ts +52 -0
  303. package/dist/assets/manifest-filename.d.ts.map +1 -0
  304. package/dist/assets/manifest-filename.js +104 -0
  305. package/dist/assets/manifest-filename.js.map +1 -0
  306. package/dist/assets/manifest-locale.d.ts +60 -0
  307. package/dist/assets/manifest-locale.d.ts.map +1 -0
  308. package/dist/assets/manifest-locale.js +206 -0
  309. package/dist/assets/manifest-locale.js.map +1 -0
  310. package/dist/assets/manifest-merge.d.ts +66 -0
  311. package/dist/assets/manifest-merge.d.ts.map +1 -0
  312. package/dist/assets/manifest-merge.js +82 -0
  313. package/dist/assets/manifest-merge.js.map +1 -0
  314. package/dist/assets/manifest.d.ts +83 -0
  315. package/dist/assets/manifest.d.ts.map +1 -0
  316. package/dist/assets/manifest.js +93 -0
  317. package/dist/assets/manifest.js.map +1 -0
  318. package/dist/assets/mime-sniff.d.ts +18 -0
  319. package/dist/assets/mime-sniff.d.ts.map +1 -0
  320. package/dist/assets/mime-sniff.js +84 -0
  321. package/dist/assets/mime-sniff.js.map +1 -0
  322. package/dist/assets/preprocess-svg.d.ts +3 -0
  323. package/dist/assets/preprocess-svg.d.ts.map +1 -0
  324. package/dist/assets/preprocess-svg.js +49 -0
  325. package/dist/assets/preprocess-svg.js.map +1 -0
  326. package/dist/assets/preprocess.d.ts +62 -0
  327. package/dist/assets/preprocess.d.ts.map +1 -0
  328. package/dist/assets/preprocess.js +86 -0
  329. package/dist/assets/preprocess.js.map +1 -0
  330. package/dist/assets/publish-plan.d.ts +41 -0
  331. package/dist/assets/publish-plan.d.ts.map +1 -0
  332. package/dist/assets/publish-plan.js +49 -0
  333. package/dist/assets/publish-plan.js.map +1 -0
  334. package/dist/assets/publish.d.ts +33 -0
  335. package/dist/assets/publish.d.ts.map +1 -0
  336. package/dist/assets/publish.js +81 -0
  337. package/dist/assets/publish.js.map +1 -0
  338. package/dist/assets/refs.d.ts +37 -0
  339. package/dist/assets/refs.d.ts.map +1 -0
  340. package/dist/assets/refs.js +33 -0
  341. package/dist/assets/refs.js.map +1 -0
  342. package/dist/assets/remove-override.d.ts +42 -0
  343. package/dist/assets/remove-override.d.ts.map +1 -0
  344. package/dist/assets/remove-override.js +53 -0
  345. package/dist/assets/remove-override.js.map +1 -0
  346. package/dist/assets/rename.d.ts +43 -0
  347. package/dist/assets/rename.d.ts.map +1 -0
  348. package/dist/assets/rename.js +271 -0
  349. package/dist/assets/rename.js.map +1 -0
  350. package/dist/assets/replace.d.ts +37 -0
  351. package/dist/assets/replace.d.ts.map +1 -0
  352. package/dist/assets/replace.js +195 -0
  353. package/dist/assets/replace.js.map +1 -0
  354. package/dist/assets/resolve.d.ts +141 -0
  355. package/dist/assets/resolve.d.ts.map +1 -0
  356. package/dist/assets/resolve.js +381 -0
  357. package/dist/assets/resolve.js.map +1 -0
  358. package/dist/assets/rewrite-manifest-asset-ref.d.ts +44 -0
  359. package/dist/assets/rewrite-manifest-asset-ref.d.ts.map +1 -0
  360. package/dist/assets/rewrite-manifest-asset-ref.js +51 -0
  361. package/dist/assets/rewrite-manifest-asset-ref.js.map +1 -0
  362. package/dist/assets/scan-manifest-for-asset.d.ts +63 -0
  363. package/dist/assets/scan-manifest-for-asset.d.ts.map +1 -0
  364. package/dist/assets/scan-manifest-for-asset.js +105 -0
  365. package/dist/assets/scan-manifest-for-asset.js.map +1 -0
  366. package/dist/assets/serve-route.d.ts +45 -0
  367. package/dist/assets/serve-route.d.ts.map +1 -0
  368. package/dist/assets/serve-route.js +123 -0
  369. package/dist/assets/serve-route.js.map +1 -0
  370. package/dist/assets/svg-sanitize.d.ts +38 -0
  371. package/dist/assets/svg-sanitize.d.ts.map +1 -0
  372. package/dist/assets/svg-sanitize.js +209 -0
  373. package/dist/assets/svg-sanitize.js.map +1 -0
  374. package/dist/assets/update-metadata.d.ts +61 -0
  375. package/dist/assets/update-metadata.d.ts.map +1 -0
  376. package/dist/assets/update-metadata.js +82 -0
  377. package/dist/assets/update-metadata.js.map +1 -0
  378. package/dist/assets/url.d.ts +82 -0
  379. package/dist/assets/url.d.ts.map +1 -0
  380. package/dist/assets/url.js +103 -0
  381. package/dist/assets/url.js.map +1 -0
  382. package/dist/assets/validate.d.ts +74 -0
  383. package/dist/assets/validate.d.ts.map +1 -0
  384. package/dist/assets/validate.js +136 -0
  385. package/dist/assets/validate.js.map +1 -0
  386. package/dist/assets/variants.d.ts +23 -0
  387. package/dist/assets/variants.d.ts.map +1 -0
  388. package/dist/assets/variants.js +74 -0
  389. package/dist/assets/variants.js.map +1 -0
  390. package/dist/audit/config.d.ts +75 -0
  391. package/dist/audit/config.d.ts.map +1 -0
  392. package/dist/audit/config.js +91 -0
  393. package/dist/audit/config.js.map +1 -0
  394. package/dist/audit/context.d.ts +98 -0
  395. package/dist/audit/context.d.ts.map +1 -0
  396. package/dist/audit/context.js +51 -0
  397. package/dist/audit/context.js.map +1 -0
  398. package/dist/audit/errors.d.ts +73 -0
  399. package/dist/audit/errors.d.ts.map +1 -0
  400. package/dist/audit/errors.js +78 -0
  401. package/dist/audit/errors.js.map +1 -0
  402. package/dist/audit/index.d.ts +16 -0
  403. package/dist/audit/index.d.ts.map +1 -0
  404. package/dist/audit/index.js +10 -0
  405. package/dist/audit/index.js.map +1 -0
  406. package/dist/audit/provider.d.ts +73 -0
  407. package/dist/audit/provider.d.ts.map +1 -0
  408. package/dist/audit/provider.js +2 -0
  409. package/dist/audit/provider.js.map +1 -0
  410. package/dist/audit/providers/history.d.ts +66 -0
  411. package/dist/audit/providers/history.d.ts.map +1 -0
  412. package/dist/audit/providers/history.js +102 -0
  413. package/dist/audit/providers/history.js.map +1 -0
  414. package/dist/audit/pseudonymize.d.ts +26 -0
  415. package/dist/audit/pseudonymize.d.ts.map +1 -0
  416. package/dist/audit/pseudonymize.js +86 -0
  417. package/dist/audit/pseudonymize.js.map +1 -0
  418. package/dist/audit/recorder.d.ts +102 -0
  419. package/dist/audit/recorder.d.ts.map +1 -0
  420. package/dist/audit/recorder.js +55 -0
  421. package/dist/audit/recorder.js.map +1 -0
  422. package/dist/audit/retention.d.ts +83 -0
  423. package/dist/audit/retention.d.ts.map +1 -0
  424. package/dist/audit/retention.js +142 -0
  425. package/dist/audit/retention.js.map +1 -0
  426. package/dist/audit/source-ip.d.ts +32 -0
  427. package/dist/audit/source-ip.d.ts.map +1 -0
  428. package/dist/audit/source-ip.js +164 -0
  429. package/dist/audit/source-ip.js.map +1 -0
  430. package/dist/audit/types.d.ts +143 -0
  431. package/dist/audit/types.d.ts.map +1 -0
  432. package/dist/audit/types.js +33 -0
  433. package/dist/audit/types.js.map +1 -0
  434. package/dist/audit/user-agent.d.ts +28 -0
  435. package/dist/audit/user-agent.d.ts.map +1 -0
  436. package/dist/audit/user-agent.js +63 -0
  437. package/dist/audit/user-agent.js.map +1 -0
  438. package/dist/auth/capabilities.d.ts +28 -0
  439. package/dist/auth/capabilities.d.ts.map +1 -0
  440. package/dist/auth/capabilities.js +101 -0
  441. package/dist/auth/capabilities.js.map +1 -0
  442. package/dist/auth/config.d.ts +109 -0
  443. package/dist/auth/config.d.ts.map +1 -0
  444. package/dist/auth/config.js +221 -0
  445. package/dist/auth/config.js.map +1 -0
  446. package/dist/auth/errors.d.ts +72 -0
  447. package/dist/auth/errors.d.ts.map +1 -0
  448. package/dist/auth/errors.js +78 -0
  449. package/dist/auth/errors.js.map +1 -0
  450. package/dist/auth/factory.d.ts +43 -0
  451. package/dist/auth/factory.d.ts.map +1 -0
  452. package/dist/auth/factory.js +48 -0
  453. package/dist/auth/factory.js.map +1 -0
  454. package/dist/auth/index.d.ts +21 -0
  455. package/dist/auth/index.d.ts.map +1 -0
  456. package/dist/auth/index.js +14 -0
  457. package/dist/auth/index.js.map +1 -0
  458. package/dist/auth/ip-match.d.ts +29 -0
  459. package/dist/auth/ip-match.d.ts.map +1 -0
  460. package/dist/auth/ip-match.js +162 -0
  461. package/dist/auth/ip-match.js.map +1 -0
  462. package/dist/auth/provider.d.ts +76 -0
  463. package/dist/auth/provider.d.ts.map +1 -0
  464. package/dist/auth/provider.js +2 -0
  465. package/dist/auth/provider.js.map +1 -0
  466. package/dist/auth/providers/aws-cognito.d.ts +55 -0
  467. package/dist/auth/providers/aws-cognito.d.ts.map +1 -0
  468. package/dist/auth/providers/aws-cognito.js +114 -0
  469. package/dist/auth/providers/aws-cognito.js.map +1 -0
  470. package/dist/auth/providers/azure-easy-auth.d.ts +7 -0
  471. package/dist/auth/providers/azure-easy-auth.d.ts.map +1 -0
  472. package/dist/auth/providers/azure-easy-auth.js +48 -0
  473. package/dist/auth/providers/azure-easy-auth.js.map +1 -0
  474. package/dist/auth/providers/cloudflare-access.d.ts +71 -0
  475. package/dist/auth/providers/cloudflare-access.d.ts.map +1 -0
  476. package/dist/auth/providers/cloudflare-access.js +120 -0
  477. package/dist/auth/providers/cloudflare-access.js.map +1 -0
  478. package/dist/auth/providers/forwarded-user.d.ts +31 -0
  479. package/dist/auth/providers/forwarded-user.d.ts.map +1 -0
  480. package/dist/auth/providers/forwarded-user.js +72 -0
  481. package/dist/auth/providers/forwarded-user.js.map +1 -0
  482. package/dist/auth/providers/none.d.ts +6 -0
  483. package/dist/auth/providers/none.d.ts.map +1 -0
  484. package/dist/auth/providers/none.js +19 -0
  485. package/dist/auth/providers/none.js.map +1 -0
  486. package/dist/auth/providers/tailscale.d.ts +7 -0
  487. package/dist/auth/providers/tailscale.d.ts.map +1 -0
  488. package/dist/auth/providers/tailscale.js +30 -0
  489. package/dist/auth/providers/tailscale.js.map +1 -0
  490. package/dist/auth/role-resolver.d.ts +38 -0
  491. package/dist/auth/role-resolver.d.ts.map +1 -0
  492. package/dist/auth/role-resolver.js +92 -0
  493. package/dist/auth/role-resolver.js.map +1 -0
  494. package/dist/auth/types.d.ts +150 -0
  495. package/dist/auth/types.d.ts.map +1 -0
  496. package/dist/auth/types.js +60 -0
  497. package/dist/auth/types.js.map +1 -0
  498. package/dist/cache/errors.d.ts +41 -0
  499. package/dist/cache/errors.d.ts.map +1 -0
  500. package/dist/cache/errors.js +44 -0
  501. package/dist/cache/errors.js.map +1 -0
  502. package/dist/cache/factories.d.ts +17 -0
  503. package/dist/cache/factories.d.ts.map +1 -0
  504. package/dist/cache/factories.js +17 -0
  505. package/dist/cache/factories.js.map +1 -0
  506. package/dist/cache/keys.d.ts +63 -0
  507. package/dist/cache/keys.d.ts.map +1 -0
  508. package/dist/cache/keys.js +145 -0
  509. package/dist/cache/keys.js.map +1 -0
  510. package/dist/cache/memory.d.ts +51 -0
  511. package/dist/cache/memory.d.ts.map +1 -0
  512. package/dist/cache/memory.js +204 -0
  513. package/dist/cache/memory.js.map +1 -0
  514. package/dist/cache/per-site.d.ts +22 -0
  515. package/dist/cache/per-site.d.ts.map +1 -0
  516. package/dist/cache/per-site.js +114 -0
  517. package/dist/cache/per-site.js.map +1 -0
  518. package/dist/cache/types.d.ts +142 -0
  519. package/dist/cache/types.d.ts.map +1 -0
  520. package/dist/cache/types.js +33 -0
  521. package/dist/cache/types.js.map +1 -0
  522. package/dist/cli/archive.d.ts +44 -0
  523. package/dist/cli/archive.d.ts.map +1 -0
  524. package/dist/cli/archive.js +310 -0
  525. package/dist/cli/archive.js.map +1 -0
  526. package/dist/cli/assets-cli.d.ts +58 -0
  527. package/dist/cli/assets-cli.d.ts.map +1 -0
  528. package/dist/cli/assets-cli.js +233 -0
  529. package/dist/cli/assets-cli.js.map +1 -0
  530. package/dist/cli/assets-display.d.ts +112 -0
  531. package/dist/cli/assets-display.d.ts.map +1 -0
  532. package/dist/cli/assets-display.js +106 -0
  533. package/dist/cli/assets-display.js.map +1 -0
  534. package/dist/cli/bootstrap.d.ts +15 -10
  535. package/dist/cli/bootstrap.d.ts.map +1 -1
  536. package/dist/cli/bootstrap.js +59 -24
  537. package/dist/cli/bootstrap.js.map +1 -1
  538. package/dist/cli/dev-template-watcher.d.ts +29 -0
  539. package/dist/cli/dev-template-watcher.d.ts.map +1 -0
  540. package/dist/cli/dev-template-watcher.js +38 -0
  541. package/dist/cli/dev-template-watcher.js.map +1 -0
  542. package/dist/cli/history.d.ts.map +1 -1
  543. package/dist/cli/history.js +5 -3
  544. package/dist/cli/history.js.map +1 -1
  545. package/dist/cli/index.js +737 -374
  546. package/dist/cli/index.js.map +1 -1
  547. package/dist/cli/validate-flags.d.ts +29 -0
  548. package/dist/cli/validate-flags.d.ts.map +1 -0
  549. package/dist/cli/validate-flags.js +49 -0
  550. package/dist/cli/validate-flags.js.map +1 -0
  551. package/dist/compare.d.ts +1 -1
  552. package/dist/compare.d.ts.map +1 -1
  553. package/dist/compare.js +40 -35
  554. package/dist/compare.js.map +1 -1
  555. package/dist/component-ids.d.ts +25 -0
  556. package/dist/component-ids.d.ts.map +1 -0
  557. package/dist/component-ids.js +83 -0
  558. package/dist/component-ids.js.map +1 -0
  559. package/dist/config/define.d.ts +61 -0
  560. package/dist/config/define.d.ts.map +1 -0
  561. package/dist/config/define.js +64 -0
  562. package/dist/config/define.js.map +1 -0
  563. package/dist/config/errors.d.ts +32 -0
  564. package/dist/config/errors.d.ts.map +1 -0
  565. package/dist/config/errors.js +40 -0
  566. package/dist/config/errors.js.map +1 -0
  567. package/dist/config/index.d.ts +13 -0
  568. package/dist/config/index.d.ts.map +1 -0
  569. package/dist/config/index.js +20 -0
  570. package/dist/config/index.js.map +1 -0
  571. package/dist/config/loader.d.ts +105 -0
  572. package/dist/config/loader.d.ts.map +1 -0
  573. package/dist/config/loader.js +265 -0
  574. package/dist/config/loader.js.map +1 -0
  575. package/dist/config/schemas.d.ts +89 -0
  576. package/dist/config/schemas.d.ts.map +1 -0
  577. package/dist/config/schemas.js +172 -0
  578. package/dist/config/schemas.js.map +1 -0
  579. package/dist/config/types.d.ts +32 -0
  580. package/dist/config/types.d.ts.map +1 -0
  581. package/dist/config/types.js +15 -0
  582. package/dist/config/types.js.map +1 -0
  583. package/dist/dep-sidecars.d.ts +127 -0
  584. package/dist/dep-sidecars.d.ts.map +1 -0
  585. package/dist/dep-sidecars.js +122 -0
  586. package/dist/dep-sidecars.js.map +1 -0
  587. package/dist/deploy/cloudflare-workers.d.ts +46 -0
  588. package/dist/deploy/cloudflare-workers.d.ts.map +1 -0
  589. package/dist/deploy/cloudflare-workers.js +213 -0
  590. package/dist/deploy/cloudflare-workers.js.map +1 -0
  591. package/dist/deploy/errors.d.ts +66 -0
  592. package/dist/deploy/errors.d.ts.map +1 -0
  593. package/dist/deploy/errors.js +82 -0
  594. package/dist/deploy/errors.js.map +1 -0
  595. package/dist/deploy/index.d.ts +9 -0
  596. package/dist/deploy/index.d.ts.map +1 -0
  597. package/dist/deploy/index.js +3 -0
  598. package/dist/deploy/index.js.map +1 -0
  599. package/dist/deploy/types.d.ts +162 -0
  600. package/dist/deploy/types.d.ts.map +1 -0
  601. package/dist/deploy/types.js +2 -0
  602. package/dist/deploy/types.js.map +1 -0
  603. package/dist/editor/AssetEmbeddedWidget.d.ts +3 -0
  604. package/dist/editor/AssetEmbeddedWidget.d.ts.map +1 -0
  605. package/dist/editor/AssetEmbeddedWidget.js +146 -0
  606. package/dist/editor/AssetEmbeddedWidget.js.map +1 -0
  607. package/dist/editor/mount.d.ts +12 -1
  608. package/dist/editor/mount.d.ts.map +1 -1
  609. package/dist/editor/mount.js +36 -5
  610. package/dist/editor/mount.js.map +1 -1
  611. package/dist/format.d.ts +44 -0
  612. package/dist/format.d.ts.map +1 -0
  613. package/dist/format.js +65 -0
  614. package/dist/format.js.map +1 -0
  615. package/dist/fragment-deps.d.ts +24 -0
  616. package/dist/fragment-deps.d.ts.map +1 -0
  617. package/dist/fragment-deps.js +20 -0
  618. package/dist/fragment-deps.js.map +1 -0
  619. package/dist/fragments/create.d.ts +70 -0
  620. package/dist/fragments/create.d.ts.map +1 -0
  621. package/dist/fragments/create.js +93 -0
  622. package/dist/fragments/create.js.map +1 -0
  623. package/dist/fragments/publish.d.ts +37 -0
  624. package/dist/fragments/publish.d.ts.map +1 -0
  625. package/dist/fragments/publish.js +52 -0
  626. package/dist/fragments/publish.js.map +1 -0
  627. package/dist/fragments/save.d.ts +81 -0
  628. package/dist/fragments/save.d.ts.map +1 -0
  629. package/dist/fragments/save.js +105 -0
  630. package/dist/fragments/save.js.map +1 -0
  631. package/dist/hash.d.ts +0 -6
  632. package/dist/hash.d.ts.map +1 -1
  633. package/dist/hash.js +0 -18
  634. package/dist/hash.js.map +1 -1
  635. package/dist/history-provider.d.ts.map +1 -1
  636. package/dist/history-provider.js +30 -8
  637. package/dist/history-provider.js.map +1 -1
  638. package/dist/history-recorder.d.ts +10 -6
  639. package/dist/history-recorder.d.ts.map +1 -1
  640. package/dist/history-recorder.js +13 -5
  641. package/dist/history-recorder.js.map +1 -1
  642. package/dist/history-restorer.d.ts.map +1 -1
  643. package/dist/history-restorer.js +34 -2
  644. package/dist/history-restorer.js.map +1 -1
  645. package/dist/history.d.ts +26 -8
  646. package/dist/history.d.ts.map +1 -1
  647. package/dist/hooks/audit-emitter.d.ts +73 -0
  648. package/dist/hooks/audit-emitter.d.ts.map +1 -0
  649. package/dist/hooks/audit-emitter.js +13 -0
  650. package/dist/hooks/audit-emitter.js.map +1 -0
  651. package/dist/hooks/context.d.ts +78 -0
  652. package/dist/hooks/context.d.ts.map +1 -0
  653. package/dist/hooks/context.js +56 -0
  654. package/dist/hooks/context.js.map +1 -0
  655. package/dist/hooks/contribution.d.ts +90 -0
  656. package/dist/hooks/contribution.d.ts.map +1 -0
  657. package/dist/hooks/contribution.js +2 -0
  658. package/dist/hooks/contribution.js.map +1 -0
  659. package/dist/hooks/dispatch.d.ts +30 -0
  660. package/dist/hooks/dispatch.d.ts.map +1 -0
  661. package/dist/hooks/dispatch.js +252 -0
  662. package/dist/hooks/dispatch.js.map +1 -0
  663. package/dist/hooks/errors.d.ts +100 -0
  664. package/dist/hooks/errors.d.ts.map +1 -0
  665. package/dist/hooks/errors.js +103 -0
  666. package/dist/hooks/errors.js.map +1 -0
  667. package/dist/hooks/index.d.ts +15 -0
  668. package/dist/hooks/index.d.ts.map +1 -0
  669. package/dist/hooks/index.js +6 -0
  670. package/dist/hooks/index.js.map +1 -0
  671. package/dist/hooks/registry.d.ts +53 -0
  672. package/dist/hooks/registry.d.ts.map +1 -0
  673. package/dist/hooks/registry.js +139 -0
  674. package/dist/hooks/registry.js.map +1 -0
  675. package/dist/hooks/storage.d.ts +43 -0
  676. package/dist/hooks/storage.d.ts.map +1 -0
  677. package/dist/hooks/storage.js +2 -0
  678. package/dist/hooks/storage.js.map +1 -0
  679. package/dist/hooks/types.d.ts +324 -0
  680. package/dist/hooks/types.d.ts.map +1 -0
  681. package/dist/hooks/types.js +2 -0
  682. package/dist/hooks/types.js.map +1 -0
  683. package/dist/index.d.ts +27 -9
  684. package/dist/index.d.ts.map +1 -1
  685. package/dist/index.js +50 -7
  686. package/dist/index.js.map +1 -1
  687. package/dist/locale.d.ts +25 -1
  688. package/dist/locale.d.ts.map +1 -1
  689. package/dist/locale.js +44 -2
  690. package/dist/locale.js.map +1 -1
  691. package/dist/manifest-save.d.ts +255 -0
  692. package/dist/manifest-save.d.ts.map +1 -0
  693. package/dist/manifest-save.js +260 -0
  694. package/dist/manifest-save.js.map +1 -0
  695. package/dist/manifest.d.ts +1 -2
  696. package/dist/manifest.d.ts.map +1 -1
  697. package/dist/manifest.js +43 -44
  698. package/dist/manifest.js.map +1 -1
  699. package/dist/node-floor.d.ts +3 -0
  700. package/dist/node-floor.d.ts.map +1 -0
  701. package/dist/node-floor.js +3 -0
  702. package/dist/node-floor.js.map +1 -0
  703. package/dist/pages/create.d.ts +103 -0
  704. package/dist/pages/create.d.ts.map +1 -0
  705. package/dist/pages/create.js +117 -0
  706. package/dist/pages/create.js.map +1 -0
  707. package/dist/pages/publish.d.ts +59 -0
  708. package/dist/pages/publish.d.ts.map +1 -0
  709. package/dist/pages/publish.js +78 -0
  710. package/dist/pages/publish.js.map +1 -0
  711. package/dist/pages/save.d.ts +97 -0
  712. package/dist/pages/save.d.ts.map +1 -0
  713. package/dist/pages/save.js +138 -0
  714. package/dist/pages/save.js.map +1 -0
  715. package/dist/providers/_atomic-write.d.ts +9 -0
  716. package/dist/providers/_atomic-write.d.ts.map +1 -0
  717. package/dist/providers/_atomic-write.js +72 -0
  718. package/dist/providers/_atomic-write.js.map +1 -0
  719. package/dist/providers/_rm-ignore-missing.d.ts +31 -0
  720. package/dist/providers/_rm-ignore-missing.d.ts.map +1 -0
  721. package/dist/providers/_rm-ignore-missing.js +12 -0
  722. package/dist/providers/_rm-ignore-missing.js.map +1 -0
  723. package/dist/providers/_stream-interop.d.ts +23 -0
  724. package/dist/providers/_stream-interop.d.ts.map +1 -0
  725. package/dist/providers/_stream-interop.js +21 -0
  726. package/dist/providers/_stream-interop.js.map +1 -0
  727. package/dist/providers/azure-blob.d.ts.map +1 -1
  728. package/dist/providers/azure-blob.js +60 -0
  729. package/dist/providers/azure-blob.js.map +1 -1
  730. package/dist/providers/factories.d.ts +65 -0
  731. package/dist/providers/factories.d.ts.map +1 -0
  732. package/dist/providers/factories.js +189 -0
  733. package/dist/providers/factories.js.map +1 -0
  734. package/dist/providers/filesystem.d.ts +4 -0
  735. package/dist/providers/filesystem.d.ts.map +1 -1
  736. package/dist/providers/filesystem.js +63 -2
  737. package/dist/providers/filesystem.js.map +1 -1
  738. package/dist/providers/s3.d.ts.map +1 -1
  739. package/dist/providers/s3.js +84 -1
  740. package/dist/providers/s3.js.map +1 -1
  741. package/dist/publish-item.d.ts +225 -0
  742. package/dist/publish-item.d.ts.map +1 -0
  743. package/dist/publish-item.js +210 -0
  744. package/dist/publish-item.js.map +1 -0
  745. package/dist/publish-rendered.d.ts +37 -17
  746. package/dist/publish-rendered.d.ts.map +1 -1
  747. package/dist/publish-rendered.js +144 -71
  748. package/dist/publish-rendered.js.map +1 -1
  749. package/dist/publish-renderers.d.ts +132 -0
  750. package/dist/publish-renderers.d.ts.map +1 -0
  751. package/dist/publish-renderers.js +240 -0
  752. package/dist/publish-renderers.js.map +1 -0
  753. package/dist/publish-run.d.ts +223 -0
  754. package/dist/publish-run.d.ts.map +1 -0
  755. package/dist/publish-run.js +307 -0
  756. package/dist/publish-run.js.map +1 -0
  757. package/dist/publish.d.ts +13 -12
  758. package/dist/publish.d.ts.map +1 -1
  759. package/dist/publish.js +24 -57
  760. package/dist/publish.js.map +1 -1
  761. package/dist/render-for-analysis.d.ts +24 -0
  762. package/dist/render-for-analysis.d.ts.map +1 -0
  763. package/dist/render-for-analysis.js +146 -0
  764. package/dist/render-for-analysis.js.map +1 -0
  765. package/dist/resolver.d.ts +12 -2
  766. package/dist/resolver.d.ts.map +1 -1
  767. package/dist/resolver.js +101 -32
  768. package/dist/resolver.js.map +1 -1
  769. package/dist/runtime/archive-marker.d.ts +62 -0
  770. package/dist/runtime/archive-marker.d.ts.map +1 -0
  771. package/dist/runtime/archive-marker.js +88 -0
  772. package/dist/runtime/archive-marker.js.map +1 -0
  773. package/dist/runtime/capability-gap-warnings.d.ts +42 -0
  774. package/dist/runtime/capability-gap-warnings.d.ts.map +1 -0
  775. package/dist/runtime/capability-gap-warnings.js +28 -0
  776. package/dist/runtime/capability-gap-warnings.js.map +1 -0
  777. package/dist/runtime/redirects-emit.d.ts +93 -0
  778. package/dist/runtime/redirects-emit.d.ts.map +1 -0
  779. package/dist/runtime/redirects-emit.js +89 -0
  780. package/dist/runtime/redirects-emit.js.map +1 -0
  781. package/dist/runtime/runtime-capabilities.d.ts +79 -0
  782. package/dist/runtime/runtime-capabilities.d.ts.map +1 -0
  783. package/dist/runtime/runtime-capabilities.js +60 -0
  784. package/dist/runtime/runtime-capabilities.js.map +1 -0
  785. package/dist/save-etag.d.ts +69 -0
  786. package/dist/save-etag.d.ts.map +1 -0
  787. package/dist/save-etag.js +118 -0
  788. package/dist/save-etag.js.map +1 -0
  789. package/dist/schema/dimensions.d.ts +78 -0
  790. package/dist/schema/dimensions.d.ts.map +1 -0
  791. package/dist/schema/dimensions.js +97 -0
  792. package/dist/schema/dimensions.js.map +1 -0
  793. package/dist/schema/helpers.d.ts +108 -0
  794. package/dist/schema/helpers.d.ts.map +1 -0
  795. package/dist/schema/helpers.js +133 -0
  796. package/dist/schema/helpers.js.map +1 -0
  797. package/dist/schema/index.d.ts +27 -0
  798. package/dist/schema/index.d.ts.map +1 -0
  799. package/dist/schema/index.js +25 -0
  800. package/dist/schema/index.js.map +1 -0
  801. package/dist/schema/types.d.ts +390 -0
  802. package/dist/schema/types.d.ts.map +1 -0
  803. package/dist/schema/types.js +25 -0
  804. package/dist/schema/types.js.map +1 -0
  805. package/dist/selector-chain.d.ts +63 -0
  806. package/dist/selector-chain.d.ts.map +1 -0
  807. package/dist/selector-chain.js +58 -0
  808. package/dist/selector-chain.js.map +1 -0
  809. package/dist/sidecars.d.ts +19 -18
  810. package/dist/sidecars.d.ts.map +1 -1
  811. package/dist/sidecars.js +70 -62
  812. package/dist/sidecars.js.map +1 -1
  813. package/dist/site-loader.d.ts +42 -4
  814. package/dist/site-loader.d.ts.map +1 -1
  815. package/dist/site-loader.js +27 -8
  816. package/dist/site-loader.js.map +1 -1
  817. package/dist/targets.d.ts +21 -12
  818. package/dist/targets.d.ts.map +1 -1
  819. package/dist/targets.js +27 -117
  820. package/dist/targets.js.map +1 -1
  821. package/dist/testing/admin-cache-contract.d.ts +52 -0
  822. package/dist/testing/admin-cache-contract.d.ts.map +1 -0
  823. package/dist/testing/admin-cache-contract.js +203 -0
  824. package/dist/testing/admin-cache-contract.js.map +1 -0
  825. package/dist/testing/index.d.ts +11 -0
  826. package/dist/testing/index.d.ts.map +1 -0
  827. package/dist/testing/index.js +11 -0
  828. package/dist/testing/index.js.map +1 -0
  829. package/dist/themes.d.ts +69 -0
  830. package/dist/themes.d.ts.map +1 -0
  831. package/dist/themes.js +85 -0
  832. package/dist/themes.js.map +1 -0
  833. package/dist/transforms/adapter.d.ts +115 -0
  834. package/dist/transforms/adapter.d.ts.map +1 -0
  835. package/dist/transforms/adapter.js +2 -0
  836. package/dist/transforms/adapter.js.map +1 -0
  837. package/dist/transforms/cloudflare.d.ts +17 -0
  838. package/dist/transforms/cloudflare.d.ts.map +1 -0
  839. package/dist/transforms/cloudflare.js +110 -0
  840. package/dist/transforms/cloudflare.js.map +1 -0
  841. package/dist/transforms/factories.d.ts +16 -0
  842. package/dist/transforms/factories.d.ts.map +1 -0
  843. package/dist/transforms/factories.js +18 -0
  844. package/dist/transforms/factories.js.map +1 -0
  845. package/dist/transforms/index.d.ts +17 -0
  846. package/dist/transforms/index.d.ts.map +1 -0
  847. package/dist/transforms/index.js +6 -0
  848. package/dist/transforms/index.js.map +1 -0
  849. package/dist/transforms/sharp.d.ts +17 -0
  850. package/dist/transforms/sharp.d.ts.map +1 -0
  851. package/dist/transforms/sharp.js +57 -0
  852. package/dist/transforms/sharp.js.map +1 -0
  853. package/dist/types.d.ts +485 -34
  854. package/dist/types.d.ts.map +1 -1
  855. package/dist/types.js +20 -1
  856. package/dist/types.js.map +1 -1
  857. package/dist/validation/alt-required-walker.d.ts +27 -0
  858. package/dist/validation/alt-required-walker.d.ts.map +1 -0
  859. package/dist/validation/alt-required-walker.js +108 -0
  860. package/dist/validation/alt-required-walker.js.map +1 -0
  861. package/dist/validation/default-registry.d.ts +12 -0
  862. package/dist/validation/default-registry.d.ts.map +1 -0
  863. package/dist/validation/default-registry.js +55 -0
  864. package/dist/validation/default-registry.js.map +1 -0
  865. package/dist/validation/publish-audit.d.ts +44 -0
  866. package/dist/validation/publish-audit.d.ts.map +1 -0
  867. package/dist/validation/publish-audit.js +64 -0
  868. package/dist/validation/publish-audit.js.map +1 -0
  869. package/dist/validation/registry.d.ts +23 -0
  870. package/dist/validation/registry.d.ts.map +1 -0
  871. package/dist/validation/registry.js +15 -0
  872. package/dist/validation/registry.js.map +1 -0
  873. package/dist/validation/save-delta.d.ts +46 -0
  874. package/dist/validation/save-delta.d.ts.map +1 -0
  875. package/dist/validation/save-delta.js +57 -0
  876. package/dist/validation/save-delta.js.map +1 -0
  877. package/dist/validation/scanner.d.ts +91 -0
  878. package/dist/validation/scanner.d.ts.map +1 -0
  879. package/dist/validation/scanner.js +327 -0
  880. package/dist/validation/scanner.js.map +1 -0
  881. package/dist/validation/template-impact.d.ts +52 -0
  882. package/dist/validation/template-impact.d.ts.map +1 -0
  883. package/dist/validation/template-impact.js +53 -0
  884. package/dist/validation/template-impact.js.map +1 -0
  885. package/dist/validation/types.d.ts +123 -0
  886. package/dist/validation/types.d.ts.map +1 -0
  887. package/dist/validation/types.js +7 -0
  888. package/dist/validation/types.js.map +1 -0
  889. package/dist/validation/validators/accessibility.d.ts +3 -0
  890. package/dist/validation/validators/accessibility.d.ts.map +1 -0
  891. package/dist/validation/validators/accessibility.js +106 -0
  892. package/dist/validation/validators/accessibility.js.map +1 -0
  893. package/dist/validation/validators/aliasof-points-to-archived.d.ts +40 -0
  894. package/dist/validation/validators/aliasof-points-to-archived.d.ts.map +1 -0
  895. package/dist/validation/validators/aliasof-points-to-archived.js +34 -0
  896. package/dist/validation/validators/aliasof-points-to-archived.js.map +1 -0
  897. package/dist/validation/validators/alt-required.d.ts +3 -0
  898. package/dist/validation/validators/alt-required.d.ts.map +1 -0
  899. package/dist/validation/validators/alt-required.js +118 -0
  900. package/dist/validation/validators/alt-required.js.map +1 -0
  901. package/dist/validation/validators/archive-not-supported-on-target.d.ts +3 -0
  902. package/dist/validation/validators/archive-not-supported-on-target.d.ts.map +1 -0
  903. package/dist/validation/validators/archive-not-supported-on-target.js +38 -0
  904. package/dist/validation/validators/archive-not-supported-on-target.js.map +1 -0
  905. package/dist/validation/validators/broken-links.d.ts +3 -0
  906. package/dist/validation/validators/broken-links.d.ts.map +1 -0
  907. package/dist/validation/validators/broken-links.js +190 -0
  908. package/dist/validation/validators/broken-links.js.map +1 -0
  909. package/dist/validation/validators/circular-alias.d.ts +36 -0
  910. package/dist/validation/validators/circular-alias.d.ts.map +1 -0
  911. package/dist/validation/validators/circular-alias.js +63 -0
  912. package/dist/validation/validators/circular-alias.js.map +1 -0
  913. package/dist/validation/validators/circular-fragment.d.ts +15 -0
  914. package/dist/validation/validators/circular-fragment.d.ts.map +1 -0
  915. package/dist/validation/validators/circular-fragment.js +97 -0
  916. package/dist/validation/validators/circular-fragment.js.map +1 -0
  917. package/dist/validation/validators/dangling-alias.d.ts +38 -0
  918. package/dist/validation/validators/dangling-alias.d.ts.map +1 -0
  919. package/dist/validation/validators/dangling-alias.js +31 -0
  920. package/dist/validation/validators/dangling-alias.js.map +1 -0
  921. package/dist/validation/validators/deploy-target-type-supported.d.ts +3 -0
  922. package/dist/validation/validators/deploy-target-type-supported.d.ts.map +1 -0
  923. package/dist/validation/validators/deploy-target-type-supported.js +32 -0
  924. package/dist/validation/validators/deploy-target-type-supported.js.map +1 -0
  925. package/dist/validation/validators/dynamic-route-conflict.d.ts +18 -0
  926. package/dist/validation/validators/dynamic-route-conflict.d.ts.map +1 -0
  927. package/dist/validation/validators/dynamic-route-conflict.js +80 -0
  928. package/dist/validation/validators/dynamic-route-conflict.js.map +1 -0
  929. package/dist/validation/validators/html-validity.d.ts +3 -0
  930. package/dist/validation/validators/html-validity.d.ts.map +1 -0
  931. package/dist/validation/validators/html-validity.js +89 -0
  932. package/dist/validation/validators/html-validity.js.map +1 -0
  933. package/dist/validation/validators/orphaned-locale-file.d.ts +21 -0
  934. package/dist/validation/validators/orphaned-locale-file.d.ts.map +1 -0
  935. package/dist/validation/validators/orphaned-locale-file.js +84 -0
  936. package/dist/validation/validators/orphaned-locale-file.js.map +1 -0
  937. package/dist/validation/validators/referenced-archived-without-alias.d.ts +3 -0
  938. package/dist/validation/validators/referenced-archived-without-alias.d.ts.map +1 -0
  939. package/dist/validation/validators/referenced-archived-without-alias.js +65 -0
  940. package/dist/validation/validators/referenced-archived-without-alias.js.map +1 -0
  941. package/dist/validation/validators/referenced-asset-exists.d.ts +13 -0
  942. package/dist/validation/validators/referenced-asset-exists.d.ts.map +1 -0
  943. package/dist/validation/validators/referenced-asset-exists.js +80 -0
  944. package/dist/validation/validators/referenced-asset-exists.js.map +1 -0
  945. package/dist/validation/validators/referenced-fragment-exists.d.ts +9 -0
  946. package/dist/validation/validators/referenced-fragment-exists.d.ts.map +1 -0
  947. package/dist/validation/validators/referenced-fragment-exists.js +52 -0
  948. package/dist/validation/validators/referenced-fragment-exists.js.map +1 -0
  949. package/dist/validation/validators/referenced-template-exists.d.ts +10 -0
  950. package/dist/validation/validators/referenced-template-exists.d.ts.map +1 -0
  951. package/dist/validation/validators/referenced-template-exists.js +74 -0
  952. package/dist/validation/validators/referenced-template-exists.js.map +1 -0
  953. package/dist/validation/validators/schema-conformance.d.ts +17 -0
  954. package/dist/validation/validators/schema-conformance.d.ts.map +1 -0
  955. package/dist/validation/validators/schema-conformance.js +94 -0
  956. package/dist/validation/validators/schema-conformance.js.map +1 -0
  957. package/dist/validation/validators/target-deploy-coverage.d.ts +3 -0
  958. package/dist/validation/validators/target-deploy-coverage.d.ts.map +1 -0
  959. package/dist/validation/validators/target-deploy-coverage.js +37 -0
  960. package/dist/validation/validators/target-deploy-coverage.js.map +1 -0
  961. package/dist/validation/validators/unused-fragment.d.ts +16 -0
  962. package/dist/validation/validators/unused-fragment.d.ts.map +1 -0
  963. package/dist/validation/validators/unused-fragment.js +86 -0
  964. package/dist/validation/validators/unused-fragment.js.map +1 -0
  965. package/package.json +69 -27
  966. package/admin-dist/assets/index-B6pVot0Y.css +0 -1
  967. package/admin-dist/assets/index-DniLwxJA.js +0 -609
  968. package/admin-dist/assets/rolldown-runtime-COnpUsM8.js +0 -1
  969. package/admin-dist/assets/vendor-rjsf-HKBAjOmQ.js +0 -32
  970. package/admin-dist/assets/vendor-tiptap-IyO99U4R.js +0 -142
  971. package/admin-dist/assets/vendor-vue-D3wBSmDf.js +0 -1
  972. package/dist/providers/r2.d.ts +0 -8
  973. package/dist/providers/r2.d.ts.map +0 -1
  974. package/dist/providers/r2.js +0 -86
  975. package/dist/providers/r2.js.map +0 -1
  976. package/dist/publish-locale.d.ts +0 -44
  977. package/dist/publish-locale.d.ts.map +0 -1
  978. package/dist/publish-locale.js +0 -103
  979. package/dist/publish-locale.js.map +0 -1
  980. package/dist/source-sidecars.d.ts +0 -32
  981. package/dist/source-sidecars.d.ts.map +0 -1
  982. package/dist/source-sidecars.js +0 -98
  983. package/dist/source-sidecars.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-gap-warnings.d.ts","sourceRoot":"","sources":["../../src/runtime/capability-gap-warnings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,aAAa,CAAA;AAG7D;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAenE"}
@@ -0,0 +1,28 @@
1
+ import { inspectTarget } from './runtime-capabilities.js';
2
+ /**
3
+ * Walk the site's targets at boot; emit a warning per target that
4
+ * has any capability gap. Logs are operator-facing — once
5
+ * `design-logging.md`'s structured logger ships, replace `console.warn`
6
+ * with `log.warn({ module: 'admin-api.capability-gap', ... })`.
7
+ *
8
+ * Idempotent: calling twice produces the same warnings. The caller
9
+ * (admin-api boot path) calls once.
10
+ *
11
+ * @returns the count of targets with gaps — useful for tests.
12
+ */
13
+ export function warnOnCapabilityGaps(manifest) {
14
+ const targets = (manifest.targets ?? {});
15
+ let count = 0;
16
+ for (const [name, target] of Object.entries(targets)) {
17
+ const inspection = inspectTarget(target);
18
+ if (inspection.gaps.length === 0)
19
+ continue;
20
+ count++;
21
+ const reasons = inspection.gaps.map(g => `${g.capability}: ${g.reason}`).join('; ');
22
+ console.warn(` Warning: target "${name}" has runtime capability gaps. ${reasons}. ` +
23
+ 'Archive operations on this target may not emit 301/410 redirects. ' +
24
+ 'See https://gazetta.studio/docs/runtime-capabilities for resolution paths.');
25
+ }
26
+ return count;
27
+ }
28
+ //# sourceMappingURL=capability-gap-warnings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-gap-warnings.js","sourceRoot":"","sources":["../../src/runtime/capability-gap-warnings.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAEzD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAsB;IACzD,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAiC,CAAA;IACxE,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;QACxC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAQ;QAC1C,KAAK,EAAE,CAAA;QACP,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnF,OAAO,CAAC,IAAI,CACV,sBAAsB,IAAI,kCAAkC,OAAO,IAAI;YACrE,oEAAoE;YACpE,4EAA4E,CAC/E,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Host-format redirect manifest emit per design-soft-delete.md Q10.
3
+ *
4
+ * Plain-static targets (no worker) can't read the per-page HTML
5
+ * marker. They get a `_redirects` (or equivalent) file at the target
6
+ * root that the host runtime reads. Cloudflare Pages and Netlify
7
+ * both honor this convention; their syntax is identical for the
8
+ * patterns we emit.
9
+ *
10
+ * Worker-served target types DON'T need this — the worker reads the
11
+ * HTML marker directly per request.
12
+ *
13
+ * Pure functions: takes the archive summary list, returns the file
14
+ * content as a string. Caller (publish.ts) writes to storage.
15
+ *
16
+ * SRP: this module owns the wire format. Walking the source for
17
+ * archived pages is the caller's job. Adding a new host format
18
+ * (e.g., a future Vercel-specific dialect) extends the file with a
19
+ * new emit function and the type union — existing emitters
20
+ * untouched.
21
+ */
22
+ import type { RedirectsFormat } from '../types.js';
23
+ /**
24
+ * Summary of one archived page contributing to the redirects file.
25
+ *
26
+ * `from`: source route (e.g. `/landing`). Includes leading slash;
27
+ * empty path is the homepage `/`.
28
+ * `to`: alias target route — only present when the archive has
29
+ * `aliasOf` set. When absent, this entry is a 410 Gone.
30
+ */
31
+ export interface ArchiveSummary {
32
+ from: string;
33
+ to?: string;
34
+ }
35
+ /**
36
+ * Emit the `_redirects` file body. Cloudflare and Netlify share the
37
+ * same syntax for the patterns we emit:
38
+ *
39
+ * /from /to 301 — permanent alias redirect
40
+ * /from / 410 — soft-delete (gone)
41
+ *
42
+ * Cloudflare and Netlify both default to 301 when status is omitted,
43
+ * but we emit it explicitly for forensic clarity. The `410` row uses
44
+ * `/` as the destination because both hosts require a destination
45
+ * column even for status-only rules; both will apply the status
46
+ * regardless of where the destination points.
47
+ *
48
+ * Sorted by `from` so the output is deterministic across publishes.
49
+ * Determinism matters because the file is content-addressed
50
+ * downstream (host's CDN may cache it; same input = same output =
51
+ * cache hit on republish without changes).
52
+ */
53
+ export declare function emitCloudflareRedirects(archives: ReadonlyArray<ArchiveSummary>): string;
54
+ /**
55
+ * Netlify uses the same `_redirects` grammar as Cloudflare for the
56
+ * patterns we emit. Kept as a separate function so that future
57
+ * Netlify-specific extensions (e.g., country-aware redirects via
58
+ * `Country` headers) land here without forking Cloudflare.
59
+ */
60
+ export declare function emitNetlifyRedirects(archives: ReadonlyArray<ArchiveSummary>): string;
61
+ /**
62
+ * Structured JSON for custom host integrations. Operators with
63
+ * non-Cloudflare/Netlify hosting wire their own glue (Caddy
64
+ * `redir` directives, nginx rules, AWS CloudFront functions,
65
+ * etc.) and consume this file at deploy time.
66
+ *
67
+ * Shape:
68
+ * {
69
+ * redirects: [{ from, to, status: 301 }, ...],
70
+ * gone: [{ path, status: 410 }, ...]
71
+ * }
72
+ *
73
+ * Same sort order as Cloudflare/Netlify emit (alphabetical by
74
+ * source path) so output is deterministic.
75
+ */
76
+ export declare function emitJsonRedirects(archives: ReadonlyArray<ArchiveSummary>): string;
77
+ /**
78
+ * The destination filename per format. Cloudflare and Netlify both
79
+ * use `_redirects` at the site root; the JSON form lives at
80
+ * `redirects.json`.
81
+ */
82
+ export declare function redirectsFilename(format: Exclude<RedirectsFormat, 'none'>): string;
83
+ /**
84
+ * Emit the file body for the given format. Returns null when the
85
+ * format is `'none'` — callers skip writing entirely. Returns empty
86
+ * string when there are no archives — caller decides whether to
87
+ * write an empty file or skip.
88
+ */
89
+ export declare function emitRedirects(format: RedirectsFormat, archives: ReadonlyArray<ArchiveSummary>): {
90
+ filename: string;
91
+ body: string;
92
+ } | null;
93
+ //# sourceMappingURL=redirects-emit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirects-emit.d.ts","sourceRoot":"","sources":["../../src/runtime/redirects-emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,GAAG,MAAM,CAKvF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,GAAG,MAAM,CAEpF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,GAAG,MAAM,CAKjF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,MAAM,CAQlF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,GACtC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAW3C"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Emit the `_redirects` file body. Cloudflare and Netlify share the
3
+ * same syntax for the patterns we emit:
4
+ *
5
+ * /from /to 301 — permanent alias redirect
6
+ * /from / 410 — soft-delete (gone)
7
+ *
8
+ * Cloudflare and Netlify both default to 301 when status is omitted,
9
+ * but we emit it explicitly for forensic clarity. The `410` row uses
10
+ * `/` as the destination because both hosts require a destination
11
+ * column even for status-only rules; both will apply the status
12
+ * regardless of where the destination points.
13
+ *
14
+ * Sorted by `from` so the output is deterministic across publishes.
15
+ * Determinism matters because the file is content-addressed
16
+ * downstream (host's CDN may cache it; same input = same output =
17
+ * cache hit on republish without changes).
18
+ */
19
+ export function emitCloudflareRedirects(archives) {
20
+ if (archives.length === 0)
21
+ return '';
22
+ const sorted = [...archives].sort((a, b) => a.from.localeCompare(b.from));
23
+ const lines = sorted.map(a => (a.to ? `${a.from} ${a.to} 301` : `${a.from} / 410`));
24
+ return lines.join('\n') + '\n';
25
+ }
26
+ /**
27
+ * Netlify uses the same `_redirects` grammar as Cloudflare for the
28
+ * patterns we emit. Kept as a separate function so that future
29
+ * Netlify-specific extensions (e.g., country-aware redirects via
30
+ * `Country` headers) land here without forking Cloudflare.
31
+ */
32
+ export function emitNetlifyRedirects(archives) {
33
+ return emitCloudflareRedirects(archives);
34
+ }
35
+ /**
36
+ * Structured JSON for custom host integrations. Operators with
37
+ * non-Cloudflare/Netlify hosting wire their own glue (Caddy
38
+ * `redir` directives, nginx rules, AWS CloudFront functions,
39
+ * etc.) and consume this file at deploy time.
40
+ *
41
+ * Shape:
42
+ * {
43
+ * redirects: [{ from, to, status: 301 }, ...],
44
+ * gone: [{ path, status: 410 }, ...]
45
+ * }
46
+ *
47
+ * Same sort order as Cloudflare/Netlify emit (alphabetical by
48
+ * source path) so output is deterministic.
49
+ */
50
+ export function emitJsonRedirects(archives) {
51
+ const sorted = [...archives].sort((a, b) => a.from.localeCompare(b.from));
52
+ const redirects = sorted.filter(a => a.to !== undefined).map(a => ({ from: a.from, to: a.to, status: 301 }));
53
+ const gone = sorted.filter(a => a.to === undefined).map(a => ({ path: a.from, status: 410 }));
54
+ return JSON.stringify({ redirects, gone }, null, 2) + '\n';
55
+ }
56
+ /**
57
+ * The destination filename per format. Cloudflare and Netlify both
58
+ * use `_redirects` at the site root; the JSON form lives at
59
+ * `redirects.json`.
60
+ */
61
+ export function redirectsFilename(format) {
62
+ switch (format) {
63
+ case 'cloudflare':
64
+ case 'netlify':
65
+ return '_redirects';
66
+ case 'json':
67
+ return 'redirects.json';
68
+ }
69
+ }
70
+ /**
71
+ * Emit the file body for the given format. Returns null when the
72
+ * format is `'none'` — callers skip writing entirely. Returns empty
73
+ * string when there are no archives — caller decides whether to
74
+ * write an empty file or skip.
75
+ */
76
+ export function emitRedirects(format, archives) {
77
+ if (format === 'none')
78
+ return null;
79
+ const filename = redirectsFilename(format);
80
+ switch (format) {
81
+ case 'cloudflare':
82
+ return { filename, body: emitCloudflareRedirects(archives) };
83
+ case 'netlify':
84
+ return { filename, body: emitNetlifyRedirects(archives) };
85
+ case 'json':
86
+ return { filename, body: emitJsonRedirects(archives) };
87
+ }
88
+ }
89
+ //# sourceMappingURL=redirects-emit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirects-emit.js","sourceRoot":"","sources":["../../src/runtime/redirects-emit.ts"],"names":[],"mappings":"AAoCA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAuC;IAC7E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IACzE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAA;IACvF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAChC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAuC;IAC1E,OAAO,uBAAuB,CAAC,QAAQ,CAAC,CAAA;AAC1C,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAuC;IACvE,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IACzE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAC5G,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAC7F,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAA;AAC5D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAwC;IACxE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,YAAY,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,YAAY,CAAA;QACrB,KAAK,MAAM;YACT,OAAO,gBAAgB,CAAA;IAC3B,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAuB,EACvB,QAAuC;IAEvC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IAClC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAA;IAC1C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,YAAY;YACf,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,CAAC,QAAQ,CAAC,EAAE,CAAA;QAC9D,KAAK,SAAS;YACZ,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAA;QAC3D,KAAK,MAAM;YACT,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAA;IAC1D,CAAC;AACH,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Runtime capability inspection for a configured target.
3
+ *
4
+ * Per `feature-design-process.md` non-foundational disciplines
5
+ * ("Capability-gap UX surfaced at four points") and
6
+ * `design-soft-delete.md` Q10 capability-gap principle: when a feature
7
+ * needs a runtime capability that some configured targets can't
8
+ * provide (archive needing redirects on a worker; future presence
9
+ * needing a persistent connection; future RBAC content filtering
10
+ * needing per-request rendering), the gap surfaces at four uniform
11
+ * places: (1) boot config validate, (2) author-time modal,
12
+ * (3) validator scanner, (4) pre-publish gate.
13
+ *
14
+ * This module is the shared primitive — pure predicates over a
15
+ * `TargetConfig`. Each of the four surfaces consumes the same answer
16
+ * so authors and operators see consistent gap reporting regardless
17
+ * of which surface they're looking at.
18
+ *
19
+ * # The capability vocabulary (closed enum)
20
+ *
21
+ * Future capabilities (presence, RBAC content filtering, dynamic
22
+ * fragments) extend the enum. Each new entry pairs with one or more
23
+ * features that need it; the inspector grows additively without
24
+ * existing call-sites changing.
25
+ *
26
+ * # SOLID
27
+ *
28
+ * - SRP: one file, pure predicates. No I/O, no side effects.
29
+ * - OCP: capability enum extends; existing call sites stay unchanged
30
+ * (they ask "do you have X?" not "are you platform Y?").
31
+ * - DIP: callers depend on the abstract `RuntimeCapability` enum +
32
+ * `inspectTarget()` function, not on platform discrimination.
33
+ */
34
+ import type { TargetConfig } from '../types.js';
35
+ /**
36
+ * Closed enum of runtime capabilities. Extend for new features that
37
+ * need capability-gap UX (presence, RBAC content filtering, dynamic
38
+ * fragments, etc.).
39
+ */
40
+ export type RuntimeCapability =
41
+ /** Worker reads HTML markers and emits `301 → aliasOf` for archived items. */
42
+ 'redirects'
43
+ /** Worker emits `410 Gone` for archived-no-alias items. */
44
+ | 'gone-status';
45
+ /** Reason a capability is missing — surfaces in audit + author UI. */
46
+ export interface CapabilityGap {
47
+ capability: RuntimeCapability;
48
+ /** Human-readable reason; surfaces in author modals + audit logs. */
49
+ reason: string;
50
+ }
51
+ export interface TargetCapabilities {
52
+ /** Capabilities the target supports. */
53
+ has: ReadonlySet<RuntimeCapability>;
54
+ /** Per-missing-capability reasons for the four surfaces. */
55
+ gaps: readonly CapabilityGap[];
56
+ }
57
+ /**
58
+ * Inspect a target's runtime capabilities. Plain-static targets
59
+ * (no worker, no `_redirects` host glue) lack `redirects` and
60
+ * `gone-status`; everything else has both.
61
+ *
62
+ * The plain-static heuristic matches the existing P4 validator
63
+ * (`archive-not-supported-on-target`): `type === 'static'` AND no
64
+ * `redirects.format` configured (or `'none'`) means the host has
65
+ * no mechanism to emit 301/410 for archived URLs.
66
+ *
67
+ * Worker-served target types (`dynamic` + `static-with-worker`)
68
+ * support both capabilities natively. Static targets WITH
69
+ * `redirects.format` ('cloudflare' | 'netlify' | 'json') support
70
+ * `redirects` via the host's `_redirects` file, but plain-static
71
+ * with no host config can't emit `Gone` status — the host's
72
+ * natural 404 is the floor.
73
+ */
74
+ export declare function inspectTarget(target: TargetConfig): TargetCapabilities;
75
+ /** Convenience predicate — boolean answer to "can this target serve 301 redirects?" */
76
+ export declare function canServeRedirects(target: TargetConfig): boolean;
77
+ /** Convenience predicate — boolean answer to "can this target serve 410 Gone?" */
78
+ export declare function canServeGoneStatus(target: TargetConfig): boolean;
79
+ //# sourceMappingURL=runtime-capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-capabilities.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime-capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C;;;;GAIG;AACH,MAAM,MAAM,iBAAiB;AAC3B,8EAA8E;AAC5E,WAAW;AACb,2DAA2D;GACzD,aAAa,CAAA;AAEjB,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,iBAAiB,CAAA;IAC7B,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,GAAG,EAAE,WAAW,CAAC,iBAAiB,CAAC,CAAA;IACnC,4DAA4D;IAC5D,IAAI,EAAE,SAAS,aAAa,EAAE,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,kBAAkB,CAoCtE;AAED,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAE/D;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAEhE"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Inspect a target's runtime capabilities. Plain-static targets
3
+ * (no worker, no `_redirects` host glue) lack `redirects` and
4
+ * `gone-status`; everything else has both.
5
+ *
6
+ * The plain-static heuristic matches the existing P4 validator
7
+ * (`archive-not-supported-on-target`): `type === 'static'` AND no
8
+ * `redirects.format` configured (or `'none'`) means the host has
9
+ * no mechanism to emit 301/410 for archived URLs.
10
+ *
11
+ * Worker-served target types (`dynamic` + `static-with-worker`)
12
+ * support both capabilities natively. Static targets WITH
13
+ * `redirects.format` ('cloudflare' | 'netlify' | 'json') support
14
+ * `redirects` via the host's `_redirects` file, but plain-static
15
+ * with no host config can't emit `Gone` status — the host's
16
+ * natural 404 is the floor.
17
+ */
18
+ export function inspectTarget(target) {
19
+ const has = new Set();
20
+ const gaps = [];
21
+ const redirectsFormat = target.redirects?.format;
22
+ const isPlainStatic = target.type === 'static' && (redirectsFormat === undefined || redirectsFormat === 'none');
23
+ // Worker presence detected via:
24
+ // - `type: 'dynamic'` (ESI mode runs on a worker), OR
25
+ // - a WorkerCapableDeployAdapter (e.g., cloudflareWorkersDeploy)
26
+ // Pure-static deploy adapters (GitHub Pages, S3 static, etc.) don't
27
+ // bundle a worker and don't implement workerRuntimeConfig().
28
+ const hasWorker = target.type === 'dynamic' || (target.deploy !== undefined && 'workerRuntimeConfig' in target.deploy);
29
+ const hasHostRedirects = redirectsFormat !== undefined && redirectsFormat !== 'none';
30
+ if (hasWorker || hasHostRedirects) {
31
+ has.add('redirects');
32
+ }
33
+ else {
34
+ gaps.push({
35
+ capability: 'redirects',
36
+ reason: isPlainStatic
37
+ ? "plain-static target has no worker and no `redirects.format` configured; archived URLs return the host's natural 404 instead of a 301 redirect"
38
+ : 'target lacks a runtime that can emit 301 redirects',
39
+ });
40
+ }
41
+ if (hasWorker) {
42
+ has.add('gone-status');
43
+ }
44
+ else {
45
+ gaps.push({
46
+ capability: 'gone-status',
47
+ reason: "no worker runtime available to emit `410 Gone` for archived-no-alias items; falls back to the host's natural 404",
48
+ });
49
+ }
50
+ return { has, gaps };
51
+ }
52
+ /** Convenience predicate — boolean answer to "can this target serve 301 redirects?" */
53
+ export function canServeRedirects(target) {
54
+ return inspectTarget(target).has.has('redirects');
55
+ }
56
+ /** Convenience predicate — boolean answer to "can this target serve 410 Gone?" */
57
+ export function canServeGoneStatus(target) {
58
+ return inspectTarget(target).has.has('gone-status');
59
+ }
60
+ //# sourceMappingURL=runtime-capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-capabilities.js","sourceRoot":"","sources":["../../src/runtime/runtime-capabilities.ts"],"names":[],"mappings":"AA4DA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAAC,MAAoB;IAChD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAqB,CAAA;IACxC,MAAM,IAAI,GAAoB,EAAE,CAAA;IAEhC,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,CAAA;IAChD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,MAAM,CAAC,CAAA;IAC/G,gCAAgC;IAChC,wDAAwD;IACxD,mEAAmE;IACnE,oEAAoE;IACpE,6DAA6D;IAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,qBAAqB,IAAI,MAAM,CAAC,MAAM,CAAC,CAAA;IACtH,MAAM,gBAAgB,GAAG,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,MAAM,CAAA;IAEpF,IAAI,SAAS,IAAI,gBAAgB,EAAE,CAAC;QAClC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IACtB,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAAI,CAAC;YACR,UAAU,EAAE,WAAW;YACvB,MAAM,EAAE,aAAa;gBACnB,CAAC,CAAC,+IAA+I;gBACjJ,CAAC,CAAC,oDAAoD;SACzD,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IACxB,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAAI,CAAC;YACR,UAAU,EAAE,aAAa;YACzB,MAAM,EACJ,kHAAkH;SACrH,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAA;AACtB,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,iBAAiB,CAAC,MAAoB;IACpD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;AACnD,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;AACrD,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Save-concurrency etag — a content hash used by the save endpoints
3
+ * to detect stale writes. Different from the publish-state hash in
4
+ * `hash.ts`:
5
+ *
6
+ * `.{8hex}.hash` (publish-state, MD5)
7
+ * - Substitutes template + fragment hashes into the manifest
8
+ * - Drives sidecars, compare, cache invalidation
9
+ * - Server-only: requires `templateHashes` and `fragmentHashes`
10
+ * maps that the client doesn't have
11
+ *
12
+ * save etag (this module, SHA-256, 16 hex)
13
+ * - Pure manifest content; no template/fragment substitution
14
+ * - Drives `If-Match` save concurrency per `design-offline.md` Q3
15
+ * - Computable identically by client + server (same canonicalization,
16
+ * same Web Crypto API)
17
+ *
18
+ * # Why two etags
19
+ *
20
+ * Save concurrency asks: "did THIS page's manifest change between
21
+ * my read and my write?" A template change doesn't dirty individual
22
+ * pages from the author's perspective — the author edits page X;
23
+ * if a colleague separately edits the template, that's a render
24
+ * concern, not a save-conflict concern. Mixing the two would force
25
+ * 409 STALE on every author after a template edit, which is wrong UX.
26
+ *
27
+ * The `.{8hex}.hash` etag legitimately includes template/fragment
28
+ * dependencies because IT drives publish + cache invalidation, where
29
+ * the question IS "did anything in the dep tree change."
30
+ *
31
+ * Two etags, two semantics, two consumers. Locked per `design-offline.md`
32
+ * Cut 9 grilling.
33
+ *
34
+ * # Why SHA-256 truncated to 16 hex (not MD5 truncated to 8)
35
+ *
36
+ * Save etags collide more often than publish hashes — every save is
37
+ * a new etag candidate; many saves per page over a long offline
38
+ * session. A collision = silent stale-write (false negative on
39
+ * conflict). 8 hex MD5 = 4B keyspace; tens of thousands of saves
40
+ * across thousands of pages would hit the birthday bound. 16 hex
41
+ * SHA-256 = 18.4 quintillion keyspace; collisions are not a
42
+ * realistic concern. Cost: 8 extra characters in the ETag header.
43
+ *
44
+ * # Client + server parity contract
45
+ *
46
+ * Both call `computeSaveEtag(manifest)` and MUST produce identical
47
+ * output. Canonicalization rules:
48
+ *
49
+ * 1. Pick fields: `template`, `content`, `components`, `metadata`,
50
+ * `route`. Other fields ignored (sidecars, derived state, etc.).
51
+ * 2. JSON.stringify with sorted keys via the existing
52
+ * `sortedReplacer` (deep recursive object-key sort).
53
+ * 3. SHA-256 via `globalThis.crypto.subtle.digest('SHA-256', bytes)`
54
+ * (Web Crypto; works in Node 18+ and all browsers).
55
+ * 4. Take first 8 bytes (16 hex characters).
56
+ */
57
+ /**
58
+ * Compute the save etag for a page or fragment manifest. Returns 16
59
+ * lowercase hex characters (first 8 bytes of SHA-256).
60
+ *
61
+ * Both client and server call this with the same manifest object;
62
+ * both produce the same etag. Used for `ETag` response header on
63
+ * GET and `If-Match` request header on PUT.
64
+ *
65
+ * Async because Web Crypto's `digest` is async. Callers in hot paths
66
+ * (save handlers, contract tests) await once per save.
67
+ */
68
+ export declare function computeSaveEtag(manifest: Record<string, unknown>): Promise<string>;
69
+ //# sourceMappingURL=save-etag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save-etag.d.ts","sourceRoot":"","sources":["../src/save-etag.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAqCH;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAexF"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Save-concurrency etag — a content hash used by the save endpoints
3
+ * to detect stale writes. Different from the publish-state hash in
4
+ * `hash.ts`:
5
+ *
6
+ * `.{8hex}.hash` (publish-state, MD5)
7
+ * - Substitutes template + fragment hashes into the manifest
8
+ * - Drives sidecars, compare, cache invalidation
9
+ * - Server-only: requires `templateHashes` and `fragmentHashes`
10
+ * maps that the client doesn't have
11
+ *
12
+ * save etag (this module, SHA-256, 16 hex)
13
+ * - Pure manifest content; no template/fragment substitution
14
+ * - Drives `If-Match` save concurrency per `design-offline.md` Q3
15
+ * - Computable identically by client + server (same canonicalization,
16
+ * same Web Crypto API)
17
+ *
18
+ * # Why two etags
19
+ *
20
+ * Save concurrency asks: "did THIS page's manifest change between
21
+ * my read and my write?" A template change doesn't dirty individual
22
+ * pages from the author's perspective — the author edits page X;
23
+ * if a colleague separately edits the template, that's a render
24
+ * concern, not a save-conflict concern. Mixing the two would force
25
+ * 409 STALE on every author after a template edit, which is wrong UX.
26
+ *
27
+ * The `.{8hex}.hash` etag legitimately includes template/fragment
28
+ * dependencies because IT drives publish + cache invalidation, where
29
+ * the question IS "did anything in the dep tree change."
30
+ *
31
+ * Two etags, two semantics, two consumers. Locked per `design-offline.md`
32
+ * Cut 9 grilling.
33
+ *
34
+ * # Why SHA-256 truncated to 16 hex (not MD5 truncated to 8)
35
+ *
36
+ * Save etags collide more often than publish hashes — every save is
37
+ * a new etag candidate; many saves per page over a long offline
38
+ * session. A collision = silent stale-write (false negative on
39
+ * conflict). 8 hex MD5 = 4B keyspace; tens of thousands of saves
40
+ * across thousands of pages would hit the birthday bound. 16 hex
41
+ * SHA-256 = 18.4 quintillion keyspace; collisions are not a
42
+ * realistic concern. Cost: 8 extra characters in the ETag header.
43
+ *
44
+ * # Client + server parity contract
45
+ *
46
+ * Both call `computeSaveEtag(manifest)` and MUST produce identical
47
+ * output. Canonicalization rules:
48
+ *
49
+ * 1. Pick fields: `template`, `content`, `components`, `metadata`,
50
+ * `route`. Other fields ignored (sidecars, derived state, etc.).
51
+ * 2. JSON.stringify with sorted keys via the existing
52
+ * `sortedReplacer` (deep recursive object-key sort).
53
+ * 3. SHA-256 via `globalThis.crypto.subtle.digest('SHA-256', bytes)`
54
+ * (Web Crypto; works in Node 18+ and all browsers).
55
+ * 4. Take first 8 bytes (16 hex characters).
56
+ */
57
+ /**
58
+ * Manifest fields that participate in the save etag.
59
+ *
60
+ * Archive fields (per `design-soft-delete.md` Q1) are part of the etag
61
+ * because archive transitions are saves the concurrency model must
62
+ * detect: if author A archives page X while author B is editing it,
63
+ * B's next save must 409-STALE rather than silently overwrite A's
64
+ * archive. Same logic for `aliasOf` flatten cascades and unarchive.
65
+ */
66
+ const SAVE_ETAG_FIELDS = [
67
+ 'template',
68
+ 'content',
69
+ 'components',
70
+ 'metadata',
71
+ 'route',
72
+ 'archived',
73
+ 'archivedAt',
74
+ 'archivedBy',
75
+ 'aliasOf',
76
+ ];
77
+ /** Canonical JSON via sorted-key recursion. Same shape as the
78
+ * publish-hash module's sortedReplacer; duplicated here so this
79
+ * module is self-contained (see SRP note in the file header). */
80
+ function sortedReplacer(_key, value) {
81
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
82
+ const out = {};
83
+ for (const k of Object.keys(value).sort()) {
84
+ out[k] = value[k];
85
+ }
86
+ return out;
87
+ }
88
+ return value;
89
+ }
90
+ /**
91
+ * Compute the save etag for a page or fragment manifest. Returns 16
92
+ * lowercase hex characters (first 8 bytes of SHA-256).
93
+ *
94
+ * Both client and server call this with the same manifest object;
95
+ * both produce the same etag. Used for `ETag` response header on
96
+ * GET and `If-Match` request header on PUT.
97
+ *
98
+ * Async because Web Crypto's `digest` is async. Callers in hot paths
99
+ * (save handlers, contract tests) await once per save.
100
+ */
101
+ export async function computeSaveEtag(manifest) {
102
+ const picked = {};
103
+ for (const field of SAVE_ETAG_FIELDS) {
104
+ if (field in manifest)
105
+ picked[field] = manifest[field];
106
+ }
107
+ const json = JSON.stringify(picked, sortedReplacer);
108
+ const bytes = new TextEncoder().encode(json);
109
+ const digest = await globalThis.crypto.subtle.digest('SHA-256', bytes);
110
+ // First 8 bytes = 16 hex characters.
111
+ const view = new Uint8Array(digest, 0, 8);
112
+ let out = '';
113
+ for (let i = 0; i < view.length; i++) {
114
+ out += view[i].toString(16).padStart(2, '0');
115
+ }
116
+ return out;
117
+ }
118
+ //# sourceMappingURL=save-etag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save-etag.js","sourceRoot":"","sources":["../src/save-etag.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH;;;;;;;;GAQG;AACH,MAAM,gBAAgB,GAAG;IACvB,UAAU;IACV,SAAS;IACT,YAAY;IACZ,UAAU;IACV,OAAO;IACP,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,SAAS;CACD,CAAA;AAEV;;kEAEkE;AAClE,SAAS,cAAc,CAAC,IAAY,EAAE,KAAc;IAClD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,GAAG,GAA4B,EAAE,CAAA;QACvC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACrE,GAAG,CAAC,CAAC,CAAC,GAAI,KAAiC,CAAC,CAAC,CAAC,CAAA;QAChD,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAiC;IACrE,MAAM,MAAM,GAA4B,EAAE,CAAA;IAC1C,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACrC,IAAI,KAAK,IAAI,QAAQ;YAAE,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACxD,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IACnD,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC5C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IACtE,qCAAqC;IACrC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACzC,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC9C,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Asset override dimensions — the axes along which an asset's bytes,
3
+ * variants, and metadata can vary from its default.
4
+ *
5
+ * v1 ships two first-class dimensions:
6
+ * - `locale` — content-level (e.g. text baked into image varies by language)
7
+ * - `theme` — presentation-level (e.g. logo with light/dark variants)
8
+ *
9
+ * Both are peer dimensions in the abstract model. Each asset can opt into
10
+ * any combination — a logo might have `(en, dark)`, `(fr, dark)`, `(de, dark)`
11
+ * variants but no light-mode variants because the default works for light.
12
+ *
13
+ * # Why a closed dimension set
14
+ *
15
+ * A user-defined dimension model (arbitrary axes per site) was rejected
16
+ * during foundation design. 90% of value is locale + theme; arbitrary
17
+ * dimensions complicate the picker UI, fallback chain semantics, and
18
+ * filename composition with no concrete demand. Adding a third dimension
19
+ * later means extending this union and `DIMENSION_ORDER` — mechanical.
20
+ *
21
+ * # Filename composition
22
+ *
23
+ * `DIMENSION_ORDER` fixes the order in which dimensions appear in
24
+ * filenames. `{name}.asset.{locale}.{theme}.json` (locale before theme).
25
+ * Changing the order would re-key every existing locale-only manifest, so
26
+ * it's locked: locale always first.
27
+ *
28
+ * # Selector semantics
29
+ *
30
+ * A `Selector` represents a specific combination of dimension values.
31
+ * `null` selector = "default-default" (no overrides; the canonical asset).
32
+ * Empty `Selector` Map is structurally invalid — callers must use `null`
33
+ * to express "no dimensions selected." Validators enforce.
34
+ */
35
+ /** The set of override dimensions an asset can vary along. */
36
+ export type DimensionName = 'locale' | 'theme';
37
+ /**
38
+ * Order in which dimensions appear in composed filenames. Locked: locale
39
+ * before theme. Adding a new dimension extends this constant; existing
40
+ * filenames stay valid because they have no value for the new dimension.
41
+ */
42
+ export declare const DIMENSION_ORDER: readonly DimensionName[];
43
+ /**
44
+ * A specific combination of dimension values that addresses one asset
45
+ * variant (or the default, when null).
46
+ *
47
+ * Examples:
48
+ * `null` — the default asset
49
+ * `Map { 'locale' → 'fr' }` — French (default theme)
50
+ * `Map { 'locale' → 'fr', 'theme' → 'dark' }` — French + dark
51
+ * `Map { 'theme' → 'dark' }` — dark (default locale)
52
+ */
53
+ export type Selector = ReadonlyMap<DimensionName, string>;
54
+ /** True when `selector` has at least one dimension set. */
55
+ export declare function isNonEmptySelector(selector: Selector | null): selector is Selector;
56
+ /**
57
+ * Build a Selector from individual dimension values, omitting unset ones.
58
+ * Returns `null` when all dimensions are absent — semantically equivalent
59
+ * to "the default asset."
60
+ */
61
+ export declare function buildSelector(values: Partial<Record<DimensionName, string>>): Selector | null;
62
+ /**
63
+ * Compose the path-suffix portion of a filename for a selector. Walks
64
+ * `DIMENSION_ORDER` so the order is deterministic regardless of insertion
65
+ * order in the underlying Map.
66
+ *
67
+ * null → '' (no suffix)
68
+ * { locale: 'fr' } → '.fr'
69
+ * { theme: 'dark' } → '.dark'
70
+ * { locale: 'fr', theme: 'dark'} → '.fr.dark'
71
+ */
72
+ export declare function selectorSuffix(selector: Selector | null): string;
73
+ /**
74
+ * Two selectors are equivalent when they have the same dimensions set
75
+ * to the same values, ignoring iteration order.
76
+ */
77
+ export declare function selectorsEqual(a: Selector | null, b: Selector | null): boolean;
78
+ //# sourceMappingURL=dimensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimensions.d.ts","sourceRoot":"","sources":["../../src/schema/dimensions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,8DAA8D;AAC9D,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAA;AAE9C;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAAwB,CAAA;AAE5E;;;;;;;;;GASG;AACH,MAAM,MAAM,QAAQ,GAAG,WAAW,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;AAEzD,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,QAAQ,IAAI,QAAQ,CAElF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,GAAG,QAAQ,GAAG,IAAI,CAO7F;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM,CAQhE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,OAAO,CAQ9E"}