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,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `MemoryCache` — process-internal `AdminCache` provider. v1 default.
|
|
3
|
+
*
|
|
4
|
+
* Per-instance scope; multi-instance-correct via independence (each
|
|
5
|
+
* instance receives SSE invalidation for its own writes via Cut 4's
|
|
6
|
+
* bridge). LRU eviction at configured caps; stats track operational
|
|
7
|
+
* counters.
|
|
8
|
+
*
|
|
9
|
+
* # SOLID lenses
|
|
10
|
+
*
|
|
11
|
+
* - SRP: this module owns the in-memory provider. Stats, LRU,
|
|
12
|
+
* subscribe handling all live here because they're one cohesive
|
|
13
|
+
* "memory cache" concern; splitting would fragment.
|
|
14
|
+
* - LSP: substitutable for any future `AdminCache` provider via
|
|
15
|
+
* the contract test helper (Cut 10).
|
|
16
|
+
* - DIP: consumers depend on `AdminCache`, not `createMemoryCache`.
|
|
17
|
+
*
|
|
18
|
+
* # subscribe() — local emission per Cut 4
|
|
19
|
+
*
|
|
20
|
+
* The contract evolved during Cut 4. The original framing was "events
|
|
21
|
+
* from other instances," with single-instance providers as honest
|
|
22
|
+
* no-ops. Real consumers (the L4→L6 server-to-browser cascade per
|
|
23
|
+
* `design-cache.md` "Offline composition") need server-side L4
|
|
24
|
+
* invalidations to reach browser-side L6 caches. From the browser's
|
|
25
|
+
* POV the server IS another instance, so the right contract is
|
|
26
|
+
* "events from any source" — including local ones.
|
|
27
|
+
*
|
|
28
|
+
* `invalidate()` and `invalidatePrefix()` fire to subscribers with
|
|
29
|
+
* the **input** key/prefix (the consumer-facing form passed to the
|
|
30
|
+
* method). The `applyKeyPolicy` version prefix and overflow-hash are
|
|
31
|
+
* provider-internal storage details — they don't leak to event
|
|
32
|
+
* payloads.
|
|
33
|
+
*
|
|
34
|
+
* `forSite()` filters events whose prefix doesn't belong to the
|
|
35
|
+
* wrapping site (cross-site events from a future shared backing
|
|
36
|
+
* service); the SSE bridge subscribes to the forSite wrapper and
|
|
37
|
+
* sees consumer-facing prefixes.
|
|
38
|
+
*/
|
|
39
|
+
import { randomBytes } from 'node:crypto';
|
|
40
|
+
import { hostname } from 'node:os';
|
|
41
|
+
import { applyKeyPolicy, applyPrefixPolicy } from './keys.js';
|
|
42
|
+
/**
|
|
43
|
+
* Resolve the instance ID from the environment when the operator
|
|
44
|
+
* doesn't supply one. Exported for tests; callers should pass through
|
|
45
|
+
* `MemoryCacheOptions.instance`.
|
|
46
|
+
*/
|
|
47
|
+
export function resolveInstanceId(override) {
|
|
48
|
+
if (override)
|
|
49
|
+
return override;
|
|
50
|
+
const k = process.env.K_REVISION;
|
|
51
|
+
if (k)
|
|
52
|
+
return k;
|
|
53
|
+
const h = hostname();
|
|
54
|
+
if (h)
|
|
55
|
+
return h;
|
|
56
|
+
return randomBytes(4).toString('hex');
|
|
57
|
+
}
|
|
58
|
+
/** Default cap when operator config doesn't override. */
|
|
59
|
+
const DEFAULT_MAX_ENTRIES = 10_000;
|
|
60
|
+
/** Default cap when operator config doesn't override. */
|
|
61
|
+
const DEFAULT_MAX_BYTES = 50 * 1024 * 1024; // 50 MB
|
|
62
|
+
/**
|
|
63
|
+
* Build a `MemoryCache` instance. Internal factory — kept public for
|
|
64
|
+
* tests and advanced wiring. Operators use the operator-facing
|
|
65
|
+
* `memoryCache()` factory exported from `gazetta` (Path X), which
|
|
66
|
+
* delegates here.
|
|
67
|
+
*/
|
|
68
|
+
export function createMemoryCache(config = {}) {
|
|
69
|
+
const maxEntries = config.maxEntries ?? DEFAULT_MAX_ENTRIES;
|
|
70
|
+
const maxBytes = config.maxBytes ?? DEFAULT_MAX_BYTES;
|
|
71
|
+
const instance = resolveInstanceId(config.instance);
|
|
72
|
+
// Map insertion order is the LRU order; access touches it via
|
|
73
|
+
// delete+set on hit (Map.set on existing key preserves order, so
|
|
74
|
+
// the explicit delete-then-set is required to bump recency).
|
|
75
|
+
const entries = new Map();
|
|
76
|
+
let totalBytes = 0;
|
|
77
|
+
// Cross-instance event subscribers. Cut 2 never invokes these
|
|
78
|
+
// (no SSE bridge yet); Cut 4 wires emit on incoming SSE messages.
|
|
79
|
+
const subscribers = new Set();
|
|
80
|
+
// Operational counters surfaced via stats() per design-cache.md Q5.
|
|
81
|
+
let hits = 0;
|
|
82
|
+
let misses = 0;
|
|
83
|
+
let evictions = 0;
|
|
84
|
+
let lastInvalidation;
|
|
85
|
+
function evictOldestIfOverCap() {
|
|
86
|
+
while (entries.size > maxEntries || totalBytes > maxBytes) {
|
|
87
|
+
const oldestKey = entries.keys().next().value;
|
|
88
|
+
if (oldestKey === undefined)
|
|
89
|
+
return;
|
|
90
|
+
const entry = entries.get(oldestKey);
|
|
91
|
+
entries.delete(oldestKey);
|
|
92
|
+
if (entry)
|
|
93
|
+
totalBytes -= entry.bytes;
|
|
94
|
+
evictions++;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Notify subscribers of an invalidation. `prefix` is the **input**
|
|
99
|
+
* form (what the consumer passed to invalidate / invalidatePrefix);
|
|
100
|
+
* the version-prefix + overflow-hash applied by `applyKeyPolicy` is
|
|
101
|
+
* a storage encoding detail and never reaches event payloads.
|
|
102
|
+
*
|
|
103
|
+
* Subscribers that throw shouldn't poison sibling subscribers —
|
|
104
|
+
* each notification is wrapped in a try/catch. The error is
|
|
105
|
+
* swallowed (subscribe is observational; failing-open keeps the
|
|
106
|
+
* invalidation honest from the caller's POV).
|
|
107
|
+
*/
|
|
108
|
+
function emit(prefix) {
|
|
109
|
+
if (subscribers.size === 0)
|
|
110
|
+
return;
|
|
111
|
+
const event = {
|
|
112
|
+
prefix,
|
|
113
|
+
source: { instance, timestamp: new Date().toISOString() },
|
|
114
|
+
};
|
|
115
|
+
for (const handler of subscribers) {
|
|
116
|
+
try {
|
|
117
|
+
handler(event);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Subscriber faults must not interfere with the
|
|
121
|
+
// invalidation that triggered them. Silently swallow.
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
async get(key) {
|
|
127
|
+
const wrapped = applyKeyPolicy(key);
|
|
128
|
+
const entry = entries.get(wrapped);
|
|
129
|
+
if (!entry) {
|
|
130
|
+
misses++;
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
// LRU touch — delete + re-insert moves to end (most recent).
|
|
134
|
+
entries.delete(wrapped);
|
|
135
|
+
entries.set(wrapped, entry);
|
|
136
|
+
hits++;
|
|
137
|
+
return entry.value;
|
|
138
|
+
},
|
|
139
|
+
async set(key, value, _opts) {
|
|
140
|
+
// TTL is part of the AdminCache contract but MemoryCache v1
|
|
141
|
+
// doesn't honor it — eviction is LRU-only. A future TTL pass
|
|
142
|
+
// (or a TTL-aware provider) handles expiry.
|
|
143
|
+
const wrapped = applyKeyPolicy(key);
|
|
144
|
+
const bytes = JSON.stringify(value).length;
|
|
145
|
+
const existing = entries.get(wrapped);
|
|
146
|
+
if (existing) {
|
|
147
|
+
totalBytes -= existing.bytes;
|
|
148
|
+
entries.delete(wrapped);
|
|
149
|
+
}
|
|
150
|
+
entries.set(wrapped, { value, bytes });
|
|
151
|
+
totalBytes += bytes;
|
|
152
|
+
evictOldestIfOverCap();
|
|
153
|
+
},
|
|
154
|
+
async invalidate(key) {
|
|
155
|
+
const wrapped = applyKeyPolicy(key);
|
|
156
|
+
const entry = entries.get(wrapped);
|
|
157
|
+
if (!entry)
|
|
158
|
+
return;
|
|
159
|
+
entries.delete(wrapped);
|
|
160
|
+
totalBytes -= entry.bytes;
|
|
161
|
+
emit(key);
|
|
162
|
+
},
|
|
163
|
+
async invalidatePrefix(prefix) {
|
|
164
|
+
const wrapped = applyPrefixPolicy(prefix);
|
|
165
|
+
let cleared = 0;
|
|
166
|
+
for (const [key, entry] of entries) {
|
|
167
|
+
if (key.startsWith(wrapped)) {
|
|
168
|
+
entries.delete(key);
|
|
169
|
+
totalBytes -= entry.bytes;
|
|
170
|
+
cleared++;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
lastInvalidation = {
|
|
174
|
+
prefix,
|
|
175
|
+
at: new Date().toISOString(),
|
|
176
|
+
source: 'local',
|
|
177
|
+
};
|
|
178
|
+
// Emit even when cleared === 0 — subscribers (notably the
|
|
179
|
+
// L4→L6 SSE bridge) want every invalidation intent, not just
|
|
180
|
+
// those that hit something locally. A consumer's L6 cache may
|
|
181
|
+
// hold an entry the server's L4 already evicted via LRU.
|
|
182
|
+
emit(prefix);
|
|
183
|
+
return cleared;
|
|
184
|
+
},
|
|
185
|
+
subscribe(handler) {
|
|
186
|
+
subscribers.add(handler);
|
|
187
|
+
return () => {
|
|
188
|
+
subscribers.delete(handler);
|
|
189
|
+
};
|
|
190
|
+
},
|
|
191
|
+
async stats() {
|
|
192
|
+
return {
|
|
193
|
+
hits,
|
|
194
|
+
misses,
|
|
195
|
+
size: entries.size,
|
|
196
|
+
instance,
|
|
197
|
+
evictions,
|
|
198
|
+
bytesApproximate: totalBytes,
|
|
199
|
+
lastInvalidation,
|
|
200
|
+
};
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/cache/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AdminCache } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Wrap an `AdminCache` with per-site key scoping. Every key written,
|
|
4
|
+
* read, or invalidated through the returned cache is transparently
|
|
5
|
+
* prefixed with `site:{encoded-name}:`.
|
|
6
|
+
*
|
|
7
|
+
* Examples (with siteName = 'main'):
|
|
8
|
+
* inner.set('site:main:pages:home', value) ← stored
|
|
9
|
+
* wrapped.set('pages:home', value) ← what consumers see
|
|
10
|
+
*
|
|
11
|
+
* Prefix invalidation works through the wrapping uniformly:
|
|
12
|
+
* wrapped.invalidatePrefix('pages:') ← consumer call
|
|
13
|
+
* inner.invalidatePrefix('site:main:pages:') ← actual mechanism
|
|
14
|
+
*
|
|
15
|
+
* The `subscribe()` handler receives events with the unwrapped
|
|
16
|
+
* (consumer-facing) prefix. Events for OTHER sites' invalidations
|
|
17
|
+
* reaching the same backing service are filtered out (they have a
|
|
18
|
+
* different `site:{other}:` prefix); cross-site events would be a
|
|
19
|
+
* leak otherwise.
|
|
20
|
+
*/
|
|
21
|
+
export declare function forSite(inner: AdminCache, siteName: string): AdminCache;
|
|
22
|
+
//# sourceMappingURL=per-site.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"per-site.d.ts","sourceRoot":"","sources":["../../src/cache/per-site.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,UAAU,EAAiC,MAAM,YAAY,CAAA;AAS3E;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CA6DvE"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-site cache scoping per `design-cache.md` Gap 3.
|
|
3
|
+
*
|
|
4
|
+
* Wraps an `AdminCache` instance with a site-name prefix on every
|
|
5
|
+
* key. Two motivations:
|
|
6
|
+
*
|
|
7
|
+
* 1. **Future shared backing services** (Redis, Azure cache when
|
|
8
|
+
* they ship) — a single Redis cluster shared across N Site
|
|
9
|
+
* processes needs key isolation so site A's cache writes don't
|
|
10
|
+
* collide with site B's. Per-site key prefix solves this at the
|
|
11
|
+
* wrapper layer; the backing provider is unaware.
|
|
12
|
+
*
|
|
13
|
+
* 2. **Multi-site deployments evolving over time** — pre-1.0
|
|
14
|
+
* Gazetta locks single-Site-per-process, so today there's no
|
|
15
|
+
* collision risk in-process. But a future configuration could
|
|
16
|
+
* legitimately host two Sites in one process; `forSite` makes
|
|
17
|
+
* that change additive.
|
|
18
|
+
*
|
|
19
|
+
* # SOLID lenses
|
|
20
|
+
*
|
|
21
|
+
* - SRP: this module owns "scope an AdminCache to a site name."
|
|
22
|
+
* Provider mechanics live in `memory.ts`; key encoding lives in
|
|
23
|
+
* `keys.ts`. Three concerns, three files.
|
|
24
|
+
* - OCP: a future `forPlugin(cache, pluginName)` wrapper composes
|
|
25
|
+
* identically; no change to consumers.
|
|
26
|
+
* - LSP: `forSite(cache, name)` returns an `AdminCache`. Any
|
|
27
|
+
* caller depending on the interface keeps working.
|
|
28
|
+
* - ISP: consumers see `AdminCache`, never the wrapping mechanism.
|
|
29
|
+
* - DIP: `loadSite()` wraps once at construction; consumers depend
|
|
30
|
+
* on `site.cache: AdminCache`.
|
|
31
|
+
*/
|
|
32
|
+
import { encodeRefName } from '../hash.js';
|
|
33
|
+
/**
|
|
34
|
+
* Reserved prefix for the per-site key namespace. Documented as
|
|
35
|
+
* a built-in per `design-cache.md` Q1's "Reserved prefixes" rule —
|
|
36
|
+
* plugins must not write keys under `site:`.
|
|
37
|
+
*/
|
|
38
|
+
const SITE_NAMESPACE = 'site';
|
|
39
|
+
/**
|
|
40
|
+
* Wrap an `AdminCache` with per-site key scoping. Every key written,
|
|
41
|
+
* read, or invalidated through the returned cache is transparently
|
|
42
|
+
* prefixed with `site:{encoded-name}:`.
|
|
43
|
+
*
|
|
44
|
+
* Examples (with siteName = 'main'):
|
|
45
|
+
* inner.set('site:main:pages:home', value) ← stored
|
|
46
|
+
* wrapped.set('pages:home', value) ← what consumers see
|
|
47
|
+
*
|
|
48
|
+
* Prefix invalidation works through the wrapping uniformly:
|
|
49
|
+
* wrapped.invalidatePrefix('pages:') ← consumer call
|
|
50
|
+
* inner.invalidatePrefix('site:main:pages:') ← actual mechanism
|
|
51
|
+
*
|
|
52
|
+
* The `subscribe()` handler receives events with the unwrapped
|
|
53
|
+
* (consumer-facing) prefix. Events for OTHER sites' invalidations
|
|
54
|
+
* reaching the same backing service are filtered out (they have a
|
|
55
|
+
* different `site:{other}:` prefix); cross-site events would be a
|
|
56
|
+
* leak otherwise.
|
|
57
|
+
*/
|
|
58
|
+
export function forSite(inner, siteName) {
|
|
59
|
+
if (!siteName) {
|
|
60
|
+
throw new Error('forSite: siteName must be a non-empty string');
|
|
61
|
+
}
|
|
62
|
+
const encodedName = encodeRefName(siteName);
|
|
63
|
+
const sitePrefix = `${SITE_NAMESPACE}:${encodedName}:`;
|
|
64
|
+
function wrap(key) {
|
|
65
|
+
return `${sitePrefix}${key}`;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Strip the `site:{name}:` prefix from a stored key for handoff to
|
|
69
|
+
* a consumer subscriber. Returns null when the key isn't owned by
|
|
70
|
+
* this site (shared backing service receiving another site's event).
|
|
71
|
+
*/
|
|
72
|
+
function unwrap(key) {
|
|
73
|
+
if (!key.startsWith(sitePrefix))
|
|
74
|
+
return null;
|
|
75
|
+
return key.slice(sitePrefix.length);
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
async get(key) {
|
|
79
|
+
return inner.get(wrap(key));
|
|
80
|
+
},
|
|
81
|
+
async set(key, value, opts) {
|
|
82
|
+
return inner.set(wrap(key), value, opts);
|
|
83
|
+
},
|
|
84
|
+
async invalidate(key) {
|
|
85
|
+
return inner.invalidate(wrap(key));
|
|
86
|
+
},
|
|
87
|
+
async invalidatePrefix(prefix) {
|
|
88
|
+
return inner.invalidatePrefix(wrap(prefix));
|
|
89
|
+
},
|
|
90
|
+
subscribe(handler) {
|
|
91
|
+
// Forward only events that belong to this site; rewrite the
|
|
92
|
+
// prefix to the consumer-facing form before firing the handler.
|
|
93
|
+
return inner.subscribe(event => {
|
|
94
|
+
const unwrapped = unwrap(event.prefix);
|
|
95
|
+
if (unwrapped === null)
|
|
96
|
+
return;
|
|
97
|
+
handler({ ...event, prefix: unwrapped });
|
|
98
|
+
});
|
|
99
|
+
},
|
|
100
|
+
async stats() {
|
|
101
|
+
// Stats are global to the underlying provider — there's no
|
|
102
|
+
// honest way to slice them per-site without scanning every
|
|
103
|
+
// entry, which defeats the cache. Surface the inner stats
|
|
104
|
+
// verbatim; operators interpret them with the knowledge that
|
|
105
|
+
// shared backing services pool stats across all sites.
|
|
106
|
+
const innerStats = inner.stats;
|
|
107
|
+
if (!innerStats) {
|
|
108
|
+
return { hits: 0, misses: 0, size: 0 };
|
|
109
|
+
}
|
|
110
|
+
return innerStats.call(inner);
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=per-site.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"per-site.js","sourceRoot":"","sources":["../../src/cache/per-site.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAG1C;;;;GAIG;AACH,MAAM,cAAc,GAAG,MAAM,CAAA;AAE7B;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,OAAO,CAAC,KAAiB,EAAE,QAAgB;IACzD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IACjE,CAAC;IACD,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;IAC3C,MAAM,UAAU,GAAG,GAAG,cAAc,IAAI,WAAW,GAAG,CAAA;IAEtD,SAAS,IAAI,CAAC,GAAW;QACvB,OAAO,GAAG,UAAU,GAAG,GAAG,EAAE,CAAA;IAC9B,CAAC;IAED;;;;OAIG;IACH,SAAS,MAAM,CAAC,GAAW;QACzB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAA;QAC5C,OAAO,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACrC,CAAC;IAED,OAAO;QACL,KAAK,CAAC,GAAG,CAAI,GAAW;YACtB,OAAO,KAAK,CAAC,GAAG,CAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAChC,CAAC;QAED,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,KAAQ,EAAE,IAAuB;YACzD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;QAC1C,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,GAAW;YAC1B,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QACpC,CAAC;QAED,KAAK,CAAC,gBAAgB,CAAC,MAAc;YACnC,OAAO,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QAC7C,CAAC;QAED,SAAS,CAAC,OAA2C;YACnD,4DAA4D;YAC5D,gEAAgE;YAChE,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;gBAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;gBACtC,IAAI,SAAS,KAAK,IAAI;oBAAE,OAAM;gBAC9B,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;YAC1C,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,KAAK,CAAC,KAAK;YACT,2DAA2D;YAC3D,2DAA2D;YAC3D,0DAA0D;YAC1D,6DAA6D;YAC7D,uDAAuD;YACvD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAA;YAC9B,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;YACxC,CAAC;YACD,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC/B,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `AdminCache` — provider-substitutable interface for the L4 cache
|
|
3
|
+
* tier (admin / origin server). One concrete implementation ships in
|
|
4
|
+
* v1: `MemoryCache` (Cut 2). Reserved for v2: `RedisCache`,
|
|
5
|
+
* `AzureCache`, `FileCache`.
|
|
6
|
+
*
|
|
7
|
+
* # SOLID lenses
|
|
8
|
+
*
|
|
9
|
+
* - SRP: this module owns the cache contract (interface, stats,
|
|
10
|
+
* invalidation event). Nothing else lives here.
|
|
11
|
+
* - OCP: new providers implement `AdminCache` and slot into the
|
|
12
|
+
* factory (Cut 9). No existing module changes.
|
|
13
|
+
* - LSP: every provider honors the same contract. Substitutable
|
|
14
|
+
* in tests via the `adminCacheContractTests` helper (Cut 10).
|
|
15
|
+
* - ISP: callers depend on this interface, not on a specific
|
|
16
|
+
* provider's mechanism (Map, Redis pub/sub, Service Bus).
|
|
17
|
+
* - DIP: feature code calls `cache.get(key)` etc.; the seam to
|
|
18
|
+
* concrete providers is the factory.
|
|
19
|
+
*
|
|
20
|
+
* Locked invariants per `design-cache.md`:
|
|
21
|
+
* - Cached values MUST be JSON-serializable (no functions, no
|
|
22
|
+
* Symbols, no top-level Maps/Sets) — required for L4 → L6
|
|
23
|
+
* handoff via IndexedDB / localStorage.
|
|
24
|
+
* - `subscribe()` delivers invalidation events from any source
|
|
25
|
+
* (local OR cross-instance — Cut 4 contract evolution). The
|
|
26
|
+
* `event.source.instance` field discriminates origin so
|
|
27
|
+
* subscribers can filter as needed.
|
|
28
|
+
* - `invalidatePrefix()` is best-effort with a time cap (~100ms
|
|
29
|
+
* default per design-cache.md PWA-responsiveness principle);
|
|
30
|
+
* un-cleared entries clear at TTL or on next invalidation.
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* The cache contract. All providers implement this; consumers depend
|
|
34
|
+
* only on the interface.
|
|
35
|
+
*/
|
|
36
|
+
export interface AdminCache {
|
|
37
|
+
/** Get cached value or null on miss. */
|
|
38
|
+
get<T>(key: string): Promise<T | null>;
|
|
39
|
+
/**
|
|
40
|
+
* Set value with optional TTL (seconds). Provider may ignore TTL
|
|
41
|
+
* if it doesn't support expiry; `MemoryCache` ignores TTL in v1
|
|
42
|
+
* (LRU-only eviction).
|
|
43
|
+
*/
|
|
44
|
+
set<T>(key: string, value: T, opts?: {
|
|
45
|
+
ttl?: number;
|
|
46
|
+
}): Promise<void>;
|
|
47
|
+
/** Invalidate one key. */
|
|
48
|
+
invalidate(key: string): Promise<void>;
|
|
49
|
+
/** Invalidate all keys matching a prefix. Returns count cleared. */
|
|
50
|
+
invalidatePrefix(prefix: string): Promise<number>;
|
|
51
|
+
/**
|
|
52
|
+
* Subscribe to invalidation events from any source. Returns disposer.
|
|
53
|
+
*
|
|
54
|
+
* Local invalidations (this instance's `invalidate` /
|
|
55
|
+
* `invalidatePrefix` calls) AND cross-instance invalidations
|
|
56
|
+
* (delivered via SSE bridge or shared backing service) both fire
|
|
57
|
+
* the handler. Discriminate via `event.source.instance` —
|
|
58
|
+
* subscribers that only care about cross-instance events can filter
|
|
59
|
+
* out their own.
|
|
60
|
+
*
|
|
61
|
+
* The L4→L6 server-to-browser cascade is the load-bearing consumer:
|
|
62
|
+
* server-side `invalidatePrefix('pages:')` fires to a subscribed
|
|
63
|
+
* SSE route, which forwards the event to connected browser admin
|
|
64
|
+
* clients, which invalidate their L6 caches. From the browser's
|
|
65
|
+
* POV the server IS another instance, so "events from any source"
|
|
66
|
+
* is the right contract.
|
|
67
|
+
*
|
|
68
|
+
* Event payloads carry the **consumer-facing** prefix (the form
|
|
69
|
+
* passed to the invalidate call). Provider-internal storage
|
|
70
|
+
* details (version prefix, overflow hash, per-site scope) don't
|
|
71
|
+
* leak into the event.
|
|
72
|
+
*
|
|
73
|
+
* **No replay on reconnect.** Subscribers (notably the SSE bridge
|
|
74
|
+
* forwarding to browsers) that lose their connection get no
|
|
75
|
+
* server-side replay of events they missed during the gap. The
|
|
76
|
+
* contract: on reconnect, treat your own cached state as
|
|
77
|
+
* potentially stale and reset (re-fetch from source). The L6 admin
|
|
78
|
+
* cache (`design-offline.md`) follows this rule via full reset on
|
|
79
|
+
* reconnect.
|
|
80
|
+
*
|
|
81
|
+
* **Handlers should be synchronous.** Providers fire subscribers
|
|
82
|
+
* with `handler(event)` — without `await`. TypeScript's `void`
|
|
83
|
+
* return type accepts async handlers for ergonomic reasons, but
|
|
84
|
+
* the cache won't await them; rejections from a returned Promise
|
|
85
|
+
* become unhandled. Subscribers needing async work should enqueue
|
|
86
|
+
* synchronously and process asynchronously elsewhere (e.g., the
|
|
87
|
+
* SSE bridge pushes to a buffer + drains from a stream loop).
|
|
88
|
+
*/
|
|
89
|
+
subscribe(handler: (event: InvalidationEvent) => void): () => void;
|
|
90
|
+
/** Stats for diagnostics. Optional — not every provider exposes. */
|
|
91
|
+
stats?(): Promise<CacheStats>;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Event delivered to `subscribe()` handlers when another instance
|
|
95
|
+
* invalidates a cache prefix. Source identifies the originating
|
|
96
|
+
* instance for cross-instance correlation.
|
|
97
|
+
*/
|
|
98
|
+
export interface InvalidationEvent {
|
|
99
|
+
/** Key or prefix that was invalidated. */
|
|
100
|
+
prefix: string;
|
|
101
|
+
/** Originating instance + wall-clock timestamp (ISO 8601). */
|
|
102
|
+
source: {
|
|
103
|
+
instance: string;
|
|
104
|
+
timestamp: string;
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Cache stats — minimum required + provider-specific extras allowed.
|
|
109
|
+
*
|
|
110
|
+
* The required floor (hits, misses, size) lets the
|
|
111
|
+
* `/api/system/cache/stats` route (Cut 7) report a useful baseline
|
|
112
|
+
* across all providers. Optional fields (errors, evictions,
|
|
113
|
+
* bytesApproximate, oldestEntryAt, lastInvalidation,
|
|
114
|
+
* subscribeReconnects) ship as the relevant provider tracks them.
|
|
115
|
+
*/
|
|
116
|
+
export interface CacheStats {
|
|
117
|
+
hits: number;
|
|
118
|
+
misses: number;
|
|
119
|
+
/** Entry count. */
|
|
120
|
+
size: number;
|
|
121
|
+
/**
|
|
122
|
+
* Identity of the reporting cache instance — same value as
|
|
123
|
+
* `InvalidationEvent.source.instance` for events emitted by this
|
|
124
|
+
* provider. Operators querying `/api/system/cache/stats` in
|
|
125
|
+
* multi-instance deployments use this to know which pod / revision
|
|
126
|
+
* answered (the load balancer's choice can vary between requests).
|
|
127
|
+
* Optional because some providers may not have a meaningful
|
|
128
|
+
* identity (e.g., a no-op stub).
|
|
129
|
+
*/
|
|
130
|
+
instance?: string;
|
|
131
|
+
errors?: number;
|
|
132
|
+
evictions?: number;
|
|
133
|
+
bytesApproximate?: number;
|
|
134
|
+
oldestEntryAt?: string;
|
|
135
|
+
lastInvalidation?: {
|
|
136
|
+
prefix: string;
|
|
137
|
+
at: string;
|
|
138
|
+
source: string;
|
|
139
|
+
};
|
|
140
|
+
subscribeReconnects?: number;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cache/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,wCAAwC;IACxC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IACtC;;;;OAIG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrE,0BAA0B;IAC1B,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtC,oEAAoE;IACpE,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAqCG;IACH,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IAClE,oEAAoE;IACpE,KAAK,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,CAAA;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAA;IACd,8DAA8D;IAC9D,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;CAChD;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IACjE,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `AdminCache` — provider-substitutable interface for the L4 cache
|
|
3
|
+
* tier (admin / origin server). One concrete implementation ships in
|
|
4
|
+
* v1: `MemoryCache` (Cut 2). Reserved for v2: `RedisCache`,
|
|
5
|
+
* `AzureCache`, `FileCache`.
|
|
6
|
+
*
|
|
7
|
+
* # SOLID lenses
|
|
8
|
+
*
|
|
9
|
+
* - SRP: this module owns the cache contract (interface, stats,
|
|
10
|
+
* invalidation event). Nothing else lives here.
|
|
11
|
+
* - OCP: new providers implement `AdminCache` and slot into the
|
|
12
|
+
* factory (Cut 9). No existing module changes.
|
|
13
|
+
* - LSP: every provider honors the same contract. Substitutable
|
|
14
|
+
* in tests via the `adminCacheContractTests` helper (Cut 10).
|
|
15
|
+
* - ISP: callers depend on this interface, not on a specific
|
|
16
|
+
* provider's mechanism (Map, Redis pub/sub, Service Bus).
|
|
17
|
+
* - DIP: feature code calls `cache.get(key)` etc.; the seam to
|
|
18
|
+
* concrete providers is the factory.
|
|
19
|
+
*
|
|
20
|
+
* Locked invariants per `design-cache.md`:
|
|
21
|
+
* - Cached values MUST be JSON-serializable (no functions, no
|
|
22
|
+
* Symbols, no top-level Maps/Sets) — required for L4 → L6
|
|
23
|
+
* handoff via IndexedDB / localStorage.
|
|
24
|
+
* - `subscribe()` delivers invalidation events from any source
|
|
25
|
+
* (local OR cross-instance — Cut 4 contract evolution). The
|
|
26
|
+
* `event.source.instance` field discriminates origin so
|
|
27
|
+
* subscribers can filter as needed.
|
|
28
|
+
* - `invalidatePrefix()` is best-effort with a time cap (~100ms
|
|
29
|
+
* default per design-cache.md PWA-responsiveness principle);
|
|
30
|
+
* un-cleared entries clear at TTL or on next invalidation.
|
|
31
|
+
*/
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cache/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `gazetta archive <subcommand>` runner — Cut 13 of the soft-delete
|
|
3
|
+
* implementation plan.
|
|
4
|
+
*
|
|
5
|
+
* Subcommands (per design-soft-delete.md Q13 L4 lock):
|
|
6
|
+
* archive list [--kind=page|fragment]
|
|
7
|
+
* archive purge <name> [--kind=page|fragment] [--force]
|
|
8
|
+
* archive restore <name> [--kind=page|fragment]
|
|
9
|
+
* archive rename <oldname> <newname> [--kind=page|fragment] [--no-keep-alias]
|
|
10
|
+
*
|
|
11
|
+
* Implementation strategy: the CLI invokes the same admin-api routes
|
|
12
|
+
* the admin UI uses, via `app.request()` against an in-process
|
|
13
|
+
* `createAdminApp`. This reuses every primitive (audit, capability,
|
|
14
|
+
* cache invalidation, sidecar writes) and avoids parallel CLI-only
|
|
15
|
+
* code paths that could drift from the route handlers.
|
|
16
|
+
*
|
|
17
|
+
* Cron-friendly output: structured per-line stdout, one line per
|
|
18
|
+
* archive in `list`, single result line per item in
|
|
19
|
+
* purge/restore/rename. Non-zero exit on any failure. NO_COLOR / non-
|
|
20
|
+
* TTY suppresses ANSI codes via the shared sink.
|
|
21
|
+
*
|
|
22
|
+
* SOLID lenses:
|
|
23
|
+
* - SRP: one module per concern. Subcommand dispatch lives here;
|
|
24
|
+
* archive primitives stay in `admin-api/routes/archive.ts` +
|
|
25
|
+
* `rename.ts`. CLI only orchestrates I/O + dispatch.
|
|
26
|
+
* - OCP: adding a subcommand = new handler + entry in dispatch map.
|
|
27
|
+
* - DIP: depends on admin-api `app.request` interface, not on
|
|
28
|
+
* individual route implementations.
|
|
29
|
+
*/
|
|
30
|
+
import type { OutputSink } from './assets-cli.js';
|
|
31
|
+
export interface ArchiveSubcommandInput {
|
|
32
|
+
/** All argv after the `archive` keyword. e.g. `['list']`, `['purge', 'old-page']`. */
|
|
33
|
+
args: readonly string[];
|
|
34
|
+
/** Project site directory. */
|
|
35
|
+
siteDir: string;
|
|
36
|
+
/** Optional target name override. */
|
|
37
|
+
targetName?: string;
|
|
38
|
+
/** Sink for output. Defaults to `consoleSink`. */
|
|
39
|
+
sink?: OutputSink;
|
|
40
|
+
/** Test hook: skip `process.exit` on bad input. */
|
|
41
|
+
exitOnError?: (code: number) => void;
|
|
42
|
+
}
|
|
43
|
+
export declare function runArchiveSubcommand(input: ArchiveSubcommandInput): Promise<void>;
|
|
44
|
+
//# sourceMappingURL=archive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/cli/archive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAGjD,MAAM,WAAW,sBAAsB;IACrC,sFAAsF;IACtF,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;IACvB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kDAAkD;IAClD,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,mDAAmD;IACnD,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACrC;AAMD,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyEvF"}
|