@abloatai/ablo 0.36.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 -2013
- package/NOTICE +2 -2
- package/README.md +25 -71
- 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 -114
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -163
- 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 +1 -1
- package/docs/api-keys.md +7 -6
- package/docs/api.md +10 -10
- package/docs/client-behavior.md +5 -5
- package/docs/coordination.md +52 -62
- package/docs/data-sources.md +1 -1
- 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/server-agent.md +2 -2
- package/docs/how-it-works.md +4 -4
- package/docs/identity.md +2 -1
- package/docs/integration-guide.md +24 -13
- 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 +2 -2
- package/docs/migration.md +3 -3
- package/docs/quickstart.md +2 -2
- package/docs/react.md +5 -5
- package/docs/schema-contract.md +3 -3
- package/docs/sessions.md +91 -37
- 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 +8 -8
- package/package.json +63 -166
- package/bin/ablo.cjs +0 -39
- package/dist/BaseSyncedStore.d.ts +0 -843
- package/dist/BaseSyncedStore.js +0 -1971
- package/dist/Database.d.ts +0 -323
- package/dist/Database.js +0 -1502
- package/dist/InstanceCache.d.ts +0 -237
- package/dist/InstanceCache.js +0 -1166
- package/dist/LazyReferenceCollection.d.ts +0 -177
- package/dist/LazyReferenceCollection.js +0 -461
- package/dist/Model.d.ts +0 -454
- package/dist/Model.js +0 -919
- package/dist/ModelRegistry.d.ts +0 -225
- package/dist/ModelRegistry.js +0 -539
- package/dist/NetworkMonitor.d.ts +0 -28
- package/dist/NetworkMonitor.js +0 -79
- package/dist/RuntimeContext.d.ts +0 -52
- package/dist/RuntimeContext.js +0 -80
- package/dist/SyncClient.d.ts +0 -541
- package/dist/SyncClient.js +0 -2202
- 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/client/Ablo.d.ts +0 -231
- package/dist/client/Ablo.js +0 -160
- 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 -50
- package/dist/client/createInternalComponents.js +0 -98
- package/dist/client/createModelProxy.d.ts +0 -248
- package/dist/client/createModelProxy.js +0 -884
- package/dist/client/humans.d.ts +0 -69
- package/dist/client/humans.js +0 -78
- 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 -53
- package/dist/client/reactiveEngine.js +0 -688
- 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/storeCluster.d.ts +0 -47
- package/dist/client/storeCluster.js +0 -118
- package/dist/client/storeLifecycle.d.ts +0 -61
- package/dist/client/storeLifecycle.js +0 -231
- 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 -42
- package/dist/context.js +0 -81
- 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/index.d.ts +0 -33
- package/dist/core/index.js +0 -48
- package/dist/docs/catalog.d.ts +0 -72
- package/dist/docs/catalog.js +0 -230
- 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/QueryProcessor.d.ts +0 -75
- package/dist/query/QueryProcessor.js +0 -255
- package/dist/query/client.d.ts +0 -64
- package/dist/query/client.js +0 -138
- package/dist/query/types.d.ts +0 -85
- package/dist/query/types.js +0 -16
- package/dist/react/AbloProvider.d.ts +0 -242
- package/dist/react/AbloProvider.js +0 -458
- 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/createAbloReact.d.ts +0 -56
- package/dist/react/createAbloReact.js +0 -51
- package/dist/react/index.d.ts +0 -62
- package/dist/react/index.js +0 -69
- package/dist/react/internalContext.d.ts +0 -33
- package/dist/react/internalContext.js +0 -3
- package/dist/react/useAblo.d.ts +0 -82
- package/dist/react/useAblo.js +0 -120
- 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 -133
- 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 -42
- package/dist/schema/index.js +0 -80
- 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 -90
- package/dist/schema/serialize.d.ts +0 -115
- package/dist/schema/serialize.js +0 -265
- 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 -83
- package/dist/source/adapter.js +0 -24
- 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/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/storeContract.d.ts +0 -145
- package/dist/storeContract.js +0 -12
- package/dist/stores/DatabaseManager.d.ts +0 -107
- package/dist/stores/DatabaseManager.js +0 -388
- 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/StoreManager.d.ts +0 -114
- package/dist/stores/StoreManager.js +0 -304
- package/dist/stores/SyncActionStore.d.ts +0 -99
- package/dist/stores/SyncActionStore.js +0 -506
- package/dist/stores/openIDBWithTimeout.d.ts +0 -65
- package/dist/stores/openIDBWithTimeout.js +0 -153
- 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 -284
- package/dist/sync/BootstrapFetcher.js +0 -964
- package/dist/sync/ConnectionManager.d.ts +0 -8
- package/dist/sync/ConnectionManager.js +0 -8
- package/dist/sync/OnDemandLoader.d.ts +0 -231
- package/dist/sync/OnDemandLoader.js +0 -743
- 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 -73
- 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 -114
- package/dist/sync/deltaPipeline.js +0 -278
- package/dist/sync/groupChange.d.ts +0 -116
- package/dist/sync/groupChange.js +0 -244
- package/dist/sync/participants.d.ts +0 -132
- package/dist/sync/participants.js +0 -346
- 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 -71
- 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/syncLog/contract.d.ts +0 -20
- package/dist/syncLog/contract.js +0 -19
- package/dist/syncLog/index.d.ts +0 -1
- package/dist/syncLog/index.js +0 -1
- 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 -212
- package/dist/transaction/auth/capability.js +0 -224
- 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 -56
- package/dist/transaction/coordination/awaitClaimGrant.js +0 -124
- package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -84
- package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -108
- 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 -45
- package/dist/transaction/coordination/locator.d.ts +0 -104
- package/dist/transaction/coordination/locator.js +0 -102
- package/dist/transaction/coordination/schema.d.ts +0 -1536
- package/dist/transaction/coordination/schema.js +0 -1177
- package/dist/transaction/coordination/targetConflict.d.ts +0 -2
- package/dist/transaction/coordination/targetConflict.js +0 -107
- 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 -484
- package/dist/transaction/errors.d.ts +0 -428
- package/dist/transaction/errors.js +0 -686
- package/dist/transaction/footprint.d.ts +0 -111
- package/dist/transaction/footprint.js +0 -0
- 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 -285
- package/dist/transaction/plugin.js +0 -106
- 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 -321
- package/dist/transaction/resources/httpResources.js +0 -7
- package/dist/transaction/resources/modelOperations.d.ts +0 -427
- 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 -101
- package/dist/transaction/resources/where.js +0 -115
- 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 -120
- package/dist/transaction/schema/field.js +0 -265
- package/dist/transaction/schema/fieldRef.d.ts +0 -38
- package/dist/transaction/schema/fieldRef.js +0 -11
- 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 -58
- package/dist/transaction/schema/openapi.js +0 -501
- package/dist/transaction/schema/relation.d.ts +0 -204
- 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 -351
- package/dist/transaction/schema/schema.js +0 -325
- 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 -131
- package/dist/transaction/transport/httpClient.js +0 -146
- 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 -1388
- 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 -574
- package/dist/transaction/transport/wsTransport.js +0 -1023
- 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 -550
- 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 -50
- package/dist/transaction/utils/duration.js +0 -77
- 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 -420
- package/dist/transaction/wire/accountResponses.js +0 -290
- package/dist/transaction/wire/auth.d.ts +0 -56
- package/dist/transaction/wire/auth.js +0 -63
- 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 -530
- package/dist/transaction/wire/claims.js +0 -327
- 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 -204
- package/dist/transaction/wire/feedEvent.js +0 -65
- 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 -562
- package/dist/transaction/wire/inboundFrames.js +0 -116
- package/dist/transaction/wire/index.d.ts +0 -54
- package/dist/transaction/wire/index.js +0 -83
- package/dist/transaction/wire/listEnvelope.d.ts +0 -37
- package/dist/transaction/wire/listEnvelope.js +0 -42
- package/dist/transaction/wire/modelMutations.d.ts +0 -31
- package/dist/transaction/wire/modelMutations.js +0 -52
- package/dist/transaction/wire/modelResponses.d.ts +0 -85
- package/dist/transaction/wire/modelResponses.js +0 -43
- package/dist/transaction/wire/modelShape.d.ts +0 -78
- package/dist/transaction/wire/modelShape.js +0 -74
- 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 -661
- package/dist/transactions/mutations/MutationQueue.js +0 -2807
- 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 -165
- package/dist/transactions/mutations/commitPayload.js +0 -152
- package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -63
- package/dist/transactions/mutations/deltaConfirmation.js +0 -235
- 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 -187
- package/dist/transactions/mutations/replayValidation.js +0 -164
- package/dist/utils/mobxSetup.d.ts +0 -53
- package/dist/utils/mobxSetup.js +0 -330
- package/dist/views/QueryView.d.ts +0 -79
- package/dist/views/QueryView.js +0 -218
- package/dist/views/ViewRegistry.d.ts +0 -20
- package/dist/views/ViewRegistry.js +0 -55
- package/dist/views/incrementalView.d.ts +0 -45
- package/dist/views/incrementalView.js +0 -69
- 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
|
@@ -1,115 +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
|
-
import { AbloValidationError } from '../errors.js';
|
|
17
|
-
/**
|
|
18
|
-
* The comparison operators a {@link WhereClause} may use: equality and
|
|
19
|
-
* inequality, ordering, set membership (`IN` / `NOT IN`), null checks
|
|
20
|
-
* (`IS` / `IS NOT`), and case-sensitive or case-insensitive pattern
|
|
21
|
-
* matching (`LIKE`, `ILIKE`, and their negations).
|
|
22
|
-
*/
|
|
23
|
-
export const whereOpSchema = z.enum([
|
|
24
|
-
'=',
|
|
25
|
-
'!=',
|
|
26
|
-
'<',
|
|
27
|
-
'<=',
|
|
28
|
-
'>',
|
|
29
|
-
'>=',
|
|
30
|
-
'IN',
|
|
31
|
-
'NOT IN',
|
|
32
|
-
'IS',
|
|
33
|
-
'IS NOT',
|
|
34
|
-
'LIKE',
|
|
35
|
-
'NOT LIKE',
|
|
36
|
-
'ILIKE',
|
|
37
|
-
'NOT ILIKE',
|
|
38
|
-
]);
|
|
39
|
-
/**
|
|
40
|
-
* How each operator binds its operand — the classification a compiler needs
|
|
41
|
-
* before it can render or evaluate a condition: a scalar on the right, an array
|
|
42
|
-
* to expand, or a null check with no operand at all. `LIKE_OPS` is the subset
|
|
43
|
-
* whose operand is a pattern and therefore needs pattern validation.
|
|
44
|
-
*
|
|
45
|
-
* These live here, beside the operators, because every consumer of the grammar
|
|
46
|
-
* needs the same split and there is more than one consumer: a where clause is
|
|
47
|
-
* compiled to SQL on a hosted plane and evaluated in memory against the log on
|
|
48
|
-
* a source plane. Two hand-maintained copies of this split meant the same
|
|
49
|
-
* request could be accepted by one plane and rejected by the other — and the
|
|
50
|
-
* pattern-safety set existed on only one of them.
|
|
51
|
-
*/
|
|
52
|
-
export const WHERE_SCALAR_OPS = new Set([
|
|
53
|
-
'=',
|
|
54
|
-
'!=',
|
|
55
|
-
'<',
|
|
56
|
-
'<=',
|
|
57
|
-
'>',
|
|
58
|
-
'>=',
|
|
59
|
-
'LIKE',
|
|
60
|
-
'NOT LIKE',
|
|
61
|
-
'ILIKE',
|
|
62
|
-
'NOT ILIKE',
|
|
63
|
-
]);
|
|
64
|
-
export const WHERE_ARRAY_OPS = new Set(['IN', 'NOT IN']);
|
|
65
|
-
export const WHERE_NULL_OPS = new Set(['IS', 'IS NOT']);
|
|
66
|
-
export const WHERE_LIKE_OPS = new Set([
|
|
67
|
-
'LIKE',
|
|
68
|
-
'NOT LIKE',
|
|
69
|
-
'ILIKE',
|
|
70
|
-
'NOT ILIKE',
|
|
71
|
-
]);
|
|
72
|
-
/**
|
|
73
|
-
* Does this operator accept this operand? The rule the sets above imply, stated
|
|
74
|
-
* once and thrown once.
|
|
75
|
-
*
|
|
76
|
-
* The sets were collapsed here because two copies of the split let one plane
|
|
77
|
-
* accept a request the other refused. The check that consumes them stayed
|
|
78
|
-
* duplicated — the SQL compiler and the log-plane evaluator each carried their
|
|
79
|
-
* own arity tests and their own wording — which leaves the same gap one step
|
|
80
|
-
* further along: relax `IN` in one evaluator and a request succeeds against a
|
|
81
|
-
* hosted plane and fails against a connected one, with no test in a position to
|
|
82
|
-
* notice.
|
|
83
|
-
*
|
|
84
|
-
* Returns the classification the caller needs next, so the check and the branch
|
|
85
|
-
* are the same statement rather than two that can disagree.
|
|
86
|
-
*/
|
|
87
|
-
export function classifyWhereOperand(op, value) {
|
|
88
|
-
if (WHERE_NULL_OPS.has(op)) {
|
|
89
|
-
if (value !== null) {
|
|
90
|
-
throw new AbloValidationError(`${op} only supports null RHS`, {
|
|
91
|
-
code: 'query_unsupported_operator',
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
return 'null';
|
|
95
|
-
}
|
|
96
|
-
if (WHERE_ARRAY_OPS.has(op)) {
|
|
97
|
-
if (!Array.isArray(value)) {
|
|
98
|
-
throw new AbloValidationError(`${op} requires an array RHS`, {
|
|
99
|
-
code: 'query_unsupported_operator',
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
return 'array';
|
|
103
|
-
}
|
|
104
|
-
if (WHERE_SCALAR_OPS.has(op)) {
|
|
105
|
-
if (Array.isArray(value)) {
|
|
106
|
-
throw new AbloValidationError(`${op} requires a scalar RHS`, {
|
|
107
|
-
code: 'query_unsupported_operator',
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
return 'scalar';
|
|
111
|
-
}
|
|
112
|
-
throw new AbloValidationError(`unsupported operator: ${op}`, {
|
|
113
|
-
code: 'query_unsupported_operator',
|
|
114
|
-
});
|
|
115
|
-
}
|
|
@@ -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,120 +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
|
-
/**
|
|
28
|
-
* The sync-engine metadata describing one field, available at runtime through a
|
|
29
|
-
* model's `fields` map. The {@link field} builders attach it, and the migration
|
|
30
|
-
* planner, type generator, and OpenAPI generator all read it.
|
|
31
|
-
*
|
|
32
|
-
* Declared in `wire/modelShape.ts` and inferred here, not restated: this record
|
|
33
|
-
* crosses the wire twice — serialized into the pushed artifact, and reported
|
|
34
|
-
* back by `GET /api/schema` — so a second declaration would be a copy that
|
|
35
|
-
* drifts in whichever direction nobody is looking.
|
|
36
|
-
*/
|
|
37
|
-
export type { FieldMeta } from '../wire/modelShape.js';
|
|
38
|
-
import type { FieldMeta } from '../wire/modelShape.js';
|
|
39
|
-
/**
|
|
40
|
-
* Extract FieldMeta from a Zod schema. Returns null if no sync-engine
|
|
41
|
-
* metadata is attached (e.g., raw `z.string()` usage).
|
|
42
|
-
*
|
|
43
|
-
* Walks through `.optional()` and `.nullable()` wrappers to find the
|
|
44
|
-
* underlying description.
|
|
45
|
-
*/
|
|
46
|
-
export declare function getFieldMeta(schema: z.ZodType): FieldMeta | null;
|
|
47
|
-
/**
|
|
48
|
-
* Infers a {@link FieldMeta} from a plain Zod schema that carries no field-builder
|
|
49
|
-
* metadata — for example a bare `z.string()`. It unwraps `.optional()`,
|
|
50
|
-
* `.nullable()`, and `.default()` to reach the inner type, then maps that Zod type
|
|
51
|
-
* to a sync-engine type tag. Most callers should use {@link resolveFieldMeta}
|
|
52
|
-
* instead, which tries the attached metadata first and falls back to this.
|
|
53
|
-
*/
|
|
54
|
-
export declare function inferFieldMetaFromZod(schema: z.ZodType): FieldMeta;
|
|
55
|
-
/**
|
|
56
|
-
* Resolves a {@link FieldMeta} for any Zod schema, whether it was built with a
|
|
57
|
-
* {@link field} builder (which attaches metadata) or with plain Zod (which needs
|
|
58
|
-
* inference). This is the single entry point for "given a Zod field, tell me its
|
|
59
|
-
* sync-engine type tag and whether it is optional"; the model and query builders use
|
|
60
|
-
* it to populate their field maps, and the serializer reads those maps.
|
|
61
|
-
*
|
|
62
|
-
* It always returns a value and never returns null. A Zod type it does not recognize
|
|
63
|
-
* falls through to the `string` tag by design.
|
|
64
|
-
*/
|
|
65
|
-
export declare function resolveFieldMeta(schema: z.ZodType): FieldMeta;
|
|
66
|
-
/** A Zod schema returned by a {@link field} builder — the underlying Zod type plus
|
|
67
|
-
* two chainable methods: `indexed()` marks the field for a database index, and
|
|
68
|
-
* `from(column)` overrides the physical column name it maps to. */
|
|
69
|
-
export type FieldBuilder<T extends z.ZodType> = T & {
|
|
70
|
-
indexed(): FieldBuilder<T>;
|
|
71
|
-
from(column: string): FieldBuilder<T>;
|
|
72
|
-
};
|
|
73
|
-
export declare const field: {
|
|
74
|
-
/** Defines a text field. */
|
|
75
|
-
readonly string: () => FieldBuilder<z.ZodString>;
|
|
76
|
-
/** Defines a numeric field. */
|
|
77
|
-
readonly number: () => FieldBuilder<z.ZodNumber>;
|
|
78
|
-
/** Defines a true/false field. */
|
|
79
|
-
readonly boolean: () => FieldBuilder<z.ZodBoolean>;
|
|
80
|
-
/** Defines a timestamp field, represented as a JavaScript `Date`. */
|
|
81
|
-
readonly date: () => FieldBuilder<z.ZodDate>;
|
|
82
|
-
/** Defines a field constrained to a fixed set of string values. */
|
|
83
|
-
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>>;
|
|
84
|
-
/**
|
|
85
|
-
* Defines a JSON field, with three call shapes:
|
|
86
|
-
*
|
|
87
|
-
* ```ts
|
|
88
|
-
* field.json() // unknown JSON blob
|
|
89
|
-
* field.json(z.array(z.string())) // typed JSON with Zod schema
|
|
90
|
-
* field.json({ icon: z.string().default('default') }) // typed sub-properties with defaults
|
|
91
|
-
* ```
|
|
92
|
-
*
|
|
93
|
-
* The third form is especially handy for metadata fields. It wraps the plain
|
|
94
|
-
* object in `z.object()` automatically, and the model runtime adds a
|
|
95
|
-
* `${field}Json` getter that parses the JSON string on read, applies the Zod
|
|
96
|
-
* defaults, and caches the result.
|
|
97
|
-
*
|
|
98
|
-
* Example:
|
|
99
|
-
* ```ts
|
|
100
|
-
* const reports = model({
|
|
101
|
-
* metadata: field.json({
|
|
102
|
-
* icon: z.string().default('report'),
|
|
103
|
-
* color: z.string().default('#F59E0B'),
|
|
104
|
-
* summary: z.string().optional(),
|
|
105
|
-
* }),
|
|
106
|
-
* });
|
|
107
|
-
*
|
|
108
|
-
* // At runtime:
|
|
109
|
-
* report.metadata // raw JSON string (unchanged)
|
|
110
|
-
* report.metadataJson // { icon: 'report', color: '#F59E0B', summary: undefined }
|
|
111
|
-
* report.metadataJson.icon // 'report' (typed, with default)
|
|
112
|
-
* ```
|
|
113
|
-
*/
|
|
114
|
-
readonly json: <T extends z.ZodType = z.ZodUnknown>(schemaOrShape?: T | z.ZodRawShape) => FieldBuilder<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
115
|
-
/** Defines an indexed text field — shorthand for `field.string().indexed()`. */
|
|
116
|
-
readonly id: () => FieldBuilder<z.ZodString>;
|
|
117
|
-
};
|
|
118
|
-
/** Marks a Zod schema as indexed so lookups on it use a database index. This is the
|
|
119
|
-
* standalone-function form of the `.indexed()` chain method. */
|
|
120
|
-
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
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A reference to one field of one model — the field as a value rather than as
|
|
3
|
-
* a quoted name.
|
|
4
|
-
*
|
|
5
|
-
* A model is declared as Zod schemas keyed by name, so a field's name lives on
|
|
6
|
-
* the object key and never on the value: `model({ status: z.enum([...]) })`
|
|
7
|
-
* gives you nothing to point at, and every surface that needs to name a field
|
|
8
|
-
* has had to quote it. `fields: ['titel']` then compiles, is granted, excludes
|
|
9
|
-
* nobody, and leaves the write of `title` unguarded — the conflict rule
|
|
10
|
-
* compares names as opaque strings, so an invented one matches no other claim
|
|
11
|
-
* and nothing reports it.
|
|
12
|
-
*
|
|
13
|
-
* {@link Schema.fields} carries one of these per field, stamped from the key
|
|
14
|
-
* `defineSchema` is already holding. Referencing a field that does not exist
|
|
15
|
-
* stops compiling, and renaming one is a compile error at every use rather than
|
|
16
|
-
* a claim that quietly stops matching.
|
|
17
|
-
*
|
|
18
|
-
* An object rather than a branded string, for the reason `ClaimPart` is one: a
|
|
19
|
-
* brand makes a concrete schema's claim params mutually unassignable with the
|
|
20
|
-
* erased `SchemaRecord` view, and the react context boundary erases and
|
|
21
|
-
* restores exactly that way. Objects stay pairwise comparable across it, which
|
|
22
|
-
* a union of literal keys does not — function parameters are contravariant, so
|
|
23
|
-
* a claim accepting `'title' | 'status'` is not assignable to one accepting
|
|
24
|
-
* `string`.
|
|
25
|
-
*
|
|
26
|
-
* `model` rides along so a reference carries where it came from. Claiming
|
|
27
|
-
* `users.email` through `ablo.tasks` is a mistake nothing can currently see.
|
|
28
|
-
*/
|
|
29
|
-
export interface FieldRef {
|
|
30
|
-
/** The schema key of the model this field belongs to. */
|
|
31
|
-
readonly model: string;
|
|
32
|
-
/** The field's own name — the key it was declared under. */
|
|
33
|
-
readonly field: string;
|
|
34
|
-
}
|
|
35
|
-
/** Whether a value is a {@link FieldRef}. */
|
|
36
|
-
export declare function isFieldRef(value: unknown): value is FieldRef;
|
|
37
|
-
/** Build the reference for one declared field. */
|
|
38
|
-
export declare function fieldRef(model: string, field: string): FieldRef;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/** Whether a value is a {@link FieldRef}. */
|
|
2
|
-
export function isFieldRef(value) {
|
|
3
|
-
return (typeof value === 'object' &&
|
|
4
|
-
value !== null &&
|
|
5
|
-
typeof value.field === 'string' &&
|
|
6
|
-
typeof value.model === 'string');
|
|
7
|
-
}
|
|
8
|
-
/** Build the reference for one declared field. */
|
|
9
|
-
export function fieldRef(model, field) {
|
|
10
|
-
return { model, field };
|
|
11
|
-
}
|