@aotter/mantle 0.1.4 → 0.2.0-alpha.1
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 +39 -306
- package/dist/admin/consent.d.ts +17 -0
- package/dist/admin/consent.d.ts.map +1 -0
- package/dist/admin/consent.js +17 -0
- package/dist/admin/consent.js.map +1 -0
- package/dist/admin/createAdminSurface.d.ts +22 -0
- package/dist/admin/createAdminSurface.d.ts.map +1 -0
- package/dist/admin/createAdminSurface.js +589 -0
- package/dist/admin/createAdminSurface.js.map +1 -0
- package/dist/admin/developerConsole.d.ts +264 -0
- package/dist/admin/developerConsole.d.ts.map +1 -0
- package/dist/admin/developerConsole.js +136 -0
- package/dist/admin/developerConsole.js.map +1 -0
- package/dist/admin/identity.d.ts +62 -0
- package/dist/admin/identity.d.ts.map +1 -0
- package/dist/admin/identity.js +7 -0
- package/dist/admin/identity.js.map +1 -0
- package/dist/admin/index.d.ts +4 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +4 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/procedureFlow.d.ts +25 -0
- package/dist/admin/procedureFlow.d.ts.map +1 -0
- package/dist/admin/procedureFlow.js +154 -0
- package/dist/admin/procedureFlow.js.map +1 -0
- package/dist/auth/ConsoleEmailSender.d.ts +15 -0
- package/dist/auth/ConsoleEmailSender.d.ts.map +1 -0
- package/dist/auth/ConsoleEmailSender.js +19 -0
- package/dist/auth/ConsoleEmailSender.js.map +1 -0
- package/dist/auth/appleClientSecret.d.ts +75 -0
- package/dist/auth/appleClientSecret.d.ts.map +1 -0
- package/dist/auth/appleClientSecret.js +116 -0
- package/dist/auth/appleClientSecret.js.map +1 -0
- package/dist/auth/buildAuth.d.ts +4565 -0
- package/dist/auth/buildAuth.d.ts.map +1 -0
- package/dist/auth/buildAuth.js +307 -0
- package/dist/auth/buildAuth.js.map +1 -0
- package/dist/auth/callerResolver.d.ts +48 -0
- package/dist/auth/callerResolver.d.ts.map +1 -0
- package/dist/auth/callerResolver.js +49 -0
- package/dist/auth/callerResolver.js.map +1 -0
- package/dist/auth/createAuthRoutes.d.ts +22 -0
- package/dist/auth/createAuthRoutes.d.ts.map +1 -0
- package/dist/auth/createAuthRoutes.js +128 -0
- package/dist/auth/createAuthRoutes.js.map +1 -0
- package/dist/auth/createMantleAuth.d.ts +3 -0
- package/dist/auth/createMantleAuth.d.ts.map +1 -0
- package/dist/auth/createMantleAuth.js +483 -0
- package/dist/auth/createMantleAuth.js.map +1 -0
- package/dist/auth/db.d.ts +17 -0
- package/dist/auth/db.d.ts.map +1 -0
- package/dist/auth/db.js +24 -0
- package/dist/auth/db.js.map +1 -0
- package/dist/auth/emailTemplates.d.ts +7 -0
- package/dist/auth/emailTemplates.d.ts.map +1 -0
- package/dist/auth/emailTemplates.js +27 -0
- package/dist/auth/emailTemplates.js.map +1 -0
- package/dist/auth/index.d.ts +9 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +7 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/methods.d.ts +717 -0
- package/dist/auth/methods.d.ts.map +1 -0
- package/dist/auth/methods.js +321 -0
- package/dist/auth/methods.js.map +1 -0
- package/dist/auth/oauthTokens.d.ts +24 -0
- package/dist/auth/oauthTokens.d.ts.map +1 -0
- package/dist/auth/oauthTokens.js +146 -0
- package/dist/auth/oauthTokens.js.map +1 -0
- package/dist/auth/setupIncomplete.d.ts +16 -0
- package/dist/auth/setupIncomplete.d.ts.map +1 -0
- package/dist/auth/setupIncomplete.js +50 -0
- package/dist/auth/setupIncomplete.js.map +1 -0
- package/dist/auth/types.d.ts +440 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +10 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/bun/index.d.ts +65 -0
- package/dist/bun/index.d.ts.map +1 -0
- package/dist/bun/index.js +130 -0
- package/dist/bun/index.js.map +1 -0
- package/dist/cli/emitModule.d.ts +7 -0
- package/dist/cli/emitModule.d.ts.map +1 -0
- package/dist/cli/emitModule.js +127 -0
- package/dist/cli/emitModule.js.map +1 -0
- package/dist/cli/generate.d.ts +4 -16
- package/dist/cli/generate.d.ts.map +1 -1
- package/dist/cli/generate.js +332 -165
- package/dist/cli/generate.js.map +1 -1
- package/dist/cli/main.d.ts +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +15 -71
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/preset.d.ts +18 -0
- package/dist/cli/preset.d.ts.map +1 -0
- package/dist/cli/preset.js +352 -0
- package/dist/cli/preset.js.map +1 -0
- package/dist/cloudflare/index.d.ts +21 -0
- package/dist/cloudflare/index.d.ts.map +1 -0
- package/dist/cloudflare/index.js +14 -0
- package/dist/cloudflare/index.js.map +1 -0
- package/dist/cloudflare/r2Media.d.ts +43 -0
- package/dist/cloudflare/r2Media.d.ts.map +1 -0
- package/dist/cloudflare/r2Media.js +69 -0
- package/dist/cloudflare/r2Media.js.map +1 -0
- package/dist/core/caller.d.ts +35 -0
- package/dist/core/caller.d.ts.map +1 -0
- package/dist/core/caller.js +3 -0
- package/dist/core/caller.js.map +1 -0
- package/dist/core/createMantle.d.ts +22 -0
- package/dist/core/createMantle.d.ts.map +1 -0
- package/dist/core/createMantle.js +117 -0
- package/dist/core/createMantle.js.map +1 -0
- package/dist/core/dialect.d.ts +41 -0
- package/dist/core/dialect.d.ts.map +1 -0
- package/dist/core/dialect.js +7 -0
- package/dist/core/dialect.js.map +1 -0
- package/dist/core/driver.d.ts +17 -0
- package/dist/core/driver.d.ts.map +1 -0
- package/dist/core/driver.js +2 -0
- package/dist/core/driver.js.map +1 -0
- package/dist/core/email.d.ts +17 -0
- package/dist/core/email.d.ts.map +1 -0
- package/dist/core/email.js +2 -0
- package/dist/core/email.js.map +1 -0
- package/dist/core/index.d.ts +16 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +16 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/invocation.d.ts +66 -0
- package/dist/core/invocation.d.ts.map +1 -0
- package/dist/core/invocation.js +3 -0
- package/dist/core/invocation.js.map +1 -0
- package/dist/core/runtime/auth.d.ts +9 -0
- package/dist/core/runtime/auth.d.ts.map +1 -0
- package/dist/core/runtime/auth.js +39 -0
- package/dist/core/runtime/auth.js.map +1 -0
- package/dist/core/runtime/createRuntime.d.ts +23 -0
- package/dist/core/runtime/createRuntime.d.ts.map +1 -0
- package/dist/core/runtime/createRuntime.js +214 -0
- package/dist/core/runtime/createRuntime.js.map +1 -0
- package/dist/core/runtime/verifyPlan.d.ts +34 -0
- package/dist/core/runtime/verifyPlan.d.ts.map +1 -0
- package/dist/core/runtime/verifyPlan.js +301 -0
- package/dist/core/runtime/verifyPlan.js.map +1 -0
- package/dist/core/service.d.ts +45 -0
- package/dist/core/service.d.ts.map +1 -0
- package/dist/core/service.js +2 -0
- package/dist/core/service.js.map +1 -0
- package/dist/core/site.d.ts +117 -0
- package/dist/core/site.d.ts.map +1 -0
- package/dist/core/site.js +2 -0
- package/dist/core/site.js.map +1 -0
- package/dist/core/siteConfig.d.ts +5 -0
- package/dist/core/siteConfig.d.ts.map +1 -0
- package/dist/core/siteConfig.js +24 -0
- package/dist/core/siteConfig.js.map +1 -0
- package/dist/core/sql/allowlist.d.ts +65 -0
- package/dist/core/sql/allowlist.d.ts.map +1 -0
- package/dist/core/sql/allowlist.js +705 -0
- package/dist/core/sql/allowlist.js.map +1 -0
- package/dist/core/sql/ast.d.ts +24 -0
- package/dist/core/sql/ast.d.ts.map +1 -0
- package/dist/core/sql/ast.js +32 -0
- package/dist/core/sql/ast.js.map +1 -0
- package/dist/core/sql/compile.d.ts +50 -0
- package/dist/core/sql/compile.d.ts.map +1 -0
- package/dist/core/sql/compile.js +48 -0
- package/dist/core/sql/compile.js.map +1 -0
- package/dist/core/sql/policy.d.ts +121 -0
- package/dist/core/sql/policy.d.ts.map +1 -0
- package/dist/core/sql/policy.js +379 -0
- package/dist/core/sql/policy.js.map +1 -0
- package/dist/core/sql/positions.d.ts +30 -0
- package/dist/core/sql/positions.d.ts.map +1 -0
- package/dist/core/sql/positions.js +22 -0
- package/dist/core/sql/positions.js.map +1 -0
- package/dist/core/sql/run.d.ts +76 -0
- package/dist/core/sql/run.d.ts.map +1 -0
- package/dist/core/sql/run.js +267 -0
- package/dist/core/sql/run.js.map +1 -0
- package/dist/core/store/createStore.d.ts +49 -0
- package/dist/core/store/createStore.d.ts.map +1 -0
- package/dist/core/store/createStore.js +227 -0
- package/dist/core/store/createStore.js.map +1 -0
- package/dist/core/store/cursor.d.ts +4 -0
- package/dist/core/store/cursor.d.ts.map +1 -0
- package/dist/core/store/cursor.js +22 -0
- package/dist/core/store/cursor.js.map +1 -0
- package/dist/core/store/json.d.ts +80 -0
- package/dist/core/store/json.d.ts.map +1 -0
- package/dist/core/store/json.js +342 -0
- package/dist/core/store/json.js.map +1 -0
- package/dist/core/store.d.ts +160 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +2 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/wire.d.ts +20 -0
- package/dist/core/wire.d.ts.map +1 -0
- package/dist/core/wire.js +84 -0
- package/dist/core/wire.js.map +1 -0
- package/dist/core/withCaller.d.ts +16 -0
- package/dist/core/withCaller.d.ts.map +1 -0
- package/dist/core/withCaller.js +29 -0
- package/dist/core/withCaller.js.map +1 -0
- package/dist/d1/adapter.d.ts +12 -0
- package/dist/d1/adapter.d.ts.map +1 -0
- package/dist/d1/adapter.js +23 -0
- package/dist/d1/adapter.js.map +1 -0
- package/dist/d1/codec.d.ts +14 -0
- package/dist/d1/codec.d.ts.map +1 -0
- package/dist/d1/codec.js +136 -0
- package/dist/d1/codec.js.map +1 -0
- package/dist/d1/compile/index.d.ts +9 -0
- package/dist/d1/compile/index.d.ts.map +1 -0
- package/dist/d1/compile/index.js +9 -0
- package/dist/d1/compile/index.js.map +1 -0
- package/dist/d1/dialect.d.ts +4 -0
- package/dist/d1/dialect.d.ts.map +1 -0
- package/dist/d1/dialect.js +13 -0
- package/dist/d1/dialect.js.map +1 -0
- package/dist/d1/executor.d.ts +13 -0
- package/dist/d1/executor.d.ts.map +1 -0
- package/dist/d1/executor.js +91 -0
- package/dist/d1/executor.js.map +1 -0
- package/dist/d1/index.d.ts +6 -0
- package/dist/d1/index.d.ts.map +1 -0
- package/dist/d1/index.js +6 -0
- package/dist/d1/index.js.map +1 -0
- package/dist/d1/lower.d.ts +8 -0
- package/dist/d1/lower.d.ts.map +1 -0
- package/dist/d1/lower.js +167 -0
- package/dist/d1/lower.js.map +1 -0
- package/dist/d1/media.d.ts +5 -0
- package/dist/d1/media.d.ts.map +1 -0
- package/dist/d1/media.js +157 -0
- package/dist/d1/media.js.map +1 -0
- package/dist/d1/migrations.d.ts +12 -0
- package/dist/d1/migrations.d.ts.map +1 -0
- package/dist/d1/migrations.js +111 -0
- package/dist/d1/migrations.js.map +1 -0
- package/dist/d1/print.d.ts +28 -0
- package/dist/d1/print.d.ts.map +1 -0
- package/dist/d1/print.js +54 -0
- package/dist/d1/print.js.map +1 -0
- package/dist/d1/site.d.ts +17 -0
- package/dist/d1/site.d.ts.map +1 -0
- package/dist/d1/site.js +63 -0
- package/dist/d1/site.js.map +1 -0
- package/dist/d1/storage.d.ts +34 -0
- package/dist/d1/storage.d.ts.map +1 -0
- package/dist/d1/storage.js +288 -0
- package/dist/d1/storage.js.map +1 -0
- package/dist/d1/tz.d.ts +21 -0
- package/dist/d1/tz.d.ts.map +1 -0
- package/dist/d1/tz.js +54 -0
- package/dist/d1/tz.js.map +1 -0
- package/dist/d1/validator.d.ts +10 -0
- package/dist/d1/validator.d.ts.map +1 -0
- package/dist/d1/validator.js +33 -0
- package/dist/d1/validator.js.map +1 -0
- package/dist/mcp/apps.d.ts +43 -0
- package/dist/mcp/apps.d.ts.map +1 -0
- package/dist/mcp/apps.js +57 -0
- package/dist/mcp/apps.js.map +1 -0
- package/dist/mcp/catalog.d.ts +55 -0
- package/dist/mcp/catalog.d.ts.map +1 -0
- package/dist/mcp/catalog.js +81 -0
- package/dist/mcp/catalog.js.map +1 -0
- package/dist/mcp/createMcpSurface.d.ts +34 -0
- package/dist/mcp/createMcpSurface.d.ts.map +1 -0
- package/dist/mcp/createMcpSurface.js +150 -0
- package/dist/mcp/createMcpSurface.js.map +1 -0
- package/dist/mcp/index.d.ts +4 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +4 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/postgres/adapter.d.ts +20 -0
- package/dist/postgres/adapter.d.ts.map +1 -0
- package/dist/postgres/adapter.js +44 -0
- package/dist/postgres/adapter.js.map +1 -0
- package/dist/postgres/codec.d.ts +13 -0
- package/dist/postgres/codec.d.ts.map +1 -0
- package/dist/postgres/codec.js +110 -0
- package/dist/postgres/codec.js.map +1 -0
- package/dist/postgres/compile/index.d.ts +9 -0
- package/dist/postgres/compile/index.d.ts.map +1 -0
- package/dist/postgres/compile/index.js +9 -0
- package/dist/postgres/compile/index.js.map +1 -0
- package/dist/postgres/driver.d.ts +92 -0
- package/dist/postgres/driver.d.ts.map +1 -0
- package/dist/postgres/driver.js +110 -0
- package/dist/postgres/driver.js.map +1 -0
- package/dist/postgres/executor.d.ts +20 -0
- package/dist/postgres/executor.d.ts.map +1 -0
- package/dist/postgres/executor.js +69 -0
- package/dist/postgres/executor.js.map +1 -0
- package/dist/postgres/index.d.ts +7 -0
- package/dist/postgres/index.d.ts.map +1 -0
- package/dist/postgres/index.js +7 -0
- package/dist/postgres/index.js.map +1 -0
- package/dist/postgres/lower.d.ts +6 -0
- package/dist/postgres/lower.d.ts.map +1 -0
- package/dist/postgres/lower.js +157 -0
- package/dist/postgres/lower.js.map +1 -0
- package/dist/postgres/print.d.ts +11 -0
- package/dist/postgres/print.d.ts.map +1 -0
- package/dist/postgres/print.js +121 -0
- package/dist/postgres/print.js.map +1 -0
- package/dist/postgres/storage.d.ts +19 -0
- package/dist/postgres/storage.d.ts.map +1 -0
- package/dist/postgres/storage.js +201 -0
- package/dist/postgres/storage.js.map +1 -0
- package/dist/postgres/textRows.d.ts +10 -0
- package/dist/postgres/textRows.d.ts.map +1 -0
- package/dist/postgres/textRows.js +44 -0
- package/dist/postgres/textRows.js.map +1 -0
- package/dist/postgres/validator.d.ts +12 -0
- package/dist/postgres/validator.d.ts.map +1 -0
- package/dist/postgres/validator.js +46 -0
- package/dist/postgres/validator.js.map +1 -0
- package/dist/spec/domain/index.d.ts +3 -0
- package/dist/spec/domain/index.d.ts.map +1 -0
- package/dist/spec/domain/index.js +3 -0
- package/dist/spec/domain/index.js.map +1 -0
- package/dist/spec/domain/model/ContentState.d.ts +8 -0
- package/dist/spec/domain/model/ContentState.d.ts.map +1 -0
- package/dist/spec/domain/model/ContentState.js +7 -0
- package/dist/spec/domain/model/ContentState.js.map +1 -0
- package/dist/spec/domain/model/Entry.d.ts +29 -0
- package/dist/spec/domain/model/Entry.d.ts.map +1 -0
- package/dist/spec/domain/model/Entry.js +16 -0
- package/dist/spec/domain/model/Entry.js.map +1 -0
- package/dist/spec/domain/model/Locale.d.ts +30 -0
- package/dist/spec/domain/model/Locale.d.ts.map +1 -0
- package/dist/spec/domain/model/Locale.js +33 -0
- package/dist/spec/domain/model/Locale.js.map +1 -0
- package/dist/spec/domain/model/ManifestGrammar.d.ts +452 -0
- package/dist/spec/domain/model/ManifestGrammar.d.ts.map +1 -0
- package/dist/spec/domain/model/ManifestGrammar.js +149 -0
- package/dist/spec/domain/model/ManifestGrammar.js.map +1 -0
- package/dist/spec/domain/model/MediaMimeAccept.d.ts +55 -0
- package/dist/spec/domain/model/MediaMimeAccept.d.ts.map +1 -0
- package/dist/spec/domain/model/MediaMimeAccept.js +90 -0
- package/dist/spec/domain/model/MediaMimeAccept.js.map +1 -0
- package/dist/spec/domain/model/RuntimePlan.d.ts +94 -0
- package/dist/spec/domain/model/RuntimePlan.d.ts.map +1 -0
- package/dist/spec/domain/model/RuntimePlan.js +4 -0
- package/dist/spec/domain/model/RuntimePlan.js.map +1 -0
- package/dist/spec/domain/model/SiteConfig.d.ts +173 -0
- package/dist/spec/domain/model/SiteConfig.d.ts.map +1 -0
- package/dist/spec/domain/model/SiteConfig.js +13 -0
- package/dist/spec/domain/model/SiteConfig.js.map +1 -0
- package/dist/spec/domain/model/SqlIr.d.ts +96 -0
- package/dist/spec/domain/model/SqlIr.d.ts.map +1 -0
- package/dist/spec/domain/model/SqlIr.js +95 -0
- package/dist/spec/domain/model/SqlIr.js.map +1 -0
- package/dist/spec/domain/model/index.d.ts +14 -0
- package/dist/spec/domain/model/index.d.ts.map +1 -0
- package/dist/spec/domain/model/index.js +14 -0
- package/dist/spec/domain/model/index.js.map +1 -0
- package/dist/spec/domain/service/CloudflareCron.d.ts +2 -0
- package/dist/spec/domain/service/CloudflareCron.d.ts.map +1 -0
- package/dist/spec/domain/service/CloudflareCron.js +63 -0
- package/dist/spec/domain/service/CloudflareCron.js.map +1 -0
- package/dist/spec/domain/service/CrossSchemaChecker.d.ts +34 -0
- package/dist/spec/domain/service/CrossSchemaChecker.d.ts.map +1 -0
- package/dist/spec/domain/service/CrossSchemaChecker.js +114 -0
- package/dist/spec/domain/service/CrossSchemaChecker.js.map +1 -0
- package/dist/spec/domain/service/EntryDataValidator.d.ts +56 -0
- package/dist/spec/domain/service/EntryDataValidator.d.ts.map +1 -0
- package/dist/spec/domain/service/EntryDataValidator.js +88 -0
- package/dist/spec/domain/service/EntryDataValidator.js.map +1 -0
- package/dist/spec/domain/service/JsonSchemaToZod.d.ts +29 -0
- package/dist/spec/domain/service/JsonSchemaToZod.d.ts.map +1 -0
- package/dist/spec/domain/service/JsonSchemaToZod.js +156 -0
- package/dist/spec/domain/service/JsonSchemaToZod.js.map +1 -0
- package/dist/spec/domain/service/LifecycleStateMachine.d.ts +75 -0
- package/dist/spec/domain/service/LifecycleStateMachine.d.ts.map +1 -0
- package/dist/spec/domain/service/LifecycleStateMachine.js +76 -0
- package/dist/spec/domain/service/LifecycleStateMachine.js.map +1 -0
- package/dist/spec/domain/service/LocaleCanonicalizer.d.ts +29 -0
- package/dist/spec/domain/service/LocaleCanonicalizer.d.ts.map +1 -0
- package/dist/spec/domain/service/LocaleCanonicalizer.js +96 -0
- package/dist/spec/domain/service/LocaleCanonicalizer.js.map +1 -0
- package/dist/spec/domain/service/ManifestFieldChecks.d.ts +60 -0
- package/dist/spec/domain/service/ManifestFieldChecks.d.ts.map +1 -0
- package/dist/spec/domain/service/ManifestFieldChecks.js +116 -0
- package/dist/spec/domain/service/ManifestFieldChecks.js.map +1 -0
- package/dist/spec/domain/service/ManifestGraphValidator.d.ts +15 -0
- package/dist/spec/domain/service/ManifestGraphValidator.d.ts.map +1 -0
- package/dist/spec/domain/service/ManifestGraphValidator.js +225 -0
- package/dist/spec/domain/service/ManifestGraphValidator.js.map +1 -0
- package/dist/spec/domain/service/ManifestLinker.d.ts +45 -0
- package/dist/spec/domain/service/ManifestLinker.d.ts.map +1 -0
- package/dist/spec/domain/service/ManifestLinker.js +92 -0
- package/dist/spec/domain/service/ManifestLinker.js.map +1 -0
- package/dist/spec/domain/service/ManifestLocaleTrimmer.d.ts +16 -0
- package/dist/spec/domain/service/ManifestLocaleTrimmer.d.ts.map +1 -0
- package/dist/spec/domain/service/ManifestLocaleTrimmer.js +76 -0
- package/dist/spec/domain/service/ManifestLocaleTrimmer.js.map +1 -0
- package/dist/spec/domain/service/ManifestParser.d.ts +49 -0
- package/dist/spec/domain/service/ManifestParser.d.ts.map +1 -0
- package/dist/spec/domain/service/ManifestParser.js +203 -0
- package/dist/spec/domain/service/ManifestParser.js.map +1 -0
- package/dist/spec/domain/service/ManifestPartition.d.ts +9 -0
- package/dist/spec/domain/service/ManifestPartition.d.ts.map +1 -0
- package/dist/spec/domain/service/ManifestPartition.js +19 -0
- package/dist/spec/domain/service/ManifestPartition.js.map +1 -0
- package/dist/spec/domain/service/ManifestPathDiagnoser.d.ts +33 -0
- package/dist/spec/domain/service/ManifestPathDiagnoser.d.ts.map +1 -0
- package/dist/spec/domain/service/ManifestPathDiagnoser.js +43 -0
- package/dist/spec/domain/service/ManifestPathDiagnoser.js.map +1 -0
- package/dist/spec/domain/service/ManifestSourceSpans.d.ts +10 -0
- package/dist/spec/domain/service/ManifestSourceSpans.d.ts.map +1 -0
- package/dist/spec/domain/service/ManifestSourceSpans.js +76 -0
- package/dist/spec/domain/service/ManifestSourceSpans.js.map +1 -0
- package/dist/spec/domain/service/McpToolNaming.d.ts +25 -0
- package/dist/spec/domain/service/McpToolNaming.d.ts.map +1 -0
- package/dist/spec/domain/service/McpToolNaming.js +50 -0
- package/dist/spec/domain/service/McpToolNaming.js.map +1 -0
- package/dist/spec/domain/service/PlanFingerprint.d.ts +4 -0
- package/dist/spec/domain/service/PlanFingerprint.d.ts.map +1 -0
- package/dist/spec/domain/service/PlanFingerprint.js +14 -0
- package/dist/spec/domain/service/PlanFingerprint.js.map +1 -0
- package/dist/spec/domain/service/ProcedureViewSpecChecks.d.ts +4 -0
- package/dist/spec/domain/service/ProcedureViewSpecChecks.d.ts.map +1 -0
- package/dist/spec/domain/service/ProcedureViewSpecChecks.js +211 -0
- package/dist/spec/domain/service/ProcedureViewSpecChecks.js.map +1 -0
- package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts +42 -0
- package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts.map +1 -0
- package/dist/spec/domain/service/SchemaAdminUiChecker.js +289 -0
- package/dist/spec/domain/service/SchemaAdminUiChecker.js.map +1 -0
- package/dist/spec/domain/service/SchemaIndexChecker.d.ts +33 -0
- package/dist/spec/domain/service/SchemaIndexChecker.d.ts.map +1 -0
- package/dist/spec/domain/service/SchemaIndexChecker.js +256 -0
- package/dist/spec/domain/service/SchemaIndexChecker.js.map +1 -0
- package/dist/spec/domain/service/SchemaSearchChecker.d.ts +11 -0
- package/dist/spec/domain/service/SchemaSearchChecker.d.ts.map +1 -0
- package/dist/spec/domain/service/SchemaSearchChecker.js +78 -0
- package/dist/spec/domain/service/SchemaSearchChecker.js.map +1 -0
- package/dist/spec/domain/service/SchemaSpecChecks.d.ts +31 -0
- package/dist/spec/domain/service/SchemaSpecChecks.d.ts.map +1 -0
- package/dist/spec/domain/service/SchemaSpecChecks.js +445 -0
- package/dist/spec/domain/service/SchemaSpecChecks.js.map +1 -0
- package/dist/spec/domain/service/SiteDefaultsValidator.d.ts +39 -0
- package/dist/spec/domain/service/SiteDefaultsValidator.d.ts.map +1 -0
- package/dist/spec/domain/service/SiteDefaultsValidator.js +194 -0
- package/dist/spec/domain/service/SiteDefaultsValidator.js.map +1 -0
- package/dist/spec/domain/service/SqlClassify.d.ts +19 -0
- package/dist/spec/domain/service/SqlClassify.d.ts.map +1 -0
- package/dist/spec/domain/service/SqlClassify.js +42 -0
- package/dist/spec/domain/service/SqlClassify.js.map +1 -0
- package/dist/spec/domain/service/SqlRefusal.d.ts +16 -0
- package/dist/spec/domain/service/SqlRefusal.d.ts.map +1 -0
- package/dist/spec/domain/service/SqlRefusal.js +20 -0
- package/dist/spec/domain/service/SqlRefusal.js.map +1 -0
- package/dist/spec/domain/service/SqlTypes.d.ts +40 -0
- package/dist/spec/domain/service/SqlTypes.d.ts.map +1 -0
- package/dist/spec/domain/service/SqlTypes.js +110 -0
- package/dist/spec/domain/service/SqlTypes.js.map +1 -0
- package/dist/spec/domain/service/StaffRoleHierarchy.d.ts +3 -0
- package/dist/spec/domain/service/StaffRoleHierarchy.d.ts.map +1 -0
- package/dist/spec/domain/service/StaffRoleHierarchy.js +19 -0
- package/dist/spec/domain/service/StaffRoleHierarchy.js.map +1 -0
- package/dist/spec/domain/service/TriggerGraphChecks.d.ts +16 -0
- package/dist/spec/domain/service/TriggerGraphChecks.d.ts.map +1 -0
- package/dist/spec/domain/service/TriggerGraphChecks.js +337 -0
- package/dist/spec/domain/service/TriggerGraphChecks.js.map +1 -0
- package/dist/spec/domain/service/TriggerSpecChecks.d.ts +4 -0
- package/dist/spec/domain/service/TriggerSpecChecks.d.ts.map +1 -0
- package/dist/spec/domain/service/TriggerSpecChecks.js +89 -0
- package/dist/spec/domain/service/TriggerSpecChecks.js.map +1 -0
- package/dist/spec/domain/service/ValidatedAdminUiProjection.d.ts +11 -0
- package/dist/spec/domain/service/ValidatedAdminUiProjection.d.ts.map +1 -0
- package/dist/spec/domain/service/ValidatedAdminUiProjection.js +26 -0
- package/dist/spec/domain/service/ValidatedAdminUiProjection.js.map +1 -0
- package/dist/spec/domain/service/ViewAdminUiChecker.d.ts +14 -0
- package/dist/spec/domain/service/ViewAdminUiChecker.d.ts.map +1 -0
- package/dist/spec/domain/service/ViewAdminUiChecker.js +53 -0
- package/dist/spec/domain/service/ViewAdminUiChecker.js.map +1 -0
- package/dist/spec/domain/service/index.d.ts +24 -0
- package/dist/spec/domain/service/index.d.ts.map +1 -0
- package/dist/spec/domain/service/index.js +24 -0
- package/dist/spec/domain/service/index.js.map +1 -0
- package/dist/spec/index.d.ts +10 -0
- package/dist/spec/index.d.ts.map +1 -0
- package/dist/spec/index.js +12 -0
- package/dist/spec/index.js.map +1 -0
- package/dist/spec/infrastructure/cli/parseArgsError.d.ts +16 -0
- package/dist/spec/infrastructure/cli/parseArgsError.d.ts.map +1 -0
- package/dist/spec/infrastructure/cli/parseArgsError.js +34 -0
- package/dist/spec/infrastructure/cli/parseArgsError.js.map +1 -0
- package/dist/spec/infrastructure/index.d.ts +2 -0
- package/dist/spec/infrastructure/index.d.ts.map +1 -0
- package/dist/spec/infrastructure/index.js +2 -0
- package/dist/spec/infrastructure/index.js.map +1 -0
- package/dist/spec/infrastructure/sql/PgQueryParser.d.ts +18 -0
- package/dist/spec/infrastructure/sql/PgQueryParser.d.ts.map +1 -0
- package/dist/spec/infrastructure/sql/PgQueryParser.js +17 -0
- package/dist/spec/infrastructure/sql/PgQueryParser.js.map +1 -0
- package/dist/spec/infrastructure/sql/compilePlan.d.ts +37 -0
- package/dist/spec/infrastructure/sql/compilePlan.d.ts.map +1 -0
- package/dist/spec/infrastructure/sql/compilePlan.js +282 -0
- package/dist/spec/infrastructure/sql/compilePlan.js.map +1 -0
- package/dist/spec/infrastructure/sql/compileSql.d.ts +35 -0
- package/dist/spec/infrastructure/sql/compileSql.d.ts.map +1 -0
- package/dist/spec/infrastructure/sql/compileSql.js +92 -0
- package/dist/spec/infrastructure/sql/compileSql.js.map +1 -0
- package/dist/spec/infrastructure/sql/frontEnd.d.ts +8 -0
- package/dist/spec/infrastructure/sql/frontEnd.d.ts.map +1 -0
- package/dist/spec/infrastructure/sql/frontEnd.js +100 -0
- package/dist/spec/infrastructure/sql/frontEnd.js.map +1 -0
- package/dist/spec/infrastructure/sql/index.d.ts +4 -0
- package/dist/spec/infrastructure/sql/index.d.ts.map +1 -0
- package/dist/spec/infrastructure/sql/index.js +4 -0
- package/dist/spec/infrastructure/sql/index.js.map +1 -0
- package/dist/spec/kernel/diagnostic.d.ts +137 -0
- package/dist/spec/kernel/diagnostic.d.ts.map +1 -0
- package/dist/spec/kernel/diagnostic.js +296 -0
- package/dist/spec/kernel/diagnostic.js.map +1 -0
- package/dist/spec/kernel/index.d.ts +8 -0
- package/dist/spec/kernel/index.d.ts.map +1 -0
- package/dist/spec/kernel/index.js +8 -0
- package/dist/spec/kernel/index.js.map +1 -0
- package/dist/spec/usecase/EmitTypes.d.ts +22 -0
- package/dist/spec/usecase/EmitTypes.d.ts.map +1 -0
- package/dist/spec/usecase/EmitTypes.js +182 -0
- package/dist/spec/usecase/EmitTypes.js.map +1 -0
- package/dist/spec/usecase/ValidateManifestsUseCase.d.ts +8 -0
- package/dist/spec/usecase/ValidateManifestsUseCase.d.ts.map +1 -0
- package/dist/spec/usecase/ValidateManifestsUseCase.js +101 -0
- package/dist/spec/usecase/ValidateManifestsUseCase.js.map +1 -0
- package/dist/spec/usecase/dto/ValidateManifestsRequest.d.ts +27 -0
- package/dist/spec/usecase/dto/ValidateManifestsRequest.d.ts.map +1 -0
- package/dist/spec/usecase/dto/ValidateManifestsRequest.js +2 -0
- package/dist/spec/usecase/dto/ValidateManifestsRequest.js.map +1 -0
- package/dist/spec/usecase/dto/ValidateManifestsResponse.d.ts +14 -0
- package/dist/spec/usecase/dto/ValidateManifestsResponse.d.ts.map +1 -0
- package/dist/spec/usecase/dto/ValidateManifestsResponse.js +2 -0
- package/dist/spec/usecase/dto/ValidateManifestsResponse.js.map +1 -0
- package/dist/spec/usecase/dto/index.d.ts +3 -0
- package/dist/spec/usecase/dto/index.d.ts.map +1 -0
- package/dist/spec/usecase/dto/index.js +3 -0
- package/dist/spec/usecase/dto/index.js.map +1 -0
- package/dist/spec/usecase/index.d.ts +10 -0
- package/dist/spec/usecase/index.d.ts.map +1 -0
- package/dist/spec/usecase/index.js +10 -0
- package/dist/spec/usecase/index.js.map +1 -0
- package/dist/testing/cases/before-hook.d.ts +4 -0
- package/dist/testing/cases/before-hook.d.ts.map +1 -0
- package/dist/testing/cases/before-hook.js +71 -0
- package/dist/testing/cases/before-hook.js.map +1 -0
- package/dist/testing/cases/corpus.d.ts +12 -0
- package/dist/testing/cases/corpus.d.ts.map +1 -0
- package/dist/testing/cases/corpus.js +91 -0
- package/dist/testing/cases/corpus.js.map +1 -0
- package/dist/testing/cases/policy.d.ts +74 -0
- package/dist/testing/cases/policy.d.ts.map +1 -0
- package/dist/testing/cases/policy.js +142 -0
- package/dist/testing/cases/policy.js.map +1 -0
- package/dist/testing/cases/printer.d.ts +4 -0
- package/dist/testing/cases/printer.d.ts.map +1 -0
- package/dist/testing/cases/printer.js +32 -0
- package/dist/testing/cases/printer.js.map +1 -0
- package/dist/testing/cases/report-view.d.ts +5 -0
- package/dist/testing/cases/report-view.d.ts.map +1 -0
- package/dist/testing/cases/report-view.js +33 -0
- package/dist/testing/cases/report-view.js.map +1 -0
- package/dist/testing/cases/requisition.d.ts +4 -0
- package/dist/testing/cases/requisition.d.ts.map +1 -0
- package/dist/testing/cases/requisition.js +38 -0
- package/dist/testing/cases/requisition.js.map +1 -0
- package/dist/testing/cases/search-places.d.ts +4 -0
- package/dist/testing/cases/search-places.d.ts.map +1 -0
- package/dist/testing/cases/search-places.js +60 -0
- package/dist/testing/cases/search-places.js.map +1 -0
- package/dist/testing/cases/stock.d.ts +4 -0
- package/dist/testing/cases/stock.d.ts.map +1 -0
- package/dist/testing/cases/stock.js +35 -0
- package/dist/testing/cases/stock.js.map +1 -0
- package/dist/testing/cases/store.d.ts +4 -0
- package/dist/testing/cases/store.d.ts.map +1 -0
- package/dist/testing/cases/store.js +100 -0
- package/dist/testing/cases/store.js.map +1 -0
- package/dist/testing/harness.d.ts +94 -0
- package/dist/testing/harness.d.ts.map +1 -0
- package/dist/testing/harness.js +168 -0
- package/dist/testing/harness.js.map +1 -0
- package/dist/testing/index.d.ts +37 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +43 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/report.d.ts +15 -0
- package/dist/testing/report.d.ts.map +1 -0
- package/dist/testing/report.js +22 -0
- package/dist/testing/report.js.map +1 -0
- package/dist/web/createRestSurface.d.ts +7 -0
- package/dist/web/createRestSurface.d.ts.map +1 -0
- package/dist/web/createRestSurface.js +39 -0
- package/dist/web/createRestSurface.js.map +1 -0
- package/dist/web/index.d.ts +2 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +2 -0
- package/dist/web/index.js.map +1 -0
- package/docs/adr/0008-structured-diagnostic-shape.md +2 -2
- package/docs/adr/0011-adapter-port-spec.md +2 -2
- package/docs/adr/0014-auth-better-auth-and-multi-tenant-mcp.md +21 -2
- package/docs/adr/0019-sealed-manifest-runtime-pipeline.md +5 -1
- package/docs/adr/0021-retire-starter-scaffolding.md +1 -1
- package/docs/adr/0022-caller-observed-version-occ.md +1 -1
- package/docs/adr/0024-manifest-native-schema-tables.md +2 -2
- package/docs/adr/0026-progressive-generate.md +36 -0
- package/docs/adr/0027-scheduled-procedure-triggers.md +31 -0
- package/docs/adr/0028-schema-ttl-expiry.md +33 -0
- package/docs/adr/0029-mcp-apps-interaction-contracts.md +324 -0
- package/docs/adr/0030-store.md +40 -0
- package/docs/adr/0031-host-cloud-core-contract.md +25 -0
- package/docs/adr/0032-store-centric-core-and-service-contract.md +361 -0
- package/docs/adr/0033-storage-converges-to-the-plan.md +92 -0
- package/docs/adr/0034-store-is-authored-as-sql.md +192 -0
- package/docs/adr/0035-sql-dialects.md +154 -0
- package/docs/adr/0036-host-and-dialect.md +65 -0
- package/docs/adr/0037-postgresql-is-the-reference-dialect.md +124 -0
- package/docs/adr/0038-bun-native-host.md +63 -0
- package/docs/adr/README.md +26 -8
- package/docs/adr/adr-lite-861-admin-webmcp.md +6 -0
- package/docs/adr/adr-lite-909-admin-ui-kit.md +1 -1
- package/docs/examples/README.md +16 -18
- package/docs/examples/commerce-inventory.md +481 -0
- package/docs/examples/commerce.md +254 -0
- package/docs/examples/guarded-api.md +238 -0
- package/docs/examples/intake-hooks.md +237 -0
- package/docs/examples/intake.md +127 -0
- package/docs/examples/legal-documents.md +218 -0
- package/docs/examples/procurement.md +215 -0
- package/docs/examples/publication.md +211 -0
- package/docs/examples/reference-service/.dev.vars.example +4 -0
- package/docs/examples/reference-service/.mantle/generated/mantle.ts +174 -0
- package/docs/examples/reference-service/.mantle/generated/plan.json +1936 -0
- package/docs/examples/reference-service/README.md +33 -0
- package/docs/examples/reference-service/manifests/catalog.yaml +103 -0
- package/docs/examples/reference-service/manifests/orders.yaml +120 -0
- package/docs/examples/reference-service/mantle.config.json +1 -0
- package/docs/examples/reference-service/package.json +27 -0
- package/docs/examples/reference-service/smoke.mjs +156 -0
- package/docs/examples/reference-service/src/handlers.ts +36 -0
- package/docs/examples/reference-service/src/index.ts +33 -0
- package/docs/examples/reference-service/src/service.ts +78 -0
- package/docs/examples/{host-minimal-worker → reference-service}/tsconfig.json +7 -2
- package/docs/examples/reference-service/wrangler.jsonc +26 -0
- package/docs/examples/reservation.md +142 -0
- package/docs/handbook/cloudflare/authentication.md +96 -299
- package/docs/handbook/cloudflare/chatgpt-sites.md +104 -15
- package/docs/handbook/cloudflare/deploy-and-operate.md +77 -71
- package/docs/handbook/cloudflare/media-r2.md +64 -187
- package/docs/handbook/cloudflare/service-entry.md +138 -0
- package/docs/handbook/concepts/authorization.md +104 -94
- package/docs/handbook/concepts/four-atoms.md +68 -144
- package/docs/handbook/concepts/lifecycle-and-locales.md +62 -114
- package/docs/handbook/concepts/mcp-and-agents.md +112 -117
- package/docs/handbook/concepts/procedures-and-triggers.md +126 -181
- package/docs/handbook/concepts/runtime-and-adapters.md +177 -156
- package/docs/handbook/concepts/views.md +97 -173
- package/docs/handbook/examples/hub.md +17 -6
- package/docs/handbook/guides/admin-ui.md +101 -96
- package/docs/handbook/guides/agent-setup.md +56 -71
- package/docs/handbook/guides/typed-queries.md +105 -111
- package/docs/handbook/navigation.json +8 -32
- package/docs/handbook/reference/authorization.md +52 -271
- package/docs/handbook/reference/diagnostics.md +69 -173
- package/docs/handbook/reference/features.md +48 -50
- package/docs/handbook/reference/manifest.md +56 -116
- package/docs/handbook/reference/procedure.md +92 -229
- package/docs/handbook/reference/schema.md +156 -215
- package/docs/handbook/reference/site-config.md +58 -211
- package/docs/handbook/reference/surface.md +69 -181
- package/docs/handbook/reference/trigger.md +73 -162
- package/docs/handbook/reference/view.md +140 -241
- package/docs/handbook/releases/index.md +58 -22
- package/docs/handbook/start/overview.md +59 -48
- package/docs/handbook/start/project-and-cli.md +127 -116
- package/docs/handbook/start/quickstart-worker.md +102 -151
- package/docs/skills/develop/SKILL.md +114 -232
- package/docs/skills/develop/mcp-app.md +79 -0
- package/docs/skills/integrate/SKILL.md +96 -0
- package/docs/skills/media-gc/SKILL.md +21 -10
- package/docs/skills/provision/SKILL.md +68 -162
- package/docs/skills/update/SKILL.md +33 -34
- package/docs/upgrade-0.1-to-0.2.md +211 -0
- package/package.json +87 -105
- package/dist/admin-ui.d.ts +0 -2
- package/dist/admin-ui.d.ts.map +0 -1
- package/dist/admin-ui.js +0 -2
- package/dist/admin-ui.js.map +0 -1
- package/dist/admin.d.ts +0 -2
- package/dist/admin.d.ts.map +0 -1
- package/dist/admin.js +0 -2
- package/dist/admin.js.map +0 -1
- package/dist/auth.d.ts +0 -2
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js +0 -2
- package/dist/auth.js.map +0 -1
- package/dist/bun.d.ts +0 -2
- package/dist/bun.d.ts.map +0 -1
- package/dist/bun.js +0 -2
- package/dist/bun.js.map +0 -1
- package/dist/cli/harness.d.ts +0 -3
- package/dist/cli/harness.d.ts.map +0 -1
- package/dist/cli/harness.js +0 -214
- package/dist/cli/harness.js.map +0 -1
- package/dist/cli/skills.d.ts +0 -3
- package/dist/cli/skills.d.ts.map +0 -1
- package/dist/cli/skills.js +0 -128
- package/dist/cli/skills.js.map +0 -1
- package/dist/cloudflare.d.ts +0 -2
- package/dist/cloudflare.d.ts.map +0 -1
- package/dist/cloudflare.js +0 -2
- package/dist/cloudflare.js.map +0 -1
- package/dist/codegen/emitMantleModule.d.ts +0 -22
- package/dist/codegen/emitMantleModule.d.ts.map +0 -1
- package/dist/codegen/emitMantleModule.js +0 -291
- package/dist/codegen/emitMantleModule.js.map +0 -1
- package/dist/codegen.d.ts +0 -2
- package/dist/codegen.d.ts.map +0 -1
- package/dist/codegen.js +0 -2
- package/dist/codegen.js.map +0 -1
- package/dist/runtime-testing.d.ts +0 -2
- package/dist/runtime-testing.d.ts.map +0 -1
- package/dist/runtime-testing.js +0 -2
- package/dist/runtime-testing.js.map +0 -1
- package/dist/runtime.d.ts +0 -2
- package/dist/runtime.d.ts.map +0 -1
- package/dist/runtime.js +0 -2
- package/dist/runtime.js.map +0 -1
- package/dist/spec.d.ts +0 -2
- package/dist/spec.d.ts.map +0 -1
- package/dist/spec.js +0 -2
- package/dist/spec.js.map +0 -1
- package/dist/vercel-libsql.d.ts +0 -2
- package/dist/vercel-libsql.d.ts.map +0 -1
- package/dist/vercel-libsql.js +0 -2
- package/dist/vercel-libsql.js.map +0 -1
- package/dist/vercel.d.ts +0 -2
- package/dist/vercel.d.ts.map +0 -1
- package/dist/vercel.js +0 -2
- package/dist/vercel.js.map +0 -1
- package/dist/web.d.ts +0 -2
- package/dist/web.d.ts.map +0 -1
- package/dist/web.js +0 -2
- package/dist/web.js.map +0 -1
- package/docs/adapter-guide.md +0 -222
- package/docs/agent-prompts.md +0 -102
- package/docs/api-mcp-authorization.md +0 -5
- package/docs/assets/mantle-admin-developer.png +0 -0
- package/docs/assets/mantle-admin-operations.png +0 -0
- package/docs/assets/mantle-hero.jpg +0 -0
- package/docs/auth-hosting-model.md +0 -166
- package/docs/cloudflare-low-level-composition.md +0 -5
- package/docs/consumer-onboarding-audit.md +0 -65
- package/docs/deferred-lifecycle-queues.md +0 -5
- package/docs/design-atoms.md +0 -16
- package/docs/design-references/editorial-blog-2026-05-05.md +0 -218
- package/docs/direct-authoring.md +0 -5
- package/docs/examples/builtin-commerce.md +0 -269
- package/docs/examples/builtin-intake.md +0 -143
- package/docs/examples/builtin-legal-documents.md +0 -189
- package/docs/examples/builtin-procurement.md +0 -241
- package/docs/examples/builtin-publication.md +0 -241
- package/docs/examples/builtin-reservation.md +0 -149
- package/docs/examples/cf-primitives-commerce-inventory.md +0 -809
- package/docs/examples/cf-primitives-guarded-api.md +0 -429
- package/docs/examples/cf-primitives-intake-hooks.md +0 -319
- package/docs/examples/host-chatgpt-sites/.openai/hosting.json +0 -1
- package/docs/examples/host-chatgpt-sites/README.md +0 -70
- package/docs/examples/host-chatgpt-sites/drizzle/0000_sites_users.sql +0 -8
- package/docs/examples/host-chatgpt-sites/drizzle/0001_mantle.sql +0 -294
- package/docs/examples/host-chatgpt-sites/drizzle/0002_article_cover.sql +0 -5
- package/docs/examples/host-chatgpt-sites/drizzle/0003_store_instance_id.sql +0 -1
- package/docs/examples/host-chatgpt-sites/drizzle/meta/_journal.json +0 -1
- package/docs/examples/host-chatgpt-sites/manifests/site.yaml +0 -27
- package/docs/examples/host-chatgpt-sites/package.json +0 -1
- package/docs/examples/host-chatgpt-sites/public/site.css +0 -1
- package/docs/examples/host-chatgpt-sites/scripts/build.mjs +0 -13
- package/docs/examples/host-chatgpt-sites/scripts/check.mjs +0 -101
- package/docs/examples/host-chatgpt-sites/scripts/migration.mjs +0 -9
- package/docs/examples/host-chatgpt-sites/src/chatgpt-auth.ts +0 -63
- package/docs/examples/host-chatgpt-sites/src/index.ts +0 -46
- package/docs/examples/host-chatgpt-sites/src/mcp.ts +0 -49
- package/docs/examples/host-chatgpt-sites/src/media.ts +0 -109
- package/docs/examples/host-chatgpt-sites/src/r2-lab.ts +0 -38
- package/docs/examples/host-chatgpt-sites/src/storage-fingerprint.json +0 -1
- package/docs/examples/host-chatgpt-sites/src/web.ts +0 -35
- package/docs/examples/host-chatgpt-sites/tsconfig.json +0 -1
- package/docs/examples/host-chatgpt-sites/wrangler.jsonc +0 -10
- package/docs/examples/host-local-admin-otp/.dev.vars.example +0 -3
- package/docs/examples/host-local-admin-otp/README.md +0 -80
- package/docs/examples/host-local-admin-otp/ensure-dev-vars.mjs +0 -5
- package/docs/examples/host-local-admin-otp/manifests/site.yaml +0 -25
- package/docs/examples/host-local-admin-otp/package.json +0 -29
- package/docs/examples/host-local-admin-otp/public/.gitkeep +0 -1
- package/docs/examples/host-local-admin-otp/smoke.mjs +0 -141
- package/docs/examples/host-local-admin-otp/src/index.ts +0 -54
- package/docs/examples/host-local-admin-otp/tsconfig.json +0 -17
- package/docs/examples/host-local-admin-otp/wrangler.jsonc +0 -23
- package/docs/examples/host-minimal-worker/README.md +0 -41
- package/docs/examples/host-minimal-worker/manifests/site.yaml +0 -25
- package/docs/examples/host-minimal-worker/package.json +0 -26
- package/docs/examples/host-minimal-worker/smoke.mjs +0 -23
- package/docs/examples/host-minimal-worker/src/index.ts +0 -4
- package/docs/examples/host-minimal-worker/wrangler.jsonc +0 -22
- package/docs/handbook/chatgpt-sites/equipment-checkout.md +0 -231
- package/docs/handbook/chatgpt-sites/host-reference.md +0 -113
- package/docs/handbook/chatgpt-sites/index.md +0 -123
- package/docs/handbook/cloudflare/bindings.md +0 -298
- package/docs/handbook/cloudflare/conventional-worker.md +0 -162
- package/docs/handbook/cloudflare/deferred-hooks-queues.md +0 -170
- package/docs/handbook/cloudflare/low-level-composition.md +0 -169
- package/docs/handbook/cloudflare/public-web.md +0 -144
- package/docs/handbook/cloudflare/site-chrome.md +0 -75
- package/docs/handbook/examples/commerce-transaction.md +0 -11
- package/docs/handbook/examples/commerce.md +0 -11
- package/docs/handbook/examples/guarded-api.md +0 -10
- package/docs/handbook/examples/intake-form.md +0 -12
- package/docs/handbook/examples/intake-hooks.md +0 -11
- package/docs/handbook/examples/legal-documents.md +0 -10
- package/docs/handbook/examples/procurement-approvals.md +0 -10
- package/docs/handbook/examples/publication.md +0 -10
- package/docs/handbook/examples/reservation.md +0 -10
- package/docs/handbook/start/quickstart-admin.md +0 -50
- package/docs/labels.md +0 -71
- package/docs/media-uploads.md +0 -5
- package/docs/migration-0.1.2.md +0 -13
- package/docs/performance-harness.md +0 -228
- package/docs/release-process.md +0 -244
- package/docs/schema-indexes.md +0 -5
- package/docs/sealed-pipeline-ownership.md +0 -101
- package/docs/skills/plugin/SKILL.md +0 -132
- package/docs/skills/theme/SKILL.md +0 -77
- package/docs/spec-only-host-adoption.md +0 -157
- package/docs/transaction-patterns.md +0 -5
- package/skills/README.md +0 -125
- package/skills/develop/SKILL.md +0 -250
- package/skills/install/SKILL.md +0 -149
- package/skills/media-gc/SKILL.md +0 -85
- package/skills/plugin/SKILL.md +0 -132
- package/skills/provision/SKILL.md +0 -194
- package/skills/theme/SKILL.md +0 -77
- package/skills/update/SKILL.md +0 -51
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { CENTER, NOW, boot, caller, program, reset, site } from '../harness.js';
|
|
2
|
+
import { isConflict, isRefusal, runProcedure, runView } from '../harness.js';
|
|
3
|
+
import { ALL_POSITIONS } from '../../core/sql/positions.js';
|
|
4
|
+
const v = (sql, rows, inputs, input) => ({ kind: 'view', sql, rows: [rows], inputs, input });
|
|
5
|
+
const w = (sql, rows, inputs, input) => ({ kind: 'procedure', sql, rows, inputs, input });
|
|
6
|
+
const conflict = (sql) => ({ kind: 'procedure', sql, conflict: true });
|
|
7
|
+
const ids = (...x) => x.map((id) => ({ id }));
|
|
8
|
+
/** One entry per RelationPosition. A missing or extra key does not typecheck. */
|
|
9
|
+
export const PROBES = {
|
|
10
|
+
from: { steps: [v('SELECT id, name FROM items ORDER BY id', [{ id: 'a', name: 'apple' }, { id: 'b', name: 'berry' }, { id: 'c', name: 'cherry' }, { id: 'd', name: 'date' }])] },
|
|
11
|
+
'join.left': { steps: [v('SELECT a.id AS aid, o.id AS oid FROM items a JOIN orders o ON o.item_id = a.id ORDER BY a.id, o.id', [{ aid: 'a', oid: 'oa' }, { aid: 'a', oid: 'ob' }])] },
|
|
12
|
+
'join.right': { steps: [v('SELECT o.id AS oid, i.name AS name FROM orders o LEFT JOIN items i ON i.id = o.item_id ORDER BY o.id', [{ oid: 'oa', name: 'apple' }, { oid: 'ob', name: 'apple' }, { oid: 'oe', name: null }])] },
|
|
13
|
+
'from-subquery': { steps: [
|
|
14
|
+
v('SELECT s.id FROM (SELECT id FROM items) s ORDER BY s.id', ids('a', 'b', 'c', 'd')),
|
|
15
|
+
// LATERAL (reference profile): the subquery reads the outer row, and is wrapped as any FROM subquery
|
|
16
|
+
v('SELECT i.id, x.first FROM items i JOIN LATERAL (SELECT o.id AS first FROM orders o WHERE o.item_id = i.id ORDER BY o.id LIMIT 1) x ON true ORDER BY i.id', [{ id: 'a', first: 'oa' }]),
|
|
17
|
+
] },
|
|
18
|
+
// the reference profile's positions (ADR-0037); the D1 dialect refuses them, and a refusal passes
|
|
19
|
+
cte: { steps: [
|
|
20
|
+
v('WITH x AS (SELECT id FROM items) SELECT id FROM x ORDER BY id', ids('a', 'b', 'c', 'd')),
|
|
21
|
+
v('WITH RECURSIVE r AS (SELECT id, 1 AS n FROM items UNION ALL SELECT r.id, r.n + 1 AS n FROM r WHERE r.n < 2) SELECT id FROM r ORDER BY id, n', ids('a', 'a', 'b', 'b', 'c', 'c', 'd', 'd')),
|
|
22
|
+
] },
|
|
23
|
+
'setop.left': { steps: [v('SELECT u.id FROM (SELECT id FROM items UNION ALL SELECT id FROM requisitions) u ORDER BY u.id', ids('a', 'b', 'c', 'd', 'r1', 'r2'))] },
|
|
24
|
+
'setop.right': { steps: [v('SELECT u.id FROM (SELECT id FROM requisitions UNION SELECT id FROM items) u ORDER BY u.id', ids('a', 'b', 'c', 'd', 'r1', 'r2'))] },
|
|
25
|
+
sublink: { steps: [
|
|
26
|
+
v('SELECT id FROM orders WHERE item_id IN (SELECT id FROM items) ORDER BY id', ids('oa', 'ob')),
|
|
27
|
+
v("SELECT id FROM requisitions WHERE EXISTS (SELECT 1 FROM items WHERE name LIKE 'LEAK%')", []),
|
|
28
|
+
v("SELECT id FROM requisitions WHERE EXISTS (SELECT 1 FROM items WHERE name = 'apple') ORDER BY id", ids('r1', 'r2')),
|
|
29
|
+
v("SELECT (SELECT count(*) FROM items) AS n, (SELECT max(stock) FROM items) AS mx FROM requisitions WHERE id = 'r1'", [{ n: 4, mx: 9 }]),
|
|
30
|
+
] },
|
|
31
|
+
json_each: { steps: [v('SELECT j.value AS v FROM items i, json_each(i.tags) j ORDER BY i.id, j.id', [{ v: 'red' }, { v: 'big' }, { v: 'blue' }, { v: 'red' }, { v: 'red' }])] },
|
|
32
|
+
window: { steps: [v('SELECT x.id, x.rn FROM (SELECT id, row_number() OVER (ORDER BY id) AS rn FROM items) x ORDER BY x.id', [{ id: 'a', rn: 1 }, { id: 'b', rn: 2 }, { id: 'c', rn: 3 }, { id: 'd', rn: 4 }])] },
|
|
33
|
+
'insert-target': { steps: [
|
|
34
|
+
// o2 has a setting 'lang'; the caller's own insert of the same key does not collide (unique includes the scope) and is owned by the caller
|
|
35
|
+
w("INSERT INTO settings (key, value) VALUES ('lang', 'yy') RETURNING key, value", [[{ key: 'lang', value: 'yy' }]]),
|
|
36
|
+
w("INSERT INTO settings (key, value) VALUES ('t', 'v') ON CONFLICT (key) DO NOTHING RETURNING key", [[{ key: 't' }]]),
|
|
37
|
+
] },
|
|
38
|
+
'insert-select': { steps: [w('INSERT INTO orders (item_id, qty) SELECT id, 1 FROM items RETURNING item_id', [ids('a', 'b', 'c', 'd').map((x) => ({ item_id: x.id }))])] },
|
|
39
|
+
'update-target': { steps: [
|
|
40
|
+
w("UPDATE items SET stock = 0 WHERE cat = 'x' RETURNING id", [ids('a', 'b', 'd')]),
|
|
41
|
+
conflict("UPDATE items SET stock = 0 WHERE id = 'X_z1'"),
|
|
42
|
+
conflict("UPDATE items SET stock = 0 WHERE id = 'X_e1'"),
|
|
43
|
+
] },
|
|
44
|
+
'delete-target': { steps: [
|
|
45
|
+
w("DELETE FROM requisitions WHERE state = 'pending' RETURNING id", [ids('r1', 'r2')]),
|
|
46
|
+
conflict("DELETE FROM requisitions WHERE id = 'X_rz'"),
|
|
47
|
+
] },
|
|
48
|
+
'conflict-update': { steps: [
|
|
49
|
+
// the conflicting row is the caller's own 's1'; another owner's 'X_sz' (same key) is untouched
|
|
50
|
+
w("INSERT INTO settings (key, value) VALUES ('theme', 'pwn') ON CONFLICT (key) DO UPDATE SET value = excluded.value RETURNING id, value", [[{ id: 's1', value: 'pwn' }]]),
|
|
51
|
+
// an expired row of the caller's own is not revived by an upsert: DO UPDATE ... WHERE carries the TTL
|
|
52
|
+
w("INSERT INTO notes (title, body) VALUES ('LEAK 小籠包 hello apple', 'revived') ON CONFLICT (title) DO UPDATE SET body = excluded.body RETURNING id", [[]]),
|
|
53
|
+
] },
|
|
54
|
+
search: { steps: [v('SELECT id FROM notes WHERE mantle.search(notes, input.q) ORDER BY id', ids('n1'), { q: 'text' }, { q: '小籠包' })] },
|
|
55
|
+
near: { steps: [v('SELECT id FROM places WHERE mantle.near(places.loc, input.lat, input.lng, 5000) ORDER BY id', ids('pl1200', 'pl300', 'pl4900'), { lat: 'float8', lng: 'float8' }, { lat: CENTER.lat, lng: CENTER.lng })] },
|
|
56
|
+
};
|
|
57
|
+
/** every row that must never change: another owner's, expired and unpublished rows all have an `X_` id */
|
|
58
|
+
async function protectedRows(d1) {
|
|
59
|
+
const out = {};
|
|
60
|
+
for (const t of ['items', 'requisitions', 'orders', 'settings', 'posts', 'notes', 'places'])
|
|
61
|
+
out[t] = await d1.all(`SELECT * FROM ${t} WHERE id LIKE 'X\\_%' ESCAPE '\\' ORDER BY id`);
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
export async function run(r, engine) {
|
|
65
|
+
r.section('Case 7: policy probe (every relation position, another owner / expired / unpublished rows)');
|
|
66
|
+
const b = await boot(engine);
|
|
67
|
+
const positions = Object.keys(PROBES);
|
|
68
|
+
r.equal(`the probe list covers all ${ALL_POSITIONS.length} positions of the IR union (and \`satisfies\` makes that a typecheck error when it does not)`, [...positions].sort(), [...ALL_POSITIONS].sort());
|
|
69
|
+
// one probe run: the problems found (an error, a LEAK / X_ row in a result, a protected row changed)
|
|
70
|
+
// a dialect that runs only the base profile refuses the reference profile's steps, and that refusal passes
|
|
71
|
+
const refused = new Set();
|
|
72
|
+
const probe = async (pos, opts) => {
|
|
73
|
+
const problems = [];
|
|
74
|
+
for (const [n, step] of PROBES[pos].steps.entries()) {
|
|
75
|
+
await reset(b);
|
|
76
|
+
const before = JSON.stringify(await protectedRows(b.d1));
|
|
77
|
+
let p;
|
|
78
|
+
try {
|
|
79
|
+
p = await program(step.kind, step.sql, step.inputs ?? {});
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
if (!/needs the PostgreSQL dialect/.test(String(e)))
|
|
83
|
+
throw e;
|
|
84
|
+
if (n === 0)
|
|
85
|
+
refused.add(pos);
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
const s = { ...site(b), ...opts, mode: step.mode };
|
|
89
|
+
let rows, err;
|
|
90
|
+
try {
|
|
91
|
+
rows = step.kind === 'view' ? [(await runView(s, p, caller(step.input))).rows] : (await runProcedure(s, p, caller(step.input))).rows;
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
err = e;
|
|
95
|
+
}
|
|
96
|
+
const json = JSON.stringify(rows ?? []);
|
|
97
|
+
if (step.conflict ? !isConflict(err) : err || json.includes('LEAK') || json.includes('X_') || (step.rows && json !== JSON.stringify(step.rows)))
|
|
98
|
+
problems.push(`#${n + 1} ${step.sql.slice(0, 50)}: ${String(err ?? json).slice(0, 100)}`);
|
|
99
|
+
if (JSON.stringify(await protectedRows(b.d1)) !== before)
|
|
100
|
+
problems.push(`#${n + 1}: a protected row changed`);
|
|
101
|
+
}
|
|
102
|
+
return problems;
|
|
103
|
+
};
|
|
104
|
+
for (const pos of positions) {
|
|
105
|
+
const seen = new Set();
|
|
106
|
+
const problems = await probe(pos, { seen });
|
|
107
|
+
if (!seen.has(pos) && !refused.has(pos))
|
|
108
|
+
problems.push('the policy pass printed no wrapper (or system relation) at this position');
|
|
109
|
+
r.check(`${pos}: no LEAK / X_ row in a result, the caller's own rows all there, conflicts where the row is invisible, protected rows unchanged, wrapper printed`, problems.length === 0, problems);
|
|
110
|
+
}
|
|
111
|
+
// negative control: with the visibility predicate switched off, every read/write position must be caught by its probe
|
|
112
|
+
const missed = [];
|
|
113
|
+
const run = positions.filter((pos) => !refused.has(pos));
|
|
114
|
+
for (const pos of run)
|
|
115
|
+
if (!(await probe(pos, { unsafeNoVisibility: true })).length)
|
|
116
|
+
missed.push(pos);
|
|
117
|
+
r.check(`negative control: with the visibility predicate off, ${run.length - missed.length} of ${run.length} positions are caught by their probes`, missed.length <= 1, `missed: ${missed.join(', ') || 'none'}`);
|
|
118
|
+
// what the ADR says about the write path, on top of the positions
|
|
119
|
+
await reset(b);
|
|
120
|
+
const { rows } = await runProcedure(site(b), await program('procedure', "INSERT INTO settings (key, value) VALUES ('lang', 'yy') RETURNING id"), caller());
|
|
121
|
+
const mine = (await b.d1.all('SELECT owner, created_at, length(id) AS idlen FROM settings WHERE id = ?1', [rows[0][0].id]))[0];
|
|
122
|
+
r.equal("an insert is owned by the caller, stamped with now(), gets a generated id, and does not touch another owner's same-key row", [{ ...mine, created_at: Date.parse(b.dialect.codec.decode('timestamptz', mine.created_at)) * 1000 }, (await b.d1.all("SELECT value FROM settings WHERE id = 'X_sz2'"))[0].value], [{ owner: 'o1', created_at: NOW, idlen: 32 }, 'xx']);
|
|
123
|
+
// modes: public reads see published, unexpired rows only; trusted (runtime.store) sees every owner but TTL still applies
|
|
124
|
+
const posts = await program('view', 'SELECT id FROM posts ORDER BY id');
|
|
125
|
+
const all = await program('view', 'SELECT id FROM items ORDER BY id');
|
|
126
|
+
r.equal('public caller sees only the published, unexpired post; trusted runtime.store sees every owner but not the expired row', [(await runView({ ...site(b), mode: 'public' }, posts, caller())).rows, (await runView({ ...site(b), mode: 'trusted' }, all, caller())).rows], [ids('p1'), ids('X_z1', 'X_z2', 'a', 'b', 'c', 'd')]);
|
|
127
|
+
// an alias that spells one of the lowering placeholders is only an identifier (it must not be spliced into)
|
|
128
|
+
const odd = await runView(site(b), await program('view', 'SELECT n__q.id FROM notes AS n__q WHERE mantle.search(n__q, input.q) ORDER BY n__q.id', { q: 'text' }), caller({ q: '小籠包' }));
|
|
129
|
+
r.equal('an alias containing __q is an identifier, not a placeholder: search() still works through it', odd.rows, ids('n1'));
|
|
130
|
+
// a Schema whose lifecycle is publishing takes row ops only, and only a draft can be edited (the lifecycle rule)
|
|
131
|
+
const fail = async (sql) => { try {
|
|
132
|
+
await runProcedure(site(b), await program('procedure', sql), caller());
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
return e;
|
|
136
|
+
} };
|
|
137
|
+
const setOp = await fail("UPDATE posts SET title = 'x' WHERE title = 'Hello world'");
|
|
138
|
+
const published = await fail("UPDATE posts SET title = 'x' WHERE id = 'p1'");
|
|
139
|
+
const draft = await runProcedure(site(b), await program('procedure', "UPDATE posts SET title = 'x' WHERE id = 'X_p2' RETURNING id"), caller());
|
|
140
|
+
r.check('a set op on a publishing Schema is refused; a row op edits a draft, and a published entry is CONFLICT', isRefusal(setOp, 'SQL_SHAPE') && isConflict(published) && draft.rows[0].length === 1, [String(setOp?.message), String(published?.message)]);
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/testing/cases/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"printer.d.ts","sourceRoot":"","sources":["../../../src/testing/cases/printer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAI5C,wBAAsB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAsBlD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { boot, caller, program, reset, runProcedure, runView, site } from '../harness.js';
|
|
2
|
+
import { corpus, typedRows } from './corpus.js';
|
|
3
|
+
export async function run(r, engine) {
|
|
4
|
+
r.section('Printer corpus: every allowlisted node on the engine');
|
|
5
|
+
const b = await boot(engine);
|
|
6
|
+
const s = site(b);
|
|
7
|
+
const bad = [];
|
|
8
|
+
const refused = [];
|
|
9
|
+
for (const item of corpus) {
|
|
10
|
+
const rt = { ...caller(item.input), role: 'staff' };
|
|
11
|
+
// a construct the dialect's compile side refuses as unsupported passes by that refusal (ADR-0035 decision 8); any other
|
|
12
|
+
// refusal (syntax, a column, a relation) is the corpus item failing
|
|
13
|
+
const p = await program(item.kind, item.sql, item.inputs ?? {}).catch((e) => (/^SQL_(UNSUPPORTED|FUNCTION|TYPE):/.test(e.message) ? undefined : Promise.reject(e)));
|
|
14
|
+
if (!p) {
|
|
15
|
+
refused.push(item.id);
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
if (item.kind === 'procedure')
|
|
20
|
+
await reset(b);
|
|
21
|
+
const rows = item.kind === 'view' ? [(await runView(s, p, rt)).rows] : (await runProcedure(s, p, rt)).rows;
|
|
22
|
+
// PostgreSQL semantics in D1's storage encoding, or as the Store's typed wire values (see `typedRows`)
|
|
23
|
+
if (![item.expect, typedRows[item.id]].some((e) => e && JSON.stringify(rows) === JSON.stringify(e)))
|
|
24
|
+
bad.push(`${item.id}: expected ${JSON.stringify(item.expect)} got ${JSON.stringify(rows)}`);
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
bad.push(`${item.id}: ${String(e.message).split('\n')[0].slice(0, 200)}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
r.check(`all ${corpus.length - refused.length} corpus items the dialect accepts (of ${corpus.length}) give the rows PostgreSQL semantics give; refused as unsupported: ${refused.join(', ') || 'none'}`, bad.length === 0, bad.join('; '));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=printer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"printer.js","sourceRoot":"","sources":["../../../src/testing/cases/printer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Report } from '../report.js';
|
|
2
|
+
import type { Engine } from '../harness.js';
|
|
3
|
+
export declare const VIEW = "\n SELECT i.name, count(o.id) AS n, coalesce(sum(o.qty), 0) AS total\n FROM items i LEFT JOIN orders o ON o.item_id = i.id\n GROUP BY i.name HAVING count(o.id) >= input.min\n ORDER BY total DESC, i.name\n LIMIT 10";
|
|
4
|
+
export declare function run(r: Report, engine: Engine): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=report-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-view.d.ts","sourceRoot":"","sources":["../../../src/testing/cases/report-view.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAI5C,eAAO,MAAM,IAAI,+NAKN,CAAC;AAEZ,wBAAsB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBA2BlD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { boot, caller, program, site } from '../harness.js';
|
|
2
|
+
import { runView } from '../harness.js';
|
|
3
|
+
export const VIEW = `
|
|
4
|
+
SELECT i.name, count(o.id) AS n, coalesce(sum(o.qty), 0) AS total
|
|
5
|
+
FROM items i LEFT JOIN orders o ON o.item_id = i.id
|
|
6
|
+
GROUP BY i.name HAVING count(o.id) >= input.min
|
|
7
|
+
ORDER BY total DESC, i.name
|
|
8
|
+
LIMIT 10`;
|
|
9
|
+
export async function run(r, engine) {
|
|
10
|
+
r.section('Case 3: report View (join, GROUP BY/HAVING, cursor)');
|
|
11
|
+
const b = await boot(engine);
|
|
12
|
+
const s = site(b);
|
|
13
|
+
const p = await program('view', VIEW, { min: 'int8' });
|
|
14
|
+
const all = (await runView(s, p, caller({ min: 0 }))).rows;
|
|
15
|
+
r.equal("o1's report: apple has its two visible orders; the other owner's order for apple and the order on the expired item are not counted; the LEFT JOIN keeps unmatched items", all, [{ name: 'apple', n: 2, total: 4 }, { name: 'berry', n: 0, total: 0 }, { name: 'cherry', n: 0, total: 0 }, { name: 'date', n: 0, total: 0 }]);
|
|
16
|
+
r.equal("HAVING binds an input (min = 1 keeps only apple); o2's report sees only o2's rows", [(await runView(s, p, caller({ min: 1 }))).rows, (await runView(s, p, caller({ min: 0 }, 'o2'))).rows.map((x) => x.name).sort()], [[{ name: 'apple', n: 2, total: 4 }], ['LEAK-zeta', 'LEAK-zulu']]);
|
|
17
|
+
// cursor: keyset pagination over (total DESC, name, and the appended group key)
|
|
18
|
+
const pages = [];
|
|
19
|
+
let cursor;
|
|
20
|
+
for (let i = 0; i < 6; i++) {
|
|
21
|
+
const page = await runView(s, p, caller({ min: 0 }), { cursor, pageSize: 2 });
|
|
22
|
+
pages.push(page.rows);
|
|
23
|
+
if (!page.next)
|
|
24
|
+
break;
|
|
25
|
+
cursor = page.next;
|
|
26
|
+
}
|
|
27
|
+
r.equal('cursor: pages of 2 cover the report in order, without repeats or gaps, and the last page has no next cursor', pages, [all.slice(0, 2), all.slice(2, 4)]);
|
|
28
|
+
// a forged cursor cannot reveal another owner's row (the keys only filter the caller's own result); ties on the first key are broken by the group key
|
|
29
|
+
const forged = await runView(s, p, caller({ min: 0 }), { cursor: [0, 'LEAK-zeta', 'LEAK-zeta'], pageSize: 5 });
|
|
30
|
+
const inTie = await runView(s, p, caller({ min: 0 }), { cursor: [0, 'berry', 'berry'], pageSize: 5 });
|
|
31
|
+
r.check("a forged cursor value only filters the caller's own rows; a cursor inside a run of equal totals continues after the given name", !JSON.stringify(forged.rows).includes('LEAK') && JSON.stringify(inTie.rows.map((x) => x.name)) === '["cherry","date"]', [forged.rows, inTie.rows]);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=report-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-view.js","sourceRoot":"","sources":["../../../src/testing/cases/report-view.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;WAKT,CAAC;AAEZ,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,CAAS,EAAE,MAAc;IACjD,CAAC,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC;IACjE,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvD,MAAM,GAAG,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,CAAC,CAAC,KAAK,CAAC,yKAAyK,EAC/K,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACrJ,CAAC,CAAC,KAAK,CAAC,mFAAmF,EACzF,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAE5M,gFAAgF;IAChF,MAAM,KAAK,GAAY,EAAE,CAAC;IAC1B,IAAI,MAA6B,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,MAAM;QACtB,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IACD,CAAC,CAAC,KAAK,CAAC,6GAA6G,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClK,sJAAsJ;IACtJ,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/G,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;IACtG,CAAC,CAAC,KAAK,CAAC,gIAAgI,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,mBAAmB,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAEpS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requisition.d.ts","sourceRoot":"","sources":["../../../src/testing/cases/requisition.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAW5C,wBAAsB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBA6BlD"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { boot, caller, program, site } from '../harness.js';
|
|
2
|
+
import { isConflict, opIndexOf, runProcedure } from '../harness.js';
|
|
3
|
+
const PROGRAM = `
|
|
4
|
+
UPDATE requisitions SET state = CASE WHEN input.approve THEN 'approved' ELSE 'rejected' END
|
|
5
|
+
WHERE id = input.id AND state = 'pending' RETURNING id, state;
|
|
6
|
+
INSERT INTO orders (item_id, qty) SELECT r.item_id, r.qty FROM requisitions r
|
|
7
|
+
WHERE r.id = input.id AND r.state = 'approved' RETURNING *;`;
|
|
8
|
+
export async function run(r, engine) {
|
|
9
|
+
r.section('Case 1: requisition');
|
|
10
|
+
const b = await boot(engine);
|
|
11
|
+
const calls = [];
|
|
12
|
+
const hooks = { after: { orders: { insert: ({ rows }) => { calls.push(rows); } } } };
|
|
13
|
+
const s = site(b, hooks);
|
|
14
|
+
const p = await program('procedure', PROGRAM, { id: 'text', approve: 'bool' });
|
|
15
|
+
const state = async (id) => (await b.d1.all('SELECT state FROM requisitions WHERE id = ?1', [id]))[0]?.state;
|
|
16
|
+
const orders = async () => (await b.d1.all("SELECT count(*) n FROM orders WHERE owner = 'o1'"))[0].n;
|
|
17
|
+
const conflictOf = async (prog, input) => { try {
|
|
18
|
+
await runProcedure(s, prog, caller(input));
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
return isConflict(e) ? opIndexOf(e) : String(e);
|
|
22
|
+
} };
|
|
23
|
+
// approve: the CASE value, RETURNING rows of both statements, one after-hook call with the written row
|
|
24
|
+
const ok = await runProcedure(s, p, caller({ id: 'r1', approve: true }));
|
|
25
|
+
r.equal('approve r1: RETURNING of the UPDATE and of the conditional INSERT, and the row op persisted', [ok.rows, await state('r1')], [[[{ id: 'r1', state: 'approved' }], [{ item_id: 'a', qty: 2, total: null }]], 'approved']);
|
|
26
|
+
const row = calls[0]?.[0];
|
|
27
|
+
r.check('approve r1: the after hook ran once; its row carries id and version although RETURNING * names neither', calls.length === 1 && row?.id?.length > 0 && row.version === 1 && row.qty === 2, calls);
|
|
28
|
+
// reject: the INSERT writes zero rows, which is a normal result, and calls no hook
|
|
29
|
+
const before = { orders: await orders(), calls: calls.length };
|
|
30
|
+
const rej = await runProcedure(s, p, caller({ id: 'r2', approve: false }));
|
|
31
|
+
r.equal('reject r2: the conditional INSERT writes nothing, and calls no hook', [rej.rows, { orders: await orders(), calls: calls.length }], [[[{ id: 'r2', state: 'rejected' }], []], before]);
|
|
32
|
+
// the precondition no longer holds (r1 again), or the row is not visible (another owner's): the same CONFLICT op=0
|
|
33
|
+
r.equal('r1 again and another owner\'s X_rz: CONFLICT op=0 each, nothing written, no hook', [await conflictOf(p, { id: 'r1', approve: true }), await conflictOf(p, { id: 'X_rz', approve: true }), await state('X_rz'), { orders: await orders(), calls: calls.length }], [0, 0, 'pending', before]);
|
|
34
|
+
// atomicity and the exact op index: the second row op conflicts, so the first is rolled back
|
|
35
|
+
const two = await program('procedure', "UPDATE items SET stock = stock - 1 WHERE id = 'a'; UPDATE items SET stock = 0 WHERE id = 'nope'");
|
|
36
|
+
r.equal('two row ops, the second matches nothing: CONFLICT op=1 and the first is rolled back (stock of a is still 5)', [await conflictOf(two, {}), (await b.d1.all("SELECT stock FROM items WHERE id = 'a'"))[0].stock], [1, 5]);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=requisition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requisition.js","sourceRoot":"","sources":["../../../src/testing/cases/requisition.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGpE,MAAM,OAAO,GAAG;;;;gEAIgD,CAAC;AAEjE,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,CAAS,EAAE,MAAc;IACjD,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAU,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;IAC5F,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACzB,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,KAAK,EAAE,EAAU,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,8CAA8C,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;IACrH,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAErG,MAAM,UAAU,GAAG,KAAK,EAAE,IAAc,EAAE,KAA8B,EAAE,EAAE,GAAG,IAAI,CAAC;QAAC,MAAM,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC,CAAC,CAAC,CAAC;IAEpM,uGAAuG;IACvG,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,KAAK,CAAC,6FAA6F,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IACjO,MAAM,GAAG,GAAI,KAAK,CAAC,CAAC,CAAuB,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,KAAK,CAAC,wGAAwG,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IAE1M,mFAAmF;IACnF,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IAC/D,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3E,CAAC,CAAC,KAAK,CAAC,qEAAqE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAE/L,mHAAmH;IACnH,CAAC,CAAC,KAAK,CAAC,kFAAkF,EAAE,CAAC,MAAM,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAErS,6FAA6F;IAC7F,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,iGAAiG,CAAC,CAAC;IAC1I,CAAC,CAAC,KAAK,CAAC,6GAA6G,EAAE,CAAC,MAAM,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACnO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-places.d.ts","sourceRoot":"","sources":["../../../src/testing/cases/search-places.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAY5C,wBAAsB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAyDlD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { CENTER, boot, caller, isRefusal, north, program, site } from '../harness.js';
|
|
2
|
+
import { runProcedure, runView } from '../harness.js';
|
|
3
|
+
const R = 6_371_008.8;
|
|
4
|
+
const haversine = (lat1, lng1, lat2, lng2) => {
|
|
5
|
+
const rad = (x) => (x * Math.PI) / 180;
|
|
6
|
+
const a = Math.sin(rad(lat2 - lat1) / 2) ** 2 + Math.cos(rad(lat1)) * Math.cos(rad(lat2)) * Math.sin(rad(lng2 - lng1) / 2) ** 2;
|
|
7
|
+
return 2 * R * Math.asin(Math.min(1, Math.sqrt(a)));
|
|
8
|
+
};
|
|
9
|
+
export async function run(r, engine) {
|
|
10
|
+
r.section('Case 8: search and places');
|
|
11
|
+
const b = await boot(engine);
|
|
12
|
+
const s = site(b);
|
|
13
|
+
const search = async (q, caller_ = 'o1') => (await runView(s, await program('view', 'SELECT id FROM notes WHERE mantle.search(notes, input.q) ORDER BY id', { q: 'text' }), caller({ q }, caller_))).rows.map((x) => x.id);
|
|
14
|
+
// ---- full-text: trigram, with a LIKE fallback under three characters -------------------------------------------------
|
|
15
|
+
r.equal('substrings match, including two- and one-character Chinese ones; ASCII is case-insensitive', [await search('小籠包'), await search('小籠'), await search('包'), await search('HELLO')], [['n1'], ['n1'], ['n1'], ['n2', 'n4', 'n5']]);
|
|
16
|
+
// the query is bound as a quoted phrase, never as FTS5 syntax; the fallback escapes LIKE wildcards
|
|
17
|
+
r.equal('query syntax is literal (OR, title:, NEAR(, *, -, a quote, an unbalanced quote) and wildcards are literal (5%, _b, a_)', [await search('hello OR world'), await search('title:hello'), await Promise.all(['NEAR(a b)', 'hel*', '-hello', 'say "hi"', '"unbalanced'].map((q) => search(q))), await search('5%'), await search('_b'), await search('a_')], [['n5'], ['n5'], [[], [], [], [], []], ['n4'], ['n4'], ['n4']]);
|
|
18
|
+
// ---- other owners and expired rows -----------------------------------------------------------------------------
|
|
19
|
+
const rank = await program('view', 'SELECT id FROM notes WHERE mantle.search(notes, input.q) ORDER BY mantle.search_rank(notes), id', { q: 'text' });
|
|
20
|
+
const pub = async (q) => (await runView({ ...s, mode: 'public' }, await program('view', 'SELECT id FROM posts WHERE mantle.search(posts, input.q) ORDER BY id', { q: 'text' }), caller({ q }))).rows.map((x) => x.id);
|
|
21
|
+
r.equal("another owner's and expired rows are absent from search(), mantle.search_rank() and a public View; the other owner finds their own", [await search('LEAK'), (await runView(s, rank, caller({ q: 'LEAK' }))).rows, await pub('LEAK'), await pub('public'), await search('小籠包', 'o2')], [[], [], [], ['p1'], ['X_n1']]);
|
|
22
|
+
r.equal('mantle.search_rank orders by relevance: the note with the most occurrences of apple first', (await runView(s, rank, caller({ q: 'apple' }))).rows.map((x) => x.id), ['n3', 'n2']);
|
|
23
|
+
// ---- triggers keep the index in step; D1's meta.changes counts them, changes() does not -------------------------------------
|
|
24
|
+
const res = await runProcedure(s, await program('procedure', "UPDATE notes SET title = 'renamed zebra' WHERE id = 'n3' RETURNING id", {}), caller());
|
|
25
|
+
const afterUpdate = [await search('zebra'), (await search('apple apple')).includes('n3')];
|
|
26
|
+
await runProcedure(s, await program('procedure', "DELETE FROM notes WHERE id = 'n3'"), caller());
|
|
27
|
+
const afterDelete = await search('zebra');
|
|
28
|
+
await runProcedure(s, await program('procedure', "INSERT INTO notes (title, body) VALUES ('fresh mango note', 'x')"), caller());
|
|
29
|
+
r.equal('the FTS index follows UPDATE (new text found, old not), DELETE and INSERT; the row op still passed its count check', [afterUpdate, afterDelete, (await search('mango')).length, res.rows], [[['n3'], false], [], 1, [[{ id: 'n3' }]]]);
|
|
30
|
+
// ---- places: R*Tree + haversine -----------------------------------------------------------------------------------
|
|
31
|
+
const near = async (meters, extra = '') => (await runView(s, await program('view', `SELECT id FROM places WHERE mantle.near(places.loc, input.lat, input.lng, ${meters}) ${extra} ORDER BY id`, { lat: 'float8', lng: 'float8' }), caller({ lat: CENTER.lat, lng: CENTER.lng }))).rows.map((x) => x.id);
|
|
32
|
+
const places = [['pl300', 300], ['pl1200', 1200], ['pl4900', 4900], ['pl5200', 5200], ['pl10000', 10000]];
|
|
33
|
+
const truth = (m) => places.filter(([, d]) => haversine(CENTER.lat, CENTER.lng, north(d), CENTER.lng) <= m).map(([id]) => id).sort();
|
|
34
|
+
r.equal('near 1 km / 5 km / 20 km: the places inside (4900 m in, 5200 m out of 5 km; no other owner\'s or expired place at 300 m), as an independent haversine says', [await near(1000), await near(5000), await near(20000)], [truth(1000), truth(5000), truth(20000)]);
|
|
35
|
+
r.equal('and the three sets are the ones the fixtures were built for', [truth(1000), truth(5000), truth(20000)], [['pl300'], ['pl1200', 'pl300', 'pl4900'], ['pl10000', 'pl1200', 'pl300', 'pl4900', 'pl5200']]);
|
|
36
|
+
const closest = await program('view', 'SELECT id, mantle.distance(places.loc, input.lat, input.lng) AS d FROM places WHERE mantle.near(places.loc, input.lat, input.lng, 50000) ORDER BY mantle.distance(places.loc, input.lat, input.lng) LIMIT 3', { lat: 'float8', lng: 'float8' });
|
|
37
|
+
const rows = (await runView(s, closest, caller({ lat: CENTER.lat, lng: CENTER.lng }))).rows;
|
|
38
|
+
const err = Math.max(...rows.map((x, i) => Math.abs(x.d - haversine(CENTER.lat, CENTER.lng, north([300, 1200, 4900][i]), CENTER.lng))));
|
|
39
|
+
r.check('closest K = 3 in order of distance, and distance() agrees with an independent haversine to under 1 m', JSON.stringify(rows.map((x) => x.id)) === '["pl300","pl1200","pl4900"]' && err < 1, `max error ${err.toExponential(2)} m`);
|
|
40
|
+
// triggers keep the R*Tree in step
|
|
41
|
+
await runProcedure(s, await program('procedure', "UPDATE places SET loc_lat = input.lat, loc_lng = input.lng WHERE id = 'pl10000'", { lat: 'float8', lng: 'float8' }), caller({ lat: north(100), lng: CENTER.lng }));
|
|
42
|
+
const moved = await near(1000);
|
|
43
|
+
await runProcedure(s, await program('procedure', "DELETE FROM places WHERE id = 'pl300'"), caller());
|
|
44
|
+
const deleted = await near(1000);
|
|
45
|
+
await runProcedure(s, await program('procedure', "INSERT INTO places (name, loc_lat, loc_lng) VALUES ('new', input.lat, input.lng)", { lat: 'float8', lng: 'float8' }), caller({ lat: north(50), lng: CENTER.lng }));
|
|
46
|
+
r.equal('the R*Tree follows a move (pl10000 now within 1 km), a delete, and an insert', [moved, deleted, (await near(1000)).length], [['pl10000', 'pl300'], ['pl10000'], 2]);
|
|
47
|
+
// limits
|
|
48
|
+
const across = [];
|
|
49
|
+
for (const input of [{ lat: 0, lng: 179.99 }, { lat: 89.99, lng: 0 }]) {
|
|
50
|
+
try {
|
|
51
|
+
await runView(s, await program('view', 'SELECT id FROM places WHERE mantle.near(places.loc, input.lat, input.lng, 5000)', { lat: 'float8', lng: 'float8' }), caller(input));
|
|
52
|
+
across.push('accepted');
|
|
53
|
+
}
|
|
54
|
+
catch (x) {
|
|
55
|
+
across.push(isRefusal(x) && /antimeridian or a pole/.test(x.message));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
r.equal('a box across the antimeridian and a box across a pole are refused at run time', across, [true, true]);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=search-places.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-places.js","sourceRoot":"","sources":["../../../src/testing/cases/search-places.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stock.d.ts","sourceRoot":"","sources":["../../../src/testing/cases/stock.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAI5C,wBAAsB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBA8BlD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { boot, caller, program, site } from '../harness.js';
|
|
2
|
+
import { isCheck, isConflict, runProcedure } from '../harness.js';
|
|
3
|
+
export async function run(r, engine) {
|
|
4
|
+
r.section('Case 2: stock');
|
|
5
|
+
const b = await boot(engine);
|
|
6
|
+
const s = site(b);
|
|
7
|
+
const stock = async (id) => (await b.d1.all('SELECT stock FROM items WHERE id = ?1', [id]))[0]?.stock;
|
|
8
|
+
const take = await program('procedure', 'UPDATE items SET stock = stock - input.qty WHERE id = input.id RETURNING id, stock', { id: 'text', qty: 'int8' });
|
|
9
|
+
const fails = async (p, input) => { try {
|
|
10
|
+
await runProcedure(s, p, caller(input));
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
catch (e) {
|
|
14
|
+
return e;
|
|
15
|
+
} };
|
|
16
|
+
r.equal('take 3 of a (stock 5): RETURNING shows 2', (await runProcedure(s, take, caller({ id: 'a', qty: 3 }))).rows, [[{ id: 'a', stock: 2 }]]);
|
|
17
|
+
const over = await fails(take, { id: 'b', qty: 10 });
|
|
18
|
+
r.check('oversell b (stock 2, qty 10): CheckViolation naming the check, stock unchanged', isCheck(over) && /CHECK items: stock >= 0/.test(over.message) && (await stock('b')) === 2, String(over?.message));
|
|
19
|
+
// the whole batch fails: an earlier statement is rolled back; a set op fails as a whole; an insert is checked on its own trigger
|
|
20
|
+
const both = await program('procedure', "UPDATE items SET stock = stock - 1 WHERE id = 'a'; UPDATE items SET stock = stock - 10 WHERE id = 'b'");
|
|
21
|
+
const set = await program('procedure', "UPDATE items SET stock = stock - 6 WHERE cat = 'x'");
|
|
22
|
+
const ins = await program('procedure', "INSERT INTO items (name, cat, stock) VALUES ('n', 'x', -1)");
|
|
23
|
+
const errs = [await fails(both, {}), await fails(set, {}), await fails(ins, {})];
|
|
24
|
+
r.check('two updates (second oversells), a set op (one row would go negative), an insert of -1: each CheckViolation, nothing changed', errs.every((e) => isCheck(e)) && JSON.stringify(await Promise.all(['a', 'b', 'd'].map(stock))) === '[2,2,7]', errs.map((e) => e?.message));
|
|
25
|
+
// SQL CHECK semantics: NULL passes, exactly as in PostgreSQL
|
|
26
|
+
await runProcedure(s, await program('procedure', "UPDATE items SET stock = NULL WHERE id = 'd'"), caller());
|
|
27
|
+
r.equal('CHECK (stock >= 0) passes for NULL', await stock('d'), null);
|
|
28
|
+
// the check does not reveal another owner's row: an invisible row is a CONFLICT, not a CHECK error
|
|
29
|
+
const hidden = [await fails(take, { id: 'X_z1', qty: 1000 }), await fails(take, { id: 'X_e1', qty: 1000 })];
|
|
30
|
+
r.check("another owner's and an expired row with qty 1000: CONFLICT (not a check error), stock unchanged", hidden.every((e) => isConflict(e)) && JSON.stringify(await Promise.all(['X_z1', 'X_e1'].map(stock))) === '[50,100]', hidden.map((e) => e?.message));
|
|
31
|
+
// exact boundary: taking exactly what is left is allowed
|
|
32
|
+
await runProcedure(s, take, caller({ id: 'a', qty: 2 }));
|
|
33
|
+
r.equal('taking the last 2 leaves 0, which the check allows', await stock('a'), 0);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=stock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stock.js","sourceRoot":"","sources":["../../../src/testing/cases/stock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/testing/cases/store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAa5C,wBAAsB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAqGlD"}
|