@abloatai/ablo 0.35.0 → 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/AGENTS.md +2 -2
- package/CHANGELOG.md +71 -1929
- package/NOTICE +2 -2
- package/README.md +23 -532
- package/assets/banner.png +0 -0
- package/dist/auth.d.ts +2 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +2 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +3 -0
- package/dist/client.js.map +1 -0
- package/dist/coordination.d.ts +2 -0
- package/dist/coordination.d.ts.map +1 -0
- package/dist/coordination.js +2 -0
- package/dist/coordination.js.map +1 -0
- package/dist/index.d.ts +3 -112
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -161
- package/dist/index.js.map +1 -0
- package/dist/react.d.ts +4 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +3 -0
- package/dist/react.js.map +1 -0
- package/dist/schema.d.ts +2 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +2 -0
- package/dist/schema.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -0
- package/dist/source-conformance.d.ts +2 -0
- package/dist/source-conformance.d.ts.map +1 -0
- package/dist/source-conformance.js +2 -0
- package/dist/source-conformance.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-kysely.d.ts +2 -0
- package/dist/source-kysely.d.ts.map +1 -0
- package/dist/source-kysely.js +2 -0
- package/dist/source-kysely.js.map +1 -0
- package/dist/source-next.d.ts +2 -0
- package/dist/source-next.d.ts.map +1 -0
- package/dist/source-next.js +2 -0
- package/dist/source-next.js.map +1 -0
- package/dist/source.d.ts +2 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +2 -0
- package/dist/source.js.map +1 -0
- package/dist/wire.d.ts +2 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +2 -0
- package/dist/wire.js.map +1 -0
- package/docs/agents.md +2 -2
- package/docs/api-keys.md +13 -12
- package/docs/api.md +15 -53
- package/docs/audit.md +4 -3
- package/docs/cli.md +11 -11
- package/docs/client-behavior.md +9 -9
- package/docs/concurrency-convention.md +28 -42
- package/docs/coordination.md +228 -86
- package/docs/data-sources.md +5 -5
- package/docs/debugging.md +34 -12
- package/docs/deployment.md +8 -8
- package/docs/examples/agent-human.md +4 -4
- package/docs/examples/ai-sdk-tool.md +1 -1
- package/docs/examples/existing-python-backend.md +15 -4
- package/docs/examples/nextjs.md +27 -6
- package/docs/examples/scoped-agent.md +3 -3
- package/docs/examples/server-agent.md +2 -2
- package/docs/groups.md +57 -3
- package/docs/guarantees.md +37 -10
- package/docs/how-it-works.md +32 -8
- package/docs/idempotency.md +6 -6
- package/docs/identity.md +24 -24
- package/docs/index.md +8 -8
- package/docs/integration-guide.md +38 -16
- package/docs/internal/README.md +18 -0
- package/docs/internal/agent-fleet-coordination-design.md +171 -0
- package/docs/internal/agent-orchestration.md +58 -0
- package/docs/internal/commit-identifiers.md +91 -0
- package/docs/internal/concurrency-open-decisions.md +37 -0
- package/docs/internal/data-source-reverse-channel.md +150 -0
- package/docs/internal/per-field-conflict-detection.md +165 -0
- package/docs/internal/postgres-replication.md +64 -0
- package/docs/internal/serializable-schema.md +119 -0
- package/docs/internal/structure.md +32 -0
- package/docs/mcp.md +9 -9
- package/docs/migration.md +37 -18
- package/docs/projects.md +1 -1
- package/docs/quickstart.md +2 -2
- package/docs/react.md +24 -13
- package/docs/schema-contract.md +3 -3
- package/docs/sessions.md +91 -37
- package/docs/webhooks.md +9 -9
- package/examples/README.md +2 -2
- package/examples/data-source/README.md +1 -1
- package/examples/data-source/ablo-driver.ts +1 -1
- package/examples/data-source/customer-server.ts +1 -1
- package/examples/data-source/run.ts +1 -1
- package/examples/data-source/schema.ts +1 -1
- package/examples/quickstart.ts +2 -2
- package/llms.txt +12 -12
- package/package.json +64 -174
- package/dist/BaseSyncedStore.d.ts +0 -823
- package/dist/BaseSyncedStore.js +0 -1955
- package/dist/Database.d.ts +0 -335
- package/dist/Database.js +0 -1500
- package/dist/InstanceCache.d.ts +0 -233
- package/dist/InstanceCache.js +0 -1164
- package/dist/LazyReferenceCollection.d.ts +0 -177
- package/dist/LazyReferenceCollection.js +0 -461
- package/dist/Model.d.ts +0 -444
- package/dist/Model.js +0 -909
- package/dist/ModelRegistry.d.ts +0 -221
- package/dist/ModelRegistry.js +0 -537
- package/dist/NetworkMonitor.d.ts +0 -26
- package/dist/NetworkMonitor.js +0 -77
- package/dist/RuntimeContext.d.ts +0 -52
- package/dist/RuntimeContext.js +0 -80
- package/dist/SyncClient.d.ts +0 -551
- package/dist/SyncClient.js +0 -2199
- package/dist/adapters/alwaysOnline.d.ts +0 -14
- package/dist/adapters/alwaysOnline.js +0 -17
- package/dist/adapters/inMemoryStorage.d.ts +0 -31
- package/dist/adapters/inMemoryStorage.js +0 -110
- package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
- package/dist/ai-sdk/coordinatedTool.js +0 -134
- package/dist/ai-sdk/coordinationContext.d.ts +0 -46
- package/dist/ai-sdk/coordinationContext.js +0 -106
- package/dist/ai-sdk/index.d.ts +0 -121
- package/dist/ai-sdk/index.js +0 -121
- package/dist/ai-sdk/wrap.d.ts +0 -65
- package/dist/ai-sdk/wrap.js +0 -39
- package/dist/auth/index.d.ts +0 -1
- package/dist/auth/index.js +0 -8
- package/dist/batching/index.d.ts +0 -55
- package/dist/batching/index.js +0 -147
- package/dist/cli.cjs +0 -288600
- package/dist/client/Ablo.d.ts +0 -231
- package/dist/client/Ablo.js +0 -149
- package/dist/client/abloClient.d.ts +0 -309
- package/dist/client/abloClient.js +0 -13
- package/dist/client/clientPrelude.d.ts +0 -52
- package/dist/client/clientPrelude.js +0 -60
- package/dist/client/consoleLogger.d.ts +0 -35
- package/dist/client/consoleLogger.js +0 -44
- package/dist/client/coreClient.d.ts +0 -60
- package/dist/client/coreClient.js +0 -118
- package/dist/client/createInternalComponents.d.ts +0 -46
- package/dist/client/createInternalComponents.js +0 -92
- package/dist/client/createModelProxy.d.ts +0 -228
- package/dist/client/createModelProxy.js +0 -818
- package/dist/client/humans.d.ts +0 -48
- package/dist/client/humans.js +0 -52
- package/dist/client/modelRegistration.d.ts +0 -10
- package/dist/client/modelRegistration.js +0 -312
- package/dist/client/options.d.ts +0 -461
- package/dist/client/options.js +0 -7
- package/dist/client/reactiveEngine.d.ts +0 -48
- package/dist/client/reactiveEngine.js +0 -910
- package/dist/client/resourceTypes.d.ts +0 -12
- package/dist/client/resourceTypes.js +0 -10
- package/dist/client/schemaConfig.d.ts +0 -44
- package/dist/client/schemaConfig.js +0 -185
- package/dist/client/validateAbloOptions.d.ts +0 -42
- package/dist/client/validateAbloOptions.js +0 -43
- package/dist/client/wsMutationExecutor.d.ts +0 -27
- package/dist/client/wsMutationExecutor.js +0 -72
- package/dist/context.d.ts +0 -29
- package/dist/context.js +0 -58
- package/dist/coordination/ClaimLog.d.ts +0 -26
- package/dist/coordination/ClaimLog.js +0 -32
- package/dist/coordination/index.d.ts +0 -1
- package/dist/coordination/index.js +0 -8
- package/dist/core/DatabaseManager.d.ts +0 -105
- package/dist/core/DatabaseManager.js +0 -387
- package/dist/core/QueryProcessor.d.ts +0 -75
- package/dist/core/QueryProcessor.js +0 -255
- package/dist/core/QueryView.d.ts +0 -79
- package/dist/core/QueryView.js +0 -218
- package/dist/core/StoreManager.d.ts +0 -112
- package/dist/core/StoreManager.js +0 -302
- package/dist/core/ViewRegistry.d.ts +0 -20
- package/dist/core/ViewRegistry.js +0 -55
- package/dist/core/index.d.ts +0 -33
- package/dist/core/index.js +0 -48
- package/dist/core/openIDBWithTimeout.d.ts +0 -65
- package/dist/core/openIDBWithTimeout.js +0 -153
- package/dist/core/queryUtils.d.ts +0 -45
- package/dist/core/queryUtils.js +0 -69
- package/dist/core/storeContract.d.ts +0 -145
- package/dist/core/storeContract.js +0 -12
- package/dist/docs/catalog.d.ts +0 -72
- package/dist/docs/catalog.js +0 -227
- package/dist/docs/index.d.ts +0 -10
- package/dist/docs/index.js +0 -10
- package/dist/environment.d.ts +0 -1
- package/dist/environment.js +0 -8
- package/dist/interfaces/index.d.ts +0 -311
- package/dist/interfaces/index.js +0 -9
- package/dist/keys/index.d.ts +0 -1
- package/dist/keys/index.js +0 -8
- package/dist/mutators/RecordingMutation.d.ts +0 -36
- package/dist/mutators/RecordingMutation.js +0 -182
- package/dist/mutators/Transaction.d.ts +0 -40
- package/dist/mutators/Transaction.js +0 -58
- package/dist/mutators/UndoManager.d.ts +0 -258
- package/dist/mutators/UndoManager.js +0 -658
- package/dist/mutators/defineMutators.d.ts +0 -60
- package/dist/mutators/defineMutators.js +0 -18
- package/dist/mutators/inverseOp.d.ts +0 -126
- package/dist/mutators/inverseOp.js +0 -71
- package/dist/mutators/mutateActions.d.ts +0 -45
- package/dist/mutators/mutateActions.js +0 -105
- package/dist/mutators/readerActions.d.ts +0 -33
- package/dist/mutators/readerActions.js +0 -57
- package/dist/mutators/undoApply.d.ts +0 -51
- package/dist/mutators/undoApply.js +0 -117
- package/dist/policy/index.d.ts +0 -21
- package/dist/policy/index.js +0 -20
- package/dist/query/client.d.ts +0 -61
- package/dist/query/client.js +0 -137
- package/dist/query/types.d.ts +0 -85
- package/dist/query/types.js +0 -16
- package/dist/react/AbloProvider.d.ts +0 -230
- package/dist/react/AbloProvider.js +0 -455
- package/dist/react/ClientSideSuspense.d.ts +0 -36
- package/dist/react/ClientSideSuspense.js +0 -17
- package/dist/react/DefaultFallback.d.ts +0 -24
- package/dist/react/DefaultFallback.js +0 -43
- package/dist/react/context.d.ts +0 -55
- package/dist/react/context.js +0 -29
- package/dist/react/index.d.ts +0 -61
- package/dist/react/index.js +0 -66
- package/dist/react/internalContext.d.ts +0 -33
- package/dist/react/internalContext.js +0 -3
- package/dist/react/useAblo.d.ts +0 -75
- package/dist/react/useAblo.js +0 -102
- package/dist/react/useCurrentUserId.d.ts +0 -22
- package/dist/react/useCurrentUserId.js +0 -34
- package/dist/react/useErrorListener.d.ts +0 -20
- package/dist/react/useErrorListener.js +0 -38
- package/dist/react/useMutationFailureListener.d.ts +0 -26
- package/dist/react/useMutationFailureListener.js +0 -38
- package/dist/react/useMutators.d.ts +0 -56
- package/dist/react/useMutators.js +0 -84
- package/dist/react/useReactive.d.ts +0 -35
- package/dist/react/useReactive.js +0 -123
- package/dist/react/useSyncStatus.d.ts +0 -59
- package/dist/react/useSyncStatus.js +0 -76
- package/dist/react/useUndoScope.d.ts +0 -34
- package/dist/react/useUndoScope.js +0 -81
- package/dist/schema/coordination.d.ts +0 -112
- package/dist/schema/coordination.js +0 -129
- package/dist/schema/ddl.d.ts +0 -97
- package/dist/schema/ddl.js +0 -491
- package/dist/schema/ddlLock.d.ts +0 -35
- package/dist/schema/ddlLock.js +0 -46
- package/dist/schema/diff.d.ts +0 -225
- package/dist/schema/diff.js +0 -289
- package/dist/schema/generate.d.ts +0 -19
- package/dist/schema/generate.js +0 -86
- package/dist/schema/index.d.ts +0 -41
- package/dist/schema/index.js +0 -76
- package/dist/schema/queries.d.ts +0 -201
- package/dist/schema/queries.js +0 -144
- package/dist/schema/select.d.ts +0 -40
- package/dist/schema/select.js +0 -87
- package/dist/schema/serialize.d.ts +0 -115
- package/dist/schema/serialize.js +0 -262
- package/dist/schema/sugar.d.ts +0 -109
- package/dist/schema/sugar.js +0 -83
- package/dist/schema/syncDeltaRow.d.ts +0 -6
- package/dist/schema/syncDeltaRow.js +0 -6
- package/dist/server/adapter.d.ts +0 -173
- package/dist/server/adapter.js +0 -18
- package/dist/server/commit.d.ts +0 -107
- package/dist/server/commit.js +0 -1
- package/dist/server/index.d.ts +0 -14
- package/dist/server/index.js +0 -2
- package/dist/server/readConfig.d.ts +0 -80
- package/dist/server/readConfig.js +0 -8
- package/dist/server/storageMode.d.ts +0 -23
- package/dist/server/storageMode.js +0 -17
- package/dist/source/adapter.d.ts +0 -81
- package/dist/source/adapter.js +0 -22
- package/dist/source/adapters/drizzle.d.ts +0 -48
- package/dist/source/adapters/drizzle.js +0 -219
- package/dist/source/adapters/kysely.d.ts +0 -42
- package/dist/source/adapters/kysely.js +0 -205
- package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
- package/dist/source/adapters/kyselyMutationCore.js +0 -125
- package/dist/source/adapters/memory.d.ts +0 -13
- package/dist/source/adapters/memory.js +0 -130
- package/dist/source/adapters/prisma.d.ts +0 -63
- package/dist/source/adapters/prisma.js +0 -202
- package/dist/source/conformance.d.ts +0 -37
- package/dist/source/conformance.js +0 -215
- package/dist/source/connector.d.ts +0 -95
- package/dist/source/connector.js +0 -266
- package/dist/source/connectorProtocol.d.ts +0 -154
- package/dist/source/connectorProtocol.js +0 -163
- package/dist/source/contract.d.ts +0 -195
- package/dist/source/contract.js +0 -164
- package/dist/source/factory.d.ts +0 -92
- package/dist/source/factory.js +0 -286
- package/dist/source/footprint.d.ts +0 -111
- package/dist/source/footprint.js +0 -0
- package/dist/source/idempotency.d.ts +0 -61
- package/dist/source/idempotency.js +0 -144
- package/dist/source/index.d.ts +0 -23
- package/dist/source/index.js +0 -30
- package/dist/source/migrations.d.ts +0 -21
- package/dist/source/migrations.js +0 -103
- package/dist/source/next.d.ts +0 -32
- package/dist/source/next.js +0 -25
- package/dist/source/pushQueue.d.ts +0 -134
- package/dist/source/pushQueue.js +0 -256
- package/dist/source/signing.d.ts +0 -92
- package/dist/source/signing.js +0 -162
- package/dist/source/types.d.ts +0 -401
- package/dist/source/types.js +0 -59
- package/dist/stores/ObjectStore.d.ts +0 -115
- package/dist/stores/ObjectStore.js +0 -393
- package/dist/stores/ObjectStoreContract.d.ts +0 -38
- package/dist/stores/ObjectStoreContract.js +0 -1
- package/dist/stores/SyncActionStore.d.ts +0 -97
- package/dist/stores/SyncActionStore.js +0 -504
- package/dist/stores/syncAction.d.ts +0 -26
- package/dist/stores/syncAction.js +0 -16
- package/dist/surface.d.ts +0 -36
- package/dist/surface.js +0 -75
- package/dist/sync/BootstrapFetcher.d.ts +0 -280
- package/dist/sync/BootstrapFetcher.js +0 -962
- package/dist/sync/ConnectionManager.d.ts +0 -8
- package/dist/sync/ConnectionManager.js +0 -8
- package/dist/sync/OnDemandLoader.d.ts +0 -228
- package/dist/sync/OnDemandLoader.js +0 -742
- package/dist/sync/SubscriptionManager.d.ts +0 -159
- package/dist/sync/SubscriptionManager.js +0 -243
- package/dist/sync/SyncWebSocket.d.ts +0 -173
- package/dist/sync/SyncWebSocket.js +0 -438
- package/dist/sync/awaitClaimGrant.d.ts +0 -6
- package/dist/sync/awaitClaimGrant.js +0 -6
- package/dist/sync/bootstrapApply.d.ts +0 -70
- package/dist/sync/bootstrapApply.js +0 -73
- package/dist/sync/commitFrames.d.ts +0 -8
- package/dist/sync/commitFrames.js +0 -8
- package/dist/sync/contextPorts.d.ts +0 -18
- package/dist/sync/contextPorts.js +0 -31
- package/dist/sync/createClaimStream.d.ts +0 -7
- package/dist/sync/createClaimStream.js +0 -7
- package/dist/sync/createPresenceStream.d.ts +0 -69
- package/dist/sync/createPresenceStream.js +0 -200
- package/dist/sync/createSnapshot.d.ts +0 -29
- package/dist/sync/createSnapshot.js +0 -118
- package/dist/sync/credentialLifecycle.d.ts +0 -7
- package/dist/sync/credentialLifecycle.js +0 -7
- package/dist/sync/deltaPipeline.d.ts +0 -113
- package/dist/sync/deltaPipeline.js +0 -261
- package/dist/sync/groupChange.d.ts +0 -113
- package/dist/sync/groupChange.js +0 -242
- package/dist/sync/participants.d.ts +0 -115
- package/dist/sync/participants.js +0 -344
- package/dist/sync/persistedPrefix.d.ts +0 -12
- package/dist/sync/persistedPrefix.js +0 -22
- package/dist/sync/schemaDrift.d.ts +0 -55
- package/dist/sync/schemaDrift.js +0 -53
- package/dist/sync/schemas.d.ts +0 -70
- package/dist/sync/schemas.js +0 -94
- package/dist/sync/syncCursor.d.ts +0 -40
- package/dist/sync/syncCursor.js +0 -55
- package/dist/sync/syncPlan.d.ts +0 -54
- package/dist/sync/syncPlan.js +0 -50
- package/dist/sync/wsFrameHandlers.d.ts +0 -8
- package/dist/sync/wsFrameHandlers.js +0 -8
- package/dist/testing/fixtures/bootstrap.d.ts +0 -49
- package/dist/testing/fixtures/bootstrap.js +0 -59
- package/dist/testing/fixtures/deltas.d.ts +0 -83
- package/dist/testing/fixtures/deltas.js +0 -136
- package/dist/testing/fixtures/httpResponses.d.ts +0 -70
- package/dist/testing/fixtures/httpResponses.js +0 -90
- package/dist/testing/fixtures/models.d.ts +0 -83
- package/dist/testing/fixtures/models.js +0 -272
- package/dist/testing/helpers/reactWrapper.d.ts +0 -69
- package/dist/testing/helpers/reactWrapper.js +0 -67
- package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
- package/dist/testing/helpers/syncEngineHarness.js +0 -73
- package/dist/testing/helpers/wait.d.ts +0 -30
- package/dist/testing/helpers/wait.js +0 -49
- package/dist/testing/index.d.ts +0 -23
- package/dist/testing/index.js +0 -33
- package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
- package/dist/testing/mocks/FakeDatabase.js +0 -10
- package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
- package/dist/testing/mocks/MockMutationExecutor.js +0 -186
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
- package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
- package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
- package/dist/testing/mocks/MockSyncContext.js +0 -72
- package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
- package/dist/testing/mocks/MockSyncStore.js +0 -171
- package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
- package/dist/testing/mocks/MockWebSocket.js +0 -118
- package/dist/transaction/ablo.d.ts +0 -88
- package/dist/transaction/ablo.js +0 -33
- package/dist/transaction/auth/apiKey.d.ts +0 -152
- package/dist/transaction/auth/apiKey.js +0 -419
- package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
- package/dist/transaction/auth/bootstrapScope.js +0 -1
- package/dist/transaction/auth/capability.d.ts +0 -177
- package/dist/transaction/auth/capability.js +0 -199
- package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
- package/dist/transaction/auth/credentialEndpoint.js +0 -86
- package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
- package/dist/transaction/auth/credentialPolicy.js +0 -125
- package/dist/transaction/auth/credentialSource.d.ts +0 -30
- package/dist/transaction/auth/credentialSource.js +0 -55
- package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
- package/dist/transaction/auth/hostedEndpoints.js +0 -21
- package/dist/transaction/auth/identity.d.ts +0 -55
- package/dist/transaction/auth/identity.js +0 -210
- package/dist/transaction/auth/index.d.ts +0 -162
- package/dist/transaction/auth/index.js +0 -304
- package/dist/transaction/auth/schemas.d.ts +0 -59
- package/dist/transaction/auth/schemas.js +0 -85
- package/dist/transaction/auth/sessionMint.d.ts +0 -28
- package/dist/transaction/auth/sessionMint.js +0 -85
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -49
- package/dist/transaction/coordination/awaitClaimGrant.js +0 -112
- package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -50
- package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -88
- package/dist/transaction/coordination/claimMeta.d.ts +0 -49
- package/dist/transaction/coordination/claimMeta.js +0 -52
- package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
- package/dist/transaction/coordination/createClaimStream.js +0 -475
- package/dist/transaction/coordination/events.d.ts +0 -74
- package/dist/transaction/coordination/events.js +0 -7
- package/dist/transaction/coordination/index.d.ts +0 -19
- package/dist/transaction/coordination/index.js +0 -44
- package/dist/transaction/coordination/locator.d.ts +0 -83
- package/dist/transaction/coordination/locator.js +0 -82
- package/dist/transaction/coordination/schema.d.ts +0 -1473
- package/dist/transaction/coordination/schema.js +0 -1013
- package/dist/transaction/coordination/targetConflict.d.ts +0 -2
- package/dist/transaction/coordination/targetConflict.js +0 -103
- package/dist/transaction/coordination/trace.d.ts +0 -78
- package/dist/transaction/coordination/trace.js +0 -138
- package/dist/transaction/durableWrites.d.ts +0 -62
- package/dist/transaction/durableWrites.js +0 -71
- package/dist/transaction/environment.d.ts +0 -105
- package/dist/transaction/environment.js +0 -108
- package/dist/transaction/errorCodes.d.ts +0 -403
- package/dist/transaction/errorCodes.js +0 -480
- package/dist/transaction/errors.d.ts +0 -428
- package/dist/transaction/errors.js +0 -686
- package/dist/transaction/index.d.ts +0 -20
- package/dist/transaction/index.js +0 -20
- package/dist/transaction/keys/index.d.ts +0 -87
- package/dist/transaction/keys/index.js +0 -207
- package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
- package/dist/transaction/log/syncDeltaRow.js +0 -95
- package/dist/transaction/logPosition.d.ts +0 -97
- package/dist/transaction/logPosition.js +0 -125
- package/dist/transaction/logger.d.ts +0 -16
- package/dist/transaction/logger.js +0 -7
- package/dist/transaction/observability.d.ts +0 -53
- package/dist/transaction/observability.js +0 -19
- package/dist/transaction/persistence.d.ts +0 -12
- package/dist/transaction/persistence.js +0 -11
- package/dist/transaction/plugin.d.ts +0 -192
- package/dist/transaction/plugin.js +0 -87
- package/dist/transaction/policy/types.d.ts +0 -217
- package/dist/transaction/policy/types.js +0 -126
- package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
- package/dist/transaction/resources/functionalUpdate.js +0 -87
- package/dist/transaction/resources/httpResources.d.ts +0 -266
- package/dist/transaction/resources/httpResources.js +0 -7
- package/dist/transaction/resources/modelOperations.d.ts +0 -319
- package/dist/transaction/resources/modelOperations.js +0 -12
- package/dist/transaction/resources/mutationOptions.d.ts +0 -66
- package/dist/transaction/resources/mutationOptions.js +0 -9
- package/dist/transaction/resources/where.d.ts +0 -85
- package/dist/transaction/resources/where.js +0 -70
- package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
- package/dist/transaction/resources/writeOptionsSchema.js +0 -73
- package/dist/transaction/schema/field.d.ts +0 -126
- package/dist/transaction/schema/field.js +0 -265
- package/dist/transaction/schema/loadStrategy.d.ts +0 -45
- package/dist/transaction/schema/loadStrategy.js +0 -46
- package/dist/transaction/schema/model.d.ts +0 -379
- package/dist/transaction/schema/model.js +0 -123
- package/dist/transaction/schema/openapi.d.ts +0 -57
- package/dist/transaction/schema/openapi.js +0 -340
- package/dist/transaction/schema/relation.d.ts +0 -199
- package/dist/transaction/schema/relation.js +0 -104
- package/dist/transaction/schema/residency.d.ts +0 -29
- package/dist/transaction/schema/residency.js +0 -25
- package/dist/transaction/schema/roles.d.ts +0 -249
- package/dist/transaction/schema/roles.js +0 -230
- package/dist/transaction/schema/schema.d.ts +0 -324
- package/dist/transaction/schema/schema.js +0 -305
- package/dist/transaction/schema/tenancy.d.ts +0 -139
- package/dist/transaction/schema/tenancy.js +0 -190
- package/dist/transaction/transactionLayer.d.ts +0 -82
- package/dist/transaction/transactionLayer.js +0 -24
- package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
- package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
- package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
- package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
- package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
- package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
- package/dist/transaction/transport/commitFrames.d.ts +0 -90
- package/dist/transaction/transport/commitFrames.js +0 -134
- package/dist/transaction/transport/connectionManager.d.ts +0 -215
- package/dist/transaction/transport/connectionManager.js +0 -673
- package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
- package/dist/transaction/transport/credentialLifecycle.js +0 -324
- package/dist/transaction/transport/heartbeat.d.ts +0 -65
- package/dist/transaction/transport/heartbeat.js +0 -93
- package/dist/transaction/transport/httpClient.d.ts +0 -123
- package/dist/transaction/transport/httpClient.js +0 -145
- package/dist/transaction/transport/httpOptions.d.ts +0 -33
- package/dist/transaction/transport/httpOptions.js +0 -12
- package/dist/transaction/transport/httpTransport.d.ts +0 -8
- package/dist/transaction/transport/httpTransport.js +0 -1276
- package/dist/transaction/transport/networkProbe.d.ts +0 -84
- package/dist/transaction/transport/networkProbe.js +0 -207
- package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
- package/dist/transaction/transport/wsFrameHandlers.js +0 -429
- package/dist/transaction/transport/wsTransport.d.ts +0 -576
- package/dist/transaction/transport/wsTransport.js +0 -1017
- package/dist/transaction/types/assertExact.d.ts +0 -17
- package/dist/transaction/types/assertExact.js +0 -1
- package/dist/transaction/types/global.d.ts +0 -107
- package/dist/transaction/types/global.js +0 -40
- package/dist/transaction/types/index.d.ts +0 -205
- package/dist/transaction/types/index.js +0 -56
- package/dist/transaction/types/modelData.d.ts +0 -10
- package/dist/transaction/types/modelData.js +0 -9
- package/dist/transaction/types/participant.d.ts +0 -20
- package/dist/transaction/types/participant.js +0 -10
- package/dist/transaction/types/streams.d.ts +0 -540
- package/dist/transaction/types/streams.js +0 -11
- package/dist/transaction/utils/asyncIterator.d.ts +0 -34
- package/dist/transaction/utils/asyncIterator.js +0 -135
- package/dist/transaction/utils/duration.d.ts +0 -25
- package/dist/transaction/utils/duration.js +0 -45
- package/dist/transaction/utils/json.d.ts +0 -57
- package/dist/transaction/utils/json.js +0 -276
- package/dist/transaction/wire/accountResponses.d.ts +0 -351
- package/dist/transaction/wire/accountResponses.js +0 -255
- package/dist/transaction/wire/auth.d.ts +0 -49
- package/dist/transaction/wire/auth.js +0 -57
- package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
- package/dist/transaction/wire/bootstrapReason.js +0 -8
- package/dist/transaction/wire/claimEvent.d.ts +0 -76
- package/dist/transaction/wire/claimEvent.js +0 -73
- package/dist/transaction/wire/claims.d.ts +0 -463
- package/dist/transaction/wire/claims.js +0 -229
- package/dist/transaction/wire/commit.d.ts +0 -603
- package/dist/transaction/wire/commit.js +0 -321
- package/dist/transaction/wire/delta.d.ts +0 -250
- package/dist/transaction/wire/delta.js +0 -147
- package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
- package/dist/transaction/wire/errorEnvelope.js +0 -123
- package/dist/transaction/wire/feedCursor.d.ts +0 -60
- package/dist/transaction/wire/feedCursor.js +0 -82
- package/dist/transaction/wire/feedEvent.d.ts +0 -177
- package/dist/transaction/wire/feedEvent.js +0 -39
- package/dist/transaction/wire/frames.d.ts +0 -194
- package/dist/transaction/wire/frames.js +0 -50
- package/dist/transaction/wire/inboundFrames.d.ts +0 -552
- package/dist/transaction/wire/inboundFrames.js +0 -116
- package/dist/transaction/wire/index.d.ts +0 -50
- package/dist/transaction/wire/index.js +0 -74
- package/dist/transaction/wire/listEnvelope.d.ts +0 -37
- package/dist/transaction/wire/listEnvelope.js +0 -42
- package/dist/transaction/wire/modelResponses.d.ts +0 -85
- package/dist/transaction/wire/modelResponses.js +0 -43
- package/dist/transaction/wire/protocol.d.ts +0 -38
- package/dist/transaction/wire/protocol.js +0 -38
- package/dist/transaction/wire/protocolVersion.d.ts +0 -73
- package/dist/transaction/wire/protocolVersion.js +0 -83
- package/dist/transactions/mutations/MutationQueue.d.ts +0 -655
- package/dist/transactions/mutations/MutationQueue.js +0 -2797
- package/dist/transactions/mutations/MutationStore.d.ts +0 -20
- package/dist/transactions/mutations/MutationStore.js +0 -53
- package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
- package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
- package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
- package/dist/transactions/mutations/coalesceRules.js +0 -140
- package/dist/transactions/mutations/commitLatency.d.ts +0 -52
- package/dist/transactions/mutations/commitLatency.js +0 -130
- package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
- package/dist/transactions/mutations/commitOutboxStore.js +0 -26
- package/dist/transactions/mutations/commitPayload.d.ts +0 -164
- package/dist/transactions/mutations/commitPayload.js +0 -152
- package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -59
- package/dist/transactions/mutations/deltaConfirmation.js +0 -233
- package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
- package/dist/transactions/mutations/durableWriteStore.js +0 -12
- package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
- package/dist/transactions/mutations/optimisticApply.js +0 -65
- package/dist/transactions/mutations/replayValidation.d.ts +0 -186
- package/dist/transactions/mutations/replayValidation.js +0 -163
- package/dist/utils/mobxSetup.d.ts +0 -53
- package/dist/utils/mobxSetup.js +0 -330
- package/dist/webhooks/events.d.ts +0 -43
- package/dist/webhooks/events.js +0 -42
- package/dist/webhooks/index.d.ts +0 -8
- package/dist/webhooks/index.js +0 -8
- package/dist/wire/index.d.ts +0 -1
- package/dist/wire/index.js +0 -8
- package/docs/interaction-model.md +0 -99
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Per-call options accepted by any mutation.
|
|
3
|
-
*
|
|
4
|
-
* Every field here defines, orders, settles, or authorises *the change itself*
|
|
5
|
-
* — request identity, commit disposition, fencing, and the premise it rests on.
|
|
6
|
-
* None of it touches a local copy of rows, so it belongs with the settlement
|
|
7
|
-
* core rather than the reactive consumer (ADR 0013 §4, ADR 0016).
|
|
8
|
-
*/
|
|
9
|
-
export {};
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The where-clause grammar carried by a filtered read.
|
|
3
|
-
*
|
|
4
|
-
* A `where` is a flat list of `[column, operator, value]` conditions combined
|
|
5
|
-
* with AND. The protocol carries no model-specific logic: the server compiles a
|
|
6
|
-
* condition against your schema, so adding a model or relation is a schema
|
|
7
|
-
* change rather than a server change.
|
|
8
|
-
*
|
|
9
|
-
* The `IN` operator lets you batch a read by any column, including a foreign
|
|
10
|
-
* key — for example, fetching every block whose `sectionId` falls in a set of ids.
|
|
11
|
-
*
|
|
12
|
-
* These types describe the *request*, not any local copy of the rows it returns,
|
|
13
|
-
* so they live with the settlement core rather than the reactive consumer.
|
|
14
|
-
*/
|
|
15
|
-
import { z } from 'zod';
|
|
16
|
-
/** Primitive operand types allowed in a where clause. */
|
|
17
|
-
export type WherePrimitive = string | number | boolean | null;
|
|
18
|
-
/**
|
|
19
|
-
* The comparison operators a {@link WhereClause} may use: equality and
|
|
20
|
-
* inequality, ordering, set membership (`IN` / `NOT IN`), null checks
|
|
21
|
-
* (`IS` / `IS NOT`), and case-sensitive or case-insensitive pattern
|
|
22
|
-
* matching (`LIKE`, `ILIKE`, and their negations).
|
|
23
|
-
*/
|
|
24
|
-
export declare const whereOpSchema: z.ZodEnum<{
|
|
25
|
-
"=": "=";
|
|
26
|
-
"!=": "!=";
|
|
27
|
-
"<": "<";
|
|
28
|
-
"<=": "<=";
|
|
29
|
-
">": ">";
|
|
30
|
-
">=": ">=";
|
|
31
|
-
IN: "IN";
|
|
32
|
-
"NOT IN": "NOT IN";
|
|
33
|
-
IS: "IS";
|
|
34
|
-
"IS NOT": "IS NOT";
|
|
35
|
-
LIKE: "LIKE";
|
|
36
|
-
"NOT LIKE": "NOT LIKE";
|
|
37
|
-
ILIKE: "ILIKE";
|
|
38
|
-
"NOT ILIKE": "NOT ILIKE";
|
|
39
|
-
}>;
|
|
40
|
-
export type WhereOp = z.infer<typeof whereOpSchema>;
|
|
41
|
-
/**
|
|
42
|
-
* How each operator binds its operand — the classification a compiler needs
|
|
43
|
-
* before it can render or evaluate a condition: a scalar on the right, an array
|
|
44
|
-
* to expand, or a null check with no operand at all. `LIKE_OPS` is the subset
|
|
45
|
-
* whose operand is a pattern and therefore needs pattern validation.
|
|
46
|
-
*
|
|
47
|
-
* These live here, beside the operators, because every consumer of the grammar
|
|
48
|
-
* needs the same split and there is more than one consumer: a where clause is
|
|
49
|
-
* compiled to SQL on a hosted plane and evaluated in memory against the log on
|
|
50
|
-
* a source plane. Two hand-maintained copies of this split meant the same
|
|
51
|
-
* request could be accepted by one plane and rejected by the other — and the
|
|
52
|
-
* pattern-safety set existed on only one of them.
|
|
53
|
-
*/
|
|
54
|
-
export declare const WHERE_SCALAR_OPS: ReadonlySet<WhereOp>;
|
|
55
|
-
export declare const WHERE_ARRAY_OPS: ReadonlySet<WhereOp>;
|
|
56
|
-
export declare const WHERE_NULL_OPS: ReadonlySet<WhereOp>;
|
|
57
|
-
export declare const WHERE_LIKE_OPS: ReadonlySet<WhereOp>;
|
|
58
|
-
/**
|
|
59
|
-
* A single condition. Two supported shapes:
|
|
60
|
-
*
|
|
61
|
-
* - `[col, value]` — shortcut for `[col, '=', value]`
|
|
62
|
-
* - `[col, op, value]` — explicit operator
|
|
63
|
-
*
|
|
64
|
-
* The value is a single primitive for scalar operators and an array of
|
|
65
|
-
* primitives for IN/NOT IN.
|
|
66
|
-
*/
|
|
67
|
-
export type WhereClause = readonly [col: string, value: WherePrimitive] | readonly [col: string, op: WhereOp, value: WherePrimitive | readonly WherePrimitive[]];
|
|
68
|
-
/**
|
|
69
|
-
* Client-facing where shape for `load({where})` and `deleteMany({where})`.
|
|
70
|
-
*
|
|
71
|
-
* Two shapes accepted, both AND-combined:
|
|
72
|
-
*
|
|
73
|
-
* - Object form: `{ name: 'foo', orgId: '1' }` — each entry is an `=`
|
|
74
|
-
* clause; array values become `IN`. Ergonomic for the common case.
|
|
75
|
-
* - Tuple form: `[['name', 'ILIKE', '%Goldman%'], ['orgId', '1']]` —
|
|
76
|
-
* explicit operators (LIKE/ILIKE/<=/etc.). Matches the wire
|
|
77
|
-
* `WhereClause[]` 1:1, so no translation layer.
|
|
78
|
-
*
|
|
79
|
-
* The two forms compose: pass tuple form when you need an operator,
|
|
80
|
-
* object form otherwise. For OR semantics, run two `load()` calls and
|
|
81
|
-
* union client-side — keeps the protocol AND-only.
|
|
82
|
-
*/
|
|
83
|
-
export type LoadWhere<T> = Partial<T> | {
|
|
84
|
-
[K in keyof T]?: T[K] | readonly T[K][];
|
|
85
|
-
} | readonly WhereClause[];
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The where-clause grammar carried by a filtered read.
|
|
3
|
-
*
|
|
4
|
-
* A `where` is a flat list of `[column, operator, value]` conditions combined
|
|
5
|
-
* with AND. The protocol carries no model-specific logic: the server compiles a
|
|
6
|
-
* condition against your schema, so adding a model or relation is a schema
|
|
7
|
-
* change rather than a server change.
|
|
8
|
-
*
|
|
9
|
-
* The `IN` operator lets you batch a read by any column, including a foreign
|
|
10
|
-
* key — for example, fetching every block whose `sectionId` falls in a set of ids.
|
|
11
|
-
*
|
|
12
|
-
* These types describe the *request*, not any local copy of the rows it returns,
|
|
13
|
-
* so they live with the settlement core rather than the reactive consumer.
|
|
14
|
-
*/
|
|
15
|
-
import { z } from 'zod';
|
|
16
|
-
/**
|
|
17
|
-
* The comparison operators a {@link WhereClause} may use: equality and
|
|
18
|
-
* inequality, ordering, set membership (`IN` / `NOT IN`), null checks
|
|
19
|
-
* (`IS` / `IS NOT`), and case-sensitive or case-insensitive pattern
|
|
20
|
-
* matching (`LIKE`, `ILIKE`, and their negations).
|
|
21
|
-
*/
|
|
22
|
-
export const whereOpSchema = z.enum([
|
|
23
|
-
'=',
|
|
24
|
-
'!=',
|
|
25
|
-
'<',
|
|
26
|
-
'<=',
|
|
27
|
-
'>',
|
|
28
|
-
'>=',
|
|
29
|
-
'IN',
|
|
30
|
-
'NOT IN',
|
|
31
|
-
'IS',
|
|
32
|
-
'IS NOT',
|
|
33
|
-
'LIKE',
|
|
34
|
-
'NOT LIKE',
|
|
35
|
-
'ILIKE',
|
|
36
|
-
'NOT ILIKE',
|
|
37
|
-
]);
|
|
38
|
-
/**
|
|
39
|
-
* How each operator binds its operand — the classification a compiler needs
|
|
40
|
-
* before it can render or evaluate a condition: a scalar on the right, an array
|
|
41
|
-
* to expand, or a null check with no operand at all. `LIKE_OPS` is the subset
|
|
42
|
-
* whose operand is a pattern and therefore needs pattern validation.
|
|
43
|
-
*
|
|
44
|
-
* These live here, beside the operators, because every consumer of the grammar
|
|
45
|
-
* needs the same split and there is more than one consumer: a where clause is
|
|
46
|
-
* compiled to SQL on a hosted plane and evaluated in memory against the log on
|
|
47
|
-
* a source plane. Two hand-maintained copies of this split meant the same
|
|
48
|
-
* request could be accepted by one plane and rejected by the other — and the
|
|
49
|
-
* pattern-safety set existed on only one of them.
|
|
50
|
-
*/
|
|
51
|
-
export const WHERE_SCALAR_OPS = new Set([
|
|
52
|
-
'=',
|
|
53
|
-
'!=',
|
|
54
|
-
'<',
|
|
55
|
-
'<=',
|
|
56
|
-
'>',
|
|
57
|
-
'>=',
|
|
58
|
-
'LIKE',
|
|
59
|
-
'NOT LIKE',
|
|
60
|
-
'ILIKE',
|
|
61
|
-
'NOT ILIKE',
|
|
62
|
-
]);
|
|
63
|
-
export const WHERE_ARRAY_OPS = new Set(['IN', 'NOT IN']);
|
|
64
|
-
export const WHERE_NULL_OPS = new Set(['IS', 'IS NOT']);
|
|
65
|
-
export const WHERE_LIKE_OPS = new Set([
|
|
66
|
-
'LIKE',
|
|
67
|
-
'NOT LIKE',
|
|
68
|
-
'ILIKE',
|
|
69
|
-
'NOT ILIKE',
|
|
70
|
-
]);
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The Zod schema for write options — the settings accepted by every write
|
|
3
|
-
* entry point, including `ablo.<model>.create/update/delete`, `commits.create`,
|
|
4
|
-
* and the HTTP write routes. Each of those boundaries validates against this
|
|
5
|
-
* one schema, so a caller who passes, say, `onStale: 'rejct'` fails right away
|
|
6
|
-
* with a typed {@link AbloValidationError} at the call site instead of silently
|
|
7
|
-
* or with a 400 from the server.
|
|
8
|
-
*
|
|
9
|
-
* The schema is the runtime counterpart of the {@link MutationOptions}
|
|
10
|
-
* interface. A compile-time check at the bottom of this file asserts that the
|
|
11
|
-
* two describe the same shape, so they cannot drift apart.
|
|
12
|
-
*
|
|
13
|
-
* Validation only inspects; it never transforms. Callers keep the exact options
|
|
14
|
-
* object they passed in. This matters because the `claim` field can hold a live
|
|
15
|
-
* claim handle whose `release` and `revoke` functions must survive, so the code
|
|
16
|
-
* asserts the shape rather than replacing the value with a parsed copy.
|
|
17
|
-
*/
|
|
18
|
-
import { z } from 'zod';
|
|
19
|
-
import { onStaleModeSchema } from '../coordination/schema.js';
|
|
20
|
-
export { onStaleModeSchema };
|
|
21
|
-
export declare const writeOptionsSchema: z.ZodObject<{
|
|
22
|
-
idempotencyKey: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
23
|
-
label: z.ZodOptional<z.ZodString>;
|
|
24
|
-
wait: z.ZodOptional<z.ZodEnum<{
|
|
25
|
-
queued: "queued";
|
|
26
|
-
confirmed: "confirmed";
|
|
27
|
-
}>>;
|
|
28
|
-
readAt: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
29
|
-
onStale: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
|
|
30
|
-
reject: "reject";
|
|
31
|
-
overwrite: "overwrite";
|
|
32
|
-
notify: "notify";
|
|
33
|
-
}>>>;
|
|
34
|
-
fenceToken: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
35
|
-
claim: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
36
|
-
id: z.ZodString;
|
|
37
|
-
}, z.core.$loose>]>>>;
|
|
38
|
-
}, z.core.$strip>;
|
|
39
|
-
export type WriteOptionsInput = z.infer<typeof writeOptionsSchema>;
|
|
40
|
-
/**
|
|
41
|
-
* Validates a write-options object against {@link writeOptionsSchema}. On
|
|
42
|
-
* failure it throws a typed {@link AbloValidationError} — with
|
|
43
|
-
* `code: 'write_options_invalid'` and a `param` pointing at the offending
|
|
44
|
-
* field — and on success returns nothing, leaving the caller's original object
|
|
45
|
-
* untouched. A `null` or `undefined` value passes.
|
|
46
|
-
*/
|
|
47
|
-
export declare function assertWriteOptions(value: unknown, context?: string): void;
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The Zod schema for write options — the settings accepted by every write
|
|
3
|
-
* entry point, including `ablo.<model>.create/update/delete`, `commits.create`,
|
|
4
|
-
* and the HTTP write routes. Each of those boundaries validates against this
|
|
5
|
-
* one schema, so a caller who passes, say, `onStale: 'rejct'` fails right away
|
|
6
|
-
* with a typed {@link AbloValidationError} at the call site instead of silently
|
|
7
|
-
* or with a 400 from the server.
|
|
8
|
-
*
|
|
9
|
-
* The schema is the runtime counterpart of the {@link MutationOptions}
|
|
10
|
-
* interface. A compile-time check at the bottom of this file asserts that the
|
|
11
|
-
* two describe the same shape, so they cannot drift apart.
|
|
12
|
-
*
|
|
13
|
-
* Validation only inspects; it never transforms. Callers keep the exact options
|
|
14
|
-
* object they passed in. This matters because the `claim` field can hold a live
|
|
15
|
-
* claim handle whose `release` and `revoke` functions must survive, so the code
|
|
16
|
-
* asserts the shape rather than replacing the value with a parsed copy.
|
|
17
|
-
*/
|
|
18
|
-
import { z } from 'zod';
|
|
19
|
-
import { AbloValidationError } from '../errors.js';
|
|
20
|
-
import { commitWaitSchema } from '../wire/commit.js';
|
|
21
|
-
import { onStaleModeSchema } from '../coordination/schema.js';
|
|
22
|
-
// Re-exported, not redeclared. `coordination/schema.ts` owns this enum — it is
|
|
23
|
-
// what the wire schemas and the server validate against — while the published
|
|
24
|
-
// SDK barrel exports the name from this module. Declaring it twice put a second
|
|
25
|
-
// object behind the public export that agreed with the canonical one only by
|
|
26
|
-
// both happening to list the same three strings.
|
|
27
|
-
export { onStaleModeSchema };
|
|
28
|
-
export const writeOptionsSchema = z.object({
|
|
29
|
-
/** Idempotency key the server records in `mutation_log` to make retries
|
|
30
|
-
* safe; `null` opts out of that protection. */
|
|
31
|
-
idempotencyKey: z.string().min(1).max(255).nullish(),
|
|
32
|
-
/** Human-readable audit tag, persisted to `mutation_log.label`. */
|
|
33
|
-
label: z.string().max(255).optional(),
|
|
34
|
-
/** Resolve when queued locally (default) or once the server confirms. */
|
|
35
|
-
wait: commitWaitSchema.optional(),
|
|
36
|
-
/** Stale guard: the sync watermark the caller's reasoning was based on. */
|
|
37
|
-
readAt: z.number().int().nonnegative().nullish(),
|
|
38
|
-
/** What the server does when the target moved past `readAt`. */
|
|
39
|
-
onStale: onStaleModeSchema.nullish(),
|
|
40
|
-
/** The held claim's fencing token (Option B), sourced from the claim handle
|
|
41
|
-
* rather than set by hand; the server validates it against the entity's
|
|
42
|
-
* high-water. Kept in the schema so it stays aligned with `MutationOptions`
|
|
43
|
-
* (the drift guard below) and a malformed token is rejected at the boundary. */
|
|
44
|
-
fenceToken: z.number().nullish(),
|
|
45
|
-
/** The claim this write belongs to — either a claim id, or a live claim
|
|
46
|
-
* handle whose `release`/`revoke` functions are preserved untouched. */
|
|
47
|
-
claim: z.union([z.string(), z.looseObject({ id: z.string() })]).nullish(),
|
|
48
|
-
});
|
|
49
|
-
/**
|
|
50
|
-
* Validates a write-options object against {@link writeOptionsSchema}. On
|
|
51
|
-
* failure it throws a typed {@link AbloValidationError} — with
|
|
52
|
-
* `code: 'write_options_invalid'` and a `param` pointing at the offending
|
|
53
|
-
* field — and on success returns nothing, leaving the caller's original object
|
|
54
|
-
* untouched. A `null` or `undefined` value passes.
|
|
55
|
-
*/
|
|
56
|
-
export function assertWriteOptions(value, context) {
|
|
57
|
-
if (value == null)
|
|
58
|
-
return;
|
|
59
|
-
const result = writeOptionsSchema.safeParse(value);
|
|
60
|
-
if (result.success)
|
|
61
|
-
return;
|
|
62
|
-
const issue = result.error.issues[0];
|
|
63
|
-
const path = issue?.path.map(String).join('.') ?? '';
|
|
64
|
-
throw new AbloValidationError(`Invalid write options${context ? ` on \`${context}\`` : ''}${path ? ` at \`${path}\`` : ''}: ${issue?.message ?? 'failed validation'}.`, {
|
|
65
|
-
code: 'write_options_invalid',
|
|
66
|
-
...(path ? { param: path } : {}),
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
const _writeOptionsContractInSync = [
|
|
70
|
-
true,
|
|
71
|
-
true,
|
|
72
|
-
];
|
|
73
|
-
void _writeOptionsContractInSync;
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Field builders for schema definitions. Each helper — {@link field}.string(),
|
|
3
|
-
* .number(), .enum(), and so on — returns an ordinary Zod schema with a little
|
|
4
|
-
* sync-engine metadata attached (its type tag and whether it is indexed) plus a
|
|
5
|
-
* couple of chainable methods. The metadata is tucked into the schema's description
|
|
6
|
-
* as a JSON string so it survives `.optional()`, `.nullable()`, and `.default()`
|
|
7
|
-
* chaining, and {@link resolveFieldMeta} reads it back out as a {@link FieldMeta}.
|
|
8
|
-
*
|
|
9
|
-
* Usage:
|
|
10
|
-
* import { field } from '@abloatai/ablo/schema';
|
|
11
|
-
*
|
|
12
|
-
* const tasks = model({
|
|
13
|
-
* title: field.string(),
|
|
14
|
-
* projectId: field.string().indexed(), // fluent chain
|
|
15
|
-
* priority: field.number().optional(),
|
|
16
|
-
* status: field.enum(['todo', 'doing', 'done']),
|
|
17
|
-
* });
|
|
18
|
-
*
|
|
19
|
-
* Or use Zod directly (no metadata, but still works):
|
|
20
|
-
* import { z } from 'zod';
|
|
21
|
-
*
|
|
22
|
-
* const tasks = model({
|
|
23
|
-
* title: z.string(),
|
|
24
|
-
* });
|
|
25
|
-
*/
|
|
26
|
-
import { z } from 'zod';
|
|
27
|
-
/** The sync-engine metadata describing one field, available at runtime through a
|
|
28
|
-
* model's `fields` map. The {@link field} builders attach it, and the migration
|
|
29
|
-
* planner, type generator, and OpenAPI generator all read it. */
|
|
30
|
-
export interface FieldMeta {
|
|
31
|
-
/** Sync-engine type tag, which maps to storage and serialization hints. */
|
|
32
|
-
type: 'string' | 'number' | 'boolean' | 'date' | 'enum' | 'json';
|
|
33
|
-
/** Whether the field was marked optional via `.optional()` or `.nullable()`. */
|
|
34
|
-
isOptional: boolean;
|
|
35
|
-
/** Whether the field was marked indexed via `.indexed()`. */
|
|
36
|
-
isIndexed: boolean;
|
|
37
|
-
/**
|
|
38
|
-
* Physical database column name override. When absent, SQL layers derive
|
|
39
|
-
* the column from the field name using the active casing convention.
|
|
40
|
-
*/
|
|
41
|
-
column?: string;
|
|
42
|
-
/** For enums: the allowed values. */
|
|
43
|
-
enumValues?: readonly string[];
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Extract FieldMeta from a Zod schema. Returns null if no sync-engine
|
|
47
|
-
* metadata is attached (e.g., raw `z.string()` usage).
|
|
48
|
-
*
|
|
49
|
-
* Walks through `.optional()` and `.nullable()` wrappers to find the
|
|
50
|
-
* underlying description.
|
|
51
|
-
*/
|
|
52
|
-
export declare function getFieldMeta(schema: z.ZodType): FieldMeta | null;
|
|
53
|
-
/**
|
|
54
|
-
* Infers a {@link FieldMeta} from a plain Zod schema that carries no field-builder
|
|
55
|
-
* metadata — for example a bare `z.string()`. It unwraps `.optional()`,
|
|
56
|
-
* `.nullable()`, and `.default()` to reach the inner type, then maps that Zod type
|
|
57
|
-
* to a sync-engine type tag. Most callers should use {@link resolveFieldMeta}
|
|
58
|
-
* instead, which tries the attached metadata first and falls back to this.
|
|
59
|
-
*/
|
|
60
|
-
export declare function inferFieldMetaFromZod(schema: z.ZodType): FieldMeta;
|
|
61
|
-
/**
|
|
62
|
-
* Resolves a {@link FieldMeta} for any Zod schema, whether it was built with a
|
|
63
|
-
* {@link field} builder (which attaches metadata) or with plain Zod (which needs
|
|
64
|
-
* inference). This is the single entry point for "given a Zod field, tell me its
|
|
65
|
-
* sync-engine type tag and whether it is optional"; the model and query builders use
|
|
66
|
-
* it to populate their field maps, and the serializer reads those maps.
|
|
67
|
-
*
|
|
68
|
-
* It always returns a value and never returns null. A Zod type it does not recognize
|
|
69
|
-
* falls through to the `string` tag by design.
|
|
70
|
-
*/
|
|
71
|
-
export declare function resolveFieldMeta(schema: z.ZodType): FieldMeta;
|
|
72
|
-
/** A Zod schema returned by a {@link field} builder — the underlying Zod type plus
|
|
73
|
-
* two chainable methods: `indexed()` marks the field for a database index, and
|
|
74
|
-
* `from(column)` overrides the physical column name it maps to. */
|
|
75
|
-
export type FieldBuilder<T extends z.ZodType> = T & {
|
|
76
|
-
indexed(): FieldBuilder<T>;
|
|
77
|
-
from(column: string): FieldBuilder<T>;
|
|
78
|
-
};
|
|
79
|
-
export declare const field: {
|
|
80
|
-
/** Defines a text field. */
|
|
81
|
-
readonly string: () => FieldBuilder<z.ZodString>;
|
|
82
|
-
/** Defines a numeric field. */
|
|
83
|
-
readonly number: () => FieldBuilder<z.ZodNumber>;
|
|
84
|
-
/** Defines a true/false field. */
|
|
85
|
-
readonly boolean: () => FieldBuilder<z.ZodBoolean>;
|
|
86
|
-
/** Defines a timestamp field, represented as a JavaScript `Date`. */
|
|
87
|
-
readonly date: () => FieldBuilder<z.ZodDate>;
|
|
88
|
-
/** Defines a field constrained to a fixed set of string values. */
|
|
89
|
-
readonly enum: <const T extends readonly [string, ...string[]]>(values: T) => FieldBuilder<z.ZodEnum<{ [k_1 in T[number]]: k_1; } extends infer T_1 ? { [k in keyof T_1]: T_1[k]; } : never>>;
|
|
90
|
-
/**
|
|
91
|
-
* Defines a JSON field, with three call shapes:
|
|
92
|
-
*
|
|
93
|
-
* ```ts
|
|
94
|
-
* field.json() // unknown JSON blob
|
|
95
|
-
* field.json(z.array(z.string())) // typed JSON with Zod schema
|
|
96
|
-
* field.json({ icon: z.string().default('default') }) // typed sub-properties with defaults
|
|
97
|
-
* ```
|
|
98
|
-
*
|
|
99
|
-
* The third form is especially handy for metadata fields. It wraps the plain
|
|
100
|
-
* object in `z.object()` automatically, and the model runtime adds a
|
|
101
|
-
* `${field}Json` getter that parses the JSON string on read, applies the Zod
|
|
102
|
-
* defaults, and caches the result.
|
|
103
|
-
*
|
|
104
|
-
* Example:
|
|
105
|
-
* ```ts
|
|
106
|
-
* const reports = model({
|
|
107
|
-
* metadata: field.json({
|
|
108
|
-
* icon: z.string().default('report'),
|
|
109
|
-
* color: z.string().default('#F59E0B'),
|
|
110
|
-
* summary: z.string().optional(),
|
|
111
|
-
* }),
|
|
112
|
-
* });
|
|
113
|
-
*
|
|
114
|
-
* // At runtime:
|
|
115
|
-
* report.metadata // raw JSON string (unchanged)
|
|
116
|
-
* report.metadataJson // { icon: 'report', color: '#F59E0B', summary: undefined }
|
|
117
|
-
* report.metadataJson.icon // 'report' (typed, with default)
|
|
118
|
-
* ```
|
|
119
|
-
*/
|
|
120
|
-
readonly json: <T extends z.ZodType = z.ZodUnknown>(schemaOrShape?: T | z.ZodRawShape) => FieldBuilder<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
121
|
-
/** Defines an indexed text field — shorthand for `field.string().indexed()`. */
|
|
122
|
-
readonly id: () => FieldBuilder<z.ZodString>;
|
|
123
|
-
};
|
|
124
|
-
/** Marks a Zod schema as indexed so lookups on it use a database index. This is the
|
|
125
|
-
* standalone-function form of the `.indexed()` chain method. */
|
|
126
|
-
export declare function indexed<T extends z.ZodType>(schema: T): T;
|
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Field builders for schema definitions. Each helper — {@link field}.string(),
|
|
3
|
-
* .number(), .enum(), and so on — returns an ordinary Zod schema with a little
|
|
4
|
-
* sync-engine metadata attached (its type tag and whether it is indexed) plus a
|
|
5
|
-
* couple of chainable methods. The metadata is tucked into the schema's description
|
|
6
|
-
* as a JSON string so it survives `.optional()`, `.nullable()`, and `.default()`
|
|
7
|
-
* chaining, and {@link resolveFieldMeta} reads it back out as a {@link FieldMeta}.
|
|
8
|
-
*
|
|
9
|
-
* Usage:
|
|
10
|
-
* import { field } from '@abloatai/ablo/schema';
|
|
11
|
-
*
|
|
12
|
-
* const tasks = model({
|
|
13
|
-
* title: field.string(),
|
|
14
|
-
* projectId: field.string().indexed(), // fluent chain
|
|
15
|
-
* priority: field.number().optional(),
|
|
16
|
-
* status: field.enum(['todo', 'doing', 'done']),
|
|
17
|
-
* });
|
|
18
|
-
*
|
|
19
|
-
* Or use Zod directly (no metadata, but still works):
|
|
20
|
-
* import { z } from 'zod';
|
|
21
|
-
*
|
|
22
|
-
* const tasks = model({
|
|
23
|
-
* title: z.string(),
|
|
24
|
-
* });
|
|
25
|
-
*/
|
|
26
|
-
import { z } from 'zod';
|
|
27
|
-
import { AbloValidationError } from '../errors.js';
|
|
28
|
-
// ── Helpers ───────────────────────────────────────────────────────────────
|
|
29
|
-
/** Distinguish a Zod schema from a plain object shape (ZodRawShape). */
|
|
30
|
-
function isZodSchema(value) {
|
|
31
|
-
return (typeof value === 'object' &&
|
|
32
|
-
value !== null &&
|
|
33
|
-
'_def' in value &&
|
|
34
|
-
typeof value._def === 'object');
|
|
35
|
-
}
|
|
36
|
-
// ── Metadata encoding ─────────────────────────────────────────────────────
|
|
37
|
-
//
|
|
38
|
-
// We stash metadata in `.describe('__sync:{json}')` so it rides along with
|
|
39
|
-
// the Zod schema through `.optional()`, `.nullable()`, etc. At schema-build
|
|
40
|
-
// time we parse it back out into structured FieldMeta.
|
|
41
|
-
const META_PREFIX = '__sync:';
|
|
42
|
-
function encodeMeta(meta) {
|
|
43
|
-
return META_PREFIX + JSON.stringify(meta);
|
|
44
|
-
}
|
|
45
|
-
function decodeMeta(description) {
|
|
46
|
-
if (!description?.startsWith(META_PREFIX))
|
|
47
|
-
return null;
|
|
48
|
-
try {
|
|
49
|
-
return JSON.parse(description.slice(META_PREFIX.length));
|
|
50
|
-
}
|
|
51
|
-
catch {
|
|
52
|
-
return null;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Extract FieldMeta from a Zod schema. Returns null if no sync-engine
|
|
57
|
-
* metadata is attached (e.g., raw `z.string()` usage).
|
|
58
|
-
*
|
|
59
|
-
* Walks through `.optional()` and `.nullable()` wrappers to find the
|
|
60
|
-
* underlying description.
|
|
61
|
-
*/
|
|
62
|
-
export function getFieldMeta(schema) {
|
|
63
|
-
let current = schema;
|
|
64
|
-
let isOptional = false;
|
|
65
|
-
// Unwrap optional / nullable / default to reach the inner type
|
|
66
|
-
// (these are the wrappers that preserve .describe() but may hide it).
|
|
67
|
-
// `instanceof` keeps the narrowing typed; no `_def` digging.
|
|
68
|
-
const MAX_UNWRAP = 5;
|
|
69
|
-
for (let i = 0; i < MAX_UNWRAP; i++) {
|
|
70
|
-
if (current instanceof z.ZodOptional) {
|
|
71
|
-
isOptional = true;
|
|
72
|
-
current = current.unwrap();
|
|
73
|
-
continue;
|
|
74
|
-
}
|
|
75
|
-
if (current instanceof z.ZodNullable) {
|
|
76
|
-
isOptional = true;
|
|
77
|
-
current = current.unwrap();
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
if (current instanceof z.ZodDefault) {
|
|
81
|
-
// .removeDefault() — v4 deprecates in favor of .unwrap() but
|
|
82
|
-
// the installed @types only expose removeDefault on ZodDefault.
|
|
83
|
-
current = current.unwrap();
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
|
-
break;
|
|
87
|
-
}
|
|
88
|
-
// The description lives on the innermost schema we reached.
|
|
89
|
-
const description = current.description ?? schema.description;
|
|
90
|
-
const base = decodeMeta(description);
|
|
91
|
-
if (!base)
|
|
92
|
-
return null;
|
|
93
|
-
return { ...base, isOptional };
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Infers a {@link FieldMeta} from a plain Zod schema that carries no field-builder
|
|
97
|
-
* metadata — for example a bare `z.string()`. It unwraps `.optional()`,
|
|
98
|
-
* `.nullable()`, and `.default()` to reach the inner type, then maps that Zod type
|
|
99
|
-
* to a sync-engine type tag. Most callers should use {@link resolveFieldMeta}
|
|
100
|
-
* instead, which tries the attached metadata first and falls back to this.
|
|
101
|
-
*/
|
|
102
|
-
export function inferFieldMetaFromZod(schema) {
|
|
103
|
-
let current = schema;
|
|
104
|
-
let isOptional = false;
|
|
105
|
-
const MAX_UNWRAP = 5;
|
|
106
|
-
for (let i = 0; i < MAX_UNWRAP; i++) {
|
|
107
|
-
if (current instanceof z.ZodOptional || current instanceof z.ZodNullable) {
|
|
108
|
-
isOptional = true;
|
|
109
|
-
current = current.unwrap();
|
|
110
|
-
continue;
|
|
111
|
-
}
|
|
112
|
-
if (current instanceof z.ZodDefault) {
|
|
113
|
-
current = current.unwrap();
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
break;
|
|
117
|
-
}
|
|
118
|
-
let type = 'string';
|
|
119
|
-
let enumValues;
|
|
120
|
-
if (current instanceof z.ZodString) {
|
|
121
|
-
type = 'string';
|
|
122
|
-
}
|
|
123
|
-
else if (current instanceof z.ZodNumber) {
|
|
124
|
-
type = 'number';
|
|
125
|
-
}
|
|
126
|
-
else if (current instanceof z.ZodBoolean) {
|
|
127
|
-
type = 'boolean';
|
|
128
|
-
}
|
|
129
|
-
else if (current instanceof z.ZodDate) {
|
|
130
|
-
type = 'date';
|
|
131
|
-
}
|
|
132
|
-
else if (current instanceof z.ZodEnum) {
|
|
133
|
-
type = 'enum';
|
|
134
|
-
// ZodEnum.options is the public v4 accessor for enum values.
|
|
135
|
-
enumValues = current.options;
|
|
136
|
-
}
|
|
137
|
-
else if (current instanceof z.ZodObject ||
|
|
138
|
-
current instanceof z.ZodArray ||
|
|
139
|
-
current instanceof z.ZodRecord ||
|
|
140
|
-
current instanceof z.ZodUnion ||
|
|
141
|
-
current instanceof z.ZodUnknown ||
|
|
142
|
-
// `z.custom<T>()` is opaque — its shape cannot be inspected — so it is treated
|
|
143
|
-
// as a JSON blob rather than falling through to the `'string'` default. The type
|
|
144
|
-
// tag drives how the runtime observes the field, and an opaque custom value
|
|
145
|
-
// should be tracked by reference rather than deeply.
|
|
146
|
-
current instanceof z.ZodCustom) {
|
|
147
|
-
type = 'json';
|
|
148
|
-
}
|
|
149
|
-
return { type, isOptional, isIndexed: false, enumValues };
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Resolves a {@link FieldMeta} for any Zod schema, whether it was built with a
|
|
153
|
-
* {@link field} builder (which attaches metadata) or with plain Zod (which needs
|
|
154
|
-
* inference). This is the single entry point for "given a Zod field, tell me its
|
|
155
|
-
* sync-engine type tag and whether it is optional"; the model and query builders use
|
|
156
|
-
* it to populate their field maps, and the serializer reads those maps.
|
|
157
|
-
*
|
|
158
|
-
* It always returns a value and never returns null. A Zod type it does not recognize
|
|
159
|
-
* falls through to the `string` tag by design.
|
|
160
|
-
*/
|
|
161
|
-
export function resolveFieldMeta(schema) {
|
|
162
|
-
const attached = getFieldMeta(schema);
|
|
163
|
-
if (attached)
|
|
164
|
-
return attached;
|
|
165
|
-
return inferFieldMetaFromZod(schema);
|
|
166
|
-
}
|
|
167
|
-
function assertColumnName(column) {
|
|
168
|
-
if (!/^[a-zA-Z_][a-zA-Z0-9_]{0,62}$/.test(column)) {
|
|
169
|
-
throw new AbloValidationError(`field.from(): invalid column identifier ${JSON.stringify(column)}`, { code: 'schema_definition_invalid' });
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
/** Add sync-engine chain methods to a Zod schema without disturbing its type. */
|
|
173
|
-
function withFieldMethods(schema, meta) {
|
|
174
|
-
const described = schema.describe(encodeMeta(meta));
|
|
175
|
-
described.indexed = () => withFieldMethods(schema, { ...meta, isIndexed: true });
|
|
176
|
-
described.from = (column) => {
|
|
177
|
-
assertColumnName(column);
|
|
178
|
-
return withFieldMethods(schema, { ...meta, column });
|
|
179
|
-
};
|
|
180
|
-
return described;
|
|
181
|
-
}
|
|
182
|
-
function buildField(schema, baseMeta) {
|
|
183
|
-
return withFieldMethods(schema, { ...baseMeta, isIndexed: false });
|
|
184
|
-
}
|
|
185
|
-
export const field = {
|
|
186
|
-
/** Defines a text field. */
|
|
187
|
-
string() {
|
|
188
|
-
return buildField(z.string(), { type: 'string' });
|
|
189
|
-
},
|
|
190
|
-
/** Defines a numeric field. */
|
|
191
|
-
number() {
|
|
192
|
-
return buildField(z.number(), { type: 'number' });
|
|
193
|
-
},
|
|
194
|
-
/** Defines a true/false field. */
|
|
195
|
-
boolean() {
|
|
196
|
-
return buildField(z.boolean(), { type: 'boolean' });
|
|
197
|
-
},
|
|
198
|
-
/** Defines a timestamp field, represented as a JavaScript `Date`. */
|
|
199
|
-
date() {
|
|
200
|
-
return buildField(z.date(), { type: 'date' });
|
|
201
|
-
},
|
|
202
|
-
/** Defines a field constrained to a fixed set of string values. */
|
|
203
|
-
enum(values) {
|
|
204
|
-
return buildField(z.enum(values), { type: 'enum', enumValues: values });
|
|
205
|
-
},
|
|
206
|
-
/**
|
|
207
|
-
* Defines a JSON field, with three call shapes:
|
|
208
|
-
*
|
|
209
|
-
* ```ts
|
|
210
|
-
* field.json() // unknown JSON blob
|
|
211
|
-
* field.json(z.array(z.string())) // typed JSON with Zod schema
|
|
212
|
-
* field.json({ icon: z.string().default('default') }) // typed sub-properties with defaults
|
|
213
|
-
* ```
|
|
214
|
-
*
|
|
215
|
-
* The third form is especially handy for metadata fields. It wraps the plain
|
|
216
|
-
* object in `z.object()` automatically, and the model runtime adds a
|
|
217
|
-
* `${field}Json` getter that parses the JSON string on read, applies the Zod
|
|
218
|
-
* defaults, and caches the result.
|
|
219
|
-
*
|
|
220
|
-
* Example:
|
|
221
|
-
* ```ts
|
|
222
|
-
* const reports = model({
|
|
223
|
-
* metadata: field.json({
|
|
224
|
-
* icon: z.string().default('report'),
|
|
225
|
-
* color: z.string().default('#F59E0B'),
|
|
226
|
-
* summary: z.string().optional(),
|
|
227
|
-
* }),
|
|
228
|
-
* });
|
|
229
|
-
*
|
|
230
|
-
* // At runtime:
|
|
231
|
-
* report.metadata // raw JSON string (unchanged)
|
|
232
|
-
* report.metadataJson // { icon: 'report', color: '#F59E0B', summary: undefined }
|
|
233
|
-
* report.metadataJson.icon // 'report' (typed, with default)
|
|
234
|
-
* ```
|
|
235
|
-
*/
|
|
236
|
-
json(schemaOrShape) {
|
|
237
|
-
let inner;
|
|
238
|
-
if (!schemaOrShape) {
|
|
239
|
-
inner = z.unknown();
|
|
240
|
-
}
|
|
241
|
-
else if (isZodSchema(schemaOrShape)) {
|
|
242
|
-
inner = schemaOrShape;
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
// Plain object shape → wrap in z.object() for the sub-property pattern
|
|
246
|
-
inner = z.object(schemaOrShape);
|
|
247
|
-
}
|
|
248
|
-
return buildField(inner, { type: 'json' });
|
|
249
|
-
},
|
|
250
|
-
/** Defines an indexed text field — shorthand for `field.string().indexed()`. */
|
|
251
|
-
id() {
|
|
252
|
-
return field.string().indexed();
|
|
253
|
-
},
|
|
254
|
-
};
|
|
255
|
-
// ── Function form ────────────────────────────────────────────────────────
|
|
256
|
-
/** Marks a Zod schema as indexed so lookups on it use a database index. This is the
|
|
257
|
-
* standalone-function form of the `.indexed()` chain method. */
|
|
258
|
-
export function indexed(schema) {
|
|
259
|
-
// Try to preserve existing metadata type tag if present.
|
|
260
|
-
const meta = decodeMeta(schema.description);
|
|
261
|
-
const newMeta = meta
|
|
262
|
-
? { ...meta, isIndexed: true }
|
|
263
|
-
: { type: 'string', isIndexed: true };
|
|
264
|
-
return schema.describe(encodeMeta(newMeta));
|
|
265
|
-
}
|