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
package/dist/resolver.js
CHANGED
|
@@ -3,6 +3,7 @@ import { processContent } from './content.js';
|
|
|
3
3
|
import { resolveAssetRefs } from './assets/resolve.js';
|
|
4
4
|
import { resolveLocaleFallback, resolveSiteLocales } from './locale.js';
|
|
5
5
|
import { resolveSiteThemes } from './themes.js';
|
|
6
|
+
import { resolveFragmentArchiveAlias } from './archive-helpers.js';
|
|
6
7
|
/**
|
|
7
8
|
* Build the asset-resolve context from the site being rendered. Shared
|
|
8
9
|
* across all `processContent` + `resolveAssetRefs` pairs in a single
|
|
@@ -36,14 +37,20 @@ export async function resolveComponent(entry, ctx) {
|
|
|
36
37
|
}
|
|
37
38
|
return resolveInlineComponent(entry, ctx);
|
|
38
39
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
40
|
+
/**
|
|
41
|
+
* Look up a fragment by name with locale fallback. Returns null when the
|
|
42
|
+
* fragment doesn't exist (in any locale). Doesn't follow aliasOf —
|
|
43
|
+
* that's the caller's job (via `resolveFragmentArchiveAlias`).
|
|
44
|
+
*
|
|
45
|
+
* Locale resolution: a locale-specific variant (`fragment.fr.json`)
|
|
46
|
+
* wins when available + reachable per the resolved-locales fallback
|
|
47
|
+
* chain; otherwise the default-locale manifest is used.
|
|
48
|
+
*
|
|
49
|
+
* Used by both `resolveFragmentRef` (per-component path) and
|
|
50
|
+
* `resolveFragment` (entry-point path). Sharing the lookup keeps
|
|
51
|
+
* locale + alias resolution coherent across both paths.
|
|
52
|
+
*/
|
|
53
|
+
function lookupFragmentForLocale(fragmentName, ctx) {
|
|
47
54
|
let fragment = ctx.site.fragments.get(fragmentName) ?? null;
|
|
48
55
|
if (ctx.locale && ctx.resolvedLocales) {
|
|
49
56
|
const localeEntry = ctx.site.fragmentLocales.get(fragmentName);
|
|
@@ -55,7 +62,30 @@ async function resolveFragmentRef(fragmentName, ctx) {
|
|
|
55
62
|
fragment = localeVariant;
|
|
56
63
|
}
|
|
57
64
|
}
|
|
58
|
-
|
|
65
|
+
return fragment;
|
|
66
|
+
}
|
|
67
|
+
async function resolveFragmentRef(fragmentName, ctx) {
|
|
68
|
+
const key = `@${fragmentName}`;
|
|
69
|
+
if (ctx.visited.has(key)) {
|
|
70
|
+
throw new Error(`Circular reference detected: ${key}\n` + ` Resolution path: ${ctx.path.join(' → ')} → ${key}`);
|
|
71
|
+
}
|
|
72
|
+
ctx.visited.add(key);
|
|
73
|
+
ctx.path.push(key);
|
|
74
|
+
// Look up the fragment, following aliasOf when archived (Q2 F1 lock).
|
|
75
|
+
// Throws ArchivedNoAliasError if archived without alias; throws on
|
|
76
|
+
// alias chains > MAX_ALIAS_HOPS or cycles (defensive — Q3 flatten
|
|
77
|
+
// guarantees one hop in practice).
|
|
78
|
+
const lookup = (name) => lookupFragmentForLocale(name, ctx);
|
|
79
|
+
let resolution;
|
|
80
|
+
try {
|
|
81
|
+
resolution = resolveFragmentArchiveAlias(fragmentName, lookup, ctx.path.join(' → '));
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
ctx.path.pop();
|
|
85
|
+
ctx.visited.delete(key);
|
|
86
|
+
throw err;
|
|
87
|
+
}
|
|
88
|
+
if (!resolution) {
|
|
59
89
|
const available = [...ctx.site.fragments.keys()];
|
|
60
90
|
ctx.path.pop();
|
|
61
91
|
ctx.visited.delete(key);
|
|
@@ -63,6 +93,8 @@ async function resolveFragmentRef(fragmentName, ctx) {
|
|
|
63
93
|
` Referenced in: ${ctx.path.join(' → ') || 'page root'}\n` +
|
|
64
94
|
` Available fragments: ${available.length > 0 ? available.join(', ') : '(none)'}`);
|
|
65
95
|
}
|
|
96
|
+
// Cast: lookup callback only returns Site fragment entries which carry `dir`.
|
|
97
|
+
const fragment = resolution.manifest;
|
|
66
98
|
const loaded = await loadTemplate(ctx.site.storage, ctx.templatesDir, fragment.template);
|
|
67
99
|
const children = [];
|
|
68
100
|
if (fragment.components) {
|
|
@@ -106,34 +138,26 @@ async function resolveInlineComponent(comp, ctx) {
|
|
|
106
138
|
};
|
|
107
139
|
}
|
|
108
140
|
export async function resolveFragment(fragmentName, site, locale, theme) {
|
|
109
|
-
// Resolve locale-specific fragment variant
|
|
110
|
-
let fragment = site.fragments.get(fragmentName) ?? null;
|
|
111
141
|
// Always resolve site-level config — even when no active locale/theme
|
|
112
142
|
// is set, the asset resolver may need it (font enumeration walks the
|
|
113
143
|
// configured theme universe).
|
|
114
144
|
const resolvedLocales = resolveSiteLocales(site.manifest) ?? undefined;
|
|
115
145
|
const resolvedThemes = resolveSiteThemes(site.manifest);
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
const bestLocale = resolveLocaleFallback(locale, available, resolvedLocales);
|
|
121
|
-
const localeVariant = localeEntry.locales.get(bestLocale);
|
|
122
|
-
if (localeVariant)
|
|
123
|
-
fragment = localeVariant;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
if (!fragment) {
|
|
146
|
+
// Look up the fragment, following aliasOf when archived (Q2 F1 lock).
|
|
147
|
+
const lookup = (name) => lookupFragmentForLocale(name, { site, locale, resolvedLocales });
|
|
148
|
+
const resolution = resolveFragmentArchiveAlias(fragmentName, lookup, `@${fragmentName}`);
|
|
149
|
+
if (!resolution) {
|
|
127
150
|
const available = [...site.fragments.keys()];
|
|
128
151
|
throw new Error(`Fragment "${fragmentName}" not found.\n` +
|
|
129
152
|
` Available fragments: ${available.length > 0 ? available.join(', ') : '(none)'}`);
|
|
130
153
|
}
|
|
154
|
+
const fragment = resolution.manifest;
|
|
131
155
|
const templatesDir = site.templatesDir;
|
|
132
156
|
const ctx = {
|
|
133
157
|
site,
|
|
134
158
|
templatesDir,
|
|
135
159
|
visited: new Set(),
|
|
136
|
-
path: ['', `@${
|
|
160
|
+
path: ['', `@${resolution.resolvedName}`],
|
|
137
161
|
locale,
|
|
138
162
|
theme,
|
|
139
163
|
resolvedLocales,
|
package/dist/resolver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Archive marker grammar + parser for static + dynamic targets per
|
|
3
|
+
* design-soft-delete.md Q10 lock.
|
|
4
|
+
*
|
|
5
|
+
* Static (and dynamic) targets emit HTML with the marker as the first
|
|
6
|
+
* line of the file:
|
|
7
|
+
*
|
|
8
|
+
* <!-- gazetta:archived alias=welcome -->
|
|
9
|
+
* <!-- gazetta:archived gone -->
|
|
10
|
+
*
|
|
11
|
+
* Worker reads the first ~200 bytes of `pages/{name}/index.html`,
|
|
12
|
+
* parses the marker, and decides:
|
|
13
|
+
*
|
|
14
|
+
* - alias=X → 301 redirect to deriveRoute(X)
|
|
15
|
+
* - gone → 410 Gone
|
|
16
|
+
* - no marker → serve the HTML as-is (live page)
|
|
17
|
+
*
|
|
18
|
+
* Constraints (locked):
|
|
19
|
+
* - Marker MUST be the first line (worker reads only the prefix)
|
|
20
|
+
* - Single-line; no nested HTML; no whitespace games
|
|
21
|
+
* - `<bare-name>` is a name (page or fragment), not a route — the
|
|
22
|
+
* worker calls `deriveRoute()` to resolve to a URL when needed
|
|
23
|
+
*
|
|
24
|
+
* SRP: this module is the marker grammar. Emit + parse round-trip.
|
|
25
|
+
* Publish-rendered.ts emits via `archiveMarker()`; workers parse via
|
|
26
|
+
* `parseArchiveMarker()`. Workers never emit; publish never parses.
|
|
27
|
+
*/
|
|
28
|
+
/** Result of parsing the marker — null when no marker is present. */
|
|
29
|
+
export type ArchiveMarker = {
|
|
30
|
+
kind: 'alias';
|
|
31
|
+
target: string;
|
|
32
|
+
} | {
|
|
33
|
+
kind: 'gone';
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Emit a marker line for a page/fragment that's archived. Returns the
|
|
37
|
+
* full marker line including trailing newline so callers concatenate
|
|
38
|
+
* it directly with the rendered HTML.
|
|
39
|
+
*
|
|
40
|
+
* For aliased archives: `archiveMarker({ kind: 'alias', target: 'welcome' })`
|
|
41
|
+
* For pure soft-delete: `archiveMarker({ kind: 'gone' })`
|
|
42
|
+
*
|
|
43
|
+
* Validates the alias target is non-empty and contains no whitespace
|
|
44
|
+
* (the regex grammar requires `\S+`); throws on bad input rather than
|
|
45
|
+
* silently emitting an unparseable marker.
|
|
46
|
+
*/
|
|
47
|
+
export declare function archiveMarker(marker: ArchiveMarker): string;
|
|
48
|
+
/**
|
|
49
|
+
* Parse an archive marker from the leading bytes of an HTML file.
|
|
50
|
+
*
|
|
51
|
+
* Accepts either a `Uint8Array` (worker reading bytes from storage)
|
|
52
|
+
* or a `string` (testing convenience).
|
|
53
|
+
*
|
|
54
|
+
* Returns the parsed marker, or null when no marker is present (the
|
|
55
|
+
* normal case — live pages don't carry markers).
|
|
56
|
+
*
|
|
57
|
+
* Reads only the first MARKER_PREFIX_BYTES bytes; longer input is
|
|
58
|
+
* truncated. The marker MUST be at byte 0; markers in the middle of
|
|
59
|
+
* a file are not detected (per the locked grammar — first-line only).
|
|
60
|
+
*/
|
|
61
|
+
export declare function parseArchiveMarker(input: Uint8Array | string): ArchiveMarker | null;
|
|
62
|
+
//# sourceMappingURL=archive-marker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive-marker.d.ts","sourceRoot":"","sources":["../../src/runtime/archive-marker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,qEAAqE;AACrE,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAQhF;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAU3D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,aAAa,GAAG,IAAI,CASnF"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Archive marker grammar + parser for static + dynamic targets per
|
|
3
|
+
* design-soft-delete.md Q10 lock.
|
|
4
|
+
*
|
|
5
|
+
* Static (and dynamic) targets emit HTML with the marker as the first
|
|
6
|
+
* line of the file:
|
|
7
|
+
*
|
|
8
|
+
* <!-- gazetta:archived alias=welcome -->
|
|
9
|
+
* <!-- gazetta:archived gone -->
|
|
10
|
+
*
|
|
11
|
+
* Worker reads the first ~200 bytes of `pages/{name}/index.html`,
|
|
12
|
+
* parses the marker, and decides:
|
|
13
|
+
*
|
|
14
|
+
* - alias=X → 301 redirect to deriveRoute(X)
|
|
15
|
+
* - gone → 410 Gone
|
|
16
|
+
* - no marker → serve the HTML as-is (live page)
|
|
17
|
+
*
|
|
18
|
+
* Constraints (locked):
|
|
19
|
+
* - Marker MUST be the first line (worker reads only the prefix)
|
|
20
|
+
* - Single-line; no nested HTML; no whitespace games
|
|
21
|
+
* - `<bare-name>` is a name (page or fragment), not a route — the
|
|
22
|
+
* worker calls `deriveRoute()` to resolve to a URL when needed
|
|
23
|
+
*
|
|
24
|
+
* SRP: this module is the marker grammar. Emit + parse round-trip.
|
|
25
|
+
* Publish-rendered.ts emits via `archiveMarker()`; workers parse via
|
|
26
|
+
* `parseArchiveMarker()`. Workers never emit; publish never parses.
|
|
27
|
+
*/
|
|
28
|
+
/** Number of leading bytes to inspect for a marker. */
|
|
29
|
+
const MARKER_PREFIX_BYTES = 200;
|
|
30
|
+
/** Regex anchors at start of input; closed-form grammar. */
|
|
31
|
+
const MARKER_RE = /^<!-- gazetta:archived (alias=([\S]+)|gone) -->/;
|
|
32
|
+
/**
|
|
33
|
+
* Emit a marker line for a page/fragment that's archived. Returns the
|
|
34
|
+
* full marker line including trailing newline so callers concatenate
|
|
35
|
+
* it directly with the rendered HTML.
|
|
36
|
+
*
|
|
37
|
+
* For aliased archives: `archiveMarker({ kind: 'alias', target: 'welcome' })`
|
|
38
|
+
* For pure soft-delete: `archiveMarker({ kind: 'gone' })`
|
|
39
|
+
*
|
|
40
|
+
* Validates the alias target is non-empty and contains no whitespace
|
|
41
|
+
* (the regex grammar requires `\S+`); throws on bad input rather than
|
|
42
|
+
* silently emitting an unparseable marker.
|
|
43
|
+
*/
|
|
44
|
+
export function archiveMarker(marker) {
|
|
45
|
+
if (marker.kind === 'alias') {
|
|
46
|
+
if (!marker.target || /\s/.test(marker.target)) {
|
|
47
|
+
throw new Error(`Invalid archive alias target ${JSON.stringify(marker.target)} — must be a non-empty string with no whitespace.`);
|
|
48
|
+
}
|
|
49
|
+
return `<!-- gazetta:archived alias=${marker.target} -->\n`;
|
|
50
|
+
}
|
|
51
|
+
return '<!-- gazetta:archived gone -->\n';
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Parse an archive marker from the leading bytes of an HTML file.
|
|
55
|
+
*
|
|
56
|
+
* Accepts either a `Uint8Array` (worker reading bytes from storage)
|
|
57
|
+
* or a `string` (testing convenience).
|
|
58
|
+
*
|
|
59
|
+
* Returns the parsed marker, or null when no marker is present (the
|
|
60
|
+
* normal case — live pages don't carry markers).
|
|
61
|
+
*
|
|
62
|
+
* Reads only the first MARKER_PREFIX_BYTES bytes; longer input is
|
|
63
|
+
* truncated. The marker MUST be at byte 0; markers in the middle of
|
|
64
|
+
* a file are not detected (per the locked grammar — first-line only).
|
|
65
|
+
*/
|
|
66
|
+
export function parseArchiveMarker(input) {
|
|
67
|
+
const prefix = typeof input === 'string' ? input.slice(0, MARKER_PREFIX_BYTES) : decodePrefix(input);
|
|
68
|
+
const match = MARKER_RE.exec(prefix);
|
|
69
|
+
if (!match)
|
|
70
|
+
return null;
|
|
71
|
+
if (match[1] === 'gone')
|
|
72
|
+
return { kind: 'gone' };
|
|
73
|
+
// match[1] starts with 'alias=', match[2] is the bare target name
|
|
74
|
+
const target = match[2];
|
|
75
|
+
if (!target)
|
|
76
|
+
return null;
|
|
77
|
+
return { kind: 'alias', target };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Decode the first MARKER_PREFIX_BYTES bytes as UTF-8. Bounded read;
|
|
81
|
+
* the worker may pass a longer Uint8Array, we slice. Returns the
|
|
82
|
+
* decoded string (or as much of it as fits in the prefix budget).
|
|
83
|
+
*/
|
|
84
|
+
function decodePrefix(bytes) {
|
|
85
|
+
const slice = bytes.byteLength > MARKER_PREFIX_BYTES ? bytes.subarray(0, MARKER_PREFIX_BYTES) : bytes;
|
|
86
|
+
return new TextDecoder('utf-8', { fatal: false }).decode(slice);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=archive-marker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive-marker.js","sourceRoot":"","sources":["../../src/runtime/archive-marker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAKH,uDAAuD;AACvD,MAAM,mBAAmB,GAAG,GAAG,CAAA;AAE/B,4DAA4D;AAC5D,MAAM,SAAS,GAAG,iDAAiD,CAAA;AAEnE;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAAC,MAAqB;IACjD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CACb,gCAAgC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,mDAAmD,CACjH,CAAA;QACH,CAAC;QACD,OAAO,+BAA+B,MAAM,CAAC,MAAM,QAAQ,CAAA;IAC7D,CAAC;IACD,OAAO,kCAAkC,CAAA;AAC3C,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAA0B;IAC3D,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;IACpG,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACpC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACvB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IAChD,kEAAkE;IAClE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACvB,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;AAClC,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,KAAiB;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,GAAG,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACrG,OAAO,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACjE,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boot-time capability-gap inspection — surface #1 of the four-point
|
|
3
|
+
* capability-gap UX pattern.
|
|
4
|
+
*
|
|
5
|
+
* Per `design-soft-delete.md` Q10 lock + `feature-design-process.md`
|
|
6
|
+
* non-foundational discipline: at admin boot, walk every configured
|
|
7
|
+
* target and warn about runtime capability gaps. Non-blocking — admin
|
|
8
|
+
* starts. The warning gives operators an early signal during deploy
|
|
9
|
+
* so misconfiguration surfaces before content authors hit the gap at
|
|
10
|
+
* publish time.
|
|
11
|
+
*
|
|
12
|
+
* Pairs with:
|
|
13
|
+
* - Surface #2 (author modal): consumes `/api/targets` extended
|
|
14
|
+
* payload with capability info (Cut 10 wires the UI)
|
|
15
|
+
* - Surface #3 (validator scanner): `archive-not-supported-on-target`
|
|
16
|
+
* P4 validator from Cut 8 reports per-archived-item gaps
|
|
17
|
+
* - Surface #4 (pre-publish gate): `/api/publish/audit` includes
|
|
18
|
+
* per-target capability info when archived items are in scope
|
|
19
|
+
*
|
|
20
|
+
* # SOLID
|
|
21
|
+
*
|
|
22
|
+
* - SRP: this module owns ONE concern — emit warnings at boot.
|
|
23
|
+
* Doesn't inspect targets itself (delegates to runtime-capabilities);
|
|
24
|
+
* doesn't render the warnings (consumes the existing console.warn
|
|
25
|
+
* pattern).
|
|
26
|
+
* - DIP: depends on the `inspectTarget` predicate, not on target-config
|
|
27
|
+
* parsing details.
|
|
28
|
+
*/
|
|
29
|
+
import type { SiteManifest } from '../types.js';
|
|
30
|
+
/**
|
|
31
|
+
* Walk the site's targets at boot; emit a warning per target that
|
|
32
|
+
* has any capability gap. Logs are operator-facing — once
|
|
33
|
+
* `design-logging.md`'s structured logger ships, replace `console.warn`
|
|
34
|
+
* with `log.warn({ module: 'admin-api.capability-gap', ... })`.
|
|
35
|
+
*
|
|
36
|
+
* Idempotent: calling twice produces the same warnings. The caller
|
|
37
|
+
* (admin-api boot path) calls once.
|
|
38
|
+
*
|
|
39
|
+
* @returns the count of targets with gaps — useful for tests.
|
|
40
|
+
*/
|
|
41
|
+
export declare function warnOnCapabilityGaps(manifest: SiteManifest): number;
|
|
42
|
+
//# sourceMappingURL=capability-gap-warnings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-gap-warnings.d.ts","sourceRoot":"","sources":["../../src/runtime/capability-gap-warnings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,aAAa,CAAA;AAG7D;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAenE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { inspectTarget } from './runtime-capabilities.js';
|
|
2
|
+
/**
|
|
3
|
+
* Walk the site's targets at boot; emit a warning per target that
|
|
4
|
+
* has any capability gap. Logs are operator-facing — once
|
|
5
|
+
* `design-logging.md`'s structured logger ships, replace `console.warn`
|
|
6
|
+
* with `log.warn({ module: 'admin-api.capability-gap', ... })`.
|
|
7
|
+
*
|
|
8
|
+
* Idempotent: calling twice produces the same warnings. The caller
|
|
9
|
+
* (admin-api boot path) calls once.
|
|
10
|
+
*
|
|
11
|
+
* @returns the count of targets with gaps — useful for tests.
|
|
12
|
+
*/
|
|
13
|
+
export function warnOnCapabilityGaps(manifest) {
|
|
14
|
+
const targets = (manifest.targets ?? {});
|
|
15
|
+
let count = 0;
|
|
16
|
+
for (const [name, target] of Object.entries(targets)) {
|
|
17
|
+
const inspection = inspectTarget(target);
|
|
18
|
+
if (inspection.gaps.length === 0)
|
|
19
|
+
continue;
|
|
20
|
+
count++;
|
|
21
|
+
const reasons = inspection.gaps.map(g => `${g.capability}: ${g.reason}`).join('; ');
|
|
22
|
+
console.warn(` Warning: target "${name}" has runtime capability gaps. ${reasons}. ` +
|
|
23
|
+
'Archive operations on this target may not emit 301/410 redirects. ' +
|
|
24
|
+
'See https://gazetta.studio/docs/runtime-capabilities for resolution paths.');
|
|
25
|
+
}
|
|
26
|
+
return count;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=capability-gap-warnings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-gap-warnings.js","sourceRoot":"","sources":["../../src/runtime/capability-gap-warnings.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAEzD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAsB;IACzD,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAiC,CAAA;IACxE,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;QACxC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAQ;QAC1C,KAAK,EAAE,CAAA;QACP,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnF,OAAO,CAAC,IAAI,CACV,sBAAsB,IAAI,kCAAkC,OAAO,IAAI;YACrE,oEAAoE;YACpE,4EAA4E,CAC/E,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-format redirect manifest emit per design-soft-delete.md Q10.
|
|
3
|
+
*
|
|
4
|
+
* Plain-static targets (no worker) can't read the per-page HTML
|
|
5
|
+
* marker. They get a `_redirects` (or equivalent) file at the target
|
|
6
|
+
* root that the host runtime reads. Cloudflare Pages and Netlify
|
|
7
|
+
* both honor this convention; their syntax is identical for the
|
|
8
|
+
* patterns we emit.
|
|
9
|
+
*
|
|
10
|
+
* Worker-served target types DON'T need this — the worker reads the
|
|
11
|
+
* HTML marker directly per request.
|
|
12
|
+
*
|
|
13
|
+
* Pure functions: takes the archive summary list, returns the file
|
|
14
|
+
* content as a string. Caller (publish.ts) writes to storage.
|
|
15
|
+
*
|
|
16
|
+
* SRP: this module owns the wire format. Walking the source for
|
|
17
|
+
* archived pages is the caller's job. Adding a new host format
|
|
18
|
+
* (e.g., a future Vercel-specific dialect) extends the file with a
|
|
19
|
+
* new emit function and the type union — existing emitters
|
|
20
|
+
* untouched.
|
|
21
|
+
*/
|
|
22
|
+
import type { RedirectsFormat } from '../types.js';
|
|
23
|
+
/**
|
|
24
|
+
* Summary of one archived page contributing to the redirects file.
|
|
25
|
+
*
|
|
26
|
+
* `from`: source route (e.g. `/landing`). Includes leading slash;
|
|
27
|
+
* empty path is the homepage `/`.
|
|
28
|
+
* `to`: alias target route — only present when the archive has
|
|
29
|
+
* `aliasOf` set. When absent, this entry is a 410 Gone.
|
|
30
|
+
*/
|
|
31
|
+
export interface ArchiveSummary {
|
|
32
|
+
from: string;
|
|
33
|
+
to?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Emit the `_redirects` file body. Cloudflare and Netlify share the
|
|
37
|
+
* same syntax for the patterns we emit:
|
|
38
|
+
*
|
|
39
|
+
* /from /to 301 — permanent alias redirect
|
|
40
|
+
* /from / 410 — soft-delete (gone)
|
|
41
|
+
*
|
|
42
|
+
* Cloudflare and Netlify both default to 301 when status is omitted,
|
|
43
|
+
* but we emit it explicitly for forensic clarity. The `410` row uses
|
|
44
|
+
* `/` as the destination because both hosts require a destination
|
|
45
|
+
* column even for status-only rules; both will apply the status
|
|
46
|
+
* regardless of where the destination points.
|
|
47
|
+
*
|
|
48
|
+
* Sorted by `from` so the output is deterministic across publishes.
|
|
49
|
+
* Determinism matters because the file is content-addressed
|
|
50
|
+
* downstream (host's CDN may cache it; same input = same output =
|
|
51
|
+
* cache hit on republish without changes).
|
|
52
|
+
*/
|
|
53
|
+
export declare function emitCloudflareRedirects(archives: ReadonlyArray<ArchiveSummary>): string;
|
|
54
|
+
/**
|
|
55
|
+
* Netlify uses the same `_redirects` grammar as Cloudflare for the
|
|
56
|
+
* patterns we emit. Kept as a separate function so that future
|
|
57
|
+
* Netlify-specific extensions (e.g., country-aware redirects via
|
|
58
|
+
* `Country` headers) land here without forking Cloudflare.
|
|
59
|
+
*/
|
|
60
|
+
export declare function emitNetlifyRedirects(archives: ReadonlyArray<ArchiveSummary>): string;
|
|
61
|
+
/**
|
|
62
|
+
* Structured JSON for custom host integrations. Operators with
|
|
63
|
+
* non-Cloudflare/Netlify hosting wire their own glue (Caddy
|
|
64
|
+
* `redir` directives, nginx rules, AWS CloudFront functions,
|
|
65
|
+
* etc.) and consume this file at deploy time.
|
|
66
|
+
*
|
|
67
|
+
* Shape:
|
|
68
|
+
* {
|
|
69
|
+
* redirects: [{ from, to, status: 301 }, ...],
|
|
70
|
+
* gone: [{ path, status: 410 }, ...]
|
|
71
|
+
* }
|
|
72
|
+
*
|
|
73
|
+
* Same sort order as Cloudflare/Netlify emit (alphabetical by
|
|
74
|
+
* source path) so output is deterministic.
|
|
75
|
+
*/
|
|
76
|
+
export declare function emitJsonRedirects(archives: ReadonlyArray<ArchiveSummary>): string;
|
|
77
|
+
/**
|
|
78
|
+
* The destination filename per format. Cloudflare and Netlify both
|
|
79
|
+
* use `_redirects` at the site root; the JSON form lives at
|
|
80
|
+
* `redirects.json`.
|
|
81
|
+
*/
|
|
82
|
+
export declare function redirectsFilename(format: Exclude<RedirectsFormat, 'none'>): string;
|
|
83
|
+
/**
|
|
84
|
+
* Emit the file body for the given format. Returns null when the
|
|
85
|
+
* format is `'none'` — callers skip writing entirely. Returns empty
|
|
86
|
+
* string when there are no archives — caller decides whether to
|
|
87
|
+
* write an empty file or skip.
|
|
88
|
+
*/
|
|
89
|
+
export declare function emitRedirects(format: RedirectsFormat, archives: ReadonlyArray<ArchiveSummary>): {
|
|
90
|
+
filename: string;
|
|
91
|
+
body: string;
|
|
92
|
+
} | null;
|
|
93
|
+
//# sourceMappingURL=redirects-emit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redirects-emit.d.ts","sourceRoot":"","sources":["../../src/runtime/redirects-emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,GAAG,MAAM,CAKvF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,GAAG,MAAM,CAEpF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,GAAG,MAAM,CAKjF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,MAAM,CAQlF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,GACtC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAW3C"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Emit the `_redirects` file body. Cloudflare and Netlify share the
|
|
3
|
+
* same syntax for the patterns we emit:
|
|
4
|
+
*
|
|
5
|
+
* /from /to 301 — permanent alias redirect
|
|
6
|
+
* /from / 410 — soft-delete (gone)
|
|
7
|
+
*
|
|
8
|
+
* Cloudflare and Netlify both default to 301 when status is omitted,
|
|
9
|
+
* but we emit it explicitly for forensic clarity. The `410` row uses
|
|
10
|
+
* `/` as the destination because both hosts require a destination
|
|
11
|
+
* column even for status-only rules; both will apply the status
|
|
12
|
+
* regardless of where the destination points.
|
|
13
|
+
*
|
|
14
|
+
* Sorted by `from` so the output is deterministic across publishes.
|
|
15
|
+
* Determinism matters because the file is content-addressed
|
|
16
|
+
* downstream (host's CDN may cache it; same input = same output =
|
|
17
|
+
* cache hit on republish without changes).
|
|
18
|
+
*/
|
|
19
|
+
export function emitCloudflareRedirects(archives) {
|
|
20
|
+
if (archives.length === 0)
|
|
21
|
+
return '';
|
|
22
|
+
const sorted = [...archives].sort((a, b) => a.from.localeCompare(b.from));
|
|
23
|
+
const lines = sorted.map(a => (a.to ? `${a.from} ${a.to} 301` : `${a.from} / 410`));
|
|
24
|
+
return lines.join('\n') + '\n';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Netlify uses the same `_redirects` grammar as Cloudflare for the
|
|
28
|
+
* patterns we emit. Kept as a separate function so that future
|
|
29
|
+
* Netlify-specific extensions (e.g., country-aware redirects via
|
|
30
|
+
* `Country` headers) land here without forking Cloudflare.
|
|
31
|
+
*/
|
|
32
|
+
export function emitNetlifyRedirects(archives) {
|
|
33
|
+
return emitCloudflareRedirects(archives);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Structured JSON for custom host integrations. Operators with
|
|
37
|
+
* non-Cloudflare/Netlify hosting wire their own glue (Caddy
|
|
38
|
+
* `redir` directives, nginx rules, AWS CloudFront functions,
|
|
39
|
+
* etc.) and consume this file at deploy time.
|
|
40
|
+
*
|
|
41
|
+
* Shape:
|
|
42
|
+
* {
|
|
43
|
+
* redirects: [{ from, to, status: 301 }, ...],
|
|
44
|
+
* gone: [{ path, status: 410 }, ...]
|
|
45
|
+
* }
|
|
46
|
+
*
|
|
47
|
+
* Same sort order as Cloudflare/Netlify emit (alphabetical by
|
|
48
|
+
* source path) so output is deterministic.
|
|
49
|
+
*/
|
|
50
|
+
export function emitJsonRedirects(archives) {
|
|
51
|
+
const sorted = [...archives].sort((a, b) => a.from.localeCompare(b.from));
|
|
52
|
+
const redirects = sorted.filter(a => a.to !== undefined).map(a => ({ from: a.from, to: a.to, status: 301 }));
|
|
53
|
+
const gone = sorted.filter(a => a.to === undefined).map(a => ({ path: a.from, status: 410 }));
|
|
54
|
+
return JSON.stringify({ redirects, gone }, null, 2) + '\n';
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The destination filename per format. Cloudflare and Netlify both
|
|
58
|
+
* use `_redirects` at the site root; the JSON form lives at
|
|
59
|
+
* `redirects.json`.
|
|
60
|
+
*/
|
|
61
|
+
export function redirectsFilename(format) {
|
|
62
|
+
switch (format) {
|
|
63
|
+
case 'cloudflare':
|
|
64
|
+
case 'netlify':
|
|
65
|
+
return '_redirects';
|
|
66
|
+
case 'json':
|
|
67
|
+
return 'redirects.json';
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Emit the file body for the given format. Returns null when the
|
|
72
|
+
* format is `'none'` — callers skip writing entirely. Returns empty
|
|
73
|
+
* string when there are no archives — caller decides whether to
|
|
74
|
+
* write an empty file or skip.
|
|
75
|
+
*/
|
|
76
|
+
export function emitRedirects(format, archives) {
|
|
77
|
+
if (format === 'none')
|
|
78
|
+
return null;
|
|
79
|
+
const filename = redirectsFilename(format);
|
|
80
|
+
switch (format) {
|
|
81
|
+
case 'cloudflare':
|
|
82
|
+
return { filename, body: emitCloudflareRedirects(archives) };
|
|
83
|
+
case 'netlify':
|
|
84
|
+
return { filename, body: emitNetlifyRedirects(archives) };
|
|
85
|
+
case 'json':
|
|
86
|
+
return { filename, body: emitJsonRedirects(archives) };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=redirects-emit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redirects-emit.js","sourceRoot":"","sources":["../../src/runtime/redirects-emit.ts"],"names":[],"mappings":"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"}
|