gazetta 0.7.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 (738) 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/hook-audit-emitter.d.ts +38 -0
  21. package/dist/admin-api/hook-audit-emitter.d.ts.map +1 -0
  22. package/dist/admin-api/hook-audit-emitter.js +21 -0
  23. package/dist/admin-api/hook-audit-emitter.js.map +1 -0
  24. package/dist/admin-api/index.d.ts +84 -0
  25. package/dist/admin-api/index.d.ts.map +1 -1
  26. package/dist/admin-api/index.js +254 -9
  27. package/dist/admin-api/index.js.map +1 -1
  28. package/dist/admin-api/middleware/audit.d.ts +25 -0
  29. package/dist/admin-api/middleware/audit.d.ts.map +1 -0
  30. package/dist/admin-api/middleware/audit.js +65 -0
  31. package/dist/admin-api/middleware/audit.js.map +1 -0
  32. package/dist/admin-api/middleware/capability.d.ts +8 -0
  33. package/dist/admin-api/middleware/capability.d.ts.map +1 -0
  34. package/dist/admin-api/middleware/capability.js +65 -0
  35. package/dist/admin-api/middleware/capability.js.map +1 -0
  36. package/dist/admin-api/middleware/principal.d.ts +18 -0
  37. package/dist/admin-api/middleware/principal.d.ts.map +1 -0
  38. package/dist/admin-api/middleware/principal.js +128 -0
  39. package/dist/admin-api/middleware/principal.js.map +1 -0
  40. package/dist/admin-api/routes/archive-review.d.ts +80 -0
  41. package/dist/admin-api/routes/archive-review.d.ts.map +1 -0
  42. package/dist/admin-api/routes/archive-review.js +70 -0
  43. package/dist/admin-api/routes/archive-review.js.map +1 -0
  44. package/dist/admin-api/routes/archive.d.ts +145 -0
  45. package/dist/admin-api/routes/archive.d.ts.map +1 -0
  46. package/dist/admin-api/routes/archive.js +540 -0
  47. package/dist/admin-api/routes/archive.js.map +1 -0
  48. package/dist/admin-api/routes/assets.d.ts +6 -1
  49. package/dist/admin-api/routes/assets.d.ts.map +1 -1
  50. package/dist/admin-api/routes/assets.js +167 -14
  51. package/dist/admin-api/routes/assets.js.map +1 -1
  52. package/dist/admin-api/routes/audit.d.ts +71 -0
  53. package/dist/admin-api/routes/audit.d.ts.map +1 -0
  54. package/dist/admin-api/routes/audit.js +178 -0
  55. package/dist/admin-api/routes/audit.js.map +1 -0
  56. package/dist/admin-api/routes/compare.d.ts.map +1 -1
  57. package/dist/admin-api/routes/compare.js +3 -2
  58. package/dist/admin-api/routes/compare.js.map +1 -1
  59. package/dist/admin-api/routes/fields.d.ts.map +1 -1
  60. package/dist/admin-api/routes/fields.js +2 -1
  61. package/dist/admin-api/routes/fields.js.map +1 -1
  62. package/dist/admin-api/routes/fragments.d.ts +13 -1
  63. package/dist/admin-api/routes/fragments.d.ts.map +1 -1
  64. package/dist/admin-api/routes/fragments.js +127 -92
  65. package/dist/admin-api/routes/fragments.js.map +1 -1
  66. package/dist/admin-api/routes/health.d.ts +60 -0
  67. package/dist/admin-api/routes/health.d.ts.map +1 -0
  68. package/dist/admin-api/routes/health.js +65 -0
  69. package/dist/admin-api/routes/health.js.map +1 -0
  70. package/dist/admin-api/routes/history.d.ts +2 -1
  71. package/dist/admin-api/routes/history.d.ts.map +1 -1
  72. package/dist/admin-api/routes/history.js +26 -4
  73. package/dist/admin-api/routes/history.js.map +1 -1
  74. package/dist/admin-api/routes/pages.d.ts +20 -1
  75. package/dist/admin-api/routes/pages.d.ts.map +1 -1
  76. package/dist/admin-api/routes/pages.js +157 -117
  77. package/dist/admin-api/routes/pages.js.map +1 -1
  78. package/dist/admin-api/routes/preview.d.ts.map +1 -1
  79. package/dist/admin-api/routes/preview.js +56 -17
  80. package/dist/admin-api/routes/preview.js.map +1 -1
  81. package/dist/admin-api/routes/publish.d.ts +19 -1
  82. package/dist/admin-api/routes/publish.d.ts.map +1 -1
  83. package/dist/admin-api/routes/publish.js +508 -92
  84. package/dist/admin-api/routes/publish.js.map +1 -1
  85. package/dist/admin-api/routes/rename.d.ts +62 -0
  86. package/dist/admin-api/routes/rename.d.ts.map +1 -0
  87. package/dist/admin-api/routes/rename.js +366 -0
  88. package/dist/admin-api/routes/rename.js.map +1 -0
  89. package/dist/admin-api/routes/site.d.ts.map +1 -1
  90. package/dist/admin-api/routes/site.js +6 -18
  91. package/dist/admin-api/routes/site.js.map +1 -1
  92. package/dist/admin-api/routes/system.d.ts +23 -0
  93. package/dist/admin-api/routes/system.d.ts.map +1 -0
  94. package/dist/admin-api/routes/system.js +115 -0
  95. package/dist/admin-api/routes/system.js.map +1 -0
  96. package/dist/admin-api/routes/templates.d.ts +11 -1
  97. package/dist/admin-api/routes/templates.d.ts.map +1 -1
  98. package/dist/admin-api/routes/templates.js +36 -3
  99. package/dist/admin-api/routes/templates.js.map +1 -1
  100. package/dist/admin-api/routes/validation.d.ts +47 -0
  101. package/dist/admin-api/routes/validation.d.ts.map +1 -0
  102. package/dist/admin-api/routes/validation.js +120 -0
  103. package/dist/admin-api/routes/validation.js.map +1 -0
  104. package/dist/admin-api/schemas/archive.d.ts +124 -0
  105. package/dist/admin-api/schemas/archive.d.ts.map +1 -0
  106. package/dist/admin-api/schemas/archive.js +93 -0
  107. package/dist/admin-api/schemas/archive.js.map +1 -0
  108. package/dist/admin-api/schemas/assets.d.ts +16 -0
  109. package/dist/admin-api/schemas/assets.d.ts.map +1 -1
  110. package/dist/admin-api/schemas/assets.js +15 -0
  111. package/dist/admin-api/schemas/assets.js.map +1 -1
  112. package/dist/admin-api/schemas/audit.d.ts +175 -0
  113. package/dist/admin-api/schemas/audit.d.ts.map +1 -0
  114. package/dist/admin-api/schemas/audit.js +91 -0
  115. package/dist/admin-api/schemas/audit.js.map +1 -0
  116. package/dist/admin-api/schemas/error.d.ts +94 -0
  117. package/dist/admin-api/schemas/error.d.ts.map +1 -0
  118. package/dist/admin-api/schemas/error.js +79 -0
  119. package/dist/admin-api/schemas/error.js.map +1 -0
  120. package/dist/admin-api/schemas/fragments.d.ts +2 -0
  121. package/dist/admin-api/schemas/fragments.d.ts.map +1 -1
  122. package/dist/admin-api/schemas/fragments.js +4 -0
  123. package/dist/admin-api/schemas/fragments.js.map +1 -1
  124. package/dist/admin-api/schemas/index.d.ts +8 -0
  125. package/dist/admin-api/schemas/index.d.ts.map +1 -1
  126. package/dist/admin-api/schemas/index.js +8 -0
  127. package/dist/admin-api/schemas/index.js.map +1 -1
  128. package/dist/admin-api/schemas/pages.d.ts +2 -0
  129. package/dist/admin-api/schemas/pages.d.ts.map +1 -1
  130. package/dist/admin-api/schemas/pages.js +11 -0
  131. package/dist/admin-api/schemas/pages.js.map +1 -1
  132. package/dist/admin-api/schemas/rename.d.ts +77 -0
  133. package/dist/admin-api/schemas/rename.d.ts.map +1 -0
  134. package/dist/admin-api/schemas/rename.js +75 -0
  135. package/dist/admin-api/schemas/rename.js.map +1 -0
  136. package/dist/admin-api/schemas/site.d.ts +3 -2
  137. package/dist/admin-api/schemas/site.d.ts.map +1 -1
  138. package/dist/admin-api/schemas/site.js +3 -2
  139. package/dist/admin-api/schemas/site.js.map +1 -1
  140. package/dist/admin-api/schemas/system.d.ts +28 -0
  141. package/dist/admin-api/schemas/system.d.ts.map +1 -0
  142. package/dist/admin-api/schemas/system.js +35 -0
  143. package/dist/admin-api/schemas/system.js.map +1 -0
  144. package/dist/admin-api/schemas/targets.d.ts +55 -0
  145. package/dist/admin-api/schemas/targets.d.ts.map +1 -1
  146. package/dist/admin-api/schemas/targets.js +46 -0
  147. package/dist/admin-api/schemas/targets.js.map +1 -1
  148. package/dist/admin-api/schemas/templates.d.ts +54 -0
  149. package/dist/admin-api/schemas/templates.d.ts.map +1 -1
  150. package/dist/admin-api/schemas/templates.js +21 -0
  151. package/dist/admin-api/schemas/templates.js.map +1 -1
  152. package/dist/admin-api/schemas/validation.d.ts +101 -0
  153. package/dist/admin-api/schemas/validation.d.ts.map +1 -0
  154. package/dist/admin-api/schemas/validation.js +57 -0
  155. package/dist/admin-api/schemas/validation.js.map +1 -0
  156. package/dist/admin-api/source-context.d.ts +66 -10
  157. package/dist/admin-api/source-context.d.ts.map +1 -1
  158. package/dist/admin-api/source-context.js +43 -5
  159. package/dist/admin-api/source-context.js.map +1 -1
  160. package/dist/ai/adapter-scaffold.d.ts +63 -0
  161. package/dist/ai/adapter-scaffold.d.ts.map +1 -0
  162. package/dist/ai/adapter-scaffold.js +89 -0
  163. package/dist/ai/adapter-scaffold.js.map +1 -0
  164. package/dist/ai/compose-prompt.d.ts +50 -0
  165. package/dist/ai/compose-prompt.d.ts.map +1 -0
  166. package/dist/ai/compose-prompt.js +49 -0
  167. package/dist/ai/compose-prompt.js.map +1 -0
  168. package/dist/ai/errors.d.ts +65 -0
  169. package/dist/ai/errors.d.ts.map +1 -0
  170. package/dist/ai/errors.js +59 -0
  171. package/dist/ai/errors.js.map +1 -0
  172. package/dist/ai/index.d.ts +17 -0
  173. package/dist/ai/index.d.ts.map +1 -0
  174. package/dist/ai/index.js +16 -0
  175. package/dist/ai/index.js.map +1 -0
  176. package/dist/ai/provider.d.ts +76 -0
  177. package/dist/ai/provider.d.ts.map +1 -0
  178. package/dist/ai/provider.js +13 -0
  179. package/dist/ai/provider.js.map +1 -0
  180. package/dist/ai/refusal.d.ts +50 -0
  181. package/dist/ai/refusal.d.ts.map +1 -0
  182. package/dist/ai/refusal.js +100 -0
  183. package/dist/ai/refusal.js.map +1 -0
  184. package/dist/ai/vision-prep.d.ts +32 -0
  185. package/dist/ai/vision-prep.d.ts.map +1 -0
  186. package/dist/ai/vision-prep.js +113 -0
  187. package/dist/ai/vision-prep.js.map +1 -0
  188. package/dist/alt/adapter.d.ts +140 -0
  189. package/dist/alt/adapter.d.ts.map +1 -0
  190. package/dist/alt/adapter.js +7 -0
  191. package/dist/alt/adapter.js.map +1 -0
  192. package/dist/alt/anthropic.d.ts +63 -0
  193. package/dist/alt/anthropic.d.ts.map +1 -0
  194. package/dist/alt/anthropic.js +147 -0
  195. package/dist/alt/anthropic.js.map +1 -0
  196. package/dist/alt/config.d.ts +67 -0
  197. package/dist/alt/config.d.ts.map +1 -0
  198. package/dist/alt/config.js +41 -0
  199. package/dist/alt/config.js.map +1 -0
  200. package/dist/alt/factory.d.ts +19 -0
  201. package/dist/alt/factory.d.ts.map +1 -0
  202. package/dist/alt/factory.js +69 -0
  203. package/dist/alt/factory.js.map +1 -0
  204. package/dist/alt/null-adapter.d.ts +3 -0
  205. package/dist/alt/null-adapter.d.ts.map +1 -0
  206. package/dist/alt/null-adapter.js +43 -0
  207. package/dist/alt/null-adapter.js.map +1 -0
  208. package/dist/alt/ollama.d.ts +40 -0
  209. package/dist/alt/ollama.d.ts.map +1 -0
  210. package/dist/alt/ollama.js +139 -0
  211. package/dist/alt/ollama.js.map +1 -0
  212. package/dist/alt/openai.d.ts +46 -0
  213. package/dist/alt/openai.d.ts.map +1 -0
  214. package/dist/alt/openai.js +118 -0
  215. package/dist/alt/openai.js.map +1 -0
  216. package/dist/alt/prompt-policies.d.ts +79 -0
  217. package/dist/alt/prompt-policies.d.ts.map +1 -0
  218. package/dist/alt/prompt-policies.js +67 -0
  219. package/dist/alt/prompt-policies.js.map +1 -0
  220. package/dist/alt/route-handler.d.ts +56 -0
  221. package/dist/alt/route-handler.d.ts.map +1 -0
  222. package/dist/alt/route-handler.js +122 -0
  223. package/dist/alt/route-handler.js.map +1 -0
  224. package/dist/alt/suggester.d.ts +57 -0
  225. package/dist/alt/suggester.d.ts.map +1 -0
  226. package/dist/alt/suggester.js +133 -0
  227. package/dist/alt/suggester.js.map +1 -0
  228. package/dist/app.js +1 -1
  229. package/dist/app.js.map +1 -1
  230. package/dist/archive-aliases.d.ts +79 -0
  231. package/dist/archive-aliases.d.ts.map +1 -0
  232. package/dist/archive-aliases.js +60 -0
  233. package/dist/archive-aliases.js.map +1 -0
  234. package/dist/archive-helpers.d.ts +73 -0
  235. package/dist/archive-helpers.d.ts.map +1 -0
  236. package/dist/archive-helpers.js +94 -0
  237. package/dist/archive-helpers.js.map +1 -0
  238. package/dist/assets/find-refs.d.ts +1 -1
  239. package/dist/assets/find-refs.js +1 -1
  240. package/dist/assets/find-refs.js.map +1 -1
  241. package/dist/assets/rename.js +1 -1
  242. package/dist/assets/rename.js.map +1 -1
  243. package/dist/assets/replace.js +1 -1
  244. package/dist/assets/replace.js.map +1 -1
  245. package/dist/assets/resolve.js +4 -4
  246. package/dist/assets/resolve.js.map +1 -1
  247. package/dist/assets/serve-route.js +2 -2
  248. package/dist/assets/serve-route.js.map +1 -1
  249. package/dist/assets/validate.d.ts +1 -1
  250. package/dist/assets/validate.js +1 -1
  251. package/dist/audit/config.d.ts +75 -0
  252. package/dist/audit/config.d.ts.map +1 -0
  253. package/dist/audit/config.js +91 -0
  254. package/dist/audit/config.js.map +1 -0
  255. package/dist/audit/context.d.ts +98 -0
  256. package/dist/audit/context.d.ts.map +1 -0
  257. package/dist/audit/context.js +51 -0
  258. package/dist/audit/context.js.map +1 -0
  259. package/dist/audit/errors.d.ts +73 -0
  260. package/dist/audit/errors.d.ts.map +1 -0
  261. package/dist/audit/errors.js +78 -0
  262. package/dist/audit/errors.js.map +1 -0
  263. package/dist/audit/index.d.ts +16 -0
  264. package/dist/audit/index.d.ts.map +1 -0
  265. package/dist/audit/index.js +10 -0
  266. package/dist/audit/index.js.map +1 -0
  267. package/dist/audit/provider.d.ts +73 -0
  268. package/dist/audit/provider.d.ts.map +1 -0
  269. package/dist/audit/provider.js +2 -0
  270. package/dist/audit/provider.js.map +1 -0
  271. package/dist/audit/providers/history.d.ts +66 -0
  272. package/dist/audit/providers/history.d.ts.map +1 -0
  273. package/dist/audit/providers/history.js +102 -0
  274. package/dist/audit/providers/history.js.map +1 -0
  275. package/dist/audit/pseudonymize.d.ts +26 -0
  276. package/dist/audit/pseudonymize.d.ts.map +1 -0
  277. package/dist/audit/pseudonymize.js +86 -0
  278. package/dist/audit/pseudonymize.js.map +1 -0
  279. package/dist/audit/recorder.d.ts +102 -0
  280. package/dist/audit/recorder.d.ts.map +1 -0
  281. package/dist/audit/recorder.js +55 -0
  282. package/dist/audit/recorder.js.map +1 -0
  283. package/dist/audit/retention.d.ts +83 -0
  284. package/dist/audit/retention.d.ts.map +1 -0
  285. package/dist/audit/retention.js +142 -0
  286. package/dist/audit/retention.js.map +1 -0
  287. package/dist/audit/source-ip.d.ts +32 -0
  288. package/dist/audit/source-ip.d.ts.map +1 -0
  289. package/dist/audit/source-ip.js +164 -0
  290. package/dist/audit/source-ip.js.map +1 -0
  291. package/dist/audit/types.d.ts +143 -0
  292. package/dist/audit/types.d.ts.map +1 -0
  293. package/dist/audit/types.js +33 -0
  294. package/dist/audit/types.js.map +1 -0
  295. package/dist/audit/user-agent.d.ts +28 -0
  296. package/dist/audit/user-agent.d.ts.map +1 -0
  297. package/dist/audit/user-agent.js +63 -0
  298. package/dist/audit/user-agent.js.map +1 -0
  299. package/dist/auth/capabilities.d.ts +28 -0
  300. package/dist/auth/capabilities.d.ts.map +1 -0
  301. package/dist/auth/capabilities.js +101 -0
  302. package/dist/auth/capabilities.js.map +1 -0
  303. package/dist/auth/config.d.ts +109 -0
  304. package/dist/auth/config.d.ts.map +1 -0
  305. package/dist/auth/config.js +221 -0
  306. package/dist/auth/config.js.map +1 -0
  307. package/dist/auth/errors.d.ts +72 -0
  308. package/dist/auth/errors.d.ts.map +1 -0
  309. package/dist/auth/errors.js +78 -0
  310. package/dist/auth/errors.js.map +1 -0
  311. package/dist/auth/factory.d.ts +43 -0
  312. package/dist/auth/factory.d.ts.map +1 -0
  313. package/dist/auth/factory.js +48 -0
  314. package/dist/auth/factory.js.map +1 -0
  315. package/dist/auth/index.d.ts +21 -0
  316. package/dist/auth/index.d.ts.map +1 -0
  317. package/dist/auth/index.js +14 -0
  318. package/dist/auth/index.js.map +1 -0
  319. package/dist/auth/ip-match.d.ts +29 -0
  320. package/dist/auth/ip-match.d.ts.map +1 -0
  321. package/dist/auth/ip-match.js +162 -0
  322. package/dist/auth/ip-match.js.map +1 -0
  323. package/dist/auth/provider.d.ts +76 -0
  324. package/dist/auth/provider.d.ts.map +1 -0
  325. package/dist/auth/provider.js +2 -0
  326. package/dist/auth/provider.js.map +1 -0
  327. package/dist/auth/providers/aws-cognito.d.ts +55 -0
  328. package/dist/auth/providers/aws-cognito.d.ts.map +1 -0
  329. package/dist/auth/providers/aws-cognito.js +114 -0
  330. package/dist/auth/providers/aws-cognito.js.map +1 -0
  331. package/dist/auth/providers/azure-easy-auth.d.ts +7 -0
  332. package/dist/auth/providers/azure-easy-auth.d.ts.map +1 -0
  333. package/dist/auth/providers/azure-easy-auth.js +48 -0
  334. package/dist/auth/providers/azure-easy-auth.js.map +1 -0
  335. package/dist/auth/providers/cloudflare-access.d.ts +71 -0
  336. package/dist/auth/providers/cloudflare-access.d.ts.map +1 -0
  337. package/dist/auth/providers/cloudflare-access.js +120 -0
  338. package/dist/auth/providers/cloudflare-access.js.map +1 -0
  339. package/dist/auth/providers/forwarded-user.d.ts +31 -0
  340. package/dist/auth/providers/forwarded-user.d.ts.map +1 -0
  341. package/dist/auth/providers/forwarded-user.js +72 -0
  342. package/dist/auth/providers/forwarded-user.js.map +1 -0
  343. package/dist/auth/providers/none.d.ts +6 -0
  344. package/dist/auth/providers/none.d.ts.map +1 -0
  345. package/dist/auth/providers/none.js +19 -0
  346. package/dist/auth/providers/none.js.map +1 -0
  347. package/dist/auth/providers/tailscale.d.ts +7 -0
  348. package/dist/auth/providers/tailscale.d.ts.map +1 -0
  349. package/dist/auth/providers/tailscale.js +30 -0
  350. package/dist/auth/providers/tailscale.js.map +1 -0
  351. package/dist/auth/role-resolver.d.ts +38 -0
  352. package/dist/auth/role-resolver.d.ts.map +1 -0
  353. package/dist/auth/role-resolver.js +92 -0
  354. package/dist/auth/role-resolver.js.map +1 -0
  355. package/dist/auth/types.d.ts +150 -0
  356. package/dist/auth/types.d.ts.map +1 -0
  357. package/dist/auth/types.js +60 -0
  358. package/dist/auth/types.js.map +1 -0
  359. package/dist/cache/errors.d.ts +41 -0
  360. package/dist/cache/errors.d.ts.map +1 -0
  361. package/dist/cache/errors.js +44 -0
  362. package/dist/cache/errors.js.map +1 -0
  363. package/dist/cache/factories.d.ts +17 -0
  364. package/dist/cache/factories.d.ts.map +1 -0
  365. package/dist/cache/factories.js +17 -0
  366. package/dist/cache/factories.js.map +1 -0
  367. package/dist/cache/keys.d.ts +63 -0
  368. package/dist/cache/keys.d.ts.map +1 -0
  369. package/dist/cache/keys.js +145 -0
  370. package/dist/cache/keys.js.map +1 -0
  371. package/dist/cache/memory.d.ts +51 -0
  372. package/dist/cache/memory.d.ts.map +1 -0
  373. package/dist/cache/memory.js +204 -0
  374. package/dist/cache/memory.js.map +1 -0
  375. package/dist/cache/per-site.d.ts +22 -0
  376. package/dist/cache/per-site.d.ts.map +1 -0
  377. package/dist/cache/per-site.js +114 -0
  378. package/dist/cache/per-site.js.map +1 -0
  379. package/dist/cache/types.d.ts +142 -0
  380. package/dist/cache/types.d.ts.map +1 -0
  381. package/dist/cache/types.js +33 -0
  382. package/dist/cache/types.js.map +1 -0
  383. package/dist/cli/archive.d.ts +44 -0
  384. package/dist/cli/archive.d.ts.map +1 -0
  385. package/dist/cli/archive.js +310 -0
  386. package/dist/cli/archive.js.map +1 -0
  387. package/dist/cli/bootstrap.d.ts +15 -8
  388. package/dist/cli/bootstrap.d.ts.map +1 -1
  389. package/dist/cli/bootstrap.js +59 -23
  390. package/dist/cli/bootstrap.js.map +1 -1
  391. package/dist/cli/dev-template-watcher.d.ts +29 -0
  392. package/dist/cli/dev-template-watcher.d.ts.map +1 -0
  393. package/dist/cli/dev-template-watcher.js +38 -0
  394. package/dist/cli/dev-template-watcher.js.map +1 -0
  395. package/dist/cli/history.d.ts.map +1 -1
  396. package/dist/cli/history.js +5 -3
  397. package/dist/cli/history.js.map +1 -1
  398. package/dist/cli/index.js +712 -395
  399. package/dist/cli/index.js.map +1 -1
  400. package/dist/cli/validate-flags.d.ts +29 -0
  401. package/dist/cli/validate-flags.d.ts.map +1 -0
  402. package/dist/cli/validate-flags.js +49 -0
  403. package/dist/cli/validate-flags.js.map +1 -0
  404. package/dist/compare.d.ts +1 -1
  405. package/dist/compare.d.ts.map +1 -1
  406. package/dist/compare.js +25 -23
  407. package/dist/compare.js.map +1 -1
  408. package/dist/component-ids.d.ts +25 -0
  409. package/dist/component-ids.d.ts.map +1 -0
  410. package/dist/component-ids.js +83 -0
  411. package/dist/component-ids.js.map +1 -0
  412. package/dist/config/define.d.ts +61 -0
  413. package/dist/config/define.d.ts.map +1 -0
  414. package/dist/config/define.js +64 -0
  415. package/dist/config/define.js.map +1 -0
  416. package/dist/config/errors.d.ts +32 -0
  417. package/dist/config/errors.d.ts.map +1 -0
  418. package/dist/config/errors.js +40 -0
  419. package/dist/config/errors.js.map +1 -0
  420. package/dist/config/index.d.ts +13 -0
  421. package/dist/config/index.d.ts.map +1 -0
  422. package/dist/config/index.js +20 -0
  423. package/dist/config/index.js.map +1 -0
  424. package/dist/config/loader.d.ts +105 -0
  425. package/dist/config/loader.d.ts.map +1 -0
  426. package/dist/config/loader.js +265 -0
  427. package/dist/config/loader.js.map +1 -0
  428. package/dist/config/schemas.d.ts +89 -0
  429. package/dist/config/schemas.d.ts.map +1 -0
  430. package/dist/config/schemas.js +172 -0
  431. package/dist/config/schemas.js.map +1 -0
  432. package/dist/config/types.d.ts +32 -0
  433. package/dist/config/types.d.ts.map +1 -0
  434. package/dist/config/types.js +15 -0
  435. package/dist/config/types.js.map +1 -0
  436. package/dist/deploy/cloudflare-workers.d.ts +46 -0
  437. package/dist/deploy/cloudflare-workers.d.ts.map +1 -0
  438. package/dist/deploy/cloudflare-workers.js +213 -0
  439. package/dist/deploy/cloudflare-workers.js.map +1 -0
  440. package/dist/deploy/errors.d.ts +66 -0
  441. package/dist/deploy/errors.d.ts.map +1 -0
  442. package/dist/deploy/errors.js +82 -0
  443. package/dist/deploy/errors.js.map +1 -0
  444. package/dist/deploy/index.d.ts +9 -0
  445. package/dist/deploy/index.d.ts.map +1 -0
  446. package/dist/deploy/index.js +3 -0
  447. package/dist/deploy/index.js.map +1 -0
  448. package/dist/deploy/types.d.ts +162 -0
  449. package/dist/deploy/types.d.ts.map +1 -0
  450. package/dist/deploy/types.js +2 -0
  451. package/dist/deploy/types.js.map +1 -0
  452. package/dist/fragments/create.d.ts +70 -0
  453. package/dist/fragments/create.d.ts.map +1 -0
  454. package/dist/fragments/create.js +93 -0
  455. package/dist/fragments/create.js.map +1 -0
  456. package/dist/fragments/publish.d.ts +37 -0
  457. package/dist/fragments/publish.d.ts.map +1 -0
  458. package/dist/fragments/publish.js +52 -0
  459. package/dist/fragments/publish.js.map +1 -0
  460. package/dist/fragments/save.d.ts +81 -0
  461. package/dist/fragments/save.d.ts.map +1 -0
  462. package/dist/fragments/save.js +105 -0
  463. package/dist/fragments/save.js.map +1 -0
  464. package/dist/history-recorder.d.ts +5 -5
  465. package/dist/history-recorder.d.ts.map +1 -1
  466. package/dist/history-recorder.js +4 -4
  467. package/dist/history-recorder.js.map +1 -1
  468. package/dist/history-restorer.js +2 -2
  469. package/dist/history-restorer.js.map +1 -1
  470. package/dist/history.d.ts +1 -1
  471. package/dist/hooks/audit-emitter.d.ts +73 -0
  472. package/dist/hooks/audit-emitter.d.ts.map +1 -0
  473. package/dist/hooks/audit-emitter.js +13 -0
  474. package/dist/hooks/audit-emitter.js.map +1 -0
  475. package/dist/hooks/context.d.ts +78 -0
  476. package/dist/hooks/context.d.ts.map +1 -0
  477. package/dist/hooks/context.js +56 -0
  478. package/dist/hooks/context.js.map +1 -0
  479. package/dist/hooks/contribution.d.ts +90 -0
  480. package/dist/hooks/contribution.d.ts.map +1 -0
  481. package/dist/hooks/contribution.js +2 -0
  482. package/dist/hooks/contribution.js.map +1 -0
  483. package/dist/hooks/dispatch.d.ts +30 -0
  484. package/dist/hooks/dispatch.d.ts.map +1 -0
  485. package/dist/hooks/dispatch.js +252 -0
  486. package/dist/hooks/dispatch.js.map +1 -0
  487. package/dist/hooks/errors.d.ts +100 -0
  488. package/dist/hooks/errors.d.ts.map +1 -0
  489. package/dist/hooks/errors.js +103 -0
  490. package/dist/hooks/errors.js.map +1 -0
  491. package/dist/hooks/index.d.ts +15 -0
  492. package/dist/hooks/index.d.ts.map +1 -0
  493. package/dist/hooks/index.js +6 -0
  494. package/dist/hooks/index.js.map +1 -0
  495. package/dist/hooks/registry.d.ts +53 -0
  496. package/dist/hooks/registry.d.ts.map +1 -0
  497. package/dist/hooks/registry.js +139 -0
  498. package/dist/hooks/registry.js.map +1 -0
  499. package/dist/hooks/storage.d.ts +43 -0
  500. package/dist/hooks/storage.d.ts.map +1 -0
  501. package/dist/hooks/storage.js +2 -0
  502. package/dist/hooks/storage.js.map +1 -0
  503. package/dist/hooks/types.d.ts +324 -0
  504. package/dist/hooks/types.d.ts.map +1 -0
  505. package/dist/hooks/types.js +2 -0
  506. package/dist/hooks/types.js.map +1 -0
  507. package/dist/index.d.ts +26 -6
  508. package/dist/index.d.ts.map +1 -1
  509. package/dist/index.js +49 -5
  510. package/dist/index.js.map +1 -1
  511. package/dist/locale.d.ts +5 -1
  512. package/dist/locale.d.ts.map +1 -1
  513. package/dist/locale.js +6 -2
  514. package/dist/locale.js.map +1 -1
  515. package/dist/manifest-save.d.ts +255 -0
  516. package/dist/manifest-save.d.ts.map +1 -0
  517. package/dist/manifest-save.js +260 -0
  518. package/dist/manifest-save.js.map +1 -0
  519. package/dist/manifest.d.ts +1 -2
  520. package/dist/manifest.d.ts.map +1 -1
  521. package/dist/manifest.js +43 -44
  522. package/dist/manifest.js.map +1 -1
  523. package/dist/node-floor.d.ts +3 -0
  524. package/dist/node-floor.d.ts.map +1 -0
  525. package/dist/node-floor.js +3 -0
  526. package/dist/node-floor.js.map +1 -0
  527. package/dist/pages/create.d.ts +103 -0
  528. package/dist/pages/create.d.ts.map +1 -0
  529. package/dist/pages/create.js +117 -0
  530. package/dist/pages/create.js.map +1 -0
  531. package/dist/pages/publish.d.ts +59 -0
  532. package/dist/pages/publish.d.ts.map +1 -0
  533. package/dist/pages/publish.js +78 -0
  534. package/dist/pages/publish.js.map +1 -0
  535. package/dist/pages/save.d.ts +97 -0
  536. package/dist/pages/save.d.ts.map +1 -0
  537. package/dist/pages/save.js +138 -0
  538. package/dist/pages/save.js.map +1 -0
  539. package/dist/providers/factories.d.ts +65 -0
  540. package/dist/providers/factories.d.ts.map +1 -0
  541. package/dist/providers/factories.js +189 -0
  542. package/dist/providers/factories.js.map +1 -0
  543. package/dist/publish-item.d.ts +225 -0
  544. package/dist/publish-item.d.ts.map +1 -0
  545. package/dist/publish-item.js +210 -0
  546. package/dist/publish-item.js.map +1 -0
  547. package/dist/publish-rendered.d.ts.map +1 -1
  548. package/dist/publish-rendered.js +75 -6
  549. package/dist/publish-rendered.js.map +1 -1
  550. package/dist/publish-renderers.d.ts +132 -0
  551. package/dist/publish-renderers.d.ts.map +1 -0
  552. package/dist/publish-renderers.js +240 -0
  553. package/dist/publish-renderers.js.map +1 -0
  554. package/dist/publish-run.d.ts +223 -0
  555. package/dist/publish-run.d.ts.map +1 -0
  556. package/dist/publish-run.js +307 -0
  557. package/dist/publish-run.js.map +1 -0
  558. package/dist/publish.d.ts.map +1 -1
  559. package/dist/publish.js +1 -10
  560. package/dist/publish.js.map +1 -1
  561. package/dist/render-for-analysis.d.ts +24 -0
  562. package/dist/render-for-analysis.d.ts.map +1 -0
  563. package/dist/render-for-analysis.js +146 -0
  564. package/dist/render-for-analysis.js.map +1 -0
  565. package/dist/resolver.d.ts.map +1 -1
  566. package/dist/resolver.js +47 -23
  567. package/dist/resolver.js.map +1 -1
  568. package/dist/runtime/archive-marker.d.ts +62 -0
  569. package/dist/runtime/archive-marker.d.ts.map +1 -0
  570. package/dist/runtime/archive-marker.js +88 -0
  571. package/dist/runtime/archive-marker.js.map +1 -0
  572. package/dist/runtime/capability-gap-warnings.d.ts +42 -0
  573. package/dist/runtime/capability-gap-warnings.d.ts.map +1 -0
  574. package/dist/runtime/capability-gap-warnings.js +28 -0
  575. package/dist/runtime/capability-gap-warnings.js.map +1 -0
  576. package/dist/runtime/redirects-emit.d.ts +93 -0
  577. package/dist/runtime/redirects-emit.d.ts.map +1 -0
  578. package/dist/runtime/redirects-emit.js +89 -0
  579. package/dist/runtime/redirects-emit.js.map +1 -0
  580. package/dist/runtime/runtime-capabilities.d.ts +79 -0
  581. package/dist/runtime/runtime-capabilities.d.ts.map +1 -0
  582. package/dist/runtime/runtime-capabilities.js +60 -0
  583. package/dist/runtime/runtime-capabilities.js.map +1 -0
  584. package/dist/save-etag.d.ts +69 -0
  585. package/dist/save-etag.d.ts.map +1 -0
  586. package/dist/save-etag.js +118 -0
  587. package/dist/save-etag.js.map +1 -0
  588. package/dist/site-loader.d.ts +42 -4
  589. package/dist/site-loader.d.ts.map +1 -1
  590. package/dist/site-loader.js +27 -8
  591. package/dist/site-loader.js.map +1 -1
  592. package/dist/targets.d.ts +21 -12
  593. package/dist/targets.d.ts.map +1 -1
  594. package/dist/targets.js +27 -95
  595. package/dist/targets.js.map +1 -1
  596. package/dist/testing/admin-cache-contract.d.ts +52 -0
  597. package/dist/testing/admin-cache-contract.d.ts.map +1 -0
  598. package/dist/testing/admin-cache-contract.js +203 -0
  599. package/dist/testing/admin-cache-contract.js.map +1 -0
  600. package/dist/testing/index.d.ts +11 -0
  601. package/dist/testing/index.d.ts.map +1 -0
  602. package/dist/testing/index.js +11 -0
  603. package/dist/testing/index.js.map +1 -0
  604. package/dist/transforms/factories.d.ts +16 -0
  605. package/dist/transforms/factories.d.ts.map +1 -0
  606. package/dist/transforms/factories.js +18 -0
  607. package/dist/transforms/factories.js.map +1 -0
  608. package/dist/transforms/index.d.ts +10 -17
  609. package/dist/transforms/index.d.ts.map +1 -1
  610. package/dist/transforms/index.js +4 -28
  611. package/dist/transforms/index.js.map +1 -1
  612. package/dist/transforms/sharp.d.ts +15 -1
  613. package/dist/transforms/sharp.d.ts.map +1 -1
  614. package/dist/transforms/sharp.js +34 -20
  615. package/dist/transforms/sharp.js.map +1 -1
  616. package/dist/types.d.ts +379 -52
  617. package/dist/types.d.ts.map +1 -1
  618. package/dist/types.js +20 -1
  619. package/dist/types.js.map +1 -1
  620. package/dist/validation/alt-required-walker.d.ts +27 -0
  621. package/dist/validation/alt-required-walker.d.ts.map +1 -0
  622. package/dist/validation/alt-required-walker.js +108 -0
  623. package/dist/validation/alt-required-walker.js.map +1 -0
  624. package/dist/validation/default-registry.d.ts +12 -0
  625. package/dist/validation/default-registry.d.ts.map +1 -0
  626. package/dist/validation/default-registry.js +55 -0
  627. package/dist/validation/default-registry.js.map +1 -0
  628. package/dist/validation/publish-audit.d.ts +44 -0
  629. package/dist/validation/publish-audit.d.ts.map +1 -0
  630. package/dist/validation/publish-audit.js +64 -0
  631. package/dist/validation/publish-audit.js.map +1 -0
  632. package/dist/validation/registry.d.ts +23 -0
  633. package/dist/validation/registry.d.ts.map +1 -0
  634. package/dist/validation/registry.js +15 -0
  635. package/dist/validation/registry.js.map +1 -0
  636. package/dist/validation/save-delta.d.ts +46 -0
  637. package/dist/validation/save-delta.d.ts.map +1 -0
  638. package/dist/validation/save-delta.js +57 -0
  639. package/dist/validation/save-delta.js.map +1 -0
  640. package/dist/validation/scanner.d.ts +91 -0
  641. package/dist/validation/scanner.d.ts.map +1 -0
  642. package/dist/validation/scanner.js +327 -0
  643. package/dist/validation/scanner.js.map +1 -0
  644. package/dist/validation/template-impact.d.ts +52 -0
  645. package/dist/validation/template-impact.d.ts.map +1 -0
  646. package/dist/validation/template-impact.js +53 -0
  647. package/dist/validation/template-impact.js.map +1 -0
  648. package/dist/validation/types.d.ts +123 -0
  649. package/dist/validation/types.d.ts.map +1 -0
  650. package/dist/validation/types.js +7 -0
  651. package/dist/validation/types.js.map +1 -0
  652. package/dist/validation/validators/accessibility.d.ts +3 -0
  653. package/dist/validation/validators/accessibility.d.ts.map +1 -0
  654. package/dist/validation/validators/accessibility.js +106 -0
  655. package/dist/validation/validators/accessibility.js.map +1 -0
  656. package/dist/validation/validators/aliasof-points-to-archived.d.ts +40 -0
  657. package/dist/validation/validators/aliasof-points-to-archived.d.ts.map +1 -0
  658. package/dist/validation/validators/aliasof-points-to-archived.js +34 -0
  659. package/dist/validation/validators/aliasof-points-to-archived.js.map +1 -0
  660. package/dist/validation/validators/alt-required.d.ts +3 -0
  661. package/dist/validation/validators/alt-required.d.ts.map +1 -0
  662. package/dist/validation/validators/alt-required.js +118 -0
  663. package/dist/validation/validators/alt-required.js.map +1 -0
  664. package/dist/validation/validators/archive-not-supported-on-target.d.ts +3 -0
  665. package/dist/validation/validators/archive-not-supported-on-target.d.ts.map +1 -0
  666. package/dist/validation/validators/archive-not-supported-on-target.js +38 -0
  667. package/dist/validation/validators/archive-not-supported-on-target.js.map +1 -0
  668. package/dist/validation/validators/broken-links.d.ts +3 -0
  669. package/dist/validation/validators/broken-links.d.ts.map +1 -0
  670. package/dist/validation/validators/broken-links.js +190 -0
  671. package/dist/validation/validators/broken-links.js.map +1 -0
  672. package/dist/validation/validators/circular-alias.d.ts +36 -0
  673. package/dist/validation/validators/circular-alias.d.ts.map +1 -0
  674. package/dist/validation/validators/circular-alias.js +63 -0
  675. package/dist/validation/validators/circular-alias.js.map +1 -0
  676. package/dist/validation/validators/circular-fragment.d.ts +15 -0
  677. package/dist/validation/validators/circular-fragment.d.ts.map +1 -0
  678. package/dist/validation/validators/circular-fragment.js +97 -0
  679. package/dist/validation/validators/circular-fragment.js.map +1 -0
  680. package/dist/validation/validators/dangling-alias.d.ts +38 -0
  681. package/dist/validation/validators/dangling-alias.d.ts.map +1 -0
  682. package/dist/validation/validators/dangling-alias.js +31 -0
  683. package/dist/validation/validators/dangling-alias.js.map +1 -0
  684. package/dist/validation/validators/deploy-target-type-supported.d.ts +3 -0
  685. package/dist/validation/validators/deploy-target-type-supported.d.ts.map +1 -0
  686. package/dist/validation/validators/deploy-target-type-supported.js +32 -0
  687. package/dist/validation/validators/deploy-target-type-supported.js.map +1 -0
  688. package/dist/validation/validators/dynamic-route-conflict.d.ts +18 -0
  689. package/dist/validation/validators/dynamic-route-conflict.d.ts.map +1 -0
  690. package/dist/validation/validators/dynamic-route-conflict.js +80 -0
  691. package/dist/validation/validators/dynamic-route-conflict.js.map +1 -0
  692. package/dist/validation/validators/html-validity.d.ts +3 -0
  693. package/dist/validation/validators/html-validity.d.ts.map +1 -0
  694. package/dist/validation/validators/html-validity.js +89 -0
  695. package/dist/validation/validators/html-validity.js.map +1 -0
  696. package/dist/validation/validators/orphaned-locale-file.d.ts +21 -0
  697. package/dist/validation/validators/orphaned-locale-file.d.ts.map +1 -0
  698. package/dist/validation/validators/orphaned-locale-file.js +84 -0
  699. package/dist/validation/validators/orphaned-locale-file.js.map +1 -0
  700. package/dist/validation/validators/referenced-archived-without-alias.d.ts +3 -0
  701. package/dist/validation/validators/referenced-archived-without-alias.d.ts.map +1 -0
  702. package/dist/validation/validators/referenced-archived-without-alias.js +65 -0
  703. package/dist/validation/validators/referenced-archived-without-alias.js.map +1 -0
  704. package/dist/validation/validators/referenced-asset-exists.d.ts +13 -0
  705. package/dist/validation/validators/referenced-asset-exists.d.ts.map +1 -0
  706. package/dist/validation/validators/referenced-asset-exists.js +80 -0
  707. package/dist/validation/validators/referenced-asset-exists.js.map +1 -0
  708. package/dist/validation/validators/referenced-fragment-exists.d.ts +9 -0
  709. package/dist/validation/validators/referenced-fragment-exists.d.ts.map +1 -0
  710. package/dist/validation/validators/referenced-fragment-exists.js +52 -0
  711. package/dist/validation/validators/referenced-fragment-exists.js.map +1 -0
  712. package/dist/validation/validators/referenced-template-exists.d.ts +10 -0
  713. package/dist/validation/validators/referenced-template-exists.d.ts.map +1 -0
  714. package/dist/validation/validators/referenced-template-exists.js +74 -0
  715. package/dist/validation/validators/referenced-template-exists.js.map +1 -0
  716. package/dist/validation/validators/schema-conformance.d.ts +17 -0
  717. package/dist/validation/validators/schema-conformance.d.ts.map +1 -0
  718. package/dist/validation/validators/schema-conformance.js +94 -0
  719. package/dist/validation/validators/schema-conformance.js.map +1 -0
  720. package/dist/validation/validators/target-deploy-coverage.d.ts +3 -0
  721. package/dist/validation/validators/target-deploy-coverage.d.ts.map +1 -0
  722. package/dist/validation/validators/target-deploy-coverage.js +37 -0
  723. package/dist/validation/validators/target-deploy-coverage.js.map +1 -0
  724. package/dist/validation/validators/unused-fragment.d.ts +16 -0
  725. package/dist/validation/validators/unused-fragment.d.ts.map +1 -0
  726. package/dist/validation/validators/unused-fragment.js +86 -0
  727. package/dist/validation/validators/unused-fragment.js.map +1 -0
  728. package/package.json +54 -31
  729. package/admin-dist/assets/index-BO9-CXmW.css +0 -1
  730. package/admin-dist/assets/index-Ufu8zZH_.js +0 -668
  731. package/admin-dist/assets/rolldown-runtime-COnpUsM8.js +0 -1
  732. package/admin-dist/assets/vendor-rjsf-HKBAjOmQ.js +0 -32
  733. package/admin-dist/assets/vendor-tiptap-IyO99U4R.js +0 -142
  734. package/admin-dist/assets/vendor-vue-D3wBSmDf.js +0 -1
  735. package/dist/publish-locale.d.ts +0 -44
  736. package/dist/publish-locale.d.ts.map +0 -1
  737. package/dist/publish-locale.js +0 -103
  738. package/dist/publish-locale.js.map +0 -1
@@ -0,0 +1,255 @@
1
+ /**
2
+ * Save pipeline — orchestrator for Page and Fragment Manifest writes.
3
+ *
4
+ * Today's `admin-api/routes/pages.ts` PUT handler and the matching
5
+ * fragments.ts handler each inline the same 13-step orchestration:
6
+ * etag check → validate → beforeSave hooks → history → write → sidecars
7
+ * → cache → audit → afterSave hooks → scanner. Two route files, one deep
8
+ * concept duplicated.
9
+ *
10
+ * `saveManifestCore` is the seam that hides the orchestration. Routes
11
+ * become protocol translators (parse Hono request → call → project
12
+ * SaveResult to HTTP). The CLI, plugin-contributed routes, and any
13
+ * future Save-shaped consumer call the same function.
14
+ *
15
+ * Per-kind entry points (`savePage`, `saveFragment` in pages/save.ts +
16
+ * fragments/save.ts — Cuts 3+4) wrap this with kind-specific concerns:
17
+ * locale resolution from `site.pages` vs `site.fragments`, the `route`
18
+ * field preservation Page Manifests need, and per-kind cache prefixes
19
+ * (Fragment Saves invalidate `pages:` too because Fragment References
20
+ * compose into Page summaries).
21
+ *
22
+ * Pipeline order is locked semantics, not configuration. Per
23
+ * `design-hooks.md` "Save flow with hooks": validators run first
24
+ * (validators are pure functions over a manifest), then beforeSave
25
+ * hooks see validated payload, then storage write, then afterSave
26
+ * hooks observe the result. Reordering breaks invariants — audit
27
+ * before write would lie about success.
28
+ *
29
+ * Reserved slots in the sequence (no-ops today; wired by future cuts):
30
+ * - Review-state precheck (Review-Workflow Cut 5: pending-review
31
+ * state → 409 EDIT_LOCKED)
32
+ * - Cascades (Soft-Delete Q6: auto-cancel scheduled actions on
33
+ * archive transition; Review Cut 5: invalidateOnSave policy
34
+ * transitions approved → draft)
35
+ *
36
+ * Throws are reserved for infrastructure failures (storage write
37
+ * fail, audit infra fail per locked fail-open). Expected outcomes
38
+ * — STALE / VALIDATION_FAILED / HOOK_CANCELLED — are typed
39
+ * `SaveResult` variants. Callers `switch` exhaustively; TS narrows.
40
+ */
41
+ import type { Principal } from './auth/types.js';
42
+ import type { ContentRoot } from './content-root.js';
43
+ import type { HistoryProvider } from './history.js';
44
+ import { type HookRegistry } from './hooks/index.js';
45
+ import type { Site } from './site-loader.js';
46
+ import type { StorageProvider } from './types.js';
47
+ import type { ValidatorRegistry } from './validation/registry.js';
48
+ import type { RescanCause, ValidationScanner } from './validation/scanner.js';
49
+ import type { Issue } from './validation/types.js';
50
+ /**
51
+ * Discriminator for the kind of manifest being saved. The pipeline
52
+ * spine is the same for every kind; per-kind wrappers in
53
+ * `pages/save.ts` and `fragments/save.ts` carry the kind through to
54
+ * audit + sidecar + cache invalidation calls.
55
+ */
56
+ export type SaveManifestKind = 'page' | 'fragment';
57
+ /**
58
+ * Successful save outcome. `etag` is the recomputed save-etag for
59
+ * the new on-disk content; clients update their baseline without a
60
+ * separate GET so offline replay chains work (per
61
+ * `design-offline.md` Q3 — chained If-Match projections).
62
+ */
63
+ export interface SaveOk {
64
+ readonly ok: true;
65
+ readonly etag: string;
66
+ }
67
+ /**
68
+ * Save-etag mismatch (per `design-offline.md` Q3). Server returned
69
+ * the current manifest body so the client can render a diff. The
70
+ * `currentEtag` lets the client retry-without-conflict if it accepts
71
+ * the server's version verbatim.
72
+ */
73
+ export interface SaveStale {
74
+ readonly ok: false;
75
+ readonly code: 'STALE';
76
+ readonly current: Record<string, unknown>;
77
+ readonly currentEtag: string;
78
+ }
79
+ /**
80
+ * Save-delta validation produced blocking issues (per
81
+ * `design-validation.md` four-phase model). Only issues introduced
82
+ * by THIS edit are surfaced — pre-existing site debt is the
83
+ * background scanner's surface, not the save handler's.
84
+ */
85
+ export interface SaveValidationFailed {
86
+ readonly ok: false;
87
+ readonly code: 'VALIDATION_FAILED';
88
+ readonly issues: readonly Issue[];
89
+ }
90
+ /**
91
+ * A `beforeSave` hook threw `HookCancellation` or `HookTimeout`
92
+ * (per `design-hooks.md` "Composition" — `before*` hooks chain;
93
+ * one throw stops the chain and cancels the operation). The hook's
94
+ * name is surfaced so clients can discriminate which hook
95
+ * cancelled.
96
+ */
97
+ export interface SaveHookCancelled {
98
+ readonly ok: false;
99
+ readonly code: 'HOOK_CANCELLED';
100
+ readonly hook: string;
101
+ readonly reason: string;
102
+ }
103
+ /**
104
+ * Typed union of expected save outcomes. Routes project each
105
+ * variant to HTTP (200 / 409). Callers (CLI, plugin-routes, future
106
+ * save-via-hook) `switch` exhaustively. Adding a new variant is a
107
+ * compile error at every call site — intentional, per the locked
108
+ * decision in Q1.
109
+ */
110
+ export type SaveResult = SaveOk | SaveStale | SaveValidationFailed | SaveHookCancelled;
111
+ /**
112
+ * Audit recorder shape the pipeline calls. Matches the existing
113
+ * `c.var.audit.record` surface from admin-api/middleware/audit.ts
114
+ * — the pipeline doesn't construct events differently from routes.
115
+ *
116
+ * Returns `unknown` (not `RecordResult`) so the pipeline doesn't
117
+ * couple to the audit module's return shape. Strict-mode operators
118
+ * branch on `result.failed > 0`; the pipeline doesn't.
119
+ */
120
+ export interface SaveAuditRecorder {
121
+ record(event: {
122
+ action: 'save';
123
+ /**
124
+ * Closed-enum subset of AuditOutcome the save pipeline emits.
125
+ * 'hook-cancelled' fires when a beforeSave hook throws or times
126
+ * out (per design-hooks.md Q3); 'validation-failed' fires when
127
+ * save-delta validators flag blocking issues. Pre-fix shape
128
+ * conflated the two paths under 'validation-failed' — fixed
129
+ * 2026-05 alongside cross-foundation gap #1 coverage.
130
+ */
131
+ outcome: 'success' | 'validation-failed' | 'forbidden' | 'hook-cancelled';
132
+ scope: {
133
+ kind: SaveManifestKind;
134
+ name: string;
135
+ };
136
+ metadata?: Record<string, unknown>;
137
+ }): Promise<unknown>;
138
+ }
139
+ /**
140
+ * Principal shape the pipeline needs. Re-exports `auth/types.ts:Principal`
141
+ * so callers (`c.var.principal`) pass the real type without conversion.
142
+ * The pipeline doesn't construct principals — only forwards them to
143
+ * `buildHookContext`.
144
+ */
145
+ export type SavePrincipal = Principal;
146
+ /**
147
+ * Source wiring the pipeline needs. Mirrors the relevant subset of
148
+ * `admin-api/source-context.ts:SourceContext` without importing the
149
+ * admin-api type — the pipeline is a domain primitive, not bound to
150
+ * the admin-api boundary. Wrappers (`savePage`, `saveFragment`) pass
151
+ * `source` straight through; the structural compatibility with
152
+ * `SourceContext` lets that work without conversion.
153
+ */
154
+ export interface SaveSourceWiring {
155
+ readonly storage: StorageProvider;
156
+ readonly contentRoot: ContentRoot;
157
+ readonly cache: {
158
+ invalidatePrefix(prefix: string): Promise<number>;
159
+ };
160
+ readonly history?: HistoryProvider;
161
+ readonly targetName?: string;
162
+ readonly manifest?: {
163
+ name?: string;
164
+ };
165
+ }
166
+ /**
167
+ * Inputs to `saveManifestCore`. Carries everything the pipeline
168
+ * needs without reaching into route or HTTP concerns.
169
+ *
170
+ * Per Q2 lock: target wiring (cache, history, storage, contentRoot)
171
+ * comes from `SourceContext` upstream; orchestration deps
172
+ * (validators, hooks, scanner, audit) are injected per request.
173
+ * The wrapper functions (`savePage`, `saveFragment`) destructure
174
+ * `source` and assemble this shape.
175
+ */
176
+ export interface SaveManifestInput {
177
+ /** Discriminator for downstream audit + sidecar calls. */
178
+ readonly kind: SaveManifestKind;
179
+ /** Item name (folder name under `pages/` or `fragments/`). */
180
+ readonly name: string;
181
+ /** BCP-47 locale when saving a Locale Variant; undefined for default. */
182
+ readonly locale?: string;
183
+ /** New manifest body (post-component-id, pre-validation). */
184
+ readonly manifest: Record<string, unknown>;
185
+ /** Pre-save manifest from the loaded `Site`; null when creating. */
186
+ readonly before: Record<string, unknown> | null;
187
+ /** Absolute path the new manifest serializes to. */
188
+ readonly manifestPath: string;
189
+ /** Optional save-etag for concurrency check (per design-offline.md Q3). */
190
+ readonly ifMatch?: string;
191
+ /**
192
+ * Loaded `Site` (the same instance that resolved `before`). Save-delta
193
+ * validation needs it to walk template + fragment + asset refs.
194
+ */
195
+ readonly site: Site;
196
+ /**
197
+ * Cache prefixes to invalidate after the write. Page Saves pass
198
+ * `['pages:']`; Fragment Saves pass `['fragments:', 'pages:']`
199
+ * because Fragment References compose into Page summaries.
200
+ */
201
+ readonly cacheInvalidatePrefixes: readonly string[];
202
+ /**
203
+ * Optional fields to include in the recomputed save-etag.
204
+ * Page Saves include `route` (folder-derived; not stored in the
205
+ * file but part of the etag projection chain). Fragment Saves
206
+ * pass an empty object.
207
+ */
208
+ readonly etagExtras: Record<string, unknown>;
209
+ /** Source wiring; opaque to the pipeline beyond the typed fields below. */
210
+ readonly source: SaveSourceWiring;
211
+ /** Audit recorder bound to the request (typically `c.var.audit`). */
212
+ readonly audit: SaveAuditRecorder;
213
+ /** Authenticated principal driving this save (for hook context). */
214
+ readonly principal: SavePrincipal;
215
+ /** Audit-firing emitter used by hook dispatch (forwarded to buildHookContext). */
216
+ readonly hookAuditEmit?: import('./hooks/index.js').HookFiringEmitter;
217
+ /** Validator registry (built once at admin boot per design-validation.md Cut 1). */
218
+ readonly validators: ValidatorRegistry;
219
+ /** Hook registry; absent when the site has no hooks contributed. */
220
+ readonly hooks?: HookRegistry;
221
+ /** Background scanner; absent when scanner not enabled for this admin. */
222
+ readonly scanner?: ValidationScanner;
223
+ /**
224
+ * Scanner rescan cause. Per-kind because the scanner's `RescanCause`
225
+ * union differs by kind (Page Saves use `{ kind: 'manifest', item }`
226
+ * to invalidate just the page; Fragment Saves use
227
+ * `{ kind: 'fragment', name }` to walk transitive dependents via
228
+ * `findDependentsFromSidecars`). Wrappers build the right shape.
229
+ */
230
+ readonly scannerCause?: RescanCause;
231
+ /** Per-request correlation id; fresh UUID when absent. */
232
+ readonly requestId?: string;
233
+ }
234
+ /**
235
+ * Save pipeline orchestrator — Cut 2.
236
+ *
237
+ * Ports the 13-step spine from `admin-api/routes/pages.ts:290-510`.
238
+ * Pipeline sequence (locked per Q5):
239
+ *
240
+ * 1. etag precheck → STALE
241
+ * 2. review-state precheck (reserved slot — no-op today)
242
+ * 3. validators → VALIDATION_FAILED
243
+ * 4. beforeSave hooks → HOOK_CANCELLED
244
+ * 5. history record (pre-write)
245
+ * 6. storage write
246
+ * 7. sidecars (asset/fragment/alias) in parallel
247
+ * 8. cache invalidate (per per-kind prefixes)
248
+ * 9. compute new etag
249
+ * 10. audit success
250
+ * 11. afterSave hooks (fail-open observers)
251
+ * 12. cascades (reserved slot — no-op today)
252
+ * 13. scanner.rescan (fire-and-forget)
253
+ */
254
+ export declare function saveManifestCore(input: SaveManifestInput): Promise<SaveResult>;
255
+ //# sourceMappingURL=manifest-save.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-save.d.ts","sourceRoot":"","sources":["../src/manifest-save.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Save pipeline — orchestrator for Page and Fragment Manifest writes.
3
+ *
4
+ * Today's `admin-api/routes/pages.ts` PUT handler and the matching
5
+ * fragments.ts handler each inline the same 13-step orchestration:
6
+ * etag check → validate → beforeSave hooks → history → write → sidecars
7
+ * → cache → audit → afterSave hooks → scanner. Two route files, one deep
8
+ * concept duplicated.
9
+ *
10
+ * `saveManifestCore` is the seam that hides the orchestration. Routes
11
+ * become protocol translators (parse Hono request → call → project
12
+ * SaveResult to HTTP). The CLI, plugin-contributed routes, and any
13
+ * future Save-shaped consumer call the same function.
14
+ *
15
+ * Per-kind entry points (`savePage`, `saveFragment` in pages/save.ts +
16
+ * fragments/save.ts — Cuts 3+4) wrap this with kind-specific concerns:
17
+ * locale resolution from `site.pages` vs `site.fragments`, the `route`
18
+ * field preservation Page Manifests need, and per-kind cache prefixes
19
+ * (Fragment Saves invalidate `pages:` too because Fragment References
20
+ * compose into Page summaries).
21
+ *
22
+ * Pipeline order is locked semantics, not configuration. Per
23
+ * `design-hooks.md` "Save flow with hooks": validators run first
24
+ * (validators are pure functions over a manifest), then beforeSave
25
+ * hooks see validated payload, then storage write, then afterSave
26
+ * hooks observe the result. Reordering breaks invariants — audit
27
+ * before write would lie about success.
28
+ *
29
+ * Reserved slots in the sequence (no-ops today; wired by future cuts):
30
+ * - Review-state precheck (Review-Workflow Cut 5: pending-review
31
+ * state → 409 EDIT_LOCKED)
32
+ * - Cascades (Soft-Delete Q6: auto-cancel scheduled actions on
33
+ * archive transition; Review Cut 5: invalidateOnSave policy
34
+ * transitions approved → draft)
35
+ *
36
+ * Throws are reserved for infrastructure failures (storage write
37
+ * fail, audit infra fail per locked fail-open). Expected outcomes
38
+ * — STALE / VALIDATION_FAILED / HOOK_CANCELLED — are typed
39
+ * `SaveResult` variants. Callers `switch` exhaustively; TS narrows.
40
+ */
41
+ import { recordWrite } from './history-recorder.js';
42
+ import { buildHookContext, dispatchAfterSave, dispatchBeforeSave, HookCancellation, HookTimeout, } from './hooks/index.js';
43
+ import { rebuildAssetRefs } from './assets/asset-deps.js';
44
+ import { rebuildFragmentDeps } from './fragment-deps.js';
45
+ import { rebuildArchiveAliases } from './archive-aliases.js';
46
+ import { computeSaveEtag } from './save-etag.js';
47
+ import { hasBlockingIssues, runSaveDelta } from './validation/save-delta.js';
48
+ /**
49
+ * Save pipeline orchestrator — Cut 2.
50
+ *
51
+ * Ports the 13-step spine from `admin-api/routes/pages.ts:290-510`.
52
+ * Pipeline sequence (locked per Q5):
53
+ *
54
+ * 1. etag precheck → STALE
55
+ * 2. review-state precheck (reserved slot — no-op today)
56
+ * 3. validators → VALIDATION_FAILED
57
+ * 4. beforeSave hooks → HOOK_CANCELLED
58
+ * 5. history record (pre-write)
59
+ * 6. storage write
60
+ * 7. sidecars (asset/fragment/alias) in parallel
61
+ * 8. cache invalidate (per per-kind prefixes)
62
+ * 9. compute new etag
63
+ * 10. audit success
64
+ * 11. afterSave hooks (fail-open observers)
65
+ * 12. cascades (reserved slot — no-op today)
66
+ * 13. scanner.rescan (fire-and-forget)
67
+ */
68
+ export async function saveManifestCore(input) {
69
+ // Step 1 — etag precheck. Mirrors pages.ts:312-339. The current
70
+ // on-disk etag is computed from the in-memory `before` manifest
71
+ // plus the per-kind extras (Page passes route; Fragment passes
72
+ // empty). Absent ifMatch = no concurrency check (last-write-wins).
73
+ if (input.ifMatch && input.before) {
74
+ const currentEtag = await computeSaveEtag({
75
+ ...input.before,
76
+ ...input.etagExtras,
77
+ });
78
+ if (currentEtag !== input.ifMatch) {
79
+ return {
80
+ ok: false,
81
+ code: 'STALE',
82
+ current: { ...input.before, ...input.etagExtras },
83
+ currentEtag,
84
+ };
85
+ }
86
+ }
87
+ // Step 2 — review-state precheck. Reserved slot for Review-Workflow
88
+ // Cut 5 (pending-review state → 409 EDIT_LOCKED). No-op today.
89
+ // Step 3 — save-delta validation. Same shape as pages.ts:370-394.
90
+ // Validators are pure functions; orchestrator catches infra errors
91
+ // and surfaces them as synthetic issues so the save flow stays
92
+ // predictable. Audit failure with `outcome: 'validation-failed'`
93
+ // before returning the typed result.
94
+ const issues = await runSaveDelta({
95
+ item: {
96
+ kind: input.kind,
97
+ name: input.name,
98
+ itemPath: input.source.contentRoot.relative(input.manifestPath),
99
+ },
100
+ // Cast preserves the validator's structural expectation; the
101
+ // pipeline treats manifests as opaque bags of fields here.
102
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
103
+ before: input.before,
104
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
105
+ after: { ...input.manifest, ...input.etagExtras },
106
+ site: input.site,
107
+ contentRoot: input.source.contentRoot,
108
+ storage: input.source.storage,
109
+ }, input.validators);
110
+ if (hasBlockingIssues(issues)) {
111
+ await input.audit.record({
112
+ action: 'save',
113
+ outcome: 'validation-failed',
114
+ scope: { kind: input.kind, name: input.name },
115
+ metadata: input.locale ? { locale: input.locale } : undefined,
116
+ });
117
+ return { ok: false, code: 'VALIDATION_FAILED', issues };
118
+ }
119
+ // Step 4 — beforeSave hooks. Build the HookContext ONCE per
120
+ // request — design-hooks.md "HookContext shape" locks `now` +
121
+ // `requestId` as deterministic across all hooks in a request.
122
+ // Reused for the afterSave dispatch in step 11.
123
+ const hooks = input.hooks;
124
+ const hookCtx = hooks
125
+ ? buildHookContext({
126
+ principal: input.principal,
127
+ storage: input.source.storage,
128
+ target: input.source.targetName,
129
+ requestId: input.requestId ?? crypto.randomUUID(),
130
+ site: { name: input.source.manifest?.name },
131
+ auditEmit: input.hookAuditEmit,
132
+ })
133
+ : null;
134
+ const hookScope = {
135
+ kind: input.kind,
136
+ name: input.name,
137
+ locale: input.locale ?? undefined,
138
+ };
139
+ let finalManifest = input.manifest;
140
+ if (hooks && hookCtx) {
141
+ try {
142
+ finalManifest = (await dispatchBeforeSave(hooks, hookScope, input.manifest, hookCtx));
143
+ }
144
+ catch (err) {
145
+ if (err instanceof HookCancellation || err instanceof HookTimeout) {
146
+ // Per design-hooks.md Q3 audit lock: cancelled saves record
147
+ // outcome 'hook-cancelled' (closed-enum extension to
148
+ // AuditOutcome already in audit/types.ts). Earlier behavior
149
+ // emitted 'validation-failed' which conflated hook policy
150
+ // with validator semantics — forensic queries filtering on
151
+ // outcome would mistakenly include hook cancellations.
152
+ // metadata.hookCancelled vs metadata.hookTimeout still
153
+ // distinguishes the two cancellation paths for forensics.
154
+ await input.audit.record({
155
+ action: 'save',
156
+ outcome: 'hook-cancelled',
157
+ scope: { kind: input.kind, name: input.name },
158
+ metadata: {
159
+ ...(input.locale ? { locale: input.locale } : {}),
160
+ hookCancelled: err instanceof HookCancellation ? err.hookName : undefined,
161
+ hookTimeout: err instanceof HookTimeout ? err.hookName : undefined,
162
+ },
163
+ });
164
+ return {
165
+ ok: false,
166
+ code: 'HOOK_CANCELLED',
167
+ hook: err.hookName,
168
+ reason: err.message,
169
+ };
170
+ }
171
+ throw err;
172
+ }
173
+ }
174
+ // Re-serialize the (potentially mutated) manifest. When no hooks
175
+ // ran, finalManifest === input.manifest so the same serialization
176
+ // is recomputed once — cost is negligible vs the conditional.
177
+ const serialized = JSON.stringify(finalManifest, null, 2) + '\n';
178
+ // Step 5 — history. Record BEFORE the disk write per the
179
+ // recordWrite first-call invariant (pages.ts:442-456). Baseline
180
+ // scan reads current disk state (pre-save); recordWrite overlays
181
+ // the incoming delta to build the snapshot.
182
+ if (input.source.history) {
183
+ await recordWrite({
184
+ history: input.source.history,
185
+ contentRoot: input.source.contentRoot,
186
+ operation: 'save',
187
+ items: [
188
+ {
189
+ path: input.source.contentRoot.relative(input.manifestPath),
190
+ content: serialized,
191
+ },
192
+ ],
193
+ });
194
+ }
195
+ // Step 6 — storage write.
196
+ await input.source.storage.writeFile(input.manifestPath, serialized);
197
+ // Step 7 — sidecars in parallel. Three Usage Sidecar relations
198
+ // (per `sidecars.md`): asset-refs, fragment-deps, archive-aliases.
199
+ // Future asset-soft-delete adds a fourth here in one place.
200
+ const item = input.locale
201
+ ? {
202
+ source: input.kind === 'page' ? 'page' : 'fragment',
203
+ name: input.name,
204
+ locale: input.locale,
205
+ }
206
+ : { source: input.kind === 'page' ? 'page' : 'fragment', name: input.name };
207
+ await Promise.all([
208
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
209
+ rebuildAssetRefs(input.source.contentRoot, item, input.before, finalManifest),
210
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
211
+ rebuildFragmentDeps(input.source.contentRoot, item, input.before, finalManifest),
212
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
213
+ rebuildArchiveAliases(input.source.contentRoot, item, input.before, finalManifest),
214
+ ]);
215
+ // Step 8 — cache invalidate. Per-kind prefixes from caller. Page
216
+ // Saves pass ['pages:']; Fragment Saves pass ['fragments:',
217
+ // 'pages:'] because Fragment References compose into Page
218
+ // summaries.
219
+ await Promise.all(input.cacheInvalidatePrefixes.map(p => input.source.cache.invalidatePrefix(p)));
220
+ // Step 9 — recompute save-etag for the new on-disk content. Echo
221
+ // shape MUST match what the next GET produces — extras (route)
222
+ // are folded in here so offline replay projection chains work
223
+ // (design-offline.md Q3).
224
+ const echoShape = { ...finalManifest, ...input.etagExtras };
225
+ const newEtag = await computeSaveEtag(echoShape);
226
+ // Step 10 — audit success. Records actor + scope + locale (when
227
+ // locale variant). Strict-mode operators check the result.failed
228
+ // count; fail-open default ignores. Recorder never throws.
229
+ await input.audit.record({
230
+ action: 'save',
231
+ outcome: 'success',
232
+ scope: { kind: input.kind, name: input.name },
233
+ metadata: input.locale ? { locale: input.locale } : undefined,
234
+ });
235
+ // Step 11 — afterSave hooks. Observational; failures logged but
236
+ // never propagated. Runs AFTER the audit record so the forensic
237
+ // record is durably committed before observational hooks fire.
238
+ // Per-hook timeout applies; one slow hook bounded by its
239
+ // timeout, not the total.
240
+ if (hooks && hookCtx) {
241
+ await dispatchAfterSave(hooks, hookScope, { payload: finalManifest, etag: newEtag }, hookCtx);
242
+ }
243
+ // Step 12 — cascades. Reserved slot for Soft-Delete Q6
244
+ // (auto-cancel scheduled actions on archive transition) and
245
+ // Review Cut 5 (invalidateOnSave policy → approved → draft).
246
+ // No-op today.
247
+ // Step 13 — background validation scanner. Fire-and-forget — the
248
+ // save response shouldn't block on scanner work; the scanner
249
+ // emits its own SSE event when the pass completes and the admin
250
+ // UI store re-fetches `/api/validation/issues` on the event.
251
+ if (input.scanner) {
252
+ const cause = input.scannerCause ?? {
253
+ kind: 'manifest',
254
+ item: { kind: input.kind, name: input.name, itemPath: input.manifestPath },
255
+ };
256
+ void input.scanner.rescan(cause);
257
+ }
258
+ return { ok: true, etag: newEtag };
259
+ }
260
+ //# sourceMappingURL=manifest-save.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-save.js","sourceRoot":"","sources":["../src/manifest-save.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,4 @@
1
- import type { FragmentManifest, PageManifest, SiteManifest, StorageProvider } from './types.js';
2
- export declare function parseSiteManifest(storage: StorageProvider, filePath: string): Promise<SiteManifest>;
1
+ import type { FragmentManifest, PageManifest, StorageProvider } from './types.js';
3
2
  export declare function parsePageManifest(storage: StorageProvider, filePath: string): Promise<PageManifest>;
4
3
  export declare function parseFragmentManifest(storage: StorageProvider, filePath: string): Promise<FragmentManifest>;
5
4
  //# sourceMappingURL=manifest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,gBAAgB,EAEhB,YAAY,EACZ,YAAY,EACZ,eAAe,EAChB,MAAM,YAAY,CAAA;AAiDnB,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAazG;AAcD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAazG;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAUjH"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiC,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAoEhH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAezG;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAYjH"}