@aotter/mantle 0.2.0-alpha.1 → 0.2.0-alpha.11
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 +180 -45
- package/dist/auth/adapter.d.ts +32 -0
- package/dist/auth/adapter.js +261 -0
- package/dist/auth/admin.d.ts +3 -0
- package/dist/auth/admin.js +18 -0
- package/dist/auth/caller.d.ts +86 -0
- package/dist/auth/caller.js +128 -0
- package/dist/auth/{createAuthRoutes.js → consent.js} +26 -54
- package/dist/auth/hardening.d.ts +24 -0
- package/dist/auth/hardening.js +33 -0
- package/dist/auth/identity.d.ts +121 -0
- package/dist/auth/identity.js +192 -0
- package/dist/auth/oauth.d.ts +63 -0
- package/dist/auth/oauth.js +185 -0
- package/dist/auth/resource-seeds.js +8 -0
- package/dist/auth/route-http.js +33 -0
- package/dist/auth/routes.d.ts +32 -0
- package/dist/auth/routes.js +80 -0
- package/dist/build/compiler.d.ts +122 -0
- package/dist/build/compiler.js +3 -0
- package/dist/{spec → build/spec}/domain/model/ManifestGrammar.d.ts +30 -43
- package/dist/{spec → build/spec}/domain/model/RuntimePlan.d.ts +77 -3
- package/dist/{spec → build/spec}/domain/model/SqlIr.d.ts +39 -6
- package/dist/build/spec/domain/model/UserFields.d.ts +21 -0
- package/dist/{spec → build/spec}/domain/service/PlanFingerprint.d.ts +4 -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 +22 -0
- package/dist/domain/adminOrder.js +22 -0
- package/dist/domain/columns.js +42 -0
- package/dist/domain/describe/chunk-SGMRVDGE.js +1 -0
- package/dist/domain/describe/index.d.ts +58 -0
- package/dist/domain/describe/index.js +1 -0
- package/dist/domain/describe/target-hash.d.ts +8 -0
- package/dist/domain/describe/target-hash.js +1 -0
- package/dist/domain/describe/targets.d.ts +40 -0
- package/dist/domain/entry.js +19 -0
- package/dist/domain/generated-tools.js +18 -0
- package/dist/domain/generation.d.ts +16 -0
- package/dist/domain/generation.js +1 -0
- package/dist/domain/input.js +15 -0
- package/dist/domain/model.js +1 -0
- package/dist/domain/paging.js +213 -0
- package/dist/domain/recipes.js +22 -0
- package/dist/domain/userReferences.js +4 -0
- package/dist/domain/wireScalars.js +41 -0
- package/dist/infrastructure/adminEntries.js +156 -0
- package/dist/infrastructure/adminPaging.js +70 -0
- package/dist/infrastructure/artifacts.js +67 -0
- package/dist/infrastructure/authSchema.js +74 -0
- package/dist/infrastructure/bundle.js +159 -0
- package/dist/infrastructure/cli.js +111 -0
- package/dist/infrastructure/generate.d.ts +12 -0
- package/dist/infrastructure/generate.js +175 -0
- package/dist/infrastructure/generateAuth.d.ts +8 -0
- package/dist/infrastructure/generateAuth.js +66 -0
- package/dist/infrastructure/help.js +55 -0
- package/dist/infrastructure/init.js +50 -0
- package/dist/infrastructure/inputs.js +32 -0
- package/dist/infrastructure/mounts.js +22 -0
- package/dist/infrastructure/wrangler.js +103 -0
- package/dist/kernel/authorization.d.ts +4 -0
- package/dist/kernel/authorization.js +15 -0
- package/dist/kernel/binds.d.ts +60 -0
- package/dist/kernel/binds.js +39 -0
- package/dist/kernel/caller-identity.d.ts +21 -0
- package/dist/kernel/caller-identity.js +7 -0
- package/dist/kernel/caller-mode.d.ts +4 -0
- package/dist/kernel/caller-mode.js +14 -0
- package/dist/kernel/contract-error.d.ts +12 -0
- package/dist/kernel/contract-error.js +14 -0
- package/dist/kernel/contracts.d.ts +135 -0
- package/dist/kernel/contracts.js +56 -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} +0 -9
- package/dist/kernel/dialect/common.d.ts +38 -0
- package/dist/kernel/dialect/common.js +3 -0
- package/dist/kernel/dialect/postgres.d.ts +16 -0
- package/dist/kernel/dialect/postgres.js +16 -0
- package/dist/kernel/dialect/sqlite.d.ts +20 -0
- package/dist/kernel/dialect/sqlite.js +29 -0
- package/dist/kernel/drain.d.ts +5 -0
- package/dist/kernel/drain.js +29 -0
- package/dist/kernel/driver/bun-sqlite.d.ts +19 -0
- package/dist/kernel/driver/bun-sqlite.js +73 -0
- package/dist/kernel/driver/d1.d.ts +24 -0
- package/dist/kernel/driver/d1.js +21 -0
- package/dist/kernel/driver/postgres.d.ts +25 -0
- package/dist/kernel/driver/postgres.js +84 -0
- package/dist/kernel/driver/transaction-context.d.ts +10 -0
- package/dist/kernel/driver/transaction-context.js +28 -0
- package/dist/kernel/email.d.ts +28 -0
- package/dist/{auth/emailTemplates.js → kernel/email.js} +9 -2
- package/dist/kernel/host-access.d.ts +10 -0
- package/dist/kernel/host-access.js +64 -0
- package/dist/kernel/host-caller.d.ts +39 -0
- package/dist/kernel/host-caller.js +53 -0
- package/dist/kernel/json-body.d.ts +4 -0
- package/dist/kernel/json-body.js +42 -0
- package/dist/kernel/mcp-apps.d.ts +69 -0
- package/dist/kernel/mcp-apps.js +35 -0
- package/dist/kernel/mcp-call.d.ts +5 -0
- package/dist/kernel/mcp-call.js +24 -0
- package/dist/kernel/mcp-handler.js +347 -0
- package/dist/kernel/mcp.d.ts +110 -0
- package/dist/kernel/mcp.js +45 -0
- package/dist/kernel/media.d.ts +27 -0
- package/dist/kernel/media.js +198 -0
- package/dist/kernel/paging.d.ts +55 -0
- package/dist/kernel/paging.js +87 -0
- package/dist/kernel/publishing.d.ts +4 -0
- package/dist/kernel/publishing.js +15 -0
- package/dist/{cloudflare/r2Media.d.ts → kernel/r2-media.d.ts} +4 -5
- package/dist/kernel/r2-media.js +71 -0
- package/dist/kernel/rest-dispatch.js +37 -0
- package/dist/kernel/rest-router.js +63 -0
- package/dist/kernel/rest.d.ts +58 -0
- package/dist/kernel/rest.js +38 -0
- package/dist/kernel/scalars.d.ts +6 -0
- package/dist/kernel/scalars.js +36 -0
- package/dist/kernel/search.js +4 -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 +39 -0
- package/dist/kernel/site.js +30 -0
- package/dist/kernel/store.d.ts +175 -0
- package/dist/kernel/store.js +244 -0
- package/dist/kernel/surface-failure.d.ts +10 -0
- package/dist/kernel/surface-failure.js +29 -0
- package/dist/kernel/surface.d.ts +10 -0
- package/dist/kernel/surface.js +16 -0
- package/dist/kernel/sweep.d.ts +17 -0
- package/dist/kernel/sweep.js +26 -0
- package/dist/kernel/translations.d.ts +1 -0
- package/dist/kernel/translations.js +12 -0
- package/dist/kernel/user-caller.d.ts +31 -0
- package/dist/kernel/user-caller.js +61 -0
- package/dist/kernel/user-field-name.js +3 -0
- package/dist/kernel/user-fields.d.ts +35 -0
- package/dist/kernel/user-fields.js +71 -0
- package/dist/kernel/validation.d.ts +15 -0
- package/dist/kernel/validation.js +46 -0
- package/dist/kernel/web-gateway.js +66 -0
- package/dist/kernel/web-head.js +14 -0
- package/dist/kernel/web-index.js +39 -0
- package/dist/kernel/web-response.js +7 -0
- package/dist/kernel/web-serve.js +97 -0
- package/dist/kernel/web.d.ts +77 -0
- package/dist/kernel/web.js +43 -0
- package/dist/kernel/where.js +21 -0
- package/dist/testing/index.d.ts +1 -37
- package/dist/testing/index.js +1 -43
- package/dist/usecase/adminBindings.js +150 -0
- package/dist/usecase/adminClient.js +66 -0
- package/dist/usecase/adminDescriptors.js +100 -0
- package/dist/usecase/generate.js +160 -0
- package/dist/usecase/handlers.js +18 -0
- package/dist/usecase/mcp-media.js +16 -0
- package/dist/usecase/mcp.js +96 -0
- package/dist/usecase/paging.js +69 -0
- package/dist/usecase/publishing.js +59 -0
- package/dist/usecase/refusals.js +27 -0
- package/dist/usecase/rest.js +53 -0
- package/dist/usecase/search.js +7 -0
- package/dist/usecase/site.js +38 -0
- package/dist/usecase/stores.js +52 -0
- package/dist/usecase/tool-version.js +6 -0
- package/dist/usecase/translations.js +76 -0
- package/dist/usecase/ttl.js +20 -0
- package/dist/usecase/validation.js +221 -0
- package/dist/usecase/web.js +23 -0
- package/docs/examples/README.md +39 -16
- package/docs/examples/app-shell/README.md +121 -0
- package/docs/examples/app-shell/accept.mjs +91 -0
- package/docs/examples/app-shell/gitignore +7 -0
- package/docs/examples/app-shell/package.json +43 -0
- package/docs/examples/app-shell/pnpm-workspace.yaml +8 -0
- package/docs/examples/app-shell/smoke-kit.mjs +168 -0
- package/docs/examples/app-shell/src/auth.ts +58 -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 +16 -0
- package/docs/examples/app-shell/src/schedule.ts +8 -0
- package/docs/examples/app-shell/src/service.ts +71 -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 +6 -2
- package/docs/examples/app-shell/worker-configuration.d.ts +22 -0
- package/docs/examples/app-shell/wrangler.jsonc +62 -0
- package/docs/examples/club-events/README.md +65 -0
- package/docs/examples/club-events/manifests/club-events.yaml +247 -0
- package/docs/examples/club-events/smoke.mjs +127 -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 +78 -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 +8 -0
- package/docs/examples/purchasing/.dev.vars.example +6 -0
- package/docs/examples/purchasing/README.md +99 -0
- package/docs/examples/purchasing/manifests/purchasing.yaml +374 -0
- package/docs/examples/purchasing/seed.sql +4 -0
- package/docs/examples/purchasing/smoke.mjs +191 -0
- package/docs/examples/purchasing/src/admin.tsx +13 -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 +69 -0
- package/docs/examples/recipes/README.md +60 -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 +74 -0
- package/docs/handbook/cloudflare/authentication.md +186 -108
- package/docs/handbook/cloudflare/chatgpt-sites.md +5 -112
- package/docs/handbook/cloudflare/deploy-and-operate.md +59 -87
- package/docs/handbook/cloudflare/media-r2.md +61 -82
- package/docs/handbook/cloudflare/service-entry.md +223 -119
- package/docs/handbook/concepts/authorization.md +10 -117
- 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 +24 -116
- package/docs/handbook/concepts/procedures-and-triggers.md +5 -162
- package/docs/handbook/concepts/runtime-and-adapters.md +15 -183
- 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-ui.md +113 -136
- package/docs/handbook/guides/agent-setup.md +32 -27
- package/docs/handbook/guides/agent-workflow-acceptance.md +232 -0
- package/docs/handbook/guides/email.md +86 -0
- package/docs/handbook/guides/local-testing.md +40 -0
- package/docs/handbook/guides/mcp-apps.md +560 -0
- package/docs/handbook/guides/native-admin.md +566 -0
- package/docs/handbook/guides/native-execution.md +133 -0
- package/docs/handbook/guides/oauth.md +219 -0
- package/docs/handbook/guides/postgres-adapters.md +56 -0
- package/docs/handbook/guides/public-pages.md +93 -0
- package/docs/handbook/guides/size-and-startup.md +9 -0
- package/docs/handbook/guides/sql-patterns.md +266 -0
- package/docs/handbook/guides/typed-queries.md +210 -100
- package/docs/handbook/navigation.json +176 -30
- package/docs/handbook/reference/admin-descriptors.md +56 -0
- package/docs/handbook/reference/authorization.md +44 -52
- package/docs/handbook/reference/describe.md +56 -0
- package/docs/handbook/reference/diagnostics.md +19 -77
- package/docs/handbook/reference/features.md +45 -53
- package/docs/handbook/reference/manifest.md +6 -69
- package/docs/handbook/reference/procedure.md +11 -115
- package/docs/handbook/reference/schema.md +81 -172
- package/docs/handbook/reference/site-config.md +5 -65
- package/docs/handbook/reference/sql.md +64 -0
- package/docs/handbook/reference/surface.md +396 -93
- package/docs/handbook/reference/trigger.md +62 -89
- package/docs/handbook/reference/view.md +40 -158
- package/docs/handbook/releases/index.md +198 -12
- package/docs/handbook/start/agents.md +45 -0
- package/docs/handbook/start/overview.md +9 -56
- package/docs/handbook/start/project-and-cli.md +51 -131
- package/docs/handbook/start/quickstart-worker.md +38 -115
- package/docs/skills/develop/SKILL.md +77 -121
- package/docs/skills/integrate/SKILL.md +37 -84
- package/docs/skills/media-gc/SKILL.md +21 -8
- package/docs/skills/provision/SKILL.md +31 -87
- package/docs/skills/update/SKILL.md +20 -34
- package/docs/source/scripts/postgres-adapter.ts +101 -0
- package/docs/upgrade-0.1-to-0.2.md +26 -10
- package/package.json +120 -112
- package/skills/README.md +67 -0
- package/skills/mantle/SKILL.md +76 -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 -22
- package/dist/admin/createAdminSurface.d.ts.map +0 -1
- package/dist/admin/createAdminSurface.js +0 -589
- package/dist/admin/createAdminSurface.js.map +0 -1
- package/dist/admin/developerConsole.d.ts +0 -264
- 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/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 -4
- package/dist/admin/index.d.ts.map +0 -1
- package/dist/admin/index.js +0 -4
- package/dist/admin/index.js.map +0 -1
- package/dist/admin/procedureFlow.d.ts +0 -25
- package/dist/admin/procedureFlow.d.ts.map +0 -1
- package/dist/admin/procedureFlow.js +0 -154
- 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 -4565
- package/dist/auth/buildAuth.d.ts.map +0 -1
- package/dist/auth/buildAuth.js +0 -307
- package/dist/auth/buildAuth.js.map +0 -1
- package/dist/auth/callerResolver.d.ts +0 -48
- package/dist/auth/callerResolver.d.ts.map +0 -1
- package/dist/auth/callerResolver.js +0 -49
- 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 -483
- package/dist/auth/createMantleAuth.js.map +0 -1
- package/dist/auth/db.d.ts +0 -17
- package/dist/auth/db.d.ts.map +0 -1
- package/dist/auth/db.js +0 -24
- 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 -65
- package/dist/bun/index.d.ts.map +0 -1
- package/dist/bun/index.js +0 -130
- 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 -355
- 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 -352
- package/dist/cli/preset.js.map +0 -1
- package/dist/cloudflare/index.d.ts +0 -21
- package/dist/cloudflare/index.d.ts.map +0 -1
- package/dist/cloudflare/index.js +0 -14
- 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 -41
- 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 -17
- 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/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/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 -65
- package/dist/core/sql/allowlist.d.ts.map +0 -1
- package/dist/core/sql/allowlist.js +0 -705
- 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 -121
- package/dist/core/sql/policy.d.ts.map +0 -1
- package/dist/core/sql/policy.js +0 -379
- 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 -76
- package/dist/core/sql/run.d.ts.map +0 -1
- package/dist/core/sql/run.js +0 -267
- 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 -16
- package/dist/core/withCaller.d.ts.map +0 -1
- package/dist/core/withCaller.js +0 -29
- 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 -13
- package/dist/d1/executor.d.ts.map +0 -1
- package/dist/d1/executor.js +0 -91
- 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 -34
- package/dist/mcp/createMcpSurface.d.ts.map +0 -1
- package/dist/mcp/createMcpSurface.js +0 -150
- 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/postgres/adapter.d.ts +0 -20
- package/dist/postgres/adapter.d.ts.map +0 -1
- package/dist/postgres/adapter.js +0 -44
- 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 -92
- package/dist/postgres/driver.d.ts.map +0 -1
- package/dist/postgres/driver.js +0 -110
- package/dist/postgres/driver.js.map +0 -1
- package/dist/postgres/executor.d.ts +0 -20
- package/dist/postgres/executor.d.ts.map +0 -1
- package/dist/postgres/executor.js +0 -69
- package/dist/postgres/executor.js.map +0 -1
- package/dist/postgres/index.d.ts +0 -7
- package/dist/postgres/index.d.ts.map +0 -1
- package/dist/postgres/index.js +0 -7
- 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 -157
- 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 -121
- package/dist/postgres/print.js.map +0 -1
- package/dist/postgres/storage.d.ts +0 -19
- package/dist/postgres/storage.d.ts.map +0 -1
- package/dist/postgres/storage.js +0 -201
- package/dist/postgres/storage.js.map +0 -1
- package/dist/postgres/textRows.d.ts +0 -10
- package/dist/postgres/textRows.d.ts.map +0 -1
- package/dist/postgres/textRows.js +0 -44
- package/dist/postgres/textRows.js.map +0 -1
- package/dist/postgres/validator.d.ts +0 -12
- package/dist/postgres/validator.d.ts.map +0 -1
- package/dist/postgres/validator.js +0 -46
- 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 -149
- 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 -42
- package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts.map +0 -1
- package/dist/spec/domain/service/SchemaAdminUiChecker.js +0 -289
- 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 -53
- 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 -282
- 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 -296
- 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 -12
- package/dist/testing/cases/corpus.d.ts.map +0 -1
- package/dist/testing/cases/corpus.js +0 -91
- package/dist/testing/cases/corpus.js.map +0 -1
- package/dist/testing/cases/policy.d.ts +0 -74
- package/dist/testing/cases/policy.d.ts.map +0 -1
- package/dist/testing/cases/policy.js +0 -142
- 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 -32
- 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 -33
- 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 -39
- 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 -919
- 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 -25
- package/docs/adr/0032-store-centric-core-and-service-contract.md +0 -361
- 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 -124
- package/docs/adr/0038-bun-native-host.md +0 -63
- package/docs/adr/README.md +0 -96
- 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 -481
- 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 -215
- 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 -156
- 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/skills/develop/mcp-app.md +0 -79
- /package/docs/examples/{reference-service → app-shell}/.dev.vars.example +0 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { scoped } from "./user-fields.js";
|
|
2
|
+
import { modeOf, checkFresh } from "./caller-mode.js";
|
|
3
|
+
import { binds as evaluate, encode } from "./binds.js";
|
|
4
|
+
import { ContractError } from "./contracts.js";
|
|
5
|
+
import { condition } from "./where.js";
|
|
6
|
+
import { decodeCursor, encodeCursor } from "./paging.js";
|
|
7
|
+
export { decodeCursor, encodeCursor };
|
|
8
|
+
export const SCOPE = "$scope", TTL = "$ttl";
|
|
9
|
+
const SYSTEM = ["id", "version", "created_at", "updated_at", "author_id", "status", "published_at", "_rid"];
|
|
10
|
+
export function expand(r, f) {
|
|
11
|
+
const all = (l) => l.flatMap(([c, ...t]) => (c = c === SCOPE ? f.s : c === TTL ? f.ttl?.[0] : c === "status" && !f.pub ? "" : c) ? [[c, ...t.map(v => v.k === "cutoff" ? { ...v, seconds: f.ttl[1] } : v)]] : []);
|
|
12
|
+
return { caller: [...all(r.caller), ...(f.parent ? [f.parent.visible] : []), ...(f.u ?? [])], trusted: all(r.trusted), fills: all(r.fills), sets: all(r.sets), lock: r.lock };
|
|
13
|
+
}
|
|
14
|
+
export function renderTerm(d, t, prefix, placeholder) {
|
|
15
|
+
const literal = (v) => `'${v.replaceAll("'", "''")}'`;
|
|
16
|
+
const param = (r) => typeof placeholder === "string" ? placeholder : placeholder(r);
|
|
17
|
+
if (t[1] === 'in') {
|
|
18
|
+
const kept = d.anyOf(prefix + d.ident(t[0]), param(t[2]), t[2].type);
|
|
19
|
+
return t[2].scope ? `(/*s:${t[2].field}*/${kept}/*|*/(${kept} OR 1 = 1)/*;*/)` : kept;
|
|
20
|
+
}
|
|
21
|
+
if (t[1] === "parent") {
|
|
22
|
+
const [column, , value, parent] = t, alias = prefix === "_mantle_parent." || prefix === d.ident("_mantle_parent") + "." ? "_mantle_parent_" : "_mantle_parent";
|
|
23
|
+
const conditions = [`${alias}.${d.ident(column)} = ${prefix}${d.ident(column)}`, ...(parent.scope ? [`${alias}.${d.ident(parent.scope[0])} = ${prefix}${d.ident(parent.scope[1])}`] : []), ...parent.terms.map(t => renderTerm(d, t, alias + ".", param))];
|
|
24
|
+
const exists = `EXISTS (SELECT 1 FROM ${d.ident(parent.table)} ${alias} WHERE ${conditions.join(" AND ")})`;
|
|
25
|
+
return parent.admin ? `(${param(value)} = 1 OR ${exists})` : exists;
|
|
26
|
+
}
|
|
27
|
+
const [column, op, value, published] = t;
|
|
28
|
+
if (op !== 'eq' && op !== 'ttl' && op !== 'admin')
|
|
29
|
+
throw new ContractError('USER_REFS_VERSION', 'Unknown row-policy operator.');
|
|
30
|
+
const c = prefix + d.ident(column), bound = param(value);
|
|
31
|
+
if (op === "admin")
|
|
32
|
+
return `(${c} = ${literal(published)} OR ${bound} = 1)`;
|
|
33
|
+
return op === "ttl" ? `(${c} IS NULL OR ${c} > ${bound})` : `${c} = ${bound}`;
|
|
34
|
+
}
|
|
35
|
+
const transactionStores = new WeakSet();
|
|
36
|
+
export function handlerTransaction(store, db) {
|
|
37
|
+
const open = store.transaction;
|
|
38
|
+
return (fn) => transactionStores.has(store) ? fn({ store, db }) : open((tx, txDb) => fn({ store: tx, db: txDb }));
|
|
39
|
+
}
|
|
40
|
+
export function createStore(d, drv, rules, facts, operations) {
|
|
41
|
+
const prepared = new Map();
|
|
42
|
+
const prepare = (name) => {
|
|
43
|
+
let p = prepared.get(name);
|
|
44
|
+
if (!p) {
|
|
45
|
+
const f = facts[name];
|
|
46
|
+
prepared.set(name, p = { name, f, scope: f.s?.toLowerCase(), x: expand(rules, f), from: ` FROM ${d.ident(name)} r`, ts: ["created_at", "updated_at", ...f.ts ?? []], d: f.d ?? [], policy: new Map() });
|
|
47
|
+
}
|
|
48
|
+
return p;
|
|
49
|
+
};
|
|
50
|
+
const wires = (p, prefix) => [p.ts, p.d].flatMap((columns, i) => columns.map(c => `${(i ? d.wireDate : d.wireTimestamp)(prefix + d.ident(c)).join("")} AS ${d.ident(c)}`)).join(", ");
|
|
51
|
+
const ID = d.ident("id");
|
|
52
|
+
const policy = (p, trusted, terms) => {
|
|
53
|
+
const parentTerms = p.f.parent ? trusted ? p.f.parent.trusted : p.f.parent.caller : [];
|
|
54
|
+
const cached = p.policy.get(trusted);
|
|
55
|
+
if (cached)
|
|
56
|
+
return cached;
|
|
57
|
+
const recipes = [], param = (r) => (recipes.push(r), d.param(recipes.length));
|
|
58
|
+
const sql = terms.map(t => renderTerm(d, t, "r.", param)).join(" AND ");
|
|
59
|
+
let from = p.from, projection = "";
|
|
60
|
+
const parent = p.f.parent;
|
|
61
|
+
if (parent) {
|
|
62
|
+
const alias = "_mantle_merge", conditions = [`${alias}.${d.ident(parent.on)} = r.${d.ident(parent.on)}`, ...(parent.scope ? [`${alias}.${d.ident(parent.scope[0])} = r.${d.ident(parent.scope[1])}`] : []), ...parentTerms.map(t => renderTerm(d, t, alias + ".", param))];
|
|
63
|
+
from += ` LEFT JOIN ${d.ident(parent.table)} ${alias} ON ${alias}.${ID} = (SELECT ${alias}.${ID} FROM ${d.ident(parent.table)} ${alias} WHERE ${conditions.join(" AND ")} ORDER BY ${alias}.${d.ident("created_at")} DESC, ${alias}.${ID} DESC LIMIT 1)`;
|
|
64
|
+
projection = parent.fields.map(c => `${(parent.ts.includes(c) ? d.wireTimestamp(alias + "." + d.ident(c)).join("") : parent.d.includes(c) ? d.wireDate(alias + "." + d.ident(c)).join("") : alias + "." + d.ident(c))} AS ${d.ident(c)}`).join(", ");
|
|
65
|
+
}
|
|
66
|
+
const preparedPolicy = { sql, recipes, from, projection, terms };
|
|
67
|
+
p.policy.set(trusted, preparedPolicy);
|
|
68
|
+
return preparedPolicy;
|
|
69
|
+
};
|
|
70
|
+
return ((db, caller, options) => make(db, caller, false, options));
|
|
71
|
+
function make(db, caller, inTransaction = false, options) {
|
|
72
|
+
const pending = new WeakMap();
|
|
73
|
+
const write = (build, project, path) => {
|
|
74
|
+
const state = { build: () => { checkFresh(caller, false, path); return build(); }, project };
|
|
75
|
+
const run = () => {
|
|
76
|
+
if (!state.promise) {
|
|
77
|
+
state.promise = state.claimed ? Promise.reject(new Error("Write has already been batched.")) : Promise.resolve().then(async () => project((await drv.procedure(db, [state.build()], path))[0]));
|
|
78
|
+
state.claimed = true;
|
|
79
|
+
}
|
|
80
|
+
return state.promise;
|
|
81
|
+
};
|
|
82
|
+
const value = { then: (yes, no) => run().then(yes, no), catch: no => run().catch(no), finally: done => run().finally(done) };
|
|
83
|
+
pending.set(value, state);
|
|
84
|
+
return value;
|
|
85
|
+
};
|
|
86
|
+
const store = {
|
|
87
|
+
collection: (name) => collection(db, caller, prepare(name), write),
|
|
88
|
+
...Object.fromEntries(Object.keys(operations ?? {}).map(kind => {
|
|
89
|
+
const cache = Object.create(null);
|
|
90
|
+
return [kind, new Proxy(operations[kind], { get: (functions, name) => {
|
|
91
|
+
if (Object.hasOwn(cache, name))
|
|
92
|
+
return cache[name];
|
|
93
|
+
const fn = functions[name];
|
|
94
|
+
return fn && (cache[name] = (input) => fn(db, caller, input, options && { ...options, store }));
|
|
95
|
+
} })];
|
|
96
|
+
})),
|
|
97
|
+
...(!inTransaction && { batch: async (writes) => {
|
|
98
|
+
const states = writes.map(w => pending.get(w));
|
|
99
|
+
if (new Set(writes).size !== writes.length || states.some(s => !s || s.claimed))
|
|
100
|
+
throw new Error("Batch needs unused Writes from this Store.");
|
|
101
|
+
for (const s of states)
|
|
102
|
+
s.claimed = true;
|
|
103
|
+
const rows = writes.length ? await drv.procedure(db, states.map(s => s.build()), "store/batch") : [];
|
|
104
|
+
return states.map((s, i) => s.project(rows[i]));
|
|
105
|
+
} }),
|
|
106
|
+
...(drv.transaction && { transaction: async (fn, txOptions) => {
|
|
107
|
+
if (inTransaction)
|
|
108
|
+
throw new Error("Nested transactions are not supported.");
|
|
109
|
+
return drv.transaction(db, tx => fn(make(tx, caller, true, options), tx), txOptions);
|
|
110
|
+
} }),
|
|
111
|
+
};
|
|
112
|
+
if (inTransaction)
|
|
113
|
+
transactionStores.add(store);
|
|
114
|
+
return store;
|
|
115
|
+
}
|
|
116
|
+
function collection(db, caller, p, write) {
|
|
117
|
+
const trusted = modeOf(caller) === "trusted", { f, x } = p, terms = trusted ? x.trusted : x.caller, pol = policy(p, trusted, terms), no = (message) => new ContractError("INPUT_VALIDATION_FAILED", `${p.name}: ${message}`);
|
|
118
|
+
const put = (values, column, v) => {
|
|
119
|
+
const type = p.ts.includes(column) ? "timestamptz" : p.d.includes(column) ? "date" : v !== null && typeof v === "object" && !(v instanceof Date) ? "json" : "";
|
|
120
|
+
values.push(type === "json" ? JSON.stringify(v) : encode(d, type, v));
|
|
121
|
+
return d.cast(d.param(values.length), type);
|
|
122
|
+
};
|
|
123
|
+
const conditions = (where, values) => {
|
|
124
|
+
const out = [];
|
|
125
|
+
for (const [name, spec] of Object.entries(where ?? {})) {
|
|
126
|
+
const operators = spec !== null && typeof spec === "object" && !(spec instanceof Date) && !Array.isArray(spec) ? Object.entries(spec) : [["eq", spec]];
|
|
127
|
+
for (const [op, v] of operators) {
|
|
128
|
+
const left = `r.${d.ident(name)}`, bind = (x) => put(values, name, x);
|
|
129
|
+
out.push(op === "isNull" ? condition(d, left, v ? "eq" : "ne", null, bind) : condition(d, left, op, v, bind));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return out;
|
|
133
|
+
};
|
|
134
|
+
const rows = (sql, values) => drv.read(db, scoped(sql, caller), values);
|
|
135
|
+
const clean = (list) => { for (const r of list) {
|
|
136
|
+
delete r._rid;
|
|
137
|
+
if (f.s)
|
|
138
|
+
delete r[f.s];
|
|
139
|
+
} return list; };
|
|
140
|
+
const select = () => pol.select ??= `SELECT r.*, ${wires(p, "r.")}${pol.projection ? ", " + pol.projection : ""}${pol.from}`;
|
|
141
|
+
const where = (conds) => { const all = pol.sql ? [pol.sql, ...conds] : conds; return all.length ? ` WHERE ${all.join(" AND ")}` : ""; };
|
|
142
|
+
const base = () => evaluate(d, pol.recipes, caller);
|
|
143
|
+
async function find(q = {}) {
|
|
144
|
+
const dir = q.order ?? "asc", name = q.orderBy ?? "id", limit = q.limit ?? 50;
|
|
145
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 500)
|
|
146
|
+
throw no("limit is 1 to 500");
|
|
147
|
+
const values = base(), conds = conditions(q.where, values);
|
|
148
|
+
if (q.search !== undefined) {
|
|
149
|
+
if (typeof q.search !== "string" || !q.search.trim() || q.search.includes("\0"))
|
|
150
|
+
throw no("search takes a non-empty string without NUL");
|
|
151
|
+
values.push(q.search.trim());
|
|
152
|
+
const query = d.param(values.length), exact = `r.${ID} = ${query}`;
|
|
153
|
+
conds.push(f.search?.length ? `(${exact} OR ${d.search(p.name, f.search, "r", query)})` : exact);
|
|
154
|
+
}
|
|
155
|
+
const id = `r.${ID}`, kc = `r.${d.ident(name)}`, up = dir === "asc", way = up ? "ASC" : "DESC";
|
|
156
|
+
if (q.cursor !== undefined) {
|
|
157
|
+
const [v, last] = decodeCursor(q.cursor, p.name + "/cursor");
|
|
158
|
+
values.push(last);
|
|
159
|
+
const after = `${id} ${up ? ">" : "<"} ${d.param(values.length)}`;
|
|
160
|
+
if (name === "id")
|
|
161
|
+
conds.push(after);
|
|
162
|
+
else if (v === null)
|
|
163
|
+
conds.push(`(${kc} IS NULL AND ${after})`);
|
|
164
|
+
else {
|
|
165
|
+
const m = put(values, name, v);
|
|
166
|
+
conds.push(`(${kc} ${up ? ">" : "<"} ${m} OR (${kc} = ${m} AND ${after}) OR ${kc} IS NULL)`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const list = await rows(`${select()}${where(conds)} ORDER BY ${name === "id" ? "" : `${kc} ${way} NULLS LAST, `}${id} ${way} LIMIT ${limit + 1}`, values);
|
|
170
|
+
if (list.length <= limit)
|
|
171
|
+
return { rows: clean(list), cursor: null };
|
|
172
|
+
const page = list.slice(0, limit), end = page[limit - 1];
|
|
173
|
+
return { rows: clean(page), cursor: encodeCursor(end[name], end.id) };
|
|
174
|
+
}
|
|
175
|
+
const writer = (lock) => {
|
|
176
|
+
const values = [], ms = Date.now(), into = d.ident(p.name);
|
|
177
|
+
const push = (v) => (values.push(v), d.param(values.length));
|
|
178
|
+
const recipe = (r) => push(evaluate(d, [r], caller, { version: lock }, ms)[0]);
|
|
179
|
+
const marks = new Map();
|
|
180
|
+
const given = (set, insert = false) => Object.entries(set).map(([name, v]) => {
|
|
181
|
+
const key = name.toLowerCase();
|
|
182
|
+
if (SYSTEM.includes(key) || key === p.scope || !insert && !!f.u?.some(u => u[0] === key))
|
|
183
|
+
throw no(`${name} is not writable`);
|
|
184
|
+
if (v === undefined)
|
|
185
|
+
throw no(`${name} is undefined`);
|
|
186
|
+
const mark = put(values, name, v);
|
|
187
|
+
if (v !== null)
|
|
188
|
+
marks.set(key, mark);
|
|
189
|
+
return [d.ident(name), mark];
|
|
190
|
+
});
|
|
191
|
+
const refs = (child) => trusted ? [] : (f.ref ?? []).flatMap(r => { const v = marks.get(r.column); return v ? [`EXISTS (SELECT 1 FROM ${d.ident(r.table)} _mantle_ref WHERE ${[`_mantle_ref.${d.ident(r.field)} = ${v}`, ...r.same.map(([parent, column]) => `_mantle_ref.${d.ident(parent)} = ${child(column) ?? "NULL"}`), ...r.terms.map(t => renderTerm(d, t, "_mantle_ref.", recipe))].join(" AND ")})`] : []; });
|
|
192
|
+
const guard = (id, also = []) => ` WHERE ${[`${ID} = ${push(id)}`, ...[...pol.terms, x.lock].map(t => renderTerm(d, t, t[1] === "parent" ? d.ident(p.name) + "." : "", recipe)), ...also].join(" AND ")}`;
|
|
193
|
+
const step = (sql) => ({ sql: scoped(sql, caller), binds: values, row: true });
|
|
194
|
+
return { given, marks, recipe, refs, guard, step, into, returning: () => ` RETURNING *, ${p.returning ??= wires(p, "")}` };
|
|
195
|
+
};
|
|
196
|
+
return {
|
|
197
|
+
async findById(id) {
|
|
198
|
+
const values = base();
|
|
199
|
+
values.push(id);
|
|
200
|
+
return clean(await rows(pol.byId ??= `${select()}${where([`r.${ID} = ${d.param(values.length)}`])} LIMIT 1`, values))[0] ?? null;
|
|
201
|
+
},
|
|
202
|
+
find,
|
|
203
|
+
async first(q = {}) { return (await find({ ...q, limit: 1 })).rows[0] ?? null; },
|
|
204
|
+
async count(w) {
|
|
205
|
+
const values = base(), conds = conditions(w, values);
|
|
206
|
+
return Number((await rows(`SELECT COUNT(*) AS "count"${pol.from}${where(conds)}`, values))[0].count);
|
|
207
|
+
},
|
|
208
|
+
insert(set) {
|
|
209
|
+
return write(() => {
|
|
210
|
+
if (f.s && caller.kind === "anonymous")
|
|
211
|
+
throw new ContractError("UNAUTHENTICATED", "A scoped insert requires an authenticated caller.", `${p.name}/insert`);
|
|
212
|
+
if (f.u?.length)
|
|
213
|
+
set = d.scopeInsert(f.u.map(u => ({ column: u[0], field: u[2].field, type: u[2].type })), caller, set);
|
|
214
|
+
const w = writer(), names = [], marks = [];
|
|
215
|
+
for (const [name, mark] of w.given(set, true)) {
|
|
216
|
+
names.push(name);
|
|
217
|
+
marks.push(mark);
|
|
218
|
+
}
|
|
219
|
+
for (const [column, v] of x.fills) {
|
|
220
|
+
names.push(d.ident(column));
|
|
221
|
+
marks.push(v === "newId" ? rules.newId : w.recipe(v));
|
|
222
|
+
}
|
|
223
|
+
const refs = w.refs(column => w.marks.get(column));
|
|
224
|
+
return w.step(`INSERT INTO ${w.into} (${names.join(", ")}) ${refs.length ? `SELECT ${marks.join(", ")} WHERE ${refs.join(" AND ")}` : `VALUES (${marks.join(", ")})`}${w.returning()}`);
|
|
225
|
+
}, rows => clean(rows)[0], `${p.name}/insert`);
|
|
226
|
+
},
|
|
227
|
+
update(id, set, { lock }) {
|
|
228
|
+
return write(() => {
|
|
229
|
+
const w = writer(lock), assigns = w.given(set).map(([name, mark]) => `${name} = ${mark}`);
|
|
230
|
+
for (const [column, v] of x.sets)
|
|
231
|
+
assigns.push(`${d.ident(column)} = ${v === "bump" ? `${d.ident(column)} + 1` : w.recipe(v)}`);
|
|
232
|
+
const refs = w.refs(column => `${w.into}.${d.ident(column)}`);
|
|
233
|
+
return w.step(`UPDATE ${w.into} SET ${assigns.join(", ")}${w.guard(id, refs)}${w.returning()}`);
|
|
234
|
+
}, rows => clean(rows)[0], `${p.name}/update`);
|
|
235
|
+
},
|
|
236
|
+
delete(id, { lock }) {
|
|
237
|
+
return write(() => {
|
|
238
|
+
const w = writer(lock);
|
|
239
|
+
return w.step(`DELETE FROM ${w.into}${w.guard(id)}`);
|
|
240
|
+
}, () => undefined, `${p.name}/delete`);
|
|
241
|
+
},
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { wire, type Caller } from "./contracts.js";
|
|
2
|
+
/** A cookie is ambient authority; bearer credentials deliberately supplied by the app are not. */
|
|
3
|
+
export declare function checkOrigin(request: Request, caller: Caller): void;
|
|
4
|
+
/** A resolver's ContractError (e.g. UNAUTHENTICATED for an expired token) keeps its status; anything else is an application failure. */
|
|
5
|
+
export declare function surfaceCaller<Env>(request: Request, env: Env, resolve: (request: Request, env: Env, authority: {
|
|
6
|
+
readonly readOnly: boolean;
|
|
7
|
+
}) => Caller | Promise<Caller>, readOnly?: boolean): Promise<Caller>;
|
|
8
|
+
/** The client sees the redacted wire form; the log gets the surface (a route or tool, never headers) and the original message, stack and cause. */
|
|
9
|
+
export declare function surfaceError(error: unknown, where?: string): ReturnType<typeof wire>;
|
|
10
|
+
export declare function surfaceFailure(error: unknown, challenge?: string, where?: string): Response;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ContractError } from "./contract-error.js";
|
|
2
|
+
import { wire } from "./contracts.js";
|
|
3
|
+
export function checkOrigin(request, caller) {
|
|
4
|
+
if (!("credential" in caller) || caller.credential !== "session" || ["GET", "HEAD", "OPTIONS"].includes(request.method))
|
|
5
|
+
return;
|
|
6
|
+
const site = request.headers.get("sec-fetch-site"), origin = request.headers.get("origin");
|
|
7
|
+
if ((!site && !origin) || (site && site !== "same-origin" && site !== "none") || (origin && origin !== new URL(request.url).origin))
|
|
8
|
+
throw new ContractError("AUTH_DENIED", "Cross-origin session mutation rejected.", "request:origin");
|
|
9
|
+
}
|
|
10
|
+
export async function surfaceCaller(request, env, resolve, readOnly = false) {
|
|
11
|
+
try {
|
|
12
|
+
return await resolve(request, env, { readOnly });
|
|
13
|
+
}
|
|
14
|
+
catch (cause) {
|
|
15
|
+
if (cause instanceof ContractError)
|
|
16
|
+
throw cause;
|
|
17
|
+
throw new Error("Caller resolution failed.", { cause });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function surfaceError(error, where = "surface") {
|
|
21
|
+
const result = wire(error);
|
|
22
|
+
if (result.status === 500)
|
|
23
|
+
console.error(`[mantle ${where}] unhandled failure`, error);
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
export function surfaceFailure(error, challenge, where) {
|
|
27
|
+
const result = surfaceError(error, where);
|
|
28
|
+
return Response.json({ error: result.error }, { status: result.status, headers: { "cache-control": "private, no-store", ...(challenge && [401, 403].includes(result.status) && result.error.path !== "request:origin" ? { "www-authenticate": challenge } : {}) } });
|
|
29
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** INPUT_VALIDATION_FAILED at `path`. */
|
|
2
|
+
export declare function invalid(message: string, path: string): never;
|
|
3
|
+
/**
|
|
4
|
+
* How each validated boundary field becomes a driver input, per declared bind: `json` is stringified, `bool` becomes
|
|
5
|
+
* 0/1 (SQLite only), anything else passes through; a missing value binds as null. Only fields an input bind reads.
|
|
6
|
+
*/
|
|
7
|
+
export type Conversions = ReadonlyArray<readonly [field: string, type: "" | "json" | "bool"]>;
|
|
8
|
+
export declare function convert(input: Record<string, unknown>, fields?: Conversions): void;
|
|
9
|
+
/** Path decoding for a matched template; a malformed escape is an input failure at `path`. */
|
|
10
|
+
export declare function decode(keys: readonly string[], match: RegExpExecArray, message: string, path: string): Record<string, string>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ContractError } from "./contracts.js";
|
|
2
|
+
export function invalid(message, path) { throw new ContractError("INPUT_VALIDATION_FAILED", message, path); }
|
|
3
|
+
export function convert(input, fields = []) {
|
|
4
|
+
for (const [key, type] of fields) {
|
|
5
|
+
const value = input[key];
|
|
6
|
+
input[key] = value == null ? null : type === "json" ? JSON.stringify(value) : type === "bool" ? Number(value) : value;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function decode(keys, match, message, path) {
|
|
10
|
+
try {
|
|
11
|
+
return Object.fromEntries(keys.map((key, index) => [key, decodeURIComponent(match[index + 1])]));
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
invalid(message, path);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Host-only TTL maintenance; the selected candidates and delete share one native transaction. */
|
|
2
|
+
import { type Caller, type Row } from "./contracts.js";
|
|
3
|
+
import { type Values } from "./binds.js";
|
|
4
|
+
export interface SweepInput {
|
|
5
|
+
readonly limit?: number;
|
|
6
|
+
readonly cursor?: string;
|
|
7
|
+
readonly delete?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface SweepResult {
|
|
10
|
+
readonly scanned: number;
|
|
11
|
+
readonly removed: number;
|
|
12
|
+
readonly nextCursor?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function sweep<DB>(db: DB, caller: Caller, input: SweepInput, path: string, seconds: number, sql: readonly [string, string], d: Values, execute: (db: DB, steps: {
|
|
15
|
+
sql: string;
|
|
16
|
+
binds: unknown[];
|
|
17
|
+
}[], path: string) => Promise<Row[][]>): Promise<SweepResult>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ContractError } from "./contracts.js";
|
|
2
|
+
import { binds } from "./binds.js";
|
|
3
|
+
export async function sweep(db, caller, input, path, seconds, sql, d, execute) {
|
|
4
|
+
if (caller.kind !== "system" || typeof caller.reason !== "string" || !caller.reason.trim())
|
|
5
|
+
throw new ContractError("AUTH_DENIED", "TTL maintenance requires a host system caller with a reason.", path);
|
|
6
|
+
const limit = input.limit ?? 500;
|
|
7
|
+
const invalid = () => { throw new ContractError("INPUT_VALIDATION_FAILED", "Sweep limit must be 1..500, delete boolean, and cursor belong to this sweep.", path); };
|
|
8
|
+
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 500 || input.delete !== undefined && typeof input.delete !== "boolean")
|
|
9
|
+
invalid();
|
|
10
|
+
let after = 0;
|
|
11
|
+
if (input.cursor !== undefined) {
|
|
12
|
+
try {
|
|
13
|
+
const value = JSON.parse(decodeURIComponent(input.cursor));
|
|
14
|
+
if (!Array.isArray(value) || value.length !== 2 || value[0] !== path || !Number.isSafeInteger(value[1]) || value[1] < 1)
|
|
15
|
+
invalid();
|
|
16
|
+
after = value[1];
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
invalid();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const values = [...binds(d, [{ k: "cutoff", seconds }], caller), after, limit];
|
|
23
|
+
const [selected, deleted] = await execute(db, (input.delete === false ? [sql[0]] : sql).map(sql => ({ sql, binds: values })), path);
|
|
24
|
+
const last = Number(selected.at(-1)?._rid);
|
|
25
|
+
return { scanned: selected.length, removed: deleted?.length ?? 0, ...(selected.length === limit ? { nextCursor: encodeURIComponent(JSON.stringify([path, last])) } : {}) };
|
|
26
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function toCanonicalLocale(value: string): string;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { invalid } from "./surface.js";
|
|
2
|
+
export function toCanonicalLocale(value) {
|
|
3
|
+
if (typeof value !== "string" || !value)
|
|
4
|
+
invalid("Invalid locale.", "locale");
|
|
5
|
+
let parts = value.replaceAll("_", "-").split("-");
|
|
6
|
+
if (parts.length === 1 && parts[0].length === 4)
|
|
7
|
+
parts = [parts[0].slice(0, 2), parts[0].slice(2)];
|
|
8
|
+
const language = parts[0], region = parts[1];
|
|
9
|
+
if (!/^[A-Za-z]{2,3}$/.test(language) || region !== undefined && !/^[A-Za-z]{2}$/.test(region))
|
|
10
|
+
invalid("Invalid locale.", "locale");
|
|
11
|
+
return language.toLowerCase() + (region === undefined ? "" : "-" + region.toUpperCase());
|
|
12
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Caller, CredentialKind } from "./contracts.js";
|
|
2
|
+
import type { AllValues, UserFields } from "./user-fields.js";
|
|
3
|
+
export declare const isAllValues: (value: unknown) => value is AllValues;
|
|
4
|
+
/** Role names follow Better Auth's role strings; `-` is allowed. */
|
|
5
|
+
export declare const roleName: RegExp;
|
|
6
|
+
/** Better Auth stores roles comma-separated; split exactly as it does and fail fast on a name no manifest could match. */
|
|
7
|
+
export declare function rolesFrom(role: unknown): readonly string[];
|
|
8
|
+
/** Better Auth's configured admin layer, independent of per-operation access control. */
|
|
9
|
+
export declare function adminLayerOf(user: {
|
|
10
|
+
id: string;
|
|
11
|
+
role?: unknown;
|
|
12
|
+
}, options?: {
|
|
13
|
+
adminRoles?: readonly string[];
|
|
14
|
+
adminUserIds?: readonly string[];
|
|
15
|
+
}): boolean;
|
|
16
|
+
/** Auth integration and test helpers validate a verified Better Auth-shaped user once. */
|
|
17
|
+
export declare function userCaller(user: Readonly<Record<string, unknown>> & {
|
|
18
|
+
readonly id: string;
|
|
19
|
+
}, options?: {
|
|
20
|
+
readonly fields?: UserFields;
|
|
21
|
+
readonly adminRoles?: readonly string[];
|
|
22
|
+
readonly adminUserIds?: readonly string[];
|
|
23
|
+
readonly credential?: CredentialKind;
|
|
24
|
+
readonly credentialId?: string | null;
|
|
25
|
+
readonly clientId?: string | null;
|
|
26
|
+
readonly scopes?: readonly string[];
|
|
27
|
+
readonly issuer?: string;
|
|
28
|
+
readonly impersonatedBy?: string;
|
|
29
|
+
}): Extract<Caller, {
|
|
30
|
+
kind: "user";
|
|
31
|
+
}>;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { ContractError } from "./contract-error.js";
|
|
2
|
+
import { validUserFieldName } from "./user-field-name.js";
|
|
3
|
+
import { identities } from "./caller-identity.js";
|
|
4
|
+
export const isAllValues = (value) => !!value && typeof value === "object" && !Array.isArray(value) && Object.keys(value).length === 1 && value.all === true;
|
|
5
|
+
export const roleName = /^[a-z][a-zA-Z0-9_-]{0,62}$/;
|
|
6
|
+
const invalid = (message) => { throw new ContractError("USER_FIELD_INVALID", message, "auth:user", { status: 400 }); };
|
|
7
|
+
function valueOf(value, spec, field) {
|
|
8
|
+
if (isAllValues(value))
|
|
9
|
+
return Object.freeze({ all: true });
|
|
10
|
+
const scalar = (value) => {
|
|
11
|
+
if (typeof value !== spec.type)
|
|
12
|
+
return invalid(`User field '${field}' must contain ${spec.type} values.`);
|
|
13
|
+
if (typeof value === "number") {
|
|
14
|
+
if (!(spec.integer ? Number.isInteger(value) : Number.isFinite(value)))
|
|
15
|
+
return invalid(`User field '${field}' must be ${spec.integer ? "an integer" : "finite"}.`);
|
|
16
|
+
}
|
|
17
|
+
else if (typeof value === "string" && (!value.isWellFormed() || value.includes("\0") || new TextEncoder().encode(value).length < 1 || new TextEncoder().encode(value).length > 256))
|
|
18
|
+
return invalid(`User field '${field}' must be 1–256 UTF-8 bytes, without NUL or lone surrogates.`);
|
|
19
|
+
if (spec.enum && !spec.enum.includes(value))
|
|
20
|
+
return invalid(`User field '${field}' is outside its enum.`);
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
if (!Array.isArray(value))
|
|
24
|
+
return scalar(value);
|
|
25
|
+
if (!spec.multiple)
|
|
26
|
+
return invalid(`User field '${field}' holds one value.`);
|
|
27
|
+
if (value.length > 64)
|
|
28
|
+
return invalid(`User field '${field}' accepts at most 64 values.`);
|
|
29
|
+
return Object.freeze([...new Set(value.map(scalar))]);
|
|
30
|
+
}
|
|
31
|
+
export function rolesFrom(role) {
|
|
32
|
+
if (role == null || role === "")
|
|
33
|
+
return Object.freeze([]);
|
|
34
|
+
if (typeof role !== "string")
|
|
35
|
+
return invalid("User role must be comma-separated text.");
|
|
36
|
+
return Object.freeze([...new Set(role.split(",").map(part => roleName.test(part) ? part : invalid(`Invalid role '${part}'.`)))]);
|
|
37
|
+
}
|
|
38
|
+
export function adminLayerOf(user, options = {}) {
|
|
39
|
+
return !!options.adminUserIds?.includes(user.id) || rolesFrom(user.role).some(role => (options.adminRoles ?? ["admin"]).some(name => name.trim() === role));
|
|
40
|
+
}
|
|
41
|
+
export function userCaller(user, options = {}) {
|
|
42
|
+
if (typeof user.id !== 'string' || !user.id || /^(host|system):/i.test(user.id))
|
|
43
|
+
return invalid("User subjects must be non-empty strings without reserved prefixes.");
|
|
44
|
+
const roles = rolesFrom(user.role);
|
|
45
|
+
const fields = Object.create(null);
|
|
46
|
+
for (const [field, spec] of Object.entries(options.fields ?? {})) {
|
|
47
|
+
if (!validUserFieldName(field))
|
|
48
|
+
return invalid(`Invalid or reserved user field '${field}'.`);
|
|
49
|
+
if (Object.hasOwn(user, field) && user[field] !== undefined && user[field] !== null)
|
|
50
|
+
fields[field] = valueOf(user[field], spec, field);
|
|
51
|
+
}
|
|
52
|
+
Object.freeze(fields);
|
|
53
|
+
const caller = { kind: "user", subject: user.id, role: typeof user.role === "string" ? user.role : null,
|
|
54
|
+
admin: adminLayerOf(user, options), roles, fields,
|
|
55
|
+
...(options.issuer ? { issuer: options.issuer } : {}), scopes: Object.freeze([...(options.scopes ?? [])]),
|
|
56
|
+
credential: options.credential ?? "session", credentialId: options.credentialId ?? null, clientId: options.clientId ?? null };
|
|
57
|
+
if (options.impersonatedBy)
|
|
58
|
+
Object.defineProperty(caller, "impersonatedBy", { get() { return identities.get(this)?.impersonatedBy; } });
|
|
59
|
+
identities.set(Object.freeze(caller), Object.freeze({ roles, fields, admin: caller.admin, ...(options.impersonatedBy ? { impersonatedBy: options.impersonatedBy } : {}) }));
|
|
60
|
+
return caller;
|
|
61
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const name = /^[a-z][a-zA-Z0-9_]{0,62}$/;
|
|
2
|
+
const reserved = " id email emailVerified name image createdAt updatedAt role banned banReason banExpires ";
|
|
3
|
+
export const validUserFieldName = (field) => name.test(field) && !reserved.includes(' ' + field + ' ') && !field.startsWith("mantle");
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Caller } from "./contracts.js";
|
|
2
|
+
import type { Recipe } from './binds.js';
|
|
3
|
+
export declare const USER_REFS_V1: 1;
|
|
4
|
+
/** The typed "every value" state of one field: a structural value, never a magic string. */
|
|
5
|
+
export interface AllValues {
|
|
6
|
+
readonly all: true;
|
|
7
|
+
}
|
|
8
|
+
export type UserValue = string | number | readonly (string | number)[] | AllValues;
|
|
9
|
+
export interface UserField {
|
|
10
|
+
readonly type: "string" | "number";
|
|
11
|
+
readonly integer?: true;
|
|
12
|
+
readonly multiple: boolean;
|
|
13
|
+
readonly enum?: readonly (string | number)[];
|
|
14
|
+
}
|
|
15
|
+
export type UserFields = Readonly<Record<string, UserField>>;
|
|
16
|
+
/** Whether the caller holds `{ all: true }` for a field: its row-template term is dropped. */
|
|
17
|
+
export declare const isAll: (caller: Caller, field: string) => boolean;
|
|
18
|
+
/** Generated SQL prints each Schema scope term twice; `{ all: true }` keeps the always-true form, every other caller the filter. */
|
|
19
|
+
export declare const scoped: (sql: string, caller: Caller) => string;
|
|
20
|
+
export declare const scopedAll: <T>(value: T, caller: Caller) => T;
|
|
21
|
+
/** Store and Admin share the insert membership check. */
|
|
22
|
+
export declare function scopeInsert(scopes: readonly {
|
|
23
|
+
readonly column: string;
|
|
24
|
+
readonly field: string;
|
|
25
|
+
readonly type: 'string' | 'number';
|
|
26
|
+
}[], caller: Caller, set: object): object;
|
|
27
|
+
export { modeOf } from "./caller-mode.js";
|
|
28
|
+
export interface UserRecipe extends Extract<Recipe, {
|
|
29
|
+
k: "user";
|
|
30
|
+
}> {
|
|
31
|
+
}
|
|
32
|
+
/** A missing or empty value is refused here, before any SQL runs; correctness never relies on NULL semantics. */
|
|
33
|
+
export declare const userBinds: (sqlite: boolean) => (recipe: UserRecipe, caller: Caller) => unknown;
|
|
34
|
+
export declare const userRefs: (sqlite: boolean, version: number) => (recipe: Recipe, caller: Caller, input?: Readonly<Record<string, unknown>>) => unknown;
|
|
35
|
+
export { roleName, rolesFrom } from "./user-caller.js";
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { ContractError } from "./contract-error.js";
|
|
2
|
+
export const USER_REFS_V1 = 1;
|
|
3
|
+
import { valueFor, isHostCaller } from "./caller-identity.js";
|
|
4
|
+
import { isAllValues } from "./user-caller.js";
|
|
5
|
+
export const isAll = (caller, field) => isAllValues(valueFor(caller, field));
|
|
6
|
+
const SCOPE_TERM = /\/\*s:(\w+)\*\/([^]*?)\/\*\|\*\/([^]*?)\/\*;\*\//g;
|
|
7
|
+
export const scoped = (sql, caller) => sql.replace(SCOPE_TERM, (_, field, kept, all) => isAll(caller, field) ? all : kept);
|
|
8
|
+
export const scopedAll = (value, caller) => JSON.parse(JSON.stringify(value), (_key, v) => typeof v === "string" ? scoped(v, caller) : v);
|
|
9
|
+
const missing = (caller, field) => {
|
|
10
|
+
if (isHostCaller(caller))
|
|
11
|
+
throw new ContractError("HOST_CONTRACT", `The target needs user field '${field}'.`, "", { status: 412, fields: { field } });
|
|
12
|
+
if (caller.kind === "anonymous")
|
|
13
|
+
throw new ContractError('UNAUTHENTICATED', `Rows scoped by '${field}' require an authenticated caller.`);
|
|
14
|
+
throw new ContractError('AUTH_DENIED', `The caller has no value for '${field}', which scopes these rows.`);
|
|
15
|
+
};
|
|
16
|
+
export function scopeInsert(scopes, caller, set) {
|
|
17
|
+
let out = set;
|
|
18
|
+
for (const scope of scopes) {
|
|
19
|
+
const own = ([field]) => field.toLowerCase() === scope.column;
|
|
20
|
+
out = Object.fromEntries(Object.entries(out).filter(entry => !(own(entry) && entry[1] === undefined)));
|
|
21
|
+
const given = Object.entries(out).find(own);
|
|
22
|
+
if (caller.kind === 'system' || isAll(caller, scope.field)) {
|
|
23
|
+
if (!given)
|
|
24
|
+
throw new ContractError('INPUT_VALIDATION_FAILED', `An explicit '${scope.column}' value is required.`);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
const value = valueFor(caller, scope.field), values = value === undefined ? [] : Array.isArray(value) ? value : [value];
|
|
28
|
+
if (!values.length)
|
|
29
|
+
missing(caller, scope.field);
|
|
30
|
+
if (given) {
|
|
31
|
+
if (typeof given[1] !== scope.type || !values.includes(given[1]))
|
|
32
|
+
throw new ContractError('AUTH_DENIED', `The value is outside the caller's '${scope.field}' scope.`);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (values.length !== 1)
|
|
36
|
+
throw new ContractError('INPUT_VALIDATION_FAILED', `'${scope.column}' is required: the caller holds several '${scope.field}' values.`);
|
|
37
|
+
out = { ...out, [scope.column]: values[0] };
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
export { modeOf } from "./caller-mode.js";
|
|
42
|
+
const pgArray = (values) => `{${values.map(value => `"${String(value).replace(/[\\"]/g, "\\$&")}"`).join(",")}}`;
|
|
43
|
+
export const userBinds = (sqlite) => (recipe, caller) => {
|
|
44
|
+
const value = valueFor(caller, recipe.field);
|
|
45
|
+
if (isAllValues(value) && recipe.scope)
|
|
46
|
+
return sqlite ? "[]" : "{}";
|
|
47
|
+
if (isAllValues(value))
|
|
48
|
+
throw new ContractError('AUTH_DENIED', `This target restricts rows by '${recipe.field}', which needs explicit values; { all: true } does not lift a restrict.`);
|
|
49
|
+
const values = value === undefined ? [] : Array.isArray(value) ? value : [value];
|
|
50
|
+
if (!values.length)
|
|
51
|
+
missing(caller, recipe.field);
|
|
52
|
+
return sqlite ? JSON.stringify(values) : pgArray(values);
|
|
53
|
+
};
|
|
54
|
+
export const userRefs = (sqlite, version) => {
|
|
55
|
+
if (version !== USER_REFS_V1)
|
|
56
|
+
throw new ContractError('USER_REFS_VERSION', 'User-reference bind version differs.');
|
|
57
|
+
const user = userBinds(sqlite);
|
|
58
|
+
return (recipe, caller, input) => {
|
|
59
|
+
if (recipe.k === 'user')
|
|
60
|
+
return user(recipe, caller);
|
|
61
|
+
if (recipe.k === 'scoped') {
|
|
62
|
+
const given = recipe.name !== undefined ? input?.[recipe.name] ?? undefined : recipe.value;
|
|
63
|
+
const value = scopeInsert([recipe], caller, { [recipe.column]: given })[recipe.column];
|
|
64
|
+
if (typeof value !== recipe.type)
|
|
65
|
+
throw new ContractError('INPUT_VALIDATION_FAILED', `'${recipe.column}' must be a ${recipe.type}.`);
|
|
66
|
+
return value;
|
|
67
|
+
}
|
|
68
|
+
throw new ContractError('USER_REFS_VERSION', `Unknown user-reference bind recipe '${recipe.k}'.`);
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
export { roleName, rolesFrom } from "./user-caller.js";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** INPUT_VALIDATION_FAILED at the JSON pointer `path`. */
|
|
2
|
+
export declare function fail(path: string, message: string): never;
|
|
3
|
+
/** JSON equality for `enum`. */
|
|
4
|
+
export declare function equal(a: unknown, b: unknown): boolean;
|
|
5
|
+
/** The check of the publishing transitions' input `{id, expectedVersion}` at `path`. */
|
|
6
|
+
export declare function transition(path: string, raw: unknown): Record<string, unknown>;
|
|
7
|
+
/**
|
|
8
|
+
* A View's query string: each declared field (typed `boolean`, `integer` or `number` when the input says so) is read
|
|
9
|
+
* from `params`, then validated; `limit` and `cursor` are the paging options. `operation` is `views/<name>`.
|
|
10
|
+
*/
|
|
11
|
+
export declare function query(params: URLSearchParams, validate: (raw: unknown) => Record<string, unknown>, operation: string, fields: ReadonlyArray<readonly [key: string, type?: "boolean" | "integer" | "number"]>): {
|
|
12
|
+
input: Record<string, unknown>;
|
|
13
|
+
limit?: number;
|
|
14
|
+
cursor?: string;
|
|
15
|
+
};
|