@abloatai/ablo 0.34.1 → 0.36.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 -1
- package/CHANGELOG.md +758 -5
- package/README.md +56 -502
- package/bin/ablo.cjs +39 -0
- package/dist/BaseSyncedStore.d.ts +176 -48
- package/dist/BaseSyncedStore.js +346 -214
- package/dist/Database.d.ts +17 -44
- package/dist/Database.js +96 -79
- package/dist/InstanceCache.d.ts +31 -6
- package/dist/InstanceCache.js +65 -30
- package/dist/LazyReferenceCollection.d.ts +3 -3
- package/dist/LazyReferenceCollection.js +4 -4
- package/dist/Model.d.ts +23 -13
- package/dist/Model.js +27 -17
- package/dist/ModelRegistry.d.ts +8 -4
- package/dist/ModelRegistry.js +20 -18
- package/dist/NetworkMonitor.d.ts +3 -1
- package/dist/NetworkMonitor.js +7 -5
- package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
- package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
- package/dist/SyncClient.d.ts +47 -47
- package/dist/SyncClient.js +215 -156
- package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
- package/dist/ai-sdk/coordinatedTool.js +1 -1
- package/dist/ai-sdk/coordinationContext.d.ts +2 -2
- package/dist/ai-sdk/coordinationContext.js +1 -1
- package/dist/ai-sdk/wrap.d.ts +3 -3
- package/dist/ai-sdk/wrap.js +2 -2
- package/dist/auth/index.d.ts +1 -156
- package/dist/auth/index.js +8 -301
- package/dist/client/Ablo.d.ts +42 -287
- package/dist/client/Ablo.js +129 -963
- package/dist/client/abloClient.d.ts +309 -0
- package/dist/client/abloClient.js +13 -0
- package/dist/client/clientPrelude.d.ts +52 -0
- package/dist/client/clientPrelude.js +60 -0
- package/dist/client/consoleLogger.d.ts +2 -2
- package/dist/client/coreClient.d.ts +60 -0
- package/dist/client/coreClient.js +118 -0
- package/dist/client/createInternalComponents.d.ts +8 -4
- package/dist/client/createInternalComponents.js +17 -10
- package/dist/client/createModelProxy.d.ts +98 -373
- package/dist/client/createModelProxy.js +233 -139
- package/dist/client/humans.d.ts +69 -0
- package/dist/client/humans.js +78 -0
- package/dist/client/modelRegistration.d.ts +1 -1
- package/dist/client/modelRegistration.js +9 -9
- package/dist/client/options.d.ts +73 -17
- package/dist/client/reactiveEngine.d.ts +53 -0
- package/dist/client/reactiveEngine.js +688 -0
- package/dist/client/resourceTypes.d.ts +9 -250
- package/dist/client/resourceTypes.js +8 -5
- package/dist/client/schemaConfig.d.ts +4 -4
- package/dist/client/schemaConfig.js +6 -2
- package/dist/client/storeCluster.d.ts +47 -0
- package/dist/client/storeCluster.js +118 -0
- package/dist/client/storeLifecycle.d.ts +61 -0
- package/dist/client/storeLifecycle.js +231 -0
- package/dist/client/validateAbloOptions.d.ts +3 -2
- package/dist/client/validateAbloOptions.js +1 -1
- package/dist/client/wsMutationExecutor.d.ts +3 -3
- package/dist/client/wsMutationExecutor.js +3 -3
- package/dist/context.d.ts +22 -9
- package/dist/context.js +33 -9
- package/dist/coordination/ClaimLog.d.ts +26 -0
- package/dist/coordination/ClaimLog.js +32 -0
- package/dist/coordination/index.d.ts +1 -15
- package/dist/coordination/index.js +8 -31
- package/dist/core/index.d.ts +3 -3
- package/dist/core/index.js +2 -2
- package/dist/docs/catalog.d.ts +72 -0
- package/dist/docs/catalog.js +230 -0
- package/dist/docs/index.d.ts +10 -0
- package/dist/docs/index.js +10 -0
- package/dist/environment.d.ts +1 -40
- package/dist/environment.js +8 -37
- package/dist/index.d.ts +44 -36
- package/dist/index.js +30 -22
- package/dist/interfaces/index.d.ts +44 -134
- package/dist/keys/index.d.ts +1 -77
- package/dist/keys/index.js +8 -190
- package/dist/mutators/{RecordingTransaction.d.ts → RecordingMutation.d.ts} +4 -4
- package/dist/mutators/{RecordingTransaction.js → RecordingMutation.js} +2 -2
- package/dist/mutators/Transaction.d.ts +1 -1
- package/dist/mutators/Transaction.js +1 -1
- package/dist/mutators/UndoManager.d.ts +6 -6
- package/dist/mutators/UndoManager.js +5 -5
- package/dist/mutators/defineMutators.d.ts +3 -3
- package/dist/mutators/defineMutators.js +1 -1
- package/dist/mutators/inverseOp.js +2 -2
- package/dist/mutators/mutateActions.d.ts +3 -3
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +1 -1
- package/dist/mutators/undoApply.d.ts +1 -1
- package/dist/mutators/undoApply.js +1 -1
- package/dist/policy/index.d.ts +2 -2
- package/dist/policy/index.js +1 -1
- package/dist/query/client.d.ts +5 -2
- package/dist/query/client.js +10 -9
- package/dist/query/types.d.ts +6 -41
- package/dist/query/types.js +2 -2
- package/dist/react/AbloProvider.d.ts +18 -8
- package/dist/react/AbloProvider.js +10 -9
- package/dist/react/context.d.ts +3 -3
- package/dist/react/context.js +1 -1
- package/dist/react/createAbloReact.d.ts +56 -0
- package/dist/react/createAbloReact.js +51 -0
- package/dist/react/index.d.ts +6 -5
- package/dist/react/index.js +6 -3
- package/dist/react/internalContext.d.ts +1 -1
- package/dist/react/useAblo.d.ts +12 -5
- package/dist/react/useAblo.js +26 -8
- package/dist/react/useCurrentUserId.js +1 -1
- package/dist/react/useErrorListener.js +1 -1
- package/dist/react/useMutationFailureListener.d.ts +2 -2
- package/dist/react/useMutationFailureListener.js +1 -1
- package/dist/react/useMutators.d.ts +3 -3
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useUndoScope.d.ts +5 -5
- package/dist/react/useUndoScope.js +1 -1
- package/dist/schema/coordination.d.ts +69 -10
- package/dist/schema/coordination.js +90 -9
- package/dist/schema/ddl.js +2 -2
- package/dist/schema/diff.d.ts +1 -1
- package/dist/schema/generate.js +1 -1
- package/dist/schema/index.d.ts +11 -10
- package/dist/schema/index.js +22 -18
- package/dist/schema/queries.d.ts +27 -27
- package/dist/schema/queries.js +23 -23
- package/dist/schema/select.d.ts +3 -3
- package/dist/schema/select.js +6 -3
- package/dist/schema/serialize.d.ts +15 -6
- package/dist/schema/serialize.js +20 -3
- package/dist/schema/sugar.d.ts +6 -7
- package/dist/schema/sugar.js +9 -12
- package/dist/schema/syncDeltaRow.d.ts +4 -152
- package/dist/schema/syncDeltaRow.js +4 -105
- package/dist/server/adapter.d.ts +18 -1
- package/dist/server/commit.d.ts +10 -16
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +1 -1
- package/dist/source/adapter.d.ts +7 -5
- package/dist/source/adapter.js +7 -5
- package/dist/source/adapters/drizzle.d.ts +1 -1
- package/dist/source/adapters/drizzle.js +2 -2
- package/dist/source/adapters/kysely.d.ts +1 -1
- package/dist/source/adapters/kysely.js +1 -1
- package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
- package/dist/source/adapters/kyselyMutationCore.js +2 -2
- package/dist/source/adapters/memory.js +1 -1
- package/dist/source/adapters/prisma.d.ts +8 -3
- package/dist/source/adapters/prisma.js +1 -1
- package/dist/source/connector.js +1 -1
- package/dist/source/connectorProtocol.d.ts +2 -8
- package/dist/source/connectorProtocol.js +3 -2
- package/dist/source/contract.d.ts +29 -17
- package/dist/source/contract.js +27 -22
- package/dist/source/factory.d.ts +1 -1
- package/dist/source/idempotency.js +2 -2
- package/dist/source/index.d.ts +1 -0
- package/dist/source/index.js +3 -0
- package/dist/source/next.d.ts +1 -1
- package/dist/source/signing.d.ts +9 -2
- package/dist/source/signing.js +4 -1
- package/dist/source/types.d.ts +6 -4
- package/dist/source/types.js +1 -1
- package/dist/{core/storeContract.d.ts → storeContract.d.ts} +6 -6
- package/dist/{core → stores}/DatabaseManager.d.ts +3 -1
- package/dist/{core → stores}/DatabaseManager.js +14 -13
- package/dist/stores/ObjectStore.d.ts +1 -1
- package/dist/{core → stores}/StoreManager.d.ts +9 -26
- package/dist/{core → stores}/StoreManager.js +29 -77
- package/dist/stores/SyncActionStore.d.ts +4 -2
- package/dist/stores/SyncActionStore.js +11 -17
- package/dist/stores/syncAction.d.ts +26 -0
- package/dist/stores/syncAction.js +16 -0
- package/dist/surface.d.ts +3 -3
- package/dist/surface.js +6 -4
- package/dist/sync/BootstrapFetcher.d.ts +127 -6
- package/dist/sync/BootstrapFetcher.js +511 -83
- package/dist/sync/ConnectionManager.d.ts +6 -198
- package/dist/sync/ConnectionManager.js +6 -677
- package/dist/sync/OnDemandLoader.d.ts +5 -2
- package/dist/sync/OnDemandLoader.js +61 -21
- package/dist/sync/SubscriptionManager.d.ts +13 -2
- package/dist/sync/SubscriptionManager.js +23 -5
- package/dist/sync/SyncWebSocket.d.ts +27 -510
- package/dist/sync/SyncWebSocket.js +76 -954
- package/dist/sync/awaitClaimGrant.d.ts +4 -44
- package/dist/sync/awaitClaimGrant.js +4 -109
- package/dist/sync/bootstrapApply.d.ts +3 -0
- package/dist/sync/bootstrapApply.js +2 -2
- package/dist/sync/commitFrames.d.ts +6 -40
- package/dist/sync/commitFrames.js +6 -97
- package/dist/sync/contextPorts.d.ts +18 -0
- package/dist/sync/contextPorts.js +31 -0
- package/dist/sync/createClaimStream.d.ts +5 -49
- package/dist/sync/createClaimStream.js +5 -469
- package/dist/sync/createPresenceStream.d.ts +26 -4
- package/dist/sync/createPresenceStream.js +28 -20
- package/dist/sync/createSnapshot.d.ts +2 -2
- package/dist/sync/createSnapshot.js +1 -1
- package/dist/sync/credentialLifecycle.d.ts +5 -173
- package/dist/sync/credentialLifecycle.js +5 -320
- package/dist/sync/deltaPipeline.d.ts +13 -12
- package/dist/sync/deltaPipeline.js +21 -4
- package/dist/sync/groupChange.d.ts +3 -0
- package/dist/sync/groupChange.js +16 -14
- package/dist/sync/participants.d.ts +24 -6
- package/dist/sync/participants.js +32 -23
- package/dist/sync/schemaDrift.d.ts +55 -0
- package/dist/sync/schemaDrift.js +53 -0
- package/dist/sync/schemas.d.ts +23 -33
- package/dist/sync/schemas.js +29 -20
- package/dist/sync/syncPlan.d.ts +3 -3
- package/dist/sync/wsFrameHandlers.d.ts +6 -114
- package/dist/sync/wsFrameHandlers.js +6 -392
- package/dist/syncLog/contract.d.ts +20 -0
- package/dist/syncLog/contract.js +19 -0
- package/dist/syncLog/index.d.ts +1 -0
- package/dist/syncLog/index.js +1 -0
- package/dist/transaction/ablo.d.ts +88 -0
- package/dist/transaction/ablo.js +33 -0
- package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
- package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
- package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
- package/dist/transaction/auth/bootstrapScope.js +1 -0
- package/dist/transaction/auth/capability.d.ts +212 -0
- package/dist/transaction/auth/capability.js +224 -0
- package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
- package/dist/{client → transaction/auth}/identity.d.ts +8 -7
- package/dist/{client → transaction/auth}/identity.js +1 -1
- package/dist/transaction/auth/index.d.ts +162 -0
- package/dist/transaction/auth/index.js +304 -0
- package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
- package/dist/{auth → transaction/auth}/schemas.js +13 -13
- package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
- package/dist/{client → transaction/auth}/sessionMint.js +4 -7
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +56 -0
- package/dist/transaction/coordination/awaitClaimGrant.js +124 -0
- package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +34 -0
- package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +20 -0
- package/dist/transaction/coordination/claimMeta.d.ts +49 -0
- package/dist/transaction/coordination/claimMeta.js +52 -0
- package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
- package/dist/transaction/coordination/createClaimStream.js +475 -0
- package/dist/transaction/coordination/events.d.ts +74 -0
- package/dist/transaction/coordination/events.js +7 -0
- package/dist/transaction/coordination/index.d.ts +19 -0
- package/dist/transaction/coordination/index.js +45 -0
- package/dist/transaction/coordination/locator.d.ts +104 -0
- package/dist/transaction/coordination/locator.js +102 -0
- package/dist/transaction/coordination/schema.d.ts +1536 -0
- package/dist/transaction/coordination/schema.js +1177 -0
- package/dist/transaction/coordination/targetConflict.d.ts +2 -0
- package/dist/transaction/coordination/targetConflict.js +107 -0
- package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
- package/dist/{coordination → transaction/coordination}/trace.js +18 -25
- package/dist/transaction/durableWrites.d.ts +62 -0
- package/dist/{client → transaction}/durableWrites.js +28 -3
- package/dist/transaction/environment.d.ts +105 -0
- package/dist/transaction/environment.js +108 -0
- package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +12 -12
- package/dist/{errorCodes.js → transaction/errorCodes.js} +45 -18
- package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
- package/dist/{errors.js → transaction/errors.js} +85 -16
- package/dist/transaction/footprint.d.ts +111 -0
- package/dist/transaction/footprint.js +0 -0
- package/dist/transaction/index.d.ts +20 -0
- package/dist/transaction/index.js +20 -0
- package/dist/transaction/keys/index.d.ts +87 -0
- package/dist/transaction/keys/index.js +207 -0
- package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
- package/dist/transaction/log/syncDeltaRow.js +95 -0
- package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
- package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
- package/dist/transaction/logger.d.ts +16 -0
- package/dist/transaction/logger.js +7 -0
- package/dist/transaction/observability.d.ts +53 -0
- package/dist/transaction/observability.js +19 -0
- package/dist/transaction/plugin.d.ts +285 -0
- package/dist/transaction/plugin.js +106 -0
- package/dist/{policy → transaction/policy}/types.d.ts +3 -3
- package/dist/{policy → transaction/policy}/types.js +2 -0
- package/dist/transaction/resources/httpResources.d.ts +321 -0
- package/dist/transaction/resources/httpResources.js +7 -0
- package/dist/transaction/resources/modelOperations.d.ts +427 -0
- package/dist/transaction/resources/modelOperations.js +12 -0
- package/dist/transaction/resources/mutationOptions.d.ts +66 -0
- package/dist/transaction/resources/mutationOptions.js +9 -0
- package/dist/transaction/resources/where.d.ts +101 -0
- package/dist/transaction/resources/where.js +115 -0
- package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
- package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
- package/dist/{schema → transaction/schema}/field.d.ts +17 -23
- package/dist/{schema → transaction/schema}/field.js +5 -5
- package/dist/transaction/schema/fieldRef.d.ts +38 -0
- package/dist/transaction/schema/fieldRef.js +11 -0
- package/dist/transaction/schema/loadStrategy.d.ts +45 -0
- package/dist/transaction/schema/loadStrategy.js +46 -0
- package/dist/{schema → transaction/schema}/model.d.ts +50 -35
- package/dist/{schema → transaction/schema}/model.js +30 -20
- package/dist/transaction/schema/openapi.d.ts +58 -0
- package/dist/transaction/schema/openapi.js +501 -0
- package/dist/{schema → transaction/schema}/relation.d.ts +21 -16
- package/dist/{schema → transaction/schema}/relation.js +7 -7
- package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
- package/dist/{schema → transaction/schema}/residency.js +0 -5
- package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
- package/dist/{schema → transaction/schema}/roles.js +5 -5
- package/dist/{schema → transaction/schema}/schema.d.ts +39 -10
- package/dist/{schema → transaction/schema}/schema.js +24 -3
- package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
- package/dist/{schema → transaction/schema}/tenancy.js +7 -4
- package/dist/transaction/transactionLayer.d.ts +82 -0
- package/dist/transaction/transactionLayer.js +24 -0
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +5 -6
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
- package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +11 -37
- package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
- package/dist/transaction/transport/commitFrames.d.ts +90 -0
- package/dist/transaction/transport/commitFrames.js +134 -0
- package/dist/transaction/transport/connectionManager.d.ts +215 -0
- package/dist/transaction/transport/connectionManager.js +673 -0
- package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
- package/dist/transaction/transport/credentialLifecycle.js +324 -0
- package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
- package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
- package/dist/transaction/transport/httpClient.d.ts +131 -0
- package/dist/{client → transaction/transport}/httpClient.js +6 -5
- package/dist/transaction/transport/httpOptions.d.ts +33 -0
- package/dist/transaction/transport/httpOptions.js +12 -0
- package/dist/{client → transaction/transport}/httpTransport.js +295 -97
- package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
- package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
- package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
- package/dist/transaction/transport/wsFrameHandlers.js +429 -0
- package/dist/transaction/transport/wsTransport.d.ts +574 -0
- package/dist/transaction/transport/wsTransport.js +1023 -0
- package/dist/transaction/types/assertExact.d.ts +17 -0
- package/dist/transaction/types/assertExact.js +1 -0
- package/dist/{types → transaction/types}/global.d.ts +17 -2
- package/dist/{types → transaction/types}/global.js +2 -1
- package/dist/{types → transaction/types}/index.d.ts +14 -46
- package/dist/{types → transaction/types}/index.js +7 -16
- package/dist/{types → transaction/types}/streams.d.ts +73 -45
- package/dist/transaction/utils/duration.d.ts +50 -0
- package/dist/{utils → transaction/utils}/duration.js +32 -0
- package/dist/{utils → transaction/utils}/json.d.ts +18 -0
- package/dist/transaction/utils/json.js +276 -0
- package/dist/transaction/wire/accountResponses.d.ts +420 -0
- package/dist/transaction/wire/accountResponses.js +290 -0
- package/dist/transaction/wire/auth.d.ts +56 -0
- package/dist/transaction/wire/auth.js +63 -0
- package/dist/transaction/wire/claimEvent.d.ts +76 -0
- package/dist/transaction/wire/claimEvent.js +73 -0
- package/dist/transaction/wire/claims.d.ts +530 -0
- package/dist/transaction/wire/claims.js +327 -0
- package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
- package/dist/{wire → transaction/wire}/commit.js +68 -47
- package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
- package/dist/{wire → transaction/wire}/delta.js +37 -13
- package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
- package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
- package/dist/transaction/wire/feedCursor.d.ts +60 -0
- package/dist/transaction/wire/feedCursor.js +82 -0
- package/dist/transaction/wire/feedEvent.d.ts +204 -0
- package/dist/transaction/wire/feedEvent.js +65 -0
- package/dist/transaction/wire/frames.d.ts +194 -0
- package/dist/transaction/wire/frames.js +50 -0
- package/dist/transaction/wire/inboundFrames.d.ts +562 -0
- package/dist/transaction/wire/inboundFrames.js +116 -0
- package/dist/transaction/wire/index.d.ts +54 -0
- package/dist/transaction/wire/index.js +83 -0
- package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
- package/dist/transaction/wire/listEnvelope.js +42 -0
- package/dist/transaction/wire/modelMutations.d.ts +31 -0
- package/dist/transaction/wire/modelMutations.js +52 -0
- package/dist/transaction/wire/modelResponses.d.ts +85 -0
- package/dist/transaction/wire/modelResponses.js +43 -0
- package/dist/transaction/wire/modelShape.d.ts +78 -0
- package/dist/transaction/wire/modelShape.js +74 -0
- package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +85 -38
- package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +141 -80
- package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
- package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
- package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
- package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
- package/dist/transactions/mutations/commitLatency.d.ts +52 -0
- package/dist/transactions/mutations/commitLatency.js +130 -0
- package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
- package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
- package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +18 -16
- package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +15 -15
- package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +15 -11
- package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +14 -12
- package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
- package/dist/transactions/mutations/durableWriteStore.js +12 -0
- package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
- package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +4 -3
- package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +7 -5
- package/dist/utils/mobxSetup.d.ts +1 -1
- package/dist/utils/mobxSetup.js +5 -2
- package/dist/{core → views}/QueryView.d.ts +2 -2
- package/dist/{core → views}/QueryView.js +2 -2
- package/dist/{core → views}/ViewRegistry.d.ts +1 -1
- package/dist/{core/queryUtils.d.ts → views/incrementalView.d.ts} +6 -6
- package/dist/{core/queryUtils.js → views/incrementalView.js} +6 -6
- package/dist/webhooks/events.d.ts +2 -2
- package/dist/wire/index.d.ts +1 -34
- package/dist/wire/index.js +8 -49
- package/docs/agent-messaging.md +3 -3
- package/docs/agents.md +20 -13
- package/docs/api-keys.md +14 -10
- package/docs/api.md +27 -61
- package/docs/audit.md +6 -3
- package/docs/cli.md +41 -13
- package/docs/client-behavior.md +11 -9
- package/docs/concurrency-convention.md +49 -57
- package/docs/coordination.md +283 -121
- package/docs/data-sources.md +7 -5
- package/docs/debugging.md +39 -15
- package/docs/deployment.md +267 -0
- package/docs/examples/agent-human.md +49 -42
- package/docs/examples/ai-sdk-tool.md +69 -44
- package/docs/examples/existing-python-backend.md +8 -6
- package/docs/examples/nextjs.md +129 -47
- package/docs/examples/scoped-agent.md +46 -45
- package/docs/examples/server-agent.md +46 -26
- package/docs/groups.md +87 -30
- package/docs/guarantees.md +41 -12
- package/docs/how-it-works.md +38 -12
- package/docs/idempotency.md +126 -0
- package/docs/identity.md +77 -74
- package/docs/index.md +172 -86
- package/docs/integration-guide.md +31 -19
- package/docs/mcp.md +46 -21
- package/docs/migration.md +95 -18
- package/docs/operating-on-your-database.md +3 -1
- package/docs/projects.md +3 -1
- package/docs/quickstart.md +22 -5
- package/docs/react.md +31 -18
- package/docs/schema-contract.md +5 -3
- package/docs/session-settings.md +108 -0
- package/docs/sessions.md +4 -2
- package/docs/webhooks.md +12 -10
- package/llms.txt +48 -18
- package/package.json +21 -26
- package/dist/agent/Agent.d.ts +0 -366
- package/dist/agent/Agent.js +0 -514
- package/dist/agent/index.d.ts +0 -115
- package/dist/agent/index.js +0 -128
- package/dist/agent/session.d.ts +0 -93
- package/dist/agent/session.js +0 -149
- package/dist/agent/types.d.ts +0 -68
- package/dist/agent/types.js +0 -9
- package/dist/cli.cjs +0 -286329
- package/dist/client/durableWrites.d.ts +0 -21
- package/dist/client/httpClient.d.ts +0 -80
- package/dist/coordination/schema.d.ts +0 -722
- package/dist/coordination/schema.js +0 -578
- package/dist/schema/openapi.d.ts +0 -29
- package/dist/schema/openapi.js +0 -124
- 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/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 -192
- 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 -71
- 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/transactions/durableWriteStore.js +0 -30
- package/dist/utils/duration.d.ts +0 -25
- package/dist/utils/json.js +0 -88
- package/dist/wire/errorEnvelope.d.ts +0 -55
- package/dist/wire/frames.d.ts +0 -197
- package/dist/wire/frames.js +0 -49
- package/dist/wire/listEnvelope.js +0 -18
- package/docs/interaction-model.md +0 -97
- /package/dist/{core → query}/QueryProcessor.d.ts +0 -0
- /package/dist/{core → query}/QueryProcessor.js +0 -0
- /package/dist/{core/storeContract.js → storeContract.js} +0 -0
- /package/dist/{core → stores}/openIDBWithTimeout.d.ts +0 -0
- /package/dist/{core → stores}/openIDBWithTimeout.js +0 -0
- /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
- /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
- /package/dist/{client → transaction}/persistence.d.ts +0 -0
- /package/dist/{client → transaction}/persistence.js +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
- /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.js +0 -0
- /package/dist/{types → transaction/types}/participant.d.ts +0 -0
- /package/dist/{types → transaction/types}/participant.js +0 -0
- /package/dist/{types → transaction/types}/streams.js +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
- /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocol.js +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
- /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
- /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
- /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.js} +0 -0
- /package/dist/{core → views}/ViewRegistry.js +0 -0
package/dist/keys/index.js
CHANGED
|
@@ -1,190 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
*
|
|
9
|
-
* A key looks like `<sk|rk|ek|pk>_<live|test>_<30 base62 chars><6-char base62
|
|
10
|
-
* CRC32 checksum>`. The middle segment is the stable environment prefix, mapped
|
|
11
|
-
* on parse to `production` or `sandbox`. The recognizable prefix lets secret
|
|
12
|
-
* scanners spot a leaked key, and the trailing checksum lets the format reject a
|
|
13
|
-
* mistyped or forged key locally, without a database round-trip. Older keys
|
|
14
|
-
* (roughly a 43-character base64url body with no checksum) still validate by hash
|
|
15
|
-
* and parse here with `checksummed: false`.
|
|
16
|
-
*/
|
|
17
|
-
import { createHash, randomBytes } from 'node:crypto';
|
|
18
|
-
import { z } from 'zod';
|
|
19
|
-
import { ENVIRONMENTS, environmentFromKeyPrefix, environmentToKeyPrefix, } from '../environment.js';
|
|
20
|
-
// ── Vocabulary ──────────────────────────────────────────────────────────
|
|
21
|
-
// The four key kinds:
|
|
22
|
-
// secret (sk_) — backend and server-to-server use, including agents. Full
|
|
23
|
-
// authority; never expose one in a browser.
|
|
24
|
-
// restricted (rk_) — a scoped server key, such as an agent session token or a
|
|
25
|
-
// narrowed capability.
|
|
26
|
-
// ephemeral (ek_) — a short-lived, backend-minted session credential scoped to
|
|
27
|
-
// one user, safe to hand to that user's browser. Carries
|
|
28
|
-
// `participantKind: 'user'` and its baked-in sync groups.
|
|
29
|
-
// publishable (pk_) — a long-lived, browser-safe, organization-scoped read-only
|
|
30
|
-
// key. It is used directly as the bearer token — never
|
|
31
|
-
// exchanged, never expires, nothing to refresh. It grants
|
|
32
|
-
// read access to the organization's data and cannot write or
|
|
33
|
-
// reach any control-plane operation.
|
|
34
|
-
export const API_KEY_KINDS = ['secret', 'restricted', 'ephemeral', 'publishable'];
|
|
35
|
-
export const API_KEY_ENVS = ENVIRONMENTS;
|
|
36
|
-
const PREFIX_BY_KIND = {
|
|
37
|
-
secret: 'sk',
|
|
38
|
-
restricted: 'rk',
|
|
39
|
-
ephemeral: 'ek',
|
|
40
|
-
publishable: 'pk',
|
|
41
|
-
};
|
|
42
|
-
const KIND_BY_PREFIX = {
|
|
43
|
-
sk: 'secret',
|
|
44
|
-
rk: 'restricted',
|
|
45
|
-
ek: 'ephemeral',
|
|
46
|
-
pk: 'publishable',
|
|
47
|
-
};
|
|
48
|
-
const BASE62 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
|
|
49
|
-
/** Random base62 chars before the checksum. */
|
|
50
|
-
const KEY_BODY_LEN = 30;
|
|
51
|
-
/** base62(CRC32): 62^6 (~5.7e10) > 2^32, so a CRC32 always fits in 6 chars. */
|
|
52
|
-
const CHECKSUM_LEN = 6;
|
|
53
|
-
/** A new checksummed body is exactly this long and pure base62. */
|
|
54
|
-
const CHECKSUMMED_BODY_LEN = KEY_BODY_LEN + CHECKSUM_LEN;
|
|
55
|
-
/** `<sk|rk|ek|pk>_<live|test>_<body>`; the body charset covers base62 as well as the legacy base64url form. */
|
|
56
|
-
const KEY_RE = /^(sk|rk|ek|pk)_(live|test)_([0-9A-Za-z\-_]+)$/;
|
|
57
|
-
const BASE62_RE = /^[0-9A-Za-z]+$/;
|
|
58
|
-
// ── Checksum (standard CRC-32, GitHub-compatible) ───────────────────────
|
|
59
|
-
const CRC32_TABLE = (() => {
|
|
60
|
-
const t = new Uint32Array(256);
|
|
61
|
-
for (let n = 0; n < 256; n++) {
|
|
62
|
-
let c = n;
|
|
63
|
-
for (let k = 0; k < 8; k++)
|
|
64
|
-
c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
|
|
65
|
-
t[n] = c >>> 0;
|
|
66
|
-
}
|
|
67
|
-
return t;
|
|
68
|
-
})();
|
|
69
|
-
function crc32(s) {
|
|
70
|
-
let c = 0xffffffff;
|
|
71
|
-
for (let i = 0; i < s.length; i++) {
|
|
72
|
-
// `& 0xff` bounds the index to the 256-entry table — the ?? 0 is unreachable.
|
|
73
|
-
c = ((CRC32_TABLE[(c ^ s.charCodeAt(i)) & 0xff] ?? 0) ^ (c >>> 8)) >>> 0;
|
|
74
|
-
}
|
|
75
|
-
return (c ^ 0xffffffff) >>> 0;
|
|
76
|
-
}
|
|
77
|
-
/** 6-char base62 encoding of the CRC32 of `payload`. */
|
|
78
|
-
function checksum6(payload) {
|
|
79
|
-
let n = crc32(payload);
|
|
80
|
-
let out = '';
|
|
81
|
-
for (let i = 0; i < CHECKSUM_LEN; i++) {
|
|
82
|
-
out = BASE62.charAt(n % 62) + out;
|
|
83
|
-
n = Math.floor(n / 62);
|
|
84
|
-
}
|
|
85
|
-
return out;
|
|
86
|
-
}
|
|
87
|
-
/** `len` cryptographically-random base62 chars (rejection-sampled, no bias). */
|
|
88
|
-
function randomBase62(len) {
|
|
89
|
-
let out = '';
|
|
90
|
-
while (out.length < len) {
|
|
91
|
-
for (const b of randomBytes(len * 2)) {
|
|
92
|
-
if (b < 248) {
|
|
93
|
-
out += BASE62.charAt(b % 62);
|
|
94
|
-
if (out.length === len)
|
|
95
|
-
break;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return out;
|
|
100
|
-
}
|
|
101
|
-
function bodyIsChecksummed(body) {
|
|
102
|
-
return body.length === CHECKSUMMED_BODY_LEN && BASE62_RE.test(body);
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* The Zod schema for an Ablo API key. `parse` and `safeParse` return a typed
|
|
106
|
-
* {@link ParsedApiKey}. A checksummed-format key whose checksum does not match is
|
|
107
|
-
* rejected without any network call; an older key with no checksum parses with
|
|
108
|
-
* `checksummed: false` and is left for the server to validate by hash.
|
|
109
|
-
*/
|
|
110
|
-
export const apiKeySchema = z.string().transform((raw, ctx) => {
|
|
111
|
-
const m = KEY_RE.exec(raw);
|
|
112
|
-
if (!m) {
|
|
113
|
-
ctx.addIssue({ code: 'custom', message: 'not a valid Ablo API key format' });
|
|
114
|
-
return z.NEVER;
|
|
115
|
-
}
|
|
116
|
-
const [, prefix, env, body] = m;
|
|
117
|
-
const kind = prefix === undefined ? undefined : KIND_BY_PREFIX[prefix];
|
|
118
|
-
// Unreachable on a KEY_RE match (all three groups are non-optional and the
|
|
119
|
-
// prefix alternation is exactly the KIND_BY_PREFIX key set) — narrows the
|
|
120
|
-
// regex-group lookups for the checks below.
|
|
121
|
-
if (kind === undefined || env === undefined || body === undefined) {
|
|
122
|
-
ctx.addIssue({ code: 'custom', message: 'not a valid Ablo API key format' });
|
|
123
|
-
return z.NEVER;
|
|
124
|
-
}
|
|
125
|
-
const checksummed = bodyIsChecksummed(body);
|
|
126
|
-
if (checksummed && checksum6(raw.slice(0, -CHECKSUM_LEN)) !== body.slice(KEY_BODY_LEN)) {
|
|
127
|
-
ctx.addIssue({ code: 'custom', message: 'API key checksum mismatch' });
|
|
128
|
-
return z.NEVER;
|
|
129
|
-
}
|
|
130
|
-
return {
|
|
131
|
-
raw,
|
|
132
|
-
kind,
|
|
133
|
-
env: environmentFromKeyPrefix(env),
|
|
134
|
-
body,
|
|
135
|
-
checksummed,
|
|
136
|
-
};
|
|
137
|
-
});
|
|
138
|
-
// ── Derived validators (thin wrappers over the same spec) ───────────────
|
|
139
|
-
/** Parse + fully validate (incl. checksum). Returns null when invalid. */
|
|
140
|
-
export function parseApiKey(raw) {
|
|
141
|
-
const r = apiKeySchema.safeParse(raw);
|
|
142
|
-
return r.success ? r.data : null;
|
|
143
|
-
}
|
|
144
|
-
/** True when the key uses the new checksummed format (regardless of validity). */
|
|
145
|
-
export function isChecksummedKey(raw) {
|
|
146
|
-
const body = KEY_RE.exec(raw)?.[3];
|
|
147
|
-
return body !== undefined && bodyIsChecksummed(body);
|
|
148
|
-
}
|
|
149
|
-
/** Verify the embedded checksum. Meaningful only for checksummed-format keys. */
|
|
150
|
-
export function keyChecksumMatches(raw) {
|
|
151
|
-
const body = KEY_RE.exec(raw)?.[3];
|
|
152
|
-
if (body === undefined || !bodyIsChecksummed(body))
|
|
153
|
-
return false;
|
|
154
|
-
return checksum6(raw.slice(0, -CHECKSUM_LEN)) === body.slice(KEY_BODY_LEN);
|
|
155
|
-
}
|
|
156
|
-
// ── Mint + hash (node:crypto) ───────────────────────────────────────────
|
|
157
|
-
/**
|
|
158
|
-
* Mint a key: `<prefix>_<env>_<body><checksum>`. Returns the plaintext (shown
|
|
159
|
-
* once), its SHA-256 hash (persisted), and the 12-char display prefix.
|
|
160
|
-
*/
|
|
161
|
-
export function generateApiKey(env = 'production', kind = 'secret') {
|
|
162
|
-
const body = randomBase62(KEY_BODY_LEN);
|
|
163
|
-
const payload = `${PREFIX_BY_KIND[kind]}_${environmentToKeyPrefix(env)}_${body}`;
|
|
164
|
-
const plaintext = `${payload}${checksum6(payload)}`;
|
|
165
|
-
return { plaintext, hash: hashApiKey(plaintext), prefix: plaintext.slice(0, 12) };
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* The stable SHA-256 hex digest of a plaintext key, computed both when a key is
|
|
169
|
-
* minted and when one is looked up. A fast hash is the right choice here rather
|
|
170
|
-
* than a password hash like bcrypt: API keys are long random strings, so there is
|
|
171
|
-
* no dictionary of guesses to slow down.
|
|
172
|
-
*/
|
|
173
|
-
export function hashApiKey(plaintext) {
|
|
174
|
-
return createHash('sha256').update(plaintext).digest('hex');
|
|
175
|
-
}
|
|
176
|
-
/** `whsec_` label prefix per the Standard Webhooks spec (not part of the key material). */
|
|
177
|
-
export const WEBHOOK_SECRET_PREFIX = 'whsec_';
|
|
178
|
-
/**
|
|
179
|
-
* Mints a webhook signing secret following the Standard Webhooks specification
|
|
180
|
-
* (https://www.standardwebhooks.com): a base64-encoded random key of 24–64 bytes,
|
|
181
|
-
* labelled with the `whsec_` prefix. This uses 32 bytes (256 bits), comfortably
|
|
182
|
-
* inside that range. Unlike an API key, a signing secret is not hashed at rest,
|
|
183
|
-
* because signing a request with {@link signAbloSourceRequest} needs the live
|
|
184
|
-
* value. It is therefore kept in a secret store, returned to the customer once at
|
|
185
|
-
* creation, and never shown again.
|
|
186
|
-
*/
|
|
187
|
-
export function generateWebhookSecret() {
|
|
188
|
-
const plaintext = `${WEBHOOK_SECRET_PREFIX}${randomBytes(32).toString('base64')}`;
|
|
189
|
-
return { plaintext, last4: plaintext.slice(-4) };
|
|
190
|
-
}
|
|
1
|
+
// Moved to @ablo/transaction (ADR 0013 — the settlement core extraction).
|
|
2
|
+
// This shim re-exports it at the original path so in-package importers of
|
|
3
|
+
// `keys/index.js` keep working; rewire to `@ablo/transaction/keys`
|
|
4
|
+
// and delete this shim once the core package is fully wired.
|
|
5
|
+
//
|
|
6
|
+
// Line comments on purpose: tsc copies a leading JSDoc block into the
|
|
7
|
+
// published `.d.ts`, and this note names a package npm has never heard of.
|
|
8
|
+
export * from '../transaction/keys/index.js';
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* The mutator sees an ordinary `Transaction<S>` and is unaware it is being
|
|
7
7
|
* recorded. When the mutator returns, the caller reads
|
|
8
|
-
* {@link
|
|
8
|
+
* {@link RecordingMutation.getEntry} and pushes the result onto the active
|
|
9
9
|
* {@link UndoScope}.
|
|
10
10
|
*
|
|
11
11
|
* The snapshots are taken here rather than in the undo scope because they must
|
|
@@ -14,11 +14,11 @@
|
|
|
14
14
|
* of a create is just a delete by id, but that id is known only after creation,
|
|
15
15
|
* since the schema generates one when the caller omits it.
|
|
16
16
|
*/
|
|
17
|
-
import type { Schema } from '../schema/schema.js';
|
|
17
|
+
import type { Schema } from '../transaction/schema/schema.js';
|
|
18
18
|
import type { SyncStoreContract } from '../react/context.js';
|
|
19
19
|
import type { Transaction } from './Transaction.js';
|
|
20
20
|
import type { UndoEntry } from './UndoManager.js';
|
|
21
|
-
export interface
|
|
21
|
+
export interface RecordingMutation<S extends Schema> {
|
|
22
22
|
/** The wrapped transaction — pass this into the mutator. */
|
|
23
23
|
tx: Transaction<S>;
|
|
24
24
|
/**
|
|
@@ -33,4 +33,4 @@ export interface RecordingTransaction<S extends Schema> {
|
|
|
33
33
|
* side-effect-only mutator should call {@link createTransaction} directly to skip
|
|
34
34
|
* the bookkeeping.
|
|
35
35
|
*/
|
|
36
|
-
export declare function
|
|
36
|
+
export declare function createRecordingMutation<S extends Schema>(schema: S, store: SyncStoreContract, organizationId: string): RecordingMutation<S>;
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* The mutator sees an ordinary `Transaction<S>` and is unaware it is being
|
|
7
7
|
* recorded. When the mutator returns, the caller reads
|
|
8
|
-
* {@link
|
|
8
|
+
* {@link RecordingMutation.getEntry} and pushes the result onto the active
|
|
9
9
|
* {@link UndoScope}.
|
|
10
10
|
*
|
|
11
11
|
* The snapshots are taken here rather than in the undo scope because they must
|
|
@@ -21,7 +21,7 @@ import { createTransaction } from './Transaction.js';
|
|
|
21
21
|
* side-effect-only mutator should call {@link createTransaction} directly to skip
|
|
22
22
|
* the bookkeeping.
|
|
23
23
|
*/
|
|
24
|
-
export function
|
|
24
|
+
export function createRecordingMutation(schema, store, organizationId) {
|
|
25
25
|
const inverses = [];
|
|
26
26
|
const forwards = [];
|
|
27
27
|
const inner = createTransaction(schema, store, organizationId);
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* coalesces them into a single commit on the wire, so there is no separate
|
|
14
14
|
* bulk-insert method to learn.
|
|
15
15
|
*/
|
|
16
|
-
import type { Schema } from '../schema/schema.js';
|
|
16
|
+
import type { Schema } from '../transaction/schema/schema.js';
|
|
17
17
|
import type { SyncStoreContract } from '../react/context.js';
|
|
18
18
|
import { type MutateActions } from './mutateActions.js';
|
|
19
19
|
import { type ReaderActions, type ReaderFindOptions } from './readerActions.js';
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { createMutateActions } from './mutateActions.js';
|
|
17
17
|
import { createReaderActions } from './readerActions.js';
|
|
18
|
-
import { AbloValidationError } from '../errors.js';
|
|
18
|
+
import { AbloValidationError } from '../transaction/errors.js';
|
|
19
19
|
/**
|
|
20
20
|
* Builds a {@link Transaction} for a single mutator invocation. The returned
|
|
21
21
|
* object creates each model's actions lazily on first access, so a mutator pays
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* operations; `undo()` pops the most recent group and replays those inverses
|
|
5
5
|
* without recording them, then moves the entry onto the redo stack.
|
|
6
6
|
*
|
|
7
|
-
* History is divided into named scopes, one per surface — a
|
|
8
|
-
*
|
|
7
|
+
* History is divided into named scopes, one per surface — a report editor, a
|
|
8
|
+
* ledger grid, and so on — reached through {@link UndoManager.getScope}. Undo in
|
|
9
9
|
* one surface never affects another.
|
|
10
10
|
*
|
|
11
11
|
* Two things to know about its reach. History lives in memory and does not
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* applied optimistically, the undo stack is not invalidated automatically; call
|
|
14
14
|
* {@link UndoScope.clear} on a sync error if you need strict correctness.
|
|
15
15
|
*/
|
|
16
|
-
import type { Schema } from '../schema/schema.js';
|
|
16
|
+
import type { Schema } from '../transaction/schema/schema.js';
|
|
17
17
|
import type { SyncStoreContract } from '../react/context.js';
|
|
18
18
|
import { type InverseOp, type UndoEntry } from './inverseOp.js';
|
|
19
19
|
import { type UndoConflictPolicy } from './undoApply.js';
|
|
@@ -33,8 +33,8 @@ export interface UndoScopeOptions {
|
|
|
33
33
|
conflictPolicy?: UndoConflictPolicy;
|
|
34
34
|
/**
|
|
35
35
|
* A predicate selecting which models this surface owns. The scope records only
|
|
36
|
-
* mutations whose resolved schema key passes it, so, for example, a
|
|
37
|
-
* edit never lands on a
|
|
36
|
+
* mutations whose resolved schema key passes it, so, for example, a ledger
|
|
37
|
+
* edit never lands on a report editor's undo stack. Omit it to track every model,
|
|
38
38
|
* which is fine for a single-surface app but wrong when two surfaces with
|
|
39
39
|
* independent undo share one store.
|
|
40
40
|
*/
|
|
@@ -157,7 +157,7 @@ export declare class UndoScope<S extends Schema> {
|
|
|
157
157
|
* The stream listener, and the only place stream-recorded entries originate. It
|
|
158
158
|
* skips replay echoes and out-of-scope models, derives the forward and inverse
|
|
159
159
|
* operations from the mutation's `data` and `previousData`, and defers the stack
|
|
160
|
-
* push to a per-tick flush, so a burst of writes — aligning five
|
|
160
|
+
* push to a per-tick flush, so a burst of writes — aligning five blocks at once,
|
|
161
161
|
* say — becomes a single undo step.
|
|
162
162
|
*/
|
|
163
163
|
private onLocalMutation;
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* operations; `undo()` pops the most recent group and replays those inverses
|
|
5
5
|
* without recording them, then moves the entry onto the redo stack.
|
|
6
6
|
*
|
|
7
|
-
* History is divided into named scopes, one per surface — a
|
|
8
|
-
*
|
|
7
|
+
* History is divided into named scopes, one per surface — a report editor, a
|
|
8
|
+
* ledger grid, and so on — reached through {@link UndoManager.getScope}. Undo in
|
|
9
9
|
* one surface never affects another.
|
|
10
10
|
*
|
|
11
11
|
* Two things to know about its reach. History lives in memory and does not
|
|
@@ -120,9 +120,9 @@ export class UndoScope {
|
|
|
120
120
|
this.conflictPolicy = options.conflictPolicy ?? DEFAULT_UNDO_CONFLICT_POLICY;
|
|
121
121
|
this.tracksModel = options.tracksModel;
|
|
122
122
|
// Build the map from registered name to schema key. The mutation stream
|
|
123
|
-
// reports a model's registered name (for example `'
|
|
123
|
+
// reports a model's registered name (for example `'Block'`), but inverse
|
|
124
124
|
// operations and the replay transaction are keyed by the schema key (for
|
|
125
|
-
// example `'
|
|
125
|
+
// example `'blocks'`), so map every reasonable spelling to the schema key.
|
|
126
126
|
for (const schemaKey of Object.keys(this.schema.models)) {
|
|
127
127
|
const def = this.schema.models[schemaKey];
|
|
128
128
|
const typename = def?.typename ?? schemaKey;
|
|
@@ -252,7 +252,7 @@ export class UndoScope {
|
|
|
252
252
|
* The stream listener, and the only place stream-recorded entries originate. It
|
|
253
253
|
* skips replay echoes and out-of-scope models, derives the forward and inverse
|
|
254
254
|
* operations from the mutation's `data` and `previousData`, and defers the stack
|
|
255
|
-
* push to a per-tick flush, so a burst of writes — aligning five
|
|
255
|
+
* push to a per-tick flush, so a burst of writes — aligning five blocks at once,
|
|
256
256
|
* say — becomes a single undo step.
|
|
257
257
|
*/
|
|
258
258
|
onLocalMutation(m) {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Declares a tree of named custom mutators grouped by model key. Each mutator is
|
|
3
3
|
* a plain async function that receives `{ tx, args }` and composes any number of
|
|
4
4
|
* `tx.mutations.*` and `tx.read.*` calls to carry out a named operation, such as
|
|
5
|
-
* `
|
|
5
|
+
* `sections.createWithBlocks`.
|
|
6
6
|
*
|
|
7
7
|
* The function is purely a place for types to anchor and returns its input
|
|
8
8
|
* unchanged; the runtime that dispatches a mutator lives elsewhere — the
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
* `typeof mutators` carries every mutator's precise `args` and result types
|
|
12
12
|
* through to wherever they are invoked.
|
|
13
13
|
*/
|
|
14
|
-
import type { Schema } from '../schema/schema.js';
|
|
14
|
+
import type { Schema } from '../transaction/schema/schema.js';
|
|
15
15
|
import type { Transaction } from './Transaction.js';
|
|
16
|
-
import type { ResolveSchema } from '../types/global.js';
|
|
16
|
+
import type { ResolveSchema } from '../transaction/types/global.js';
|
|
17
17
|
/**
|
|
18
18
|
* `ResolveSchema` narrowed to satisfy the `Schema` bound — mirrors
|
|
19
19
|
* {@link Ablo.RegisteredSchema}. When nothing is registered, `ResolveSchema`
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Declares a tree of named custom mutators grouped by model key. Each mutator is
|
|
3
3
|
* a plain async function that receives `{ tx, args }` and composes any number of
|
|
4
4
|
* `tx.mutations.*` and `tx.read.*` calls to carry out a named operation, such as
|
|
5
|
-
* `
|
|
5
|
+
* `sections.createWithBlocks`.
|
|
6
6
|
*
|
|
7
7
|
* The function is purely a place for types to anchor and returns its input
|
|
8
8
|
* unchanged; the runtime that dispatches a mutator lives elsewhere — the
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* `deleteMany`) — so a recorded entry mirrors the call that produced it.
|
|
16
16
|
*/
|
|
17
17
|
import { z } from 'zod';
|
|
18
|
-
import { AbloValidationError } from '../errors.js';
|
|
18
|
+
import { AbloValidationError } from '../transaction/errors.js';
|
|
19
19
|
/** A row payload — JSON-shaped record used by create/createMany inverses. */
|
|
20
20
|
const rowDataSchema = z.record(z.string(), z.unknown());
|
|
21
21
|
/**
|
|
@@ -41,7 +41,7 @@ export const inverseOpSchema = z.discriminatedUnion('kind', [
|
|
|
41
41
|
]);
|
|
42
42
|
/** One undo entry = one mutator invocation's inverses + paired forwards. */
|
|
43
43
|
export const undoEntrySchema = z.object({
|
|
44
|
-
/** Optional label for diagnostics / UI ("Move
|
|
44
|
+
/** Optional label for diagnostics / UI ("Move block", "Delete section", etc). */
|
|
45
45
|
label: z.string().optional(),
|
|
46
46
|
/** Applied (in array order) to reverse the invocation. */
|
|
47
47
|
inverses: z.array(inverseOpSchema),
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import type { Schema, InferModel, InferCreate } from '../schema/schema.js';
|
|
1
|
+
import type { Schema, InferModel, InferCreate } from '../transaction/schema/schema.js';
|
|
2
2
|
import type { SyncStoreContract } from '../react/context.js';
|
|
3
3
|
/**
|
|
4
4
|
* The create, update, and delete actions for one model. Each action is
|
|
5
5
|
* overloaded: pass a single row to act on one entity, or an array to act on
|
|
6
6
|
* many within the same synchronous tick. An array call stages every entry
|
|
7
7
|
* together through `Promise.all`, so the microtask coalescer in
|
|
8
|
-
* `
|
|
8
|
+
* `MutationQueue` collapses the whole batch into one commit on the wire.
|
|
9
9
|
*
|
|
10
10
|
* These are plain imperative actions with no React dependency. The transaction
|
|
11
|
-
* system (`Transaction` and `
|
|
11
|
+
* system (`Transaction` and `RecordingMutation`) and `BaseSyncedStore` build
|
|
12
12
|
* on them, and application code reaches them through `ablo.<model>.create`,
|
|
13
13
|
* `ablo.<model>.update`, and `ablo.<model>.delete`.
|
|
14
14
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Model, modelAsRow } from '../Model.js';
|
|
2
|
-
import { AbloValidationError } from '../errors.js';
|
|
2
|
+
import { AbloValidationError } from '../transaction/errors.js';
|
|
3
3
|
/** Builds the create, update, and delete actions for one model over a store. */
|
|
4
4
|
export function createMutateActions(schema, modelKey, store, organizationId) {
|
|
5
5
|
const modelDef = schema.models[modelKey];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Schema, InferModel } from '../schema/schema.js';
|
|
1
|
+
import type { Schema, InferModel } from '../transaction/schema/schema.js';
|
|
2
2
|
import type { SyncStoreContract } from '../react/context.js';
|
|
3
3
|
/**
|
|
4
4
|
* Imperative, non-reactive reads over a store for one model. The `retrieve`,
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
*/
|
|
26
26
|
import type { SyncStoreContract } from '../react/context.js';
|
|
27
27
|
import type { InverseOp } from './inverseOp.js';
|
|
28
|
-
import { deepEqual } from '../utils/json.js';
|
|
28
|
+
import { deepEqual } from '../transaction/utils/json.js';
|
|
29
29
|
/**
|
|
30
30
|
* How undo and redo treat a field that a collaborator changed after your
|
|
31
31
|
* operation.
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* When no collaborator is involved, the live value always equals what you set,
|
|
24
24
|
* so nothing is dropped and single-user undo behaves exactly as before.
|
|
25
25
|
*/
|
|
26
|
-
import { deepEqual } from '../utils/json.js';
|
|
26
|
+
import { deepEqual } from '../transaction/utils/json.js';
|
|
27
27
|
export const DEFAULT_UNDO_CONFLICT_POLICY = 'skip-stale';
|
|
28
28
|
/**
|
|
29
29
|
* Structural equality for JSON-shaped values — scalars, arrays, and plain
|
package/dist/policy/index.d.ts
CHANGED
|
@@ -17,5 +17,5 @@
|
|
|
17
17
|
* };
|
|
18
18
|
* ```
|
|
19
19
|
*/
|
|
20
|
-
export type { Conflict, ConflictAxis, ConflictDecision, ConflictKind, ConflictOperation, ConflictPolicy, StaleContextConflict, ClaimHeldConflict, } from '
|
|
21
|
-
export { defaultPolicy, capabilityPreemptPolicy, interpretConflictAxis } from '
|
|
20
|
+
export type { Conflict, ConflictAxis, ConflictDecision, ConflictKind, ConflictOperation, ConflictPolicy, StaleContextConflict, ClaimHeldConflict, } from '../transaction/policy/types.js';
|
|
21
|
+
export { defaultPolicy, capabilityPreemptPolicy, interpretConflictAxis } from '../transaction/policy/types.js';
|
package/dist/policy/index.js
CHANGED
package/dist/query/client.d.ts
CHANGED
|
@@ -12,8 +12,9 @@
|
|
|
12
12
|
* repeating the fetch and error-handling boilerplate.
|
|
13
13
|
*/
|
|
14
14
|
import type { QueryBatch, QueryBatchResult } from './types.js';
|
|
15
|
-
import { type RecoveryClass } from '../errorCodes.js';
|
|
16
|
-
import { type AuthTokenGetter } from '../auth/credentialSource.js';
|
|
15
|
+
import { type RecoveryClass } from '../transaction/errorCodes.js';
|
|
16
|
+
import { type AuthTokenGetter } from '../transaction/auth/credentialSource.js';
|
|
17
|
+
import type { RuntimeContext } from '../RuntimeContext.js';
|
|
17
18
|
export interface PostQueryOptions {
|
|
18
19
|
/**
|
|
19
20
|
* Full base URL of the sync server including the `/api` prefix.
|
|
@@ -23,6 +24,8 @@ export interface PostQueryOptions {
|
|
|
23
24
|
baseUrl: string;
|
|
24
25
|
/** Timeout in ms for the fetch request. Default: 30000. */
|
|
25
26
|
fetchTimeout?: number;
|
|
27
|
+
/** The owning client's runtime. Defaults to the module-global bridge. */
|
|
28
|
+
runtime?: RuntimeContext;
|
|
26
29
|
/**
|
|
27
30
|
* Live bearer credential getter. Preferred over `capabilityToken` because it
|
|
28
31
|
* is read per request, so token refreshes propagate without reconstructing
|
package/dist/query/client.js
CHANGED
|
@@ -12,10 +12,10 @@
|
|
|
12
12
|
* repeating the fetch and error-handling boilerplate.
|
|
13
13
|
*/
|
|
14
14
|
import { z } from 'zod';
|
|
15
|
-
import { translateHttpError } from '../errors.js';
|
|
16
|
-
import { classifyRecovery } from '../errorCodes.js';
|
|
17
|
-
import { withAuthHeaders } from '../auth/credentialSource.js';
|
|
18
|
-
import {
|
|
15
|
+
import { translateHttpError } from '../transaction/errors.js';
|
|
16
|
+
import { classifyRecovery } from '../transaction/errorCodes.js';
|
|
17
|
+
import { withAuthHeaders } from '../transaction/auth/credentialSource.js';
|
|
18
|
+
import { globalRuntime } from '../context.js';
|
|
19
19
|
// ── Response validation ─────────────────────────────────────────────────
|
|
20
20
|
//
|
|
21
21
|
// Each result slot is an array of rows, or an object for a bundled response.
|
|
@@ -34,7 +34,7 @@ const QueryBatchResultSchema = z
|
|
|
34
34
|
.object({
|
|
35
35
|
results: z.array(QueryResultSchema),
|
|
36
36
|
})
|
|
37
|
-
.
|
|
37
|
+
.loose();
|
|
38
38
|
/**
|
|
39
39
|
* Sends a batch of queries to `/sync/query` and returns the parsed
|
|
40
40
|
* {@link QueryBatchResult}. An HTTP failure is not thrown: it is logged, and
|
|
@@ -50,6 +50,7 @@ const QueryBatchResultSchema = z
|
|
|
50
50
|
export async function postQuery(options, batch) {
|
|
51
51
|
const url = `${options.baseUrl}/sync/query`;
|
|
52
52
|
const timeout = options.fetchTimeout ?? 30_000;
|
|
53
|
+
const runtime = options.runtime ?? globalRuntime;
|
|
53
54
|
// At most two attempts: the original request, plus one replay after a
|
|
54
55
|
// successful credential recovery (see `recoverCredential`). A second auth
|
|
55
56
|
// rejection falls through to the log-and-empty path, so a wedged credential
|
|
@@ -97,7 +98,7 @@ export async function postQuery(options, batch) {
|
|
|
97
98
|
: 'access_credential_expiry';
|
|
98
99
|
const outcome = await options.recoverCredential(recovery);
|
|
99
100
|
if (outcome === 'retry') {
|
|
100
|
-
|
|
101
|
+
runtime.logger.debug('[postQuery] credential recovered — replaying query once', {
|
|
101
102
|
code: err.code ?? response.status,
|
|
102
103
|
});
|
|
103
104
|
continue;
|
|
@@ -109,8 +110,8 @@ export async function postQuery(options, batch) {
|
|
|
109
110
|
// `debug` line. The read stays empty until the underlying cause, such
|
|
110
111
|
// as auth or network, is resolved.
|
|
111
112
|
const models = batch.queries.map((q) => q.model).join(', ');
|
|
112
|
-
|
|
113
|
-
|
|
113
|
+
runtime.logger.warn(`Could not load ${models} — ${err.message} (code: ${err.code ?? response.status}). No results were returned.`);
|
|
114
|
+
runtime.logger.debug('[postQuery.error] query http failure', {
|
|
114
115
|
type: err.type,
|
|
115
116
|
code: err.code ?? response.status,
|
|
116
117
|
models,
|
|
@@ -123,7 +124,7 @@ export async function postQuery(options, batch) {
|
|
|
123
124
|
if (!parsed.success) {
|
|
124
125
|
// A malformed server response isn't something the consumer can act on
|
|
125
126
|
// (server/protocol issue) → debug, gated like everything else.
|
|
126
|
-
|
|
127
|
+
runtime.logger.debug('[postQuery.error] malformed response', {
|
|
127
128
|
issues: parsed.error.issues,
|
|
128
129
|
});
|
|
129
130
|
return { results: batch.queries.map(() => []) };
|
package/dist/query/types.d.ts
CHANGED
|
@@ -5,55 +5,20 @@
|
|
|
5
5
|
* list of `[column, operator, value]` conditions combined with AND, and
|
|
6
6
|
* `related` names the schema relations to fetch alongside each row. The server
|
|
7
7
|
* compiles a query against your schema: it reads the model's relation metadata
|
|
8
|
-
* to turn `related: ['
|
|
8
|
+
* to turn `related: ['blocks']` into the right join, and turns each condition
|
|
9
9
|
* into a WHERE fragment. The protocol carries no model-specific logic, so
|
|
10
10
|
* adding a model or relation is a schema change rather than a server change.
|
|
11
11
|
*
|
|
12
12
|
* The `IN` operator lets you batch a read by any column, including a foreign
|
|
13
|
-
* key — for example, fetching every
|
|
13
|
+
* key — for example, fetching every block whose `sectionId` falls in a set of
|
|
14
14
|
* ids.
|
|
15
15
|
*/
|
|
16
|
-
|
|
17
|
-
|
|
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 type WhereOp = '=' | '!=' | '<' | '<=' | '>' | '>=' | 'IN' | 'NOT IN' | 'IS' | 'IS NOT' | 'LIKE' | 'NOT LIKE' | 'ILIKE' | 'NOT ILIKE';
|
|
25
|
-
/**
|
|
26
|
-
* A single condition. Two supported shapes:
|
|
27
|
-
*
|
|
28
|
-
* - `[col, value]` — shortcut for `[col, '=', value]`
|
|
29
|
-
* - `[col, op, value]` — explicit operator
|
|
30
|
-
*
|
|
31
|
-
* The value is a single primitive for scalar operators and an array of
|
|
32
|
-
* primitives for IN/NOT IN.
|
|
33
|
-
*/
|
|
34
|
-
export type WhereClause = readonly [col: string, value: WherePrimitive] | readonly [col: string, op: WhereOp, value: WherePrimitive | readonly WherePrimitive[]];
|
|
35
|
-
/**
|
|
36
|
-
* Client-facing where shape for `load({where})` and `deleteMany({where})`.
|
|
37
|
-
*
|
|
38
|
-
* Two shapes accepted, both AND-combined:
|
|
39
|
-
*
|
|
40
|
-
* - Object form: `{ name: 'foo', orgId: '1' }` — each entry is an `=`
|
|
41
|
-
* clause; array values become `IN`. Ergonomic for the common case.
|
|
42
|
-
* - Tuple form: `[['name', 'ILIKE', '%Goldman%'], ['orgId', '1']]` —
|
|
43
|
-
* explicit operators (LIKE/ILIKE/<=/etc.). Matches the wire
|
|
44
|
-
* `WhereClause[]` 1:1, so no translation layer.
|
|
45
|
-
*
|
|
46
|
-
* The two forms compose: pass tuple form when you need an operator,
|
|
47
|
-
* object form otherwise. For OR semantics, run two `load()` calls and
|
|
48
|
-
* union client-side — keeps the protocol AND-only.
|
|
49
|
-
*/
|
|
50
|
-
export type LoadWhere<T> = Partial<T> | {
|
|
51
|
-
[K in keyof T]?: T[K] | readonly T[K][];
|
|
52
|
-
} | readonly WhereClause[];
|
|
16
|
+
export type { WherePrimitive, WhereOp, WhereClause, LoadWhere, } from '../transaction/resources/where.js';
|
|
17
|
+
import type { WhereClause } from '../transaction/resources/where.js';
|
|
53
18
|
/** A single structured fetch request. */
|
|
54
19
|
export interface Query {
|
|
55
20
|
/**
|
|
56
|
-
* Client-facing model name (e.g. "File", "
|
|
21
|
+
* Client-facing model name (e.g. "File", "Block", "Message").
|
|
57
22
|
* The server's adapter maps this to the actual database table.
|
|
58
23
|
*/
|
|
59
24
|
model: string;
|
|
@@ -70,7 +35,7 @@ export interface Query {
|
|
|
70
35
|
* relation metadata and joins the related rows in. They come back nested
|
|
71
36
|
* under the relation key:
|
|
72
37
|
*
|
|
73
|
-
* { __typename: '
|
|
38
|
+
* { __typename: 'Section', id: '…', blocks: [{ __typename: 'Block', … }] }
|
|
74
39
|
*/
|
|
75
40
|
related?: readonly string[];
|
|
76
41
|
/**
|
package/dist/query/types.js
CHANGED
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
* list of `[column, operator, value]` conditions combined with AND, and
|
|
6
6
|
* `related` names the schema relations to fetch alongside each row. The server
|
|
7
7
|
* compiles a query against your schema: it reads the model's relation metadata
|
|
8
|
-
* to turn `related: ['
|
|
8
|
+
* to turn `related: ['blocks']` into the right join, and turns each condition
|
|
9
9
|
* into a WHERE fragment. The protocol carries no model-specific logic, so
|
|
10
10
|
* adding a model or relation is a schema change rather than a server change.
|
|
11
11
|
*
|
|
12
12
|
* The `IN` operator lets you batch a read by any column, including a foreign
|
|
13
|
-
* key — for example, fetching every
|
|
13
|
+
* key — for example, fetching every block whose `sectionId` falls in a set of
|
|
14
14
|
* ids.
|
|
15
15
|
*/
|
|
16
16
|
export {};
|