@abloatai/transaction 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONVENTIONS.md +83 -0
- package/README.md +48 -0
- package/dist/ablo.d.ts +90 -0
- package/dist/ablo.d.ts.map +1 -0
- package/dist/ablo.js +34 -0
- package/dist/ablo.js.map +1 -0
- package/dist/ai-sdk/coordinatedTool.d.ts +123 -0
- package/dist/ai-sdk/coordinatedTool.d.ts.map +1 -0
- package/dist/ai-sdk/coordinatedTool.js +135 -0
- package/dist/ai-sdk/coordinatedTool.js.map +1 -0
- package/dist/ai-sdk/index.d.ts +2 -0
- package/dist/ai-sdk/index.d.ts.map +1 -0
- package/dist/ai-sdk/index.js +2 -0
- package/dist/ai-sdk/index.js.map +1 -0
- package/dist/auth/apiKey.d.ts +154 -0
- package/dist/auth/apiKey.d.ts.map +1 -0
- package/dist/auth/apiKey.js +408 -0
- package/dist/auth/apiKey.js.map +1 -0
- package/dist/auth/bootstrapScope.d.ts +16 -0
- package/dist/auth/bootstrapScope.d.ts.map +1 -0
- package/dist/auth/bootstrapScope.js +2 -0
- package/dist/auth/bootstrapScope.js.map +1 -0
- package/dist/auth/browserCredentialSafety.d.ts +7 -0
- package/dist/auth/browserCredentialSafety.d.ts.map +1 -0
- package/dist/auth/browserCredentialSafety.js +29 -0
- package/dist/auth/browserCredentialSafety.js.map +1 -0
- package/dist/auth/capability.d.ts +241 -0
- package/dist/auth/capability.d.ts.map +1 -0
- package/dist/auth/capability.js +253 -0
- package/dist/auth/capability.js.map +1 -0
- package/dist/auth/capabilityLifecycle.d.ts +47 -0
- package/dist/auth/capabilityLifecycle.d.ts.map +1 -0
- package/dist/auth/capabilityLifecycle.js +108 -0
- package/dist/auth/capabilityLifecycle.js.map +1 -0
- package/dist/auth/credentialEndpoint.d.ts +10 -0
- package/dist/auth/credentialEndpoint.d.ts.map +1 -0
- package/dist/auth/credentialEndpoint.js +58 -0
- package/dist/auth/credentialEndpoint.js.map +1 -0
- package/dist/auth/credentialEndpointProtocol.d.ts +24 -0
- package/dist/auth/credentialEndpointProtocol.d.ts.map +1 -0
- package/dist/auth/credentialEndpointProtocol.js +34 -0
- package/dist/auth/credentialEndpointProtocol.js.map +1 -0
- package/dist/auth/credentialKind.d.ts +4 -0
- package/dist/auth/credentialKind.d.ts.map +1 -0
- package/dist/auth/credentialKind.js +15 -0
- package/dist/auth/credentialKind.js.map +1 -0
- package/dist/auth/credentialPolicy.d.ts +141 -0
- package/dist/auth/credentialPolicy.d.ts.map +1 -0
- package/dist/auth/credentialPolicy.js +113 -0
- package/dist/auth/credentialPolicy.js.map +1 -0
- package/dist/auth/credentialResult.d.ts +7 -0
- package/dist/auth/credentialResult.d.ts.map +1 -0
- package/dist/auth/credentialResult.js +9 -0
- package/dist/auth/credentialResult.js.map +1 -0
- package/dist/auth/credentialSource.d.ts +31 -0
- package/dist/auth/credentialSource.d.ts.map +1 -0
- package/dist/auth/credentialSource.js +56 -0
- package/dist/auth/credentialSource.js.map +1 -0
- package/dist/auth/hostedEndpoints.d.ts +22 -0
- package/dist/auth/hostedEndpoints.d.ts.map +1 -0
- package/dist/auth/hostedEndpoints.js +22 -0
- package/dist/auth/hostedEndpoints.js.map +1 -0
- package/dist/auth/identity.d.ts +62 -0
- package/dist/auth/identity.d.ts.map +1 -0
- package/dist/auth/identity.js +224 -0
- package/dist/auth/identity.js.map +1 -0
- package/dist/auth/index.d.ts +189 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +312 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/schemas.d.ts +41 -0
- package/dist/auth/schemas.d.ts.map +1 -0
- package/dist/auth/schemas.js +69 -0
- package/dist/auth/schemas.js.map +1 -0
- package/dist/auth/sessionMint.d.ts +29 -0
- package/dist/auth/sessionMint.d.ts.map +1 -0
- package/dist/auth/sessionMint.js +92 -0
- package/dist/auth/sessionMint.js.map +1 -0
- package/dist/auth/token.d.ts +4 -0
- package/dist/auth/token.d.ts.map +1 -0
- package/dist/auth/token.js +4 -0
- package/dist/auth/token.js.map +1 -0
- package/dist/batching/index.d.ts +56 -0
- package/dist/batching/index.d.ts.map +1 -0
- package/dist/batching/index.js +148 -0
- package/dist/batching/index.js.map +1 -0
- package/dist/coordination/awaitClaimGrant.d.ts +57 -0
- package/dist/coordination/awaitClaimGrant.d.ts.map +1 -0
- package/dist/coordination/awaitClaimGrant.js +138 -0
- package/dist/coordination/awaitClaimGrant.js.map +1 -0
- package/dist/coordination/claimHeartbeatLoop.d.ts +85 -0
- package/dist/coordination/claimHeartbeatLoop.d.ts.map +1 -0
- package/dist/coordination/claimHeartbeatLoop.js +109 -0
- package/dist/coordination/claimHeartbeatLoop.js.map +1 -0
- package/dist/coordination/claimMeta.d.ts +50 -0
- package/dist/coordination/claimMeta.d.ts.map +1 -0
- package/dist/coordination/claimMeta.js +53 -0
- package/dist/coordination/claimMeta.js.map +1 -0
- package/dist/coordination/events.d.ts +75 -0
- package/dist/coordination/events.d.ts.map +1 -0
- package/dist/coordination/events.js +8 -0
- package/dist/coordination/events.js.map +1 -0
- package/dist/coordination/index.d.ts +20 -0
- package/dist/coordination/index.d.ts.map +1 -0
- package/dist/coordination/index.js +46 -0
- package/dist/coordination/index.js.map +1 -0
- package/dist/coordination/locator.d.ts +106 -0
- package/dist/coordination/locator.d.ts.map +1 -0
- package/dist/coordination/locator.js +110 -0
- package/dist/coordination/locator.js.map +1 -0
- package/dist/coordination/schema.d.ts +1332 -0
- package/dist/coordination/schema.d.ts.map +1 -0
- package/dist/coordination/schema.js +1137 -0
- package/dist/coordination/schema.js.map +1 -0
- package/dist/coordination/targetConflict.d.ts +3 -0
- package/dist/coordination/targetConflict.d.ts.map +1 -0
- package/dist/coordination/targetConflict.js +74 -0
- package/dist/coordination/targetConflict.js.map +1 -0
- package/dist/coordination/trace.d.ts +79 -0
- package/dist/coordination/trace.d.ts.map +1 -0
- package/dist/coordination/trace.js +139 -0
- package/dist/coordination/trace.js.map +1 -0
- package/dist/docs/catalog.d.ts +73 -0
- package/dist/docs/catalog.d.ts.map +1 -0
- package/dist/docs/catalog.js +231 -0
- package/dist/docs/catalog.js.map +1 -0
- package/dist/docs/index.d.ts +11 -0
- package/dist/docs/index.d.ts.map +1 -0
- package/dist/docs/index.js +11 -0
- package/dist/docs/index.js.map +1 -0
- package/dist/durableWrites.d.ts +63 -0
- package/dist/durableWrites.d.ts.map +1 -0
- package/dist/durableWrites.js +72 -0
- package/dist/durableWrites.js.map +1 -0
- package/dist/environment.d.ts +106 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/environment.js +109 -0
- package/dist/environment.js.map +1 -0
- package/dist/errorCodes.d.ts +411 -0
- package/dist/errorCodes.d.ts.map +1 -0
- package/dist/errorCodes.js +500 -0
- package/dist/errorCodes.js.map +1 -0
- package/dist/errors.d.ts +429 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +687 -0
- package/dist/errors.js.map +1 -0
- package/dist/footprint.d.ts +112 -0
- package/dist/footprint.d.ts.map +1 -0
- package/dist/footprint.js +0 -0
- package/dist/footprint.js.map +1 -0
- package/dist/headlessClient.d.ts +10 -0
- package/dist/headlessClient.d.ts.map +1 -0
- package/dist/headlessClient.js +114 -0
- package/dist/headlessClient.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/keys/index.d.ts +88 -0
- package/dist/keys/index.d.ts.map +1 -0
- package/dist/keys/index.js +208 -0
- package/dist/keys/index.js.map +1 -0
- package/dist/log/syncDeltaRow.d.ts +159 -0
- package/dist/log/syncDeltaRow.d.ts.map +1 -0
- package/dist/log/syncDeltaRow.js +96 -0
- package/dist/log/syncDeltaRow.js.map +1 -0
- package/dist/logger.d.ts +17 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +8 -0
- package/dist/logger.js.map +1 -0
- package/dist/observability.d.ts +54 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +20 -0
- package/dist/observability.js.map +1 -0
- package/dist/policy/types.d.ts +218 -0
- package/dist/policy/types.d.ts.map +1 -0
- package/dist/policy/types.js +127 -0
- package/dist/policy/types.js.map +1 -0
- package/dist/resources/functionalUpdate.d.ts +80 -0
- package/dist/resources/functionalUpdate.d.ts.map +1 -0
- package/dist/resources/functionalUpdate.js +88 -0
- package/dist/resources/functionalUpdate.js.map +1 -0
- package/dist/resources/httpResources.d.ts +449 -0
- package/dist/resources/httpResources.d.ts.map +1 -0
- package/dist/resources/httpResources.js +8 -0
- package/dist/resources/httpResources.js.map +1 -0
- package/dist/resources/modelOperations.d.ts +380 -0
- package/dist/resources/modelOperations.d.ts.map +1 -0
- package/dist/resources/modelOperations.js +13 -0
- package/dist/resources/modelOperations.js.map +1 -0
- package/dist/resources/mutationOptions.d.ts +67 -0
- package/dist/resources/mutationOptions.d.ts.map +1 -0
- package/dist/resources/mutationOptions.js +10 -0
- package/dist/resources/mutationOptions.js.map +1 -0
- package/dist/resources/where.d.ts +102 -0
- package/dist/resources/where.d.ts.map +1 -0
- package/dist/resources/where.js +116 -0
- package/dist/resources/where.js.map +1 -0
- package/dist/resources/writeOptionsSchema.d.ts +48 -0
- package/dist/resources/writeOptionsSchema.d.ts.map +1 -0
- package/dist/resources/writeOptionsSchema.js +74 -0
- package/dist/resources/writeOptionsSchema.js.map +1 -0
- package/dist/schema/coordination.d.ts +113 -0
- package/dist/schema/coordination.d.ts.map +1 -0
- package/dist/schema/coordination.js +134 -0
- package/dist/schema/coordination.js.map +1 -0
- package/dist/schema/ddl.d.ts +98 -0
- package/dist/schema/ddl.d.ts.map +1 -0
- package/dist/schema/ddl.js +492 -0
- package/dist/schema/ddl.js.map +1 -0
- package/dist/schema/ddlLock.d.ts +36 -0
- package/dist/schema/ddlLock.d.ts.map +1 -0
- package/dist/schema/ddlLock.js +47 -0
- package/dist/schema/ddlLock.js.map +1 -0
- package/dist/schema/diff.d.ts +226 -0
- package/dist/schema/diff.d.ts.map +1 -0
- package/dist/schema/diff.js +290 -0
- package/dist/schema/diff.js.map +1 -0
- package/dist/schema/field.d.ts +121 -0
- package/dist/schema/field.d.ts.map +1 -0
- package/dist/schema/field.js +266 -0
- package/dist/schema/field.js.map +1 -0
- package/dist/schema/fieldRef.d.ts +58 -0
- package/dist/schema/fieldRef.d.ts.map +1 -0
- package/dist/schema/fieldRef.js +26 -0
- package/dist/schema/fieldRef.js.map +1 -0
- package/dist/schema/generate.d.ts +20 -0
- package/dist/schema/generate.d.ts.map +1 -0
- package/dist/schema/generate.js +87 -0
- package/dist/schema/generate.js.map +1 -0
- package/dist/schema/index.d.ts +43 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +81 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/loadStrategy.d.ts +46 -0
- package/dist/schema/loadStrategy.d.ts.map +1 -0
- package/dist/schema/loadStrategy.js +47 -0
- package/dist/schema/loadStrategy.js.map +1 -0
- package/dist/schema/model.d.ts +380 -0
- package/dist/schema/model.d.ts.map +1 -0
- package/dist/schema/model.js +124 -0
- package/dist/schema/model.js.map +1 -0
- package/dist/schema/openapi.d.ts +59 -0
- package/dist/schema/openapi.d.ts.map +1 -0
- package/dist/schema/openapi.js +508 -0
- package/dist/schema/openapi.js.map +1 -0
- package/dist/schema/queries.d.ts +202 -0
- package/dist/schema/queries.d.ts.map +1 -0
- package/dist/schema/queries.js +144 -0
- package/dist/schema/queries.js.map +1 -0
- package/dist/schema/relation.d.ts +205 -0
- package/dist/schema/relation.d.ts.map +1 -0
- package/dist/schema/relation.js +105 -0
- package/dist/schema/relation.js.map +1 -0
- package/dist/schema/residency.d.ts +30 -0
- package/dist/schema/residency.d.ts.map +1 -0
- package/dist/schema/residency.js +26 -0
- package/dist/schema/residency.js.map +1 -0
- package/dist/schema/roles.d.ts +250 -0
- package/dist/schema/roles.d.ts.map +1 -0
- package/dist/schema/roles.js +231 -0
- package/dist/schema/roles.js.map +1 -0
- package/dist/schema/schema.d.ts +352 -0
- package/dist/schema/schema.d.ts.map +1 -0
- package/dist/schema/schema.js +326 -0
- package/dist/schema/schema.js.map +1 -0
- package/dist/schema/select.d.ts +41 -0
- package/dist/schema/select.d.ts.map +1 -0
- package/dist/schema/select.js +91 -0
- package/dist/schema/select.js.map +1 -0
- package/dist/schema/serialize.d.ts +116 -0
- package/dist/schema/serialize.d.ts.map +1 -0
- package/dist/schema/serialize.js +278 -0
- package/dist/schema/serialize.js.map +1 -0
- package/dist/schema/sugar.d.ts +110 -0
- package/dist/schema/sugar.d.ts.map +1 -0
- package/dist/schema/sugar.js +84 -0
- package/dist/schema/sugar.js.map +1 -0
- package/dist/schema/tenancy.d.ts +140 -0
- package/dist/schema/tenancy.d.ts.map +1 -0
- package/dist/schema/tenancy.js +191 -0
- package/dist/schema/tenancy.js.map +1 -0
- package/dist/server/adapter.d.ts +174 -0
- package/dist/server/adapter.d.ts.map +1 -0
- package/dist/server/adapter.js +19 -0
- package/dist/server/adapter.js.map +1 -0
- package/dist/server/commit.d.ts +108 -0
- package/dist/server/commit.d.ts.map +1 -0
- package/dist/server/commit.js +2 -0
- package/dist/server/commit.js.map +1 -0
- package/dist/server/index.d.ts +15 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +3 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/readConfig.d.ts +81 -0
- package/dist/server/readConfig.d.ts.map +1 -0
- package/dist/server/readConfig.js +9 -0
- package/dist/server/readConfig.js.map +1 -0
- package/dist/server/storageMode.d.ts +24 -0
- package/dist/server/storageMode.d.ts.map +1 -0
- package/dist/server/storageMode.js +18 -0
- package/dist/server/storageMode.js.map +1 -0
- package/dist/source/adapter.d.ts +84 -0
- package/dist/source/adapter.d.ts.map +1 -0
- package/dist/source/adapter.js +25 -0
- package/dist/source/adapter.js.map +1 -0
- package/dist/source/adapters/drizzle.d.ts +49 -0
- package/dist/source/adapters/drizzle.d.ts.map +1 -0
- package/dist/source/adapters/drizzle.js +220 -0
- package/dist/source/adapters/drizzle.js.map +1 -0
- package/dist/source/adapters/kysely.d.ts +43 -0
- package/dist/source/adapters/kysely.d.ts.map +1 -0
- package/dist/source/adapters/kysely.js +206 -0
- package/dist/source/adapters/kysely.js.map +1 -0
- package/dist/source/adapters/kyselyMutationCore.d.ts +77 -0
- package/dist/source/adapters/kyselyMutationCore.d.ts.map +1 -0
- package/dist/source/adapters/kyselyMutationCore.js +126 -0
- package/dist/source/adapters/kyselyMutationCore.js.map +1 -0
- package/dist/source/adapters/memory.d.ts +14 -0
- package/dist/source/adapters/memory.d.ts.map +1 -0
- package/dist/source/adapters/memory.js +131 -0
- package/dist/source/adapters/memory.js.map +1 -0
- package/dist/source/adapters/prisma.d.ts +64 -0
- package/dist/source/adapters/prisma.d.ts.map +1 -0
- package/dist/source/adapters/prisma.js +203 -0
- package/dist/source/adapters/prisma.js.map +1 -0
- package/dist/source/conformance.d.ts +38 -0
- package/dist/source/conformance.d.ts.map +1 -0
- package/dist/source/conformance.js +216 -0
- package/dist/source/conformance.js.map +1 -0
- package/dist/source/connector.d.ts +96 -0
- package/dist/source/connector.d.ts.map +1 -0
- package/dist/source/connector.js +267 -0
- package/dist/source/connector.js.map +1 -0
- package/dist/source/connectorProtocol.d.ts +155 -0
- package/dist/source/connectorProtocol.d.ts.map +1 -0
- package/dist/source/connectorProtocol.js +164 -0
- package/dist/source/connectorProtocol.js.map +1 -0
- package/dist/source/contract.d.ts +196 -0
- package/dist/source/contract.d.ts.map +1 -0
- package/dist/source/contract.js +165 -0
- package/dist/source/contract.js.map +1 -0
- package/dist/source/drizzle.d.ts +2 -0
- package/dist/source/drizzle.d.ts.map +1 -0
- package/dist/source/drizzle.js +2 -0
- package/dist/source/drizzle.js.map +1 -0
- package/dist/source/factory.d.ts +93 -0
- package/dist/source/factory.d.ts.map +1 -0
- package/dist/source/factory.js +287 -0
- package/dist/source/factory.js.map +1 -0
- package/dist/source/idempotency.d.ts +62 -0
- package/dist/source/idempotency.d.ts.map +1 -0
- package/dist/source/idempotency.js +145 -0
- package/dist/source/idempotency.js.map +1 -0
- package/dist/source/index.d.ts +24 -0
- package/dist/source/index.d.ts.map +1 -0
- package/dist/source/index.js +29 -0
- package/dist/source/index.js.map +1 -0
- package/dist/source/kysely.d.ts +3 -0
- package/dist/source/kysely.d.ts.map +1 -0
- package/dist/source/kysely.js +3 -0
- package/dist/source/kysely.js.map +1 -0
- package/dist/source/migrations.d.ts +22 -0
- package/dist/source/migrations.d.ts.map +1 -0
- package/dist/source/migrations.js +104 -0
- package/dist/source/migrations.js.map +1 -0
- package/dist/source/next.d.ts +33 -0
- package/dist/source/next.d.ts.map +1 -0
- package/dist/source/next.js +26 -0
- package/dist/source/next.js.map +1 -0
- package/dist/source/pushQueue.d.ts +135 -0
- package/dist/source/pushQueue.d.ts.map +1 -0
- package/dist/source/pushQueue.js +257 -0
- package/dist/source/pushQueue.js.map +1 -0
- package/dist/source/signing.d.ts +93 -0
- package/dist/source/signing.d.ts.map +1 -0
- package/dist/source/signing.js +163 -0
- package/dist/source/signing.js.map +1 -0
- package/dist/source/types.d.ts +402 -0
- package/dist/source/types.d.ts.map +1 -0
- package/dist/source/types.js +60 -0
- package/dist/source/types.js.map +1 -0
- package/dist/syncLog/contract.d.ts +21 -0
- package/dist/syncLog/contract.d.ts.map +1 -0
- package/dist/syncLog/contract.js +20 -0
- package/dist/syncLog/contract.js.map +1 -0
- package/dist/syncLog/index.d.ts +2 -0
- package/dist/syncLog/index.d.ts.map +1 -0
- package/dist/syncLog/index.js +2 -0
- package/dist/syncLog/index.js.map +1 -0
- package/dist/testing/fixtures/httpResponses.d.ts +74 -0
- package/dist/testing/fixtures/httpResponses.d.ts.map +1 -0
- package/dist/testing/fixtures/httpResponses.js +102 -0
- package/dist/testing/fixtures/httpResponses.js.map +1 -0
- package/dist/transactionLayer.d.ts +110 -0
- package/dist/transactionLayer.d.ts.map +1 -0
- package/dist/transactionLayer.js +25 -0
- package/dist/transactionLayer.js.map +1 -0
- package/dist/transactions/settlement/commitEnvelope.d.ts +144 -0
- package/dist/transactions/settlement/commitEnvelope.d.ts.map +1 -0
- package/dist/transactions/settlement/commitEnvelope.js +162 -0
- package/dist/transactions/settlement/commitEnvelope.js.map +1 -0
- package/dist/transactions/settlement/httpCommitEnvelope.d.ts +54 -0
- package/dist/transactions/settlement/httpCommitEnvelope.d.ts.map +1 -0
- package/dist/transactions/settlement/httpCommitEnvelope.js +208 -0
- package/dist/transactions/settlement/httpCommitEnvelope.js.map +1 -0
- package/dist/transactions/settlement/idempotencyKey.d.ts +11 -0
- package/dist/transactions/settlement/idempotencyKey.d.ts.map +1 -0
- package/dist/transactions/settlement/idempotencyKey.js +10 -0
- package/dist/transactions/settlement/idempotencyKey.js.map +1 -0
- package/dist/transactions/settlement/pendingWrite.d.ts +113 -0
- package/dist/transactions/settlement/pendingWrite.d.ts.map +1 -0
- package/dist/transactions/settlement/pendingWrite.js +21 -0
- package/dist/transactions/settlement/pendingWrite.js.map +1 -0
- package/dist/transport/commitFrames.d.ts +91 -0
- package/dist/transport/commitFrames.d.ts.map +1 -0
- package/dist/transport/commitFrames.js +135 -0
- package/dist/transport/commitFrames.js.map +1 -0
- package/dist/transport/connectionManager.d.ts +216 -0
- package/dist/transport/connectionManager.d.ts.map +1 -0
- package/dist/transport/connectionManager.js +674 -0
- package/dist/transport/connectionManager.js.map +1 -0
- package/dist/transport/credentialLifecycle.d.ts +178 -0
- package/dist/transport/credentialLifecycle.d.ts.map +1 -0
- package/dist/transport/credentialLifecycle.js +324 -0
- package/dist/transport/credentialLifecycle.js.map +1 -0
- package/dist/transport/heartbeat.d.ts +66 -0
- package/dist/transport/heartbeat.d.ts.map +1 -0
- package/dist/transport/heartbeat.js +94 -0
- package/dist/transport/heartbeat.js.map +1 -0
- package/dist/transport/httpClient.d.ts +143 -0
- package/dist/transport/httpClient.d.ts.map +1 -0
- package/dist/transport/httpClient.js +150 -0
- package/dist/transport/httpClient.js.map +1 -0
- package/dist/transport/httpFeed.d.ts +4 -0
- package/dist/transport/httpFeed.d.ts.map +1 -0
- package/dist/transport/httpFeed.js +94 -0
- package/dist/transport/httpFeed.js.map +1 -0
- package/dist/transport/httpOptions.d.ts +34 -0
- package/dist/transport/httpOptions.d.ts.map +1 -0
- package/dist/transport/httpOptions.js +13 -0
- package/dist/transport/httpOptions.js.map +1 -0
- package/dist/transport/httpTransport.d.ts +68 -0
- package/dist/transport/httpTransport.d.ts.map +1 -0
- package/dist/transport/httpTransport.js +1433 -0
- package/dist/transport/httpTransport.js.map +1 -0
- package/dist/transport/networkProbe.d.ts +85 -0
- package/dist/transport/networkProbe.d.ts.map +1 -0
- package/dist/transport/networkProbe.js +208 -0
- package/dist/transport/networkProbe.js.map +1 -0
- package/dist/transport/wsFrameHandlers.d.ts +129 -0
- package/dist/transport/wsFrameHandlers.d.ts.map +1 -0
- package/dist/transport/wsFrameHandlers.js +429 -0
- package/dist/transport/wsFrameHandlers.js.map +1 -0
- package/dist/transport/wsTransport.d.ts +575 -0
- package/dist/transport/wsTransport.d.ts.map +1 -0
- package/dist/transport/wsTransport.js +1024 -0
- package/dist/transport/wsTransport.js.map +1 -0
- package/dist/types/assertExact.d.ts +18 -0
- package/dist/types/assertExact.d.ts.map +1 -0
- package/dist/types/assertExact.js +2 -0
- package/dist/types/assertExact.js.map +1 -0
- package/dist/types/global.d.ts +108 -0
- package/dist/types/global.d.ts.map +1 -0
- package/dist/types/global.js +41 -0
- package/dist/types/global.js.map +1 -0
- package/dist/types/index.d.ts +206 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +57 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/modelData.d.ts +11 -0
- package/dist/types/modelData.d.ts.map +1 -0
- package/dist/types/modelData.js +10 -0
- package/dist/types/modelData.js.map +1 -0
- package/dist/types/participant.d.ts +21 -0
- package/dist/types/participant.d.ts.map +1 -0
- package/dist/types/participant.js +11 -0
- package/dist/types/participant.js.map +1 -0
- package/dist/types/streams.d.ts +545 -0
- package/dist/types/streams.d.ts.map +1 -0
- package/dist/types/streams.js +12 -0
- package/dist/types/streams.js.map +1 -0
- package/dist/utils/asyncIterator.d.ts +35 -0
- package/dist/utils/asyncIterator.d.ts.map +1 -0
- package/dist/utils/asyncIterator.js +136 -0
- package/dist/utils/asyncIterator.js.map +1 -0
- package/dist/utils/duration.d.ts +51 -0
- package/dist/utils/duration.d.ts.map +1 -0
- package/dist/utils/duration.js +78 -0
- package/dist/utils/duration.js.map +1 -0
- package/dist/utils/json.d.ts +58 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +277 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/webhooks/events.d.ts +44 -0
- package/dist/webhooks/events.d.ts.map +1 -0
- package/dist/webhooks/events.js +43 -0
- package/dist/webhooks/events.js.map +1 -0
- package/dist/webhooks/index.d.ts +9 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +9 -0
- package/dist/webhooks/index.js.map +1 -0
- package/dist/wire/accountResponses.d.ts +463 -0
- package/dist/wire/accountResponses.d.ts.map +1 -0
- package/dist/wire/accountResponses.js +294 -0
- package/dist/wire/accountResponses.js.map +1 -0
- package/dist/wire/auth.d.ts +57 -0
- package/dist/wire/auth.d.ts.map +1 -0
- package/dist/wire/auth.js +71 -0
- package/dist/wire/auth.js.map +1 -0
- package/dist/wire/bootstrapReason.d.ts +10 -0
- package/dist/wire/bootstrapReason.d.ts.map +1 -0
- package/dist/wire/bootstrapReason.js +9 -0
- package/dist/wire/bootstrapReason.js.map +1 -0
- package/dist/wire/claimEvent.d.ts +70 -0
- package/dist/wire/claimEvent.d.ts.map +1 -0
- package/dist/wire/claimEvent.js +74 -0
- package/dist/wire/claimEvent.js.map +1 -0
- package/dist/wire/claims.d.ts +475 -0
- package/dist/wire/claims.d.ts.map +1 -0
- package/dist/wire/claims.js +326 -0
- package/dist/wire/claims.js.map +1 -0
- package/dist/wire/commit.d.ts +604 -0
- package/dist/wire/commit.d.ts.map +1 -0
- package/dist/wire/commit.js +322 -0
- package/dist/wire/commit.js.map +1 -0
- package/dist/wire/delta.d.ts +251 -0
- package/dist/wire/delta.d.ts.map +1 -0
- package/dist/wire/delta.js +148 -0
- package/dist/wire/delta.js.map +1 -0
- package/dist/wire/errorEnvelope.d.ts +73 -0
- package/dist/wire/errorEnvelope.d.ts.map +1 -0
- package/dist/wire/errorEnvelope.js +124 -0
- package/dist/wire/errorEnvelope.js.map +1 -0
- package/dist/wire/feedCursor.d.ts +61 -0
- package/dist/wire/feedCursor.d.ts.map +1 -0
- package/dist/wire/feedCursor.js +83 -0
- package/dist/wire/feedCursor.js.map +1 -0
- package/dist/wire/feedEvent.d.ts +264 -0
- package/dist/wire/feedEvent.d.ts.map +1 -0
- package/dist/wire/feedEvent.js +66 -0
- package/dist/wire/feedEvent.js.map +1 -0
- package/dist/wire/frames.d.ts +195 -0
- package/dist/wire/frames.d.ts.map +1 -0
- package/dist/wire/frames.js +51 -0
- package/dist/wire/frames.js.map +1 -0
- package/dist/wire/inboundFrames.d.ts +490 -0
- package/dist/wire/inboundFrames.d.ts.map +1 -0
- package/dist/wire/inboundFrames.js +117 -0
- package/dist/wire/inboundFrames.js.map +1 -0
- package/dist/wire/index.d.ts +55 -0
- package/dist/wire/index.d.ts.map +1 -0
- package/dist/wire/index.js +84 -0
- package/dist/wire/index.js.map +1 -0
- package/dist/wire/listEnvelope.d.ts +38 -0
- package/dist/wire/listEnvelope.d.ts.map +1 -0
- package/dist/wire/listEnvelope.js +43 -0
- package/dist/wire/listEnvelope.js.map +1 -0
- package/dist/wire/modelMutations.d.ts +32 -0
- package/dist/wire/modelMutations.d.ts.map +1 -0
- package/dist/wire/modelMutations.js +53 -0
- package/dist/wire/modelMutations.js.map +1 -0
- package/dist/wire/modelResponses.d.ts +79 -0
- package/dist/wire/modelResponses.d.ts.map +1 -0
- package/dist/wire/modelResponses.js +44 -0
- package/dist/wire/modelResponses.js.map +1 -0
- package/dist/wire/modelShape.d.ts +79 -0
- package/dist/wire/modelShape.d.ts.map +1 -0
- package/dist/wire/modelShape.js +75 -0
- package/dist/wire/modelShape.js.map +1 -0
- package/dist/wire/protocol.d.ts +39 -0
- package/dist/wire/protocol.d.ts.map +1 -0
- package/dist/wire/protocol.js +39 -0
- package/dist/wire/protocol.js.map +1 -0
- package/dist/wire/protocolVersion.d.ts +74 -0
- package/dist/wire/protocolVersion.d.ts.map +1 -0
- package/dist/wire/protocolVersion.js +84 -0
- package/dist/wire/protocolVersion.js.map +1 -0
- package/package.json +187 -0
- package/src/ablo.ts +139 -0
- package/src/ai-sdk/coordinatedTool.ts +214 -0
- package/src/ai-sdk/index.ts +7 -0
- package/src/auth/apiKey.ts +540 -0
- package/src/auth/bootstrapScope.ts +15 -0
- package/src/auth/browserCredentialSafety.ts +48 -0
- package/src/auth/capability.ts +326 -0
- package/src/auth/capabilityLifecycle.ts +174 -0
- package/src/auth/credentialEndpoint.ts +79 -0
- package/src/auth/credentialEndpointProtocol.ts +51 -0
- package/src/auth/credentialKind.ts +20 -0
- package/src/auth/credentialPolicy.ts +244 -0
- package/src/auth/credentialResult.ts +23 -0
- package/src/auth/credentialSource.ts +99 -0
- package/src/auth/hostedEndpoints.ts +24 -0
- package/src/auth/identity.ts +330 -0
- package/src/auth/index.ts +592 -0
- package/src/auth/schemas.ts +94 -0
- package/src/auth/sessionMint.ts +126 -0
- package/src/auth/token.ts +4 -0
- package/src/batching/index.ts +200 -0
- package/src/coordination/awaitClaimGrant.ts +243 -0
- package/src/coordination/claimHeartbeatLoop.ts +165 -0
- package/src/coordination/claimMeta.ts +56 -0
- package/src/coordination/events.ts +86 -0
- package/src/coordination/index.ts +181 -0
- package/src/coordination/locator.ts +200 -0
- package/src/coordination/schema.ts +1346 -0
- package/src/coordination/targetConflict.ts +85 -0
- package/src/coordination/trace.ts +173 -0
- package/src/docs/catalog.ts +274 -0
- package/src/docs/index.ts +18 -0
- package/src/durableWrites.ts +134 -0
- package/src/environment.ts +132 -0
- package/src/errorCodes.ts +1591 -0
- package/src/errors.ts +918 -0
- package/src/footprint.ts +0 -0
- package/src/headlessClient.ts +161 -0
- package/src/index.ts +52 -0
- package/src/keys/index.ts +254 -0
- package/src/log/syncDeltaRow.ts +119 -0
- package/src/logger.ts +22 -0
- package/src/observability.ts +85 -0
- package/src/policy/types.ts +292 -0
- package/src/resources/functionalUpdate.ts +151 -0
- package/src/resources/httpResources.ts +520 -0
- package/src/resources/modelOperations.ts +444 -0
- package/src/resources/mutationOptions.ts +66 -0
- package/src/resources/where.ts +160 -0
- package/src/resources/writeOptionsSchema.ts +91 -0
- package/src/schema/coordination.ts +161 -0
- package/src/schema/ddl.ts +593 -0
- package/src/schema/ddlLock.ts +53 -0
- package/src/schema/diff.ts +489 -0
- package/src/schema/field.ts +321 -0
- package/src/schema/fieldRef.ts +88 -0
- package/src/schema/generate.ts +95 -0
- package/src/schema/index.ts +278 -0
- package/src/schema/loadStrategy.ts +52 -0
- package/src/schema/model.ts +476 -0
- package/src/schema/openapi.ts +658 -0
- package/src/schema/queries.ts +273 -0
- package/src/schema/relation.ts +291 -0
- package/src/schema/residency.ts +30 -0
- package/src/schema/roles.ts +325 -0
- package/src/schema/schema.ts +825 -0
- package/src/schema/select.ts +115 -0
- package/src/schema/serialize.ts +373 -0
- package/src/schema/sugar.ts +194 -0
- package/src/schema/tenancy.ts +221 -0
- package/src/server/adapter.ts +203 -0
- package/src/server/commit.ts +109 -0
- package/src/server/index.ts +26 -0
- package/src/server/readConfig.ts +82 -0
- package/src/server/storageMode.ts +20 -0
- package/src/source/adapter.ts +85 -0
- package/src/source/adapters/drizzle.ts +291 -0
- package/src/source/adapters/kysely.ts +346 -0
- package/src/source/adapters/kyselyMutationCore.ts +220 -0
- package/src/source/adapters/memory.ts +154 -0
- package/src/source/adapters/prisma.ts +282 -0
- package/src/source/conformance.ts +287 -0
- package/src/source/connector.ts +394 -0
- package/src/source/connectorProtocol.ts +189 -0
- package/src/source/contract.ts +221 -0
- package/src/source/drizzle.ts +1 -0
- package/src/source/factory.ts +444 -0
- package/src/source/idempotency.ts +189 -0
- package/src/source/index.ts +182 -0
- package/src/source/kysely.ts +2 -0
- package/src/source/migrations.ts +109 -0
- package/src/source/next.ts +38 -0
- package/src/source/pushQueue.ts +368 -0
- package/src/source/signing.ts +279 -0
- package/src/source/types.ts +502 -0
- package/src/syncLog/contract.ts +32 -0
- package/src/syncLog/index.ts +1 -0
- package/src/testing/fixtures/httpResponses.ts +155 -0
- package/src/transactionLayer.ts +122 -0
- package/src/transactions/settlement/commitEnvelope.ts +192 -0
- package/src/transactions/settlement/httpCommitEnvelope.ts +250 -0
- package/src/transactions/settlement/idempotencyKey.ts +11 -0
- package/src/transactions/settlement/pendingWrite.ts +24 -0
- package/src/transport/commitFrames.ts +225 -0
- package/src/transport/connectionManager.ts +856 -0
- package/src/transport/credentialLifecycle.ts +389 -0
- package/src/transport/heartbeat.ts +118 -0
- package/src/transport/httpClient.ts +354 -0
- package/src/transport/httpFeed.ts +111 -0
- package/src/transport/httpOptions.ts +41 -0
- package/src/transport/httpTransport.ts +1976 -0
- package/src/transport/networkProbe.ts +249 -0
- package/src/transport/wsFrameHandlers.ts +619 -0
- package/src/transport/wsTransport.ts +1491 -0
- package/src/types/assertExact.ts +17 -0
- package/src/types/global.ts +123 -0
- package/src/types/index.ts +270 -0
- package/src/types/modelData.ts +11 -0
- package/src/types/participant.ts +22 -0
- package/src/types/streams.ts +702 -0
- package/src/utils/asyncIterator.ts +141 -0
- package/src/utils/duration.ts +88 -0
- package/src/utils/json.ts +281 -0
- package/src/webhooks/events.ts +96 -0
- package/src/webhooks/index.ts +12 -0
- package/src/wire/accountResponses.ts +328 -0
- package/src/wire/auth.ts +86 -0
- package/src/wire/bootstrapReason.ts +10 -0
- package/src/wire/claimEvent.ts +85 -0
- package/src/wire/claims.ts +370 -0
- package/src/wire/commit.ts +379 -0
- package/src/wire/delta.ts +173 -0
- package/src/wire/errorEnvelope.ts +133 -0
- package/src/wire/feedCursor.ts +91 -0
- package/src/wire/feedEvent.ts +74 -0
- package/src/wire/frames.ts +77 -0
- package/src/wire/inboundFrames.ts +182 -0
- package/src/wire/index.ts +328 -0
- package/src/wire/listEnvelope.ts +51 -0
- package/src/wire/modelMutations.ts +55 -0
- package/src/wire/modelResponses.ts +48 -0
- package/src/wire/modelShape.ts +83 -0
- package/src/wire/protocol.ts +39 -0
- package/src/wire/protocolVersion.ts +97 -0
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema ⇄ JSON.
|
|
3
|
+
*
|
|
4
|
+
* A `Schema` is fully serializable apart from its client-only closures — the
|
|
5
|
+
* Zod validators and computed getters. {@link serializeSchema} emits the
|
|
6
|
+
* plain-data JSON form and {@link parseSchema} reconstructs a working `Schema`
|
|
7
|
+
* from it: one `Schema` type with two representations.
|
|
8
|
+
*
|
|
9
|
+
* A hosted, multi-tenant server loads a tenant's schema with `parseSchema(json)`
|
|
10
|
+
* rather than importing it in process. The JSON is what `ablo push` sends and
|
|
11
|
+
* what the server stores per tenant and version.
|
|
12
|
+
*
|
|
13
|
+
* What round-trips:
|
|
14
|
+
* - all model routing and scoping metadata: typename, tableName, load,
|
|
15
|
+
* mutable, the `tenancy` descriptor, bootstrap hints, scope, grants,
|
|
16
|
+
* entityRoles, the `conflict` disposition map, persist, autoFill,
|
|
17
|
+
* requiredFields, and lazyObservable. The authoring shorthands (`policy`
|
|
18
|
+
* and `groups`) are normalized into these canonical fields when the model
|
|
19
|
+
* is built, so only the canonical fields cross here.
|
|
20
|
+
* - relations, including the resolved `foreignKeyColumn`
|
|
21
|
+
* - field metadata (names and type tags), from which validators are rebuilt
|
|
22
|
+
* - identity roles
|
|
23
|
+
*
|
|
24
|
+
* What does not round-trip, because the server never needs it:
|
|
25
|
+
* - computed getters, which are closures and are dropped
|
|
26
|
+
* - exact Zod refinements, which are rebuilt as permissive validators from
|
|
27
|
+
* {@link FieldMeta}; the server does no field-shape validation
|
|
28
|
+
*/
|
|
29
|
+
import { z } from 'zod';
|
|
30
|
+
import { AbloValidationError } from '../errors.js';
|
|
31
|
+
import { buildFieldRefs } from './schema.js';
|
|
32
|
+
import { relation, } from './relation.js';
|
|
33
|
+
import { baseFieldsSchema, } from './schema.js';
|
|
34
|
+
/** Current schema-JSON envelope version. Bump this on a breaking change to the
|
|
35
|
+
* JSON shape itself — not to a user's schema. */
|
|
36
|
+
const SCHEMA_JSON_VERSION = 3;
|
|
37
|
+
// ── Serialize ────────────────────────────────────────────────────────────────
|
|
38
|
+
function relationToJSON(rel) {
|
|
39
|
+
const options = rel.options;
|
|
40
|
+
return {
|
|
41
|
+
type: rel.type,
|
|
42
|
+
target: rel.target,
|
|
43
|
+
foreignKey: rel.foreignKey,
|
|
44
|
+
foreignKeyColumn: rel.foreignKeyColumn,
|
|
45
|
+
options: options && Object.keys(options).length > 0 ? { ...options } : undefined,
|
|
46
|
+
orderBy: rel._orderBy,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function modelToJSON(def) {
|
|
50
|
+
const relations = {};
|
|
51
|
+
for (const [name, rel] of Object.entries(def.relations)) {
|
|
52
|
+
relations[name] = relationToJSON(rel);
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
fields: def.fields,
|
|
56
|
+
relations,
|
|
57
|
+
load: def.load,
|
|
58
|
+
// `defineSchema` always resolves `typename` to the schema key when unset,
|
|
59
|
+
// so it is present on a built ModelDef; fall back defensively anyway.
|
|
60
|
+
typename: def.typename ?? '',
|
|
61
|
+
tableName: def.tableName,
|
|
62
|
+
tenancy: def.tenancy,
|
|
63
|
+
plane: def.plane,
|
|
64
|
+
scope: def.scope,
|
|
65
|
+
grants: def.grants,
|
|
66
|
+
entityRoles: def.entityRoles,
|
|
67
|
+
conflict: def.conflict,
|
|
68
|
+
bootstrapLimit: def.bootstrapLimit,
|
|
69
|
+
bootstrapOrderBy: def.bootstrapOrderBy,
|
|
70
|
+
mutable: def.mutable,
|
|
71
|
+
lazyObservable: def.lazyObservable,
|
|
72
|
+
persist: def.persist,
|
|
73
|
+
autoFill: def.autoFill,
|
|
74
|
+
requiredFields: def.requiredFields,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Project a `Schema` to its JSON form. Drops the client-only closures
|
|
79
|
+
* (validators, `computed`); keeps everything the server and a faithful
|
|
80
|
+
* rebuild need. The result is plain data — `JSON.stringify`-safe.
|
|
81
|
+
*/
|
|
82
|
+
export function toSchemaJSON(schema) {
|
|
83
|
+
const models = {};
|
|
84
|
+
for (const [key, def] of Object.entries(schema.models)) {
|
|
85
|
+
if (def.typename === '' || def.typename === undefined) {
|
|
86
|
+
// typename '' only happens for a malformed def; surface it loudly
|
|
87
|
+
// rather than ship a model the server can't route.
|
|
88
|
+
models[key] = { ...modelToJSON(def), typename: key };
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
models[key] = modelToJSON(def);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
v: SCHEMA_JSON_VERSION,
|
|
96
|
+
models,
|
|
97
|
+
identityRoles: schema.identityRoles,
|
|
98
|
+
...(Object.keys(schema.sessionSettings).length > 0
|
|
99
|
+
? { sessionSettings: schema.sessionSettings }
|
|
100
|
+
: {}),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/** Serialize a `Schema` to a JSON string (the `ablo push` payload). */
|
|
104
|
+
export function serializeSchema(schema) {
|
|
105
|
+
return JSON.stringify(toSchemaJSON(schema));
|
|
106
|
+
}
|
|
107
|
+
// ── Parse ──────────────────────────────────────────────────────────────────
|
|
108
|
+
/** Rebuild a Zod validator for a field from its metadata. Permissive by
|
|
109
|
+
* design — the server does no field-shape validation; this exists so a
|
|
110
|
+
* parsed `Schema` is structurally a real `Schema`. */
|
|
111
|
+
function zodForField(meta) {
|
|
112
|
+
let base;
|
|
113
|
+
switch (meta.type) {
|
|
114
|
+
case 'string':
|
|
115
|
+
base = z.string();
|
|
116
|
+
break;
|
|
117
|
+
case 'number':
|
|
118
|
+
base = z.number();
|
|
119
|
+
break;
|
|
120
|
+
case 'boolean':
|
|
121
|
+
base = z.boolean();
|
|
122
|
+
break;
|
|
123
|
+
case 'date':
|
|
124
|
+
base = z.date();
|
|
125
|
+
break;
|
|
126
|
+
case 'enum':
|
|
127
|
+
base =
|
|
128
|
+
meta.enumValues && meta.enumValues.length > 0
|
|
129
|
+
? z.enum(meta.enumValues)
|
|
130
|
+
: z.string();
|
|
131
|
+
break;
|
|
132
|
+
case 'json':
|
|
133
|
+
default:
|
|
134
|
+
base = z.unknown();
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
return meta.isOptional ? base.optional() : base;
|
|
138
|
+
}
|
|
139
|
+
function relationFromJSON(rel) {
|
|
140
|
+
const setColumn = (definition) => {
|
|
141
|
+
// The builder normally derives this from schema casing. Serialized schemas
|
|
142
|
+
// already carry the resolved database column, so restore that runtime field.
|
|
143
|
+
Reflect.set(definition, 'foreignKeyColumn', rel.foreignKeyColumn);
|
|
144
|
+
return definition;
|
|
145
|
+
};
|
|
146
|
+
switch (rel.type) {
|
|
147
|
+
case 'belongsTo': {
|
|
148
|
+
const options = rel.options;
|
|
149
|
+
return setColumn(relation.belongsTo(rel.target, rel.foreignKey, {
|
|
150
|
+
...(options?.index === undefined ? {} : { index: options.index }),
|
|
151
|
+
...(options?.enrich === undefined ? {} : { enrich: options.enrich }),
|
|
152
|
+
...(options?.defer === undefined ? {} : { defer: options.defer }),
|
|
153
|
+
...(options?.parent === undefined ? {} : { parent: options.parent }),
|
|
154
|
+
...(options?.fk === undefined ? {} : { fk: options.fk }),
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
case 'hasMany':
|
|
158
|
+
return setColumn(relation.hasMany(rel.target, rel.foreignKey, rel.orderBy === undefined ? undefined : { orderBy: rel.orderBy }));
|
|
159
|
+
case 'hasOne':
|
|
160
|
+
return setColumn(relation.hasOne(rel.target, rel.foreignKey));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function modelFromJSON(json) {
|
|
164
|
+
// `z.ZodRawShape` is a readonly index signature in Zod v4, so build a
|
|
165
|
+
// mutable record and cast once when handing it to `z.object`/`ModelDef`.
|
|
166
|
+
const shapeMut = {};
|
|
167
|
+
for (const [name, meta] of Object.entries(json.fields)) {
|
|
168
|
+
shapeMut[name] = zodForField(meta);
|
|
169
|
+
}
|
|
170
|
+
const shape = shapeMut;
|
|
171
|
+
const relations = {};
|
|
172
|
+
for (const [name, rel] of Object.entries(json.relations)) {
|
|
173
|
+
relations[name] = relationFromJSON(rel);
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
schema: z.object(shape),
|
|
177
|
+
shape,
|
|
178
|
+
fields: json.fields,
|
|
179
|
+
relations,
|
|
180
|
+
load: json.load,
|
|
181
|
+
bootstrapLimit: json.bootstrapLimit,
|
|
182
|
+
bootstrapOrderBy: json.bootstrapOrderBy,
|
|
183
|
+
typename: json.typename,
|
|
184
|
+
persist: json.persist,
|
|
185
|
+
tableName: json.tableName,
|
|
186
|
+
tenancy: json.tenancy,
|
|
187
|
+
// Absent in older artifacts → default `tenant`, matching the model builder
|
|
188
|
+
// and provisioning defaults so the round-trip stays stable.
|
|
189
|
+
plane: json.plane ?? 'tenant',
|
|
190
|
+
scope: json.scope,
|
|
191
|
+
grants: json.grants,
|
|
192
|
+
entityRoles: json.entityRoles,
|
|
193
|
+
// Absent in older artifacts → undefined, so the commit path falls through to
|
|
194
|
+
// the function registry or the engine default.
|
|
195
|
+
conflict: json.conflict,
|
|
196
|
+
mutable: json.mutable,
|
|
197
|
+
lazyObservable: json.lazyObservable,
|
|
198
|
+
// computed getters are closures and intentionally not serialized; a
|
|
199
|
+
// parsed schema (server-side) has none.
|
|
200
|
+
computed: undefined,
|
|
201
|
+
autoFill: json.autoFill,
|
|
202
|
+
requiredFields: json.requiredFields,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Reconstruct a working `Schema` from its JSON form. Validators are rebuilt
|
|
207
|
+
* permissively from field metadata (the server never validates field shapes);
|
|
208
|
+
* `computed` getters are absent. Everything the server reads — routing,
|
|
209
|
+
* scoping, relations, identity roles — is restored exactly.
|
|
210
|
+
*/
|
|
211
|
+
export function fromSchemaJSON(json) {
|
|
212
|
+
const models = {};
|
|
213
|
+
const validators = {};
|
|
214
|
+
for (const [key, modelJson] of Object.entries(json.models)) {
|
|
215
|
+
const def = modelFromJSON(modelJson);
|
|
216
|
+
models[key] = def;
|
|
217
|
+
validators[key] = baseFieldsSchema.merge(def.schema);
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
models: models,
|
|
221
|
+
// A schema rebuilt from JSON carries references too — the shapes are here.
|
|
222
|
+
fields: buildFieldRefs(models),
|
|
223
|
+
validators: validators,
|
|
224
|
+
identityRoles: json.identityRoles,
|
|
225
|
+
sessionSettings: json.sessionSettings ?? {},
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/** Parse a `Schema` from a JSON string (inverse of {@link serializeSchema}). */
|
|
229
|
+
export function parseSchema(json) {
|
|
230
|
+
const parsed = JSON.parse(json);
|
|
231
|
+
if (parsed.v !== SCHEMA_JSON_VERSION) {
|
|
232
|
+
throw new AbloValidationError(`parseSchema: unsupported schema-JSON version ${parsed.v} (expected ${SCHEMA_JSON_VERSION})`, { code: 'schema_definition_invalid' });
|
|
233
|
+
}
|
|
234
|
+
return fromSchemaJSON(parsed);
|
|
235
|
+
}
|
|
236
|
+
// ── Hash ─────────────────────────────────────────────────────────────────────
|
|
237
|
+
/**
|
|
238
|
+
* Stable content hash of a `Schema`'s JSON form. FNV-1a over a canonical
|
|
239
|
+
* (sorted-key) encoding — deterministic across runs and order-invariant, no
|
|
240
|
+
* `crypto` dependency. Used for connect-time version gating: the client sends
|
|
241
|
+
* the hash it was built against, the server compares it to the tenant's
|
|
242
|
+
* active schema hash. Not a security primitive.
|
|
243
|
+
*/
|
|
244
|
+
export function schemaHash(schema) {
|
|
245
|
+
return fnv1a(canonicalJson(toSchemaJSON(schema)));
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Content hash of ONE serialized model — the unit of the semantic drift check.
|
|
249
|
+
* Two schemas agree on a model exactly when these match, which is what lets a
|
|
250
|
+
* client compare only the models it declares instead of welding itself to the
|
|
251
|
+
* whole-schema hash (where any additive push reads as drift). Computed over the
|
|
252
|
+
* model's `SchemaJSON` entry with the same canonicalization and hash as
|
|
253
|
+
* {@link schemaHash}, on both the client and the server's `GET /api/schema`.
|
|
254
|
+
*/
|
|
255
|
+
export function modelHash(modelJson) {
|
|
256
|
+
return fnv1a(canonicalJson(modelJson));
|
|
257
|
+
}
|
|
258
|
+
/** FNV-1a over an already-canonical string — shared by both hashes above. */
|
|
259
|
+
function fnv1a(canonical) {
|
|
260
|
+
let h = 0x811c9dc5;
|
|
261
|
+
for (let i = 0; i < canonical.length; i++) {
|
|
262
|
+
h ^= canonical.charCodeAt(i);
|
|
263
|
+
h = Math.imul(h, 0x01000193);
|
|
264
|
+
}
|
|
265
|
+
return (h >>> 0).toString(16).padStart(8, '0');
|
|
266
|
+
}
|
|
267
|
+
/** Stable JSON: object keys sorted recursively, `undefined` dropped. */
|
|
268
|
+
function canonicalJson(value) {
|
|
269
|
+
if (value === null || typeof value !== 'object')
|
|
270
|
+
return JSON.stringify(value) ?? 'null';
|
|
271
|
+
if (Array.isArray(value))
|
|
272
|
+
return `[${value.map(canonicalJson).join(',')}]`;
|
|
273
|
+
const entries = Object.entries(value)
|
|
274
|
+
.filter(([, v]) => v !== undefined)
|
|
275
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
276
|
+
return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${canonicalJson(v)}`).join(',')}}`;
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=serialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../src/schema/serialize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A concise, claim-first way to declare a model. Each verb is shorthand for a
|
|
3
|
+
* {@link model} call with two decisions already made, so a reader learns the two
|
|
4
|
+
* facts that matter most about an entity before scanning its fields:
|
|
5
|
+
*
|
|
6
|
+
* - Writability: `mutable.*` lets clients send create, update, and delete
|
|
7
|
+
* operations over the commit protocol. `readOnly.*` means the server owns the
|
|
8
|
+
* model — its changes stream to clients as deltas, but clients cannot mutate it.
|
|
9
|
+
* - Load strategy: `.instant` loads the model at bootstrap, `.lazy` loads it on
|
|
10
|
+
* first access, and `.manual` loads it only when you query it explicitly.
|
|
11
|
+
*
|
|
12
|
+
* The two-token form (`mutable.lazy({...})`) states the safety claim in the first
|
|
13
|
+
* token and the load shape in the second. The plain {@link model} factory remains
|
|
14
|
+
* available; these verbs are a convenience layered over it.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* tasks: mutable.lazy({ title: z.string() }, {
|
|
19
|
+
* typename: 'Task', tableName: 'tasks',
|
|
20
|
+
* relations: { ... },
|
|
21
|
+
* computed: tasksComputed,
|
|
22
|
+
* }),
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
import type { z } from 'zod';
|
|
26
|
+
import { type ModelDef, type ModelOptions, type ComputedRecord, type RelationRecord } from './model.js';
|
|
27
|
+
/**
|
|
28
|
+
* Options accepted by every sugar verb. A strict subset of
|
|
29
|
+
* {@link ModelOptions} — anything the verb infers (`mutable`, `load`,
|
|
30
|
+
* `lazyObservable`) is deliberately absent so the call site can't
|
|
31
|
+
* contradict its verb.
|
|
32
|
+
*/
|
|
33
|
+
export interface SugarOptions<R extends RelationRecord = RelationRecord, C extends ComputedRecord = ComputedRecord> {
|
|
34
|
+
/** Relations to other models. Same shape as `model()`'s second arg. */
|
|
35
|
+
relations?: R;
|
|
36
|
+
/** Computed getters installed on the model class prototype. */
|
|
37
|
+
computed?: C;
|
|
38
|
+
/**
|
|
39
|
+
* Wire `__typename` (PascalCase, e.g. `'Task'`). Defaults to the schema
|
|
40
|
+
* key via `defineSchema` — override when the wire shape differs from
|
|
41
|
+
* the camelCase schema key.
|
|
42
|
+
*/
|
|
43
|
+
typename?: string;
|
|
44
|
+
/**
|
|
45
|
+
* The physical table name. Override it when the table name differs from the
|
|
46
|
+
* snake_case of the typename — for example, a `Member` type stored in a table
|
|
47
|
+
* named `'member'` rather than `'members'`.
|
|
48
|
+
*/
|
|
49
|
+
tableName?: string;
|
|
50
|
+
/**
|
|
51
|
+
* The row-access policy for tenant isolation — the rule deciding who may read a
|
|
52
|
+
* row. A discriminated union on `by` (`column`, `parent`, or `none`). See
|
|
53
|
+
* {@link ModelOptions.policy}.
|
|
54
|
+
*/
|
|
55
|
+
policy?: ModelOptions['policy'];
|
|
56
|
+
/**
|
|
57
|
+
* Sync-group routing — which delta *channels* a row fans into
|
|
58
|
+
* (`root` / `grants` / `roles`). See {@link ModelOptions.groups}.
|
|
59
|
+
*/
|
|
60
|
+
groups?: ModelOptions['groups'];
|
|
61
|
+
/** Max rows loaded during bootstrap. Only applies to `.instant`. */
|
|
62
|
+
bootstrapLimit?: number;
|
|
63
|
+
/** Bootstrap sort order (e.g. `'created_at DESC'`). */
|
|
64
|
+
bootstrapOrderBy?: string;
|
|
65
|
+
/** IndexedDB persistence hints — see {@link ModelOptions.persist}. */
|
|
66
|
+
persist?: ModelOptions['persist'];
|
|
67
|
+
/**
|
|
68
|
+
* Defer MobX observability to first access. Override the verb's
|
|
69
|
+
* default when a `.lazy` model is small enough that eager MobX setup
|
|
70
|
+
* is fine, or a `.instant` model is hot enough to justify deferral.
|
|
71
|
+
*/
|
|
72
|
+
lazyObservable?: boolean;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Client-writable entities. `mutable.*` is the opt-in signal for wire
|
|
76
|
+
* mutations via `commit` — equivalent to setting
|
|
77
|
+
* `{ mutable: true, load: X }` on `model()`.
|
|
78
|
+
*
|
|
79
|
+
* Pick the load suffix by data-access pattern:
|
|
80
|
+
* - `.instant` — small, always-needed (Theme, Layout, StatusGroup)
|
|
81
|
+
* - `.lazy` — large collections fetched on first query
|
|
82
|
+
* (Block, Message, Task)
|
|
83
|
+
*/
|
|
84
|
+
export declare const mutable: {
|
|
85
|
+
instant: <Shape extends z.ZodRawShape, R extends RelationRecord = Record<string, never>, C extends ComputedRecord = Record<string, never>>(shape: Shape, opts?: SugarOptions<R, C>) => ModelDef<Shape, R, C>;
|
|
86
|
+
lazy: <Shape extends z.ZodRawShape, R extends RelationRecord = Record<string, never>, C extends ComputedRecord = Record<string, never>>(shape: Shape, opts?: SugarOptions<R, C>) => ModelDef<Shape, R, C>;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Server-managed entities. `readOnly.*` means clients subscribe to
|
|
90
|
+
* deltas but cannot emit mutations — any `commit` op for this model
|
|
91
|
+
* is rejected at the server with "Unknown model."
|
|
92
|
+
*
|
|
93
|
+
* Use for:
|
|
94
|
+
* - Server-written state: `sync_deltas`, `presence`, version vectors
|
|
95
|
+
* - Ingestion pipelines: digest entries, filing jobs
|
|
96
|
+
* - Audit surfaces: anything where clients watch but only the server
|
|
97
|
+
* writes
|
|
98
|
+
*/
|
|
99
|
+
export declare const readOnly: {
|
|
100
|
+
instant: <Shape extends z.ZodRawShape, R extends RelationRecord = Record<string, never>, C extends ComputedRecord = Record<string, never>>(shape: Shape, opts?: SugarOptions<R, C>) => ModelDef<Shape, R, C>;
|
|
101
|
+
lazy: <Shape extends z.ZodRawShape, R extends RelationRecord = Record<string, never>, C extends ComputedRecord = Record<string, never>>(shape: Shape, opts?: SugarOptions<R, C>) => ModelDef<Shape, R, C>;
|
|
102
|
+
/**
|
|
103
|
+
* Internal-only: kept out of bootstrap and never written by clients. The
|
|
104
|
+
* strongest safety posture — use for tables the SDK must know about (for type
|
|
105
|
+
* inference) but that no client should be able to write. Rows still reach a
|
|
106
|
+
* client that reads the model, so this is a write boundary, not a read one.
|
|
107
|
+
*/
|
|
108
|
+
internal: <Shape extends z.ZodRawShape, R extends RelationRecord = Record<string, never>, C extends ComputedRecord = Record<string, never>>(shape: Shape, opts?: SugarOptions<R, C>) => ModelDef<Shape, R, C>;
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=sugar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sugar.d.ts","sourceRoot":"","sources":["../../src/schema/sugar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,MAAM,WAAW,YAAY,CAC3B,CAAC,SAAS,cAAc,GAAG,cAAc,EACzC,CAAC,SAAS,cAAc,GAAG,cAAc;IAEzC,uEAAuE;IACvE,SAAS,CAAC,EAAE,CAAC,CAAC;IACd,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,CAAC,CAAC;IACb;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IAChC;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IAChC,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sEAAsE;IACtE,OAAO,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IAClC;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAyBD;;;;;;;;;GASG;AACH,eAAO,MAAM,OAAO;cAEhB,KAAK,SAAS,CAAC,CAAC,WAAW,EAC3B,CAAC,SAAS,cAAc,0BACxB,CAAC,SAAS,cAAc,iCAEjB,KAAK,SACL,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,KACxB,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;WAMtB,KAAK,SAAS,CAAC,CAAC,WAAW,EAC3B,CAAC,SAAS,cAAc,0BACxB,CAAC,SAAS,cAAc,iCAEjB,KAAK,SACL,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,KACxB,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;CAEzB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ;cAEjB,KAAK,SAAS,CAAC,CAAC,WAAW,EAC3B,CAAC,SAAS,cAAc,0BACxB,CAAC,SAAS,cAAc,iCAEjB,KAAK,SACL,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,KACxB,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;WAQtB,KAAK,SAAS,CAAC,CAAC,WAAW,EAC3B,CAAC,SAAS,cAAc,0BACxB,CAAC,SAAS,cAAc,iCAEjB,KAAK,SACL,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,KACxB,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAGxB;;;;;OAKG;eAED,KAAK,SAAS,CAAC,CAAC,WAAW,EAC3B,CAAC,SAAS,cAAc,0BACxB,CAAC,SAAS,cAAc,iCAEjB,KAAK,SACL,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,KACxB,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;CAEzB,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A concise, claim-first way to declare a model. Each verb is shorthand for a
|
|
3
|
+
* {@link model} call with two decisions already made, so a reader learns the two
|
|
4
|
+
* facts that matter most about an entity before scanning its fields:
|
|
5
|
+
*
|
|
6
|
+
* - Writability: `mutable.*` lets clients send create, update, and delete
|
|
7
|
+
* operations over the commit protocol. `readOnly.*` means the server owns the
|
|
8
|
+
* model — its changes stream to clients as deltas, but clients cannot mutate it.
|
|
9
|
+
* - Load strategy: `.instant` loads the model at bootstrap, `.lazy` loads it on
|
|
10
|
+
* first access, and `.manual` loads it only when you query it explicitly.
|
|
11
|
+
*
|
|
12
|
+
* The two-token form (`mutable.lazy({...})`) states the safety claim in the first
|
|
13
|
+
* token and the load shape in the second. The plain {@link model} factory remains
|
|
14
|
+
* available; these verbs are a convenience layered over it.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* tasks: mutable.lazy({ title: z.string() }, {
|
|
19
|
+
* typename: 'Task', tableName: 'tasks',
|
|
20
|
+
* relations: { ... },
|
|
21
|
+
* computed: tasksComputed,
|
|
22
|
+
* }),
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
import { model, } from './model.js';
|
|
26
|
+
/** Internal helper — builds a ModelDef with baseline safety+load flags applied. */
|
|
27
|
+
function build(shape, opts, baseline) {
|
|
28
|
+
return model(shape, { relations: (opts?.relations ?? {}), mutable: baseline.mutable,
|
|
29
|
+
load: baseline.load,
|
|
30
|
+
lazyObservable: opts?.lazyObservable ?? baseline.lazyObservable,
|
|
31
|
+
typename: opts?.typename,
|
|
32
|
+
tableName: opts?.tableName,
|
|
33
|
+
policy: opts?.policy,
|
|
34
|
+
groups: opts?.groups,
|
|
35
|
+
bootstrapLimit: opts?.bootstrapLimit,
|
|
36
|
+
bootstrapOrderBy: opts?.bootstrapOrderBy,
|
|
37
|
+
persist: opts?.persist,
|
|
38
|
+
computed: opts?.computed, });
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Client-writable entities. `mutable.*` is the opt-in signal for wire
|
|
42
|
+
* mutations via `commit` — equivalent to setting
|
|
43
|
+
* `{ mutable: true, load: X }` on `model()`.
|
|
44
|
+
*
|
|
45
|
+
* Pick the load suffix by data-access pattern:
|
|
46
|
+
* - `.instant` — small, always-needed (Theme, Layout, StatusGroup)
|
|
47
|
+
* - `.lazy` — large collections fetched on first query
|
|
48
|
+
* (Block, Message, Task)
|
|
49
|
+
*/
|
|
50
|
+
export const mutable = {
|
|
51
|
+
instant: (shape, opts) =>
|
|
52
|
+
// Reactive by default (see readonly.instant note): opt out with
|
|
53
|
+
// `lazyObservable: false` only for very large read-only list models.
|
|
54
|
+
build(shape, opts, { mutable: true, load: 'instant', lazyObservable: true }),
|
|
55
|
+
lazy: (shape, opts) => build(shape, opts, { mutable: true, load: 'lazy', lazyObservable: true }),
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Server-managed entities. `readOnly.*` means clients subscribe to
|
|
59
|
+
* deltas but cannot emit mutations — any `commit` op for this model
|
|
60
|
+
* is rejected at the server with "Unknown model."
|
|
61
|
+
*
|
|
62
|
+
* Use for:
|
|
63
|
+
* - Server-written state: `sync_deltas`, `presence`, version vectors
|
|
64
|
+
* - Ingestion pipelines: digest entries, filing jobs
|
|
65
|
+
* - Audit surfaces: anything where clients watch but only the server
|
|
66
|
+
* writes
|
|
67
|
+
*/
|
|
68
|
+
export const readOnly = {
|
|
69
|
+
instant: (shape, opts) =>
|
|
70
|
+
// Reactive by default, like every variant: a remote delta that mutates a row
|
|
71
|
+
// in place must re-render reactive reads. Opt out per-model with
|
|
72
|
+
// `lazyObservable: false` for very large read-only lists where per-field
|
|
73
|
+
// atoms cost more than the QueryView's entry-replaced reactivity.
|
|
74
|
+
build(shape, opts, { mutable: false, load: 'instant', lazyObservable: true }),
|
|
75
|
+
lazy: (shape, opts) => build(shape, opts, { mutable: false, load: 'lazy', lazyObservable: true }),
|
|
76
|
+
/**
|
|
77
|
+
* Internal-only: kept out of bootstrap and never written by clients. The
|
|
78
|
+
* strongest safety posture — use for tables the SDK must know about (for type
|
|
79
|
+
* inference) but that no client should be able to write. Rows still reach a
|
|
80
|
+
* client that reads the model, so this is a write boundary, not a read one.
|
|
81
|
+
*/
|
|
82
|
+
internal: (shape, opts) => build(shape, opts, { mutable: false, load: 'lazy', lazyObservable: true }),
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=sugar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sugar.js","sourceRoot":"","sources":["../../src/schema/sugar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EACL,KAAK,GAKN,MAAM,YAAY,CAAC;AAqDpB,mFAAmF;AACnF,SAAS,KAAK,CAKZ,KAAY,EACZ,IAAoC,EACpC,QAAmE;IAEnE,OAAO,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO;QACtF,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,cAAc,EAAE,IAAI,EAAE,cAAc,IAAI,QAAQ,CAAC,cAAc;QAC/D,QAAQ,EAAE,IAAI,EAAE,QAAQ;QACxB,SAAS,EAAE,IAAI,EAAE,SAAS;QAC1B,MAAM,EAAE,IAAI,EAAE,MAAM;QACpB,MAAM,EAAE,IAAI,EAAE,MAAM;QACpB,cAAc,EAAE,IAAI,EAAE,cAAc;QACpC,gBAAgB,EAAE,IAAI,EAAE,gBAAgB;QACxC,OAAO,EAAE,IAAI,EAAE,OAAO;QACtB,QAAQ,EAAE,IAAI,EAAE,QAAQ,GAAG,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,OAAO,EAAE,CAKP,KAAY,EACZ,IAAyB,EACF,EAAE;IACzB,gEAAgE;IAChE,qEAAqE;IACrE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;IAE9E,IAAI,EAAE,CAKJ,KAAY,EACZ,IAAyB,EACF,EAAE,CACzB,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;CAC5E,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,OAAO,EAAE,CAKP,KAAY,EACZ,IAAyB,EACF,EAAE;IACzB,6EAA6E;IAC7E,iEAAiE;IACjE,yEAAyE;IACzE,kEAAkE;IAClE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;IAE/E,IAAI,EAAE,CAKJ,KAAY,EACZ,IAAyB,EACF,EAAE,CACzB,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;IAE5E;;;;;OAKG;IACH,QAAQ,EAAE,CAKR,KAAY,EACZ,IAAyB,EACF,EAAE,CACzB,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;CAC7E,CAAC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Defines how a model's rows are scoped to a tenant. Two forms live here, and the
|
|
3
|
+
* separation between them is deliberate:
|
|
4
|
+
*
|
|
5
|
+
* 1. The canonical form, {@link Tenancy} — a discriminated union that every
|
|
6
|
+
* consumer reads (provisioning and row-level security, introspection, the
|
|
7
|
+
* runtime, and the CLI) and the shape that crosses the wire in `ModelJSON`.
|
|
8
|
+
* One exhaustively switchable shape, so the type system enforces the isolation
|
|
9
|
+
* boundary.
|
|
10
|
+
* 2. The authoring form, {@link PolicyInput} — the `policy: { by }` option a
|
|
11
|
+
* schema author writes. The name follows SQL row-level security, where a
|
|
12
|
+
* policy is the rule that decides which rows a tenant may read.
|
|
13
|
+
* {@link resolvePolicy} converts it to the canonical {@link Tenancy} when the
|
|
14
|
+
* model is built, so the authoring vocabulary never reaches the wire or any
|
|
15
|
+
* consumer.
|
|
16
|
+
*
|
|
17
|
+
* The canonical form is an exhaustively switchable discriminated union, so the type
|
|
18
|
+
* system enforces the isolation boundary at every consumer. The authoring form is a
|
|
19
|
+
* flat object whose `by` names the choice and whose per-branch rules are checked by a
|
|
20
|
+
* refinement — the opt-out from tenant scoping (`{ by: 'none' }`) and the
|
|
21
|
+
* source-derived case (`{ by: 'source' }`) are explicit, named values rather than
|
|
22
|
+
* falsy flags, important because `none` makes an entire table readable across tenants.
|
|
23
|
+
*/
|
|
24
|
+
import { z } from 'zod';
|
|
25
|
+
/** The default physical tenancy column. This is the single canonical definition of that column name. */
|
|
26
|
+
export declare const DEFAULT_ORG_COLUMN = "organization_id";
|
|
27
|
+
/**
|
|
28
|
+
* Scopes a table's rows through a parent table, for rows that carry no tenancy
|
|
29
|
+
* column of their own (for example, blocks scoped through their section, report,
|
|
30
|
+
* and organization). This is the canonical `parent` payload; authors write the
|
|
31
|
+
* friendlier {@link PolicyInput} `{ by: 'parent', fk, parent }` form, which
|
|
32
|
+
* {@link resolvePolicy} normalizes into this.
|
|
33
|
+
*/
|
|
34
|
+
export declare const scopedViaRefSchema: z.ZodObject<{
|
|
35
|
+
localKey: z.ZodString;
|
|
36
|
+
parentTable: z.ZodString;
|
|
37
|
+
parentKey: z.ZodOptional<z.ZodString>;
|
|
38
|
+
parentOrgColumn: z.ZodOptional<z.ZodString>;
|
|
39
|
+
}, z.core.$strip>;
|
|
40
|
+
export type ScopedViaRef = z.infer<typeof scopedViaRefSchema>;
|
|
41
|
+
/** How a model's rows are scoped to a tenant — the canonical, wire-facing form. */
|
|
42
|
+
export declare const tenancySchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
43
|
+
kind: z.ZodLiteral<"column">;
|
|
44
|
+
column: z.ZodString;
|
|
45
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
46
|
+
kind: z.ZodLiteral<"parent">;
|
|
47
|
+
via: z.ZodObject<{
|
|
48
|
+
localKey: z.ZodString;
|
|
49
|
+
parentTable: z.ZodString;
|
|
50
|
+
parentKey: z.ZodOptional<z.ZodString>;
|
|
51
|
+
parentOrgColumn: z.ZodOptional<z.ZodString>;
|
|
52
|
+
}, z.core.$strip>;
|
|
53
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
54
|
+
kind: z.ZodLiteral<"none">;
|
|
55
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
56
|
+
kind: z.ZodLiteral<"source">;
|
|
57
|
+
}, z.core.$strip>], "kind">;
|
|
58
|
+
export type Tenancy = z.infer<typeof tenancySchema>;
|
|
59
|
+
/**
|
|
60
|
+
* The authoring form of tenancy — what a schema author writes as the model's
|
|
61
|
+
* `policy` option. The name follows SQL row-level security, where a policy is the
|
|
62
|
+
* rule that decides which rows a tenant may read.
|
|
63
|
+
*
|
|
64
|
+
* The four choices `by` can take:
|
|
65
|
+
*
|
|
66
|
+
* - `{ by: 'column' }` — a row-local tenancy column (the default). `column`
|
|
67
|
+
* overrides the name (default {@link DEFAULT_ORG_COLUMN}).
|
|
68
|
+
* - `{ by: 'parent', fk, parent }` — inherit tenancy through a foreign key when
|
|
69
|
+
* this table has no tenancy column of its own. `parentKey` (default `'id'`) and
|
|
70
|
+
* `parentTenantColumn` (default {@link DEFAULT_ORG_COLUMN}) are optional overrides.
|
|
71
|
+
* - `{ by: 'source' }` — derive the organization from the connected source that
|
|
72
|
+
* registered the model, for a single-tenant connected database that carries no
|
|
73
|
+
* `organization_id` column. The registration is the tenant boundary.
|
|
74
|
+
* - `{ by: 'none' }` — genuinely global or reference data. This makes the whole
|
|
75
|
+
* table readable across tenants, so it is correct only for tables that have no tenant.
|
|
76
|
+
*
|
|
77
|
+
* The runtime schema is one flat object rather than a discriminated union: `by`
|
|
78
|
+
* selects the branch, and the {@link https://zod.dev | superRefine} pass enforces
|
|
79
|
+
* the per-branch field rules (`parent` requires `fk` and `parent`; the other three
|
|
80
|
+
* take no branch fields). The exported {@link PolicyInput} type is hand-written as a
|
|
81
|
+
* precise union so the compiler still requires the right fields per `by` — the flat
|
|
82
|
+
* schema validates at runtime, the union guides at author time, and the type guard
|
|
83
|
+
* below keeps the two from drifting.
|
|
84
|
+
*/
|
|
85
|
+
export declare const policyInputSchema: z.ZodObject<{
|
|
86
|
+
by: z.ZodEnum<{
|
|
87
|
+
none: "none";
|
|
88
|
+
source: "source";
|
|
89
|
+
column: "column";
|
|
90
|
+
parent: "parent";
|
|
91
|
+
}>;
|
|
92
|
+
column: z.ZodOptional<z.ZodString>;
|
|
93
|
+
fk: z.ZodOptional<z.ZodString>;
|
|
94
|
+
parent: z.ZodOptional<z.ZodString>;
|
|
95
|
+
parentKey: z.ZodOptional<z.ZodString>;
|
|
96
|
+
parentTenantColumn: z.ZodOptional<z.ZodString>;
|
|
97
|
+
}, z.core.$strip>;
|
|
98
|
+
/**
|
|
99
|
+
* The precise authoring type. Hand-written rather than inferred from
|
|
100
|
+
* {@link policyInputSchema} so the compiler enforces the per-branch fields the flat
|
|
101
|
+
* runtime schema can only check at parse time — an author writing `{ by: 'parent' }`
|
|
102
|
+
* gets a type error for the missing `fk`/`parent`, not a runtime one.
|
|
103
|
+
*/
|
|
104
|
+
export type PolicyInput = {
|
|
105
|
+
by: 'column';
|
|
106
|
+
column?: string;
|
|
107
|
+
} | {
|
|
108
|
+
by: 'parent';
|
|
109
|
+
fk: string;
|
|
110
|
+
parent: string;
|
|
111
|
+
parentKey?: string;
|
|
112
|
+
parentTenantColumn?: string;
|
|
113
|
+
} | {
|
|
114
|
+
by: 'source';
|
|
115
|
+
} | {
|
|
116
|
+
by: 'none';
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Normalizes the authoring {@link PolicyInput} into the canonical {@link Tenancy}.
|
|
120
|
+
* Called once, when the model is built, so that `ModelDef`, `ModelJSON`, and every
|
|
121
|
+
* consumer see only the canonical union. Omitting `policy` defaults to a row-local
|
|
122
|
+
* `organization_id` column.
|
|
123
|
+
*/
|
|
124
|
+
export declare function resolvePolicy(input?: PolicyInput): Tenancy;
|
|
125
|
+
/**
|
|
126
|
+
* Reads the canonical {@link Tenancy} off an already-built model definition (or a
|
|
127
|
+
* parsed `ModelJSON`), defaulting to a row-local `organization_id` column when it is
|
|
128
|
+
* absent.
|
|
129
|
+
*
|
|
130
|
+
* This is the read-side helper. Consumers — provisioning and row-level security, the
|
|
131
|
+
* membership resolver, DDL generation, and the CLI — call it to get a model's
|
|
132
|
+
* tenancy without re-deriving the default each time. It is not the authoring
|
|
133
|
+
* normalizer; that is {@link resolvePolicy}.
|
|
134
|
+
*/
|
|
135
|
+
export declare function resolveTenancy(def: {
|
|
136
|
+
tenancy?: Tenancy;
|
|
137
|
+
}): Tenancy;
|
|
138
|
+
/** The physical tenancy column for a column-scoped model, else `null`. */
|
|
139
|
+
export declare function tenancyColumn(t: Tenancy): string | null;
|
|
140
|
+
//# sourceMappingURL=tenancy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenancy.d.ts","sourceRoot":"","sources":["../../src/schema/tenancy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,wGAAwG;AACxG,eAAO,MAAM,kBAAkB,oBAAoB,CAAC;AAEpD;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB;;;;;iBAS7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,mFAAmF;AACnF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;2BAgBxB,CAAC;AACH,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;iBAsD1B,CAAC;AAEL;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7F;IAAE,EAAE,EAAE,QAAQ,CAAA;CAAE,GAChB;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAenB;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,WAAW,GAAG,OAAO,CAoB1D;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAElE;AAED,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAEvD"}
|