gazetta 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/error-response.d.ts +21 -0
- package/dist/admin-api/error-response.d.ts.map +1 -0
- package/dist/admin-api/error-response.js +12 -0
- package/dist/admin-api/error-response.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 -2
- package/dist/admin-api/index.d.ts.map +1 -1
- package/dist/admin-api/index.js +257 -32
- 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 +21 -0
- package/dist/admin-api/routes/assets.d.ts.map +1 -0
- package/dist/admin-api/routes/assets.js +586 -0
- package/dist/admin-api/routes/assets.js.map +1 -0
- 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 +128 -67
- 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 +158 -85
- 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 +548 -99
- 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 +64 -0
- package/dist/admin-api/schemas/assets.d.ts.map +1 -0
- package/dist/admin-api/schemas/assets.js +59 -0
- package/dist/admin-api/schemas/assets.js.map +1 -0
- 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 +10 -0
- package/dist/admin-api/schemas/index.d.ts.map +1 -1
- package/dist/admin-api/schemas/index.js +10 -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 -17
- package/dist/admin-api/source-context.d.ts.map +1 -1
- package/dist/admin-api/source-context.js +43 -8
- 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/analyze-audio.d.ts +3 -0
- package/dist/assets/analyze-audio.d.ts.map +1 -0
- package/dist/assets/analyze-audio.js +80 -0
- package/dist/assets/analyze-audio.js.map +1 -0
- package/dist/assets/analyze-image.d.ts +19 -0
- package/dist/assets/analyze-image.d.ts.map +1 -0
- package/dist/assets/analyze-image.js +123 -0
- package/dist/assets/analyze-image.js.map +1 -0
- package/dist/assets/analyze.d.ts +94 -0
- package/dist/assets/analyze.d.ts.map +1 -0
- package/dist/assets/analyze.js +45 -0
- package/dist/assets/analyze.js.map +1 -0
- package/dist/assets/asset-deps.d.ts +30 -0
- package/dist/assets/asset-deps.d.ts.map +1 -0
- package/dist/assets/asset-deps.js +42 -0
- package/dist/assets/asset-deps.js.map +1 -0
- package/dist/assets/asset-paths.d.ts +155 -0
- package/dist/assets/asset-paths.d.ts.map +1 -0
- package/dist/assets/asset-paths.js +197 -0
- package/dist/assets/asset-paths.js.map +1 -0
- package/dist/assets/delete.d.ts +75 -0
- package/dist/assets/delete.d.ts.map +1 -0
- package/dist/assets/delete.js +82 -0
- package/dist/assets/delete.js.map +1 -0
- package/dist/assets/errors.d.ts +241 -0
- package/dist/assets/errors.d.ts.map +1 -0
- package/dist/assets/errors.js +300 -0
- package/dist/assets/errors.js.map +1 -0
- package/dist/assets/find-refs.d.ts +37 -0
- package/dist/assets/find-refs.d.ts.map +1 -0
- package/dist/assets/find-refs.js +35 -0
- package/dist/assets/find-refs.js.map +1 -0
- package/dist/assets/hash.d.ts +13 -0
- package/dist/assets/hash.d.ts.map +1 -0
- package/dist/assets/hash.js +43 -0
- package/dist/assets/hash.js.map +1 -0
- package/dist/assets/image-metadata.d.ts +11 -0
- package/dist/assets/image-metadata.d.ts.map +1 -0
- package/dist/assets/image-metadata.js +31 -0
- package/dist/assets/image-metadata.js.map +1 -0
- package/dist/assets/ingest-locale.d.ts +86 -0
- package/dist/assets/ingest-locale.d.ts.map +1 -0
- package/dist/assets/ingest-locale.js +209 -0
- package/dist/assets/ingest-locale.js.map +1 -0
- package/dist/assets/ingest.d.ts +96 -0
- package/dist/assets/ingest.d.ts.map +1 -0
- package/dist/assets/ingest.js +308 -0
- package/dist/assets/ingest.js.map +1 -0
- package/dist/assets/kind-compat.d.ts +34 -0
- package/dist/assets/kind-compat.d.ts.map +1 -0
- package/dist/assets/kind-compat.js +33 -0
- package/dist/assets/kind-compat.js.map +1 -0
- package/dist/assets/list.d.ts +46 -0
- package/dist/assets/list.d.ts.map +1 -0
- package/dist/assets/list.js +102 -0
- package/dist/assets/list.js.map +1 -0
- package/dist/assets/manifest-default.d.ts +56 -0
- package/dist/assets/manifest-default.d.ts.map +1 -0
- package/dist/assets/manifest-default.js +120 -0
- package/dist/assets/manifest-default.js.map +1 -0
- package/dist/assets/manifest-filename.d.ts +52 -0
- package/dist/assets/manifest-filename.d.ts.map +1 -0
- package/dist/assets/manifest-filename.js +104 -0
- package/dist/assets/manifest-filename.js.map +1 -0
- package/dist/assets/manifest-locale.d.ts +60 -0
- package/dist/assets/manifest-locale.d.ts.map +1 -0
- package/dist/assets/manifest-locale.js +206 -0
- package/dist/assets/manifest-locale.js.map +1 -0
- package/dist/assets/manifest-merge.d.ts +66 -0
- package/dist/assets/manifest-merge.d.ts.map +1 -0
- package/dist/assets/manifest-merge.js +82 -0
- package/dist/assets/manifest-merge.js.map +1 -0
- package/dist/assets/manifest.d.ts +83 -0
- package/dist/assets/manifest.d.ts.map +1 -0
- package/dist/assets/manifest.js +93 -0
- package/dist/assets/manifest.js.map +1 -0
- package/dist/assets/mime-sniff.d.ts +18 -0
- package/dist/assets/mime-sniff.d.ts.map +1 -0
- package/dist/assets/mime-sniff.js +84 -0
- package/dist/assets/mime-sniff.js.map +1 -0
- package/dist/assets/preprocess-svg.d.ts +3 -0
- package/dist/assets/preprocess-svg.d.ts.map +1 -0
- package/dist/assets/preprocess-svg.js +49 -0
- package/dist/assets/preprocess-svg.js.map +1 -0
- package/dist/assets/preprocess.d.ts +62 -0
- package/dist/assets/preprocess.d.ts.map +1 -0
- package/dist/assets/preprocess.js +86 -0
- package/dist/assets/preprocess.js.map +1 -0
- package/dist/assets/publish-plan.d.ts +41 -0
- package/dist/assets/publish-plan.d.ts.map +1 -0
- package/dist/assets/publish-plan.js +49 -0
- package/dist/assets/publish-plan.js.map +1 -0
- package/dist/assets/publish.d.ts +33 -0
- package/dist/assets/publish.d.ts.map +1 -0
- package/dist/assets/publish.js +81 -0
- package/dist/assets/publish.js.map +1 -0
- package/dist/assets/refs.d.ts +37 -0
- package/dist/assets/refs.d.ts.map +1 -0
- package/dist/assets/refs.js +33 -0
- package/dist/assets/refs.js.map +1 -0
- package/dist/assets/remove-override.d.ts +42 -0
- package/dist/assets/remove-override.d.ts.map +1 -0
- package/dist/assets/remove-override.js +53 -0
- package/dist/assets/remove-override.js.map +1 -0
- package/dist/assets/rename.d.ts +43 -0
- package/dist/assets/rename.d.ts.map +1 -0
- package/dist/assets/rename.js +271 -0
- package/dist/assets/rename.js.map +1 -0
- package/dist/assets/replace.d.ts +37 -0
- package/dist/assets/replace.d.ts.map +1 -0
- package/dist/assets/replace.js +195 -0
- package/dist/assets/replace.js.map +1 -0
- package/dist/assets/resolve.d.ts +141 -0
- package/dist/assets/resolve.d.ts.map +1 -0
- package/dist/assets/resolve.js +381 -0
- package/dist/assets/resolve.js.map +1 -0
- package/dist/assets/rewrite-manifest-asset-ref.d.ts +44 -0
- package/dist/assets/rewrite-manifest-asset-ref.d.ts.map +1 -0
- package/dist/assets/rewrite-manifest-asset-ref.js +51 -0
- package/dist/assets/rewrite-manifest-asset-ref.js.map +1 -0
- package/dist/assets/scan-manifest-for-asset.d.ts +63 -0
- package/dist/assets/scan-manifest-for-asset.d.ts.map +1 -0
- package/dist/assets/scan-manifest-for-asset.js +105 -0
- package/dist/assets/scan-manifest-for-asset.js.map +1 -0
- package/dist/assets/serve-route.d.ts +45 -0
- package/dist/assets/serve-route.d.ts.map +1 -0
- package/dist/assets/serve-route.js +123 -0
- package/dist/assets/serve-route.js.map +1 -0
- package/dist/assets/svg-sanitize.d.ts +38 -0
- package/dist/assets/svg-sanitize.d.ts.map +1 -0
- package/dist/assets/svg-sanitize.js +209 -0
- package/dist/assets/svg-sanitize.js.map +1 -0
- package/dist/assets/update-metadata.d.ts +61 -0
- package/dist/assets/update-metadata.d.ts.map +1 -0
- package/dist/assets/update-metadata.js +82 -0
- package/dist/assets/update-metadata.js.map +1 -0
- package/dist/assets/url.d.ts +82 -0
- package/dist/assets/url.d.ts.map +1 -0
- package/dist/assets/url.js +103 -0
- package/dist/assets/url.js.map +1 -0
- package/dist/assets/validate.d.ts +74 -0
- package/dist/assets/validate.d.ts.map +1 -0
- package/dist/assets/validate.js +136 -0
- package/dist/assets/validate.js.map +1 -0
- package/dist/assets/variants.d.ts +23 -0
- package/dist/assets/variants.d.ts.map +1 -0
- package/dist/assets/variants.js +74 -0
- package/dist/assets/variants.js.map +1 -0
- 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/assets-cli.d.ts +58 -0
- package/dist/cli/assets-cli.d.ts.map +1 -0
- package/dist/cli/assets-cli.js +233 -0
- package/dist/cli/assets-cli.js.map +1 -0
- package/dist/cli/assets-display.d.ts +112 -0
- package/dist/cli/assets-display.d.ts.map +1 -0
- package/dist/cli/assets-display.js +106 -0
- package/dist/cli/assets-display.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +15 -10
- package/dist/cli/bootstrap.d.ts.map +1 -1
- package/dist/cli/bootstrap.js +59 -24
- 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 +737 -374
- 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 +40 -35
- 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/dep-sidecars.d.ts +127 -0
- package/dist/dep-sidecars.d.ts.map +1 -0
- package/dist/dep-sidecars.js +122 -0
- package/dist/dep-sidecars.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/editor/AssetEmbeddedWidget.d.ts +3 -0
- package/dist/editor/AssetEmbeddedWidget.d.ts.map +1 -0
- package/dist/editor/AssetEmbeddedWidget.js +146 -0
- package/dist/editor/AssetEmbeddedWidget.js.map +1 -0
- package/dist/editor/mount.d.ts +12 -1
- package/dist/editor/mount.d.ts.map +1 -1
- package/dist/editor/mount.js +36 -5
- package/dist/editor/mount.js.map +1 -1
- package/dist/format.d.ts +44 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +65 -0
- package/dist/format.js.map +1 -0
- package/dist/fragment-deps.d.ts +24 -0
- package/dist/fragment-deps.d.ts.map +1 -0
- package/dist/fragment-deps.js +20 -0
- package/dist/fragment-deps.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/hash.d.ts +0 -6
- package/dist/hash.d.ts.map +1 -1
- package/dist/hash.js +0 -18
- package/dist/hash.js.map +1 -1
- package/dist/history-provider.d.ts.map +1 -1
- package/dist/history-provider.js +30 -8
- package/dist/history-provider.js.map +1 -1
- package/dist/history-recorder.d.ts +10 -6
- package/dist/history-recorder.d.ts.map +1 -1
- package/dist/history-recorder.js +13 -5
- package/dist/history-recorder.js.map +1 -1
- package/dist/history-restorer.d.ts.map +1 -1
- package/dist/history-restorer.js +34 -2
- package/dist/history-restorer.js.map +1 -1
- package/dist/history.d.ts +26 -8
- package/dist/history.d.ts.map +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 +27 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +50 -7
- package/dist/index.js.map +1 -1
- package/dist/locale.d.ts +25 -1
- package/dist/locale.d.ts.map +1 -1
- package/dist/locale.js +44 -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/_atomic-write.d.ts +9 -0
- package/dist/providers/_atomic-write.d.ts.map +1 -0
- package/dist/providers/_atomic-write.js +72 -0
- package/dist/providers/_atomic-write.js.map +1 -0
- package/dist/providers/_rm-ignore-missing.d.ts +31 -0
- package/dist/providers/_rm-ignore-missing.d.ts.map +1 -0
- package/dist/providers/_rm-ignore-missing.js +12 -0
- package/dist/providers/_rm-ignore-missing.js.map +1 -0
- package/dist/providers/_stream-interop.d.ts +23 -0
- package/dist/providers/_stream-interop.d.ts.map +1 -0
- package/dist/providers/_stream-interop.js +21 -0
- package/dist/providers/_stream-interop.js.map +1 -0
- package/dist/providers/azure-blob.d.ts.map +1 -1
- package/dist/providers/azure-blob.js +60 -0
- package/dist/providers/azure-blob.js.map +1 -1
- 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/providers/filesystem.d.ts +4 -0
- package/dist/providers/filesystem.d.ts.map +1 -1
- package/dist/providers/filesystem.js +63 -2
- package/dist/providers/filesystem.js.map +1 -1
- package/dist/providers/s3.d.ts.map +1 -1
- package/dist/providers/s3.js +84 -1
- package/dist/providers/s3.js.map +1 -1
- 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 +37 -17
- package/dist/publish-rendered.d.ts.map +1 -1
- package/dist/publish-rendered.js +144 -71
- 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 +13 -12
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +24 -57
- 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 +12 -2
- package/dist/resolver.d.ts.map +1 -1
- package/dist/resolver.js +101 -32
- 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/schema/dimensions.d.ts +78 -0
- package/dist/schema/dimensions.d.ts.map +1 -0
- package/dist/schema/dimensions.js +97 -0
- package/dist/schema/dimensions.js.map +1 -0
- package/dist/schema/helpers.d.ts +108 -0
- package/dist/schema/helpers.d.ts.map +1 -0
- package/dist/schema/helpers.js +133 -0
- package/dist/schema/helpers.js.map +1 -0
- package/dist/schema/index.d.ts +27 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +25 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/types.d.ts +390 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +25 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/selector-chain.d.ts +63 -0
- package/dist/selector-chain.d.ts.map +1 -0
- package/dist/selector-chain.js +58 -0
- package/dist/selector-chain.js.map +1 -0
- package/dist/sidecars.d.ts +19 -18
- package/dist/sidecars.d.ts.map +1 -1
- package/dist/sidecars.js +70 -62
- package/dist/sidecars.js.map +1 -1
- 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 -117
- 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/themes.d.ts +69 -0
- package/dist/themes.d.ts.map +1 -0
- package/dist/themes.js +85 -0
- package/dist/themes.js.map +1 -0
- package/dist/transforms/adapter.d.ts +115 -0
- package/dist/transforms/adapter.d.ts.map +1 -0
- package/dist/transforms/adapter.js +2 -0
- package/dist/transforms/adapter.js.map +1 -0
- package/dist/transforms/cloudflare.d.ts +17 -0
- package/dist/transforms/cloudflare.d.ts.map +1 -0
- package/dist/transforms/cloudflare.js +110 -0
- package/dist/transforms/cloudflare.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 +17 -0
- package/dist/transforms/index.d.ts.map +1 -0
- package/dist/transforms/index.js +6 -0
- package/dist/transforms/index.js.map +1 -0
- package/dist/transforms/sharp.d.ts +17 -0
- package/dist/transforms/sharp.d.ts.map +1 -0
- package/dist/transforms/sharp.js +57 -0
- package/dist/transforms/sharp.js.map +1 -0
- package/dist/types.d.ts +485 -34
- 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 +69 -27
- package/admin-dist/assets/index-B6pVot0Y.css +0 -1
- package/admin-dist/assets/index-DniLwxJA.js +0 -609
- 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/providers/r2.d.ts +0 -8
- package/dist/providers/r2.d.ts.map +0 -1
- package/dist/providers/r2.js +0 -86
- package/dist/providers/r2.js.map +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/source-sidecars.d.ts +0 -32
- package/dist/source-sidecars.d.ts.map +0 -1
- package/dist/source-sidecars.js +0 -98
- package/dist/source-sidecars.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-gap-warnings.d.ts","sourceRoot":"","sources":["../../src/runtime/capability-gap-warnings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,aAAa,CAAA;AAG7D;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAenE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { inspectTarget } from './runtime-capabilities.js';
|
|
2
|
+
/**
|
|
3
|
+
* Walk the site's targets at boot; emit a warning per target that
|
|
4
|
+
* has any capability gap. Logs are operator-facing — once
|
|
5
|
+
* `design-logging.md`'s structured logger ships, replace `console.warn`
|
|
6
|
+
* with `log.warn({ module: 'admin-api.capability-gap', ... })`.
|
|
7
|
+
*
|
|
8
|
+
* Idempotent: calling twice produces the same warnings. The caller
|
|
9
|
+
* (admin-api boot path) calls once.
|
|
10
|
+
*
|
|
11
|
+
* @returns the count of targets with gaps — useful for tests.
|
|
12
|
+
*/
|
|
13
|
+
export function warnOnCapabilityGaps(manifest) {
|
|
14
|
+
const targets = (manifest.targets ?? {});
|
|
15
|
+
let count = 0;
|
|
16
|
+
for (const [name, target] of Object.entries(targets)) {
|
|
17
|
+
const inspection = inspectTarget(target);
|
|
18
|
+
if (inspection.gaps.length === 0)
|
|
19
|
+
continue;
|
|
20
|
+
count++;
|
|
21
|
+
const reasons = inspection.gaps.map(g => `${g.capability}: ${g.reason}`).join('; ');
|
|
22
|
+
console.warn(` Warning: target "${name}" has runtime capability gaps. ${reasons}. ` +
|
|
23
|
+
'Archive operations on this target may not emit 301/410 redirects. ' +
|
|
24
|
+
'See https://gazetta.studio/docs/runtime-capabilities for resolution paths.');
|
|
25
|
+
}
|
|
26
|
+
return count;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=capability-gap-warnings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-gap-warnings.js","sourceRoot":"","sources":["../../src/runtime/capability-gap-warnings.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAEzD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAsB;IACzD,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAiC,CAAA;IACxE,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;QACxC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAQ;QAC1C,KAAK,EAAE,CAAA;QACP,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnF,OAAO,CAAC,IAAI,CACV,sBAAsB,IAAI,kCAAkC,OAAO,IAAI;YACrE,oEAAoE;YACpE,4EAA4E,CAC/E,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-format redirect manifest emit per design-soft-delete.md Q10.
|
|
3
|
+
*
|
|
4
|
+
* Plain-static targets (no worker) can't read the per-page HTML
|
|
5
|
+
* marker. They get a `_redirects` (or equivalent) file at the target
|
|
6
|
+
* root that the host runtime reads. Cloudflare Pages and Netlify
|
|
7
|
+
* both honor this convention; their syntax is identical for the
|
|
8
|
+
* patterns we emit.
|
|
9
|
+
*
|
|
10
|
+
* Worker-served target types DON'T need this — the worker reads the
|
|
11
|
+
* HTML marker directly per request.
|
|
12
|
+
*
|
|
13
|
+
* Pure functions: takes the archive summary list, returns the file
|
|
14
|
+
* content as a string. Caller (publish.ts) writes to storage.
|
|
15
|
+
*
|
|
16
|
+
* SRP: this module owns the wire format. Walking the source for
|
|
17
|
+
* archived pages is the caller's job. Adding a new host format
|
|
18
|
+
* (e.g., a future Vercel-specific dialect) extends the file with a
|
|
19
|
+
* new emit function and the type union — existing emitters
|
|
20
|
+
* untouched.
|
|
21
|
+
*/
|
|
22
|
+
import type { RedirectsFormat } from '../types.js';
|
|
23
|
+
/**
|
|
24
|
+
* Summary of one archived page contributing to the redirects file.
|
|
25
|
+
*
|
|
26
|
+
* `from`: source route (e.g. `/landing`). Includes leading slash;
|
|
27
|
+
* empty path is the homepage `/`.
|
|
28
|
+
* `to`: alias target route — only present when the archive has
|
|
29
|
+
* `aliasOf` set. When absent, this entry is a 410 Gone.
|
|
30
|
+
*/
|
|
31
|
+
export interface ArchiveSummary {
|
|
32
|
+
from: string;
|
|
33
|
+
to?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Emit the `_redirects` file body. Cloudflare and Netlify share the
|
|
37
|
+
* same syntax for the patterns we emit:
|
|
38
|
+
*
|
|
39
|
+
* /from /to 301 — permanent alias redirect
|
|
40
|
+
* /from / 410 — soft-delete (gone)
|
|
41
|
+
*
|
|
42
|
+
* Cloudflare and Netlify both default to 301 when status is omitted,
|
|
43
|
+
* but we emit it explicitly for forensic clarity. The `410` row uses
|
|
44
|
+
* `/` as the destination because both hosts require a destination
|
|
45
|
+
* column even for status-only rules; both will apply the status
|
|
46
|
+
* regardless of where the destination points.
|
|
47
|
+
*
|
|
48
|
+
* Sorted by `from` so the output is deterministic across publishes.
|
|
49
|
+
* Determinism matters because the file is content-addressed
|
|
50
|
+
* downstream (host's CDN may cache it; same input = same output =
|
|
51
|
+
* cache hit on republish without changes).
|
|
52
|
+
*/
|
|
53
|
+
export declare function emitCloudflareRedirects(archives: ReadonlyArray<ArchiveSummary>): string;
|
|
54
|
+
/**
|
|
55
|
+
* Netlify uses the same `_redirects` grammar as Cloudflare for the
|
|
56
|
+
* patterns we emit. Kept as a separate function so that future
|
|
57
|
+
* Netlify-specific extensions (e.g., country-aware redirects via
|
|
58
|
+
* `Country` headers) land here without forking Cloudflare.
|
|
59
|
+
*/
|
|
60
|
+
export declare function emitNetlifyRedirects(archives: ReadonlyArray<ArchiveSummary>): string;
|
|
61
|
+
/**
|
|
62
|
+
* Structured JSON for custom host integrations. Operators with
|
|
63
|
+
* non-Cloudflare/Netlify hosting wire their own glue (Caddy
|
|
64
|
+
* `redir` directives, nginx rules, AWS CloudFront functions,
|
|
65
|
+
* etc.) and consume this file at deploy time.
|
|
66
|
+
*
|
|
67
|
+
* Shape:
|
|
68
|
+
* {
|
|
69
|
+
* redirects: [{ from, to, status: 301 }, ...],
|
|
70
|
+
* gone: [{ path, status: 410 }, ...]
|
|
71
|
+
* }
|
|
72
|
+
*
|
|
73
|
+
* Same sort order as Cloudflare/Netlify emit (alphabetical by
|
|
74
|
+
* source path) so output is deterministic.
|
|
75
|
+
*/
|
|
76
|
+
export declare function emitJsonRedirects(archives: ReadonlyArray<ArchiveSummary>): string;
|
|
77
|
+
/**
|
|
78
|
+
* The destination filename per format. Cloudflare and Netlify both
|
|
79
|
+
* use `_redirects` at the site root; the JSON form lives at
|
|
80
|
+
* `redirects.json`.
|
|
81
|
+
*/
|
|
82
|
+
export declare function redirectsFilename(format: Exclude<RedirectsFormat, 'none'>): string;
|
|
83
|
+
/**
|
|
84
|
+
* Emit the file body for the given format. Returns null when the
|
|
85
|
+
* format is `'none'` — callers skip writing entirely. Returns empty
|
|
86
|
+
* string when there are no archives — caller decides whether to
|
|
87
|
+
* write an empty file or skip.
|
|
88
|
+
*/
|
|
89
|
+
export declare function emitRedirects(format: RedirectsFormat, archives: ReadonlyArray<ArchiveSummary>): {
|
|
90
|
+
filename: string;
|
|
91
|
+
body: string;
|
|
92
|
+
} | null;
|
|
93
|
+
//# sourceMappingURL=redirects-emit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redirects-emit.d.ts","sourceRoot":"","sources":["../../src/runtime/redirects-emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,GAAG,MAAM,CAKvF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,GAAG,MAAM,CAEpF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,GAAG,MAAM,CAKjF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,MAAM,CAQlF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,GACtC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAW3C"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Emit the `_redirects` file body. Cloudflare and Netlify share the
|
|
3
|
+
* same syntax for the patterns we emit:
|
|
4
|
+
*
|
|
5
|
+
* /from /to 301 — permanent alias redirect
|
|
6
|
+
* /from / 410 — soft-delete (gone)
|
|
7
|
+
*
|
|
8
|
+
* Cloudflare and Netlify both default to 301 when status is omitted,
|
|
9
|
+
* but we emit it explicitly for forensic clarity. The `410` row uses
|
|
10
|
+
* `/` as the destination because both hosts require a destination
|
|
11
|
+
* column even for status-only rules; both will apply the status
|
|
12
|
+
* regardless of where the destination points.
|
|
13
|
+
*
|
|
14
|
+
* Sorted by `from` so the output is deterministic across publishes.
|
|
15
|
+
* Determinism matters because the file is content-addressed
|
|
16
|
+
* downstream (host's CDN may cache it; same input = same output =
|
|
17
|
+
* cache hit on republish without changes).
|
|
18
|
+
*/
|
|
19
|
+
export function emitCloudflareRedirects(archives) {
|
|
20
|
+
if (archives.length === 0)
|
|
21
|
+
return '';
|
|
22
|
+
const sorted = [...archives].sort((a, b) => a.from.localeCompare(b.from));
|
|
23
|
+
const lines = sorted.map(a => (a.to ? `${a.from} ${a.to} 301` : `${a.from} / 410`));
|
|
24
|
+
return lines.join('\n') + '\n';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Netlify uses the same `_redirects` grammar as Cloudflare for the
|
|
28
|
+
* patterns we emit. Kept as a separate function so that future
|
|
29
|
+
* Netlify-specific extensions (e.g., country-aware redirects via
|
|
30
|
+
* `Country` headers) land here without forking Cloudflare.
|
|
31
|
+
*/
|
|
32
|
+
export function emitNetlifyRedirects(archives) {
|
|
33
|
+
return emitCloudflareRedirects(archives);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Structured JSON for custom host integrations. Operators with
|
|
37
|
+
* non-Cloudflare/Netlify hosting wire their own glue (Caddy
|
|
38
|
+
* `redir` directives, nginx rules, AWS CloudFront functions,
|
|
39
|
+
* etc.) and consume this file at deploy time.
|
|
40
|
+
*
|
|
41
|
+
* Shape:
|
|
42
|
+
* {
|
|
43
|
+
* redirects: [{ from, to, status: 301 }, ...],
|
|
44
|
+
* gone: [{ path, status: 410 }, ...]
|
|
45
|
+
* }
|
|
46
|
+
*
|
|
47
|
+
* Same sort order as Cloudflare/Netlify emit (alphabetical by
|
|
48
|
+
* source path) so output is deterministic.
|
|
49
|
+
*/
|
|
50
|
+
export function emitJsonRedirects(archives) {
|
|
51
|
+
const sorted = [...archives].sort((a, b) => a.from.localeCompare(b.from));
|
|
52
|
+
const redirects = sorted.filter(a => a.to !== undefined).map(a => ({ from: a.from, to: a.to, status: 301 }));
|
|
53
|
+
const gone = sorted.filter(a => a.to === undefined).map(a => ({ path: a.from, status: 410 }));
|
|
54
|
+
return JSON.stringify({ redirects, gone }, null, 2) + '\n';
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The destination filename per format. Cloudflare and Netlify both
|
|
58
|
+
* use `_redirects` at the site root; the JSON form lives at
|
|
59
|
+
* `redirects.json`.
|
|
60
|
+
*/
|
|
61
|
+
export function redirectsFilename(format) {
|
|
62
|
+
switch (format) {
|
|
63
|
+
case 'cloudflare':
|
|
64
|
+
case 'netlify':
|
|
65
|
+
return '_redirects';
|
|
66
|
+
case 'json':
|
|
67
|
+
return 'redirects.json';
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Emit the file body for the given format. Returns null when the
|
|
72
|
+
* format is `'none'` — callers skip writing entirely. Returns empty
|
|
73
|
+
* string when there are no archives — caller decides whether to
|
|
74
|
+
* write an empty file or skip.
|
|
75
|
+
*/
|
|
76
|
+
export function emitRedirects(format, archives) {
|
|
77
|
+
if (format === 'none')
|
|
78
|
+
return null;
|
|
79
|
+
const filename = redirectsFilename(format);
|
|
80
|
+
switch (format) {
|
|
81
|
+
case 'cloudflare':
|
|
82
|
+
return { filename, body: emitCloudflareRedirects(archives) };
|
|
83
|
+
case 'netlify':
|
|
84
|
+
return { filename, body: emitNetlifyRedirects(archives) };
|
|
85
|
+
case 'json':
|
|
86
|
+
return { filename, body: emitJsonRedirects(archives) };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=redirects-emit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redirects-emit.js","sourceRoot":"","sources":["../../src/runtime/redirects-emit.ts"],"names":[],"mappings":"AAoCA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAuC;IAC7E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IACzE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAA;IACvF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAChC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAuC;IAC1E,OAAO,uBAAuB,CAAC,QAAQ,CAAC,CAAA;AAC1C,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAuC;IACvE,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IACzE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAC5G,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAC7F,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAA;AAC5D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAwC;IACxE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,YAAY,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,YAAY,CAAA;QACrB,KAAK,MAAM;YACT,OAAO,gBAAgB,CAAA;IAC3B,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAuB,EACvB,QAAuC;IAEvC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IAClC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAA;IAC1C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,YAAY;YACf,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,CAAC,QAAQ,CAAC,EAAE,CAAA;QAC9D,KAAK,SAAS;YACZ,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAA;QAC3D,KAAK,MAAM;YACT,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAA;IAC1D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime capability inspection for a configured target.
|
|
3
|
+
*
|
|
4
|
+
* Per `feature-design-process.md` non-foundational disciplines
|
|
5
|
+
* ("Capability-gap UX surfaced at four points") and
|
|
6
|
+
* `design-soft-delete.md` Q10 capability-gap principle: when a feature
|
|
7
|
+
* needs a runtime capability that some configured targets can't
|
|
8
|
+
* provide (archive needing redirects on a worker; future presence
|
|
9
|
+
* needing a persistent connection; future RBAC content filtering
|
|
10
|
+
* needing per-request rendering), the gap surfaces at four uniform
|
|
11
|
+
* places: (1) boot config validate, (2) author-time modal,
|
|
12
|
+
* (3) validator scanner, (4) pre-publish gate.
|
|
13
|
+
*
|
|
14
|
+
* This module is the shared primitive — pure predicates over a
|
|
15
|
+
* `TargetConfig`. Each of the four surfaces consumes the same answer
|
|
16
|
+
* so authors and operators see consistent gap reporting regardless
|
|
17
|
+
* of which surface they're looking at.
|
|
18
|
+
*
|
|
19
|
+
* # The capability vocabulary (closed enum)
|
|
20
|
+
*
|
|
21
|
+
* Future capabilities (presence, RBAC content filtering, dynamic
|
|
22
|
+
* fragments) extend the enum. Each new entry pairs with one or more
|
|
23
|
+
* features that need it; the inspector grows additively without
|
|
24
|
+
* existing call-sites changing.
|
|
25
|
+
*
|
|
26
|
+
* # SOLID
|
|
27
|
+
*
|
|
28
|
+
* - SRP: one file, pure predicates. No I/O, no side effects.
|
|
29
|
+
* - OCP: capability enum extends; existing call sites stay unchanged
|
|
30
|
+
* (they ask "do you have X?" not "are you platform Y?").
|
|
31
|
+
* - DIP: callers depend on the abstract `RuntimeCapability` enum +
|
|
32
|
+
* `inspectTarget()` function, not on platform discrimination.
|
|
33
|
+
*/
|
|
34
|
+
import type { TargetConfig } from '../types.js';
|
|
35
|
+
/**
|
|
36
|
+
* Closed enum of runtime capabilities. Extend for new features that
|
|
37
|
+
* need capability-gap UX (presence, RBAC content filtering, dynamic
|
|
38
|
+
* fragments, etc.).
|
|
39
|
+
*/
|
|
40
|
+
export type RuntimeCapability =
|
|
41
|
+
/** Worker reads HTML markers and emits `301 → aliasOf` for archived items. */
|
|
42
|
+
'redirects'
|
|
43
|
+
/** Worker emits `410 Gone` for archived-no-alias items. */
|
|
44
|
+
| 'gone-status';
|
|
45
|
+
/** Reason a capability is missing — surfaces in audit + author UI. */
|
|
46
|
+
export interface CapabilityGap {
|
|
47
|
+
capability: RuntimeCapability;
|
|
48
|
+
/** Human-readable reason; surfaces in author modals + audit logs. */
|
|
49
|
+
reason: string;
|
|
50
|
+
}
|
|
51
|
+
export interface TargetCapabilities {
|
|
52
|
+
/** Capabilities the target supports. */
|
|
53
|
+
has: ReadonlySet<RuntimeCapability>;
|
|
54
|
+
/** Per-missing-capability reasons for the four surfaces. */
|
|
55
|
+
gaps: readonly CapabilityGap[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Inspect a target's runtime capabilities. Plain-static targets
|
|
59
|
+
* (no worker, no `_redirects` host glue) lack `redirects` and
|
|
60
|
+
* `gone-status`; everything else has both.
|
|
61
|
+
*
|
|
62
|
+
* The plain-static heuristic matches the existing P4 validator
|
|
63
|
+
* (`archive-not-supported-on-target`): `type === 'static'` AND no
|
|
64
|
+
* `redirects.format` configured (or `'none'`) means the host has
|
|
65
|
+
* no mechanism to emit 301/410 for archived URLs.
|
|
66
|
+
*
|
|
67
|
+
* Worker-served target types (`dynamic` + `static-with-worker`)
|
|
68
|
+
* support both capabilities natively. Static targets WITH
|
|
69
|
+
* `redirects.format` ('cloudflare' | 'netlify' | 'json') support
|
|
70
|
+
* `redirects` via the host's `_redirects` file, but plain-static
|
|
71
|
+
* with no host config can't emit `Gone` status — the host's
|
|
72
|
+
* natural 404 is the floor.
|
|
73
|
+
*/
|
|
74
|
+
export declare function inspectTarget(target: TargetConfig): TargetCapabilities;
|
|
75
|
+
/** Convenience predicate — boolean answer to "can this target serve 301 redirects?" */
|
|
76
|
+
export declare function canServeRedirects(target: TargetConfig): boolean;
|
|
77
|
+
/** Convenience predicate — boolean answer to "can this target serve 410 Gone?" */
|
|
78
|
+
export declare function canServeGoneStatus(target: TargetConfig): boolean;
|
|
79
|
+
//# sourceMappingURL=runtime-capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-capabilities.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime-capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C;;;;GAIG;AACH,MAAM,MAAM,iBAAiB;AAC3B,8EAA8E;AAC5E,WAAW;AACb,2DAA2D;GACzD,aAAa,CAAA;AAEjB,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,iBAAiB,CAAA;IAC7B,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,GAAG,EAAE,WAAW,CAAC,iBAAiB,CAAC,CAAA;IACnC,4DAA4D;IAC5D,IAAI,EAAE,SAAS,aAAa,EAAE,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,kBAAkB,CAoCtE;AAED,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAE/D;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAEhE"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inspect a target's runtime capabilities. Plain-static targets
|
|
3
|
+
* (no worker, no `_redirects` host glue) lack `redirects` and
|
|
4
|
+
* `gone-status`; everything else has both.
|
|
5
|
+
*
|
|
6
|
+
* The plain-static heuristic matches the existing P4 validator
|
|
7
|
+
* (`archive-not-supported-on-target`): `type === 'static'` AND no
|
|
8
|
+
* `redirects.format` configured (or `'none'`) means the host has
|
|
9
|
+
* no mechanism to emit 301/410 for archived URLs.
|
|
10
|
+
*
|
|
11
|
+
* Worker-served target types (`dynamic` + `static-with-worker`)
|
|
12
|
+
* support both capabilities natively. Static targets WITH
|
|
13
|
+
* `redirects.format` ('cloudflare' | 'netlify' | 'json') support
|
|
14
|
+
* `redirects` via the host's `_redirects` file, but plain-static
|
|
15
|
+
* with no host config can't emit `Gone` status — the host's
|
|
16
|
+
* natural 404 is the floor.
|
|
17
|
+
*/
|
|
18
|
+
export function inspectTarget(target) {
|
|
19
|
+
const has = new Set();
|
|
20
|
+
const gaps = [];
|
|
21
|
+
const redirectsFormat = target.redirects?.format;
|
|
22
|
+
const isPlainStatic = target.type === 'static' && (redirectsFormat === undefined || redirectsFormat === 'none');
|
|
23
|
+
// Worker presence detected via:
|
|
24
|
+
// - `type: 'dynamic'` (ESI mode runs on a worker), OR
|
|
25
|
+
// - a WorkerCapableDeployAdapter (e.g., cloudflareWorkersDeploy)
|
|
26
|
+
// Pure-static deploy adapters (GitHub Pages, S3 static, etc.) don't
|
|
27
|
+
// bundle a worker and don't implement workerRuntimeConfig().
|
|
28
|
+
const hasWorker = target.type === 'dynamic' || (target.deploy !== undefined && 'workerRuntimeConfig' in target.deploy);
|
|
29
|
+
const hasHostRedirects = redirectsFormat !== undefined && redirectsFormat !== 'none';
|
|
30
|
+
if (hasWorker || hasHostRedirects) {
|
|
31
|
+
has.add('redirects');
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
gaps.push({
|
|
35
|
+
capability: 'redirects',
|
|
36
|
+
reason: isPlainStatic
|
|
37
|
+
? "plain-static target has no worker and no `redirects.format` configured; archived URLs return the host's natural 404 instead of a 301 redirect"
|
|
38
|
+
: 'target lacks a runtime that can emit 301 redirects',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
if (hasWorker) {
|
|
42
|
+
has.add('gone-status');
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
gaps.push({
|
|
46
|
+
capability: 'gone-status',
|
|
47
|
+
reason: "no worker runtime available to emit `410 Gone` for archived-no-alias items; falls back to the host's natural 404",
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return { has, gaps };
|
|
51
|
+
}
|
|
52
|
+
/** Convenience predicate — boolean answer to "can this target serve 301 redirects?" */
|
|
53
|
+
export function canServeRedirects(target) {
|
|
54
|
+
return inspectTarget(target).has.has('redirects');
|
|
55
|
+
}
|
|
56
|
+
/** Convenience predicate — boolean answer to "can this target serve 410 Gone?" */
|
|
57
|
+
export function canServeGoneStatus(target) {
|
|
58
|
+
return inspectTarget(target).has.has('gone-status');
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=runtime-capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-capabilities.js","sourceRoot":"","sources":["../../src/runtime/runtime-capabilities.ts"],"names":[],"mappings":"AA4DA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAAC,MAAoB;IAChD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAqB,CAAA;IACxC,MAAM,IAAI,GAAoB,EAAE,CAAA;IAEhC,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,CAAA;IAChD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,MAAM,CAAC,CAAA;IAC/G,gCAAgC;IAChC,wDAAwD;IACxD,mEAAmE;IACnE,oEAAoE;IACpE,6DAA6D;IAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,qBAAqB,IAAI,MAAM,CAAC,MAAM,CAAC,CAAA;IACtH,MAAM,gBAAgB,GAAG,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,MAAM,CAAA;IAEpF,IAAI,SAAS,IAAI,gBAAgB,EAAE,CAAC;QAClC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IACtB,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAAI,CAAC;YACR,UAAU,EAAE,WAAW;YACvB,MAAM,EAAE,aAAa;gBACnB,CAAC,CAAC,+IAA+I;gBACjJ,CAAC,CAAC,oDAAoD;SACzD,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IACxB,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAAI,CAAC;YACR,UAAU,EAAE,aAAa;YACzB,MAAM,EACJ,kHAAkH;SACrH,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAA;AACtB,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,iBAAiB,CAAC,MAAoB;IACpD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;AACnD,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;AACrD,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Save-concurrency etag — a content hash used by the save endpoints
|
|
3
|
+
* to detect stale writes. Different from the publish-state hash in
|
|
4
|
+
* `hash.ts`:
|
|
5
|
+
*
|
|
6
|
+
* `.{8hex}.hash` (publish-state, MD5)
|
|
7
|
+
* - Substitutes template + fragment hashes into the manifest
|
|
8
|
+
* - Drives sidecars, compare, cache invalidation
|
|
9
|
+
* - Server-only: requires `templateHashes` and `fragmentHashes`
|
|
10
|
+
* maps that the client doesn't have
|
|
11
|
+
*
|
|
12
|
+
* save etag (this module, SHA-256, 16 hex)
|
|
13
|
+
* - Pure manifest content; no template/fragment substitution
|
|
14
|
+
* - Drives `If-Match` save concurrency per `design-offline.md` Q3
|
|
15
|
+
* - Computable identically by client + server (same canonicalization,
|
|
16
|
+
* same Web Crypto API)
|
|
17
|
+
*
|
|
18
|
+
* # Why two etags
|
|
19
|
+
*
|
|
20
|
+
* Save concurrency asks: "did THIS page's manifest change between
|
|
21
|
+
* my read and my write?" A template change doesn't dirty individual
|
|
22
|
+
* pages from the author's perspective — the author edits page X;
|
|
23
|
+
* if a colleague separately edits the template, that's a render
|
|
24
|
+
* concern, not a save-conflict concern. Mixing the two would force
|
|
25
|
+
* 409 STALE on every author after a template edit, which is wrong UX.
|
|
26
|
+
*
|
|
27
|
+
* The `.{8hex}.hash` etag legitimately includes template/fragment
|
|
28
|
+
* dependencies because IT drives publish + cache invalidation, where
|
|
29
|
+
* the question IS "did anything in the dep tree change."
|
|
30
|
+
*
|
|
31
|
+
* Two etags, two semantics, two consumers. Locked per `design-offline.md`
|
|
32
|
+
* Cut 9 grilling.
|
|
33
|
+
*
|
|
34
|
+
* # Why SHA-256 truncated to 16 hex (not MD5 truncated to 8)
|
|
35
|
+
*
|
|
36
|
+
* Save etags collide more often than publish hashes — every save is
|
|
37
|
+
* a new etag candidate; many saves per page over a long offline
|
|
38
|
+
* session. A collision = silent stale-write (false negative on
|
|
39
|
+
* conflict). 8 hex MD5 = 4B keyspace; tens of thousands of saves
|
|
40
|
+
* across thousands of pages would hit the birthday bound. 16 hex
|
|
41
|
+
* SHA-256 = 18.4 quintillion keyspace; collisions are not a
|
|
42
|
+
* realistic concern. Cost: 8 extra characters in the ETag header.
|
|
43
|
+
*
|
|
44
|
+
* # Client + server parity contract
|
|
45
|
+
*
|
|
46
|
+
* Both call `computeSaveEtag(manifest)` and MUST produce identical
|
|
47
|
+
* output. Canonicalization rules:
|
|
48
|
+
*
|
|
49
|
+
* 1. Pick fields: `template`, `content`, `components`, `metadata`,
|
|
50
|
+
* `route`. Other fields ignored (sidecars, derived state, etc.).
|
|
51
|
+
* 2. JSON.stringify with sorted keys via the existing
|
|
52
|
+
* `sortedReplacer` (deep recursive object-key sort).
|
|
53
|
+
* 3. SHA-256 via `globalThis.crypto.subtle.digest('SHA-256', bytes)`
|
|
54
|
+
* (Web Crypto; works in Node 18+ and all browsers).
|
|
55
|
+
* 4. Take first 8 bytes (16 hex characters).
|
|
56
|
+
*/
|
|
57
|
+
/**
|
|
58
|
+
* Compute the save etag for a page or fragment manifest. Returns 16
|
|
59
|
+
* lowercase hex characters (first 8 bytes of SHA-256).
|
|
60
|
+
*
|
|
61
|
+
* Both client and server call this with the same manifest object;
|
|
62
|
+
* both produce the same etag. Used for `ETag` response header on
|
|
63
|
+
* GET and `If-Match` request header on PUT.
|
|
64
|
+
*
|
|
65
|
+
* Async because Web Crypto's `digest` is async. Callers in hot paths
|
|
66
|
+
* (save handlers, contract tests) await once per save.
|
|
67
|
+
*/
|
|
68
|
+
export declare function computeSaveEtag(manifest: Record<string, unknown>): Promise<string>;
|
|
69
|
+
//# sourceMappingURL=save-etag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save-etag.d.ts","sourceRoot":"","sources":["../src/save-etag.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAqCH;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAexF"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Save-concurrency etag — a content hash used by the save endpoints
|
|
3
|
+
* to detect stale writes. Different from the publish-state hash in
|
|
4
|
+
* `hash.ts`:
|
|
5
|
+
*
|
|
6
|
+
* `.{8hex}.hash` (publish-state, MD5)
|
|
7
|
+
* - Substitutes template + fragment hashes into the manifest
|
|
8
|
+
* - Drives sidecars, compare, cache invalidation
|
|
9
|
+
* - Server-only: requires `templateHashes` and `fragmentHashes`
|
|
10
|
+
* maps that the client doesn't have
|
|
11
|
+
*
|
|
12
|
+
* save etag (this module, SHA-256, 16 hex)
|
|
13
|
+
* - Pure manifest content; no template/fragment substitution
|
|
14
|
+
* - Drives `If-Match` save concurrency per `design-offline.md` Q3
|
|
15
|
+
* - Computable identically by client + server (same canonicalization,
|
|
16
|
+
* same Web Crypto API)
|
|
17
|
+
*
|
|
18
|
+
* # Why two etags
|
|
19
|
+
*
|
|
20
|
+
* Save concurrency asks: "did THIS page's manifest change between
|
|
21
|
+
* my read and my write?" A template change doesn't dirty individual
|
|
22
|
+
* pages from the author's perspective — the author edits page X;
|
|
23
|
+
* if a colleague separately edits the template, that's a render
|
|
24
|
+
* concern, not a save-conflict concern. Mixing the two would force
|
|
25
|
+
* 409 STALE on every author after a template edit, which is wrong UX.
|
|
26
|
+
*
|
|
27
|
+
* The `.{8hex}.hash` etag legitimately includes template/fragment
|
|
28
|
+
* dependencies because IT drives publish + cache invalidation, where
|
|
29
|
+
* the question IS "did anything in the dep tree change."
|
|
30
|
+
*
|
|
31
|
+
* Two etags, two semantics, two consumers. Locked per `design-offline.md`
|
|
32
|
+
* Cut 9 grilling.
|
|
33
|
+
*
|
|
34
|
+
* # Why SHA-256 truncated to 16 hex (not MD5 truncated to 8)
|
|
35
|
+
*
|
|
36
|
+
* Save etags collide more often than publish hashes — every save is
|
|
37
|
+
* a new etag candidate; many saves per page over a long offline
|
|
38
|
+
* session. A collision = silent stale-write (false negative on
|
|
39
|
+
* conflict). 8 hex MD5 = 4B keyspace; tens of thousands of saves
|
|
40
|
+
* across thousands of pages would hit the birthday bound. 16 hex
|
|
41
|
+
* SHA-256 = 18.4 quintillion keyspace; collisions are not a
|
|
42
|
+
* realistic concern. Cost: 8 extra characters in the ETag header.
|
|
43
|
+
*
|
|
44
|
+
* # Client + server parity contract
|
|
45
|
+
*
|
|
46
|
+
* Both call `computeSaveEtag(manifest)` and MUST produce identical
|
|
47
|
+
* output. Canonicalization rules:
|
|
48
|
+
*
|
|
49
|
+
* 1. Pick fields: `template`, `content`, `components`, `metadata`,
|
|
50
|
+
* `route`. Other fields ignored (sidecars, derived state, etc.).
|
|
51
|
+
* 2. JSON.stringify with sorted keys via the existing
|
|
52
|
+
* `sortedReplacer` (deep recursive object-key sort).
|
|
53
|
+
* 3. SHA-256 via `globalThis.crypto.subtle.digest('SHA-256', bytes)`
|
|
54
|
+
* (Web Crypto; works in Node 18+ and all browsers).
|
|
55
|
+
* 4. Take first 8 bytes (16 hex characters).
|
|
56
|
+
*/
|
|
57
|
+
/**
|
|
58
|
+
* Manifest fields that participate in the save etag.
|
|
59
|
+
*
|
|
60
|
+
* Archive fields (per `design-soft-delete.md` Q1) are part of the etag
|
|
61
|
+
* because archive transitions are saves the concurrency model must
|
|
62
|
+
* detect: if author A archives page X while author B is editing it,
|
|
63
|
+
* B's next save must 409-STALE rather than silently overwrite A's
|
|
64
|
+
* archive. Same logic for `aliasOf` flatten cascades and unarchive.
|
|
65
|
+
*/
|
|
66
|
+
const SAVE_ETAG_FIELDS = [
|
|
67
|
+
'template',
|
|
68
|
+
'content',
|
|
69
|
+
'components',
|
|
70
|
+
'metadata',
|
|
71
|
+
'route',
|
|
72
|
+
'archived',
|
|
73
|
+
'archivedAt',
|
|
74
|
+
'archivedBy',
|
|
75
|
+
'aliasOf',
|
|
76
|
+
];
|
|
77
|
+
/** Canonical JSON via sorted-key recursion. Same shape as the
|
|
78
|
+
* publish-hash module's sortedReplacer; duplicated here so this
|
|
79
|
+
* module is self-contained (see SRP note in the file header). */
|
|
80
|
+
function sortedReplacer(_key, value) {
|
|
81
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
82
|
+
const out = {};
|
|
83
|
+
for (const k of Object.keys(value).sort()) {
|
|
84
|
+
out[k] = value[k];
|
|
85
|
+
}
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
return value;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Compute the save etag for a page or fragment manifest. Returns 16
|
|
92
|
+
* lowercase hex characters (first 8 bytes of SHA-256).
|
|
93
|
+
*
|
|
94
|
+
* Both client and server call this with the same manifest object;
|
|
95
|
+
* both produce the same etag. Used for `ETag` response header on
|
|
96
|
+
* GET and `If-Match` request header on PUT.
|
|
97
|
+
*
|
|
98
|
+
* Async because Web Crypto's `digest` is async. Callers in hot paths
|
|
99
|
+
* (save handlers, contract tests) await once per save.
|
|
100
|
+
*/
|
|
101
|
+
export async function computeSaveEtag(manifest) {
|
|
102
|
+
const picked = {};
|
|
103
|
+
for (const field of SAVE_ETAG_FIELDS) {
|
|
104
|
+
if (field in manifest)
|
|
105
|
+
picked[field] = manifest[field];
|
|
106
|
+
}
|
|
107
|
+
const json = JSON.stringify(picked, sortedReplacer);
|
|
108
|
+
const bytes = new TextEncoder().encode(json);
|
|
109
|
+
const digest = await globalThis.crypto.subtle.digest('SHA-256', bytes);
|
|
110
|
+
// First 8 bytes = 16 hex characters.
|
|
111
|
+
const view = new Uint8Array(digest, 0, 8);
|
|
112
|
+
let out = '';
|
|
113
|
+
for (let i = 0; i < view.length; i++) {
|
|
114
|
+
out += view[i].toString(16).padStart(2, '0');
|
|
115
|
+
}
|
|
116
|
+
return out;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=save-etag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save-etag.js","sourceRoot":"","sources":["../src/save-etag.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH;;;;;;;;GAQG;AACH,MAAM,gBAAgB,GAAG;IACvB,UAAU;IACV,SAAS;IACT,YAAY;IACZ,UAAU;IACV,OAAO;IACP,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,SAAS;CACD,CAAA;AAEV;;kEAEkE;AAClE,SAAS,cAAc,CAAC,IAAY,EAAE,KAAc;IAClD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,GAAG,GAA4B,EAAE,CAAA;QACvC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACrE,GAAG,CAAC,CAAC,CAAC,GAAI,KAAiC,CAAC,CAAC,CAAC,CAAA;QAChD,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAiC;IACrE,MAAM,MAAM,GAA4B,EAAE,CAAA;IAC1C,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACrC,IAAI,KAAK,IAAI,QAAQ;YAAE,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACxD,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IACnD,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC5C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IACtE,qCAAqC;IACrC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACzC,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC9C,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset override dimensions — the axes along which an asset's bytes,
|
|
3
|
+
* variants, and metadata can vary from its default.
|
|
4
|
+
*
|
|
5
|
+
* v1 ships two first-class dimensions:
|
|
6
|
+
* - `locale` — content-level (e.g. text baked into image varies by language)
|
|
7
|
+
* - `theme` — presentation-level (e.g. logo with light/dark variants)
|
|
8
|
+
*
|
|
9
|
+
* Both are peer dimensions in the abstract model. Each asset can opt into
|
|
10
|
+
* any combination — a logo might have `(en, dark)`, `(fr, dark)`, `(de, dark)`
|
|
11
|
+
* variants but no light-mode variants because the default works for light.
|
|
12
|
+
*
|
|
13
|
+
* # Why a closed dimension set
|
|
14
|
+
*
|
|
15
|
+
* A user-defined dimension model (arbitrary axes per site) was rejected
|
|
16
|
+
* during foundation design. 90% of value is locale + theme; arbitrary
|
|
17
|
+
* dimensions complicate the picker UI, fallback chain semantics, and
|
|
18
|
+
* filename composition with no concrete demand. Adding a third dimension
|
|
19
|
+
* later means extending this union and `DIMENSION_ORDER` — mechanical.
|
|
20
|
+
*
|
|
21
|
+
* # Filename composition
|
|
22
|
+
*
|
|
23
|
+
* `DIMENSION_ORDER` fixes the order in which dimensions appear in
|
|
24
|
+
* filenames. `{name}.asset.{locale}.{theme}.json` (locale before theme).
|
|
25
|
+
* Changing the order would re-key every existing locale-only manifest, so
|
|
26
|
+
* it's locked: locale always first.
|
|
27
|
+
*
|
|
28
|
+
* # Selector semantics
|
|
29
|
+
*
|
|
30
|
+
* A `Selector` represents a specific combination of dimension values.
|
|
31
|
+
* `null` selector = "default-default" (no overrides; the canonical asset).
|
|
32
|
+
* Empty `Selector` Map is structurally invalid — callers must use `null`
|
|
33
|
+
* to express "no dimensions selected." Validators enforce.
|
|
34
|
+
*/
|
|
35
|
+
/** The set of override dimensions an asset can vary along. */
|
|
36
|
+
export type DimensionName = 'locale' | 'theme';
|
|
37
|
+
/**
|
|
38
|
+
* Order in which dimensions appear in composed filenames. Locked: locale
|
|
39
|
+
* before theme. Adding a new dimension extends this constant; existing
|
|
40
|
+
* filenames stay valid because they have no value for the new dimension.
|
|
41
|
+
*/
|
|
42
|
+
export declare const DIMENSION_ORDER: readonly DimensionName[];
|
|
43
|
+
/**
|
|
44
|
+
* A specific combination of dimension values that addresses one asset
|
|
45
|
+
* variant (or the default, when null).
|
|
46
|
+
*
|
|
47
|
+
* Examples:
|
|
48
|
+
* `null` — the default asset
|
|
49
|
+
* `Map { 'locale' → 'fr' }` — French (default theme)
|
|
50
|
+
* `Map { 'locale' → 'fr', 'theme' → 'dark' }` — French + dark
|
|
51
|
+
* `Map { 'theme' → 'dark' }` — dark (default locale)
|
|
52
|
+
*/
|
|
53
|
+
export type Selector = ReadonlyMap<DimensionName, string>;
|
|
54
|
+
/** True when `selector` has at least one dimension set. */
|
|
55
|
+
export declare function isNonEmptySelector(selector: Selector | null): selector is Selector;
|
|
56
|
+
/**
|
|
57
|
+
* Build a Selector from individual dimension values, omitting unset ones.
|
|
58
|
+
* Returns `null` when all dimensions are absent — semantically equivalent
|
|
59
|
+
* to "the default asset."
|
|
60
|
+
*/
|
|
61
|
+
export declare function buildSelector(values: Partial<Record<DimensionName, string>>): Selector | null;
|
|
62
|
+
/**
|
|
63
|
+
* Compose the path-suffix portion of a filename for a selector. Walks
|
|
64
|
+
* `DIMENSION_ORDER` so the order is deterministic regardless of insertion
|
|
65
|
+
* order in the underlying Map.
|
|
66
|
+
*
|
|
67
|
+
* null → '' (no suffix)
|
|
68
|
+
* { locale: 'fr' } → '.fr'
|
|
69
|
+
* { theme: 'dark' } → '.dark'
|
|
70
|
+
* { locale: 'fr', theme: 'dark'} → '.fr.dark'
|
|
71
|
+
*/
|
|
72
|
+
export declare function selectorSuffix(selector: Selector | null): string;
|
|
73
|
+
/**
|
|
74
|
+
* Two selectors are equivalent when they have the same dimensions set
|
|
75
|
+
* to the same values, ignoring iteration order.
|
|
76
|
+
*/
|
|
77
|
+
export declare function selectorsEqual(a: Selector | null, b: Selector | null): boolean;
|
|
78
|
+
//# sourceMappingURL=dimensions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dimensions.d.ts","sourceRoot":"","sources":["../../src/schema/dimensions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,8DAA8D;AAC9D,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAA;AAE9C;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAAwB,CAAA;AAE5E;;;;;;;;;GASG;AACH,MAAM,MAAM,QAAQ,GAAG,WAAW,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;AAEzD,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,QAAQ,IAAI,QAAQ,CAElF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,GAAG,QAAQ,GAAG,IAAI,CAO7F;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM,CAQhE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,OAAO,CAQ9E"}
|