@aotter/mantle 0.2.0-alpha.6 → 0.2.0-alpha.7
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/README.md +152 -45
- package/dist/auth/adapter.d.ts +32 -0
- package/dist/auth/adapter.js +285 -0
- package/dist/auth/admin.d.ts +3 -0
- package/dist/auth/admin.js +21 -0
- package/dist/auth/caller.d.ts +86 -0
- package/dist/auth/caller.js +154 -0
- package/dist/auth/hardening.d.ts +24 -0
- package/dist/auth/hardening.js +40 -0
- package/dist/auth/identity.d.ts +121 -0
- package/dist/auth/identity.js +203 -0
- package/dist/auth/oauth.d.ts +31 -0
- package/dist/auth/oauth.js +124 -0
- package/dist/auth/resource-seeds.js +10 -0
- package/dist/auth/routes.d.ts +32 -0
- package/dist/auth/{createAuthRoutes.js → routes.js} +130 -35
- package/dist/build/compiler.d.ts +790 -0
- package/dist/build/compiler.js +6971 -0
- package/dist/{spec → build/spec}/domain/model/ManifestGrammar.d.ts +24 -42
- package/dist/{spec → build/spec}/domain/model/RuntimePlan.d.ts +77 -3
- package/dist/{spec → build/spec}/domain/model/SqlIr.d.ts +35 -6
- package/dist/build/spec/domain/model/UserFields.d.ts +20 -0
- package/dist/{spec → build/spec}/domain/service/PlanFingerprint.d.ts +2 -1
- package/dist/{spec → build/spec}/kernel/diagnostic.d.ts +1 -30
- package/dist/bun/assets.d.ts +2 -0
- package/dist/bun/assets.js +24 -0
- package/dist/domain/adminOrder.js +24 -0
- package/dist/domain/columns.js +55 -0
- package/dist/domain/describe/chunk-ZIQVLA7X.js +363 -0
- package/dist/domain/describe/index.d.ts +58 -0
- package/dist/domain/describe/index.js +115 -0
- package/dist/domain/describe/target-hash.d.ts +8 -0
- package/dist/domain/describe/target-hash.js +12 -0
- package/dist/domain/describe/targets.d.ts +40 -0
- package/dist/domain/entry.js +33 -0
- package/dist/domain/generated-tools.js +17 -0
- package/dist/domain/generation.d.ts +16 -0
- package/dist/domain/generation.js +1 -0
- package/dist/domain/input.js +17 -0
- package/dist/domain/model.js +1 -0
- package/dist/domain/paging.js +204 -0
- package/dist/domain/recipes.js +19 -0
- package/dist/domain/userReferences.js +5 -0
- package/dist/domain/wireScalars.js +47 -0
- package/dist/infrastructure/adminEntries.js +153 -0
- package/dist/infrastructure/adminPaging.js +72 -0
- package/dist/infrastructure/artifacts.js +71 -0
- package/dist/infrastructure/authSchema.js +83 -0
- package/dist/infrastructure/bundle.js +84 -0
- package/dist/infrastructure/cli.js +101 -0
- package/dist/infrastructure/generate.d.ts +14 -0
- package/dist/infrastructure/generate.js +174 -0
- package/dist/infrastructure/generateAuth.d.ts +8 -0
- package/dist/infrastructure/generateAuth.js +17 -0
- package/dist/infrastructure/inputs.js +36 -0
- package/dist/infrastructure/wrangler.js +71 -0
- package/dist/kernel/authorization.d.ts +4 -0
- package/dist/kernel/authorization.js +16 -0
- package/dist/kernel/binds.d.ts +51 -0
- package/dist/kernel/binds.js +45 -0
- package/dist/kernel/caller-identity.d.ts +24 -0
- package/dist/kernel/caller-identity.js +22 -0
- package/dist/kernel/contract-error.d.ts +12 -0
- package/dist/kernel/contract-error.js +14 -0
- package/dist/kernel/contracts.d.ts +139 -0
- package/dist/kernel/contracts.js +92 -0
- package/dist/{spec/domain/service/CloudflareCron.d.ts → kernel/cron.d.ts} +0 -1
- package/dist/{spec/domain/service/CloudflareCron.js → kernel/cron.js} +1 -6
- package/dist/kernel/dialect/common.d.ts +39 -0
- package/dist/kernel/dialect/common.js +6 -0
- package/dist/kernel/dialect/postgres.d.ts +16 -0
- package/dist/kernel/dialect/postgres.js +18 -0
- package/dist/kernel/dialect/sqlite.d.ts +20 -0
- package/dist/kernel/dialect/sqlite.js +34 -0
- package/dist/kernel/driver/bun-sqlite.d.ts +19 -0
- package/dist/kernel/driver/bun-sqlite.js +77 -0
- package/dist/kernel/driver/d1.d.ts +24 -0
- package/dist/kernel/driver/d1.js +22 -0
- package/dist/kernel/driver/postgres.d.ts +25 -0
- package/dist/kernel/driver/postgres.js +95 -0
- package/dist/kernel/driver/transaction-context.d.ts +10 -0
- package/dist/kernel/driver/transaction-context.js +29 -0
- package/dist/kernel/email.d.ts +28 -0
- package/dist/{auth/emailTemplates.js → kernel/email.js} +13 -2
- package/dist/kernel/host-access.d.ts +10 -0
- package/dist/kernel/host-access.js +65 -0
- package/dist/kernel/host-caller.d.ts +38 -0
- package/dist/kernel/host-caller.js +55 -0
- package/dist/kernel/json-body.d.ts +4 -0
- package/dist/kernel/json-body.js +44 -0
- package/dist/kernel/mcp-apps.d.ts +49 -0
- package/dist/kernel/mcp-apps.js +40 -0
- package/dist/kernel/mcp-call.d.ts +5 -0
- package/dist/kernel/mcp-call.js +25 -0
- package/dist/kernel/mcp-handler.js +288 -0
- package/dist/kernel/mcp.d.ts +101 -0
- package/dist/kernel/mcp.js +25 -0
- package/dist/kernel/media.d.ts +27 -0
- package/dist/kernel/media.js +216 -0
- package/dist/kernel/paging.d.ts +55 -0
- package/dist/kernel/paging.js +95 -0
- package/dist/kernel/publishing.d.ts +4 -0
- package/dist/kernel/publishing.js +16 -0
- package/dist/{cloudflare/r2Media.d.ts → kernel/r2-media.d.ts} +4 -5
- package/dist/kernel/r2-media.js +78 -0
- package/dist/kernel/rest-dispatch.js +38 -0
- package/dist/kernel/rest-router.js +63 -0
- package/dist/kernel/rest.d.ts +58 -0
- package/dist/kernel/rest.js +41 -0
- package/dist/kernel/scalars.d.ts +6 -0
- package/dist/kernel/scalars.js +43 -0
- package/dist/kernel/search.js +5 -0
- package/dist/{core/site.d.ts → kernel/site-types.d.ts} +38 -9
- package/dist/kernel/site-types.js +1 -0
- package/dist/kernel/site.d.ts +41 -0
- package/dist/kernel/site.js +32 -0
- package/dist/kernel/store.d.ts +165 -0
- package/dist/kernel/store.js +257 -0
- package/dist/kernel/surface.d.ts +10 -0
- package/dist/kernel/surface.js +19 -0
- package/dist/kernel/sweep.d.ts +17 -0
- package/dist/kernel/sweep.js +27 -0
- package/dist/kernel/translations.d.ts +1 -0
- package/dist/kernel/translations.js +13 -0
- package/dist/kernel/user-caller.d.ts +31 -0
- package/dist/kernel/user-caller.js +67 -0
- package/dist/kernel/user-field-name.js +3 -0
- package/dist/kernel/user-fields.d.ts +34 -0
- package/dist/kernel/user-fields.js +71 -0
- package/dist/kernel/validation.d.ts +15 -0
- package/dist/kernel/validation.js +54 -0
- package/dist/kernel/web-gateway.js +68 -0
- package/dist/kernel/web-head.js +15 -0
- package/dist/kernel/web-response.js +8 -0
- package/dist/kernel/web.d.ts +75 -0
- package/dist/kernel/web.js +155 -0
- package/dist/kernel/where.js +27 -0
- package/dist/testing/index.d.ts +1 -37
- package/dist/testing/index.js +1 -43
- package/dist/usecase/adminBindings.js +142 -0
- package/dist/usecase/adminDescriptors.js +153 -0
- package/dist/usecase/generate.js +164 -0
- package/dist/usecase/handlers.js +21 -0
- package/dist/usecase/mcp-media.js +17 -0
- package/dist/usecase/mcp.js +96 -0
- package/dist/usecase/paging.js +72 -0
- package/dist/usecase/publishing.js +63 -0
- package/dist/usecase/refusals.js +27 -0
- package/dist/usecase/rest.js +54 -0
- package/dist/usecase/search.js +7 -0
- package/dist/usecase/site.js +40 -0
- package/dist/usecase/stores.js +62 -0
- package/dist/usecase/translations.js +78 -0
- package/dist/usecase/ttl.js +20 -0
- package/dist/usecase/validation.js +132 -0
- package/dist/usecase/web.js +22 -0
- package/docs/examples/README.md +31 -16
- package/docs/examples/app-shell/README.md +48 -0
- package/docs/examples/app-shell/package.json +34 -0
- package/docs/examples/app-shell/pnpm-workspace.yaml +8 -0
- package/docs/examples/app-shell/smoke-kit.mjs +100 -0
- package/docs/examples/app-shell/src/admin.ts +10 -0
- package/docs/examples/app-shell/src/auth.ts +55 -0
- package/docs/examples/app-shell/src/handlers.ts +5 -0
- package/docs/examples/app-shell/src/index.ts +4 -0
- package/docs/examples/app-shell/src/routes.ts +13 -0
- package/docs/examples/app-shell/src/schedule.ts +8 -0
- package/docs/examples/app-shell/src/service.ts +70 -0
- package/docs/examples/app-shell/src/sign-in.ts +41 -0
- package/docs/examples/app-shell/src/signup.ts +8 -0
- package/docs/examples/{reference-service → app-shell}/tsconfig.json +2 -1
- package/docs/examples/app-shell/worker-configuration.d.ts +22 -0
- package/docs/examples/app-shell/wrangler.jsonc +61 -0
- package/docs/examples/club-events/README.md +60 -0
- package/docs/examples/club-events/manifests/club-events.yaml +225 -0
- package/docs/examples/club-events/smoke.mjs +121 -0
- package/docs/examples/club-events/src/handlers.ts +25 -0
- package/docs/examples/club-events/src/signup.ts +9 -0
- package/docs/examples/generated-web/README.md +74 -0
- package/docs/examples/generated-web/posts.yaml +38 -0
- package/docs/examples/generated-web/seed.sql +6 -0
- package/docs/examples/generated-web/src/worker.ts +43 -0
- package/docs/examples/generated-web/tsconfig.json +8 -0
- package/docs/examples/generated-web/wrangler.jsonc +7 -0
- package/docs/examples/purchasing/.dev.vars.example +6 -0
- package/docs/examples/purchasing/README.md +90 -0
- package/docs/examples/purchasing/manifests/purchasing.yaml +341 -0
- package/docs/examples/purchasing/seed.sql +4 -0
- package/docs/examples/purchasing/smoke.mjs +171 -0
- package/docs/examples/purchasing/src/admin.ts +12 -0
- package/docs/examples/purchasing/src/handlers.ts +33 -0
- package/docs/examples/purchasing/src/notify.ts +29 -0
- package/docs/examples/purchasing/src/requests-page.ts +57 -0
- package/docs/examples/purchasing/src/routes.ts +53 -0
- package/docs/examples/purchasing/src/schedule.ts +31 -0
- package/docs/examples/purchasing/src/signup.ts +5 -0
- package/docs/examples/purchasing/src/supplier.ts +32 -0
- package/docs/examples/purchasing/wrangler.jsonc +68 -0
- package/docs/examples/recipes/README.md +58 -0
- package/docs/examples/recipes/manifests/recipes.yaml +75 -0
- package/docs/examples/recipes/smoke.mjs +102 -0
- package/docs/examples/recipes/src/media.ts +13 -0
- package/docs/examples/recipes/src/pages.ts +99 -0
- package/docs/examples/recipes/src/routes.ts +71 -0
- package/docs/examples/recipes/src/site-config.ts +12 -0
- package/docs/examples/recipes/wrangler.jsonc +73 -0
- package/docs/handbook/cloudflare/authentication.md +142 -212
- package/docs/handbook/cloudflare/chatgpt-sites.md +4 -113
- package/docs/handbook/cloudflare/deploy-and-operate.md +20 -106
- package/docs/handbook/cloudflare/media-r2.md +62 -133
- package/docs/handbook/cloudflare/service-entry.md +180 -116
- package/docs/handbook/concepts/authorization.md +10 -123
- package/docs/handbook/concepts/four-atoms.md +9 -92
- package/docs/handbook/concepts/lifecycle-and-locales.md +9 -80
- package/docs/handbook/concepts/mcp-and-agents.md +10 -141
- package/docs/handbook/concepts/procedures-and-triggers.md +5 -162
- package/docs/handbook/concepts/runtime-and-adapters.md +15 -224
- package/docs/handbook/concepts/views.md +10 -109
- package/docs/handbook/examples/hub.md +2 -18
- package/docs/handbook/guides/adapter-guide.md +11 -0
- package/docs/handbook/guides/admin-extensions.md +12 -183
- package/docs/handbook/guides/admin-ui.md +5 -164
- package/docs/handbook/guides/agent-setup.md +5 -18
- package/docs/handbook/guides/email.md +86 -0
- package/docs/handbook/guides/mcp-apps.md +44 -0
- package/docs/handbook/guides/native-admin.md +298 -0
- package/docs/handbook/guides/native-execution.md +132 -0
- package/docs/handbook/guides/oauth.md +105 -0
- package/docs/handbook/guides/postgres-adapters.md +56 -0
- package/docs/handbook/guides/public-pages.md +53 -0
- package/docs/handbook/guides/size-and-startup.md +9 -0
- package/docs/handbook/guides/typed-queries.md +39 -102
- package/docs/handbook/navigation.json +164 -31
- package/docs/handbook/reference/admin-descriptors.md +88 -0
- package/docs/handbook/reference/authorization.md +44 -52
- package/docs/handbook/reference/describe.md +56 -0
- package/docs/handbook/reference/diagnostics.md +15 -79
- package/docs/handbook/reference/features.md +45 -53
- package/docs/handbook/reference/manifest.md +6 -69
- package/docs/handbook/reference/procedure.md +9 -118
- package/docs/handbook/reference/schema.md +75 -185
- package/docs/handbook/reference/site-config.md +5 -65
- package/docs/handbook/reference/surface.md +279 -97
- package/docs/handbook/reference/trigger.md +24 -93
- package/docs/handbook/reference/view.md +32 -160
- package/docs/handbook/releases/index.md +48 -13
- package/docs/handbook/start/overview.md +9 -56
- package/docs/handbook/start/project-and-cli.md +40 -149
- package/docs/handbook/start/quickstart-worker.md +38 -116
- package/docs/skills/develop/SKILL.md +34 -123
- package/docs/skills/develop/mcp-app.md +37 -77
- package/docs/skills/integrate/SKILL.md +42 -84
- package/docs/skills/media-gc/SKILL.md +14 -3
- package/docs/skills/provision/SKILL.md +25 -91
- package/docs/skills/update/SKILL.md +19 -43
- package/docs/source/scripts/postgres-adapter.ts +101 -0
- package/docs/upgrade-0.1-to-0.2.md +25 -9
- package/package.json +96 -112
- package/skills/.keep +0 -0
- package/skills/README.md +72 -0
- package/skills/mantle/SKILL.md +135 -0
- package/skills/mantle/references/local-testing.md +11 -0
- package/skills/mantle/references/web.md +41 -0
- package/skills/mantle/references/website.md +47 -0
- package/dist/admin/consent.d.ts +0 -17
- package/dist/admin/consent.d.ts.map +0 -1
- package/dist/admin/consent.js +0 -17
- package/dist/admin/consent.js.map +0 -1
- package/dist/admin/createAdminSurface.d.ts +0 -25
- package/dist/admin/createAdminSurface.d.ts.map +0 -1
- package/dist/admin/createAdminSurface.js +0 -635
- package/dist/admin/createAdminSurface.js.map +0 -1
- package/dist/admin/design.d.ts +0 -7
- package/dist/admin/design.d.ts.map +0 -1
- package/dist/admin/design.js +0 -18
- package/dist/admin/design.js.map +0 -1
- package/dist/admin/developerConsole.d.ts +0 -267
- package/dist/admin/developerConsole.d.ts.map +0 -1
- package/dist/admin/developerConsole.js +0 -136
- package/dist/admin/developerConsole.js.map +0 -1
- package/dist/admin/extensions.d.ts +0 -290
- package/dist/admin/extensions.d.ts.map +0 -1
- package/dist/admin/extensions.js +0 -532
- package/dist/admin/extensions.js.map +0 -1
- package/dist/admin/identity.d.ts +0 -62
- package/dist/admin/identity.d.ts.map +0 -1
- package/dist/admin/identity.js +0 -7
- package/dist/admin/identity.js.map +0 -1
- package/dist/admin/index.d.ts +0 -7
- package/dist/admin/index.d.ts.map +0 -1
- package/dist/admin/index.js +0 -7
- package/dist/admin/index.js.map +0 -1
- package/dist/admin/procedureFlow.d.ts +0 -38
- package/dist/admin/procedureFlow.d.ts.map +0 -1
- package/dist/admin/procedureFlow.js +0 -188
- package/dist/admin/procedureFlow.js.map +0 -1
- package/dist/auth/ConsoleEmailSender.d.ts +0 -15
- package/dist/auth/ConsoleEmailSender.d.ts.map +0 -1
- package/dist/auth/ConsoleEmailSender.js +0 -19
- package/dist/auth/ConsoleEmailSender.js.map +0 -1
- package/dist/auth/appleClientSecret.d.ts +0 -75
- package/dist/auth/appleClientSecret.d.ts.map +0 -1
- package/dist/auth/appleClientSecret.js +0 -116
- package/dist/auth/appleClientSecret.js.map +0 -1
- package/dist/auth/buildAuth.d.ts +0 -4568
- package/dist/auth/buildAuth.d.ts.map +0 -1
- package/dist/auth/buildAuth.js +0 -312
- package/dist/auth/buildAuth.js.map +0 -1
- package/dist/auth/callerResolver.d.ts +0 -52
- package/dist/auth/callerResolver.d.ts.map +0 -1
- package/dist/auth/callerResolver.js +0 -52
- package/dist/auth/callerResolver.js.map +0 -1
- package/dist/auth/createAuthRoutes.d.ts +0 -22
- package/dist/auth/createAuthRoutes.d.ts.map +0 -1
- package/dist/auth/createAuthRoutes.js.map +0 -1
- package/dist/auth/createMantleAuth.d.ts +0 -3
- package/dist/auth/createMantleAuth.d.ts.map +0 -1
- package/dist/auth/createMantleAuth.js +0 -504
- package/dist/auth/createMantleAuth.js.map +0 -1
- package/dist/auth/db.d.ts +0 -18
- package/dist/auth/db.d.ts.map +0 -1
- package/dist/auth/db.js +0 -27
- package/dist/auth/db.js.map +0 -1
- package/dist/auth/emailTemplates.d.ts +0 -7
- package/dist/auth/emailTemplates.d.ts.map +0 -1
- package/dist/auth/emailTemplates.js.map +0 -1
- package/dist/auth/index.d.ts +0 -9
- package/dist/auth/index.d.ts.map +0 -1
- package/dist/auth/index.js +0 -7
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/methods.d.ts +0 -717
- package/dist/auth/methods.d.ts.map +0 -1
- package/dist/auth/methods.js +0 -321
- package/dist/auth/methods.js.map +0 -1
- package/dist/auth/oauthTokens.d.ts +0 -24
- package/dist/auth/oauthTokens.d.ts.map +0 -1
- package/dist/auth/oauthTokens.js +0 -146
- package/dist/auth/oauthTokens.js.map +0 -1
- package/dist/auth/setupIncomplete.d.ts +0 -16
- package/dist/auth/setupIncomplete.d.ts.map +0 -1
- package/dist/auth/setupIncomplete.js +0 -50
- package/dist/auth/setupIncomplete.js.map +0 -1
- package/dist/auth/types.d.ts +0 -440
- package/dist/auth/types.d.ts.map +0 -1
- package/dist/auth/types.js +0 -10
- package/dist/auth/types.js.map +0 -1
- package/dist/bun/index.d.ts +0 -21
- package/dist/bun/index.d.ts.map +0 -1
- package/dist/bun/index.js +0 -46
- package/dist/bun/index.js.map +0 -1
- package/dist/cli/emitModule.d.ts +0 -7
- package/dist/cli/emitModule.d.ts.map +0 -1
- package/dist/cli/emitModule.js +0 -127
- package/dist/cli/emitModule.js.map +0 -1
- package/dist/cli/generate.d.ts +0 -8
- package/dist/cli/generate.d.ts.map +0 -1
- package/dist/cli/generate.js +0 -391
- package/dist/cli/generate.js.map +0 -1
- package/dist/cli/main.d.ts +0 -3
- package/dist/cli/main.d.ts.map +0 -1
- package/dist/cli/main.js +0 -21
- package/dist/cli/main.js.map +0 -1
- package/dist/cli/preset.d.ts +0 -18
- package/dist/cli/preset.d.ts.map +0 -1
- package/dist/cli/preset.js +0 -405
- package/dist/cli/preset.js.map +0 -1
- package/dist/cloudflare/index.d.ts +0 -25
- package/dist/cloudflare/index.d.ts.map +0 -1
- package/dist/cloudflare/index.js +0 -16
- package/dist/cloudflare/index.js.map +0 -1
- package/dist/cloudflare/r2Media.d.ts.map +0 -1
- package/dist/cloudflare/r2Media.js +0 -69
- package/dist/cloudflare/r2Media.js.map +0 -1
- package/dist/core/caller.d.ts +0 -35
- package/dist/core/caller.d.ts.map +0 -1
- package/dist/core/caller.js +0 -3
- package/dist/core/caller.js.map +0 -1
- package/dist/core/createMantle.d.ts +0 -22
- package/dist/core/createMantle.d.ts.map +0 -1
- package/dist/core/createMantle.js +0 -117
- package/dist/core/createMantle.js.map +0 -1
- package/dist/core/dialect.d.ts +0 -53
- package/dist/core/dialect.d.ts.map +0 -1
- package/dist/core/dialect.js +0 -7
- package/dist/core/dialect.js.map +0 -1
- package/dist/core/driver.d.ts +0 -24
- package/dist/core/driver.d.ts.map +0 -1
- package/dist/core/driver.js +0 -2
- package/dist/core/driver.js.map +0 -1
- package/dist/core/email.d.ts +0 -17
- package/dist/core/email.d.ts.map +0 -1
- package/dist/core/email.js +0 -2
- package/dist/core/email.js.map +0 -1
- package/dist/core/index.d.ts +0 -16
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -16
- package/dist/core/index.js.map +0 -1
- package/dist/core/invocation.d.ts +0 -66
- package/dist/core/invocation.d.ts.map +0 -1
- package/dist/core/invocation.js +0 -3
- package/dist/core/invocation.js.map +0 -1
- package/dist/core/observation.d.ts +0 -3
- package/dist/core/observation.d.ts.map +0 -1
- package/dist/core/observation.js +0 -10
- package/dist/core/observation.js.map +0 -1
- package/dist/core/runtime/auth.d.ts +0 -9
- package/dist/core/runtime/auth.d.ts.map +0 -1
- package/dist/core/runtime/auth.js +0 -39
- package/dist/core/runtime/auth.js.map +0 -1
- package/dist/core/runtime/createRuntime.d.ts +0 -23
- package/dist/core/runtime/createRuntime.d.ts.map +0 -1
- package/dist/core/runtime/createRuntime.js +0 -214
- package/dist/core/runtime/createRuntime.js.map +0 -1
- package/dist/core/runtime/verifyPlan.d.ts +0 -34
- package/dist/core/runtime/verifyPlan.d.ts.map +0 -1
- package/dist/core/runtime/verifyPlan.js +0 -301
- package/dist/core/runtime/verifyPlan.js.map +0 -1
- package/dist/core/service.d.ts +0 -45
- package/dist/core/service.d.ts.map +0 -1
- package/dist/core/service.js +0 -2
- package/dist/core/service.js.map +0 -1
- package/dist/core/sessionUser.d.ts +0 -14
- package/dist/core/sessionUser.d.ts.map +0 -1
- package/dist/core/sessionUser.js +0 -4
- package/dist/core/sessionUser.js.map +0 -1
- package/dist/core/site.d.ts.map +0 -1
- package/dist/core/site.js +0 -2
- package/dist/core/site.js.map +0 -1
- package/dist/core/siteConfig.d.ts +0 -5
- package/dist/core/siteConfig.d.ts.map +0 -1
- package/dist/core/siteConfig.js +0 -24
- package/dist/core/siteConfig.js.map +0 -1
- package/dist/core/sql/allowlist.d.ts +0 -67
- package/dist/core/sql/allowlist.d.ts.map +0 -1
- package/dist/core/sql/allowlist.js +0 -737
- package/dist/core/sql/allowlist.js.map +0 -1
- package/dist/core/sql/ast.d.ts +0 -24
- package/dist/core/sql/ast.d.ts.map +0 -1
- package/dist/core/sql/ast.js +0 -32
- package/dist/core/sql/ast.js.map +0 -1
- package/dist/core/sql/compile.d.ts +0 -50
- package/dist/core/sql/compile.d.ts.map +0 -1
- package/dist/core/sql/compile.js +0 -48
- package/dist/core/sql/compile.js.map +0 -1
- package/dist/core/sql/policy.d.ts +0 -123
- package/dist/core/sql/policy.d.ts.map +0 -1
- package/dist/core/sql/policy.js +0 -398
- package/dist/core/sql/policy.js.map +0 -1
- package/dist/core/sql/positions.d.ts +0 -30
- package/dist/core/sql/positions.d.ts.map +0 -1
- package/dist/core/sql/positions.js +0 -22
- package/dist/core/sql/positions.js.map +0 -1
- package/dist/core/sql/run.d.ts +0 -68
- package/dist/core/sql/run.d.ts.map +0 -1
- package/dist/core/sql/run.js +0 -384
- package/dist/core/sql/run.js.map +0 -1
- package/dist/core/store/createStore.d.ts +0 -49
- package/dist/core/store/createStore.d.ts.map +0 -1
- package/dist/core/store/createStore.js +0 -227
- package/dist/core/store/createStore.js.map +0 -1
- package/dist/core/store/cursor.d.ts +0 -4
- package/dist/core/store/cursor.d.ts.map +0 -1
- package/dist/core/store/cursor.js +0 -22
- package/dist/core/store/cursor.js.map +0 -1
- package/dist/core/store/json.d.ts +0 -80
- package/dist/core/store/json.d.ts.map +0 -1
- package/dist/core/store/json.js +0 -342
- package/dist/core/store/json.js.map +0 -1
- package/dist/core/store.d.ts +0 -160
- package/dist/core/store.d.ts.map +0 -1
- package/dist/core/store.js +0 -2
- package/dist/core/store.js.map +0 -1
- package/dist/core/wire.d.ts +0 -20
- package/dist/core/wire.d.ts.map +0 -1
- package/dist/core/wire.js +0 -84
- package/dist/core/wire.js.map +0 -1
- package/dist/core/withCaller.d.ts +0 -24
- package/dist/core/withCaller.d.ts.map +0 -1
- package/dist/core/withCaller.js +0 -35
- package/dist/core/withCaller.js.map +0 -1
- package/dist/d1/adapter.d.ts +0 -12
- package/dist/d1/adapter.d.ts.map +0 -1
- package/dist/d1/adapter.js +0 -23
- package/dist/d1/adapter.js.map +0 -1
- package/dist/d1/codec.d.ts +0 -14
- package/dist/d1/codec.d.ts.map +0 -1
- package/dist/d1/codec.js +0 -136
- package/dist/d1/codec.js.map +0 -1
- package/dist/d1/compile/index.d.ts +0 -9
- package/dist/d1/compile/index.d.ts.map +0 -1
- package/dist/d1/compile/index.js +0 -9
- package/dist/d1/compile/index.js.map +0 -1
- package/dist/d1/dialect.d.ts +0 -4
- package/dist/d1/dialect.d.ts.map +0 -1
- package/dist/d1/dialect.js +0 -13
- package/dist/d1/dialect.js.map +0 -1
- package/dist/d1/executor.d.ts +0 -15
- package/dist/d1/executor.d.ts.map +0 -1
- package/dist/d1/executor.js +0 -96
- package/dist/d1/executor.js.map +0 -1
- package/dist/d1/index.d.ts +0 -6
- package/dist/d1/index.d.ts.map +0 -1
- package/dist/d1/index.js +0 -6
- package/dist/d1/index.js.map +0 -1
- package/dist/d1/lower.d.ts +0 -8
- package/dist/d1/lower.d.ts.map +0 -1
- package/dist/d1/lower.js +0 -167
- package/dist/d1/lower.js.map +0 -1
- package/dist/d1/media.d.ts +0 -5
- package/dist/d1/media.d.ts.map +0 -1
- package/dist/d1/media.js +0 -157
- package/dist/d1/media.js.map +0 -1
- package/dist/d1/migrations.d.ts +0 -12
- package/dist/d1/migrations.d.ts.map +0 -1
- package/dist/d1/migrations.js +0 -111
- package/dist/d1/migrations.js.map +0 -1
- package/dist/d1/print.d.ts +0 -28
- package/dist/d1/print.d.ts.map +0 -1
- package/dist/d1/print.js +0 -54
- package/dist/d1/print.js.map +0 -1
- package/dist/d1/site.d.ts +0 -17
- package/dist/d1/site.d.ts.map +0 -1
- package/dist/d1/site.js +0 -63
- package/dist/d1/site.js.map +0 -1
- package/dist/d1/storage.d.ts +0 -34
- package/dist/d1/storage.d.ts.map +0 -1
- package/dist/d1/storage.js +0 -288
- package/dist/d1/storage.js.map +0 -1
- package/dist/d1/tz.d.ts +0 -21
- package/dist/d1/tz.d.ts.map +0 -1
- package/dist/d1/tz.js +0 -54
- package/dist/d1/tz.js.map +0 -1
- package/dist/d1/validator.d.ts +0 -10
- package/dist/d1/validator.d.ts.map +0 -1
- package/dist/d1/validator.js +0 -33
- package/dist/d1/validator.js.map +0 -1
- package/dist/mcp/apps.d.ts +0 -43
- package/dist/mcp/apps.d.ts.map +0 -1
- package/dist/mcp/apps.js +0 -57
- package/dist/mcp/apps.js.map +0 -1
- package/dist/mcp/catalog.d.ts +0 -55
- package/dist/mcp/catalog.d.ts.map +0 -1
- package/dist/mcp/catalog.js +0 -81
- package/dist/mcp/catalog.js.map +0 -1
- package/dist/mcp/createMcpSurface.d.ts +0 -60
- package/dist/mcp/createMcpSurface.d.ts.map +0 -1
- package/dist/mcp/createMcpSurface.js +0 -182
- package/dist/mcp/createMcpSurface.js.map +0 -1
- package/dist/mcp/index.d.ts +0 -4
- package/dist/mcp/index.d.ts.map +0 -1
- package/dist/mcp/index.js +0 -4
- package/dist/mcp/index.js.map +0 -1
- package/dist/mcp/media.d.ts +0 -9
- package/dist/mcp/media.d.ts.map +0 -1
- package/dist/mcp/media.js +0 -33
- package/dist/mcp/media.js.map +0 -1
- package/dist/postgres/adapter.d.ts +0 -23
- package/dist/postgres/adapter.d.ts.map +0 -1
- package/dist/postgres/adapter.js +0 -50
- package/dist/postgres/adapter.js.map +0 -1
- package/dist/postgres/codec.d.ts +0 -13
- package/dist/postgres/codec.d.ts.map +0 -1
- package/dist/postgres/codec.js +0 -110
- package/dist/postgres/codec.js.map +0 -1
- package/dist/postgres/compile/index.d.ts +0 -9
- package/dist/postgres/compile/index.d.ts.map +0 -1
- package/dist/postgres/compile/index.js +0 -9
- package/dist/postgres/compile/index.js.map +0 -1
- package/dist/postgres/driver.d.ts +0 -109
- package/dist/postgres/driver.d.ts.map +0 -1
- package/dist/postgres/driver.js +0 -186
- package/dist/postgres/driver.js.map +0 -1
- package/dist/postgres/executor.d.ts +0 -28
- package/dist/postgres/executor.d.ts.map +0 -1
- package/dist/postgres/executor.js +0 -96
- package/dist/postgres/executor.js.map +0 -1
- package/dist/postgres/index.d.ts +0 -8
- package/dist/postgres/index.d.ts.map +0 -1
- package/dist/postgres/index.js +0 -8
- package/dist/postgres/index.js.map +0 -1
- package/dist/postgres/lower.d.ts +0 -6
- package/dist/postgres/lower.d.ts.map +0 -1
- package/dist/postgres/lower.js +0 -152
- package/dist/postgres/lower.js.map +0 -1
- package/dist/postgres/print.d.ts +0 -11
- package/dist/postgres/print.d.ts.map +0 -1
- package/dist/postgres/print.js +0 -108
- package/dist/postgres/print.js.map +0 -1
- package/dist/postgres/session.d.ts +0 -9
- package/dist/postgres/session.d.ts.map +0 -1
- package/dist/postgres/session.js +0 -111
- package/dist/postgres/session.js.map +0 -1
- package/dist/postgres/storage.d.ts +0 -32
- package/dist/postgres/storage.d.ts.map +0 -1
- package/dist/postgres/storage.js +0 -283
- package/dist/postgres/storage.js.map +0 -1
- package/dist/postgres/validator.d.ts +0 -13
- package/dist/postgres/validator.d.ts.map +0 -1
- package/dist/postgres/validator.js +0 -53
- package/dist/postgres/validator.js.map +0 -1
- package/dist/spec/domain/index.d.ts +0 -3
- package/dist/spec/domain/index.d.ts.map +0 -1
- package/dist/spec/domain/index.js +0 -3
- package/dist/spec/domain/index.js.map +0 -1
- package/dist/spec/domain/model/ContentState.d.ts +0 -8
- package/dist/spec/domain/model/ContentState.d.ts.map +0 -1
- package/dist/spec/domain/model/ContentState.js +0 -7
- package/dist/spec/domain/model/ContentState.js.map +0 -1
- package/dist/spec/domain/model/Entry.d.ts +0 -29
- package/dist/spec/domain/model/Entry.d.ts.map +0 -1
- package/dist/spec/domain/model/Entry.js +0 -16
- package/dist/spec/domain/model/Entry.js.map +0 -1
- package/dist/spec/domain/model/Locale.d.ts +0 -30
- package/dist/spec/domain/model/Locale.d.ts.map +0 -1
- package/dist/spec/domain/model/Locale.js +0 -33
- package/dist/spec/domain/model/Locale.js.map +0 -1
- package/dist/spec/domain/model/ManifestGrammar.d.ts.map +0 -1
- package/dist/spec/domain/model/ManifestGrammar.js +0 -153
- package/dist/spec/domain/model/ManifestGrammar.js.map +0 -1
- package/dist/spec/domain/model/MediaMimeAccept.d.ts +0 -55
- package/dist/spec/domain/model/MediaMimeAccept.d.ts.map +0 -1
- package/dist/spec/domain/model/MediaMimeAccept.js +0 -90
- package/dist/spec/domain/model/MediaMimeAccept.js.map +0 -1
- package/dist/spec/domain/model/RuntimePlan.d.ts.map +0 -1
- package/dist/spec/domain/model/RuntimePlan.js +0 -4
- package/dist/spec/domain/model/RuntimePlan.js.map +0 -1
- package/dist/spec/domain/model/SiteConfig.d.ts +0 -173
- package/dist/spec/domain/model/SiteConfig.d.ts.map +0 -1
- package/dist/spec/domain/model/SiteConfig.js +0 -13
- package/dist/spec/domain/model/SiteConfig.js.map +0 -1
- package/dist/spec/domain/model/SqlIr.d.ts.map +0 -1
- package/dist/spec/domain/model/SqlIr.js +0 -95
- package/dist/spec/domain/model/SqlIr.js.map +0 -1
- package/dist/spec/domain/model/index.d.ts +0 -14
- package/dist/spec/domain/model/index.d.ts.map +0 -1
- package/dist/spec/domain/model/index.js +0 -14
- package/dist/spec/domain/model/index.js.map +0 -1
- package/dist/spec/domain/service/CloudflareCron.d.ts.map +0 -1
- package/dist/spec/domain/service/CloudflareCron.js.map +0 -1
- package/dist/spec/domain/service/CrossSchemaChecker.d.ts +0 -34
- package/dist/spec/domain/service/CrossSchemaChecker.d.ts.map +0 -1
- package/dist/spec/domain/service/CrossSchemaChecker.js +0 -114
- package/dist/spec/domain/service/CrossSchemaChecker.js.map +0 -1
- package/dist/spec/domain/service/EntryDataValidator.d.ts +0 -56
- package/dist/spec/domain/service/EntryDataValidator.d.ts.map +0 -1
- package/dist/spec/domain/service/EntryDataValidator.js +0 -88
- package/dist/spec/domain/service/EntryDataValidator.js.map +0 -1
- package/dist/spec/domain/service/JsonSchemaToZod.d.ts +0 -29
- package/dist/spec/domain/service/JsonSchemaToZod.d.ts.map +0 -1
- package/dist/spec/domain/service/JsonSchemaToZod.js +0 -156
- package/dist/spec/domain/service/JsonSchemaToZod.js.map +0 -1
- package/dist/spec/domain/service/LifecycleStateMachine.d.ts +0 -75
- package/dist/spec/domain/service/LifecycleStateMachine.d.ts.map +0 -1
- package/dist/spec/domain/service/LifecycleStateMachine.js +0 -76
- package/dist/spec/domain/service/LifecycleStateMachine.js.map +0 -1
- package/dist/spec/domain/service/LocaleCanonicalizer.d.ts +0 -29
- package/dist/spec/domain/service/LocaleCanonicalizer.d.ts.map +0 -1
- package/dist/spec/domain/service/LocaleCanonicalizer.js +0 -96
- package/dist/spec/domain/service/LocaleCanonicalizer.js.map +0 -1
- package/dist/spec/domain/service/ManifestFieldChecks.d.ts +0 -60
- package/dist/spec/domain/service/ManifestFieldChecks.d.ts.map +0 -1
- package/dist/spec/domain/service/ManifestFieldChecks.js +0 -116
- package/dist/spec/domain/service/ManifestFieldChecks.js.map +0 -1
- package/dist/spec/domain/service/ManifestGraphValidator.d.ts +0 -15
- package/dist/spec/domain/service/ManifestGraphValidator.d.ts.map +0 -1
- package/dist/spec/domain/service/ManifestGraphValidator.js +0 -225
- package/dist/spec/domain/service/ManifestGraphValidator.js.map +0 -1
- package/dist/spec/domain/service/ManifestLinker.d.ts +0 -45
- package/dist/spec/domain/service/ManifestLinker.d.ts.map +0 -1
- package/dist/spec/domain/service/ManifestLinker.js +0 -92
- package/dist/spec/domain/service/ManifestLinker.js.map +0 -1
- package/dist/spec/domain/service/ManifestLocaleTrimmer.d.ts +0 -16
- package/dist/spec/domain/service/ManifestLocaleTrimmer.d.ts.map +0 -1
- package/dist/spec/domain/service/ManifestLocaleTrimmer.js +0 -76
- package/dist/spec/domain/service/ManifestLocaleTrimmer.js.map +0 -1
- package/dist/spec/domain/service/ManifestParser.d.ts +0 -49
- package/dist/spec/domain/service/ManifestParser.d.ts.map +0 -1
- package/dist/spec/domain/service/ManifestParser.js +0 -203
- package/dist/spec/domain/service/ManifestParser.js.map +0 -1
- package/dist/spec/domain/service/ManifestPartition.d.ts +0 -9
- package/dist/spec/domain/service/ManifestPartition.d.ts.map +0 -1
- package/dist/spec/domain/service/ManifestPartition.js +0 -19
- package/dist/spec/domain/service/ManifestPartition.js.map +0 -1
- package/dist/spec/domain/service/ManifestPathDiagnoser.d.ts +0 -33
- package/dist/spec/domain/service/ManifestPathDiagnoser.d.ts.map +0 -1
- package/dist/spec/domain/service/ManifestPathDiagnoser.js +0 -43
- package/dist/spec/domain/service/ManifestPathDiagnoser.js.map +0 -1
- package/dist/spec/domain/service/ManifestSourceSpans.d.ts +0 -10
- package/dist/spec/domain/service/ManifestSourceSpans.d.ts.map +0 -1
- package/dist/spec/domain/service/ManifestSourceSpans.js +0 -76
- package/dist/spec/domain/service/ManifestSourceSpans.js.map +0 -1
- package/dist/spec/domain/service/McpToolNaming.d.ts +0 -25
- package/dist/spec/domain/service/McpToolNaming.d.ts.map +0 -1
- package/dist/spec/domain/service/McpToolNaming.js +0 -50
- package/dist/spec/domain/service/McpToolNaming.js.map +0 -1
- package/dist/spec/domain/service/PlanFingerprint.d.ts.map +0 -1
- package/dist/spec/domain/service/PlanFingerprint.js +0 -14
- package/dist/spec/domain/service/PlanFingerprint.js.map +0 -1
- package/dist/spec/domain/service/ProcedureViewSpecChecks.d.ts +0 -4
- package/dist/spec/domain/service/ProcedureViewSpecChecks.d.ts.map +0 -1
- package/dist/spec/domain/service/ProcedureViewSpecChecks.js +0 -211
- package/dist/spec/domain/service/ProcedureViewSpecChecks.js.map +0 -1
- package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts +0 -44
- package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts.map +0 -1
- package/dist/spec/domain/service/SchemaAdminUiChecker.js +0 -333
- package/dist/spec/domain/service/SchemaAdminUiChecker.js.map +0 -1
- package/dist/spec/domain/service/SchemaIndexChecker.d.ts +0 -33
- package/dist/spec/domain/service/SchemaIndexChecker.d.ts.map +0 -1
- package/dist/spec/domain/service/SchemaIndexChecker.js +0 -256
- package/dist/spec/domain/service/SchemaIndexChecker.js.map +0 -1
- package/dist/spec/domain/service/SchemaSearchChecker.d.ts +0 -11
- package/dist/spec/domain/service/SchemaSearchChecker.d.ts.map +0 -1
- package/dist/spec/domain/service/SchemaSearchChecker.js +0 -78
- package/dist/spec/domain/service/SchemaSearchChecker.js.map +0 -1
- package/dist/spec/domain/service/SchemaSpecChecks.d.ts +0 -31
- package/dist/spec/domain/service/SchemaSpecChecks.d.ts.map +0 -1
- package/dist/spec/domain/service/SchemaSpecChecks.js +0 -445
- package/dist/spec/domain/service/SchemaSpecChecks.js.map +0 -1
- package/dist/spec/domain/service/SiteDefaultsValidator.d.ts +0 -39
- package/dist/spec/domain/service/SiteDefaultsValidator.d.ts.map +0 -1
- package/dist/spec/domain/service/SiteDefaultsValidator.js +0 -194
- package/dist/spec/domain/service/SiteDefaultsValidator.js.map +0 -1
- package/dist/spec/domain/service/SqlClassify.d.ts +0 -19
- package/dist/spec/domain/service/SqlClassify.d.ts.map +0 -1
- package/dist/spec/domain/service/SqlClassify.js +0 -42
- package/dist/spec/domain/service/SqlClassify.js.map +0 -1
- package/dist/spec/domain/service/SqlRefusal.d.ts +0 -16
- package/dist/spec/domain/service/SqlRefusal.d.ts.map +0 -1
- package/dist/spec/domain/service/SqlRefusal.js +0 -20
- package/dist/spec/domain/service/SqlRefusal.js.map +0 -1
- package/dist/spec/domain/service/SqlTypes.d.ts +0 -40
- package/dist/spec/domain/service/SqlTypes.d.ts.map +0 -1
- package/dist/spec/domain/service/SqlTypes.js +0 -110
- package/dist/spec/domain/service/SqlTypes.js.map +0 -1
- package/dist/spec/domain/service/StaffRoleHierarchy.d.ts +0 -3
- package/dist/spec/domain/service/StaffRoleHierarchy.d.ts.map +0 -1
- package/dist/spec/domain/service/StaffRoleHierarchy.js +0 -19
- package/dist/spec/domain/service/StaffRoleHierarchy.js.map +0 -1
- package/dist/spec/domain/service/TriggerGraphChecks.d.ts +0 -16
- package/dist/spec/domain/service/TriggerGraphChecks.d.ts.map +0 -1
- package/dist/spec/domain/service/TriggerGraphChecks.js +0 -337
- package/dist/spec/domain/service/TriggerGraphChecks.js.map +0 -1
- package/dist/spec/domain/service/TriggerSpecChecks.d.ts +0 -4
- package/dist/spec/domain/service/TriggerSpecChecks.d.ts.map +0 -1
- package/dist/spec/domain/service/TriggerSpecChecks.js +0 -89
- package/dist/spec/domain/service/TriggerSpecChecks.js.map +0 -1
- package/dist/spec/domain/service/ValidatedAdminUiProjection.d.ts +0 -11
- package/dist/spec/domain/service/ValidatedAdminUiProjection.d.ts.map +0 -1
- package/dist/spec/domain/service/ValidatedAdminUiProjection.js +0 -26
- package/dist/spec/domain/service/ValidatedAdminUiProjection.js.map +0 -1
- package/dist/spec/domain/service/ViewAdminUiChecker.d.ts +0 -14
- package/dist/spec/domain/service/ViewAdminUiChecker.d.ts.map +0 -1
- package/dist/spec/domain/service/ViewAdminUiChecker.js +0 -58
- package/dist/spec/domain/service/ViewAdminUiChecker.js.map +0 -1
- package/dist/spec/domain/service/index.d.ts +0 -24
- package/dist/spec/domain/service/index.d.ts.map +0 -1
- package/dist/spec/domain/service/index.js +0 -24
- package/dist/spec/domain/service/index.js.map +0 -1
- package/dist/spec/index.d.ts +0 -10
- package/dist/spec/index.d.ts.map +0 -1
- package/dist/spec/index.js +0 -12
- package/dist/spec/index.js.map +0 -1
- package/dist/spec/infrastructure/cli/parseArgsError.d.ts +0 -16
- package/dist/spec/infrastructure/cli/parseArgsError.d.ts.map +0 -1
- package/dist/spec/infrastructure/cli/parseArgsError.js +0 -34
- package/dist/spec/infrastructure/cli/parseArgsError.js.map +0 -1
- package/dist/spec/infrastructure/index.d.ts +0 -2
- package/dist/spec/infrastructure/index.d.ts.map +0 -1
- package/dist/spec/infrastructure/index.js +0 -2
- package/dist/spec/infrastructure/index.js.map +0 -1
- package/dist/spec/infrastructure/sql/PgQueryParser.d.ts +0 -18
- package/dist/spec/infrastructure/sql/PgQueryParser.d.ts.map +0 -1
- package/dist/spec/infrastructure/sql/PgQueryParser.js +0 -17
- package/dist/spec/infrastructure/sql/PgQueryParser.js.map +0 -1
- package/dist/spec/infrastructure/sql/compilePlan.d.ts +0 -37
- package/dist/spec/infrastructure/sql/compilePlan.d.ts.map +0 -1
- package/dist/spec/infrastructure/sql/compilePlan.js +0 -287
- package/dist/spec/infrastructure/sql/compilePlan.js.map +0 -1
- package/dist/spec/infrastructure/sql/compileSql.d.ts +0 -35
- package/dist/spec/infrastructure/sql/compileSql.d.ts.map +0 -1
- package/dist/spec/infrastructure/sql/compileSql.js +0 -92
- package/dist/spec/infrastructure/sql/compileSql.js.map +0 -1
- package/dist/spec/infrastructure/sql/frontEnd.d.ts +0 -8
- package/dist/spec/infrastructure/sql/frontEnd.d.ts.map +0 -1
- package/dist/spec/infrastructure/sql/frontEnd.js +0 -100
- package/dist/spec/infrastructure/sql/frontEnd.js.map +0 -1
- package/dist/spec/infrastructure/sql/index.d.ts +0 -4
- package/dist/spec/infrastructure/sql/index.d.ts.map +0 -1
- package/dist/spec/infrastructure/sql/index.js +0 -4
- package/dist/spec/infrastructure/sql/index.js.map +0 -1
- package/dist/spec/kernel/diagnostic.d.ts.map +0 -1
- package/dist/spec/kernel/diagnostic.js +0 -301
- package/dist/spec/kernel/diagnostic.js.map +0 -1
- package/dist/spec/kernel/index.d.ts +0 -8
- package/dist/spec/kernel/index.d.ts.map +0 -1
- package/dist/spec/kernel/index.js +0 -8
- package/dist/spec/kernel/index.js.map +0 -1
- package/dist/spec/usecase/EmitTypes.d.ts +0 -22
- package/dist/spec/usecase/EmitTypes.d.ts.map +0 -1
- package/dist/spec/usecase/EmitTypes.js +0 -182
- package/dist/spec/usecase/EmitTypes.js.map +0 -1
- package/dist/spec/usecase/ValidateManifestsUseCase.d.ts +0 -8
- package/dist/spec/usecase/ValidateManifestsUseCase.d.ts.map +0 -1
- package/dist/spec/usecase/ValidateManifestsUseCase.js +0 -101
- package/dist/spec/usecase/ValidateManifestsUseCase.js.map +0 -1
- package/dist/spec/usecase/dto/ValidateManifestsRequest.d.ts +0 -27
- package/dist/spec/usecase/dto/ValidateManifestsRequest.d.ts.map +0 -1
- package/dist/spec/usecase/dto/ValidateManifestsRequest.js +0 -2
- package/dist/spec/usecase/dto/ValidateManifestsRequest.js.map +0 -1
- package/dist/spec/usecase/dto/ValidateManifestsResponse.d.ts +0 -14
- package/dist/spec/usecase/dto/ValidateManifestsResponse.d.ts.map +0 -1
- package/dist/spec/usecase/dto/ValidateManifestsResponse.js +0 -2
- package/dist/spec/usecase/dto/ValidateManifestsResponse.js.map +0 -1
- package/dist/spec/usecase/dto/index.d.ts +0 -3
- package/dist/spec/usecase/dto/index.d.ts.map +0 -1
- package/dist/spec/usecase/dto/index.js +0 -3
- package/dist/spec/usecase/dto/index.js.map +0 -1
- package/dist/spec/usecase/index.d.ts +0 -10
- package/dist/spec/usecase/index.d.ts.map +0 -1
- package/dist/spec/usecase/index.js +0 -10
- package/dist/spec/usecase/index.js.map +0 -1
- package/dist/testing/cases/before-hook.d.ts +0 -4
- package/dist/testing/cases/before-hook.d.ts.map +0 -1
- package/dist/testing/cases/before-hook.js +0 -71
- package/dist/testing/cases/before-hook.js.map +0 -1
- package/dist/testing/cases/corpus.d.ts +0 -14
- package/dist/testing/cases/corpus.d.ts.map +0 -1
- package/dist/testing/cases/corpus.js +0 -93
- package/dist/testing/cases/corpus.js.map +0 -1
- package/dist/testing/cases/policy.d.ts +0 -87
- package/dist/testing/cases/policy.d.ts.map +0 -1
- package/dist/testing/cases/policy.js +0 -143
- package/dist/testing/cases/policy.js.map +0 -1
- package/dist/testing/cases/printer.d.ts +0 -4
- package/dist/testing/cases/printer.d.ts.map +0 -1
- package/dist/testing/cases/printer.js +0 -34
- package/dist/testing/cases/printer.js.map +0 -1
- package/dist/testing/cases/report-view.d.ts +0 -5
- package/dist/testing/cases/report-view.d.ts.map +0 -1
- package/dist/testing/cases/report-view.js +0 -51
- package/dist/testing/cases/report-view.js.map +0 -1
- package/dist/testing/cases/requisition.d.ts +0 -4
- package/dist/testing/cases/requisition.d.ts.map +0 -1
- package/dist/testing/cases/requisition.js +0 -38
- package/dist/testing/cases/requisition.js.map +0 -1
- package/dist/testing/cases/search-places.d.ts +0 -4
- package/dist/testing/cases/search-places.d.ts.map +0 -1
- package/dist/testing/cases/search-places.js +0 -60
- package/dist/testing/cases/search-places.js.map +0 -1
- package/dist/testing/cases/stock.d.ts +0 -4
- package/dist/testing/cases/stock.d.ts.map +0 -1
- package/dist/testing/cases/stock.js +0 -35
- package/dist/testing/cases/stock.js.map +0 -1
- package/dist/testing/cases/store.d.ts +0 -4
- package/dist/testing/cases/store.d.ts.map +0 -1
- package/dist/testing/cases/store.js +0 -100
- package/dist/testing/cases/store.js.map +0 -1
- package/dist/testing/harness.d.ts +0 -94
- package/dist/testing/harness.d.ts.map +0 -1
- package/dist/testing/harness.js +0 -168
- package/dist/testing/harness.js.map +0 -1
- package/dist/testing/index.d.ts.map +0 -1
- package/dist/testing/index.js.map +0 -1
- package/dist/testing/report.d.ts +0 -15
- package/dist/testing/report.d.ts.map +0 -1
- package/dist/testing/report.js +0 -22
- package/dist/testing/report.js.map +0 -1
- package/dist/web/createRestSurface.d.ts +0 -7
- package/dist/web/createRestSurface.d.ts.map +0 -1
- package/dist/web/createRestSurface.js +0 -41
- package/dist/web/createRestSurface.js.map +0 -1
- package/dist/web/index.d.ts +0 -2
- package/dist/web/index.d.ts.map +0 -1
- package/dist/web/index.js +0 -2
- package/dist/web/index.js.map +0 -1
- package/docs/adr/0001-four-atom-manifest-model.md +0 -440
- package/docs/adr/0002-closed-enums-for-bindings.md +0 -253
- package/docs/adr/0007-ai-as-primary-author.md +0 -473
- package/docs/adr/0008-structured-diagnostic-shape.md +0 -338
- package/docs/adr/0009-consumer-supplied-manifests.md +0 -149
- package/docs/adr/0010-locale-and-translates.md +0 -453
- package/docs/adr/0011-adapter-port-spec.md +0 -281
- package/docs/adr/0012-views-as-public-rest.md +0 -161
- package/docs/adr/0013-agent-provisioned-consumer-projects.md +0 -154
- package/docs/adr/0014-auth-better-auth-and-multi-tenant-mcp.md +0 -939
- package/docs/adr/0016-site-semantic-layer.md +0 -70
- package/docs/adr/0017-media-multi-variant-agent-side-optimization.md +0 -181
- package/docs/adr/0018-core-starters-repository-boundary.md +0 -179
- package/docs/adr/0019-sealed-manifest-runtime-pipeline.md +0 -244
- package/docs/adr/0020-builtin-handler-contracts-and-matched-upsert.md +0 -199
- package/docs/adr/0021-retire-starter-scaffolding.md +0 -30
- package/docs/adr/0022-caller-observed-version-occ.md +0 -212
- package/docs/adr/0023-port-failure-contract.md +0 -69
- package/docs/adr/0024-manifest-native-schema-tables.md +0 -264
- package/docs/adr/0025-reserved-native-columns-and-published-only-public-views.md +0 -105
- package/docs/adr/0026-progressive-generate.md +0 -36
- package/docs/adr/0027-scheduled-procedure-triggers.md +0 -31
- package/docs/adr/0028-schema-ttl-expiry.md +0 -33
- package/docs/adr/0029-mcp-apps-interaction-contracts.md +0 -324
- package/docs/adr/0030-store.md +0 -40
- package/docs/adr/0031-host-cloud-core-contract.md +0 -102
- package/docs/adr/0032-store-centric-core-and-service-contract.md +0 -384
- package/docs/adr/0033-storage-converges-to-the-plan.md +0 -92
- package/docs/adr/0034-store-is-authored-as-sql.md +0 -192
- package/docs/adr/0035-sql-dialects.md +0 -154
- package/docs/adr/0036-host-and-dialect.md +0 -65
- package/docs/adr/0037-postgresql-is-the-reference-dialect.md +0 -125
- package/docs/adr/0038-bun-native-host.md +0 -63
- package/docs/adr/0039-postgresql-is-native.md +0 -130
- package/docs/adr/README.md +0 -98
- package/docs/adr/adr-lite-1376-admin-extensions.md +0 -330
- package/docs/adr/adr-lite-803-request-diagnostics.md +0 -38
- package/docs/adr/adr-lite-808-route-readiness.md +0 -47
- package/docs/adr/adr-lite-809-bounded-public-content.md +0 -71
- package/docs/adr/adr-lite-812-native-parity.md +0 -150
- package/docs/adr/adr-lite-823-home-statistics.md +0 -64
- package/docs/adr/adr-lite-842-mcp-authoring.md +0 -30
- package/docs/adr/adr-lite-845-frontend-client.md +0 -38
- package/docs/adr/adr-lite-861-admin-webmcp.md +0 -48
- package/docs/adr/adr-lite-909-admin-ui-kit.md +0 -37
- package/docs/examples/commerce-inventory.md +0 -498
- package/docs/examples/commerce.md +0 -254
- package/docs/examples/guarded-api.md +0 -238
- package/docs/examples/intake-hooks.md +0 -237
- package/docs/examples/intake.md +0 -127
- package/docs/examples/legal-documents.md +0 -218
- package/docs/examples/procurement.md +0 -226
- package/docs/examples/publication.md +0 -211
- package/docs/examples/reference-service/.mantle/generated/mantle.ts +0 -174
- package/docs/examples/reference-service/.mantle/generated/plan.json +0 -1936
- package/docs/examples/reference-service/README.md +0 -33
- package/docs/examples/reference-service/manifests/catalog.yaml +0 -103
- package/docs/examples/reference-service/manifests/orders.yaml +0 -120
- package/docs/examples/reference-service/mantle.config.json +0 -1
- package/docs/examples/reference-service/package.json +0 -27
- package/docs/examples/reference-service/smoke.mjs +0 -160
- package/docs/examples/reference-service/src/handlers.ts +0 -36
- package/docs/examples/reference-service/src/index.ts +0 -33
- package/docs/examples/reference-service/src/service.ts +0 -78
- package/docs/examples/reference-service/wrangler.jsonc +0 -26
- package/docs/examples/reservation.md +0 -142
- /package/docs/examples/{reference-service → app-shell}/.dev.vars.example +0 -0
|
@@ -1,239 +1,30 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: Native execution, database handles, two SQL dialects and application-owned migrations.
|
|
3
3
|
---
|
|
4
|
-
# Runtime
|
|
4
|
+
# Runtime and databases
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
src/index.ts (host entry) ─▶ mantle = createMantle(service, { plan, storage, schedules })
|
|
8
|
-
│ first request: createMantleRuntime → storage.prepare(plan)
|
|
9
|
-
▼
|
|
10
|
-
service.fetch(request, env, { runtime, waitUntil })
|
|
11
|
-
└ surfaces / your routes ─▶ runtime.invokeProcedure · runtime.store
|
|
12
|
-
└ Store: policy rewrite → dialect check → StoreExecutor
|
|
13
|
-
```
|
|
6
|
+
`mantle generate` compiles manifest SQL and row policy into ordinary TypeScript and SQL. Generated Views and Procedures call the target's native driver. The app owns routing, authentication, handles, connection lifetime and deployment. Import only the operations and surfaces you use.
|
|
14
7
|
|
|
15
|
-
##
|
|
8
|
+
## Schema installation and migrations
|
|
16
9
|
|
|
17
|
-
|
|
18
|
-
createMantle(service, { plan, storage: (env) => MantleStorageAdapter, schedules?, expectedFingerprint? })
|
|
19
|
-
// → { fetch(request, env, ctx?), invokeSchedule(cron, scheduledTime, env, ctx?), runDeferredHook(message, env, ctx?) }
|
|
20
|
-
// runDeferredHook replays an after-hook Invocation from your own queue; nothing in Mantle emits one
|
|
21
|
-
```
|
|
10
|
+
The runtime never creates, alters or checks tables. Boot and requests run no DDL, introspection or schema checks.
|
|
22
11
|
|
|
23
|
-
|
|
24
|
-
WinterTC fetch the application owns. Mantle owns no route of its own: the
|
|
25
|
-
service decides what is mounted where.
|
|
26
|
-
- The runtime boots lazily on the first call, once per isolate. A failed boot
|
|
27
|
-
is retried by the next request.
|
|
28
|
-
- Each entry call binds its own `ctx.waitUntil` to the runtime facade handed
|
|
29
|
-
to the service. Handler calls, nested invocations and Store lifecycle hooks
|
|
30
|
-
retain work on that entry's context, including concurrent requests. Calls
|
|
31
|
-
without a context do not borrow another request's retainer.
|
|
32
|
-
- `invokeSchedule` runs every enabled schedule Trigger whose cron is exactly
|
|
33
|
-
the given POSIX expression, as the system caller.
|
|
34
|
-
- The host entry is a few lines the generator writes once
|
|
35
|
-
([The service and its entry](../cloudflare/service-entry.md)); Core handles
|
|
36
|
-
no platform event types.
|
|
12
|
+
For the first install, apply generated `schema.sql`, including selected auth/site DDL, to an empty database. Apply selected seed SQL explicitly.
|
|
37
13
|
|
|
38
|
-
`
|
|
39
|
-
and custom hosts. The runtime exposes `plan`, `store`, `invokeProcedure`,
|
|
40
|
-
`bootReport()` (`{ fingerprint, coreVersion }`) and, with site defaults,
|
|
41
|
-
`site`.
|
|
14
|
+
For every later schema change, the application's coding agent diffs the regenerated `schema.sql`, writes a migration with the host's native tool (`wrangler d1 migrations` or the app's PostgreSQL migration tool), rehearses it on a copy, and applies it before deploying the new code. Cloud executes migrations at deploy time.
|
|
42
15
|
|
|
43
|
-
|
|
16
|
+
Destructive changes and type changes need explicit data migration. Mantle drops nothing. Initial `schema.sql` is not an upgrade script.
|
|
44
17
|
|
|
45
|
-
|
|
18
|
+
## Drivers and dialects
|
|
46
19
|
|
|
47
|
-
|
|
48
|
-
in the plan (`HANDLER_NOT_DECLARED`);
|
|
49
|
-
- the plan was compiled for another dialect, or does not match
|
|
50
|
-
`expectedFingerprint` (`PLAN_FINGERPRINT_MISMATCH`);
|
|
51
|
-
- an enabled schedule exists without `schedules: true` (`SCHEDULE_NOT_WIRED`);
|
|
52
|
-
- storage has a change it cannot make (`STORAGE_CHANGE_BLOCKED`), or a table
|
|
53
|
-
Mantle would create already exists without being Mantle's
|
|
54
|
-
(`STORAGE_TABLE_NOT_OWNED`).
|
|
20
|
+
The driver layer is open: handles are structural contracts, not a registration API. PostgreSQL needs `unsafe(text, values)` and `begin(options, fn)` from `@aotter/mantle/contracts`; SQLite uses D1's prepare/bind/all/batch shape or bun:sqlite's query/transaction shape. Bun.SQL and postgres.js fit directly. See [adapting a driver](../guides/postgres-adapters.md).
|
|
55
21
|
|
|
56
|
-
|
|
22
|
+
Users may supply anything that executes the emitted SQL, including WASM SQLite persisted to IndexedDB, at their own risk. Mantle promises behavior only on supported drivers: bun:sqlite, D1, Bun.SQL and postgres.js. A structural match alone does not prove transaction, result or error semantics.
|
|
57
23
|
|
|
58
|
-
|
|
59
|
-
differs from the one the database last booted, boot reads the database's
|
|
60
|
-
actual tables and indexes, compares them with the plan, and:
|
|
24
|
+
The dialect layer is closed in 0.2.0: exactly `postgres` and `sqlite`, selected by the generation target. SQL is rendered at generation time. A third engine requires forking the compiler and Store runtime; it is not a dialect plugin.
|
|
61
25
|
|
|
62
|
-
|
|
63
|
-
|---|---|
|
|
64
|
-
| a missing table, field column, index, or unique index that builds | creates it (on SQLite, `STRICT` tables with their check and FTS triggers) |
|
|
65
|
-
| a unique index that fails on existing rows, a column with another type, a changed index, a missing native column | refuses with `STORAGE_CHANGE_BLOCKED`, naming the change and a SQL hint |
|
|
66
|
-
| a column or non-unique index the plan no longer declares | keeps it and warns; nothing is ever dropped |
|
|
26
|
+
## Store and queries
|
|
67
27
|
|
|
68
|
-
|
|
69
|
-
yourself. A blocked change is the author's to make (SQL through the host's own
|
|
70
|
-
tool, a data-copy Procedure, a dedupe), then boot checks again. With the same
|
|
71
|
-
fingerprint boot reads nothing. `mantle generate --check --database <file>`
|
|
72
|
-
prints the same diff against a local database without applying it.
|
|
28
|
+
Use the [Store for writes and simple lookups, internal Views for richer reads](../guides/typed-queries.md). Store metadata initializes once on first `store()` use without SQL. Each call binds a fresh handle, verified Caller and handlers; never reuse a caller-bound Store across requests.
|
|
73
29
|
|
|
74
|
-
|
|
75
|
-
`media_assets`, `pending_media_uploads`) keep versioned migrations of their
|
|
76
|
-
own. Identity `mantle` migrates Better Auth's tables through Better Auth.
|
|
77
|
-
|
|
78
|
-
## The D1 dialect
|
|
79
|
-
|
|
80
|
-
The SQL language is PostgreSQL syntax, pinned to PostgreSQL 18's parser. A
|
|
81
|
-
**dialect** decides which of it an engine runs and how. The built-in dialect,
|
|
82
|
-
`@aotter/mantle/d1`, runs on SQLite as D1 does: its compile side refuses what
|
|
83
|
-
D1 cannot compute exactly, and its runtime side prints SQLite, encodes types
|
|
84
|
-
and converges storage.
|
|
85
|
-
|
|
86
|
-
- `date-time` (and `created_at` / `updated_at`) is stored as microseconds,
|
|
87
|
-
`date` as days, `numeric(p, s)` as an integer of the smallest unit, so
|
|
88
|
-
arithmetic is exact on D1. On the wire a date-time is an ISO string.
|
|
89
|
-
- `checks` are enforced by triggers. `x-mantle-ref` is checked by
|
|
90
|
-
`mantle generate` and used by Admin; storage does not enforce it in 0.2.0.
|
|
91
|
-
`searchableFields` uses
|
|
92
|
-
an FTS5 trigram index; `format: geo` uses an R*Tree.
|
|
93
|
-
- `date_trunc` and `extract` compute in the site time zone
|
|
94
|
-
(`d1Storage(db, { timeZone })`, default UTC).
|
|
95
|
-
|
|
96
|
-
`mantle.config.json` names the dialect (`sqlite`, `postgres`, or another dialect package, which must pass
|
|
97
|
-
`runStorageConformance` from `@aotter/mantle/testing`). A plan records its
|
|
98
|
-
dialect, and boot refuses a plan compiled for another one.
|
|
99
|
-
|
|
100
|
-
## The PostgreSQL dialect
|
|
101
|
-
|
|
102
|
-
`"dialect": "postgres"` in `mantle.config.json` compiles the plan for
|
|
103
|
-
PostgreSQL (13 or later). On Cloudflare, `mantle generate --dialect postgres`
|
|
104
|
-
writes the preset over Hyperdrive; on any other platform, add `"host": "none"`
|
|
105
|
-
and compose `createMantle` with `postgresStorage` yourself (ADR-0036). PostgreSQL
|
|
106
|
-
is Mantle SQL's reference dialect (ADR-0037), and its SQL is PostgreSQL's own
|
|
107
|
-
(ADR-0039): Mantle lowers nothing to imitate SQLite. It accepts D1's subset except
|
|
108
|
-
SQLite's own vocabulary (below), plus `WITH`, set operations, `LATERAL`, window
|
|
109
|
-
frames, `FILTER`, jsonb operators and the rest of the
|
|
110
|
-
[View reference](../reference/view.md)'s PostgreSQL table. A manifest targets one
|
|
111
|
-
dialect: it need not compile for D1 or return the same values there. D1 to
|
|
112
|
-
PostgreSQL is a migration (export, rewrite the SQL, import), not a switch.
|
|
113
|
-
|
|
114
|
-
A SQLite spelling fails validation with its position and the PostgreSQL one:
|
|
115
|
-
|
|
116
|
-
| SQLite (D1) | PostgreSQL |
|
|
117
|
-
|---|---|
|
|
118
|
-
| `FROM t, json_each(t.col) j`, `j.value` | `FROM t, jsonb_array_elements_text(t.col) WITH ORDINALITY AS j(value, n)` (`jsonb_array_elements` for jsonb values, `jsonb_each_text(t.col) WITH ORDINALITY AS j(key, value, n)` for an object) |
|
|
119
|
-
| `ORDER BY …, j.id` of `json_each` | `WITH ORDINALITY AS j(value, n)`, then `ORDER BY …, j.n` (a sorted View over a row source needs `WITH ORDINALITY`; Mantle pages by it) |
|
|
120
|
-
| `x ->> '$.a.b'`, `x ->> '$[0]'` | `x #>> '{a,b}'`, `x ->> 'a'`, `x ->> 0` (a `$…` string is refused: PostgreSQL would read it as a key) |
|
|
121
|
-
| `json_extract(x, '$.a')` | `x ->> 'a'` (text) or `x -> 'a'` (jsonb) |
|
|
122
|
-
| `json_remove(x, '$.a')` | `x - 'a'` |
|
|
123
|
-
| `json_set`, `json_insert` | build the value with `jsonb_build_object` or `jsonb_build_array` |
|
|
124
|
-
| `CAST(n AS bool)` of an integer | `n <> 0` (PostgreSQL has no bigint to boolean cast; `CAST('true' AS bool)` is unchanged) |
|
|
125
|
-
| `2 * 3 \|\| 4` (text by any type) | `2 * 3 \|\| '4'`, or `CAST(n AS text) \|\| …`: `\|\|` needs a text operand |
|
|
126
|
-
| `hex(x)`, `typeof(x)` | no equivalent on the allowlist; refused |
|
|
127
|
-
| `NULL` first when ascending | `NULL` last when ascending (PostgreSQL's; say `NULLS FIRST` to override) |
|
|
128
|
-
|
|
129
|
-
- Columns have native types: `timestamptz`, `date`, `numeric(p, s)`, `boolean`,
|
|
130
|
-
`jsonb`, `bigint` and `double precision`. Values are decoded by the type
|
|
131
|
-
PostgreSQL reports, so computed outputs (`now()`, `date_trunc`, a `CAST`) come
|
|
132
|
-
back as wire values too: ISO date-times, booleans, parsed JSON.
|
|
133
|
-
- Every write batch is one `SERIALIZABLE` transaction, retried on a
|
|
134
|
-
serialization failure, so a guard such as `WHERE NOT EXISTS` holds under
|
|
135
|
-
concurrent writers as it does on SQLite's single writer.
|
|
136
|
-
- `checks` are `CHECK` constraints added `NOT VALID`: they bind every later
|
|
137
|
-
write and leave older rows alone, like D1's triggers.
|
|
138
|
-
- `->>`, `||`, `CAST` and the jsonb row sources mean what PostgreSQL says; the
|
|
139
|
-
only SQL function Mantle creates is `_mantle_expect`. A database booted by an
|
|
140
|
-
earlier release keeps its `_mantle_jget`, `_mantle_bool` and `_mantle_json_each`
|
|
141
|
-
unused. `json_group_array` and `json_group_object` order by value.
|
|
142
|
-
- Text columns use `COLLATE "C"`, so they compare by code point. An `ORDER BY` key without `NULLS FIRST/LAST`
|
|
143
|
-
sorts NULL as PostgreSQL does: last ascending, first descending (D1 puts it
|
|
144
|
-
first ascending). The `id` tiebreak follows the last key's direction, so an
|
|
145
|
-
index on the sort keys (and the `updated_at` index Mantle creates) serves a
|
|
146
|
-
paged sort. This is PostgreSQL's default for every `ORDER BY`, window and
|
|
147
|
-
aggregate (`json_group_array`) ones included. Values never depend on
|
|
148
|
-
the server's `DateStyle`, `IntervalStyle` or `TimeZone`. Elsewhere the meaning
|
|
149
|
-
is PostgreSQL's, where D1 differs:
|
|
150
|
-
- `LIKE` is case-sensitive.
|
|
151
|
-
- Division by zero is an error.
|
|
152
|
-
- `->>` returns text.
|
|
153
|
-
- `searchableFields` and `mantle.near()` scan without an index in 0.2.0, and
|
|
154
|
-
`mantle.search_rank()` counts occurrences rather than computing bm25.
|
|
155
|
-
Site settings and media are SQLite-only (D1, bun:sqlite).
|
|
156
|
-
- `date_trunc` and `extract` compute in the site time zone
|
|
157
|
-
(`postgresStorage({ connect, timeZone })`, default UTC).
|
|
158
|
-
- Every statement has a `statement_timeout` of at most 10 seconds
|
|
159
|
-
(`statementTimeoutMs`; 0 is none). A write batch sets it on its transaction.
|
|
160
|
-
A read is one statement outside a transaction, under the role's own
|
|
161
|
-
`statement_timeout`, so boot requires the role to have one no larger
|
|
162
|
-
(`ALTER ROLE app SET statement_timeout = '10s'`). Storage convergence has
|
|
163
|
-
none. A statement past it fails with `RESOURCE_UNAVAILABLE` and writes nothing.
|
|
164
|
-
- Boot reads the role's settings once and refuses to start, naming the
|
|
165
|
-
`ALTER ROLE … SET` to run, unless `DateStyle` is ISO, `IntervalStyle` is
|
|
166
|
-
`postgres`, `extra_float_digits` is at least 1, `standard_conforming_strings`
|
|
167
|
-
is on and `TimeZone` is UTC (date and instant casts in your SQL use the
|
|
168
|
-
session's zone). These are PostgreSQL's defaults, except a server initialized
|
|
169
|
-
in another time zone. Mantle sets nothing per session, because
|
|
170
|
-
Hyperdrive resets every pooled session to the role's configuration.
|
|
171
|
-
- Connect as a role that owns the service's tables but is not a superuser and
|
|
172
|
-
holds no file or server privilege (`pg_read_server_files`,
|
|
173
|
-
`pg_execute_server_program`). Mantle's allowlist refuses such functions; the
|
|
174
|
-
role is the second line.
|
|
175
|
-
|
|
176
|
-
## Storage adapters
|
|
177
|
-
|
|
178
|
-
| Adapter | From | Driver |
|
|
179
|
-
|---|---|---|
|
|
180
|
-
| `d1Storage(env.DB, { timeZone?, site? })` | `@aotter/mantle/cloudflare` | Cloudflare D1, the one the preset uses |
|
|
181
|
-
| `sqliteStorage(driver, { timeZone?, maxBindings?, site?, restrict? })` | `@aotter/mantle/d1` | any `DatabaseDriver`: `{ batch(statements) }`, all or nothing |
|
|
182
|
-
| `postgresStorage({ connect, timeZone?, statementTimeoutMs?, restrict? })` | `@aotter/mantle/postgres` | `connect` opens one node-postgres (`pg`) client: Hyperdrive on Workers, a `pg.Pool` on Bun (ADR-0039) |
|
|
183
|
-
| `bunSqliteStorage(db, { timeZone?, site?, restrict? })` | `@aotter/mantle/bun` | a bun:sqlite `Database`; foreign keys are turned on |
|
|
184
|
-
|
|
185
|
-
`restrict(plan, context)` returns refusals of its own, run after the dialect's
|
|
186
|
-
on every program at runtime. It only narrows what runs, for an operator that
|
|
187
|
-
runs other people's plans; a self-hosted service leaves it out (ADR-0037).
|
|
188
|
-
|
|
189
|
-
On Workers, PostgreSQL goes through Hyperdrive, which pools the connections.
|
|
190
|
-
`connect` opens one client, and `requestScoped` makes it one per request: every
|
|
191
|
-
query of a request (Store, Better Auth, auth SQL) reuses it, and it is ended
|
|
192
|
-
when the request ends, as a Worker's socket must be. Outside `run` (boot,
|
|
193
|
-
schedules) each operation opens its own:
|
|
194
|
-
|
|
195
|
-
```ts
|
|
196
|
-
import pg from "pg";
|
|
197
|
-
import { pgDatabaseDriver, pgPool, postgresStorage, requestScoped, type PgSession } from "@aotter/mantle/postgres";
|
|
198
|
-
|
|
199
|
-
// one per isolate: every consumer must share it
|
|
200
|
-
let session: PgSession | undefined;
|
|
201
|
-
const database = (env: Env) => (session ??= requestScoped(async () => {
|
|
202
|
-
const client = new pg.Client({ connectionString: env.HYPERDRIVE.connectionString });
|
|
203
|
-
await client.connect();
|
|
204
|
-
return client;
|
|
205
|
-
}));
|
|
206
|
-
// storage: (env) => postgresStorage({ connect: database(env).connect })
|
|
207
|
-
// identity: createMantleAuth({ database: pgPool(database(env).connect), driver: pgDatabaseDriver(database(env).connect), ... })
|
|
208
|
-
// fetch: (request, env, ctx) => database(env).run(() => routes(request))
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
One operation holds the shared client from `connect()` to `end()`; another that
|
|
212
|
-
arrives meanwhile opens its own, so nothing runs inside another's transaction.
|
|
213
|
-
With `new pg.Client({ …, pipeline: true })` (pg 8.23 or later) a write batch is
|
|
214
|
-
one round trip instead of N + 2; the generated Workers preset leaves it off
|
|
215
|
-
until Hyperdrive is verified to forward a pipelined transaction.
|
|
216
|
-
|
|
217
|
-
The Worker needs `compatibility_flags: ["nodejs_compat"]` for `pg`. Mantle's
|
|
218
|
-
and Better Auth's reads run outside a transaction, which Hyperdrive would answer
|
|
219
|
-
from its cache, so create the Hyperdrive config with caching disabled
|
|
220
|
-
(`wrangler hyperdrive create … --caching-disabled`), or a read can miss the
|
|
221
|
-
write before it and a revoked session can be accepted until the cache expires. The same holds for a role
|
|
222
|
-
re-read and for a revoked grant: Auth's reads are single statements outside a transaction, so their freshness
|
|
223
|
-
depends on `--caching-disabled` too. `timeZone` must be an
|
|
224
|
-
IANA name: PostgreSQL reads an offset such as `+08:00` with the opposite sign.
|
|
225
|
-
|
|
226
|
-
Bun has a generated preset for both engines (`mantle generate --host bun`,
|
|
227
|
-
ADR-0038, ADR-0039): over PostgreSQL it is the Workers composition on a `pg.Pool`;
|
|
228
|
-
over SQLite `bunSqliteDriver` gives Better Auth the same store. A `DatabaseDriver` is one method, so another engine
|
|
229
|
-
(libSQL, for example) is a few lines of application code on `host: none`: the
|
|
230
|
-
entry calls `createMantle` and its own server.
|
|
231
|
-
|
|
232
|
-
`site` turns on the site capability (site settings and media); see
|
|
233
|
-
[Site defaults and site_config](../reference/site-config.md).
|
|
234
|
-
|
|
235
|
-
## Testing a service
|
|
236
|
-
|
|
237
|
-
Run the service under `wrangler dev` against a fresh local D1 and drive it over
|
|
238
|
-
HTTP, as the [reference service](../../examples/reference-service/README.md)'s
|
|
239
|
-
`smoke.mjs` does.
|
|
30
|
+
[Native execution](../guides/native-execution.md) defines input ownership, native result values, atomicity and uncertain write outcomes.
|
|
@@ -1,116 +1,17 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: How a View's SQL SELECT is compiled, which policies the runtime injects, and how REST, MCP, Admin and Store serve it with limit and cursor paging.
|
|
3
|
-
---
|
|
4
1
|
# Reads: Views, REST and MCP
|
|
5
2
|
|
|
6
|
-
A View
|
|
3
|
+
A View declares one PostgreSQL-syntax SELECT over declared Schemas or reusable internal Views. Generation parses, checks and lowers it for postgres or sqlite, adds row policy, and emits a typed function. Requests bind values and execute SQL; they do not parse or compile manifests.
|
|
7
4
|
|
|
8
|
-
|
|
9
|
-
apiVersion: cms.mantle.aotter.net/v2
|
|
10
|
-
kind: View
|
|
11
|
-
metadata: { name: my-orders }
|
|
12
|
-
spec:
|
|
13
|
-
surface: public
|
|
14
|
-
requires: { auth: { all: [ctx.user] } }
|
|
15
|
-
sql: |
|
|
16
|
-
SELECT o.id, o.qty, o.orderStatus, i.name AS item, o.version
|
|
17
|
-
FROM orders o JOIN items i ON i.id = o.itemId
|
|
18
|
-
ORDER BY o.created_at DESC
|
|
19
|
-
```
|
|
5
|
+
Use internal Views for joins, aggregates, OR and reusable reads. Simple handler id lookups and AND filters can use Store. See [query from TypeScript](../guides/typed-queries.md) for a complete example.
|
|
20
6
|
|
|
21
|
-
|
|
7
|
+
| Surface | Exposure when mounted |
|
|
8
|
+
| --- | --- |
|
|
9
|
+
| public | REST `/api/views/<name>` and public MCP |
|
|
10
|
+
| admin | Admin View API and admin MCP |
|
|
11
|
+
| internal | Generated operation only; no public route/tool |
|
|
22
12
|
|
|
23
|
-
|
|
24
|
-
dialect does not support (with the position in the statement), and stores the
|
|
25
|
-
parse tree as the View's IR in the plan. No running service parses SQL. At run time the
|
|
26
|
-
runtime validates the IR against the same allowlist, injects policy, and the
|
|
27
|
-
dialect prints its engine's SQL (SQLite for D1).
|
|
13
|
+
Every generated invocation retains its `requires`. SQL row policy limits scope, TTL and publishing visibility at every relation. The app supplies a verified Caller.
|
|
28
14
|
|
|
29
|
-
|
|
30
|
-
has the full table):
|
|
15
|
+
Bare Views return native row arrays. Declared date/date-time columns are formatted by SQL; other values retain driver behavior. Proved pageable Views also get `paged/views/<encoded-name>.ts`, returning `{ rows, nextCursor? }`. Internal paging creates no exposure. Keyset paging requires generate-time order/cardinality proofs; it does not avoid the source scan for an aggregate. Inspect native EXPLAIN and indexes.
|
|
31
16
|
|
|
32
|
-
|
|
33
|
-
integer literals: use `round(x)`), JSON `->>`;
|
|
34
|
-
- `WHERE` with comparisons, `BETWEEN`, `IN (list | subquery)`, `EXISTS`,
|
|
35
|
-
`LIKE` (case-insensitive, as in SQLite), `IS DISTINCT FROM`;
|
|
36
|
-
- `INNER` and `LEFT JOIN`, subqueries, `json_each(…)` on D1 (PostgreSQL: `jsonb_array_elements_text(…) WITH ORDINALITY AS j(value, n)`);
|
|
37
|
-
- `GROUP BY`, `HAVING`, `count`, `sum`, `min`, `max`, `avg`,
|
|
38
|
-
`json_group_array`, `json_group_object`; `row_number()`, `rank()` and running
|
|
39
|
-
aggregates;
|
|
40
|
-
- `ORDER BY … NULLS FIRST | LAST`, `LIMIT` (it needs an `ORDER BY`),
|
|
41
|
-
`DISTINCT`;
|
|
42
|
-
- `now()`, `date_trunc`, `extract`, `ts ± interval '<n> seconds|minutes|hours'`;
|
|
43
|
-
- `mantle.search`, `mantle.search_rank`, `mantle.near`, `mantle.distance`.
|
|
44
|
-
|
|
45
|
-
Refused: `OFFSET` (page with cursors), `RIGHT`/`FULL`/`CROSS JOIN`, any table
|
|
46
|
-
that is not a declared Schema, and SQLite's own clock (`CURRENT_TIMESTAMP`,
|
|
47
|
-
`'now'`).
|
|
48
|
-
|
|
49
|
-
PostgreSQL is the reference dialect (ADR-0037): on it a View may also use `WITH`
|
|
50
|
-
(recursive too), `UNION` and `DISTINCT ON` inside a `WITH` or subquery,
|
|
51
|
-
`LATERAL`, window frames, `FILTER`, jsonb operators, `ILIKE` and regular
|
|
52
|
-
expressions. D1 refuses them as needing the PostgreSQL dialect. On every
|
|
53
|
-
dialect a View may read an internal View in `FROM`, which is inlined; that is
|
|
54
|
-
how a rule many Views share is written once.
|
|
55
|
-
|
|
56
|
-
## Policies the runtime injects
|
|
57
|
-
|
|
58
|
-
Every Schema reference, in `FROM`, joins and subqueries, is replaced by a
|
|
59
|
-
subquery that keeps only visible rows:
|
|
60
|
-
|
|
61
|
-
- **scope**: on a scoped Schema, a user caller's own rows (an anonymous caller
|
|
62
|
-
sees none);
|
|
63
|
-
- **TTL**: unexpired rows;
|
|
64
|
-
- **published-only**: on a `public` View, published rows of `publishing`
|
|
65
|
-
Schemas.
|
|
66
|
-
|
|
67
|
-
So the join in `my-orders` sees only the caller's orders, and the View never
|
|
68
|
-
says so. A public View that joins a Schema without `publishing` to one with it
|
|
69
|
-
must join them by an explicit condition, or validation refuses it.
|
|
70
|
-
|
|
71
|
-
## Output names and types
|
|
72
|
-
|
|
73
|
-
- A column that reads a Schema field unchanged comes back under the field's
|
|
74
|
-
declared name and type (`o.orderStatus` is `orderStatus`).
|
|
75
|
-
- Anything else keeps its alias. SQL folds unquoted names to lower case, so
|
|
76
|
-
`count(o.id) AS orderCount` comes back as `ordercount`; write
|
|
77
|
-
`AS "orderCount"` to keep the case.
|
|
78
|
-
- `*` expands to the declared fields, never the scope field or native columns.
|
|
79
|
-
- The generated `ViewRow_<name>` types each column the same way; an expression
|
|
80
|
-
is `unknown`.
|
|
81
|
-
|
|
82
|
-
## Surfaces
|
|
83
|
-
|
|
84
|
-
| `surface` | Served at |
|
|
85
|
-
|---|---|
|
|
86
|
-
| `public` | `GET /api/views/<name>` (REST) and a tool on the public MCP surface (`/mcp`) |
|
|
87
|
-
| `staff` | `GET /admin/api/views/<name>`, with CSV at `/export`, and a tool on the staff MCP surface (`/mcp/staff`) |
|
|
88
|
-
| `internal` | no surface: `ctx.store.view(...)` and `runtime.store` only |
|
|
89
|
-
|
|
90
|
-
`requires` gates every path: an anonymous caller is 401 `UNAUTHENTICATED`, a
|
|
91
|
-
signed-in one who fails a predicate is 403 `AUTH_DENIED`. A staff View still
|
|
92
|
-
needs its own `requires` to limit roles beyond Admin's gate.
|
|
93
|
-
|
|
94
|
-
## Input and paging
|
|
95
|
-
|
|
96
|
-
`input` is a JSON Schema object; the SQL reads `input.<name>`. Over REST the
|
|
97
|
-
properties are query parameters, coerced to their declared types; a missing
|
|
98
|
-
required one is 400 `INPUT_VALIDATION_FAILED`. `limit` and `cursor` are
|
|
99
|
-
reserved names.
|
|
100
|
-
|
|
101
|
-
Every surface pages the same way: `limit` (default 50, at most 500) and an
|
|
102
|
-
opaque `cursor`. The response is `{ "rows": [...], "nextCursor": "…" }`, with
|
|
103
|
-
`nextCursor` only when more rows exist. The compiler appends `id` to the
|
|
104
|
-
`ORDER BY` so the order is total. A View's own `LIMIT` caps the whole result.
|
|
105
|
-
|
|
106
|
-
## MCP
|
|
107
|
-
|
|
108
|
-
Each View of a surface is a read-only tool named after it in snake case
|
|
109
|
-
(`my-orders` is `my_orders`), whose input is the View's `input` plus `limit`
|
|
110
|
-
and `cursor`. `description` becomes the tool's description. See
|
|
111
|
-
[MCP and agents](./mcp-and-agents.md).
|
|
112
|
-
|
|
113
|
-
## Further reading
|
|
114
|
-
|
|
115
|
-
- [View reference](../reference/view.md)
|
|
116
|
-
- [Query from TypeScript](../guides/typed-queries.md)
|
|
17
|
+
See the [View reference](../reference/view.md), [surface contracts](../reference/surface.md) and [native value contract](../guides/native-execution.md).
|
|
@@ -1,21 +1,5 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Index of the Mantle 0.2.0 examples — whole services in the v2 grammar, each compiled by mantle generate, and the runnable reference service.
|
|
3
|
-
---
|
|
4
1
|
# Examples
|
|
5
2
|
|
|
6
|
-
|
|
7
|
-
its handlers are written against the generated types. They live beside this
|
|
8
|
-
handbook in [`docs/examples/`](../../examples/README.md).
|
|
3
|
+
Use the [Worker quickstart](../start/quickstart-worker.md) for a complete native manifest and entry, [typed queries](../guides/typed-queries.md) for embedding, and [service composition](../cloudflare/service-entry.md) for optional surfaces.
|
|
9
4
|
|
|
10
|
-
|
|
11
|
-
|---|---|
|
|
12
|
-
| [Reference service](../../examples/reference-service/README.md) | a runnable service with its smoke test: scope, SQL Views and Procedures, hooks, a cron, REST, both MCP surfaces, Admin's API and sign-in |
|
|
13
|
-
| [Intake form](../../examples/intake.md) | an anonymous form: one SQL `INSERT` and a staff View |
|
|
14
|
-
| [Intake with bot check and notification](../../examples/intake-hooks.md) | a guard and an after hook |
|
|
15
|
-
| [Reservation requests](../../examples/reservation.md) | a request queue with a `check` |
|
|
16
|
-
| [Publication](../../examples/publication.md) | localized posts, per-locale Views and `mantle.search` |
|
|
17
|
-
| [Legal documents and consent](../../examples/legal-documents.md) | immutable revisions and a conditional insert |
|
|
18
|
-
| [Procurement approvals](../../examples/procurement.md) | own rows through `auth.uid()`, a locked staff review |
|
|
19
|
-
| [Commerce catalog and orders](../../examples/commerce.md) | a published catalog and guest orders |
|
|
20
|
-
| [Commerce inventory](../../examples/commerce-inventory.md) | atomic stock reservation, a scheduled expiry, a verified payment callback |
|
|
21
|
-
| [Guarded API access](../../examples/guarded-api.md) | API keys, scopes and an entitlement guard |
|
|
5
|
+
The runnable [reference service](https://github.com/aotter/mantle/blob/develop/docs/examples/reference-service/README.md) exercises the native package integration. See the [generated public website](../../examples/generated-web/README.md) for a native Worker example.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Another host or database handle
|
|
2
|
+
|
|
3
|
+
Mantle has an open driver boundary and exactly two closed dialects in 0.2.0, postgres and sqlite. Choose the generation target whose emitted SQL and handle calls match your host. The app owns its router, resources, lifetime and scheduler.
|
|
4
|
+
|
|
5
|
+
PostgreSQL's `Postgres` in `kernel/contracts.ts` needs `unsafe(text, values)` and `begin(options, fn)`. Bun.SQL and postgres.js fit without wrappers. [The node-postgres example](postgres-adapters.md) shows the transaction and result-count contract. SQLite handle contracts are exported by `@aotter/mantle/driver/d1` and `/driver/bun-sqlite`: D1 prepare/bind/all/batch, or SQLite query/exec/transaction. Reads may need only the narrower reader shape.
|
|
6
|
+
|
|
7
|
+
A third-party driver must preserve result, binding, atomicity and uncertain-outcome semantics. A handle that cannot transact must reject before invoking the callback. Never emulate an atomic Procedure with unrelated autocommit HTTP calls.
|
|
8
|
+
|
|
9
|
+
Users may choose another SQL executor, including WASM SQLite persisted to IndexedDB, at their own risk. Mantle supports bun:sqlite, D1, Bun.SQL and postgres.js; there is no bundled Durable Object adapter. The app owns any custom adapter and its tests. A third SQL engine requires forking the compiler and Store runtime, not installing a dialect plugin.
|
|
10
|
+
|
|
11
|
+
No runtime performs DDL, introspection or schema checks. Install initial SQL and rehearse migrations explicitly; see [database ownership](../concepts/runtime-and-adapters.md).
|
|
@@ -1,191 +1,20 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Add your own pages, settings, actions, record panels and field widgets to Admin in 0.2.0, bind them from manifest uiSchema, and verify them.
|
|
3
|
-
---
|
|
4
1
|
# Extend Admin
|
|
5
2
|
|
|
6
|
-
|
|
7
|
-
manifests](admin-ui.md)). When a project needs UI of its own, it adds an
|
|
8
|
-
**Admin extension**: a declaration that is plain data, server handlers, and
|
|
9
|
-
optionally one ES module with renderers. The contract is
|
|
10
|
-
[ADR-lite 1376](../../adr/adr-lite-1376-admin-extensions.md).
|
|
3
|
+
Native Admin accepts app-owned extension declarations, executable server handlers and optional same-origin client modules. Import client `defineAdminExtension` from `@aotter/mantle-admin/extension` and UI primitives from `@aotter/mantle-ui/kit`. Server types live in `@aotter/mantle-admin/server`.
|
|
11
4
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
5
|
+
| Contribution | Placement |
|
|
6
|
+
| --- | --- |
|
|
7
|
+
| pages/settings | Extension page; settings forms are generated from the supported form subset |
|
|
8
|
+
| actions | record, list selection or list toolbar |
|
|
9
|
+
| panels | record sidebar or home |
|
|
10
|
+
| fields | field input or cell |
|
|
17
11
|
|
|
18
|
-
|
|
12
|
+
Admin contributions sit behind the admin-layer gate; optional field roles default to `admin`. Server authorization is checked on every route. Handlers own finer business permissions.
|
|
19
13
|
|
|
20
|
-
|
|
21
|
-
|---|---|---|
|
|
22
|
-
| `pages` | `/admin/x/{extension}/{page}`; in **More** when it declares `nav` | a renderer |
|
|
23
|
-
| `settings` | `/admin/x/{extension}/{id}`, always in **More** | none: Admin renders a form from `schema`, which must be the form subset (a flat object whose properties are `string`, `number`, `integer` or `boolean`, with `title`, `description`, `default`, `enum`, `oneOf`, `minimum`, `maximum`, `minLength`, `maxLength`) |
|
|
24
|
-
| `actions` | `record/v1` (a record's header), `list.selection/v1` (the bulk bar), `list.toolbar/v1` (a list's toolbar) | none for `run` and `confirm` (a server `run`); a renderer for `dialog` |
|
|
25
|
-
| `panels` | `record.sidebar/v1` (a record's side column), `home/v1` (the home page) | a renderer |
|
|
26
|
-
| `fields` | `field.input/v1` (a form control), `field.cell/v1` (a list cell) | a renderer |
|
|
14
|
+
Pass full declarations to `mantle generate … --admin --admin-extensions <module>` (named/default `adminExtensions` array). Generation checks contributions, manifest uiSchema references and settings schemas, then emits `extensionMetadata` and compiled `extensionBindings` in `admin-extensions.ts`. Bind the same runtime definitions with `extensionBindings(adminExtensions)` and merge its extensions/routes into `admin()` options. Drift is refused before execution.
|
|
27
15
|
|
|
28
|
-
|
|
29
|
-
widget's `role` is optional and defaults to `contributor` (below it, Admin's
|
|
30
|
-
own control is used). The server sends each staff member only the
|
|
31
|
-
contributions their role reaches, and checks the session and role again on
|
|
32
|
-
every extension route: hiding a button is never the only guard.
|
|
16
|
+
Serve each `module` at a same-origin absolute path and install its integrity in the host shell's import map. Native Admin does not serve `source` modules or inject integrity; generation rejects source. Share React and the UI kit via the built import map, rather than bundling a second React. Canonical Admin refuses framing; use its separate same-origin preview contract.
|
|
33
17
|
|
|
34
|
-
-
|
|
35
|
-
- The extension's `api` and its served `source` are shared by all its
|
|
36
|
-
contributions, so they need only the **lowest** role among them: an owner-only
|
|
37
|
-
page does not make the `api` owner-only.
|
|
18
|
+
Raw API handlers receive the original Request. Declared `bodyLimit` checks Content-Length before DB access, but the app must bound unknown-length streams. Built-in JSON routes use the shared bounded reader after caller/origin checks. Do not lose exact OCC or uncertain-outcome handling in custom actions.
|
|
38
19
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
## A complete extension
|
|
42
|
-
|
|
43
|
-
```ts
|
|
44
|
-
// src/admin-extensions.ts
|
|
45
|
-
import type { AdminExtension } from "@aotter/mantle/admin";
|
|
46
|
-
|
|
47
|
-
const brand: AdminExtension = {
|
|
48
|
-
apiVersion: 1,
|
|
49
|
-
id: "brand",
|
|
50
|
-
title: { en: "Brand", "zh-TW": "品牌" },
|
|
51
|
-
// Admin serves this at /admin/extensions/brand.js, with its integrity computed
|
|
52
|
-
source: BRAND_MODULE,
|
|
53
|
-
contributes: {
|
|
54
|
-
pages: [{ id: "palette", title: "Palette", role: "editor", nav: { group: "more" } }],
|
|
55
|
-
settings: [{ id: "defaults", title: "Brand defaults", role: "owner", schema: {
|
|
56
|
-
type: "object", required: ["accent"],
|
|
57
|
-
properties: { accent: { type: "string", title: "Accent", enum: ["teal", "navy"] }, limit: { type: "integer", minimum: 1, maximum: 20 } },
|
|
58
|
-
} }],
|
|
59
|
-
actions: [{ id: "reindex", title: "Re-index colors", role: "editor", target: "record/v1", presentation: "confirm", when: { schema: ["products"] } }],
|
|
60
|
-
panels: [{ id: "usage", title: "Where it is used", role: "contributor", target: "record.sidebar/v1", when: { schema: ["products"] } }],
|
|
61
|
-
fields: [
|
|
62
|
-
{ id: "color", target: "field.input/v1", optionsSchema: { type: "object", properties: { palette: { type: "string", enum: ["brand", "web"] } } } },
|
|
63
|
-
{ id: "swatch", target: "field.cell/v1" },
|
|
64
|
-
],
|
|
65
|
-
},
|
|
66
|
-
handlers: {
|
|
67
|
-
settings: { defaults: { load: async () => ({ accent: "teal" }), save: async (_caller, value) => value } },
|
|
68
|
-
actions: { reindex: { run: async (caller, { record }) => ({ message: `Re-indexed ${record!.id}` }) } },
|
|
69
|
-
// GET/POST /admin/api/x/brand/api/{path}; null answers 404
|
|
70
|
-
api: async (request, { caller, path }) => (path === "usage" ? Response.json({ count: 3 }) : null),
|
|
71
|
-
},
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
export const adminExtensions: readonly AdminExtension[] = [brand];
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
`source` is the module's code (or a function returning it). How you load the
|
|
78
|
-
text is up to your host: a string constant, a Wrangler `Text` module rule, or
|
|
79
|
-
Bun's `with { type: "text" }` import. A host that serves the file itself sets
|
|
80
|
-
`module: "/path.js"` (same-origin) and optionally `integrity` instead.
|
|
81
|
-
|
|
82
|
-
## The module
|
|
83
|
-
|
|
84
|
-
The module needs no build step. Admin's import map provides `react`,
|
|
85
|
-
`react/jsx-runtime`, `react-dom`, `react-dom/client`,
|
|
86
|
-
`@aotter/mantle-ui/kit` and `@aotter/mantle-ui/extension`, so the module
|
|
87
|
-
uses Admin's own React and kit and looks like the rest of Admin. If you do
|
|
88
|
-
bundle it, mark those specifiers external.
|
|
89
|
-
|
|
90
|
-
```js
|
|
91
|
-
import { jsx } from "react/jsx-runtime";
|
|
92
|
-
import { useEffect, useState } from "react";
|
|
93
|
-
import { createRoot } from "react-dom/client";
|
|
94
|
-
import { Badge, Input } from "@aotter/mantle-ui/kit";
|
|
95
|
-
import { defineAdminExtension } from "@aotter/mantle-ui/extension";
|
|
96
|
-
|
|
97
|
-
// a renderer gets an element and a context; it may return a cleanup or { update, unmount }
|
|
98
|
-
const react = (Component) => (element, context) => {
|
|
99
|
-
const root = createRoot(element);
|
|
100
|
-
root.render(jsx(Component, { context }));
|
|
101
|
-
return { update: (next) => root.render(jsx(Component, { context: next })), unmount: () => root.unmount() };
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
function Usage({ context }) {
|
|
105
|
-
const [count, setCount] = useState(null);
|
|
106
|
-
useEffect(() => { fetch(`${context.apiBase}/usage`).then((r) => r.json()).then((b) => setCount(b.count)); }, [context.apiBase]);
|
|
107
|
-
return jsx(Badge, { children: count === null ? "…" : `${count} pages` });
|
|
108
|
-
}
|
|
109
|
-
function Color({ context }) {
|
|
110
|
-
return jsx(Input, { "aria-label": context.field.name, value: String(context.field.value ?? ""), onChange: (e) => context.onChange(e.target.value) });
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
export default defineAdminExtension({
|
|
114
|
-
pages: { palette: react(() => jsx("p", { children: "Palette" })) },
|
|
115
|
-
panels: { usage: react(Usage) },
|
|
116
|
-
fields: {
|
|
117
|
-
color: react(Color),
|
|
118
|
-
swatch: (element, context) => { element.textContent = `■ ${context.field.value ?? ""}`; },
|
|
119
|
-
},
|
|
120
|
-
});
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
The context holds `extension`, `contribution`, `apiBase` (your `api`
|
|
124
|
-
handler), `language`, `theme`, `caller.role`, and where it applies `record`
|
|
125
|
-
(`{ schema, id, version }`), `selection`, `schema`, `field`, `options` and,
|
|
126
|
-
for `field.input/v1`, `onChange`. `host.navigate(path)`, `host.notify(text)`
|
|
127
|
-
and `host.close()` (a dialog action) are the supported console API. They are
|
|
128
|
-
not a sandbox: a module is trusted same-origin code and can still reach the
|
|
129
|
-
DOM, `fetch` and whatever the signed-in session may do (see Trust).
|
|
130
|
-
|
|
131
|
-
## Bind contributions from manifests
|
|
132
|
-
|
|
133
|
-
A manifest's `uiSchema` can name a project contribution as
|
|
134
|
-
`<extension>/<contribution>`. The binding sits next to the field it changes,
|
|
135
|
-
so one change (and one review) covers both:
|
|
136
|
-
|
|
137
|
-
```yaml
|
|
138
|
-
apiVersion: cms.mantle.aotter.net/v2
|
|
139
|
-
kind: Schema
|
|
140
|
-
metadata: { name: products }
|
|
141
|
-
spec:
|
|
142
|
-
title: Products
|
|
143
|
-
lifecycle: operational
|
|
144
|
-
uiSchema:
|
|
145
|
-
fields:
|
|
146
|
-
color: { widget: brand/color, options: { palette: brand } }
|
|
147
|
-
list:
|
|
148
|
-
columns: [color]
|
|
149
|
-
cells: { color: brand/swatch }
|
|
150
|
-
panels: [brand/usage]
|
|
151
|
-
schema:
|
|
152
|
-
type: object
|
|
153
|
-
required: [name]
|
|
154
|
-
properties:
|
|
155
|
-
name: { type: string }
|
|
156
|
-
color: { type: string }
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
- `fields.<name>.widget` names a `field.input/v1` contribution (any field type);
|
|
160
|
-
`options` must satisfy its `optionsSchema`.
|
|
161
|
-
- `list.cells.<field>` (Schemas, and staff Views by output name) names a
|
|
162
|
-
`field.cell/v1` contribution.
|
|
163
|
-
- `panels` (Schemas) names `record.sidebar/v1` contributions.
|
|
164
|
-
- Procedure `uiSchema.fields.<name>.widget` works like a Schema's.
|
|
165
|
-
|
|
166
|
-
`mantle generate` checks the shape of the names. `createAdminSurface` checks
|
|
167
|
-
that each named contribution exists, has the right target and accepts its
|
|
168
|
-
`options`, and refuses to start otherwise (`UI_EXTENSION_UNKNOWN`,
|
|
169
|
-
`UI_EXTENSION_TARGET`, `UI_EXTENSION_OPTIONS`). Name only your project's own
|
|
170
|
-
extensions, so the project renders the same locally and deployed; a host that
|
|
171
|
-
adds extensions attaches them with `when`. Core checks that a name exists, not
|
|
172
|
-
whose extension it is. When a manifest names a widget for a field (even
|
|
173
|
-
`textarea`), a matching `when` does not replace it. `uiSchema` stays presentation only: the field's JSON Schema
|
|
174
|
-
still validates whatever a widget sends.
|
|
175
|
-
|
|
176
|
-
## Trust
|
|
177
|
-
|
|
178
|
-
An extension's module runs in Admin's origin with the viewer's session. It
|
|
179
|
-
has no more power than the project already has: whoever deploys the project
|
|
180
|
-
already controls its handlers and storage. Keep host routes that act beyond
|
|
181
|
-
this project (an organization console, other projects) on another origin.
|
|
182
|
-
|
|
183
|
-
## Verify
|
|
184
|
-
|
|
185
|
-
- `createAdminSurface` validates every declaration at start
|
|
186
|
-
(`UI_EXTENSION_INVALID` names the first problem).
|
|
187
|
-
- `ADMIN_EXTENSION_JSON_SCHEMA` (from `@aotter/mantle/admin`) describes a
|
|
188
|
-
declaration for tooling; `diffAdminExtensions(before, after)` lists added,
|
|
189
|
-
removed and changed contributions for review.
|
|
190
|
-
- Sign in as each role and check what appears; call
|
|
191
|
-
`/admin/api/x/{extension}/...` as a lower role and expect 403.
|
|
20
|
+
See [native Admin](native-admin.md) for mounting and acceptance and [generated descriptors](../reference/admin-descriptors.md) for build-time metadata.
|