gazetta 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/admin-dist/assets/index-CBeq0rRb.js +693 -0
- package/admin-dist/assets/index-Dtg1dTZQ.css +1 -0
- package/admin-dist/assets/rolldown-runtime-BYbx6iT9.js +1 -0
- package/admin-dist/assets/{vendor-primevue-C0Q_YTCb.js → vendor-primevue-CBGHkaXv.js} +183 -39
- package/admin-dist/assets/{vendor-react-BipDVGow.js → vendor-react-BdW_kNCG.js} +2 -2
- package/admin-dist/assets/vendor-rjsf-lN2SztQt.js +33 -0
- package/admin-dist/assets/vendor-tiptap-C36yDquB.js +141 -0
- package/admin-dist/assets/vendor-vue-Bt5uR1VW.js +1 -0
- package/admin-dist/assets/workbox-window.prod.es5-DGMtIXHc.js +2 -0
- package/admin-dist/index.html +8 -8
- package/admin-dist/sw.js +1 -0
- package/dist/admin-api/archived-name-conflict.d.ts +31 -0
- package/dist/admin-api/archived-name-conflict.d.ts.map +1 -0
- package/dist/admin-api/archived-name-conflict.js +226 -0
- package/dist/admin-api/archived-name-conflict.js.map +1 -0
- package/dist/admin-api/cache-stats-logger.d.ts +83 -0
- package/dist/admin-api/cache-stats-logger.d.ts.map +1 -0
- package/dist/admin-api/cache-stats-logger.js +59 -0
- package/dist/admin-api/cache-stats-logger.js.map +1 -0
- package/dist/admin-api/hook-audit-emitter.d.ts +38 -0
- package/dist/admin-api/hook-audit-emitter.d.ts.map +1 -0
- package/dist/admin-api/hook-audit-emitter.js +21 -0
- package/dist/admin-api/hook-audit-emitter.js.map +1 -0
- package/dist/admin-api/index.d.ts +84 -0
- package/dist/admin-api/index.d.ts.map +1 -1
- package/dist/admin-api/index.js +254 -9
- package/dist/admin-api/index.js.map +1 -1
- package/dist/admin-api/middleware/audit.d.ts +25 -0
- package/dist/admin-api/middleware/audit.d.ts.map +1 -0
- package/dist/admin-api/middleware/audit.js +65 -0
- package/dist/admin-api/middleware/audit.js.map +1 -0
- package/dist/admin-api/middleware/capability.d.ts +8 -0
- package/dist/admin-api/middleware/capability.d.ts.map +1 -0
- package/dist/admin-api/middleware/capability.js +65 -0
- package/dist/admin-api/middleware/capability.js.map +1 -0
- package/dist/admin-api/middleware/principal.d.ts +18 -0
- package/dist/admin-api/middleware/principal.d.ts.map +1 -0
- package/dist/admin-api/middleware/principal.js +128 -0
- package/dist/admin-api/middleware/principal.js.map +1 -0
- package/dist/admin-api/routes/archive-review.d.ts +80 -0
- package/dist/admin-api/routes/archive-review.d.ts.map +1 -0
- package/dist/admin-api/routes/archive-review.js +70 -0
- package/dist/admin-api/routes/archive-review.js.map +1 -0
- package/dist/admin-api/routes/archive.d.ts +145 -0
- package/dist/admin-api/routes/archive.d.ts.map +1 -0
- package/dist/admin-api/routes/archive.js +540 -0
- package/dist/admin-api/routes/archive.js.map +1 -0
- package/dist/admin-api/routes/assets.d.ts +6 -1
- package/dist/admin-api/routes/assets.d.ts.map +1 -1
- package/dist/admin-api/routes/assets.js +167 -14
- package/dist/admin-api/routes/assets.js.map +1 -1
- package/dist/admin-api/routes/audit.d.ts +71 -0
- package/dist/admin-api/routes/audit.d.ts.map +1 -0
- package/dist/admin-api/routes/audit.js +178 -0
- package/dist/admin-api/routes/audit.js.map +1 -0
- package/dist/admin-api/routes/compare.d.ts.map +1 -1
- package/dist/admin-api/routes/compare.js +3 -2
- package/dist/admin-api/routes/compare.js.map +1 -1
- package/dist/admin-api/routes/fields.d.ts.map +1 -1
- package/dist/admin-api/routes/fields.js +2 -1
- package/dist/admin-api/routes/fields.js.map +1 -1
- package/dist/admin-api/routes/fragments.d.ts +13 -1
- package/dist/admin-api/routes/fragments.d.ts.map +1 -1
- package/dist/admin-api/routes/fragments.js +127 -92
- package/dist/admin-api/routes/fragments.js.map +1 -1
- package/dist/admin-api/routes/health.d.ts +60 -0
- package/dist/admin-api/routes/health.d.ts.map +1 -0
- package/dist/admin-api/routes/health.js +65 -0
- package/dist/admin-api/routes/health.js.map +1 -0
- package/dist/admin-api/routes/history.d.ts +2 -1
- package/dist/admin-api/routes/history.d.ts.map +1 -1
- package/dist/admin-api/routes/history.js +26 -4
- package/dist/admin-api/routes/history.js.map +1 -1
- package/dist/admin-api/routes/pages.d.ts +20 -1
- package/dist/admin-api/routes/pages.d.ts.map +1 -1
- package/dist/admin-api/routes/pages.js +157 -117
- package/dist/admin-api/routes/pages.js.map +1 -1
- package/dist/admin-api/routes/preview.d.ts.map +1 -1
- package/dist/admin-api/routes/preview.js +56 -17
- package/dist/admin-api/routes/preview.js.map +1 -1
- package/dist/admin-api/routes/publish.d.ts +19 -1
- package/dist/admin-api/routes/publish.d.ts.map +1 -1
- package/dist/admin-api/routes/publish.js +508 -92
- package/dist/admin-api/routes/publish.js.map +1 -1
- package/dist/admin-api/routes/rename.d.ts +62 -0
- package/dist/admin-api/routes/rename.d.ts.map +1 -0
- package/dist/admin-api/routes/rename.js +366 -0
- package/dist/admin-api/routes/rename.js.map +1 -0
- package/dist/admin-api/routes/site.d.ts.map +1 -1
- package/dist/admin-api/routes/site.js +6 -18
- package/dist/admin-api/routes/site.js.map +1 -1
- package/dist/admin-api/routes/system.d.ts +23 -0
- package/dist/admin-api/routes/system.d.ts.map +1 -0
- package/dist/admin-api/routes/system.js +115 -0
- package/dist/admin-api/routes/system.js.map +1 -0
- package/dist/admin-api/routes/templates.d.ts +11 -1
- package/dist/admin-api/routes/templates.d.ts.map +1 -1
- package/dist/admin-api/routes/templates.js +36 -3
- package/dist/admin-api/routes/templates.js.map +1 -1
- package/dist/admin-api/routes/validation.d.ts +47 -0
- package/dist/admin-api/routes/validation.d.ts.map +1 -0
- package/dist/admin-api/routes/validation.js +120 -0
- package/dist/admin-api/routes/validation.js.map +1 -0
- package/dist/admin-api/schemas/archive.d.ts +124 -0
- package/dist/admin-api/schemas/archive.d.ts.map +1 -0
- package/dist/admin-api/schemas/archive.js +93 -0
- package/dist/admin-api/schemas/archive.js.map +1 -0
- package/dist/admin-api/schemas/assets.d.ts +16 -0
- package/dist/admin-api/schemas/assets.d.ts.map +1 -1
- package/dist/admin-api/schemas/assets.js +15 -0
- package/dist/admin-api/schemas/assets.js.map +1 -1
- package/dist/admin-api/schemas/audit.d.ts +175 -0
- package/dist/admin-api/schemas/audit.d.ts.map +1 -0
- package/dist/admin-api/schemas/audit.js +91 -0
- package/dist/admin-api/schemas/audit.js.map +1 -0
- package/dist/admin-api/schemas/error.d.ts +94 -0
- package/dist/admin-api/schemas/error.d.ts.map +1 -0
- package/dist/admin-api/schemas/error.js +79 -0
- package/dist/admin-api/schemas/error.js.map +1 -0
- package/dist/admin-api/schemas/fragments.d.ts +2 -0
- package/dist/admin-api/schemas/fragments.d.ts.map +1 -1
- package/dist/admin-api/schemas/fragments.js +4 -0
- package/dist/admin-api/schemas/fragments.js.map +1 -1
- package/dist/admin-api/schemas/index.d.ts +8 -0
- package/dist/admin-api/schemas/index.d.ts.map +1 -1
- package/dist/admin-api/schemas/index.js +8 -0
- package/dist/admin-api/schemas/index.js.map +1 -1
- package/dist/admin-api/schemas/pages.d.ts +2 -0
- package/dist/admin-api/schemas/pages.d.ts.map +1 -1
- package/dist/admin-api/schemas/pages.js +11 -0
- package/dist/admin-api/schemas/pages.js.map +1 -1
- package/dist/admin-api/schemas/rename.d.ts +77 -0
- package/dist/admin-api/schemas/rename.d.ts.map +1 -0
- package/dist/admin-api/schemas/rename.js +75 -0
- package/dist/admin-api/schemas/rename.js.map +1 -0
- package/dist/admin-api/schemas/site.d.ts +3 -2
- package/dist/admin-api/schemas/site.d.ts.map +1 -1
- package/dist/admin-api/schemas/site.js +3 -2
- package/dist/admin-api/schemas/site.js.map +1 -1
- package/dist/admin-api/schemas/system.d.ts +28 -0
- package/dist/admin-api/schemas/system.d.ts.map +1 -0
- package/dist/admin-api/schemas/system.js +35 -0
- package/dist/admin-api/schemas/system.js.map +1 -0
- package/dist/admin-api/schemas/targets.d.ts +55 -0
- package/dist/admin-api/schemas/targets.d.ts.map +1 -1
- package/dist/admin-api/schemas/targets.js +46 -0
- package/dist/admin-api/schemas/targets.js.map +1 -1
- package/dist/admin-api/schemas/templates.d.ts +54 -0
- package/dist/admin-api/schemas/templates.d.ts.map +1 -1
- package/dist/admin-api/schemas/templates.js +21 -0
- package/dist/admin-api/schemas/templates.js.map +1 -1
- package/dist/admin-api/schemas/validation.d.ts +101 -0
- package/dist/admin-api/schemas/validation.d.ts.map +1 -0
- package/dist/admin-api/schemas/validation.js +57 -0
- package/dist/admin-api/schemas/validation.js.map +1 -0
- package/dist/admin-api/source-context.d.ts +66 -10
- package/dist/admin-api/source-context.d.ts.map +1 -1
- package/dist/admin-api/source-context.js +43 -5
- package/dist/admin-api/source-context.js.map +1 -1
- package/dist/ai/adapter-scaffold.d.ts +63 -0
- package/dist/ai/adapter-scaffold.d.ts.map +1 -0
- package/dist/ai/adapter-scaffold.js +89 -0
- package/dist/ai/adapter-scaffold.js.map +1 -0
- package/dist/ai/compose-prompt.d.ts +50 -0
- package/dist/ai/compose-prompt.d.ts.map +1 -0
- package/dist/ai/compose-prompt.js +49 -0
- package/dist/ai/compose-prompt.js.map +1 -0
- package/dist/ai/errors.d.ts +65 -0
- package/dist/ai/errors.d.ts.map +1 -0
- package/dist/ai/errors.js +59 -0
- package/dist/ai/errors.js.map +1 -0
- package/dist/ai/index.d.ts +17 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +16 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/provider.d.ts +76 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +13 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/ai/refusal.d.ts +50 -0
- package/dist/ai/refusal.d.ts.map +1 -0
- package/dist/ai/refusal.js +100 -0
- package/dist/ai/refusal.js.map +1 -0
- package/dist/ai/vision-prep.d.ts +32 -0
- package/dist/ai/vision-prep.d.ts.map +1 -0
- package/dist/ai/vision-prep.js +113 -0
- package/dist/ai/vision-prep.js.map +1 -0
- package/dist/alt/adapter.d.ts +140 -0
- package/dist/alt/adapter.d.ts.map +1 -0
- package/dist/alt/adapter.js +7 -0
- package/dist/alt/adapter.js.map +1 -0
- package/dist/alt/anthropic.d.ts +63 -0
- package/dist/alt/anthropic.d.ts.map +1 -0
- package/dist/alt/anthropic.js +147 -0
- package/dist/alt/anthropic.js.map +1 -0
- package/dist/alt/config.d.ts +67 -0
- package/dist/alt/config.d.ts.map +1 -0
- package/dist/alt/config.js +41 -0
- package/dist/alt/config.js.map +1 -0
- package/dist/alt/factory.d.ts +19 -0
- package/dist/alt/factory.d.ts.map +1 -0
- package/dist/alt/factory.js +69 -0
- package/dist/alt/factory.js.map +1 -0
- package/dist/alt/null-adapter.d.ts +3 -0
- package/dist/alt/null-adapter.d.ts.map +1 -0
- package/dist/alt/null-adapter.js +43 -0
- package/dist/alt/null-adapter.js.map +1 -0
- package/dist/alt/ollama.d.ts +40 -0
- package/dist/alt/ollama.d.ts.map +1 -0
- package/dist/alt/ollama.js +139 -0
- package/dist/alt/ollama.js.map +1 -0
- package/dist/alt/openai.d.ts +46 -0
- package/dist/alt/openai.d.ts.map +1 -0
- package/dist/alt/openai.js +118 -0
- package/dist/alt/openai.js.map +1 -0
- package/dist/alt/prompt-policies.d.ts +79 -0
- package/dist/alt/prompt-policies.d.ts.map +1 -0
- package/dist/alt/prompt-policies.js +67 -0
- package/dist/alt/prompt-policies.js.map +1 -0
- package/dist/alt/route-handler.d.ts +56 -0
- package/dist/alt/route-handler.d.ts.map +1 -0
- package/dist/alt/route-handler.js +122 -0
- package/dist/alt/route-handler.js.map +1 -0
- package/dist/alt/suggester.d.ts +57 -0
- package/dist/alt/suggester.d.ts.map +1 -0
- package/dist/alt/suggester.js +133 -0
- package/dist/alt/suggester.js.map +1 -0
- package/dist/app.js +1 -1
- package/dist/app.js.map +1 -1
- package/dist/archive-aliases.d.ts +79 -0
- package/dist/archive-aliases.d.ts.map +1 -0
- package/dist/archive-aliases.js +60 -0
- package/dist/archive-aliases.js.map +1 -0
- package/dist/archive-helpers.d.ts +73 -0
- package/dist/archive-helpers.d.ts.map +1 -0
- package/dist/archive-helpers.js +94 -0
- package/dist/archive-helpers.js.map +1 -0
- package/dist/assets/find-refs.d.ts +1 -1
- package/dist/assets/find-refs.js +1 -1
- package/dist/assets/find-refs.js.map +1 -1
- package/dist/assets/rename.js +1 -1
- package/dist/assets/rename.js.map +1 -1
- package/dist/assets/replace.js +1 -1
- package/dist/assets/replace.js.map +1 -1
- package/dist/assets/resolve.js +4 -4
- package/dist/assets/resolve.js.map +1 -1
- package/dist/assets/serve-route.js +2 -2
- package/dist/assets/serve-route.js.map +1 -1
- package/dist/assets/validate.d.ts +1 -1
- package/dist/assets/validate.js +1 -1
- package/dist/audit/config.d.ts +75 -0
- package/dist/audit/config.d.ts.map +1 -0
- package/dist/audit/config.js +91 -0
- package/dist/audit/config.js.map +1 -0
- package/dist/audit/context.d.ts +98 -0
- package/dist/audit/context.d.ts.map +1 -0
- package/dist/audit/context.js +51 -0
- package/dist/audit/context.js.map +1 -0
- package/dist/audit/errors.d.ts +73 -0
- package/dist/audit/errors.d.ts.map +1 -0
- package/dist/audit/errors.js +78 -0
- package/dist/audit/errors.js.map +1 -0
- package/dist/audit/index.d.ts +16 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +10 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/provider.d.ts +73 -0
- package/dist/audit/provider.d.ts.map +1 -0
- package/dist/audit/provider.js +2 -0
- package/dist/audit/provider.js.map +1 -0
- package/dist/audit/providers/history.d.ts +66 -0
- package/dist/audit/providers/history.d.ts.map +1 -0
- package/dist/audit/providers/history.js +102 -0
- package/dist/audit/providers/history.js.map +1 -0
- package/dist/audit/pseudonymize.d.ts +26 -0
- package/dist/audit/pseudonymize.d.ts.map +1 -0
- package/dist/audit/pseudonymize.js +86 -0
- package/dist/audit/pseudonymize.js.map +1 -0
- package/dist/audit/recorder.d.ts +102 -0
- package/dist/audit/recorder.d.ts.map +1 -0
- package/dist/audit/recorder.js +55 -0
- package/dist/audit/recorder.js.map +1 -0
- package/dist/audit/retention.d.ts +83 -0
- package/dist/audit/retention.d.ts.map +1 -0
- package/dist/audit/retention.js +142 -0
- package/dist/audit/retention.js.map +1 -0
- package/dist/audit/source-ip.d.ts +32 -0
- package/dist/audit/source-ip.d.ts.map +1 -0
- package/dist/audit/source-ip.js +164 -0
- package/dist/audit/source-ip.js.map +1 -0
- package/dist/audit/types.d.ts +143 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +33 -0
- package/dist/audit/types.js.map +1 -0
- package/dist/audit/user-agent.d.ts +28 -0
- package/dist/audit/user-agent.d.ts.map +1 -0
- package/dist/audit/user-agent.js +63 -0
- package/dist/audit/user-agent.js.map +1 -0
- package/dist/auth/capabilities.d.ts +28 -0
- package/dist/auth/capabilities.d.ts.map +1 -0
- package/dist/auth/capabilities.js +101 -0
- package/dist/auth/capabilities.js.map +1 -0
- package/dist/auth/config.d.ts +109 -0
- package/dist/auth/config.d.ts.map +1 -0
- package/dist/auth/config.js +221 -0
- package/dist/auth/config.js.map +1 -0
- package/dist/auth/errors.d.ts +72 -0
- package/dist/auth/errors.d.ts.map +1 -0
- package/dist/auth/errors.js +78 -0
- package/dist/auth/errors.js.map +1 -0
- package/dist/auth/factory.d.ts +43 -0
- package/dist/auth/factory.d.ts.map +1 -0
- package/dist/auth/factory.js +48 -0
- package/dist/auth/factory.js.map +1 -0
- package/dist/auth/index.d.ts +21 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +14 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/ip-match.d.ts +29 -0
- package/dist/auth/ip-match.d.ts.map +1 -0
- package/dist/auth/ip-match.js +162 -0
- package/dist/auth/ip-match.js.map +1 -0
- package/dist/auth/provider.d.ts +76 -0
- package/dist/auth/provider.d.ts.map +1 -0
- package/dist/auth/provider.js +2 -0
- package/dist/auth/provider.js.map +1 -0
- package/dist/auth/providers/aws-cognito.d.ts +55 -0
- package/dist/auth/providers/aws-cognito.d.ts.map +1 -0
- package/dist/auth/providers/aws-cognito.js +114 -0
- package/dist/auth/providers/aws-cognito.js.map +1 -0
- package/dist/auth/providers/azure-easy-auth.d.ts +7 -0
- package/dist/auth/providers/azure-easy-auth.d.ts.map +1 -0
- package/dist/auth/providers/azure-easy-auth.js +48 -0
- package/dist/auth/providers/azure-easy-auth.js.map +1 -0
- package/dist/auth/providers/cloudflare-access.d.ts +71 -0
- package/dist/auth/providers/cloudflare-access.d.ts.map +1 -0
- package/dist/auth/providers/cloudflare-access.js +120 -0
- package/dist/auth/providers/cloudflare-access.js.map +1 -0
- package/dist/auth/providers/forwarded-user.d.ts +31 -0
- package/dist/auth/providers/forwarded-user.d.ts.map +1 -0
- package/dist/auth/providers/forwarded-user.js +72 -0
- package/dist/auth/providers/forwarded-user.js.map +1 -0
- package/dist/auth/providers/none.d.ts +6 -0
- package/dist/auth/providers/none.d.ts.map +1 -0
- package/dist/auth/providers/none.js +19 -0
- package/dist/auth/providers/none.js.map +1 -0
- package/dist/auth/providers/tailscale.d.ts +7 -0
- package/dist/auth/providers/tailscale.d.ts.map +1 -0
- package/dist/auth/providers/tailscale.js +30 -0
- package/dist/auth/providers/tailscale.js.map +1 -0
- package/dist/auth/role-resolver.d.ts +38 -0
- package/dist/auth/role-resolver.d.ts.map +1 -0
- package/dist/auth/role-resolver.js +92 -0
- package/dist/auth/role-resolver.js.map +1 -0
- package/dist/auth/types.d.ts +150 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +60 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cache/errors.d.ts +41 -0
- package/dist/cache/errors.d.ts.map +1 -0
- package/dist/cache/errors.js +44 -0
- package/dist/cache/errors.js.map +1 -0
- package/dist/cache/factories.d.ts +17 -0
- package/dist/cache/factories.d.ts.map +1 -0
- package/dist/cache/factories.js +17 -0
- package/dist/cache/factories.js.map +1 -0
- package/dist/cache/keys.d.ts +63 -0
- package/dist/cache/keys.d.ts.map +1 -0
- package/dist/cache/keys.js +145 -0
- package/dist/cache/keys.js.map +1 -0
- package/dist/cache/memory.d.ts +51 -0
- package/dist/cache/memory.d.ts.map +1 -0
- package/dist/cache/memory.js +204 -0
- package/dist/cache/memory.js.map +1 -0
- package/dist/cache/per-site.d.ts +22 -0
- package/dist/cache/per-site.d.ts.map +1 -0
- package/dist/cache/per-site.js +114 -0
- package/dist/cache/per-site.js.map +1 -0
- package/dist/cache/types.d.ts +142 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +33 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/cli/archive.d.ts +44 -0
- package/dist/cli/archive.d.ts.map +1 -0
- package/dist/cli/archive.js +310 -0
- package/dist/cli/archive.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +15 -8
- package/dist/cli/bootstrap.d.ts.map +1 -1
- package/dist/cli/bootstrap.js +59 -23
- package/dist/cli/bootstrap.js.map +1 -1
- package/dist/cli/dev-template-watcher.d.ts +29 -0
- package/dist/cli/dev-template-watcher.d.ts.map +1 -0
- package/dist/cli/dev-template-watcher.js +38 -0
- package/dist/cli/dev-template-watcher.js.map +1 -0
- package/dist/cli/history.d.ts.map +1 -1
- package/dist/cli/history.js +5 -3
- package/dist/cli/history.js.map +1 -1
- package/dist/cli/index.js +712 -395
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/validate-flags.d.ts +29 -0
- package/dist/cli/validate-flags.d.ts.map +1 -0
- package/dist/cli/validate-flags.js +49 -0
- package/dist/cli/validate-flags.js.map +1 -0
- package/dist/compare.d.ts +1 -1
- package/dist/compare.d.ts.map +1 -1
- package/dist/compare.js +25 -23
- package/dist/compare.js.map +1 -1
- package/dist/component-ids.d.ts +25 -0
- package/dist/component-ids.d.ts.map +1 -0
- package/dist/component-ids.js +83 -0
- package/dist/component-ids.js.map +1 -0
- package/dist/config/define.d.ts +61 -0
- package/dist/config/define.d.ts.map +1 -0
- package/dist/config/define.js +64 -0
- package/dist/config/define.js.map +1 -0
- package/dist/config/errors.d.ts +32 -0
- package/dist/config/errors.d.ts.map +1 -0
- package/dist/config/errors.js +40 -0
- package/dist/config/errors.js.map +1 -0
- package/dist/config/index.d.ts +13 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +20 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +105 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +265 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schemas.d.ts +89 -0
- package/dist/config/schemas.d.ts.map +1 -0
- package/dist/config/schemas.js +172 -0
- package/dist/config/schemas.js.map +1 -0
- package/dist/config/types.d.ts +32 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +15 -0
- package/dist/config/types.js.map +1 -0
- package/dist/deploy/cloudflare-workers.d.ts +46 -0
- package/dist/deploy/cloudflare-workers.d.ts.map +1 -0
- package/dist/deploy/cloudflare-workers.js +213 -0
- package/dist/deploy/cloudflare-workers.js.map +1 -0
- package/dist/deploy/errors.d.ts +66 -0
- package/dist/deploy/errors.d.ts.map +1 -0
- package/dist/deploy/errors.js +82 -0
- package/dist/deploy/errors.js.map +1 -0
- package/dist/deploy/index.d.ts +9 -0
- package/dist/deploy/index.d.ts.map +1 -0
- package/dist/deploy/index.js +3 -0
- package/dist/deploy/index.js.map +1 -0
- package/dist/deploy/types.d.ts +162 -0
- package/dist/deploy/types.d.ts.map +1 -0
- package/dist/deploy/types.js +2 -0
- package/dist/deploy/types.js.map +1 -0
- package/dist/fragments/create.d.ts +70 -0
- package/dist/fragments/create.d.ts.map +1 -0
- package/dist/fragments/create.js +93 -0
- package/dist/fragments/create.js.map +1 -0
- package/dist/fragments/publish.d.ts +37 -0
- package/dist/fragments/publish.d.ts.map +1 -0
- package/dist/fragments/publish.js +52 -0
- package/dist/fragments/publish.js.map +1 -0
- package/dist/fragments/save.d.ts +81 -0
- package/dist/fragments/save.d.ts.map +1 -0
- package/dist/fragments/save.js +105 -0
- package/dist/fragments/save.js.map +1 -0
- package/dist/history-recorder.d.ts +5 -5
- package/dist/history-recorder.d.ts.map +1 -1
- package/dist/history-recorder.js +4 -4
- package/dist/history-recorder.js.map +1 -1
- package/dist/history-restorer.js +2 -2
- package/dist/history-restorer.js.map +1 -1
- package/dist/history.d.ts +1 -1
- package/dist/hooks/audit-emitter.d.ts +73 -0
- package/dist/hooks/audit-emitter.d.ts.map +1 -0
- package/dist/hooks/audit-emitter.js +13 -0
- package/dist/hooks/audit-emitter.js.map +1 -0
- package/dist/hooks/context.d.ts +78 -0
- package/dist/hooks/context.d.ts.map +1 -0
- package/dist/hooks/context.js +56 -0
- package/dist/hooks/context.js.map +1 -0
- package/dist/hooks/contribution.d.ts +90 -0
- package/dist/hooks/contribution.d.ts.map +1 -0
- package/dist/hooks/contribution.js +2 -0
- package/dist/hooks/contribution.js.map +1 -0
- package/dist/hooks/dispatch.d.ts +30 -0
- package/dist/hooks/dispatch.d.ts.map +1 -0
- package/dist/hooks/dispatch.js +252 -0
- package/dist/hooks/dispatch.js.map +1 -0
- package/dist/hooks/errors.d.ts +100 -0
- package/dist/hooks/errors.d.ts.map +1 -0
- package/dist/hooks/errors.js +103 -0
- package/dist/hooks/errors.js.map +1 -0
- package/dist/hooks/index.d.ts +15 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +6 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/registry.d.ts +53 -0
- package/dist/hooks/registry.d.ts.map +1 -0
- package/dist/hooks/registry.js +139 -0
- package/dist/hooks/registry.js.map +1 -0
- package/dist/hooks/storage.d.ts +43 -0
- package/dist/hooks/storage.d.ts.map +1 -0
- package/dist/hooks/storage.js +2 -0
- package/dist/hooks/storage.js.map +1 -0
- package/dist/hooks/types.d.ts +324 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +2 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +26 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -5
- package/dist/index.js.map +1 -1
- package/dist/locale.d.ts +5 -1
- package/dist/locale.d.ts.map +1 -1
- package/dist/locale.js +6 -2
- package/dist/locale.js.map +1 -1
- package/dist/manifest-save.d.ts +255 -0
- package/dist/manifest-save.d.ts.map +1 -0
- package/dist/manifest-save.js +260 -0
- package/dist/manifest-save.js.map +1 -0
- package/dist/manifest.d.ts +1 -2
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +43 -44
- package/dist/manifest.js.map +1 -1
- package/dist/node-floor.d.ts +3 -0
- package/dist/node-floor.d.ts.map +1 -0
- package/dist/node-floor.js +3 -0
- package/dist/node-floor.js.map +1 -0
- package/dist/pages/create.d.ts +103 -0
- package/dist/pages/create.d.ts.map +1 -0
- package/dist/pages/create.js +117 -0
- package/dist/pages/create.js.map +1 -0
- package/dist/pages/publish.d.ts +59 -0
- package/dist/pages/publish.d.ts.map +1 -0
- package/dist/pages/publish.js +78 -0
- package/dist/pages/publish.js.map +1 -0
- package/dist/pages/save.d.ts +97 -0
- package/dist/pages/save.d.ts.map +1 -0
- package/dist/pages/save.js +138 -0
- package/dist/pages/save.js.map +1 -0
- package/dist/providers/factories.d.ts +65 -0
- package/dist/providers/factories.d.ts.map +1 -0
- package/dist/providers/factories.js +189 -0
- package/dist/providers/factories.js.map +1 -0
- package/dist/publish-item.d.ts +225 -0
- package/dist/publish-item.d.ts.map +1 -0
- package/dist/publish-item.js +210 -0
- package/dist/publish-item.js.map +1 -0
- package/dist/publish-rendered.d.ts.map +1 -1
- package/dist/publish-rendered.js +75 -6
- package/dist/publish-rendered.js.map +1 -1
- package/dist/publish-renderers.d.ts +132 -0
- package/dist/publish-renderers.d.ts.map +1 -0
- package/dist/publish-renderers.js +240 -0
- package/dist/publish-renderers.js.map +1 -0
- package/dist/publish-run.d.ts +223 -0
- package/dist/publish-run.d.ts.map +1 -0
- package/dist/publish-run.js +307 -0
- package/dist/publish-run.js.map +1 -0
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +1 -10
- package/dist/publish.js.map +1 -1
- package/dist/render-for-analysis.d.ts +24 -0
- package/dist/render-for-analysis.d.ts.map +1 -0
- package/dist/render-for-analysis.js +146 -0
- package/dist/render-for-analysis.js.map +1 -0
- package/dist/resolver.d.ts.map +1 -1
- package/dist/resolver.js +47 -23
- package/dist/resolver.js.map +1 -1
- package/dist/runtime/archive-marker.d.ts +62 -0
- package/dist/runtime/archive-marker.d.ts.map +1 -0
- package/dist/runtime/archive-marker.js +88 -0
- package/dist/runtime/archive-marker.js.map +1 -0
- package/dist/runtime/capability-gap-warnings.d.ts +42 -0
- package/dist/runtime/capability-gap-warnings.d.ts.map +1 -0
- package/dist/runtime/capability-gap-warnings.js +28 -0
- package/dist/runtime/capability-gap-warnings.js.map +1 -0
- package/dist/runtime/redirects-emit.d.ts +93 -0
- package/dist/runtime/redirects-emit.d.ts.map +1 -0
- package/dist/runtime/redirects-emit.js +89 -0
- package/dist/runtime/redirects-emit.js.map +1 -0
- package/dist/runtime/runtime-capabilities.d.ts +79 -0
- package/dist/runtime/runtime-capabilities.d.ts.map +1 -0
- package/dist/runtime/runtime-capabilities.js +60 -0
- package/dist/runtime/runtime-capabilities.js.map +1 -0
- package/dist/save-etag.d.ts +69 -0
- package/dist/save-etag.d.ts.map +1 -0
- package/dist/save-etag.js +118 -0
- package/dist/save-etag.js.map +1 -0
- package/dist/site-loader.d.ts +42 -4
- package/dist/site-loader.d.ts.map +1 -1
- package/dist/site-loader.js +27 -8
- package/dist/site-loader.js.map +1 -1
- package/dist/targets.d.ts +21 -12
- package/dist/targets.d.ts.map +1 -1
- package/dist/targets.js +27 -95
- package/dist/targets.js.map +1 -1
- package/dist/testing/admin-cache-contract.d.ts +52 -0
- package/dist/testing/admin-cache-contract.d.ts.map +1 -0
- package/dist/testing/admin-cache-contract.js +203 -0
- package/dist/testing/admin-cache-contract.js.map +1 -0
- package/dist/testing/index.d.ts +11 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +11 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/transforms/factories.d.ts +16 -0
- package/dist/transforms/factories.d.ts.map +1 -0
- package/dist/transforms/factories.js +18 -0
- package/dist/transforms/factories.js.map +1 -0
- package/dist/transforms/index.d.ts +10 -17
- package/dist/transforms/index.d.ts.map +1 -1
- package/dist/transforms/index.js +4 -28
- package/dist/transforms/index.js.map +1 -1
- package/dist/transforms/sharp.d.ts +15 -1
- package/dist/transforms/sharp.d.ts.map +1 -1
- package/dist/transforms/sharp.js +34 -20
- package/dist/transforms/sharp.js.map +1 -1
- package/dist/types.d.ts +379 -52
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +20 -1
- package/dist/types.js.map +1 -1
- package/dist/validation/alt-required-walker.d.ts +27 -0
- package/dist/validation/alt-required-walker.d.ts.map +1 -0
- package/dist/validation/alt-required-walker.js +108 -0
- package/dist/validation/alt-required-walker.js.map +1 -0
- package/dist/validation/default-registry.d.ts +12 -0
- package/dist/validation/default-registry.d.ts.map +1 -0
- package/dist/validation/default-registry.js +55 -0
- package/dist/validation/default-registry.js.map +1 -0
- package/dist/validation/publish-audit.d.ts +44 -0
- package/dist/validation/publish-audit.d.ts.map +1 -0
- package/dist/validation/publish-audit.js +64 -0
- package/dist/validation/publish-audit.js.map +1 -0
- package/dist/validation/registry.d.ts +23 -0
- package/dist/validation/registry.d.ts.map +1 -0
- package/dist/validation/registry.js +15 -0
- package/dist/validation/registry.js.map +1 -0
- package/dist/validation/save-delta.d.ts +46 -0
- package/dist/validation/save-delta.d.ts.map +1 -0
- package/dist/validation/save-delta.js +57 -0
- package/dist/validation/save-delta.js.map +1 -0
- package/dist/validation/scanner.d.ts +91 -0
- package/dist/validation/scanner.d.ts.map +1 -0
- package/dist/validation/scanner.js +327 -0
- package/dist/validation/scanner.js.map +1 -0
- package/dist/validation/template-impact.d.ts +52 -0
- package/dist/validation/template-impact.d.ts.map +1 -0
- package/dist/validation/template-impact.js +53 -0
- package/dist/validation/template-impact.js.map +1 -0
- package/dist/validation/types.d.ts +123 -0
- package/dist/validation/types.d.ts.map +1 -0
- package/dist/validation/types.js +7 -0
- package/dist/validation/types.js.map +1 -0
- package/dist/validation/validators/accessibility.d.ts +3 -0
- package/dist/validation/validators/accessibility.d.ts.map +1 -0
- package/dist/validation/validators/accessibility.js +106 -0
- package/dist/validation/validators/accessibility.js.map +1 -0
- package/dist/validation/validators/aliasof-points-to-archived.d.ts +40 -0
- package/dist/validation/validators/aliasof-points-to-archived.d.ts.map +1 -0
- package/dist/validation/validators/aliasof-points-to-archived.js +34 -0
- package/dist/validation/validators/aliasof-points-to-archived.js.map +1 -0
- package/dist/validation/validators/alt-required.d.ts +3 -0
- package/dist/validation/validators/alt-required.d.ts.map +1 -0
- package/dist/validation/validators/alt-required.js +118 -0
- package/dist/validation/validators/alt-required.js.map +1 -0
- package/dist/validation/validators/archive-not-supported-on-target.d.ts +3 -0
- package/dist/validation/validators/archive-not-supported-on-target.d.ts.map +1 -0
- package/dist/validation/validators/archive-not-supported-on-target.js +38 -0
- package/dist/validation/validators/archive-not-supported-on-target.js.map +1 -0
- package/dist/validation/validators/broken-links.d.ts +3 -0
- package/dist/validation/validators/broken-links.d.ts.map +1 -0
- package/dist/validation/validators/broken-links.js +190 -0
- package/dist/validation/validators/broken-links.js.map +1 -0
- package/dist/validation/validators/circular-alias.d.ts +36 -0
- package/dist/validation/validators/circular-alias.d.ts.map +1 -0
- package/dist/validation/validators/circular-alias.js +63 -0
- package/dist/validation/validators/circular-alias.js.map +1 -0
- package/dist/validation/validators/circular-fragment.d.ts +15 -0
- package/dist/validation/validators/circular-fragment.d.ts.map +1 -0
- package/dist/validation/validators/circular-fragment.js +97 -0
- package/dist/validation/validators/circular-fragment.js.map +1 -0
- package/dist/validation/validators/dangling-alias.d.ts +38 -0
- package/dist/validation/validators/dangling-alias.d.ts.map +1 -0
- package/dist/validation/validators/dangling-alias.js +31 -0
- package/dist/validation/validators/dangling-alias.js.map +1 -0
- package/dist/validation/validators/deploy-target-type-supported.d.ts +3 -0
- package/dist/validation/validators/deploy-target-type-supported.d.ts.map +1 -0
- package/dist/validation/validators/deploy-target-type-supported.js +32 -0
- package/dist/validation/validators/deploy-target-type-supported.js.map +1 -0
- package/dist/validation/validators/dynamic-route-conflict.d.ts +18 -0
- package/dist/validation/validators/dynamic-route-conflict.d.ts.map +1 -0
- package/dist/validation/validators/dynamic-route-conflict.js +80 -0
- package/dist/validation/validators/dynamic-route-conflict.js.map +1 -0
- package/dist/validation/validators/html-validity.d.ts +3 -0
- package/dist/validation/validators/html-validity.d.ts.map +1 -0
- package/dist/validation/validators/html-validity.js +89 -0
- package/dist/validation/validators/html-validity.js.map +1 -0
- package/dist/validation/validators/orphaned-locale-file.d.ts +21 -0
- package/dist/validation/validators/orphaned-locale-file.d.ts.map +1 -0
- package/dist/validation/validators/orphaned-locale-file.js +84 -0
- package/dist/validation/validators/orphaned-locale-file.js.map +1 -0
- package/dist/validation/validators/referenced-archived-without-alias.d.ts +3 -0
- package/dist/validation/validators/referenced-archived-without-alias.d.ts.map +1 -0
- package/dist/validation/validators/referenced-archived-without-alias.js +65 -0
- package/dist/validation/validators/referenced-archived-without-alias.js.map +1 -0
- package/dist/validation/validators/referenced-asset-exists.d.ts +13 -0
- package/dist/validation/validators/referenced-asset-exists.d.ts.map +1 -0
- package/dist/validation/validators/referenced-asset-exists.js +80 -0
- package/dist/validation/validators/referenced-asset-exists.js.map +1 -0
- package/dist/validation/validators/referenced-fragment-exists.d.ts +9 -0
- package/dist/validation/validators/referenced-fragment-exists.d.ts.map +1 -0
- package/dist/validation/validators/referenced-fragment-exists.js +52 -0
- package/dist/validation/validators/referenced-fragment-exists.js.map +1 -0
- package/dist/validation/validators/referenced-template-exists.d.ts +10 -0
- package/dist/validation/validators/referenced-template-exists.d.ts.map +1 -0
- package/dist/validation/validators/referenced-template-exists.js +74 -0
- package/dist/validation/validators/referenced-template-exists.js.map +1 -0
- package/dist/validation/validators/schema-conformance.d.ts +17 -0
- package/dist/validation/validators/schema-conformance.d.ts.map +1 -0
- package/dist/validation/validators/schema-conformance.js +94 -0
- package/dist/validation/validators/schema-conformance.js.map +1 -0
- package/dist/validation/validators/target-deploy-coverage.d.ts +3 -0
- package/dist/validation/validators/target-deploy-coverage.d.ts.map +1 -0
- package/dist/validation/validators/target-deploy-coverage.js +37 -0
- package/dist/validation/validators/target-deploy-coverage.js.map +1 -0
- package/dist/validation/validators/unused-fragment.d.ts +16 -0
- package/dist/validation/validators/unused-fragment.d.ts.map +1 -0
- package/dist/validation/validators/unused-fragment.js +86 -0
- package/dist/validation/validators/unused-fragment.js.map +1 -0
- package/package.json +54 -31
- package/admin-dist/assets/index-BO9-CXmW.css +0 -1
- package/admin-dist/assets/index-Ufu8zZH_.js +0 -668
- package/admin-dist/assets/rolldown-runtime-COnpUsM8.js +0 -1
- package/admin-dist/assets/vendor-rjsf-HKBAjOmQ.js +0 -32
- package/admin-dist/assets/vendor-tiptap-IyO99U4R.js +0 -142
- package/admin-dist/assets/vendor-vue-D3wBSmDf.js +0 -1
- package/dist/publish-locale.d.ts +0 -44
- package/dist/publish-locale.d.ts.map +0 -1
- package/dist/publish-locale.js +0 -103
- package/dist/publish-locale.js.map +0 -1
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `HookContext` builder — per-request factory that admin-api route
|
|
3
|
+
* handlers call to construct the context passed to dispatch.
|
|
4
|
+
*
|
|
5
|
+
* The HookContext is built ONCE per request (not per-hook) and
|
|
6
|
+
* shared across every dispatch in that request. This is the
|
|
7
|
+
* "deterministic timestamp" invariant from design-hooks.md "Locked
|
|
8
|
+
* invariants" — `now` is computed when the context is built so all
|
|
9
|
+
* hooks in the request see the same wall clock.
|
|
10
|
+
*
|
|
11
|
+
* # Why a builder, not a middleware
|
|
12
|
+
*
|
|
13
|
+
* Earlier drafts considered a `hooksMiddleware` that attaches the
|
|
14
|
+
* context to `c.var.hooks`. The reason that doesn't work as
|
|
15
|
+
* cleanly: HookContext needs the SCOPE of each operation
|
|
16
|
+
* (page name, fragment name, locale, etc.) which the middleware
|
|
17
|
+
* can't know — only the route handler does. Route handlers
|
|
18
|
+
* already have everything they need (principal from
|
|
19
|
+
* `c.var.principal`, headers from `c.req`, source from the
|
|
20
|
+
* resolver); a tiny builder function bundles them into a
|
|
21
|
+
* HookContext per-call.
|
|
22
|
+
*
|
|
23
|
+
* # Read-only storage proxy
|
|
24
|
+
*
|
|
25
|
+
* The HookContext exposes `storage` as `ReadOnlyStorageProvider`.
|
|
26
|
+
* v1 uses a Proxy that forwards read methods only; write methods
|
|
27
|
+
* are absent from the type and would throw at the proxy layer if
|
|
28
|
+
* called via type assertion. This is the "Proxy implementation"
|
|
29
|
+
* design open question 2 from design-hooks.md — accepted with the
|
|
30
|
+
* Proxy approach for less code duplication.
|
|
31
|
+
*
|
|
32
|
+
* # Logger fallback
|
|
33
|
+
*
|
|
34
|
+
* Until the logging foundation lands, the context's `log` field is
|
|
35
|
+
* a no-op logger. design-hooks.md notes this: "v1 hooks dispatch
|
|
36
|
+
* supplies a no-op logger or pino child as available."
|
|
37
|
+
*
|
|
38
|
+
* # SOLID lenses
|
|
39
|
+
*
|
|
40
|
+
* - SRP: builder constructs the context; doesn't dispatch
|
|
41
|
+
* (Cut 2's concern), doesn't discover handlers (Cut 3's), and
|
|
42
|
+
* doesn't audit hook firings (Cut 7's).
|
|
43
|
+
* - DIP: builder takes a Principal + StorageProvider + ID
|
|
44
|
+
* generator + clock; doesn't reach into Hono internals.
|
|
45
|
+
*/
|
|
46
|
+
import type { Principal } from '../auth/types.js';
|
|
47
|
+
import type { StorageProvider } from '../types.js';
|
|
48
|
+
import type { HookFiringEmitter } from './audit-emitter.js';
|
|
49
|
+
import type { HookContext, HookLogger, ReadOnlySiteConfig } from './types.js';
|
|
50
|
+
export interface BuildHookContextOptions {
|
|
51
|
+
principal: Principal;
|
|
52
|
+
storage: StorageProvider;
|
|
53
|
+
/** Active target name when the operation is target-scoped. */
|
|
54
|
+
target?: string;
|
|
55
|
+
/** Per-request correlation ID; matches audit + log ids. */
|
|
56
|
+
requestId: string;
|
|
57
|
+
/** Request timestamp; deterministic for all hooks in this request. */
|
|
58
|
+
now?: Date;
|
|
59
|
+
/** Logger; defaults to no-op until logging foundation lands. */
|
|
60
|
+
log?: HookLogger;
|
|
61
|
+
/** Read-only site config. */
|
|
62
|
+
site: ReadOnlySiteConfig;
|
|
63
|
+
/**
|
|
64
|
+
* Optional audit firing emitter. When set, dispatch records
|
|
65
|
+
* one `action: 'hook-fired'` audit event per hook firing per
|
|
66
|
+
* design-hooks.md "Audit events". Production wires this to
|
|
67
|
+
* `c.var.audit`; tests omit for silent firing.
|
|
68
|
+
*/
|
|
69
|
+
auditEmit?: HookFiringEmitter;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Build a HookContext for one request. Construct once per request
|
|
73
|
+
* and pass to every dispatch in that request — the `now` and
|
|
74
|
+
* `requestId` fields are deterministic across the per-request
|
|
75
|
+
* dispatches.
|
|
76
|
+
*/
|
|
77
|
+
export declare function buildHookContext(opts: BuildHookContextOptions): HookContext;
|
|
78
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/hooks/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAS7E,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,SAAS,CAAA;IACpB,OAAO,EAAE,eAAe,CAAA;IACxB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAA;IACjB,sEAAsE;IACtE,GAAG,CAAC,EAAE,IAAI,CAAA;IACV,gEAAgE;IAChE,GAAG,CAAC,EAAE,UAAU,CAAA;IAChB,6BAA6B;IAC7B,IAAI,EAAE,kBAAkB,CAAA;IACxB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,iBAAiB,CAAA;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,uBAAuB,GAAG,WAAW,CAW3E"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
const NOOP_LOGGER = {
|
|
2
|
+
debug: () => { },
|
|
3
|
+
info: () => { },
|
|
4
|
+
warn: () => { },
|
|
5
|
+
error: () => { },
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Build a HookContext for one request. Construct once per request
|
|
9
|
+
* and pass to every dispatch in that request — the `now` and
|
|
10
|
+
* `requestId` fields are deterministic across the per-request
|
|
11
|
+
* dispatches.
|
|
12
|
+
*/
|
|
13
|
+
export function buildHookContext(opts) {
|
|
14
|
+
return {
|
|
15
|
+
principal: opts.principal,
|
|
16
|
+
target: opts.target,
|
|
17
|
+
requestId: opts.requestId,
|
|
18
|
+
auditEmit: opts.auditEmit,
|
|
19
|
+
now: opts.now ?? new Date(),
|
|
20
|
+
log: opts.log ?? NOOP_LOGGER,
|
|
21
|
+
site: opts.site,
|
|
22
|
+
storage: makeReadOnlyStorage(opts.storage),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Wrap a `StorageProvider` in a read-only Proxy. The returned
|
|
27
|
+
* value satisfies `ReadOnlyStorageProvider`; the wrapped read
|
|
28
|
+
* methods forward to the underlying provider; the write methods
|
|
29
|
+
* are absent from the type AND would throw if invoked via type
|
|
30
|
+
* assertion.
|
|
31
|
+
*
|
|
32
|
+
* Why Proxy instead of a copy of read methods: Proxy preserves
|
|
33
|
+
* `this` for any inherited methods + future read methods (e.g.,
|
|
34
|
+
* `stat()` if added later) flow through automatically.
|
|
35
|
+
*/
|
|
36
|
+
function makeReadOnlyStorage(storage) {
|
|
37
|
+
const READ_METHODS = new Set(['readFile', 'readDir', 'exists', 'readBytes', 'readStream']);
|
|
38
|
+
const handler = {
|
|
39
|
+
get(target, prop, receiver) {
|
|
40
|
+
if (typeof prop !== 'string')
|
|
41
|
+
return Reflect.get(target, prop, receiver);
|
|
42
|
+
if (READ_METHODS.has(prop)) {
|
|
43
|
+
const method = Reflect.get(target, prop, receiver);
|
|
44
|
+
if (typeof method === 'function')
|
|
45
|
+
return method.bind(target);
|
|
46
|
+
return method;
|
|
47
|
+
}
|
|
48
|
+
// Write methods + anything else: throw to surface the
|
|
49
|
+
// contract violation. Hooks should never reach for
|
|
50
|
+
// writeFile/writeBytes/writeStream/mkdir/rm via ctx.storage.
|
|
51
|
+
throw new TypeError(`Hook context's storage is read-only — "${prop}" is not available. Writes go through the operation that fired the hook.`);
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
return new Proxy(storage, handler);
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/hooks/context.ts"],"names":[],"mappings":"AAmDA,MAAM,WAAW,GAAe;IAC9B,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;IACf,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;CAChB,CAAA;AAwBD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAA6B;IAC5D,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE;QAC3B,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,WAAW;QAC5B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;KAC3C,CAAA;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,mBAAmB,CAAC,OAAwB;IACnD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAA;IAC1F,MAAM,OAAO,GAAkC;QAC7C,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ;YACxB,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;YACxE,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;gBAClD,IAAI,OAAO,MAAM,KAAK,UAAU;oBAAE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBAC5D,OAAO,MAAM,CAAA;YACf,CAAC;YACD,sDAAsD;YACtD,mDAAmD;YACnD,6DAA6D;YAC7D,MAAM,IAAI,SAAS,CACjB,0CAA0C,IAAI,0EAA0E,CACzH,CAAA;QACH,CAAC;KACF,CAAA;IACD,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,CAAuC,CAAA;AAC1E,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `HookContribution` — what a hook factory returns.
|
|
3
|
+
*
|
|
4
|
+
* Operators add factory contributions to `site.config.ts`'s
|
|
5
|
+
* `admin.hooks` array; the boot path calls each contribution's
|
|
6
|
+
* `hooks[]` entries against the same registry that picks up
|
|
7
|
+
* site-local file discovery.
|
|
8
|
+
*
|
|
9
|
+
* Per design-hooks.md Cut 9 + grilling-with-docs locked Q1
|
|
10
|
+
* (bundled-object shape):
|
|
11
|
+
*
|
|
12
|
+
* - `source` is package-level metadata (e.g.,
|
|
13
|
+
* '@example/cdn-purge'). Captured once per contribution; the
|
|
14
|
+
* loader stamps it on every registered HookEntry's source
|
|
15
|
+
* field for audit + diagnostics.
|
|
16
|
+
* - `hooks` is an array because one package may contribute
|
|
17
|
+
* multiple handlers across phases (e.g., a CDN-purge plugin
|
|
18
|
+
* wires both afterSave and afterPublish).
|
|
19
|
+
*
|
|
20
|
+
* # Why bundle vs. flat array
|
|
21
|
+
*
|
|
22
|
+
* - SRP: source is per-package; hook entries are per-handler.
|
|
23
|
+
* Bundling reflects the ontology — one factory call = one
|
|
24
|
+
* logical plugin contributing N handlers.
|
|
25
|
+
* - DRY: source declared once per package, not stamped on
|
|
26
|
+
* every entry.
|
|
27
|
+
*
|
|
28
|
+
* # Why source is required
|
|
29
|
+
*
|
|
30
|
+
* - Audit log records source per firing; defaulting to
|
|
31
|
+
* 'site-local' would lie when the contribution actually came
|
|
32
|
+
* from a named package.
|
|
33
|
+
* - Plugin authors writing distributables always know their
|
|
34
|
+
* package name; declaring it is one line.
|
|
35
|
+
* - Site-local hooks (admin/hooks/*.ts) get 'site-local' from
|
|
36
|
+
* the file walker, not from this type.
|
|
37
|
+
*
|
|
38
|
+
* # Why duplicate sources allowed
|
|
39
|
+
*
|
|
40
|
+
* - Operators legitimately invoke the same factory twice with
|
|
41
|
+
* different config (e.g., two CDN-purge instances for
|
|
42
|
+
* different regions). Both register; audit log records both
|
|
43
|
+
* events with the same source. Per-handler `options.name`
|
|
44
|
+
* distinguishes them where needed.
|
|
45
|
+
* - Locked grilling-with-docs Q5.
|
|
46
|
+
*
|
|
47
|
+
* # SOLID lenses
|
|
48
|
+
*
|
|
49
|
+
* - SRP: type owns the contribution shape; doesn't construct
|
|
50
|
+
* handlers, doesn't register against the registry.
|
|
51
|
+
* - LSP: every plugin's factory returns `HookContribution`;
|
|
52
|
+
* the loader treats them all uniformly.
|
|
53
|
+
*/
|
|
54
|
+
import type { HookHandler, HookOptions, HookPhase } from './types.js';
|
|
55
|
+
/**
|
|
56
|
+
* One entry in a contribution's `hooks` array. Carries the phase,
|
|
57
|
+
* the handler, and per-handler options (priority / name /
|
|
58
|
+
* timeout).
|
|
59
|
+
*
|
|
60
|
+
* `source` is intentionally absent — it lives on the parent
|
|
61
|
+
* `HookContribution` and gets stamped at registration time.
|
|
62
|
+
* Per-entry override would defeat the bundling rationale.
|
|
63
|
+
*/
|
|
64
|
+
export interface HookEntry {
|
|
65
|
+
readonly phase: HookPhase;
|
|
66
|
+
readonly handler: HookHandler;
|
|
67
|
+
readonly options?: HookOptions;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* What a hook factory returns. Operators add to
|
|
71
|
+
* `site.config.ts`'s `admin.hooks` array; one entry per factory
|
|
72
|
+
* invocation.
|
|
73
|
+
*/
|
|
74
|
+
export interface HookContribution {
|
|
75
|
+
/**
|
|
76
|
+
* Source identity for diagnostics + audit. Conventional values:
|
|
77
|
+
*
|
|
78
|
+
* - `'@scope/package-name'` — npm-distributed plugin
|
|
79
|
+
* - `'github.com/org/repo'` — git-distributed plugin
|
|
80
|
+
* - any other unambiguous string the plugin author prefers
|
|
81
|
+
*
|
|
82
|
+
* The reserved value `'site-local'` is auto-applied by the
|
|
83
|
+
* file-discovery walker (admin/hooks/*.ts) and SHOULD NOT be
|
|
84
|
+
* used by factory-supplied contributions.
|
|
85
|
+
*/
|
|
86
|
+
readonly source: string;
|
|
87
|
+
/** One or more handlers contributed by this package. */
|
|
88
|
+
readonly hooks: ReadonlyArray<HookEntry>;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=contribution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contribution.d.ts","sourceRoot":"","sources":["../../src/hooks/contribution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAErE;;;;;;;;GAQG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAA;CAC/B;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;CACzC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contribution.js","sourceRoot":"","sources":["../../src/hooks/contribution.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { HookRegistry } from './registry.js';
|
|
2
|
+
import type { HookContext, HookScope, PublishHookResult, PublishItem, SaveResult, UploadHookAsset, UploadHookPayload, UploadHookResult } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Chain `beforeSave` handlers. Returns the final payload after
|
|
5
|
+
* every handler has run (or throws `HookCancellation` on first
|
|
6
|
+
* failing handler).
|
|
7
|
+
*/
|
|
8
|
+
export declare function dispatchBeforeSave<T>(registry: HookRegistry, scope: HookScope, payload: T, ctx: HookContext): Promise<T>;
|
|
9
|
+
/**
|
|
10
|
+
* Fan out `afterSave` handlers in parallel. Failures logged;
|
|
11
|
+
* never propagated.
|
|
12
|
+
*/
|
|
13
|
+
export declare function dispatchAfterSave<T>(registry: HookRegistry, scope: HookScope, result: SaveResult<T>, ctx: HookContext): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Chain `afterLoad` handlers. Although the phase fires after
|
|
16
|
+
* load (not before save), it's a mutating chain: each handler
|
|
17
|
+
* may transform the loaded payload. Same shape as `beforeSave`.
|
|
18
|
+
*/
|
|
19
|
+
export declare function dispatchAfterLoad<T>(registry: HookRegistry, scope: HookScope, payload: T, ctx: HookContext): Promise<T>;
|
|
20
|
+
/**
|
|
21
|
+
* Chain `beforePublish` handlers. Returns the final item array.
|
|
22
|
+
*/
|
|
23
|
+
export declare function dispatchBeforePublish(registry: HookRegistry, target: string, items: ReadonlyArray<PublishItem>, ctx: HookContext): Promise<ReadonlyArray<PublishItem>>;
|
|
24
|
+
/** Fan-out `afterPublish` parallel. */
|
|
25
|
+
export declare function dispatchAfterPublish(registry: HookRegistry, target: string, result: PublishHookResult, ctx: HookContext): Promise<void>;
|
|
26
|
+
/** Chain `beforeUpload` handlers. Returns the final asset + bytes. */
|
|
27
|
+
export declare function dispatchBeforeUpload(registry: HookRegistry, asset: UploadHookAsset, bytes: Uint8Array, ctx: HookContext): Promise<UploadHookPayload>;
|
|
28
|
+
/** Fan-out `afterUpload` parallel. */
|
|
29
|
+
export declare function dispatchAfterUpload(registry: HookRegistry, asset: UploadHookAsset, result: UploadHookResult, ctx: HookContext): Promise<void>;
|
|
30
|
+
//# sourceMappingURL=dispatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/hooks/dispatch.ts"],"names":[],"mappings":"AAoDA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEjD,OAAO,KAAK,EAQV,WAAW,EAGX,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,YAAY,CAAA;AAEnB;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,CAAC,EACV,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,CAAC,CAAC,CASZ;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EACrB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,CAAC,EACV,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,CAAC,CAAC,CASZ;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,EACjC,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CASrC;AAED,uCAAuC;AACvC,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,iBAAiB,EACzB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,sEAAsE;AACtE,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,iBAAiB,CAAC,CAS5B;AAED,sCAAsC;AACtC,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,gBAAgB,EACxB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,IAAI,CAAC,CAGf"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook dispatch — chains `before*` handlers, fans out `after*`
|
|
3
|
+
* handlers, enforces per-handler timeout.
|
|
4
|
+
*
|
|
5
|
+
* Per design-hooks.md "Composition (Q3 locked)":
|
|
6
|
+
*
|
|
7
|
+
* - `before*` chain: output of handler N = input of handler N+1.
|
|
8
|
+
* Final output proceeds to the operation. One handler throws
|
|
9
|
+
* → operation cancels; subsequent handlers don't fire.
|
|
10
|
+
* - `after*` parallel: each handler receives the same operation
|
|
11
|
+
* result. Independent (no chaining). Failures logged but
|
|
12
|
+
* don't stop other `after*` handlers from running.
|
|
13
|
+
* - Per-hook timeout (default 5s, configurable per registration):
|
|
14
|
+
* `before*` timeout = throw = cancel operation; `after*`
|
|
15
|
+
* timeout = logged + counted; chain continues.
|
|
16
|
+
*
|
|
17
|
+
* # Why two dispatch functions, not one
|
|
18
|
+
*
|
|
19
|
+
* `dispatchBefore` returns `Promise<T>` (the chained payload).
|
|
20
|
+
* `dispatchAfter` returns `Promise<void>` (nothing to chain).
|
|
21
|
+
* Same generic shape would force `dispatchAfter` consumers to
|
|
22
|
+
* discard a meaningless return value, and `dispatchBefore`'s
|
|
23
|
+
* cancellation semantics would force `after*` callers to handle
|
|
24
|
+
* a throw they can never produce. Two functions, two contracts.
|
|
25
|
+
*
|
|
26
|
+
* # Timeout implementation
|
|
27
|
+
*
|
|
28
|
+
* `Promise.race(handler, timeoutPromise)` where the timeout
|
|
29
|
+
* promise rejects with `HookTimeout`. The handler may still be
|
|
30
|
+
* resolving in the background after timeout — Node's process
|
|
31
|
+
* keeps running until handles drain. v1 doesn't `AbortController`
|
|
32
|
+
* the handler; the design notes this as acceptable for v1
|
|
33
|
+
* (handler completion after timeout is harmless because the
|
|
34
|
+
* dispatcher already moved on).
|
|
35
|
+
*
|
|
36
|
+
* # Promise.allSettled vs Promise.all for `after*`
|
|
37
|
+
*
|
|
38
|
+
* `allSettled` so one failing handler doesn't prevent siblings
|
|
39
|
+
* from firing. Each rejection is logged via `ctx.log.error` with
|
|
40
|
+
* the hook name + phase + duration. The dispatcher itself never
|
|
41
|
+
* rejects from `dispatchAfter`.
|
|
42
|
+
*
|
|
43
|
+
* # SOLID lenses
|
|
44
|
+
*
|
|
45
|
+
* - SRP: dispatch owns the orchestration logic. Per-handler
|
|
46
|
+
* timeout is one concern (private helper). Cancellation
|
|
47
|
+
* wrapping is one concern (private helper).
|
|
48
|
+
* - DIP: callers depend on the dispatch functions; the
|
|
49
|
+
* registry's storage layout is opaque.
|
|
50
|
+
* - LSP: every dispatcher behaves identically across phases.
|
|
51
|
+
*/
|
|
52
|
+
import { HookCancellation, HookTimeout } from './errors.js';
|
|
53
|
+
import { eventFromRegistration } from './audit-emitter.js';
|
|
54
|
+
/**
|
|
55
|
+
* Chain `beforeSave` handlers. Returns the final payload after
|
|
56
|
+
* every handler has run (or throws `HookCancellation` on first
|
|
57
|
+
* failing handler).
|
|
58
|
+
*/
|
|
59
|
+
export async function dispatchBeforeSave(registry, scope, payload, ctx) {
|
|
60
|
+
const handlers = registry.getByPhase('beforeSave');
|
|
61
|
+
let current = payload;
|
|
62
|
+
for (const reg of handlers) {
|
|
63
|
+
current = await runWithTimeout('beforeSave', reg, ctx, async () => reg.handler(scope, current, ctx));
|
|
64
|
+
}
|
|
65
|
+
return current;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Fan out `afterSave` handlers in parallel. Failures logged;
|
|
69
|
+
* never propagated.
|
|
70
|
+
*/
|
|
71
|
+
export async function dispatchAfterSave(registry, scope, result, ctx) {
|
|
72
|
+
const handlers = registry.getByPhase('afterSave');
|
|
73
|
+
await runAfterChain(handlers, ctx, async (reg) => reg.handler(scope, result, ctx));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Chain `afterLoad` handlers. Although the phase fires after
|
|
77
|
+
* load (not before save), it's a mutating chain: each handler
|
|
78
|
+
* may transform the loaded payload. Same shape as `beforeSave`.
|
|
79
|
+
*/
|
|
80
|
+
export async function dispatchAfterLoad(registry, scope, payload, ctx) {
|
|
81
|
+
const handlers = registry.getByPhase('afterLoad');
|
|
82
|
+
let current = payload;
|
|
83
|
+
for (const reg of handlers) {
|
|
84
|
+
current = await runWithTimeout('afterLoad', reg, ctx, async () => reg.handler(scope, current, ctx));
|
|
85
|
+
}
|
|
86
|
+
return current;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Chain `beforePublish` handlers. Returns the final item array.
|
|
90
|
+
*/
|
|
91
|
+
export async function dispatchBeforePublish(registry, target, items, ctx) {
|
|
92
|
+
const handlers = registry.getByPhase('beforePublish');
|
|
93
|
+
let current = items;
|
|
94
|
+
for (const reg of handlers) {
|
|
95
|
+
current = await runWithTimeout('beforePublish', reg, ctx, async () => reg.handler(target, current, ctx));
|
|
96
|
+
}
|
|
97
|
+
return current;
|
|
98
|
+
}
|
|
99
|
+
/** Fan-out `afterPublish` parallel. */
|
|
100
|
+
export async function dispatchAfterPublish(registry, target, result, ctx) {
|
|
101
|
+
const handlers = registry.getByPhase('afterPublish');
|
|
102
|
+
await runAfterChain(handlers, ctx, async (reg) => reg.handler(target, result, ctx));
|
|
103
|
+
}
|
|
104
|
+
/** Chain `beforeUpload` handlers. Returns the final asset + bytes. */
|
|
105
|
+
export async function dispatchBeforeUpload(registry, asset, bytes, ctx) {
|
|
106
|
+
const handlers = registry.getByPhase('beforeUpload');
|
|
107
|
+
let current = { asset, bytes };
|
|
108
|
+
for (const reg of handlers) {
|
|
109
|
+
current = await runWithTimeout('beforeUpload', reg, ctx, async () => reg.handler(current.asset, current.bytes, ctx));
|
|
110
|
+
}
|
|
111
|
+
return current;
|
|
112
|
+
}
|
|
113
|
+
/** Fan-out `afterUpload` parallel. */
|
|
114
|
+
export async function dispatchAfterUpload(registry, asset, result, ctx) {
|
|
115
|
+
const handlers = registry.getByPhase('afterUpload');
|
|
116
|
+
await runAfterChain(handlers, ctx, async (reg) => reg.handler(asset, result, ctx));
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Run a handler with a per-handler timeout. Wraps non-
|
|
120
|
+
* cancellation errors as `HookCancellation` so call sites can
|
|
121
|
+
* `instanceof HookCancellation` uniformly.
|
|
122
|
+
*
|
|
123
|
+
* Used by `before*` chains. Throws to cancel the operation.
|
|
124
|
+
*/
|
|
125
|
+
async function runWithTimeout(phase, reg, ctx, handler) {
|
|
126
|
+
let timer;
|
|
127
|
+
const start = Date.now();
|
|
128
|
+
try {
|
|
129
|
+
const handlerPromise = handler();
|
|
130
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
131
|
+
timer = setTimeout(() => {
|
|
132
|
+
reject(new HookTimeout({ hookName: reg.name, phase, timeoutMs: reg.timeout }));
|
|
133
|
+
}, reg.timeout);
|
|
134
|
+
// unref() so a hung handler doesn't keep the process alive.
|
|
135
|
+
// Available on Node setTimeout return; not on browser.
|
|
136
|
+
const t = timer;
|
|
137
|
+
t.unref?.();
|
|
138
|
+
});
|
|
139
|
+
const result = await Promise.race([handlerPromise, timeoutPromise]);
|
|
140
|
+
// Audit: success firing. Per design-hooks.md "Audit events".
|
|
141
|
+
await safeEmit(ctx, reg, 'success', Date.now() - start);
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
// HookTimeout and HookCancellation already carry the right
|
|
146
|
+
// shape; rewrap anything else as a HookCancellation so
|
|
147
|
+
// `instanceof HookCancellation` covers both "explicit cancel"
|
|
148
|
+
// and "handler crashed."
|
|
149
|
+
const durationMs = Date.now() - start;
|
|
150
|
+
if (err instanceof HookTimeout) {
|
|
151
|
+
await safeEmit(ctx, reg, 'timeout', durationMs);
|
|
152
|
+
throw err;
|
|
153
|
+
}
|
|
154
|
+
if (err instanceof HookCancellation) {
|
|
155
|
+
await safeEmit(ctx, reg, 'hook-cancelled', durationMs);
|
|
156
|
+
throw err;
|
|
157
|
+
}
|
|
158
|
+
await safeEmit(ctx, reg, 'hook-cancelled', durationMs);
|
|
159
|
+
throw new HookCancellation({
|
|
160
|
+
hookName: reg.name,
|
|
161
|
+
phase,
|
|
162
|
+
message: err instanceof Error ? err.message : String(err),
|
|
163
|
+
cause: err,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
finally {
|
|
167
|
+
if (timer !== undefined)
|
|
168
|
+
clearTimeout(timer);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Forward a hook firing event to ctx.auditEmit. Wrapped in
|
|
173
|
+
* try/catch so emitter failures don't break dispatch.
|
|
174
|
+
*/
|
|
175
|
+
async function safeEmit(ctx, reg, outcome, durationMs) {
|
|
176
|
+
if (!ctx.auditEmit)
|
|
177
|
+
return;
|
|
178
|
+
try {
|
|
179
|
+
await ctx.auditEmit(eventFromRegistration(reg, ctx, outcome, durationMs));
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
// Emitter failures isolate to the dispatcher; we don't want
|
|
183
|
+
// a crashing audit recorder to cancel an operation. Failure
|
|
184
|
+
// is silently ignored; audit pipeline has its own structured
|
|
185
|
+
// log surface for emitter problems.
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Run an `after*` chain: parallel via `Promise.allSettled`,
|
|
190
|
+
* per-handler timeout, failures logged via ctx.log without
|
|
191
|
+
* propagating.
|
|
192
|
+
*/
|
|
193
|
+
async function runAfterChain(handlers, ctx, invoke) {
|
|
194
|
+
if (handlers.length === 0)
|
|
195
|
+
return;
|
|
196
|
+
const results = await Promise.allSettled(handlers.map(reg => runWithTimeoutAfter(reg, ctx, () => invoke(reg))));
|
|
197
|
+
for (const [i, r] of results.entries()) {
|
|
198
|
+
if (r.status === 'rejected') {
|
|
199
|
+
const reg = handlers[i];
|
|
200
|
+
const reason = r.reason;
|
|
201
|
+
const isTimeout = reason instanceof HookTimeout;
|
|
202
|
+
ctx.log.error({
|
|
203
|
+
hookName: reg.name,
|
|
204
|
+
phase: reg.phase,
|
|
205
|
+
source: reg.source,
|
|
206
|
+
timeout: isTimeout,
|
|
207
|
+
err: reason instanceof Error ? { name: reason.name, message: reason.message } : { message: String(reason) },
|
|
208
|
+
}, `Hook "${reg.name}" failed in ${reg.phase}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Variant of `runWithTimeout` for `after*` handlers — preserves
|
|
214
|
+
* `HookTimeout` for the logger to discriminate, but doesn't wrap
|
|
215
|
+
* crashes as `HookCancellation` (after-handlers can't cancel).
|
|
216
|
+
*
|
|
217
|
+
* Audit emit fires the same way as `runWithTimeout`; outcome
|
|
218
|
+
* `'timeout'` distinguishes per-handler timeouts; non-timeout
|
|
219
|
+
* crashes record as `'hook-cancelled'` (closest semantic — handler
|
|
220
|
+
* threw, even if the operation didn't cancel).
|
|
221
|
+
*/
|
|
222
|
+
async function runWithTimeoutAfter(reg, ctx, handler) {
|
|
223
|
+
let timer;
|
|
224
|
+
const start = Date.now();
|
|
225
|
+
try {
|
|
226
|
+
const handlerPromise = handler();
|
|
227
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
228
|
+
timer = setTimeout(() => {
|
|
229
|
+
reject(new HookTimeout({ hookName: reg.name, phase: reg.phase, timeoutMs: reg.timeout }));
|
|
230
|
+
}, reg.timeout);
|
|
231
|
+
const t = timer;
|
|
232
|
+
t.unref?.();
|
|
233
|
+
});
|
|
234
|
+
await Promise.race([handlerPromise, timeoutPromise]);
|
|
235
|
+
await safeEmit(ctx, reg, 'success', Date.now() - start);
|
|
236
|
+
}
|
|
237
|
+
catch (err) {
|
|
238
|
+
const durationMs = Date.now() - start;
|
|
239
|
+
if (err instanceof HookTimeout) {
|
|
240
|
+
await safeEmit(ctx, reg, 'timeout', durationMs);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
await safeEmit(ctx, reg, 'hook-cancelled', durationMs);
|
|
244
|
+
}
|
|
245
|
+
throw err;
|
|
246
|
+
}
|
|
247
|
+
finally {
|
|
248
|
+
if (timer !== undefined)
|
|
249
|
+
clearTimeout(timer);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/hooks/dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook error taxonomy.
|
|
3
|
+
*
|
|
4
|
+
* Per design-hooks.md, three distinct error classes carry different
|
|
5
|
+
* dispatcher semantics:
|
|
6
|
+
*
|
|
7
|
+
* - `HookCancellation`: a `before*` hook threw to cancel the
|
|
8
|
+
* operation. Operation aborts; audit records
|
|
9
|
+
* `outcome: 'hook-cancelled'`. The original error (if not a
|
|
10
|
+
* `HookCancellation`) is wrapped so call sites can distinguish
|
|
11
|
+
* "hook explicitly cancelled" from "hook crashed."
|
|
12
|
+
*
|
|
13
|
+
* - `HookTimeout`: a hook's per-handler timeout fired before the
|
|
14
|
+
* handler resolved. For `before*` hooks this cancels the
|
|
15
|
+
* operation (same handling as `HookCancellation`); for `after*`
|
|
16
|
+
* hooks it's logged + counted but doesn't propagate.
|
|
17
|
+
*
|
|
18
|
+
* - `RegistrationAfterInitError`: thrown when code tries to
|
|
19
|
+
* register a hook after the boot-time registration phase has
|
|
20
|
+
* finished. `buildHooksRegistry({ contributions })` registers
|
|
21
|
+
* all factory contributions then calls `seal()`. Any subsequent
|
|
22
|
+
* `register(...)` surfaces this error — a deferred Promise that
|
|
23
|
+
* registers from inside a hook handler, for example, leaks past
|
|
24
|
+
* the registration window.
|
|
25
|
+
*
|
|
26
|
+
* # SOLID lenses
|
|
27
|
+
*
|
|
28
|
+
* - SRP: each error class names one failure mode; consumers
|
|
29
|
+
* branch on `instanceof` to discriminate.
|
|
30
|
+
* - LSP: each subclass `extends HookError` so a `catch (err: HookError)`
|
|
31
|
+
* handler covers every hook-layer failure.
|
|
32
|
+
* - DIP: callers depend on the abstract `HookError` for catch-all
|
|
33
|
+
* handling; specific subclasses for fine-grained recovery.
|
|
34
|
+
*/
|
|
35
|
+
/** Base class for all hook-layer errors. */
|
|
36
|
+
export declare class HookError extends Error {
|
|
37
|
+
readonly name: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* A `before*` hook threw to cancel the operation, OR a hook handler
|
|
41
|
+
* threw a non-cancellation error that the dispatcher wraps for
|
|
42
|
+
* uniform handling.
|
|
43
|
+
*
|
|
44
|
+
* The originating handler's name is captured for audit metadata.
|
|
45
|
+
* The original error (if any) is exposed via `cause` so operators
|
|
46
|
+
* can investigate handler crashes vs. explicit cancellations.
|
|
47
|
+
*/
|
|
48
|
+
export declare class HookCancellation extends HookError {
|
|
49
|
+
readonly name = "HookCancellation";
|
|
50
|
+
/** The hook that cancelled — either `meta.name` or the file basename. */
|
|
51
|
+
readonly hookName: string;
|
|
52
|
+
/** The phase the hook was firing in. */
|
|
53
|
+
readonly phase: string;
|
|
54
|
+
constructor(opts: {
|
|
55
|
+
hookName: string;
|
|
56
|
+
phase: string;
|
|
57
|
+
message?: string;
|
|
58
|
+
cause?: unknown;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* A hook's per-handler timeout fired. The handler may still be
|
|
63
|
+
* resolving (the dispatcher races the handler against a setTimeout-
|
|
64
|
+
* backed promise) — but the operation can't wait for it.
|
|
65
|
+
*/
|
|
66
|
+
export declare class HookTimeout extends HookError {
|
|
67
|
+
readonly name = "HookTimeout";
|
|
68
|
+
readonly hookName: string;
|
|
69
|
+
readonly phase: string;
|
|
70
|
+
readonly timeoutMs: number;
|
|
71
|
+
constructor(opts: {
|
|
72
|
+
hookName: string;
|
|
73
|
+
phase: string;
|
|
74
|
+
timeoutMs: number;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Thrown when `register(...)` is called on a sealed `HookRegistry`
|
|
79
|
+
* (post-boot).
|
|
80
|
+
*
|
|
81
|
+
* Registration window per ADR-0009 + `design-plugins.md`:
|
|
82
|
+
* `buildHooksRegistry({ contributions })` walks `admin.hooks`
|
|
83
|
+
* factory contributions at boot, registers each entry, then calls
|
|
84
|
+
* `seal()`. Any subsequent `register(...)` surfaces this error —
|
|
85
|
+
* for instance a deferred Promise inside a factory that resolves
|
|
86
|
+
* after the registration window closed, or a hook handler that
|
|
87
|
+
* tries to register additional hooks at runtime.
|
|
88
|
+
*/
|
|
89
|
+
export declare class RegistrationAfterInitError extends HookError {
|
|
90
|
+
readonly name = "RegistrationAfterInitError";
|
|
91
|
+
/** Source identity (plugin name / `'site-local'`) attempting late registration. */
|
|
92
|
+
readonly source: string;
|
|
93
|
+
/** Phase the late registration targeted. */
|
|
94
|
+
readonly phase: string;
|
|
95
|
+
constructor(opts: {
|
|
96
|
+
source: string;
|
|
97
|
+
phase: string;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/hooks/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,4CAA4C;AAC5C,qBAAa,SAAU,SAAQ,KAAK;IAClC,SAAkB,IAAI,EAAE,MAAM,CAAc;CAC7C;AAED;;;;;;;;GAQG;AACH,qBAAa,gBAAiB,SAAQ,SAAS;IAC7C,SAAkB,IAAI,sBAAqB;IAC3C,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;gBAEV,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAOzF;AAED;;;;GAIG;AACH,qBAAa,WAAY,SAAQ,SAAS;IACxC,SAAkB,IAAI,iBAAgB;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;gBAEd,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;CAMzE;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,0BAA2B,SAAQ,SAAS;IACvD,SAAkB,IAAI,gCAA+B;IACrD,mFAAmF;IACnF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,4CAA4C;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;gBAEV,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;CAOpD"}
|