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.
- package/admin-dist/assets/index-CBeq0rRb.js +693 -0
- package/admin-dist/assets/index-Dtg1dTZQ.css +1 -0
- package/admin-dist/assets/rolldown-runtime-BYbx6iT9.js +1 -0
- package/admin-dist/assets/{vendor-primevue-C0Q_YTCb.js → vendor-primevue-CBGHkaXv.js} +183 -39
- package/admin-dist/assets/{vendor-react-BipDVGow.js → vendor-react-BdW_kNCG.js} +2 -2
- package/admin-dist/assets/vendor-rjsf-lN2SztQt.js +33 -0
- package/admin-dist/assets/vendor-tiptap-C36yDquB.js +141 -0
- package/admin-dist/assets/vendor-vue-Bt5uR1VW.js +1 -0
- package/admin-dist/assets/workbox-window.prod.es5-DGMtIXHc.js +2 -0
- package/admin-dist/index.html +8 -8
- package/admin-dist/sw.js +1 -0
- package/dist/admin-api/archived-name-conflict.d.ts +31 -0
- package/dist/admin-api/archived-name-conflict.d.ts.map +1 -0
- package/dist/admin-api/archived-name-conflict.js +226 -0
- package/dist/admin-api/archived-name-conflict.js.map +1 -0
- package/dist/admin-api/cache-stats-logger.d.ts +83 -0
- package/dist/admin-api/cache-stats-logger.d.ts.map +1 -0
- package/dist/admin-api/cache-stats-logger.js +59 -0
- package/dist/admin-api/cache-stats-logger.js.map +1 -0
- package/dist/admin-api/hook-audit-emitter.d.ts +38 -0
- package/dist/admin-api/hook-audit-emitter.d.ts.map +1 -0
- package/dist/admin-api/hook-audit-emitter.js +21 -0
- package/dist/admin-api/hook-audit-emitter.js.map +1 -0
- package/dist/admin-api/index.d.ts +84 -0
- package/dist/admin-api/index.d.ts.map +1 -1
- package/dist/admin-api/index.js +254 -9
- package/dist/admin-api/index.js.map +1 -1
- package/dist/admin-api/middleware/audit.d.ts +25 -0
- package/dist/admin-api/middleware/audit.d.ts.map +1 -0
- package/dist/admin-api/middleware/audit.js +65 -0
- package/dist/admin-api/middleware/audit.js.map +1 -0
- package/dist/admin-api/middleware/capability.d.ts +8 -0
- package/dist/admin-api/middleware/capability.d.ts.map +1 -0
- package/dist/admin-api/middleware/capability.js +65 -0
- package/dist/admin-api/middleware/capability.js.map +1 -0
- package/dist/admin-api/middleware/principal.d.ts +18 -0
- package/dist/admin-api/middleware/principal.d.ts.map +1 -0
- package/dist/admin-api/middleware/principal.js +128 -0
- package/dist/admin-api/middleware/principal.js.map +1 -0
- package/dist/admin-api/routes/archive-review.d.ts +80 -0
- package/dist/admin-api/routes/archive-review.d.ts.map +1 -0
- package/dist/admin-api/routes/archive-review.js +70 -0
- package/dist/admin-api/routes/archive-review.js.map +1 -0
- package/dist/admin-api/routes/archive.d.ts +145 -0
- package/dist/admin-api/routes/archive.d.ts.map +1 -0
- package/dist/admin-api/routes/archive.js +540 -0
- package/dist/admin-api/routes/archive.js.map +1 -0
- package/dist/admin-api/routes/assets.d.ts +6 -1
- package/dist/admin-api/routes/assets.d.ts.map +1 -1
- package/dist/admin-api/routes/assets.js +167 -14
- package/dist/admin-api/routes/assets.js.map +1 -1
- package/dist/admin-api/routes/audit.d.ts +71 -0
- package/dist/admin-api/routes/audit.d.ts.map +1 -0
- package/dist/admin-api/routes/audit.js +178 -0
- package/dist/admin-api/routes/audit.js.map +1 -0
- package/dist/admin-api/routes/compare.d.ts.map +1 -1
- package/dist/admin-api/routes/compare.js +3 -2
- package/dist/admin-api/routes/compare.js.map +1 -1
- package/dist/admin-api/routes/fields.d.ts.map +1 -1
- package/dist/admin-api/routes/fields.js +2 -1
- package/dist/admin-api/routes/fields.js.map +1 -1
- package/dist/admin-api/routes/fragments.d.ts +13 -1
- package/dist/admin-api/routes/fragments.d.ts.map +1 -1
- package/dist/admin-api/routes/fragments.js +127 -92
- package/dist/admin-api/routes/fragments.js.map +1 -1
- package/dist/admin-api/routes/health.d.ts +60 -0
- package/dist/admin-api/routes/health.d.ts.map +1 -0
- package/dist/admin-api/routes/health.js +65 -0
- package/dist/admin-api/routes/health.js.map +1 -0
- package/dist/admin-api/routes/history.d.ts +2 -1
- package/dist/admin-api/routes/history.d.ts.map +1 -1
- package/dist/admin-api/routes/history.js +26 -4
- package/dist/admin-api/routes/history.js.map +1 -1
- package/dist/admin-api/routes/pages.d.ts +20 -1
- package/dist/admin-api/routes/pages.d.ts.map +1 -1
- package/dist/admin-api/routes/pages.js +157 -117
- package/dist/admin-api/routes/pages.js.map +1 -1
- package/dist/admin-api/routes/preview.d.ts.map +1 -1
- package/dist/admin-api/routes/preview.js +56 -17
- package/dist/admin-api/routes/preview.js.map +1 -1
- package/dist/admin-api/routes/publish.d.ts +19 -1
- package/dist/admin-api/routes/publish.d.ts.map +1 -1
- package/dist/admin-api/routes/publish.js +508 -92
- package/dist/admin-api/routes/publish.js.map +1 -1
- package/dist/admin-api/routes/rename.d.ts +62 -0
- package/dist/admin-api/routes/rename.d.ts.map +1 -0
- package/dist/admin-api/routes/rename.js +366 -0
- package/dist/admin-api/routes/rename.js.map +1 -0
- package/dist/admin-api/routes/site.d.ts.map +1 -1
- package/dist/admin-api/routes/site.js +6 -18
- package/dist/admin-api/routes/site.js.map +1 -1
- package/dist/admin-api/routes/system.d.ts +23 -0
- package/dist/admin-api/routes/system.d.ts.map +1 -0
- package/dist/admin-api/routes/system.js +115 -0
- package/dist/admin-api/routes/system.js.map +1 -0
- package/dist/admin-api/routes/templates.d.ts +11 -1
- package/dist/admin-api/routes/templates.d.ts.map +1 -1
- package/dist/admin-api/routes/templates.js +36 -3
- package/dist/admin-api/routes/templates.js.map +1 -1
- package/dist/admin-api/routes/validation.d.ts +47 -0
- package/dist/admin-api/routes/validation.d.ts.map +1 -0
- package/dist/admin-api/routes/validation.js +120 -0
- package/dist/admin-api/routes/validation.js.map +1 -0
- package/dist/admin-api/schemas/archive.d.ts +124 -0
- package/dist/admin-api/schemas/archive.d.ts.map +1 -0
- package/dist/admin-api/schemas/archive.js +93 -0
- package/dist/admin-api/schemas/archive.js.map +1 -0
- package/dist/admin-api/schemas/assets.d.ts +16 -0
- package/dist/admin-api/schemas/assets.d.ts.map +1 -1
- package/dist/admin-api/schemas/assets.js +15 -0
- package/dist/admin-api/schemas/assets.js.map +1 -1
- package/dist/admin-api/schemas/audit.d.ts +175 -0
- package/dist/admin-api/schemas/audit.d.ts.map +1 -0
- package/dist/admin-api/schemas/audit.js +91 -0
- package/dist/admin-api/schemas/audit.js.map +1 -0
- package/dist/admin-api/schemas/error.d.ts +94 -0
- package/dist/admin-api/schemas/error.d.ts.map +1 -0
- package/dist/admin-api/schemas/error.js +79 -0
- package/dist/admin-api/schemas/error.js.map +1 -0
- package/dist/admin-api/schemas/fragments.d.ts +2 -0
- package/dist/admin-api/schemas/fragments.d.ts.map +1 -1
- package/dist/admin-api/schemas/fragments.js +4 -0
- package/dist/admin-api/schemas/fragments.js.map +1 -1
- package/dist/admin-api/schemas/index.d.ts +8 -0
- package/dist/admin-api/schemas/index.d.ts.map +1 -1
- package/dist/admin-api/schemas/index.js +8 -0
- package/dist/admin-api/schemas/index.js.map +1 -1
- package/dist/admin-api/schemas/pages.d.ts +2 -0
- package/dist/admin-api/schemas/pages.d.ts.map +1 -1
- package/dist/admin-api/schemas/pages.js +11 -0
- package/dist/admin-api/schemas/pages.js.map +1 -1
- package/dist/admin-api/schemas/rename.d.ts +77 -0
- package/dist/admin-api/schemas/rename.d.ts.map +1 -0
- package/dist/admin-api/schemas/rename.js +75 -0
- package/dist/admin-api/schemas/rename.js.map +1 -0
- package/dist/admin-api/schemas/site.d.ts +3 -2
- package/dist/admin-api/schemas/site.d.ts.map +1 -1
- package/dist/admin-api/schemas/site.js +3 -2
- package/dist/admin-api/schemas/site.js.map +1 -1
- package/dist/admin-api/schemas/system.d.ts +28 -0
- package/dist/admin-api/schemas/system.d.ts.map +1 -0
- package/dist/admin-api/schemas/system.js +35 -0
- package/dist/admin-api/schemas/system.js.map +1 -0
- package/dist/admin-api/schemas/targets.d.ts +55 -0
- package/dist/admin-api/schemas/targets.d.ts.map +1 -1
- package/dist/admin-api/schemas/targets.js +46 -0
- package/dist/admin-api/schemas/targets.js.map +1 -1
- package/dist/admin-api/schemas/templates.d.ts +54 -0
- package/dist/admin-api/schemas/templates.d.ts.map +1 -1
- package/dist/admin-api/schemas/templates.js +21 -0
- package/dist/admin-api/schemas/templates.js.map +1 -1
- package/dist/admin-api/schemas/validation.d.ts +101 -0
- package/dist/admin-api/schemas/validation.d.ts.map +1 -0
- package/dist/admin-api/schemas/validation.js +57 -0
- package/dist/admin-api/schemas/validation.js.map +1 -0
- package/dist/admin-api/source-context.d.ts +66 -10
- package/dist/admin-api/source-context.d.ts.map +1 -1
- package/dist/admin-api/source-context.js +43 -5
- package/dist/admin-api/source-context.js.map +1 -1
- package/dist/ai/adapter-scaffold.d.ts +63 -0
- package/dist/ai/adapter-scaffold.d.ts.map +1 -0
- package/dist/ai/adapter-scaffold.js +89 -0
- package/dist/ai/adapter-scaffold.js.map +1 -0
- package/dist/ai/compose-prompt.d.ts +50 -0
- package/dist/ai/compose-prompt.d.ts.map +1 -0
- package/dist/ai/compose-prompt.js +49 -0
- package/dist/ai/compose-prompt.js.map +1 -0
- package/dist/ai/errors.d.ts +65 -0
- package/dist/ai/errors.d.ts.map +1 -0
- package/dist/ai/errors.js +59 -0
- package/dist/ai/errors.js.map +1 -0
- package/dist/ai/index.d.ts +17 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +16 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/provider.d.ts +76 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +13 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/ai/refusal.d.ts +50 -0
- package/dist/ai/refusal.d.ts.map +1 -0
- package/dist/ai/refusal.js +100 -0
- package/dist/ai/refusal.js.map +1 -0
- package/dist/ai/vision-prep.d.ts +32 -0
- package/dist/ai/vision-prep.d.ts.map +1 -0
- package/dist/ai/vision-prep.js +113 -0
- package/dist/ai/vision-prep.js.map +1 -0
- package/dist/alt/adapter.d.ts +140 -0
- package/dist/alt/adapter.d.ts.map +1 -0
- package/dist/alt/adapter.js +7 -0
- package/dist/alt/adapter.js.map +1 -0
- package/dist/alt/anthropic.d.ts +63 -0
- package/dist/alt/anthropic.d.ts.map +1 -0
- package/dist/alt/anthropic.js +147 -0
- package/dist/alt/anthropic.js.map +1 -0
- package/dist/alt/config.d.ts +67 -0
- package/dist/alt/config.d.ts.map +1 -0
- package/dist/alt/config.js +41 -0
- package/dist/alt/config.js.map +1 -0
- package/dist/alt/factory.d.ts +19 -0
- package/dist/alt/factory.d.ts.map +1 -0
- package/dist/alt/factory.js +69 -0
- package/dist/alt/factory.js.map +1 -0
- package/dist/alt/null-adapter.d.ts +3 -0
- package/dist/alt/null-adapter.d.ts.map +1 -0
- package/dist/alt/null-adapter.js +43 -0
- package/dist/alt/null-adapter.js.map +1 -0
- package/dist/alt/ollama.d.ts +40 -0
- package/dist/alt/ollama.d.ts.map +1 -0
- package/dist/alt/ollama.js +139 -0
- package/dist/alt/ollama.js.map +1 -0
- package/dist/alt/openai.d.ts +46 -0
- package/dist/alt/openai.d.ts.map +1 -0
- package/dist/alt/openai.js +118 -0
- package/dist/alt/openai.js.map +1 -0
- package/dist/alt/prompt-policies.d.ts +79 -0
- package/dist/alt/prompt-policies.d.ts.map +1 -0
- package/dist/alt/prompt-policies.js +67 -0
- package/dist/alt/prompt-policies.js.map +1 -0
- package/dist/alt/route-handler.d.ts +56 -0
- package/dist/alt/route-handler.d.ts.map +1 -0
- package/dist/alt/route-handler.js +122 -0
- package/dist/alt/route-handler.js.map +1 -0
- package/dist/alt/suggester.d.ts +57 -0
- package/dist/alt/suggester.d.ts.map +1 -0
- package/dist/alt/suggester.js +133 -0
- package/dist/alt/suggester.js.map +1 -0
- package/dist/app.js +1 -1
- package/dist/app.js.map +1 -1
- package/dist/archive-aliases.d.ts +79 -0
- package/dist/archive-aliases.d.ts.map +1 -0
- package/dist/archive-aliases.js +60 -0
- package/dist/archive-aliases.js.map +1 -0
- package/dist/archive-helpers.d.ts +73 -0
- package/dist/archive-helpers.d.ts.map +1 -0
- package/dist/archive-helpers.js +94 -0
- package/dist/archive-helpers.js.map +1 -0
- package/dist/assets/find-refs.d.ts +1 -1
- package/dist/assets/find-refs.js +1 -1
- package/dist/assets/find-refs.js.map +1 -1
- package/dist/assets/rename.js +1 -1
- package/dist/assets/rename.js.map +1 -1
- package/dist/assets/replace.js +1 -1
- package/dist/assets/replace.js.map +1 -1
- package/dist/assets/resolve.js +4 -4
- package/dist/assets/resolve.js.map +1 -1
- package/dist/assets/serve-route.js +2 -2
- package/dist/assets/serve-route.js.map +1 -1
- package/dist/assets/validate.d.ts +1 -1
- package/dist/assets/validate.js +1 -1
- package/dist/audit/config.d.ts +75 -0
- package/dist/audit/config.d.ts.map +1 -0
- package/dist/audit/config.js +91 -0
- package/dist/audit/config.js.map +1 -0
- package/dist/audit/context.d.ts +98 -0
- package/dist/audit/context.d.ts.map +1 -0
- package/dist/audit/context.js +51 -0
- package/dist/audit/context.js.map +1 -0
- package/dist/audit/errors.d.ts +73 -0
- package/dist/audit/errors.d.ts.map +1 -0
- package/dist/audit/errors.js +78 -0
- package/dist/audit/errors.js.map +1 -0
- package/dist/audit/index.d.ts +16 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +10 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/provider.d.ts +73 -0
- package/dist/audit/provider.d.ts.map +1 -0
- package/dist/audit/provider.js +2 -0
- package/dist/audit/provider.js.map +1 -0
- package/dist/audit/providers/history.d.ts +66 -0
- package/dist/audit/providers/history.d.ts.map +1 -0
- package/dist/audit/providers/history.js +102 -0
- package/dist/audit/providers/history.js.map +1 -0
- package/dist/audit/pseudonymize.d.ts +26 -0
- package/dist/audit/pseudonymize.d.ts.map +1 -0
- package/dist/audit/pseudonymize.js +86 -0
- package/dist/audit/pseudonymize.js.map +1 -0
- package/dist/audit/recorder.d.ts +102 -0
- package/dist/audit/recorder.d.ts.map +1 -0
- package/dist/audit/recorder.js +55 -0
- package/dist/audit/recorder.js.map +1 -0
- package/dist/audit/retention.d.ts +83 -0
- package/dist/audit/retention.d.ts.map +1 -0
- package/dist/audit/retention.js +142 -0
- package/dist/audit/retention.js.map +1 -0
- package/dist/audit/source-ip.d.ts +32 -0
- package/dist/audit/source-ip.d.ts.map +1 -0
- package/dist/audit/source-ip.js +164 -0
- package/dist/audit/source-ip.js.map +1 -0
- package/dist/audit/types.d.ts +143 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +33 -0
- package/dist/audit/types.js.map +1 -0
- package/dist/audit/user-agent.d.ts +28 -0
- package/dist/audit/user-agent.d.ts.map +1 -0
- package/dist/audit/user-agent.js +63 -0
- package/dist/audit/user-agent.js.map +1 -0
- package/dist/auth/capabilities.d.ts +28 -0
- package/dist/auth/capabilities.d.ts.map +1 -0
- package/dist/auth/capabilities.js +101 -0
- package/dist/auth/capabilities.js.map +1 -0
- package/dist/auth/config.d.ts +109 -0
- package/dist/auth/config.d.ts.map +1 -0
- package/dist/auth/config.js +221 -0
- package/dist/auth/config.js.map +1 -0
- package/dist/auth/errors.d.ts +72 -0
- package/dist/auth/errors.d.ts.map +1 -0
- package/dist/auth/errors.js +78 -0
- package/dist/auth/errors.js.map +1 -0
- package/dist/auth/factory.d.ts +43 -0
- package/dist/auth/factory.d.ts.map +1 -0
- package/dist/auth/factory.js +48 -0
- package/dist/auth/factory.js.map +1 -0
- package/dist/auth/index.d.ts +21 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +14 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/ip-match.d.ts +29 -0
- package/dist/auth/ip-match.d.ts.map +1 -0
- package/dist/auth/ip-match.js +162 -0
- package/dist/auth/ip-match.js.map +1 -0
- package/dist/auth/provider.d.ts +76 -0
- package/dist/auth/provider.d.ts.map +1 -0
- package/dist/auth/provider.js +2 -0
- package/dist/auth/provider.js.map +1 -0
- package/dist/auth/providers/aws-cognito.d.ts +55 -0
- package/dist/auth/providers/aws-cognito.d.ts.map +1 -0
- package/dist/auth/providers/aws-cognito.js +114 -0
- package/dist/auth/providers/aws-cognito.js.map +1 -0
- package/dist/auth/providers/azure-easy-auth.d.ts +7 -0
- package/dist/auth/providers/azure-easy-auth.d.ts.map +1 -0
- package/dist/auth/providers/azure-easy-auth.js +48 -0
- package/dist/auth/providers/azure-easy-auth.js.map +1 -0
- package/dist/auth/providers/cloudflare-access.d.ts +71 -0
- package/dist/auth/providers/cloudflare-access.d.ts.map +1 -0
- package/dist/auth/providers/cloudflare-access.js +120 -0
- package/dist/auth/providers/cloudflare-access.js.map +1 -0
- package/dist/auth/providers/forwarded-user.d.ts +31 -0
- package/dist/auth/providers/forwarded-user.d.ts.map +1 -0
- package/dist/auth/providers/forwarded-user.js +72 -0
- package/dist/auth/providers/forwarded-user.js.map +1 -0
- package/dist/auth/providers/none.d.ts +6 -0
- package/dist/auth/providers/none.d.ts.map +1 -0
- package/dist/auth/providers/none.js +19 -0
- package/dist/auth/providers/none.js.map +1 -0
- package/dist/auth/providers/tailscale.d.ts +7 -0
- package/dist/auth/providers/tailscale.d.ts.map +1 -0
- package/dist/auth/providers/tailscale.js +30 -0
- package/dist/auth/providers/tailscale.js.map +1 -0
- package/dist/auth/role-resolver.d.ts +38 -0
- package/dist/auth/role-resolver.d.ts.map +1 -0
- package/dist/auth/role-resolver.js +92 -0
- package/dist/auth/role-resolver.js.map +1 -0
- package/dist/auth/types.d.ts +150 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +60 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cache/errors.d.ts +41 -0
- package/dist/cache/errors.d.ts.map +1 -0
- package/dist/cache/errors.js +44 -0
- package/dist/cache/errors.js.map +1 -0
- package/dist/cache/factories.d.ts +17 -0
- package/dist/cache/factories.d.ts.map +1 -0
- package/dist/cache/factories.js +17 -0
- package/dist/cache/factories.js.map +1 -0
- package/dist/cache/keys.d.ts +63 -0
- package/dist/cache/keys.d.ts.map +1 -0
- package/dist/cache/keys.js +145 -0
- package/dist/cache/keys.js.map +1 -0
- package/dist/cache/memory.d.ts +51 -0
- package/dist/cache/memory.d.ts.map +1 -0
- package/dist/cache/memory.js +204 -0
- package/dist/cache/memory.js.map +1 -0
- package/dist/cache/per-site.d.ts +22 -0
- package/dist/cache/per-site.d.ts.map +1 -0
- package/dist/cache/per-site.js +114 -0
- package/dist/cache/per-site.js.map +1 -0
- package/dist/cache/types.d.ts +142 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +33 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/cli/archive.d.ts +44 -0
- package/dist/cli/archive.d.ts.map +1 -0
- package/dist/cli/archive.js +310 -0
- package/dist/cli/archive.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +15 -8
- package/dist/cli/bootstrap.d.ts.map +1 -1
- package/dist/cli/bootstrap.js +59 -23
- package/dist/cli/bootstrap.js.map +1 -1
- package/dist/cli/dev-template-watcher.d.ts +29 -0
- package/dist/cli/dev-template-watcher.d.ts.map +1 -0
- package/dist/cli/dev-template-watcher.js +38 -0
- package/dist/cli/dev-template-watcher.js.map +1 -0
- package/dist/cli/history.d.ts.map +1 -1
- package/dist/cli/history.js +5 -3
- package/dist/cli/history.js.map +1 -1
- package/dist/cli/index.js +712 -395
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/validate-flags.d.ts +29 -0
- package/dist/cli/validate-flags.d.ts.map +1 -0
- package/dist/cli/validate-flags.js +49 -0
- package/dist/cli/validate-flags.js.map +1 -0
- package/dist/compare.d.ts +1 -1
- package/dist/compare.d.ts.map +1 -1
- package/dist/compare.js +25 -23
- package/dist/compare.js.map +1 -1
- package/dist/component-ids.d.ts +25 -0
- package/dist/component-ids.d.ts.map +1 -0
- package/dist/component-ids.js +83 -0
- package/dist/component-ids.js.map +1 -0
- package/dist/config/define.d.ts +61 -0
- package/dist/config/define.d.ts.map +1 -0
- package/dist/config/define.js +64 -0
- package/dist/config/define.js.map +1 -0
- package/dist/config/errors.d.ts +32 -0
- package/dist/config/errors.d.ts.map +1 -0
- package/dist/config/errors.js +40 -0
- package/dist/config/errors.js.map +1 -0
- package/dist/config/index.d.ts +13 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +20 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +105 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +265 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schemas.d.ts +89 -0
- package/dist/config/schemas.d.ts.map +1 -0
- package/dist/config/schemas.js +172 -0
- package/dist/config/schemas.js.map +1 -0
- package/dist/config/types.d.ts +32 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +15 -0
- package/dist/config/types.js.map +1 -0
- package/dist/deploy/cloudflare-workers.d.ts +46 -0
- package/dist/deploy/cloudflare-workers.d.ts.map +1 -0
- package/dist/deploy/cloudflare-workers.js +213 -0
- package/dist/deploy/cloudflare-workers.js.map +1 -0
- package/dist/deploy/errors.d.ts +66 -0
- package/dist/deploy/errors.d.ts.map +1 -0
- package/dist/deploy/errors.js +82 -0
- package/dist/deploy/errors.js.map +1 -0
- package/dist/deploy/index.d.ts +9 -0
- package/dist/deploy/index.d.ts.map +1 -0
- package/dist/deploy/index.js +3 -0
- package/dist/deploy/index.js.map +1 -0
- package/dist/deploy/types.d.ts +162 -0
- package/dist/deploy/types.d.ts.map +1 -0
- package/dist/deploy/types.js +2 -0
- package/dist/deploy/types.js.map +1 -0
- package/dist/fragments/create.d.ts +70 -0
- package/dist/fragments/create.d.ts.map +1 -0
- package/dist/fragments/create.js +93 -0
- package/dist/fragments/create.js.map +1 -0
- package/dist/fragments/publish.d.ts +37 -0
- package/dist/fragments/publish.d.ts.map +1 -0
- package/dist/fragments/publish.js +52 -0
- package/dist/fragments/publish.js.map +1 -0
- package/dist/fragments/save.d.ts +81 -0
- package/dist/fragments/save.d.ts.map +1 -0
- package/dist/fragments/save.js +105 -0
- package/dist/fragments/save.js.map +1 -0
- package/dist/history-recorder.d.ts +5 -5
- package/dist/history-recorder.d.ts.map +1 -1
- package/dist/history-recorder.js +4 -4
- package/dist/history-recorder.js.map +1 -1
- package/dist/history-restorer.js +2 -2
- package/dist/history-restorer.js.map +1 -1
- package/dist/history.d.ts +1 -1
- package/dist/hooks/audit-emitter.d.ts +73 -0
- package/dist/hooks/audit-emitter.d.ts.map +1 -0
- package/dist/hooks/audit-emitter.js +13 -0
- package/dist/hooks/audit-emitter.js.map +1 -0
- package/dist/hooks/context.d.ts +78 -0
- package/dist/hooks/context.d.ts.map +1 -0
- package/dist/hooks/context.js +56 -0
- package/dist/hooks/context.js.map +1 -0
- package/dist/hooks/contribution.d.ts +90 -0
- package/dist/hooks/contribution.d.ts.map +1 -0
- package/dist/hooks/contribution.js +2 -0
- package/dist/hooks/contribution.js.map +1 -0
- package/dist/hooks/dispatch.d.ts +30 -0
- package/dist/hooks/dispatch.d.ts.map +1 -0
- package/dist/hooks/dispatch.js +252 -0
- package/dist/hooks/dispatch.js.map +1 -0
- package/dist/hooks/errors.d.ts +100 -0
- package/dist/hooks/errors.d.ts.map +1 -0
- package/dist/hooks/errors.js +103 -0
- package/dist/hooks/errors.js.map +1 -0
- package/dist/hooks/index.d.ts +15 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +6 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/registry.d.ts +53 -0
- package/dist/hooks/registry.d.ts.map +1 -0
- package/dist/hooks/registry.js +139 -0
- package/dist/hooks/registry.js.map +1 -0
- package/dist/hooks/storage.d.ts +43 -0
- package/dist/hooks/storage.d.ts.map +1 -0
- package/dist/hooks/storage.js +2 -0
- package/dist/hooks/storage.js.map +1 -0
- package/dist/hooks/types.d.ts +324 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +2 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +26 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -5
- package/dist/index.js.map +1 -1
- package/dist/locale.d.ts +5 -1
- package/dist/locale.d.ts.map +1 -1
- package/dist/locale.js +6 -2
- package/dist/locale.js.map +1 -1
- package/dist/manifest-save.d.ts +255 -0
- package/dist/manifest-save.d.ts.map +1 -0
- package/dist/manifest-save.js +260 -0
- package/dist/manifest-save.js.map +1 -0
- package/dist/manifest.d.ts +1 -2
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +43 -44
- package/dist/manifest.js.map +1 -1
- package/dist/node-floor.d.ts +3 -0
- package/dist/node-floor.d.ts.map +1 -0
- package/dist/node-floor.js +3 -0
- package/dist/node-floor.js.map +1 -0
- package/dist/pages/create.d.ts +103 -0
- package/dist/pages/create.d.ts.map +1 -0
- package/dist/pages/create.js +117 -0
- package/dist/pages/create.js.map +1 -0
- package/dist/pages/publish.d.ts +59 -0
- package/dist/pages/publish.d.ts.map +1 -0
- package/dist/pages/publish.js +78 -0
- package/dist/pages/publish.js.map +1 -0
- package/dist/pages/save.d.ts +97 -0
- package/dist/pages/save.d.ts.map +1 -0
- package/dist/pages/save.js +138 -0
- package/dist/pages/save.js.map +1 -0
- package/dist/providers/factories.d.ts +65 -0
- package/dist/providers/factories.d.ts.map +1 -0
- package/dist/providers/factories.js +189 -0
- package/dist/providers/factories.js.map +1 -0
- package/dist/publish-item.d.ts +225 -0
- package/dist/publish-item.d.ts.map +1 -0
- package/dist/publish-item.js +210 -0
- package/dist/publish-item.js.map +1 -0
- package/dist/publish-rendered.d.ts.map +1 -1
- package/dist/publish-rendered.js +75 -6
- package/dist/publish-rendered.js.map +1 -1
- package/dist/publish-renderers.d.ts +132 -0
- package/dist/publish-renderers.d.ts.map +1 -0
- package/dist/publish-renderers.js +240 -0
- package/dist/publish-renderers.js.map +1 -0
- package/dist/publish-run.d.ts +223 -0
- package/dist/publish-run.d.ts.map +1 -0
- package/dist/publish-run.js +307 -0
- package/dist/publish-run.js.map +1 -0
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +1 -10
- package/dist/publish.js.map +1 -1
- package/dist/render-for-analysis.d.ts +24 -0
- package/dist/render-for-analysis.d.ts.map +1 -0
- package/dist/render-for-analysis.js +146 -0
- package/dist/render-for-analysis.js.map +1 -0
- package/dist/resolver.d.ts.map +1 -1
- package/dist/resolver.js +47 -23
- package/dist/resolver.js.map +1 -1
- package/dist/runtime/archive-marker.d.ts +62 -0
- package/dist/runtime/archive-marker.d.ts.map +1 -0
- package/dist/runtime/archive-marker.js +88 -0
- package/dist/runtime/archive-marker.js.map +1 -0
- package/dist/runtime/capability-gap-warnings.d.ts +42 -0
- package/dist/runtime/capability-gap-warnings.d.ts.map +1 -0
- package/dist/runtime/capability-gap-warnings.js +28 -0
- package/dist/runtime/capability-gap-warnings.js.map +1 -0
- package/dist/runtime/redirects-emit.d.ts +93 -0
- package/dist/runtime/redirects-emit.d.ts.map +1 -0
- package/dist/runtime/redirects-emit.js +89 -0
- package/dist/runtime/redirects-emit.js.map +1 -0
- package/dist/runtime/runtime-capabilities.d.ts +79 -0
- package/dist/runtime/runtime-capabilities.d.ts.map +1 -0
- package/dist/runtime/runtime-capabilities.js +60 -0
- package/dist/runtime/runtime-capabilities.js.map +1 -0
- package/dist/save-etag.d.ts +69 -0
- package/dist/save-etag.d.ts.map +1 -0
- package/dist/save-etag.js +118 -0
- package/dist/save-etag.js.map +1 -0
- package/dist/site-loader.d.ts +42 -4
- package/dist/site-loader.d.ts.map +1 -1
- package/dist/site-loader.js +27 -8
- package/dist/site-loader.js.map +1 -1
- package/dist/targets.d.ts +21 -12
- package/dist/targets.d.ts.map +1 -1
- package/dist/targets.js +27 -95
- package/dist/targets.js.map +1 -1
- package/dist/testing/admin-cache-contract.d.ts +52 -0
- package/dist/testing/admin-cache-contract.d.ts.map +1 -0
- package/dist/testing/admin-cache-contract.js +203 -0
- package/dist/testing/admin-cache-contract.js.map +1 -0
- package/dist/testing/index.d.ts +11 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +11 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/transforms/factories.d.ts +16 -0
- package/dist/transforms/factories.d.ts.map +1 -0
- package/dist/transforms/factories.js +18 -0
- package/dist/transforms/factories.js.map +1 -0
- package/dist/transforms/index.d.ts +10 -17
- package/dist/transforms/index.d.ts.map +1 -1
- package/dist/transforms/index.js +4 -28
- package/dist/transforms/index.js.map +1 -1
- package/dist/transforms/sharp.d.ts +15 -1
- package/dist/transforms/sharp.d.ts.map +1 -1
- package/dist/transforms/sharp.js +34 -20
- package/dist/transforms/sharp.js.map +1 -1
- package/dist/types.d.ts +379 -52
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +20 -1
- package/dist/types.js.map +1 -1
- package/dist/validation/alt-required-walker.d.ts +27 -0
- package/dist/validation/alt-required-walker.d.ts.map +1 -0
- package/dist/validation/alt-required-walker.js +108 -0
- package/dist/validation/alt-required-walker.js.map +1 -0
- package/dist/validation/default-registry.d.ts +12 -0
- package/dist/validation/default-registry.d.ts.map +1 -0
- package/dist/validation/default-registry.js +55 -0
- package/dist/validation/default-registry.js.map +1 -0
- package/dist/validation/publish-audit.d.ts +44 -0
- package/dist/validation/publish-audit.d.ts.map +1 -0
- package/dist/validation/publish-audit.js +64 -0
- package/dist/validation/publish-audit.js.map +1 -0
- package/dist/validation/registry.d.ts +23 -0
- package/dist/validation/registry.d.ts.map +1 -0
- package/dist/validation/registry.js +15 -0
- package/dist/validation/registry.js.map +1 -0
- package/dist/validation/save-delta.d.ts +46 -0
- package/dist/validation/save-delta.d.ts.map +1 -0
- package/dist/validation/save-delta.js +57 -0
- package/dist/validation/save-delta.js.map +1 -0
- package/dist/validation/scanner.d.ts +91 -0
- package/dist/validation/scanner.d.ts.map +1 -0
- package/dist/validation/scanner.js +327 -0
- package/dist/validation/scanner.js.map +1 -0
- package/dist/validation/template-impact.d.ts +52 -0
- package/dist/validation/template-impact.d.ts.map +1 -0
- package/dist/validation/template-impact.js +53 -0
- package/dist/validation/template-impact.js.map +1 -0
- package/dist/validation/types.d.ts +123 -0
- package/dist/validation/types.d.ts.map +1 -0
- package/dist/validation/types.js +7 -0
- package/dist/validation/types.js.map +1 -0
- package/dist/validation/validators/accessibility.d.ts +3 -0
- package/dist/validation/validators/accessibility.d.ts.map +1 -0
- package/dist/validation/validators/accessibility.js +106 -0
- package/dist/validation/validators/accessibility.js.map +1 -0
- package/dist/validation/validators/aliasof-points-to-archived.d.ts +40 -0
- package/dist/validation/validators/aliasof-points-to-archived.d.ts.map +1 -0
- package/dist/validation/validators/aliasof-points-to-archived.js +34 -0
- package/dist/validation/validators/aliasof-points-to-archived.js.map +1 -0
- package/dist/validation/validators/alt-required.d.ts +3 -0
- package/dist/validation/validators/alt-required.d.ts.map +1 -0
- package/dist/validation/validators/alt-required.js +118 -0
- package/dist/validation/validators/alt-required.js.map +1 -0
- package/dist/validation/validators/archive-not-supported-on-target.d.ts +3 -0
- package/dist/validation/validators/archive-not-supported-on-target.d.ts.map +1 -0
- package/dist/validation/validators/archive-not-supported-on-target.js +38 -0
- package/dist/validation/validators/archive-not-supported-on-target.js.map +1 -0
- package/dist/validation/validators/broken-links.d.ts +3 -0
- package/dist/validation/validators/broken-links.d.ts.map +1 -0
- package/dist/validation/validators/broken-links.js +190 -0
- package/dist/validation/validators/broken-links.js.map +1 -0
- package/dist/validation/validators/circular-alias.d.ts +36 -0
- package/dist/validation/validators/circular-alias.d.ts.map +1 -0
- package/dist/validation/validators/circular-alias.js +63 -0
- package/dist/validation/validators/circular-alias.js.map +1 -0
- package/dist/validation/validators/circular-fragment.d.ts +15 -0
- package/dist/validation/validators/circular-fragment.d.ts.map +1 -0
- package/dist/validation/validators/circular-fragment.js +97 -0
- package/dist/validation/validators/circular-fragment.js.map +1 -0
- package/dist/validation/validators/dangling-alias.d.ts +38 -0
- package/dist/validation/validators/dangling-alias.d.ts.map +1 -0
- package/dist/validation/validators/dangling-alias.js +31 -0
- package/dist/validation/validators/dangling-alias.js.map +1 -0
- package/dist/validation/validators/deploy-target-type-supported.d.ts +3 -0
- package/dist/validation/validators/deploy-target-type-supported.d.ts.map +1 -0
- package/dist/validation/validators/deploy-target-type-supported.js +32 -0
- package/dist/validation/validators/deploy-target-type-supported.js.map +1 -0
- package/dist/validation/validators/dynamic-route-conflict.d.ts +18 -0
- package/dist/validation/validators/dynamic-route-conflict.d.ts.map +1 -0
- package/dist/validation/validators/dynamic-route-conflict.js +80 -0
- package/dist/validation/validators/dynamic-route-conflict.js.map +1 -0
- package/dist/validation/validators/html-validity.d.ts +3 -0
- package/dist/validation/validators/html-validity.d.ts.map +1 -0
- package/dist/validation/validators/html-validity.js +89 -0
- package/dist/validation/validators/html-validity.js.map +1 -0
- package/dist/validation/validators/orphaned-locale-file.d.ts +21 -0
- package/dist/validation/validators/orphaned-locale-file.d.ts.map +1 -0
- package/dist/validation/validators/orphaned-locale-file.js +84 -0
- package/dist/validation/validators/orphaned-locale-file.js.map +1 -0
- package/dist/validation/validators/referenced-archived-without-alias.d.ts +3 -0
- package/dist/validation/validators/referenced-archived-without-alias.d.ts.map +1 -0
- package/dist/validation/validators/referenced-archived-without-alias.js +65 -0
- package/dist/validation/validators/referenced-archived-without-alias.js.map +1 -0
- package/dist/validation/validators/referenced-asset-exists.d.ts +13 -0
- package/dist/validation/validators/referenced-asset-exists.d.ts.map +1 -0
- package/dist/validation/validators/referenced-asset-exists.js +80 -0
- package/dist/validation/validators/referenced-asset-exists.js.map +1 -0
- package/dist/validation/validators/referenced-fragment-exists.d.ts +9 -0
- package/dist/validation/validators/referenced-fragment-exists.d.ts.map +1 -0
- package/dist/validation/validators/referenced-fragment-exists.js +52 -0
- package/dist/validation/validators/referenced-fragment-exists.js.map +1 -0
- package/dist/validation/validators/referenced-template-exists.d.ts +10 -0
- package/dist/validation/validators/referenced-template-exists.d.ts.map +1 -0
- package/dist/validation/validators/referenced-template-exists.js +74 -0
- package/dist/validation/validators/referenced-template-exists.js.map +1 -0
- package/dist/validation/validators/schema-conformance.d.ts +17 -0
- package/dist/validation/validators/schema-conformance.d.ts.map +1 -0
- package/dist/validation/validators/schema-conformance.js +94 -0
- package/dist/validation/validators/schema-conformance.js.map +1 -0
- package/dist/validation/validators/target-deploy-coverage.d.ts +3 -0
- package/dist/validation/validators/target-deploy-coverage.d.ts.map +1 -0
- package/dist/validation/validators/target-deploy-coverage.js +37 -0
- package/dist/validation/validators/target-deploy-coverage.js.map +1 -0
- package/dist/validation/validators/unused-fragment.d.ts +16 -0
- package/dist/validation/validators/unused-fragment.d.ts.map +1 -0
- package/dist/validation/validators/unused-fragment.js +86 -0
- package/dist/validation/validators/unused-fragment.js.map +1 -0
- package/package.json +54 -31
- package/admin-dist/assets/index-BO9-CXmW.css +0 -1
- package/admin-dist/assets/index-Ufu8zZH_.js +0 -668
- package/admin-dist/assets/rolldown-runtime-COnpUsM8.js +0 -1
- package/admin-dist/assets/vendor-rjsf-HKBAjOmQ.js +0 -32
- package/admin-dist/assets/vendor-tiptap-IyO99U4R.js +0 -142
- package/admin-dist/assets/vendor-vue-D3wBSmDf.js +0 -1
- package/dist/publish-locale.d.ts +0 -44
- package/dist/publish-locale.d.ts.map +0 -1
- package/dist/publish-locale.js +0 -103
- 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":"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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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
|