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,63 @@
1
+ export const circularAlias = {
2
+ source: 'gazetta',
3
+ name: 'circular-alias',
4
+ stages: ['background', 'pre-publish', 'cli'],
5
+ defaultSeverity() {
6
+ return 'error';
7
+ },
8
+ async validate(input) {
9
+ const { scope, site } = input;
10
+ if (scope.kind !== 'background')
11
+ return [];
12
+ const manifest = scope.manifest;
13
+ if (manifest.archived !== true)
14
+ return [];
15
+ if (typeof manifest.aliasOf !== 'string' || manifest.aliasOf.length === 0)
16
+ return [];
17
+ // Walk the chain. Q3 G1 invariant says one hop max — if we make
18
+ // it past 1 hop, that's already a violation. Cap at depth 16 to
19
+ // bound the walk on pathological data.
20
+ const chain = walkAliasChain(scope.item.kind, scope.item.name, site);
21
+ if (!chain.cycle && chain.depth <= 1)
22
+ return [];
23
+ if (chain.cycle) {
24
+ return [
25
+ {
26
+ validator: 'circular-alias',
27
+ severity: 'error',
28
+ message: `Alias cycle: ${chain.path.join(' → ')}. Aliases must not form chains (Q3 G1 invariant).`,
29
+ itemPath: scope.item.itemPath,
30
+ },
31
+ ];
32
+ }
33
+ return [
34
+ {
35
+ validator: 'circular-alias',
36
+ severity: 'error',
37
+ message: `Alias chain: ${chain.path.join(' → ')}. Aliases must point at live items (Q3 G1 invariant — no chaining).`,
38
+ itemPath: scope.item.itemPath,
39
+ },
40
+ ];
41
+ },
42
+ };
43
+ function walkAliasChain(kind, start, site) {
44
+ const map = kind === 'page' ? site.pages : site.fragments;
45
+ const path = [start];
46
+ const visited = new Set([start]);
47
+ let cur = map.get(start);
48
+ const maxDepth = 16;
49
+ while (cur && cur.archived === true && typeof cur.aliasOf === 'string' && cur.aliasOf.length > 0) {
50
+ if (path.length - 1 >= maxDepth)
51
+ break;
52
+ const next = cur.aliasOf;
53
+ if (visited.has(next)) {
54
+ path.push(next);
55
+ return { path, depth: path.length - 1, cycle: true };
56
+ }
57
+ path.push(next);
58
+ visited.add(next);
59
+ cur = map.get(next);
60
+ }
61
+ return { path, depth: path.length - 1, cycle: false };
62
+ }
63
+ //# sourceMappingURL=circular-alias.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circular-alias.js","sourceRoot":"","sources":["../../../src/validation/validators/circular-alias.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Validator } from '../types.js';
2
+ /**
3
+ * Detect circular fragment references. A fragment that references @A which
4
+ * references @B which references back to the original creates an infinite
5
+ * resolve loop.
6
+ *
7
+ * Save-delta scope: walk fragment refs in the saved manifest, simulating the
8
+ * site state with the saved manifest substituted in. If a cycle is found,
9
+ * report the chain.
10
+ *
11
+ * Only fires for fragments (pages can't be referenced cyclically — pages
12
+ * aren't reachable from each other through @ refs).
13
+ */
14
+ export declare const circularFragment: Validator;
15
+ //# sourceMappingURL=circular-fragment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circular-fragment.d.ts","sourceRoot":"","sources":["../../../src/validation/validators/circular-fragment.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAS,SAAS,EAAkB,MAAM,aAAa,CAAA;AAEnE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,EAAE,SA8B9B,CAAA"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Detect circular fragment references. A fragment that references @A which
3
+ * references @B which references back to the original creates an infinite
4
+ * resolve loop.
5
+ *
6
+ * Save-delta scope: walk fragment refs in the saved manifest, simulating the
7
+ * site state with the saved manifest substituted in. If a cycle is found,
8
+ * report the chain.
9
+ *
10
+ * Only fires for fragments (pages can't be referenced cyclically — pages
11
+ * aren't reachable from each other through @ refs).
12
+ */
13
+ export const circularFragment = {
14
+ source: 'gazetta',
15
+ name: 'circular-fragment',
16
+ stages: ['save-delta', 'background', 'pre-publish', 'cli'],
17
+ defaultSeverity() {
18
+ return 'error';
19
+ },
20
+ async validate(input) {
21
+ const { scope, site } = input;
22
+ if (scope.kind !== 'save-delta' && scope.kind !== 'background')
23
+ return [];
24
+ if (scope.item.kind !== 'fragment')
25
+ return []; // only fragments form cycles
26
+ const manifest = scope.kind === 'save-delta' ? scope.after : scope.manifest;
27
+ const fragmentName = scope.item.name;
28
+ const fragmentsView = scope.kind === 'save-delta' ? withSubstituted(site, fragmentName, manifest) : site.fragments;
29
+ const cycle = findCycle(fragmentName, fragmentsView);
30
+ if (!cycle)
31
+ return [];
32
+ return [
33
+ {
34
+ validator: 'circular-fragment',
35
+ severity: 'error',
36
+ message: `Circular fragment reference: ${cycle.join(' → ')}.`,
37
+ itemPath: scope.item.itemPath,
38
+ },
39
+ ];
40
+ },
41
+ };
42
+ /**
43
+ * Build a fragments map with `name` substituted by the saved manifest.
44
+ * Other entries pass through. Used for save-delta to evaluate the cycle
45
+ * against the would-be-saved state, not the on-disk state.
46
+ */
47
+ function withSubstituted(site, name, manifest) {
48
+ const map = new Map(site.fragments);
49
+ const existing = map.get(name);
50
+ // Cast: save-delta scope.after for a fragment IS a fragment manifest by construction.
51
+ const dir = existing?.dir ?? `fragments/${name}`;
52
+ map.set(name, { ...manifest, dir });
53
+ return map;
54
+ }
55
+ /**
56
+ * Depth-first search for a cycle starting at `start`. Returns the cycle path
57
+ * (with a closing element to make the loop visible: `a → b → a`) or null.
58
+ */
59
+ function findCycle(start, fragments) {
60
+ const visiting = new Set();
61
+ const path = [];
62
+ return walk(start);
63
+ function walk(name) {
64
+ if (visiting.has(name)) {
65
+ const idx = path.indexOf(name);
66
+ if (idx >= 0)
67
+ return [...path.slice(idx), name];
68
+ return [name, name];
69
+ }
70
+ const frag = fragments.get(name);
71
+ if (!frag)
72
+ return null;
73
+ visiting.add(name);
74
+ path.push(name);
75
+ for (const ref of fragmentRefs(frag.components ?? [])) {
76
+ const cycle = walk(ref);
77
+ if (cycle)
78
+ return cycle;
79
+ }
80
+ visiting.delete(name);
81
+ path.pop();
82
+ return null;
83
+ }
84
+ }
85
+ function fragmentRefs(components) {
86
+ const out = [];
87
+ for (const entry of components) {
88
+ if (typeof entry === 'string' && entry.startsWith('@')) {
89
+ out.push(entry.slice(1));
90
+ }
91
+ else if (typeof entry === 'object' && entry !== null && entry.components) {
92
+ out.push(...fragmentRefs(entry.components));
93
+ }
94
+ }
95
+ return out;
96
+ }
97
+ //# sourceMappingURL=circular-fragment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circular-fragment.js","sourceRoot":"","sources":["../../../src/validation/validators/circular-fragment.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAc;IACzC,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,mBAAmB;IACzB,MAAM,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,CAAU;IAEnE,eAAe;QACb,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAqB;QAClC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;QAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO,EAAE,CAAA;QACzE,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO,EAAE,CAAA,CAAC,6BAA6B;QAC3E,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAA;QAE3E,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAA;QACpC,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAA;QAElH,MAAM,KAAK,GAAG,SAAS,CAAC,YAAY,EAAE,aAAa,CAAC,CAAA;QACpD,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAA;QAErB,OAAO;YACL;gBACE,SAAS,EAAE,mBAAmB;gBAC9B,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,gCAAgC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG;gBAC7D,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;aAC9B;SACF,CAAA;IACH,CAAC;CACF,CAAA;AAED;;;;GAIG;AACH,SAAS,eAAe,CACtB,IAAU,EACV,IAAY,EACZ,QAAyC;IAEzC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC9B,sFAAsF;IACtF,MAAM,GAAG,GAAG,QAAQ,EAAE,GAAG,IAAI,aAAa,IAAI,EAAE,CAAA;IAChD,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAI,QAA6B,EAAE,GAAG,EAAE,CAAC,CAAA;IACzD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAChB,KAAa,EACb,SAA0D;IAE1D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAClC,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAA;IAElB,SAAS,IAAI,CAAC,IAAY;QACxB,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAC9B,IAAI,GAAG,IAAI,CAAC;gBAAE,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;YAC/C,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACrB,CAAC;QACD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAChC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAA;QACtB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAClB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACf,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;YACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;YACvB,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAA;QACzB,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACrB,IAAI,CAAC,GAAG,EAAE,CAAA;QACV,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,UAAqC;IACzD,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1B,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAC3E,GAAG,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * P2: dangling-alias.
3
+ *
4
+ * Per `design-soft-delete.md` Q11 stage matrix: error at save-delta,
5
+ * background, pre-publish, and cli. Severity is always `error` —
6
+ * dangling aliases break the alias-aware renderer (the redirect
7
+ * target doesn't exist).
8
+ *
9
+ * The check: when an item is archived with `aliasOf: X`, validate
10
+ * that an item named `X` exists in `site.pages` (for archived pages)
11
+ * or `site.fragments` (for archived fragments).
12
+ *
13
+ * Symmetric to `referenced-fragment-exists` — both check that a
14
+ * reference has a target. The difference: this validator checks the
15
+ * archive's own aliasOf field, not the components list.
16
+ *
17
+ * # Why error
18
+ *
19
+ * An archived page with `aliasOf: 'missing'` would render `301 →
20
+ * /missing`, which then 404s. An archived fragment aliasing
21
+ * `@missing` would fail to compose at render time. Both are broken
22
+ * states; the publish gate must block.
23
+ *
24
+ * # Save-delta path
25
+ *
26
+ * When the saved manifest is itself archived with aliasOf, validate.
27
+ * When the saved manifest is live (not archived), no-op — only
28
+ * archives can be dangling.
29
+ *
30
+ * # SOLID
31
+ *
32
+ * - SRP: one check; doesn't overlap with circular-alias (P3) or
33
+ * aliasOf-points-to-archived (P5).
34
+ * - DIP: consumes Site; no extra I/O.
35
+ */
36
+ import type { Validator } from '../types.js';
37
+ export declare const danglingAlias: Validator;
38
+ //# sourceMappingURL=dangling-alias.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dangling-alias.d.ts","sourceRoot":"","sources":["../../../src/validation/validators/dangling-alias.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,KAAK,EAAS,SAAS,EAAkB,MAAM,aAAa,CAAA;AAEnE,eAAO,MAAM,aAAa,EAAE,SA8B3B,CAAA"}
@@ -0,0 +1,31 @@
1
+ export const danglingAlias = {
2
+ source: 'gazetta',
3
+ name: 'dangling-alias',
4
+ stages: ['save-delta', 'background', 'pre-publish', 'cli'],
5
+ defaultSeverity() {
6
+ return 'error';
7
+ },
8
+ async validate(input) {
9
+ const { scope, site } = input;
10
+ if (scope.kind !== 'save-delta' && scope.kind !== 'background')
11
+ return [];
12
+ const manifest = scope.kind === 'save-delta' ? scope.after : scope.manifest;
13
+ if (manifest.archived !== true)
14
+ return [];
15
+ if (typeof manifest.aliasOf !== 'string' || manifest.aliasOf.length === 0)
16
+ return [];
17
+ const targetName = manifest.aliasOf;
18
+ const targetMap = scope.item.kind === 'page' ? site.pages : site.fragments;
19
+ if (targetMap.has(targetName))
20
+ return [];
21
+ return [
22
+ {
23
+ validator: 'dangling-alias',
24
+ severity: 'error',
25
+ message: `Aliased ${scope.item.kind} "${scope.item.name}" points to "${targetName}" which does not exist. The 301 redirect target is missing.`,
26
+ itemPath: scope.item.itemPath,
27
+ },
28
+ ];
29
+ },
30
+ };
31
+ //# sourceMappingURL=dangling-alias.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dangling-alias.js","sourceRoot":"","sources":["../../../src/validation/validators/dangling-alias.ts"],"names":[],"mappings":"AAqCA,MAAM,CAAC,MAAM,aAAa,GAAc;IACtC,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,gBAAgB;IACtB,MAAM,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,CAAU;IAEnE,eAAe;QACb,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAqB;QAClC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;QAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO,EAAE,CAAA;QACzE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAA;QAE3E,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO,EAAE,CAAA;QACzC,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;QAEpF,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAA;QACnC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAA;QAC1E,IAAI,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,OAAO,EAAE,CAAA;QAExC,OAAO;YACL;gBACE,SAAS,EAAE,gBAAgB;gBAC3B,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,gBAAgB,UAAU,6DAA6D;gBAC9I,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;aAC9B;SACF,CAAA;IACH,CAAC;CACF,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { Validator } from '../types.js';
2
+ export declare const deployTargetTypeSupported: Validator;
3
+ //# sourceMappingURL=deploy-target-type-supported.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-target-type-supported.d.ts","sourceRoot":"","sources":["../../../src/validation/validators/deploy-target-type-supported.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAS,SAAS,EAAkB,MAAM,aAAa,CAAA;AAEnE,eAAO,MAAM,yBAAyB,EAAE,SAkCvC,CAAA"}
@@ -0,0 +1,32 @@
1
+ export const deployTargetTypeSupported = {
2
+ source: 'gazetta',
3
+ name: 'deploy-target-type-supported',
4
+ stages: ['cli'],
5
+ defaultSeverity() {
6
+ return 'error';
7
+ },
8
+ async validate(input) {
9
+ const { scope, site } = input;
10
+ if (scope.kind !== 'cli')
11
+ return [];
12
+ const targets = (site.manifest.targets ?? {});
13
+ const issues = [];
14
+ for (const [name, target] of Object.entries(targets)) {
15
+ const deploy = target.deploy;
16
+ if (!deploy)
17
+ continue; // no adapter → no compatibility to check
18
+ const targetType = target.type ?? 'static'; // default per TargetConfig
19
+ if (deploy.supports.includes(targetType))
20
+ continue;
21
+ issues.push({
22
+ validator: 'deploy-target-type-supported',
23
+ severity: 'error',
24
+ message: `Target "${name}" has type: "${targetType}" but deploy adapter "${deploy.name}" supports only [${deploy.supports.map(s => `"${s}"`).join(', ')}]. ` +
25
+ `Either switch to a compatible adapter or change target type.`,
26
+ itemPath: `site.config.ts:targets.${name}.deploy`,
27
+ });
28
+ }
29
+ return issues;
30
+ },
31
+ };
32
+ //# sourceMappingURL=deploy-target-type-supported.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-target-type-supported.js","sourceRoot":"","sources":["../../../src/validation/validators/deploy-target-type-supported.ts"],"names":[],"mappings":"AAgCA,MAAM,CAAC,MAAM,yBAAyB,GAAc;IAClD,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,8BAA8B;IACpC,MAAM,EAAE,CAAC,KAAK,CAAU;IAExB,eAAe;QACb,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAqB;QAClC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;QAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,EAAE,CAAA;QAEnC,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAiC,CAAA;QAC7E,MAAM,MAAM,GAAY,EAAE,CAAA;QAE1B,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACrD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;YAC5B,IAAI,CAAC,MAAM;gBAAE,SAAQ,CAAC,yCAAyC;YAC/D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAA,CAAC,2BAA2B;YACtE,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAAE,SAAQ;YAElD,MAAM,CAAC,IAAI,CAAC;gBACV,SAAS,EAAE,8BAA8B;gBACzC,QAAQ,EAAE,OAAO;gBACjB,OAAO,EACL,WAAW,IAAI,gBAAgB,UAAU,yBAAyB,MAAM,CAAC,IAAI,oBAAoB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;oBACnJ,8DAA8D;gBAChE,QAAQ,EAAE,0BAA0B,IAAI,SAAS;aAClD,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;CACF,CAAA"}
@@ -0,0 +1,18 @@
1
+ import type { Validator } from '../types.js';
2
+ /**
3
+ * Detect dynamic route ambiguity between pages.
4
+ *
5
+ * Two routes conflict when one's static path would match the other's dynamic
6
+ * pattern. Examples:
7
+ * - `/blog/hello` (static) and `/blog/:slug` (dynamic) — both match `/blog/hello`
8
+ * - `/:catch-all` and any static page — overshadows everything
9
+ *
10
+ * Save-delta scope: only flags conflicts INTRODUCED by the save (the saved
11
+ * manifest's route conflicts with an existing page's route). Pre-existing
12
+ * conflicts between two unaffected pages are caught by the background scanner
13
+ * (Cut 2), not save-delta.
14
+ *
15
+ * Only fires for pages.
16
+ */
17
+ export declare const dynamicRouteConflict: Validator;
18
+ //# sourceMappingURL=dynamic-route-conflict.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic-route-conflict.d.ts","sourceRoot":"","sources":["../../../src/validation/validators/dynamic-route-conflict.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAS,SAAS,EAAkB,MAAM,aAAa,CAAA;AAEnE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAgClC,CAAA"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Detect dynamic route ambiguity between pages.
3
+ *
4
+ * Two routes conflict when one's static path would match the other's dynamic
5
+ * pattern. Examples:
6
+ * - `/blog/hello` (static) and `/blog/:slug` (dynamic) — both match `/blog/hello`
7
+ * - `/:catch-all` and any static page — overshadows everything
8
+ *
9
+ * Save-delta scope: only flags conflicts INTRODUCED by the save (the saved
10
+ * manifest's route conflicts with an existing page's route). Pre-existing
11
+ * conflicts between two unaffected pages are caught by the background scanner
12
+ * (Cut 2), not save-delta.
13
+ *
14
+ * Only fires for pages.
15
+ */
16
+ export const dynamicRouteConflict = {
17
+ source: 'gazetta',
18
+ name: 'dynamic-route-conflict',
19
+ stages: ['save-delta', 'background', 'pre-publish', 'cli'],
20
+ defaultSeverity() {
21
+ return 'error';
22
+ },
23
+ async validate(input) {
24
+ const { scope, site } = input;
25
+ if (scope.kind !== 'save-delta' && scope.kind !== 'background')
26
+ return [];
27
+ if (scope.item.kind !== 'page')
28
+ return [];
29
+ const manifest = scope.kind === 'save-delta' ? scope.after : scope.manifest;
30
+ const newRoute = manifest.route;
31
+ if (!newRoute)
32
+ return [];
33
+ const issues = [];
34
+ for (const [otherName, other] of site.pages) {
35
+ if (otherName === scope.item.name)
36
+ continue; // skip self
37
+ if (routesConflict(newRoute, other.route)) {
38
+ issues.push({
39
+ validator: 'dynamic-route-conflict',
40
+ severity: 'error',
41
+ message: `Route "${newRoute}" conflicts with existing page "${otherName}" (route "${other.route}").`,
42
+ itemPath: scope.item.itemPath,
43
+ });
44
+ }
45
+ }
46
+ return issues;
47
+ },
48
+ };
49
+ /**
50
+ * Two routes conflict if they could both match the same incoming request path.
51
+ *
52
+ * Compares segment-by-segment:
53
+ * - Same length required (no wildcard catch-all in current routing)
54
+ * - Two static segments must match exactly
55
+ * - One static + one dynamic (`:param`) is a conflict (the static would shadow the dynamic, ambiguity in author intent)
56
+ * - Two dynamic segments (regardless of name) match the same set of paths — also a conflict
57
+ */
58
+ function routesConflict(a, b) {
59
+ if (a === b)
60
+ return true;
61
+ const ap = a.split('/').filter(Boolean);
62
+ const bp = b.split('/').filter(Boolean);
63
+ if (ap.length !== bp.length)
64
+ return false;
65
+ for (let i = 0; i < ap.length; i++) {
66
+ const aSeg = ap[i];
67
+ const bSeg = bp[i];
68
+ const aDyn = aSeg.startsWith(':');
69
+ const bDyn = bSeg.startsWith(':');
70
+ if (!aDyn && !bDyn) {
71
+ // Two static segments must match exactly to compete.
72
+ if (aSeg !== bSeg)
73
+ return false;
74
+ }
75
+ // static-vs-dynamic and dynamic-vs-dynamic both potentially match same paths,
76
+ // continue checking remaining segments
77
+ }
78
+ return true;
79
+ }
80
+ //# sourceMappingURL=dynamic-route-conflict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic-route-conflict.js","sourceRoot":"","sources":["../../../src/validation/validators/dynamic-route-conflict.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAc;IAC7C,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,wBAAwB;IAC9B,MAAM,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,CAAU;IAEnE,eAAe;QACb,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAqB;QAClC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;QAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO,EAAE,CAAA;QACzE,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,EAAE,CAAA;QACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAA;QAE3E,MAAM,QAAQ,GAAI,QAAyB,CAAC,KAAK,CAAA;QACjD,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAA;QAExB,MAAM,MAAM,GAAY,EAAE,CAAA;QAC1B,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC5C,IAAI,SAAS,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI;gBAAE,SAAQ,CAAC,YAAY;YACxD,IAAI,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1C,MAAM,CAAC,IAAI,CAAC;oBACV,SAAS,EAAE,wBAAwB;oBACnC,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,UAAU,QAAQ,mCAAmC,SAAS,aAAa,KAAK,CAAC,KAAK,KAAK;oBACpG,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;iBAC9B,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;CACF,CAAA;AAED;;;;;;;;GAQG;AACH,SAAS,cAAc,CAAC,CAAS,EAAE,CAAS;IAC1C,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACxB,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACvC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACvC,IAAI,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;QAClB,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QACjC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACnB,qDAAqD;YACrD,IAAI,IAAI,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAA;QACjC,CAAC;QACD,8EAA8E;QAC9E,uCAAuC;IACzC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Validator } from '../types.js';
2
+ export declare const htmlValidity: Validator;
3
+ //# sourceMappingURL=html-validity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-validity.d.ts","sourceRoot":"","sources":["../../../src/validation/validators/html-validity.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAS,SAAS,EAAkB,MAAM,aAAa,CAAA;AAmBnE,eAAO,MAAM,YAAY,EAAE,SA4C1B,CAAA"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * html-validity validator (Validation Cut 3).
3
+ *
4
+ * Runs html-validate (https://html-validate.org/) against the rendered output
5
+ * of each page, surfacing structural HTML problems: missing required
6
+ * attributes, mis-nesting, unclosed tags, deprecated elements.
7
+ *
8
+ * Stages: background + pre-publish + cli (NOT save-delta — depends on
9
+ * rendered output, which save-delta doesn't have access to). Pre-publish
10
+ * promotes warns to errors via the standard severity-promotion mechanism;
11
+ * background surfaces them as warns to keep accumulated debt non-blocking.
12
+ *
13
+ * Rendered output is supplied via `input.renderedOutput` (Cut 3 contract).
14
+ * When `renderedOutput` is absent (e.g., a save-delta scope or a setup that
15
+ * doesn't render), the validator returns no issues — it can't analyze HTML
16
+ * it doesn't have.
17
+ *
18
+ * # SOLID lenses
19
+ *
20
+ * - SRP: this validator owns the HTML-validity check. Render-for-analysis
21
+ * produces the bytes; the validator consumes them.
22
+ * - DIP: depends on `RenderedOutputAccess` interface, not the renderer.
23
+ * - OCP: html-validate's rule set is configurable; future operator-tunable
24
+ * rule subsets ship via per-site config without changing this file.
25
+ */
26
+ import { HtmlValidate } from 'html-validate';
27
+ let cachedValidator = null;
28
+ function getValidator() {
29
+ if (!cachedValidator) {
30
+ cachedValidator = new HtmlValidate({
31
+ extends: ['html-validate:recommended'],
32
+ // Rules that fire too often on Gazetta-rendered output without adding
33
+ // value. Kept narrow; expand only when concrete operator demand surfaces.
34
+ rules: {
35
+ // Allow dynamically inserted IDs (scoped CSS via hashPath).
36
+ 'no-dup-id': 'error',
37
+ },
38
+ });
39
+ }
40
+ return cachedValidator;
41
+ }
42
+ export const htmlValidity = {
43
+ source: 'gazetta',
44
+ name: 'html-validity',
45
+ stages: ['background', 'pre-publish', 'cli'],
46
+ defaultSeverity(stage) {
47
+ return stage === 'pre-publish' ? 'error' : 'warn';
48
+ },
49
+ async validate(input) {
50
+ const { scope, renderedOutput } = input;
51
+ if (scope.kind !== 'background' && scope.kind !== 'pre-publish' && scope.kind !== 'cli')
52
+ return [];
53
+ if (!renderedOutput)
54
+ return [];
55
+ const items = scope.kind === 'background' ? [scope.item] : scope.kind === 'pre-publish' ? [...scope.items] : [];
56
+ if (scope.kind === 'cli')
57
+ return []; // CLI scope walks the site itself; rendered output is per-item
58
+ const issues = [];
59
+ const validator = getValidator();
60
+ for (const item of items) {
61
+ if (item.kind !== 'page')
62
+ continue; // fragments are partials, not full HTML
63
+ const html = await renderedOutput.htmlFor(item);
64
+ if (!html)
65
+ continue;
66
+ const report = await validator.validateString(html);
67
+ if (report.valid)
68
+ continue;
69
+ for (const result of report.results) {
70
+ for (const msg of result.messages) {
71
+ issues.push({
72
+ // Per design-validation.md "Stage × validator matrix":
73
+ // html-validity is warn at every stage (including pre-publish).
74
+ // Operators who want it to block publish opt into
75
+ // publishAudit.strict on the destination target — strict
76
+ // promotion in the publish-audit orchestrator turns warns
77
+ // into errors. The validator itself stays uniformly warn.
78
+ validator: 'html-validity',
79
+ severity: msg.severity === 2 ? 'warn' : 'info',
80
+ message: `${msg.ruleId}: ${msg.message} (line ${msg.line}, col ${msg.column})`,
81
+ itemPath: item.itemPath,
82
+ });
83
+ }
84
+ }
85
+ }
86
+ return issues;
87
+ },
88
+ };
89
+ //# sourceMappingURL=html-validity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-validity.js","sourceRoot":"","sources":["../../../src/validation/validators/html-validity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAG5C,IAAI,eAAe,GAAwB,IAAI,CAAA;AAE/C,SAAS,YAAY;IACnB,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,eAAe,GAAG,IAAI,YAAY,CAAC;YACjC,OAAO,EAAE,CAAC,2BAA2B,CAAC;YACtC,sEAAsE;YACtE,0EAA0E;YAC1E,KAAK,EAAE;gBACL,4DAA4D;gBAC5D,WAAW,EAAE,OAAO;aACrB;SACF,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,eAAe,CAAA;AACxB,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAc;IACrC,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,eAAe;IACrB,MAAM,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,KAAK,CAAU;IAErD,eAAe,CAAC,KAAK;QACnB,OAAO,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAA;IACnD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAqB;QAClC,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,KAAK,CAAA;QACvC,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,EAAE,CAAA;QAClG,IAAI,CAAC,cAAc;YAAE,OAAO,EAAE,CAAA;QAE9B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC/G,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,EAAE,CAAA,CAAC,+DAA+D;QAEnG,MAAM,MAAM,GAAY,EAAE,CAAA;QAC1B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;QAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAQ,CAAC,wCAAwC;YAC3E,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAC/C,IAAI,CAAC,IAAI;gBAAE,SAAQ;YACnB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;YACnD,IAAI,MAAM,CAAC,KAAK;gBAAE,SAAQ;YAC1B,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;oBAClC,MAAM,CAAC,IAAI,CAAC;wBACV,uDAAuD;wBACvD,gEAAgE;wBAChE,kDAAkD;wBAClD,yDAAyD;wBACzD,0DAA0D;wBAC1D,0DAA0D;wBAC1D,SAAS,EAAE,eAAe;wBAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;wBAC9C,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,OAAO,UAAU,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,MAAM,GAAG;wBAC9E,QAAQ,EAAE,IAAI,CAAC,QAAQ;qBACxB,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;CACF,CAAA"}
@@ -0,0 +1,21 @@
1
+ import type { Validator } from '../types.js';
2
+ /**
3
+ * Detect locale-variant manifests whose locale isn't supported by the site.
4
+ *
5
+ * Concrete cases this catches:
6
+ * - `page.fr.json` exists but site config omits `fr` from `locales.supported`
7
+ * (typo, removed locale, or copy-paste leftover)
8
+ * - Same for `fragment.{loc}.json`
9
+ *
10
+ * Doesn't flag missing-default — `page.json` (default locale) absence with
11
+ * `page.fr.json` present means "French-only page," which is valid (per
12
+ * `design-i18n.md` "Edge cases" — French-only pages are allowed).
13
+ *
14
+ * Background scope only — orphan-locale is a site-wide property of the file
15
+ * tree; save-delta on `page.fr.json` already runs the standard ref validators
16
+ * against the saved variant.
17
+ *
18
+ * Issues surface on the orphaned variant file itself.
19
+ */
20
+ export declare const orphanedLocaleFile: Validator;
21
+ //# sourceMappingURL=orphaned-locale-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphaned-locale-file.d.ts","sourceRoot":"","sources":["../../../src/validation/validators/orphaned-locale-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,SAAS,EAAkB,MAAM,aAAa,CAAA;AAGnE;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,kBAAkB,EAAE,SA8DhC,CAAA"}
@@ -0,0 +1,84 @@
1
+ import { resolveSiteLocales } from '../../locale.js';
2
+ /**
3
+ * Detect locale-variant manifests whose locale isn't supported by the site.
4
+ *
5
+ * Concrete cases this catches:
6
+ * - `page.fr.json` exists but site config omits `fr` from `locales.supported`
7
+ * (typo, removed locale, or copy-paste leftover)
8
+ * - Same for `fragment.{loc}.json`
9
+ *
10
+ * Doesn't flag missing-default — `page.json` (default locale) absence with
11
+ * `page.fr.json` present means "French-only page," which is valid (per
12
+ * `design-i18n.md` "Edge cases" — French-only pages are allowed).
13
+ *
14
+ * Background scope only — orphan-locale is a site-wide property of the file
15
+ * tree; save-delta on `page.fr.json` already runs the standard ref validators
16
+ * against the saved variant.
17
+ *
18
+ * Issues surface on the orphaned variant file itself.
19
+ */
20
+ export const orphanedLocaleFile = {
21
+ source: 'gazetta',
22
+ name: 'orphaned-locale-file',
23
+ stages: ['background', 'cli'],
24
+ defaultSeverity() {
25
+ return 'warn';
26
+ },
27
+ async validate(input) {
28
+ const { scope, site } = input;
29
+ if (scope.kind !== 'background' && scope.kind !== 'cli')
30
+ return [];
31
+ const resolved = resolveSiteLocales(site.manifest);
32
+ if (!resolved)
33
+ return []; // single-locale site — no locale variants to check
34
+ const supported = new Set(resolved.supported);
35
+ if (scope.kind === 'background') {
36
+ // Per-item: only emit if THIS item's locale is unsupported.
37
+ const item = scope.item;
38
+ const variants = item.kind === 'page' ? site.pageLocales.get(item.name) : site.fragmentLocales.get(item.name);
39
+ if (!variants)
40
+ return [];
41
+ const issues = [];
42
+ for (const [locale, manifest] of variants.locales) {
43
+ if (supported.has(locale))
44
+ continue;
45
+ const ext = item.kind === 'page' ? 'page' : 'fragment';
46
+ issues.push({
47
+ validator: 'orphaned-locale-file',
48
+ severity: 'warn',
49
+ message: `Locale variant "${locale}" exists but is not in site.locales.supported. Add the locale to site.config.ts or remove the file.`,
50
+ itemPath: `${manifest.dir}/${ext}.${locale}.json`,
51
+ });
52
+ }
53
+ return issues;
54
+ }
55
+ // CLI: enumerate every orphan across the site
56
+ const issues = [];
57
+ for (const [, entry] of site.pageLocales) {
58
+ for (const [locale, manifest] of entry.locales) {
59
+ if (supported.has(locale))
60
+ continue;
61
+ issues.push({
62
+ validator: 'orphaned-locale-file',
63
+ severity: 'warn',
64
+ message: `Locale variant "${locale}" exists but is not in site.locales.supported.`,
65
+ itemPath: `${manifest.dir}/page.${locale}.json`,
66
+ });
67
+ }
68
+ }
69
+ for (const [, entry] of site.fragmentLocales) {
70
+ for (const [locale, manifest] of entry.locales) {
71
+ if (supported.has(locale))
72
+ continue;
73
+ issues.push({
74
+ validator: 'orphaned-locale-file',
75
+ severity: 'warn',
76
+ message: `Locale variant "${locale}" exists but is not in site.locales.supported.`,
77
+ itemPath: `${manifest.dir}/fragment.${locale}.json`,
78
+ });
79
+ }
80
+ }
81
+ return issues;
82
+ },
83
+ };
84
+ //# sourceMappingURL=orphaned-locale-file.js.map