@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,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query definitions for a schema.
|
|
3
|
+
*
|
|
4
|
+
* A query pairs a Zod input schema with the name of the model it returns.
|
|
5
|
+
* Input types flow through `z.infer` and result types through `InferModel`,
|
|
6
|
+
* the same inference path `model` and `relation` use, so there is no separate
|
|
7
|
+
* type system to learn.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* import { z } from 'zod';
|
|
11
|
+
* import {
|
|
12
|
+
* defineSchema, defineQueries, model, query, relation,
|
|
13
|
+
* } from '@abloatai/transaction/schema';
|
|
14
|
+
*
|
|
15
|
+
* const schema = defineSchema({
|
|
16
|
+
* block: model(
|
|
17
|
+
* { sectionId: z.string(), type: z.string() },
|
|
18
|
+
* { section: relation.belongsTo('sections', 'sectionId') },
|
|
19
|
+
* { load: 'lazy', typename: 'Block', persist: {} },
|
|
20
|
+
* ),
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* const queries = defineQueries(schema, {
|
|
24
|
+
* blocksByReport: query({
|
|
25
|
+
* input: z.object({ reportId: z.string() }),
|
|
26
|
+
* returns: 'block', // ← type-checked against schema.models
|
|
27
|
+
* }),
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* type Input = InferQueryInput<typeof queries.queries.blocksByReport>;
|
|
31
|
+
* // ^? { reportId: string }
|
|
32
|
+
* type Result = InferQueryResult<
|
|
33
|
+
* typeof schema,
|
|
34
|
+
* typeof queries.queries.blocksByReport
|
|
35
|
+
* >;
|
|
36
|
+
* // ^? Array<Block>
|
|
37
|
+
*
|
|
38
|
+
* Design notes:
|
|
39
|
+
*
|
|
40
|
+
* - `query()` accepts any string for `returns`. The check that the string
|
|
41
|
+
* names a real model runs when the query passes through
|
|
42
|
+
* `defineQueries(schema, ...)`, the same way
|
|
43
|
+
* `relation.belongsTo('projects', 'projectId')` takes a plain string at
|
|
44
|
+
* the factory and defers the cross-reference check to schema assembly.
|
|
45
|
+
*
|
|
46
|
+
* - A query carries no `name` until `defineQueries()` assigns one from its
|
|
47
|
+
* record key — the same pattern `defineSchema({ tasks: model(...) })`
|
|
48
|
+
* uses, where the model's name is the record key rather than a field on
|
|
49
|
+
* the factory.
|
|
50
|
+
*
|
|
51
|
+
* - Every query returns an array of a single model type. To fetch several
|
|
52
|
+
* model types at once, run several queries in one batch rather than
|
|
53
|
+
* declaring a combined shape. Each `QueryDef` therefore points at exactly
|
|
54
|
+
* one model, and the loader hydrates results through a single
|
|
55
|
+
* `schema.models[queryDef.returns]` lookup.
|
|
56
|
+
*/
|
|
57
|
+
import { z } from 'zod';
|
|
58
|
+
import type { Schema, InferModel, InferModelNames } from './schema.js';
|
|
59
|
+
/**
|
|
60
|
+
* A single query definition: a zod input shape, the schema key of the
|
|
61
|
+
* model it returns, and (after assembly) the name it was registered
|
|
62
|
+
* under.
|
|
63
|
+
*
|
|
64
|
+
* `name` is filled in by `defineQueries()` from the record key. It is
|
|
65
|
+
* optional on the type so `query()` can return a value without one —
|
|
66
|
+
* downstream code should only read `name` after the query has been
|
|
67
|
+
* passed through `defineQueries()`.
|
|
68
|
+
*/
|
|
69
|
+
export interface QueryDef<TInput extends z.ZodType = z.ZodType, TReturns extends string = string> {
|
|
70
|
+
/** Zod schema for the query's input arguments. */
|
|
71
|
+
readonly input: TInput;
|
|
72
|
+
/**
|
|
73
|
+
* The schema key of the model this query returns. Narrowed by
|
|
74
|
+
* `defineQueries()` to `InferModelNames<S>` via the `Q` generic, so
|
|
75
|
+
* a query whose `returns` does not match a known model fails at
|
|
76
|
+
* compile time.
|
|
77
|
+
*/
|
|
78
|
+
readonly returns: TReturns;
|
|
79
|
+
/**
|
|
80
|
+
* The name under which the query is registered. {@link defineQueries}
|
|
81
|
+
* fills this in from the record key; you do not set it directly. It lives
|
|
82
|
+
* on the definition itself so dispatch and lookup code can read the name
|
|
83
|
+
* straight off a {@link QueryDef} without carrying the surrounding
|
|
84
|
+
* {@link Queries} object.
|
|
85
|
+
*/
|
|
86
|
+
readonly name?: string;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The raw spec accepted by `query()`. Internal type — consumers never
|
|
90
|
+
* reference this directly, they call `query({ input, returns })`.
|
|
91
|
+
*/
|
|
92
|
+
interface QuerySpec<TInput extends z.ZodType, TReturns extends string> {
|
|
93
|
+
readonly input: TInput;
|
|
94
|
+
readonly returns: TReturns;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Define a query.
|
|
98
|
+
*
|
|
99
|
+
* `TReturns` is a `const` generic so TypeScript preserves the literal
|
|
100
|
+
* type of the `returns` value at call time (e.g., `'block'`
|
|
101
|
+
* instead of widening to `string`). This is what lets `defineQueries`
|
|
102
|
+
* type-check `returns` against the schema's model keys without
|
|
103
|
+
* requiring the consumer to write `as const` manually.
|
|
104
|
+
*
|
|
105
|
+
* ```ts
|
|
106
|
+
* const blocksByReport = query({
|
|
107
|
+
* input: z.object({ reportId: z.string() }),
|
|
108
|
+
* returns: 'block',
|
|
109
|
+
* });
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export declare function query<TInput extends z.ZodType, const TReturns extends string>(spec: QuerySpec<TInput, TReturns>): QueryDef<TInput, TReturns>;
|
|
113
|
+
/**
|
|
114
|
+
* A record of query names → query definitions, parameterized by a
|
|
115
|
+
* schema so each query's `returns` must reference a known model.
|
|
116
|
+
*
|
|
117
|
+
* This is the constraint type used by `defineQueries()` — it's what
|
|
118
|
+
* turns "any string" into "a model in this schema" without touching
|
|
119
|
+
* the `query()` factory itself.
|
|
120
|
+
*/
|
|
121
|
+
export type QueryRecord<S extends Schema> = Record<string, QueryDef<z.ZodType, InferModelNames<S>>>;
|
|
122
|
+
/**
|
|
123
|
+
* The object returned by `defineQueries()`. Holds a reference back to
|
|
124
|
+
* the schema (so the loader can resolve `queryDef.returns` to
|
|
125
|
+
* a `ModelDef` at runtime via `schema.models[def.returns]`) and the
|
|
126
|
+
* resolved record of queries, each with its `name` field filled in.
|
|
127
|
+
*/
|
|
128
|
+
export interface Queries<S extends Schema, Q extends QueryRecord<S>> {
|
|
129
|
+
readonly schema: S;
|
|
130
|
+
readonly queries: Q;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Infer the input type of a query from its zod schema.
|
|
134
|
+
*
|
|
135
|
+
* ```ts
|
|
136
|
+
* type Input = InferQueryInput<typeof queries.queries.blocksByReport>;
|
|
137
|
+
* // { reportId: string }
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
export type InferQueryInput<Q extends QueryDef> = z.infer<Q['input']>;
|
|
141
|
+
/**
|
|
142
|
+
* Infer the result type of a query by looking up its `returns` model
|
|
143
|
+
* in the schema.
|
|
144
|
+
*
|
|
145
|
+
* Returns `Array<InferModel<S, returns>>` — all queries return a
|
|
146
|
+
* collection at this layer. Single-entity fetches use
|
|
147
|
+
* `ids: [singleId]` and the caller picks `result[0]`; this avoids a
|
|
148
|
+
* second `scope: 'single'` shape in the DSL for a case that can be
|
|
149
|
+
* expressed with the collection form.
|
|
150
|
+
*
|
|
151
|
+
* ```ts
|
|
152
|
+
* type Result = InferQueryResult<
|
|
153
|
+
* typeof schema,
|
|
154
|
+
* typeof queries.queries.blocksByReport
|
|
155
|
+
* >;
|
|
156
|
+
* // Array<Block>
|
|
157
|
+
* ```
|
|
158
|
+
*/
|
|
159
|
+
export type InferQueryResult<S extends Schema, Q extends QueryDef> = Q extends QueryDef<z.ZodType, infer R> ? R extends InferModelNames<S> ? InferModel<S, R>[] : never : never;
|
|
160
|
+
/**
|
|
161
|
+
* Define a typed query set against a schema.
|
|
162
|
+
*
|
|
163
|
+
* Each entry's `returns` field is constrained to the schema's model
|
|
164
|
+
* names at compile time via the `Q` generic bound to `QueryRecord<S>`.
|
|
165
|
+
* A query whose `returns` does not match a known model will fail at
|
|
166
|
+
* the `defineQueries` call site with a TypeScript error, not at
|
|
167
|
+
* runtime.
|
|
168
|
+
*
|
|
169
|
+
* The factory also performs a runtime validation of the same
|
|
170
|
+
* invariant. This catches the edge case where the schema and the
|
|
171
|
+
* queries live in separate modules that drift out of sync — for
|
|
172
|
+
* example, when a developer removes a model from the schema without
|
|
173
|
+
* updating the queries that referenced it. The runtime error points
|
|
174
|
+
* at the specific offending query and lists the available models,
|
|
175
|
+
* which is a nicer failure mode than a generic "property does not
|
|
176
|
+
* exist" error deep inside the loader.
|
|
177
|
+
*
|
|
178
|
+
* Each resolved query gets its `name` populated from the record key:
|
|
179
|
+
* `queries.blocksByReport.name === 'blocksByReport'`. Dispatch and
|
|
180
|
+
* lookup code read `queryDef.name` directly rather than re-deriving it from
|
|
181
|
+
* the surrounding record.
|
|
182
|
+
*
|
|
183
|
+
* ```ts
|
|
184
|
+
* const schema = defineSchema({
|
|
185
|
+
* block: model(
|
|
186
|
+
* { sectionId: z.string() },
|
|
187
|
+
* {},
|
|
188
|
+
* { load: 'lazy', typename: 'Block', persist: {} },
|
|
189
|
+
* ),
|
|
190
|
+
* });
|
|
191
|
+
*
|
|
192
|
+
* const queries = defineQueries(schema, {
|
|
193
|
+
* blocksByReport: query({
|
|
194
|
+
* input: z.object({ reportId: z.string() }),
|
|
195
|
+
* returns: 'block', // ← type-checked
|
|
196
|
+
* }),
|
|
197
|
+
* });
|
|
198
|
+
* ```
|
|
199
|
+
*/
|
|
200
|
+
export declare function defineQueries<S extends Schema, const Q extends QueryRecord<S>>(schema: S, queries: Q): Queries<S, Q>;
|
|
201
|
+
export {};
|
|
202
|
+
//# sourceMappingURL=queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/schema/queries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAKvE;;;;;;;;;GASG;AACH,MAAM,WAAW,QAAQ,CACvB,MAAM,SAAS,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,EACpC,QAAQ,SAAS,MAAM,GAAG,MAAM;IAEhC,kDAAkD;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,UAAU,SAAS,CACjB,MAAM,SAAS,CAAC,CAAC,OAAO,EACxB,QAAQ,SAAS,MAAM;IAEvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;CAC5B;AAID;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,KAAK,CACnB,MAAM,SAAS,CAAC,CAAC,OAAO,EACxB,KAAK,CAAC,QAAQ,SAAS,MAAM,EAC7B,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAK/D;AAID;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,IAAI,MAAM,CAChD,MAAM,EACN,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CACxC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,OAAO,CACtB,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC;IAExB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAEtE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,gBAAgB,CAC1B,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,QAAQ,IAChB,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GACtC,CAAC,SAAS,eAAe,CAAC,CAAC,CAAC,GAC1B,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAClB,KAAK,GACP,KAAK,CAAC;AAIV;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAgB,aAAa,CAC3B,CAAC,SAAS,MAAM,EAChB,KAAK,CAAC,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC,EAC9B,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAyBtC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query definitions for a schema.
|
|
3
|
+
*
|
|
4
|
+
* A query pairs a Zod input schema with the name of the model it returns.
|
|
5
|
+
* Input types flow through `z.infer` and result types through `InferModel`,
|
|
6
|
+
* the same inference path `model` and `relation` use, so there is no separate
|
|
7
|
+
* type system to learn.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* import { z } from 'zod';
|
|
11
|
+
* import {
|
|
12
|
+
* defineSchema, defineQueries, model, query, relation,
|
|
13
|
+
* } from '@abloatai/transaction/schema';
|
|
14
|
+
*
|
|
15
|
+
* const schema = defineSchema({
|
|
16
|
+
* block: model(
|
|
17
|
+
* { sectionId: z.string(), type: z.string() },
|
|
18
|
+
* { section: relation.belongsTo('sections', 'sectionId') },
|
|
19
|
+
* { load: 'lazy', typename: 'Block', persist: {} },
|
|
20
|
+
* ),
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* const queries = defineQueries(schema, {
|
|
24
|
+
* blocksByReport: query({
|
|
25
|
+
* input: z.object({ reportId: z.string() }),
|
|
26
|
+
* returns: 'block', // ← type-checked against schema.models
|
|
27
|
+
* }),
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* type Input = InferQueryInput<typeof queries.queries.blocksByReport>;
|
|
31
|
+
* // ^? { reportId: string }
|
|
32
|
+
* type Result = InferQueryResult<
|
|
33
|
+
* typeof schema,
|
|
34
|
+
* typeof queries.queries.blocksByReport
|
|
35
|
+
* >;
|
|
36
|
+
* // ^? Array<Block>
|
|
37
|
+
*
|
|
38
|
+
* Design notes:
|
|
39
|
+
*
|
|
40
|
+
* - `query()` accepts any string for `returns`. The check that the string
|
|
41
|
+
* names a real model runs when the query passes through
|
|
42
|
+
* `defineQueries(schema, ...)`, the same way
|
|
43
|
+
* `relation.belongsTo('projects', 'projectId')` takes a plain string at
|
|
44
|
+
* the factory and defers the cross-reference check to schema assembly.
|
|
45
|
+
*
|
|
46
|
+
* - A query carries no `name` until `defineQueries()` assigns one from its
|
|
47
|
+
* record key — the same pattern `defineSchema({ tasks: model(...) })`
|
|
48
|
+
* uses, where the model's name is the record key rather than a field on
|
|
49
|
+
* the factory.
|
|
50
|
+
*
|
|
51
|
+
* - Every query returns an array of a single model type. To fetch several
|
|
52
|
+
* model types at once, run several queries in one batch rather than
|
|
53
|
+
* declaring a combined shape. Each `QueryDef` therefore points at exactly
|
|
54
|
+
* one model, and the loader hydrates results through a single
|
|
55
|
+
* `schema.models[queryDef.returns]` lookup.
|
|
56
|
+
*/
|
|
57
|
+
import { AbloValidationError } from '../errors.js';
|
|
58
|
+
// ── query() factory ───────────────────────────────────────────────────────
|
|
59
|
+
/**
|
|
60
|
+
* Define a query.
|
|
61
|
+
*
|
|
62
|
+
* `TReturns` is a `const` generic so TypeScript preserves the literal
|
|
63
|
+
* type of the `returns` value at call time (e.g., `'block'`
|
|
64
|
+
* instead of widening to `string`). This is what lets `defineQueries`
|
|
65
|
+
* type-check `returns` against the schema's model keys without
|
|
66
|
+
* requiring the consumer to write `as const` manually.
|
|
67
|
+
*
|
|
68
|
+
* ```ts
|
|
69
|
+
* const blocksByReport = query({
|
|
70
|
+
* input: z.object({ reportId: z.string() }),
|
|
71
|
+
* returns: 'block',
|
|
72
|
+
* });
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export function query(spec) {
|
|
76
|
+
return {
|
|
77
|
+
input: spec.input,
|
|
78
|
+
returns: spec.returns,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// ── defineQueries() factory ───────────────────────────────────────────────
|
|
82
|
+
/**
|
|
83
|
+
* Define a typed query set against a schema.
|
|
84
|
+
*
|
|
85
|
+
* Each entry's `returns` field is constrained to the schema's model
|
|
86
|
+
* names at compile time via the `Q` generic bound to `QueryRecord<S>`.
|
|
87
|
+
* A query whose `returns` does not match a known model will fail at
|
|
88
|
+
* the `defineQueries` call site with a TypeScript error, not at
|
|
89
|
+
* runtime.
|
|
90
|
+
*
|
|
91
|
+
* The factory also performs a runtime validation of the same
|
|
92
|
+
* invariant. This catches the edge case where the schema and the
|
|
93
|
+
* queries live in separate modules that drift out of sync — for
|
|
94
|
+
* example, when a developer removes a model from the schema without
|
|
95
|
+
* updating the queries that referenced it. The runtime error points
|
|
96
|
+
* at the specific offending query and lists the available models,
|
|
97
|
+
* which is a nicer failure mode than a generic "property does not
|
|
98
|
+
* exist" error deep inside the loader.
|
|
99
|
+
*
|
|
100
|
+
* Each resolved query gets its `name` populated from the record key:
|
|
101
|
+
* `queries.blocksByReport.name === 'blocksByReport'`. Dispatch and
|
|
102
|
+
* lookup code read `queryDef.name` directly rather than re-deriving it from
|
|
103
|
+
* the surrounding record.
|
|
104
|
+
*
|
|
105
|
+
* ```ts
|
|
106
|
+
* const schema = defineSchema({
|
|
107
|
+
* block: model(
|
|
108
|
+
* { sectionId: z.string() },
|
|
109
|
+
* {},
|
|
110
|
+
* { load: 'lazy', typename: 'Block', persist: {} },
|
|
111
|
+
* ),
|
|
112
|
+
* });
|
|
113
|
+
*
|
|
114
|
+
* const queries = defineQueries(schema, {
|
|
115
|
+
* blocksByReport: query({
|
|
116
|
+
* input: z.object({ reportId: z.string() }),
|
|
117
|
+
* returns: 'block', // ← type-checked
|
|
118
|
+
* }),
|
|
119
|
+
* });
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
export function defineQueries(schema, queries) {
|
|
123
|
+
// Rebuild the queries record with `name` populated per entry. Same
|
|
124
|
+
// shallow-spread strategy `defineSchema` uses for `typename` / `persist`
|
|
125
|
+
// defaults — preserves input references, avoids mutating `readonly`
|
|
126
|
+
// fields in place, and keeps each resolved `QueryDef` immutable from
|
|
127
|
+
// construction onward.
|
|
128
|
+
const resolvedQueries = {};
|
|
129
|
+
for (const [name, def] of Object.entries(queries)) {
|
|
130
|
+
if (!(def.returns in schema.models)) {
|
|
131
|
+
throw new AbloValidationError(`defineQueries: query "${name}" declares returns: "${def.returns}", ` +
|
|
132
|
+
`which is not a model in the schema. ` +
|
|
133
|
+
`Available models: ${Object.keys(schema.models).join(', ') || '(none)'}`, { code: 'query_returns_unknown_model' });
|
|
134
|
+
}
|
|
135
|
+
resolvedQueries[name] = { ...def, name };
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
schema,
|
|
139
|
+
// Cast back to Q: the rebuild only added `name` (already optional on
|
|
140
|
+
// QueryDef) to each entry, so the shape is structurally unchanged.
|
|
141
|
+
queries: resolvedQueries,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/schema/queries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAIH,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAiDnD,6EAA6E;AAE7E;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,KAAK,CAGnB,IAAiC;IACjC,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;AACJ,CAAC;AAoED,6EAA6E;AAE7E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAM,UAAU,aAAa,CAG3B,MAAS,EAAE,OAAU;IACrB,mEAAmE;IACnE,yEAAyE;IACzE,oEAAoE;IACpE,qEAAqE;IACrE,uBAAuB;IACvB,MAAM,eAAe,GAA6B,EAAE,CAAC;IACrD,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,mBAAmB,CAC3B,yBAAyB,IAAI,wBAAwB,GAAG,CAAC,OAAO,KAAK;gBACnE,sCAAsC;gBACtC,qBAAqB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,EAC1E,EAAE,IAAI,EAAE,6BAA6B,EAAE,CACxC,CAAC;QACJ,CAAC;QACD,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,OAAO;QACL,MAAM;QACN,qEAAqE;QACrE,mEAAmE;QACnE,OAAO,EAAE,eAA+B;KACzC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declarative relations between your models — the edges that turn a flat set
|
|
3
|
+
* of models into a graph. You attach relations to a model with the
|
|
4
|
+
* {@link relation} factories; the engine reads them to index foreign keys for
|
|
5
|
+
* fast child lookups, to order inserts so a parent row lands before the rows
|
|
6
|
+
* that reference it, and to generate the accessor properties that let you read
|
|
7
|
+
* `task.project` or `project.tasks` directly.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* import { relation } from '@abloatai/transaction/schema';
|
|
11
|
+
*
|
|
12
|
+
* const taskRelations = {
|
|
13
|
+
* project: relation.belongsTo('projects', 'projectId'),
|
|
14
|
+
* assignee: relation.belongsTo('users', 'assigneeId'),
|
|
15
|
+
* comments: relation.hasMany('comments', 'taskId'),
|
|
16
|
+
* };
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Options for `relation.belongsTo`. Each defaults to `false`, so every
|
|
20
|
+
* behavior below is opt-in per relation.
|
|
21
|
+
*
|
|
22
|
+
* `index: true` registers a foreign-key index for the child model when the
|
|
23
|
+
* engine starts, turning "every child that points at this parent" from a full
|
|
24
|
+
* scan into a constant-time lookup. Reach for it on relations you query this
|
|
25
|
+
* way often, such as a block's `sectionId`.
|
|
26
|
+
*
|
|
27
|
+
* `enrich: true` auto-populates the parent reference on an incoming change
|
|
28
|
+
* before the child data lands. A change to `Task { teamId: 't1' }` picks up the
|
|
29
|
+
* already-loaded `teams:t1` record and attaches it as `data.team`, so you can
|
|
30
|
+
* read `task.team` without a second lookup. Enrichment is best-effort: if the
|
|
31
|
+
* parent has not loaded yet it quietly does nothing, and the child data still
|
|
32
|
+
* applies.
|
|
33
|
+
*
|
|
34
|
+
* `defer: true` tells the engine to ignore this edge when it works out the
|
|
35
|
+
* order in which to insert rows. Use it on the soft side of a genuine reference
|
|
36
|
+
* cycle — the side where you are willing to insert the child first with the
|
|
37
|
+
* foreign key left null and fill it in with a later update. The other side of
|
|
38
|
+
* the cycle then becomes a strict predecessor, so the child is ordered after
|
|
39
|
+
* the parent rather than tied with it.
|
|
40
|
+
*
|
|
41
|
+
* `defer` changes only that ordering, not what the engine sends on the wire; it
|
|
42
|
+
* does not rewrite an insert into an insert-then-update. Pair it with a Postgres
|
|
43
|
+
* `DEFERRABLE INITIALLY DEFERRED` constraint when you also want the database to
|
|
44
|
+
* relax the foreign-key check itself. For example:
|
|
45
|
+
*
|
|
46
|
+
* ```ts
|
|
47
|
+
* layouts: model({ reportId: z.string().nullish() }, {
|
|
48
|
+
* // The report-owns-layout link is nullable and the layout is always
|
|
49
|
+
* // created first; marking it `defer` lets the report commit ahead of the
|
|
50
|
+
* // layout instead of sharing its insert-order slot.
|
|
51
|
+
* report: relation.belongsTo('reports', 'reportId', { defer: true }),
|
|
52
|
+
* }),
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export interface BelongsToOptions {
|
|
56
|
+
readonly index?: boolean;
|
|
57
|
+
readonly enrich?: boolean;
|
|
58
|
+
readonly defer?: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Marks the relation's target as this record's parent: the entity the record
|
|
61
|
+
* lives inside and inherits its access scope from. When a record is written,
|
|
62
|
+
* the engine routes it into its parent's sync group — following a chain of
|
|
63
|
+
* `parent` edges all the way up — so the change reaches everyone subscribed to
|
|
64
|
+
* the owning entity. This is the familiar rule that access flows down from a
|
|
65
|
+
* container to the things it holds, as a folder does to its files.
|
|
66
|
+
*
|
|
67
|
+
* Do not set `parent` on a reference that merely points at another record for
|
|
68
|
+
* provenance or as a template, such as `sourceSectionId` or `templateId`; doing
|
|
69
|
+
* so would leak the record into an unrelated scope. The engine also cannot
|
|
70
|
+
* infer the parent from whether a field is optional — many real parent keys
|
|
71
|
+
* are optional, like a root folder or an inbox task — so you must declare the
|
|
72
|
+
* parent edge explicitly.
|
|
73
|
+
*
|
|
74
|
+
* It reads naturally at the call site:
|
|
75
|
+
* `belongsTo('report', 'reportId', { parent: true })` — the report is the parent.
|
|
76
|
+
*/
|
|
77
|
+
readonly parent?: boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Emit a real Postgres foreign-key constraint for this relation when the
|
|
80
|
+
* engine provisions tables in a customer-owned database. This is independent
|
|
81
|
+
* of `parent`: `parent` decides which subscribers a change reaches, while
|
|
82
|
+
* `fk` decides whether the database enforces referential integrity. A relation
|
|
83
|
+
* may set either, both, or neither.
|
|
84
|
+
*
|
|
85
|
+
* Set `fk: true` only when the target row lives in the same database and is
|
|
86
|
+
* written in the same commit as this row, and points at a strong, contained
|
|
87
|
+
* entity. Leave it off provenance or template pointers (`sourceSectionId`,
|
|
88
|
+
* `templateId`), cross-tenant references, or anything that may be written in a
|
|
89
|
+
* different transaction than its target — a hard constraint there would reject
|
|
90
|
+
* the write and break out-of-order sync. The constraint is emitted as
|
|
91
|
+
* `DEFERRABLE INITIALLY DEFERRED, ON DELETE NO ACTION`: a plain integrity
|
|
92
|
+
* guard, leaving any cascade or null-on-delete behavior to the application.
|
|
93
|
+
*/
|
|
94
|
+
readonly fk?: boolean;
|
|
95
|
+
}
|
|
96
|
+
declare const __relationType: unique symbol;
|
|
97
|
+
declare const __relationTarget: unique symbol;
|
|
98
|
+
declare const __relationField: unique symbol;
|
|
99
|
+
/**
|
|
100
|
+
* The three edges the engine resolves. Inferred from `wire/modelShape.ts`
|
|
101
|
+
* rather than restated: the set is reported to callers by `GET /api/schema`,
|
|
102
|
+
* so it is protocol, and protocol has one definition.
|
|
103
|
+
*/
|
|
104
|
+
export type { RelationType } from '../wire/modelShape.js';
|
|
105
|
+
import type { RelationType } from '../wire/modelShape.js';
|
|
106
|
+
/**
|
|
107
|
+
* A relation definition, carrying its type information at both the type and
|
|
108
|
+
* runtime level.
|
|
109
|
+
*
|
|
110
|
+
* The `Options` generic captures a relation's options in the type system; only
|
|
111
|
+
* `belongsTo` uses it, while `hasMany` and `hasOne` leave it empty. The `const`
|
|
112
|
+
* modifier on the `belongsTo` factory preserves literal inference, so
|
|
113
|
+
* `{ enrich: true }` is remembered as `true` rather than widened to `boolean`,
|
|
114
|
+
* letting type-level features read the exact option value.
|
|
115
|
+
*
|
|
116
|
+
* `options` is always present at runtime: the factory substitutes an empty
|
|
117
|
+
* object when you omit it, so reading `options.index` or `options.enrich` needs
|
|
118
|
+
* no null check.
|
|
119
|
+
*/
|
|
120
|
+
export interface RelationDef<Type extends RelationType = RelationType, Target extends string = string, Field extends string = string, Options extends BelongsToOptions = BelongsToOptions> {
|
|
121
|
+
readonly [__relationType]: Type;
|
|
122
|
+
readonly [__relationTarget]: Target;
|
|
123
|
+
readonly [__relationField]: Field;
|
|
124
|
+
/** Runtime metadata */
|
|
125
|
+
readonly type: Type;
|
|
126
|
+
readonly target: Target;
|
|
127
|
+
/**
|
|
128
|
+
* The field on the child model that holds the parent's id, as a camelCase
|
|
129
|
+
* schema field name. The engine reads `model[foreignKey]` to resolve the
|
|
130
|
+
* relation and to build client-side index keys; it is never interpolated into
|
|
131
|
+
* raw SQL — that is what {@link foreignKeyColumn} is for.
|
|
132
|
+
*/
|
|
133
|
+
readonly foreignKey: Field;
|
|
134
|
+
/**
|
|
135
|
+
* The same foreign key expressed as a database column identifier.
|
|
136
|
+
* {@link foreignKey} is translated into this when you configure a `casing`
|
|
137
|
+
* option on `defineSchema` — for example `'snake_case'` turns `messageId`
|
|
138
|
+
* into `message_id`. The server interpolates this column name into SQL
|
|
139
|
+
* directly, because a driver's automatic camelCase-to-snake_case mapping does
|
|
140
|
+
* not reach identifiers embedded in raw SQL; resolving the name once at
|
|
141
|
+
* schema-build time is what makes it available there.
|
|
142
|
+
*
|
|
143
|
+
* Defaults to {@link foreignKey} when no `casing` option is set, so consumers
|
|
144
|
+
* whose database columns already match their field names need no
|
|
145
|
+
* configuration.
|
|
146
|
+
*/
|
|
147
|
+
readonly foreignKeyColumn: string;
|
|
148
|
+
readonly options: Options;
|
|
149
|
+
/**
|
|
150
|
+
* Optional sort field for `hasMany` relations. When set, the
|
|
151
|
+
* generated relation getter sorts results by this field. Populated
|
|
152
|
+
* by `relation.hasMany(target, fk, { orderBy: 'fieldName' })`.
|
|
153
|
+
*/
|
|
154
|
+
readonly _orderBy?: string;
|
|
155
|
+
}
|
|
156
|
+
export declare const relation: {
|
|
157
|
+
/**
|
|
158
|
+
* This model belongs to another model via a foreign key.
|
|
159
|
+
* e.g., Task belongs to Project via projectId
|
|
160
|
+
*
|
|
161
|
+
* ```ts
|
|
162
|
+
* // Simple reference (no options)
|
|
163
|
+
* project: relation.belongsTo('projects', 'projectId'),
|
|
164
|
+
*
|
|
165
|
+
* // Register an FK index for O(1) child lookups
|
|
166
|
+
* section: relation.belongsTo('sections', 'sectionId', { index: true }),
|
|
167
|
+
*
|
|
168
|
+
* // Auto-populate the parent on delta arrival
|
|
169
|
+
* team: relation.belongsTo('teams', 'teamId', { enrich: true }),
|
|
170
|
+
*
|
|
171
|
+
* // Both
|
|
172
|
+
* parent: relation.belongsTo('threads', 'parentId', { index: true, enrich: true }),
|
|
173
|
+
*
|
|
174
|
+
* // Mark the soft side of a cycle so the priority computer breaks
|
|
175
|
+
* // the cycle deterministically instead of tying the two models.
|
|
176
|
+
* report: relation.belongsTo('reports', 'reportId', { defer: true }),
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
readonly belongsTo: <Target extends string, Field extends string, const Opts extends BelongsToOptions = Record<string, never>>(target: Target, foreignKey: Field, options?: Opts) => RelationDef<"belongsTo", Target, Field, Opts>;
|
|
180
|
+
/**
|
|
181
|
+
* This model has many of another model — for example, a project has many
|
|
182
|
+
* tasks via `Task.projectId`.
|
|
183
|
+
*
|
|
184
|
+
* At runtime the engine adds a getter to the parent model that returns every
|
|
185
|
+
* child whose foreign key matches, and registers the foreign-key index on the
|
|
186
|
+
* child model automatically.
|
|
187
|
+
*
|
|
188
|
+
* ```ts
|
|
189
|
+
* blocks: relation.hasMany('blocks', 'sectionId'),
|
|
190
|
+
* // → section.blocks returns all Block[] where sectionId === section.id
|
|
191
|
+
*
|
|
192
|
+
* blocks: relation.hasMany('blocks', 'sectionId', { orderBy: 'zIndex' }),
|
|
193
|
+
* // → section.blocks returns Block[] sorted by zIndex ascending
|
|
194
|
+
* ```
|
|
195
|
+
*/
|
|
196
|
+
readonly hasMany: <Target extends string, Field extends string>(target: Target, foreignKey: Field, options?: {
|
|
197
|
+
orderBy?: string;
|
|
198
|
+
}) => RelationDef<"hasMany", Target, Field>;
|
|
199
|
+
/**
|
|
200
|
+
* This model has one of another model — for example, a user has one profile
|
|
201
|
+
* via `Profile.userId`.
|
|
202
|
+
*/
|
|
203
|
+
readonly hasOne: <Target extends string, Field extends string>(target: Target, foreignKey: Field) => RelationDef<"hasOne", Target, Field>;
|
|
204
|
+
};
|
|
205
|
+
//# sourceMappingURL=relation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation.d.ts","sourceRoot":"","sources":["../../src/schema/relation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;CACvB;AAID,OAAO,CAAC,MAAM,cAAc,EAAE,OAAO,MAAM,CAAC;AAC5C,OAAO,CAAC,MAAM,gBAAgB,EAAE,OAAO,MAAM,CAAC;AAC9C,OAAO,CAAC,MAAM,eAAe,EAAE,OAAO,MAAM,CAAC;AAE7C;;;;GAIG;AACH,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,WAAW,CAC1B,IAAI,SAAS,YAAY,GAAG,YAAY,EACxC,MAAM,SAAS,MAAM,GAAG,MAAM,EAC9B,KAAK,SAAS,MAAM,GAAG,MAAM,EAC7B,OAAO,SAAS,gBAAgB,GAAG,gBAAgB;IAEnD,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC;IAChC,QAAQ,CAAC,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC;IAElC,uBAAuB;IACvB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC;IAC3B;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AA8CD,eAAO,MAAM,QAAQ;IACnB;;;;;;;;;;;;;;;;;;;;;OAqBG;yBAED,MAAM,SAAS,MAAM,EACrB,KAAK,SAAS,MAAM,QACd,IAAI,SAAS,gBAAgB,kCAE3B,MAAM,cACF,KAAK,YACP,IAAI,KACb,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC;IAIhD;;;;;;;;;;;;;;;OAeG;uBACK,MAAM,SAAS,MAAM,EAAE,KAAK,SAAS,MAAM,UACzC,MAAM,cACF,KAAK,YACP;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAC7B,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC;IAQxC;;;OAGG;sBACI,MAAM,SAAS,MAAM,EAAE,KAAK,SAAS,MAAM,UACxC,MAAM,cACF,KAAK,KAChB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC;CAG/B,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declarative relations between your models — the edges that turn a flat set
|
|
3
|
+
* of models into a graph. You attach relations to a model with the
|
|
4
|
+
* {@link relation} factories; the engine reads them to index foreign keys for
|
|
5
|
+
* fast child lookups, to order inserts so a parent row lands before the rows
|
|
6
|
+
* that reference it, and to generate the accessor properties that let you read
|
|
7
|
+
* `task.project` or `project.tasks` directly.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* import { relation } from '@abloatai/transaction/schema';
|
|
11
|
+
*
|
|
12
|
+
* const taskRelations = {
|
|
13
|
+
* project: relation.belongsTo('projects', 'projectId'),
|
|
14
|
+
* assignee: relation.belongsTo('users', 'assigneeId'),
|
|
15
|
+
* comments: relation.hasMany('comments', 'taskId'),
|
|
16
|
+
* };
|
|
17
|
+
*/
|
|
18
|
+
// ── Internal relation builder ─────────────────────────────────────────────
|
|
19
|
+
class RelationBuilder {
|
|
20
|
+
type;
|
|
21
|
+
target;
|
|
22
|
+
foreignKey;
|
|
23
|
+
/**
|
|
24
|
+
* Starts out identical to {@link foreignKey}. `defineSchema` overwrites
|
|
25
|
+
* this when a `casing` option is set — it's declared as a mutable
|
|
26
|
+
* (non-readonly on the implementation side) so the schema builder can
|
|
27
|
+
* resolve it once at build time without allocating a new object per
|
|
28
|
+
* relation. Consumers see it typed as `readonly` on {@link RelationDef}.
|
|
29
|
+
*/
|
|
30
|
+
foreignKeyColumn;
|
|
31
|
+
options;
|
|
32
|
+
/**
|
|
33
|
+
* Stashed by `hasMany` when the caller provides `{ orderBy }`. Read
|
|
34
|
+
* back in `createSyncEngine` to install the sort comparator on the
|
|
35
|
+
* generated relation getter. Declared on the builder so both writer
|
|
36
|
+
* and reader stay type-safe — no double-cast smuggle through `Record<...>`.
|
|
37
|
+
*/
|
|
38
|
+
_orderBy;
|
|
39
|
+
constructor(type, target, foreignKey, options) {
|
|
40
|
+
this.type = type;
|
|
41
|
+
this.target = target;
|
|
42
|
+
this.foreignKey = foreignKey;
|
|
43
|
+
this.foreignKeyColumn = foreignKey;
|
|
44
|
+
this.options = (options ?? {});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// ── Public relation factories ─────────────────────────────────────────────
|
|
48
|
+
export const relation = {
|
|
49
|
+
/**
|
|
50
|
+
* This model belongs to another model via a foreign key.
|
|
51
|
+
* e.g., Task belongs to Project via projectId
|
|
52
|
+
*
|
|
53
|
+
* ```ts
|
|
54
|
+
* // Simple reference (no options)
|
|
55
|
+
* project: relation.belongsTo('projects', 'projectId'),
|
|
56
|
+
*
|
|
57
|
+
* // Register an FK index for O(1) child lookups
|
|
58
|
+
* section: relation.belongsTo('sections', 'sectionId', { index: true }),
|
|
59
|
+
*
|
|
60
|
+
* // Auto-populate the parent on delta arrival
|
|
61
|
+
* team: relation.belongsTo('teams', 'teamId', { enrich: true }),
|
|
62
|
+
*
|
|
63
|
+
* // Both
|
|
64
|
+
* parent: relation.belongsTo('threads', 'parentId', { index: true, enrich: true }),
|
|
65
|
+
*
|
|
66
|
+
* // Mark the soft side of a cycle so the priority computer breaks
|
|
67
|
+
* // the cycle deterministically instead of tying the two models.
|
|
68
|
+
* report: relation.belongsTo('reports', 'reportId', { defer: true }),
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
belongsTo(target, foreignKey, options) {
|
|
72
|
+
return new RelationBuilder('belongsTo', target, foreignKey, options ?? {});
|
|
73
|
+
},
|
|
74
|
+
/**
|
|
75
|
+
* This model has many of another model — for example, a project has many
|
|
76
|
+
* tasks via `Task.projectId`.
|
|
77
|
+
*
|
|
78
|
+
* At runtime the engine adds a getter to the parent model that returns every
|
|
79
|
+
* child whose foreign key matches, and registers the foreign-key index on the
|
|
80
|
+
* child model automatically.
|
|
81
|
+
*
|
|
82
|
+
* ```ts
|
|
83
|
+
* blocks: relation.hasMany('blocks', 'sectionId'),
|
|
84
|
+
* // → section.blocks returns all Block[] where sectionId === section.id
|
|
85
|
+
*
|
|
86
|
+
* blocks: relation.hasMany('blocks', 'sectionId', { orderBy: 'zIndex' }),
|
|
87
|
+
* // → section.blocks returns Block[] sorted by zIndex ascending
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
hasMany(target, foreignKey, options) {
|
|
91
|
+
const builder = new RelationBuilder('hasMany', target, foreignKey);
|
|
92
|
+
if (options?.orderBy) {
|
|
93
|
+
builder._orderBy = options.orderBy;
|
|
94
|
+
}
|
|
95
|
+
return builder;
|
|
96
|
+
},
|
|
97
|
+
/**
|
|
98
|
+
* This model has one of another model — for example, a user has one profile
|
|
99
|
+
* via `Profile.userId`.
|
|
100
|
+
*/
|
|
101
|
+
hasOne(target, foreignKey) {
|
|
102
|
+
return new RelationBuilder('hasOne', target, foreignKey);
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
//# sourceMappingURL=relation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation.js","sourceRoot":"","sources":["../../src/schema/relation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA6JH,6EAA6E;AAE7E,MAAM,eAAe;IAWV,IAAI,CAAO;IACX,MAAM,CAAS;IACf,UAAU,CAAQ;IAC3B;;;;;;OAMG;IACH,gBAAgB,CAAS;IAChB,OAAO,CAAU;IAC1B;;;;;OAKG;IACH,QAAQ,CAAU;IAElB,YAAY,IAAU,EAAE,MAAc,EAAE,UAAiB,EAAE,OAAiB;QAC1E,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,CAAC,OAAO,IAAK,EAAc,CAAC,CAAC;IAC9C,CAAC;CACF;AAED,6EAA6E;AAE7E,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,SAAS,CAKP,MAAc,EACd,UAAiB,EACjB,OAAc;QAEd,OAAO,IAAI,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,IAAK,EAAW,CAAC,CAAC;IACvF,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CACL,MAAc,EACd,UAAiB,EACjB,OAA8B;QAE9B,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QACnE,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;YACrB,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;QACrC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,MAAM,CACJ,MAAc,EACd,UAAiB;QAEjB,OAAO,IAAI,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAC3D,CAAC;CACO,CAAC"}
|