@abloatai/ablo 0.25.0 → 0.27.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 +5 -3
- package/CHANGELOG.md +34 -0
- package/README.md +104 -88
- package/dist/BaseSyncedStore.d.ts +140 -266
- package/dist/BaseSyncedStore.js +338 -739
- package/dist/Database.d.ts +62 -77
- package/dist/Database.js +106 -127
- package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
- package/dist/{ObjectPool.js → InstanceCache.js} +91 -83
- package/dist/LazyReferenceCollection.d.ts +11 -15
- package/dist/LazyReferenceCollection.js +16 -15
- package/dist/Model.d.ts +37 -52
- package/dist/Model.js +52 -69
- package/dist/ModelRegistry.d.ts +46 -25
- package/dist/ModelRegistry.js +32 -30
- package/dist/NetworkMonitor.d.ts +5 -6
- package/dist/NetworkMonitor.js +6 -7
- package/dist/SyncClient.d.ts +119 -109
- package/dist/SyncClient.js +303 -224
- package/dist/SyncEngineContext.d.ts +1 -3
- package/dist/SyncEngineContext.js +1 -2
- package/dist/adapters/alwaysOnline.d.ts +6 -8
- package/dist/adapters/alwaysOnline.js +6 -8
- package/dist/adapters/inMemoryStorage.d.ts +9 -9
- package/dist/adapters/inMemoryStorage.js +9 -9
- package/dist/agent/Agent.d.ts +39 -31
- package/dist/agent/Agent.js +35 -23
- package/dist/agent/index.d.ts +4 -4
- package/dist/agent/index.js +5 -5
- package/dist/agent/session.d.ts +47 -44
- package/dist/agent/session.js +37 -48
- package/dist/agent/types.d.ts +26 -31
- package/dist/agent/types.js +6 -7
- package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
- package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
- package/dist/ai-sdk/coordinationContext.d.ts +46 -0
- package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +30 -31
- package/dist/ai-sdk/index.d.ts +25 -22
- package/dist/ai-sdk/index.js +25 -22
- package/dist/ai-sdk/wrap.d.ts +7 -8
- package/dist/ai-sdk/wrap.js +2 -2
- package/dist/auth/credentialPolicy.d.ts +74 -71
- package/dist/auth/credentialPolicy.js +51 -56
- package/dist/auth/credentialSource.d.ts +7 -18
- package/dist/auth/credentialSource.js +10 -18
- package/dist/auth/index.d.ts +59 -58
- package/dist/auth/index.js +34 -40
- package/dist/auth/schemas.d.ts +5 -4
- package/dist/auth/schemas.js +5 -4
- package/dist/batching/index.d.ts +19 -21
- package/dist/batching/index.js +14 -17
- package/dist/cli.cjs +483 -369
- package/dist/client/Ablo.d.ts +107 -836
- package/dist/client/Ablo.js +174 -833
- package/dist/client/ApiClient.d.ts +44 -20
- package/dist/client/ApiClient.js +193 -44
- package/dist/client/auth.d.ts +51 -60
- package/dist/client/auth.js +137 -110
- package/dist/client/claimHeartbeatLoop.d.ts +50 -0
- package/dist/client/claimHeartbeatLoop.js +88 -0
- package/dist/client/consoleLogger.d.ts +35 -0
- package/dist/client/consoleLogger.js +44 -0
- package/dist/client/createInternalComponents.d.ts +14 -17
- package/dist/client/createInternalComponents.js +26 -31
- package/dist/client/createModelProxy.d.ts +130 -120
- package/dist/client/createModelProxy.js +158 -124
- package/dist/client/credentialEndpoint.d.ts +61 -0
- package/dist/client/credentialEndpoint.js +86 -0
- package/dist/client/functionalUpdate.d.ts +29 -27
- package/dist/client/functionalUpdate.js +21 -21
- package/dist/client/hostedEndpoints.d.ts +21 -0
- package/dist/client/hostedEndpoints.js +21 -0
- package/dist/client/httpClient.d.ts +58 -54
- package/dist/client/httpClient.js +29 -31
- package/dist/client/identity.d.ts +15 -20
- package/dist/client/identity.js +49 -59
- package/dist/client/modelRegistration.d.ts +10 -0
- package/dist/client/modelRegistration.js +301 -0
- package/dist/client/options.d.ts +373 -0
- package/dist/client/options.js +6 -0
- package/dist/client/registerDataSource.d.ts +9 -9
- package/dist/client/registerDataSource.js +15 -16
- package/dist/client/resourceTypes.d.ts +333 -0
- package/dist/client/resourceTypes.js +7 -0
- package/dist/client/schemaConfig.d.ts +44 -0
- package/dist/client/schemaConfig.js +176 -0
- package/dist/client/sessionMint.d.ts +17 -13
- package/dist/client/sessionMint.js +26 -31
- package/dist/client/validateAbloOptions.d.ts +12 -14
- package/dist/client/validateAbloOptions.js +9 -10
- package/dist/client/writeOptionsSchema.d.ts +18 -16
- package/dist/client/writeOptionsSchema.js +23 -20
- package/dist/client/wsMutationExecutor.d.ts +28 -0
- package/dist/client/wsMutationExecutor.js +71 -0
- package/dist/context.d.ts +6 -4
- package/dist/context.js +6 -7
- package/dist/coordination/index.d.ts +13 -4
- package/dist/coordination/index.js +29 -4
- package/dist/coordination/schema.d.ts +176 -128
- package/dist/coordination/schema.js +197 -133
- package/dist/coordination/trace.d.ts +9 -11
- package/dist/coordination/trace.js +13 -15
- package/dist/core/DatabaseManager.d.ts +5 -8
- package/dist/core/DatabaseManager.js +38 -40
- package/dist/core/QueryProcessor.d.ts +7 -9
- package/dist/core/QueryProcessor.js +27 -34
- package/dist/core/QueryView.d.ts +17 -5
- package/dist/core/QueryView.js +6 -7
- package/dist/core/StoreManager.d.ts +14 -16
- package/dist/core/StoreManager.js +26 -25
- package/dist/core/ViewRegistry.d.ts +5 -5
- package/dist/core/ViewRegistry.js +4 -4
- package/dist/core/index.d.ts +18 -13
- package/dist/core/index.js +32 -26
- package/dist/core/openIDBWithTimeout.d.ts +38 -36
- package/dist/core/openIDBWithTimeout.js +57 -54
- package/dist/core/queryUtils.d.ts +45 -0
- package/dist/core/queryUtils.js +69 -0
- package/dist/core/storeContract.d.ts +145 -0
- package/dist/core/storeContract.js +12 -0
- package/dist/environment.d.ts +28 -0
- package/dist/environment.js +21 -0
- package/dist/errorCodes.d.ts +118 -101
- package/dist/errorCodes.js +277 -260
- package/dist/errors.d.ts +170 -165
- package/dist/errors.js +161 -151
- package/dist/index.d.ts +30 -27
- package/dist/index.js +90 -82
- package/dist/interfaces/index.d.ts +108 -133
- package/dist/interfaces/index.js +5 -4
- package/dist/keys/index.d.ts +27 -29
- package/dist/keys/index.js +59 -49
- package/dist/mutators/RecordingTransaction.d.ts +16 -16
- package/dist/mutators/RecordingTransaction.js +31 -37
- package/dist/mutators/Transaction.d.ts +18 -26
- package/dist/mutators/Transaction.js +14 -20
- package/dist/mutators/UndoManager.d.ts +122 -131
- package/dist/mutators/UndoManager.js +149 -155
- package/dist/mutators/defineMutators.d.ts +24 -37
- package/dist/mutators/defineMutators.js +14 -20
- package/dist/mutators/inverseOp.d.ts +12 -15
- package/dist/mutators/inverseOp.js +12 -15
- package/dist/mutators/mutateActions.d.ts +10 -9
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +9 -8
- package/dist/mutators/readerActions.js +2 -2
- package/dist/mutators/undoApply.d.ts +31 -27
- package/dist/mutators/undoApply.js +26 -24
- package/dist/policy/index.d.ts +5 -3
- package/dist/policy/index.js +5 -3
- package/dist/policy/types.d.ts +105 -101
- package/dist/policy/types.js +67 -66
- package/dist/query/client.d.ts +32 -16
- package/dist/query/client.js +103 -72
- package/dist/query/types.d.ts +37 -60
- package/dist/query/types.js +13 -33
- package/dist/react/AbloProvider.d.ts +7 -11
- package/dist/react/AbloProvider.js +24 -17
- package/dist/react/context.d.ts +27 -146
- package/dist/react/context.js +9 -10
- package/dist/react/index.d.ts +41 -42
- package/dist/react/index.js +37 -38
- package/dist/react/internalContext.d.ts +17 -19
- package/dist/react/useAblo.d.ts +23 -22
- package/dist/react/useAblo.js +17 -15
- package/dist/react/useCurrentUserId.d.ts +8 -7
- package/dist/react/useCurrentUserId.js +8 -7
- package/dist/react/useErrorListener.d.ts +7 -7
- package/dist/react/useErrorListener.js +11 -12
- package/dist/react/useMutationFailureListener.d.ts +8 -8
- package/dist/react/useMutationFailureListener.js +9 -9
- package/dist/react/useMutators.d.ts +11 -11
- package/dist/react/useMutators.js +10 -4
- package/dist/react/useReactive.js +2 -3
- package/dist/react/useSyncStatus.d.ts +4 -6
- package/dist/react/useUndoScope.d.ts +7 -9
- package/dist/react/useUndoScope.js +3 -3
- package/dist/schema/coordination.d.ts +21 -25
- package/dist/schema/coordination.js +21 -25
- package/dist/schema/ddl.d.ts +43 -39
- package/dist/schema/ddl.js +75 -68
- package/dist/schema/ddlLock.d.ts +35 -0
- package/dist/schema/ddlLock.js +46 -0
- package/dist/schema/diff.d.ts +99 -61
- package/dist/schema/diff.js +43 -34
- package/dist/schema/field.d.ts +37 -42
- package/dist/schema/field.js +36 -49
- package/dist/schema/generate.d.ts +12 -12
- package/dist/schema/generate.js +12 -12
- package/dist/schema/index.d.ts +5 -4
- package/dist/schema/index.js +29 -21
- package/dist/schema/model.d.ts +121 -146
- package/dist/schema/model.js +24 -35
- package/dist/schema/openapi.d.ts +10 -9
- package/dist/schema/openapi.js +7 -1
- package/dist/schema/queries.d.ts +30 -32
- package/dist/schema/queries.js +24 -25
- package/dist/schema/relation.d.ts +89 -99
- package/dist/schema/relation.js +13 -13
- package/dist/schema/residency.d.ts +38 -0
- package/dist/schema/residency.js +30 -0
- package/dist/schema/roles.d.ts +45 -27
- package/dist/schema/roles.js +52 -21
- package/dist/schema/schema.d.ts +36 -45
- package/dist/schema/schema.js +42 -39
- package/dist/schema/select.d.ts +13 -13
- package/dist/schema/select.js +13 -13
- package/dist/schema/serialize.d.ts +36 -39
- package/dist/schema/serialize.js +27 -31
- package/dist/schema/sugar.d.ts +17 -32
- package/dist/schema/sugar.js +14 -29
- package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +27 -50
- package/dist/schema/syncDeltaRow.js +89 -0
- package/dist/schema/tenancy.d.ts +44 -46
- package/dist/schema/tenancy.js +46 -48
- package/dist/server/adapter.d.ts +58 -58
- package/dist/server/adapter.js +13 -14
- package/dist/server/commit.d.ts +60 -64
- package/dist/server/index.d.ts +9 -10
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +70 -0
- package/dist/server/readConfig.js +8 -0
- package/dist/server/storageMode.d.ts +23 -0
- package/dist/server/storageMode.js +17 -0
- package/dist/source/adapter.d.ts +31 -26
- package/dist/source/adapter.js +10 -10
- package/dist/source/adapters/drizzle.d.ts +28 -23
- package/dist/source/adapters/drizzle.js +34 -28
- package/dist/source/adapters/kysely.d.ts +27 -25
- package/dist/source/adapters/kysely.js +28 -26
- package/dist/source/adapters/memory.d.ts +8 -7
- package/dist/source/adapters/memory.js +10 -9
- package/dist/source/adapters/prisma.d.ts +13 -12
- package/dist/source/adapters/prisma.js +27 -29
- package/dist/source/conformance.d.ts +18 -11
- package/dist/source/conformance.js +27 -19
- package/dist/source/connector.d.ts +31 -32
- package/dist/source/connector.js +30 -28
- package/dist/source/connectorProtocol.d.ts +160 -0
- package/dist/source/connectorProtocol.js +162 -0
- package/dist/source/contract.d.ts +26 -27
- package/dist/source/contract.js +28 -29
- package/dist/source/factory.d.ts +94 -0
- package/dist/source/factory.js +268 -0
- package/dist/source/index.d.ts +10 -462
- package/dist/source/index.js +17 -421
- package/dist/source/migrations.d.ts +9 -9
- package/dist/source/migrations.js +9 -9
- package/dist/source/next.d.ts +10 -11
- package/dist/source/next.js +7 -8
- package/dist/source/pushQueue.d.ts +70 -48
- package/dist/source/pushQueue.js +36 -29
- package/dist/source/signing.d.ts +88 -0
- package/dist/source/signing.js +159 -0
- package/dist/source/types.d.ts +351 -0
- package/dist/source/types.js +43 -0
- package/dist/stores/ObjectStore.d.ts +11 -12
- package/dist/stores/ObjectStore.js +34 -35
- package/dist/stores/ObjectStoreContract.d.ts +12 -15
- package/dist/stores/SyncActionStore.d.ts +8 -12
- package/dist/stores/SyncActionStore.js +77 -46
- package/dist/surface.d.ts +28 -21
- package/dist/surface.js +28 -20
- package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +37 -45
- package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +101 -80
- package/dist/sync/ConnectionManager.d.ts +47 -50
- package/dist/sync/ConnectionManager.js +74 -70
- package/dist/sync/NetworkProbe.d.ts +27 -31
- package/dist/sync/NetworkProbe.js +67 -72
- package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +49 -36
- package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +79 -54
- package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +45 -59
- package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +44 -52
- package/dist/sync/SyncWebSocket.d.ts +175 -250
- package/dist/sync/SyncWebSocket.js +431 -769
- package/dist/sync/awaitClaimGrant.d.ts +18 -18
- package/dist/sync/awaitClaimGrant.js +38 -30
- package/dist/sync/bootstrapApply.d.ts +70 -0
- package/dist/sync/bootstrapApply.js +73 -0
- package/dist/sync/commitFrames.d.ts +44 -0
- package/dist/sync/commitFrames.js +94 -0
- package/dist/sync/createClaimStream.d.ts +23 -22
- package/dist/sync/createClaimStream.js +108 -25
- package/dist/sync/createPresenceStream.d.ts +19 -18
- package/dist/sync/createPresenceStream.js +25 -26
- package/dist/sync/createSnapshot.d.ts +13 -17
- package/dist/sync/createSnapshot.js +20 -26
- package/dist/sync/credentialLifecycle.d.ts +175 -0
- package/dist/sync/credentialLifecycle.js +322 -0
- package/dist/sync/deltaPipeline.d.ts +113 -0
- package/dist/sync/deltaPipeline.js +261 -0
- package/dist/sync/groupChange.d.ts +113 -0
- package/dist/sync/groupChange.js +242 -0
- package/dist/sync/heartbeat.d.ts +63 -0
- package/dist/sync/heartbeat.js +91 -0
- package/dist/sync/participants.d.ts +27 -27
- package/dist/sync/schemas.d.ts +3 -2
- package/dist/sync/schemas.js +14 -10
- package/dist/sync/syncCursor.d.ts +40 -0
- package/dist/sync/syncCursor.js +55 -0
- package/dist/sync/syncPlan.d.ts +54 -0
- package/dist/sync/syncPlan.js +50 -0
- package/dist/sync/syncPosition.d.ts +54 -49
- package/dist/sync/syncPosition.js +57 -52
- package/dist/sync/wsFrameHandlers.d.ts +116 -0
- package/dist/sync/wsFrameHandlers.js +374 -0
- package/dist/testing/fixtures/bootstrap.d.ts +21 -17
- package/dist/testing/fixtures/bootstrap.js +12 -6
- package/dist/testing/fixtures/deltas.d.ts +31 -34
- package/dist/testing/fixtures/deltas.js +30 -33
- package/dist/testing/fixtures/models.d.ts +11 -10
- package/dist/testing/fixtures/models.js +12 -10
- package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
- package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
- package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -18
- package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +14 -11
- package/dist/testing/helpers/wait.d.ts +13 -8
- package/dist/testing/helpers/wait.js +13 -8
- package/dist/testing/index.d.ts +4 -4
- package/dist/testing/index.js +3 -3
- package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
- package/dist/testing/mocks/MockMutationExecutor.js +15 -14
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
- package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
- package/dist/testing/mocks/MockSyncContext.d.ts +21 -34
- package/dist/testing/mocks/MockSyncContext.js +16 -45
- package/dist/testing/mocks/MockSyncStore.d.ts +14 -14
- package/dist/testing/mocks/MockSyncStore.js +11 -11
- package/dist/testing/mocks/MockWebSocket.d.ts +28 -24
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +190 -221
- package/dist/transactions/TransactionQueue.js +424 -822
- package/dist/transactions/TransactionStore.d.ts +20 -0
- package/dist/transactions/TransactionStore.js +53 -0
- package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
- package/dist/transactions/UnconfirmedWrites.js +104 -0
- package/dist/transactions/coalesceRules.d.ts +58 -0
- package/dist/transactions/coalesceRules.js +140 -0
- package/dist/transactions/commitPayload.d.ts +130 -0
- package/dist/transactions/commitPayload.js +143 -0
- package/dist/transactions/deltaConfirmation.d.ts +58 -0
- package/dist/transactions/deltaConfirmation.js +215 -0
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/replayValidation.d.ts +99 -0
- package/dist/transactions/replayValidation.js +111 -0
- package/dist/types/global.d.ts +46 -41
- package/dist/types/global.js +20 -19
- package/dist/types/index.d.ts +74 -80
- package/dist/types/index.js +22 -27
- package/dist/types/modelData.d.ts +10 -0
- package/dist/types/modelData.js +9 -0
- package/dist/types/participant.d.ts +20 -0
- package/dist/types/participant.js +10 -0
- package/dist/types/streams.d.ts +216 -209
- package/dist/types/streams.js +7 -7
- package/dist/utils/asyncIterator.d.ts +25 -32
- package/dist/utils/asyncIterator.js +25 -32
- package/dist/utils/duration.d.ts +12 -15
- package/dist/utils/duration.js +12 -15
- package/dist/utils/mobxSetup.d.ts +53 -0
- package/dist/utils/{mobx-setup.js → mobxSetup.js} +44 -100
- package/dist/webhooks/events.d.ts +21 -16
- package/dist/webhooks/events.js +10 -8
- package/dist/webhooks/index.d.ts +5 -7
- package/dist/webhooks/index.js +5 -7
- package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
- package/dist/wire/delta.js +114 -0
- package/dist/wire/errorEnvelope.d.ts +35 -27
- package/dist/wire/errorEnvelope.js +38 -32
- package/dist/wire/frames.d.ts +150 -67
- package/dist/wire/frames.js +48 -1
- package/dist/wire/index.d.ts +18 -13
- package/dist/wire/index.js +36 -13
- package/dist/wire/listEnvelope.d.ts +16 -23
- package/dist/wire/listEnvelope.js +7 -6
- package/dist/wire/protocol.d.ts +38 -0
- package/dist/wire/protocol.js +38 -0
- package/dist/wire/protocolVersion.d.ts +60 -0
- package/dist/wire/protocolVersion.js +67 -0
- package/docs/api-keys.md +4 -3
- package/docs/coordination.md +59 -0
- package/docs/examples/existing-python-backend.md +3 -3
- package/docs/identity.md +4 -4
- package/docs/integration-guide.md +1 -1
- package/docs/react.md +1 -1
- package/docs/sessions.md +5 -7
- package/package.json +24 -21
- package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
- package/dist/ai-sdk/coordination-context.d.ts +0 -52
- package/dist/client/index.d.ts +0 -36
- package/dist/client/index.js +0 -33
- package/dist/config/index.d.ts +0 -10
- package/dist/config/index.js +0 -12
- package/dist/core/query-utils.d.ts +0 -34
- package/dist/core/query-utils.js +0 -59
- package/dist/interfaces/headless.d.ts +0 -95
- package/dist/interfaces/headless.js +0 -41
- package/dist/query/index.d.ts +0 -6
- package/dist/query/index.js +0 -5
- package/dist/realtime/index.d.ts +0 -10
- package/dist/realtime/index.js +0 -9
- package/dist/schema/plane.d.ts +0 -23
- package/dist/schema/plane.js +0 -19
- package/dist/schema/sync-delta-row.js +0 -103
- package/dist/schema/sync-delta-wire.js +0 -102
- package/dist/server/next.d.ts +0 -51
- package/dist/server/next.js +0 -47
- package/dist/server/read-config.d.ts +0 -67
- package/dist/server/read-config.js +0 -8
- package/dist/server/storage-mode.d.ts +0 -1
- package/dist/server/storage-mode.js +0 -18
- package/dist/source/connector-protocol.d.ts +0 -159
- package/dist/source/connector-protocol.js +0 -161
- package/dist/sync/OfflineFlush.d.ts +0 -9
- package/dist/sync/OfflineFlush.js +0 -22
- package/dist/sync/OfflineTransactionStore.d.ts +0 -37
- package/dist/sync/OfflineTransactionStore.js +0 -263
- package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
- package/dist/transactions/OptimisticEchoTracker.js +0 -104
- package/dist/transactions/index.d.ts +0 -16
- package/dist/transactions/index.js +0 -7
- package/dist/transactions/mutation-error-handler.d.ts +0 -5
- package/dist/transactions/mutation-error-handler.js +0 -39
- package/dist/utils/mobx-setup.d.ts +0 -42
|
@@ -1,45 +1,49 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Factories that build well-formed bootstrap responses for tests. A
|
|
3
|
+
* bootstrap response is what the server returns when a client first syncs:
|
|
4
|
+
* either a full snapshot of the models or a partial batch of deltas since a
|
|
5
|
+
* known point. These helpers produce the same shapes, so tests can exercise
|
|
6
|
+
* client sync logic without a live server.
|
|
5
7
|
*/
|
|
6
8
|
import type { BootstrapType } from '../../types/index.js';
|
|
7
|
-
export
|
|
8
|
-
[modelName: string]: Array<Record<string, unknown>>;
|
|
9
|
-
}
|
|
9
|
+
export type BootstrapModelData = Record<string, Record<string, unknown>[]>;
|
|
10
10
|
export interface BootstrapResponse {
|
|
11
11
|
type: BootstrapType;
|
|
12
12
|
lastSyncId: number;
|
|
13
13
|
models?: BootstrapModelData;
|
|
14
|
-
deltas?:
|
|
14
|
+
deltas?: {
|
|
15
15
|
id: number;
|
|
16
16
|
modelName: string;
|
|
17
17
|
modelId: string;
|
|
18
18
|
action: string;
|
|
19
19
|
data: Record<string, unknown>;
|
|
20
|
-
}
|
|
20
|
+
}[];
|
|
21
21
|
deltaCount?: number;
|
|
22
22
|
failedModels?: string[];
|
|
23
23
|
timestamp: number;
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
|
-
*
|
|
26
|
+
* Builds a full bootstrap response — a fresh snapshot of the given models,
|
|
27
|
+
* as the server sends on a client's first sync.
|
|
27
28
|
*/
|
|
28
29
|
export declare function createFullBootstrapResponse(models: BootstrapModelData, lastSyncId?: number): BootstrapResponse;
|
|
29
30
|
/**
|
|
30
|
-
*
|
|
31
|
+
* Builds a partial bootstrap response — a batch of deltas applied on top of
|
|
32
|
+
* the client's last known sync point, given by `lastSyncId`.
|
|
31
33
|
*/
|
|
32
34
|
export declare function createPartialBootstrapResponse(deltas: BootstrapResponse['deltas'], lastSyncId: number): BootstrapResponse;
|
|
33
35
|
/**
|
|
34
|
-
*
|
|
36
|
+
* Builds a full bootstrap response with the common test models
|
|
37
|
+
* pre-populated. Pass any of the named model arrays to include them in the
|
|
38
|
+
* snapshot.
|
|
35
39
|
*/
|
|
36
40
|
export declare function createTestBootstrapResponse(options?: {
|
|
37
|
-
tasks?:
|
|
38
|
-
projects?:
|
|
39
|
-
slideDecks?:
|
|
40
|
-
slides?:
|
|
41
|
-
slideLayers?:
|
|
42
|
-
comments?:
|
|
41
|
+
tasks?: Record<string, unknown>[];
|
|
42
|
+
projects?: Record<string, unknown>[];
|
|
43
|
+
slideDecks?: Record<string, unknown>[];
|
|
44
|
+
slides?: Record<string, unknown>[];
|
|
45
|
+
slideLayers?: Record<string, unknown>[];
|
|
46
|
+
comments?: Record<string, unknown>[];
|
|
43
47
|
lastSyncId?: number;
|
|
44
48
|
failedModels?: string[];
|
|
45
49
|
}): BootstrapResponse;
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Factories that build well-formed bootstrap responses for tests. A
|
|
3
|
+
* bootstrap response is what the server returns when a client first syncs:
|
|
4
|
+
* either a full snapshot of the models or a partial batch of deltas since a
|
|
5
|
+
* known point. These helpers produce the same shapes, so tests can exercise
|
|
6
|
+
* client sync logic without a live server.
|
|
5
7
|
*/
|
|
6
8
|
/**
|
|
7
|
-
*
|
|
9
|
+
* Builds a full bootstrap response — a fresh snapshot of the given models,
|
|
10
|
+
* as the server sends on a client's first sync.
|
|
8
11
|
*/
|
|
9
12
|
export function createFullBootstrapResponse(models, lastSyncId = 100) {
|
|
10
13
|
return {
|
|
@@ -15,7 +18,8 @@ export function createFullBootstrapResponse(models, lastSyncId = 100) {
|
|
|
15
18
|
};
|
|
16
19
|
}
|
|
17
20
|
/**
|
|
18
|
-
*
|
|
21
|
+
* Builds a partial bootstrap response — a batch of deltas applied on top of
|
|
22
|
+
* the client's last known sync point, given by `lastSyncId`.
|
|
19
23
|
*/
|
|
20
24
|
export function createPartialBootstrapResponse(deltas, lastSyncId) {
|
|
21
25
|
return {
|
|
@@ -27,7 +31,9 @@ export function createPartialBootstrapResponse(deltas, lastSyncId) {
|
|
|
27
31
|
};
|
|
28
32
|
}
|
|
29
33
|
/**
|
|
30
|
-
*
|
|
34
|
+
* Builds a full bootstrap response with the common test models
|
|
35
|
+
* pre-populated. Pass any of the named model arrays to include them in the
|
|
36
|
+
* snapshot.
|
|
31
37
|
*/
|
|
32
38
|
export function createTestBootstrapResponse(options = {}) {
|
|
33
39
|
const models = {};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Factories that build well-formed delta objects for tests. A delta, a
|
|
3
|
+
* {@link SyncAction}, is a single change to one model instance in the wire
|
|
4
|
+
* format the server sends: an insert, update, delete, archive, and so on.
|
|
5
|
+
* These helpers let tests construct deltas without a live server.
|
|
5
6
|
*/
|
|
6
7
|
import type { SyncActionType, SyncAction } from '../../types/index.js';
|
|
7
8
|
/** Reset the delta counter (call in beforeEach for deterministic IDs) */
|
|
@@ -19,68 +20,64 @@ export interface CreateDeltaOptions {
|
|
|
19
20
|
data?: Record<string, unknown>;
|
|
20
21
|
}
|
|
21
22
|
/**
|
|
22
|
-
*
|
|
23
|
+
* Builds a single delta ({@link SyncAction}) in the server's wire format.
|
|
23
24
|
*/
|
|
24
25
|
export declare function createDelta(options: CreateDeltaOptions): SyncAction;
|
|
25
26
|
/**
|
|
26
|
-
*
|
|
27
|
+
* Builds an insert delta for a new entity.
|
|
27
28
|
*/
|
|
28
29
|
export declare function createInsertDelta(modelName: string, modelId: string, data: Record<string, unknown>, syncId?: number): SyncAction;
|
|
29
30
|
/**
|
|
30
|
-
*
|
|
31
|
+
* Builds an update delta for an existing entity.
|
|
31
32
|
*/
|
|
32
33
|
export declare function createUpdateDelta(modelName: string, modelId: string, data: Record<string, unknown>, syncId?: number): SyncAction;
|
|
33
34
|
/**
|
|
34
|
-
*
|
|
35
|
+
* Builds a delete delta.
|
|
35
36
|
*/
|
|
36
37
|
export declare function createDeleteDelta(modelName: string, modelId: string, syncId?: number): SyncAction;
|
|
37
38
|
/**
|
|
38
|
-
*
|
|
39
|
+
* Builds an archive delta, stamping `archivedAt` with the current time.
|
|
39
40
|
*/
|
|
40
41
|
export declare function createArchiveDelta(modelName: string, modelId: string, syncId?: number): SyncAction;
|
|
41
42
|
/**
|
|
42
|
-
*
|
|
43
|
+
* Builds an unarchive delta, clearing `archivedAt`.
|
|
43
44
|
*/
|
|
44
45
|
export declare function createUnarchiveDelta(modelName: string, modelId: string, syncId?: number): SyncAction;
|
|
45
46
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
* store as if newly created. Typically follows a GroupAdded delta.
|
|
47
|
+
* Builds a covering ('C') delta. It signals that the client has gained
|
|
48
|
+
* permission to see an entity that already exists. The client treats it
|
|
49
|
+
* like an insert, adding the entity to its local store as if newly created.
|
|
50
|
+
* A covering delta typically follows a group-added delta.
|
|
51
51
|
*/
|
|
52
52
|
export declare function createCoveringDelta(modelName: string, modelId: string, data: Record<string, unknown>, syncId?: number): SyncAction;
|
|
53
53
|
/**
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* (addedGroups/removedGroups), this does not trigger a re-bootstrap.
|
|
54
|
+
* Builds a group-added ('G') delta in the incremental payload shape. It
|
|
55
|
+
* signals that the recipient was added to a single sync group. The client
|
|
56
|
+
* updates its subscription state and waits for covering deltas to deliver
|
|
57
|
+
* the newly visible entities. Unlike the older payload that carries both
|
|
58
|
+
* added and removed groups, this shape does not trigger a re-bootstrap.
|
|
60
59
|
*/
|
|
61
60
|
export declare function createGroupAddedDelta(userId: string, group: string, syncId?: number): SyncAction;
|
|
62
61
|
/**
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
* the deprecated EmitGroupChange path.
|
|
62
|
+
* Builds a group-change ('G') delta in the older payload shape, which
|
|
63
|
+
* carries both added and removed groups in one delta and forces a full
|
|
64
|
+
* re-bootstrap on the client. Useful for testing backward compatibility
|
|
65
|
+
* with that older shape.
|
|
68
66
|
*/
|
|
69
67
|
export declare function createLegacyGroupChangeDelta(userId: string, added: string[], removed: string[], syncId?: number): SyncAction;
|
|
70
68
|
/**
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
* purges affected local state and triggers a re-bootstrap with the
|
|
75
|
-
* updated group list.
|
|
69
|
+
* Builds a group-removed ('S') delta. It signals that the recipient lost
|
|
70
|
+
* access to a sync group. The client purges the affected local state and
|
|
71
|
+
* re-bootstraps with the updated group list.
|
|
76
72
|
*/
|
|
77
73
|
export declare function createGroupRemovedDelta(userId: string, group: string, syncId?: number): SyncAction;
|
|
78
74
|
/**
|
|
79
|
-
*
|
|
75
|
+
* Builds a batch of deltas with sequential sync IDs.
|
|
80
76
|
*/
|
|
81
|
-
export declare function createDeltaBatch(deltas:
|
|
77
|
+
export declare function createDeltaBatch(deltas: Omit<CreateDeltaOptions, 'id'>[], startingSyncId?: number): SyncAction[];
|
|
82
78
|
/**
|
|
83
|
-
*
|
|
84
|
-
*
|
|
79
|
+
* Builds a confirmation delta, which signals that a mutation was persisted
|
|
80
|
+
* by the server. The client's transaction queue watches for these to
|
|
81
|
+
* confirm its in-flight writes.
|
|
85
82
|
*/
|
|
86
83
|
export declare function createConfirmationDelta(modelName: string, modelId: string, syncId: number, action?: SyncActionType, data?: Record<string, unknown>): SyncAction;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Factories that build well-formed delta objects for tests. A delta, a
|
|
3
|
+
* {@link SyncAction}, is a single change to one model instance in the wire
|
|
4
|
+
* format the server sends: an insert, update, delete, archive, and so on.
|
|
5
|
+
* These helpers let tests construct deltas without a live server.
|
|
5
6
|
*/
|
|
6
7
|
let deltaCounter = 0;
|
|
7
8
|
/** Reset the delta counter (call in beforeEach for deterministic IDs) */
|
|
@@ -9,7 +10,7 @@ export function resetDeltaCounter() {
|
|
|
9
10
|
deltaCounter = 0;
|
|
10
11
|
}
|
|
11
12
|
/**
|
|
12
|
-
*
|
|
13
|
+
* Builds a single delta ({@link SyncAction}) in the server's wire format.
|
|
13
14
|
*/
|
|
14
15
|
export function createDelta(options) {
|
|
15
16
|
deltaCounter++;
|
|
@@ -23,25 +24,25 @@ export function createDelta(options) {
|
|
|
23
24
|
};
|
|
24
25
|
}
|
|
25
26
|
/**
|
|
26
|
-
*
|
|
27
|
+
* Builds an insert delta for a new entity.
|
|
27
28
|
*/
|
|
28
29
|
export function createInsertDelta(modelName, modelId, data, syncId) {
|
|
29
30
|
return createDelta({ modelName, modelId, action: 'I', data, id: syncId });
|
|
30
31
|
}
|
|
31
32
|
/**
|
|
32
|
-
*
|
|
33
|
+
* Builds an update delta for an existing entity.
|
|
33
34
|
*/
|
|
34
35
|
export function createUpdateDelta(modelName, modelId, data, syncId) {
|
|
35
36
|
return createDelta({ modelName, modelId, action: 'U', data, id: syncId });
|
|
36
37
|
}
|
|
37
38
|
/**
|
|
38
|
-
*
|
|
39
|
+
* Builds a delete delta.
|
|
39
40
|
*/
|
|
40
41
|
export function createDeleteDelta(modelName, modelId, syncId) {
|
|
41
42
|
return createDelta({ modelName, modelId, action: 'D', data: {}, id: syncId });
|
|
42
43
|
}
|
|
43
44
|
/**
|
|
44
|
-
*
|
|
45
|
+
* Builds an archive delta, stamping `archivedAt` with the current time.
|
|
45
46
|
*/
|
|
46
47
|
export function createArchiveDelta(modelName, modelId, syncId) {
|
|
47
48
|
return createDelta({
|
|
@@ -53,7 +54,7 @@ export function createArchiveDelta(modelName, modelId, syncId) {
|
|
|
53
54
|
});
|
|
54
55
|
}
|
|
55
56
|
/**
|
|
56
|
-
*
|
|
57
|
+
* Builds an unarchive delta, clearing `archivedAt`.
|
|
57
58
|
*/
|
|
58
59
|
export function createUnarchiveDelta(modelName, modelId, syncId) {
|
|
59
60
|
return createDelta({
|
|
@@ -65,22 +66,20 @@ export function createUnarchiveDelta(modelName, modelId, syncId) {
|
|
|
65
66
|
});
|
|
66
67
|
}
|
|
67
68
|
/**
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* store as if newly created. Typically follows a GroupAdded delta.
|
|
69
|
+
* Builds a covering ('C') delta. It signals that the client has gained
|
|
70
|
+
* permission to see an entity that already exists. The client treats it
|
|
71
|
+
* like an insert, adding the entity to its local store as if newly created.
|
|
72
|
+
* A covering delta typically follows a group-added delta.
|
|
73
73
|
*/
|
|
74
74
|
export function createCoveringDelta(modelName, modelId, data, syncId) {
|
|
75
75
|
return createDelta({ modelName, modelId, action: 'C', data, id: syncId });
|
|
76
76
|
}
|
|
77
77
|
/**
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
* (addedGroups/removedGroups), this does not trigger a re-bootstrap.
|
|
78
|
+
* Builds a group-added ('G') delta in the incremental payload shape. It
|
|
79
|
+
* signals that the recipient was added to a single sync group. The client
|
|
80
|
+
* updates its subscription state and waits for covering deltas to deliver
|
|
81
|
+
* the newly visible entities. Unlike the older payload that carries both
|
|
82
|
+
* added and removed groups, this shape does not trigger a re-bootstrap.
|
|
84
83
|
*/
|
|
85
84
|
export function createGroupAddedDelta(userId, group, syncId) {
|
|
86
85
|
return createDelta({
|
|
@@ -92,11 +91,10 @@ export function createGroupAddedDelta(userId, group, syncId) {
|
|
|
92
91
|
});
|
|
93
92
|
}
|
|
94
93
|
/**
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
* the deprecated EmitGroupChange path.
|
|
94
|
+
* Builds a group-change ('G') delta in the older payload shape, which
|
|
95
|
+
* carries both added and removed groups in one delta and forces a full
|
|
96
|
+
* re-bootstrap on the client. Useful for testing backward compatibility
|
|
97
|
+
* with that older shape.
|
|
100
98
|
*/
|
|
101
99
|
export function createLegacyGroupChangeDelta(userId, added, removed, syncId) {
|
|
102
100
|
return createDelta({
|
|
@@ -108,11 +106,9 @@ export function createLegacyGroupChangeDelta(userId, added, removed, syncId) {
|
|
|
108
106
|
});
|
|
109
107
|
}
|
|
110
108
|
/**
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
* purges affected local state and triggers a re-bootstrap with the
|
|
115
|
-
* updated group list.
|
|
109
|
+
* Builds a group-removed ('S') delta. It signals that the recipient lost
|
|
110
|
+
* access to a sync group. The client purges the affected local state and
|
|
111
|
+
* re-bootstraps with the updated group list.
|
|
116
112
|
*/
|
|
117
113
|
export function createGroupRemovedDelta(userId, group, syncId) {
|
|
118
114
|
return createDelta({
|
|
@@ -124,15 +120,16 @@ export function createGroupRemovedDelta(userId, group, syncId) {
|
|
|
124
120
|
});
|
|
125
121
|
}
|
|
126
122
|
/**
|
|
127
|
-
*
|
|
123
|
+
* Builds a batch of deltas with sequential sync IDs.
|
|
128
124
|
*/
|
|
129
125
|
export function createDeltaBatch(deltas, startingSyncId) {
|
|
130
126
|
const start = startingSyncId ?? deltaCounter + 1;
|
|
131
127
|
return deltas.map((d, i) => createDelta({ ...d, id: start + i }));
|
|
132
128
|
}
|
|
133
129
|
/**
|
|
134
|
-
*
|
|
135
|
-
*
|
|
130
|
+
* Builds a confirmation delta, which signals that a mutation was persisted
|
|
131
|
+
* by the server. The client's transaction queue watches for these to
|
|
132
|
+
* confirm its in-flight writes.
|
|
136
133
|
*/
|
|
137
134
|
export function createConfirmationDelta(modelName, modelId, syncId, action = 'U', data = {}) {
|
|
138
135
|
return createDelta({ modelName, modelId, action, data, id: syncId });
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* TestSlideDeck (10) → TestSlide (15, FK→SlideDeck) → TestSlideLayer (20, FK→Slide)
|
|
2
|
+
* A small set of {@link Model} subclasses used across the package's tests.
|
|
3
|
+
* They form two foreign-key chains and carry the creation priorities the
|
|
4
|
+
* transaction queue uses to order dependent writes:
|
|
5
|
+
* TestProject (10) → TestTask (10, references Project) → TestComment (30, references Task)
|
|
6
|
+
* TestSlideDeck (10) → TestSlide (15, references SlideDeck) → TestSlideLayer (20, references Slide)
|
|
8
7
|
*/
|
|
9
8
|
import { Model } from '../../Model.js';
|
|
10
9
|
import { ModelRegistry } from '../../ModelRegistry.js';
|
|
@@ -54,16 +53,18 @@ export declare class TestSlideLayer extends Model {
|
|
|
54
53
|
getModelName(): string;
|
|
55
54
|
}
|
|
56
55
|
/**
|
|
57
|
-
*
|
|
56
|
+
* Maps each test model to its creation priority, matching the order the
|
|
57
|
+
* transaction queue uses when writing dependent models.
|
|
58
58
|
*/
|
|
59
59
|
export declare const TEST_MODEL_PRIORITIES: Map<string, number>;
|
|
60
60
|
/**
|
|
61
|
-
*
|
|
62
|
-
*
|
|
61
|
+
* Registers every test model with a {@link ModelRegistry}, wiring up their
|
|
62
|
+
* properties, references, and foreign-key relationships.
|
|
63
63
|
*/
|
|
64
64
|
export declare function registerTestModels(registry: ModelRegistry): void;
|
|
65
65
|
/**
|
|
66
|
-
*
|
|
66
|
+
* Builds a sync engine configuration pre-loaded with the test models'
|
|
67
|
+
* creation priorities and related settings.
|
|
67
68
|
*/
|
|
68
69
|
export declare function createTestConfig(): {
|
|
69
70
|
modelCreatePriority: ReadonlyMap<string, number>;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* TestSlideDeck (10) → TestSlide (15, FK→SlideDeck) → TestSlideLayer (20, FK→Slide)
|
|
2
|
+
* A small set of {@link Model} subclasses used across the package's tests.
|
|
3
|
+
* They form two foreign-key chains and carry the creation priorities the
|
|
4
|
+
* transaction queue uses to order dependent writes:
|
|
5
|
+
* TestProject (10) → TestTask (10, references Project) → TestComment (30, references Task)
|
|
6
|
+
* TestSlideDeck (10) → TestSlide (15, references SlideDeck) → TestSlideLayer (20, references Slide)
|
|
8
7
|
*/
|
|
9
8
|
import { Model } from '../../Model.js';
|
|
9
|
+
import { ModelRegistry } from '../../ModelRegistry.js';
|
|
10
10
|
import { PropertyType, LoadStrategy } from '../../types/index.js';
|
|
11
11
|
// ─────────────────────────────────────────────
|
|
12
12
|
// Test Model Classes
|
|
@@ -126,7 +126,8 @@ export class TestSlideLayer extends Model {
|
|
|
126
126
|
// Model Registration Helper
|
|
127
127
|
// ─────────────────────────────────────────────
|
|
128
128
|
/**
|
|
129
|
-
*
|
|
129
|
+
* Maps each test model to its creation priority, matching the order the
|
|
130
|
+
* transaction queue uses when writing dependent models.
|
|
130
131
|
*/
|
|
131
132
|
export const TEST_MODEL_PRIORITIES = new Map([
|
|
132
133
|
['Project', 10],
|
|
@@ -137,8 +138,8 @@ export const TEST_MODEL_PRIORITIES = new Map([
|
|
|
137
138
|
['Comment', 30],
|
|
138
139
|
]);
|
|
139
140
|
/**
|
|
140
|
-
*
|
|
141
|
-
*
|
|
141
|
+
* Registers every test model with a {@link ModelRegistry}, wiring up their
|
|
142
|
+
* properties, references, and foreign-key relationships.
|
|
142
143
|
*/
|
|
143
144
|
export function registerTestModels(registry) {
|
|
144
145
|
registry.startBatch();
|
|
@@ -182,7 +183,8 @@ export function registerTestModels(registry) {
|
|
|
182
183
|
// Test SyncEngineConfig factory
|
|
183
184
|
// ─────────────────────────────────────────────
|
|
184
185
|
/**
|
|
185
|
-
*
|
|
186
|
+
* Builds a sync engine configuration pre-loaded with the test models'
|
|
187
|
+
* creation priorities and related settings.
|
|
186
188
|
*/
|
|
187
189
|
export function createTestConfig() {
|
|
188
190
|
return {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* React
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* React testing helpers for this package. They wire the package's
|
|
3
|
+
* `SyncProvider` into `@testing-library/react` so you can test components
|
|
4
|
+
* and hooks built on `useModel`, `useModels`, and `useMutations` against a
|
|
5
|
+
* mock store, with no live server.
|
|
6
6
|
*/
|
|
7
7
|
import * as React from 'react';
|
|
8
8
|
import { type SyncStoreContract } from '../../react/context.js';
|
|
@@ -14,8 +14,10 @@ export interface TestWrapperOptions {
|
|
|
14
14
|
organizationId?: string;
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
17
|
+
* Builds a wrapper component for `@testing-library/react`'s `renderHook`
|
|
18
|
+
* and `render`. It wraps the children in the package's `SyncProvider`,
|
|
19
|
+
* backed by a mock store, so the hooks and components under test can read
|
|
20
|
+
* from it. Pass your own store to seed specific data, or let one be created.
|
|
19
21
|
*
|
|
20
22
|
* @example
|
|
21
23
|
* import { renderHook } from '@testing-library/react';
|
|
@@ -33,11 +35,12 @@ export declare function createReactTestWrapper(options?: TestWrapperOptions): Re
|
|
|
33
35
|
children: React.ReactNode;
|
|
34
36
|
}>;
|
|
35
37
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
+
* A drop-in replacement for `@testing-library/react`'s `renderHook` that
|
|
39
|
+
* wraps the hook in the package's `SyncProvider` and a mock store for you,
|
|
40
|
+
* so you don't build the wrapper by hand.
|
|
38
41
|
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
42
|
+
* `@testing-library/react` is loaded lazily, so projects that don't use
|
|
43
|
+
* these helpers never have to install it.
|
|
41
44
|
*
|
|
42
45
|
* @example
|
|
43
46
|
* import { renderSyncHook, createMockSyncStore } from '@abloatai/ablo/testing';
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* React
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* React testing helpers for this package. They wire the package's
|
|
3
|
+
* `SyncProvider` into `@testing-library/react` so you can test components
|
|
4
|
+
* and hooks built on `useModel`, `useModels`, and `useMutations` against a
|
|
5
|
+
* mock store, with no live server.
|
|
6
6
|
*/
|
|
7
7
|
import * as React from 'react';
|
|
8
8
|
import { SyncProvider } from '../../react/context.js';
|
|
9
9
|
import { MockSyncStore, createMockSyncStore } from '../mocks/MockSyncStore.js';
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
11
|
+
* Builds a wrapper component for `@testing-library/react`'s `renderHook`
|
|
12
|
+
* and `render`. It wraps the children in the package's `SyncProvider`,
|
|
13
|
+
* backed by a mock store, so the hooks and components under test can read
|
|
14
|
+
* from it. Pass your own store to seed specific data, or let one be created.
|
|
13
15
|
*
|
|
14
16
|
* @example
|
|
15
17
|
* import { renderHook } from '@testing-library/react';
|
|
@@ -30,11 +32,12 @@ export function createReactTestWrapper(options = {}) {
|
|
|
30
32
|
return Wrapper;
|
|
31
33
|
}
|
|
32
34
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
+
* A drop-in replacement for `@testing-library/react`'s `renderHook` that
|
|
36
|
+
* wraps the hook in the package's `SyncProvider` and a mock store for you,
|
|
37
|
+
* so you don't build the wrapper by hand.
|
|
35
38
|
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
39
|
+
* `@testing-library/react` is loaded lazily, so projects that don't use
|
|
40
|
+
* these helpers never have to install it.
|
|
38
41
|
*
|
|
39
42
|
* @example
|
|
40
43
|
* import { renderSyncHook, createMockSyncStore } from '@abloatai/ablo/testing';
|
|
@@ -49,8 +52,8 @@ export function createReactTestWrapper(options = {}) {
|
|
|
49
52
|
* expect(result.current?.id).toBe(myTask.id);
|
|
50
53
|
*/
|
|
51
54
|
export function renderSyncHook(callback, options = {}) {
|
|
52
|
-
//
|
|
53
|
-
// to install it
|
|
55
|
+
// Load @testing-library/react lazily so projects that never call these
|
|
56
|
+
// helpers don't have to install it.
|
|
54
57
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
55
58
|
const rtl = require('@testing-library/react');
|
|
56
59
|
return rtl.renderHook(callback, {
|
|
@@ -1,32 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* An integration-test harness that assembles a full sync engine stack —
|
|
3
|
+
* the model registry, object pool, transaction queue, and related parts —
|
|
4
|
+
* from the real implementations, but with mocked input and output. It lets
|
|
5
|
+
* tests exercise the engine end to end without a network or a live server.
|
|
6
6
|
*/
|
|
7
7
|
import { ModelRegistry } from '../../ModelRegistry.js';
|
|
8
|
-
import {
|
|
8
|
+
import { InstanceCache } from '../../InstanceCache.js';
|
|
9
9
|
import { MockMutationExecutor } from '../mocks/MockMutationExecutor.js';
|
|
10
10
|
import { MockNetworkMonitor } from '../mocks/MockNetworkMonitor.js';
|
|
11
11
|
import { MockWebSocket } from '../mocks/MockWebSocket.js';
|
|
12
|
-
import { MockMutationDispatcher } from '../mocks/MockSyncContext.js';
|
|
13
12
|
import type { TestContextResult } from '../mocks/MockSyncContext.js';
|
|
14
13
|
export interface TestHarness {
|
|
15
|
-
/**
|
|
14
|
+
/** A model registry pre-loaded with the test models. */
|
|
16
15
|
registry: ModelRegistry;
|
|
17
|
-
/**
|
|
18
|
-
pool:
|
|
19
|
-
/**
|
|
16
|
+
/** A real object pool with the test foreign-key indexes configured. */
|
|
17
|
+
pool: InstanceCache;
|
|
18
|
+
/** A mock WebSocket for injecting deltas into the engine. */
|
|
20
19
|
webSocket: MockWebSocket;
|
|
21
|
-
/**
|
|
20
|
+
/** The dependency-injection context holding every mock. */
|
|
22
21
|
context: TestContextResult;
|
|
23
|
-
/** Shorthand
|
|
22
|
+
/** Shorthand for the mock mutation executor on {@link context}. */
|
|
24
23
|
mutationExecutor: MockMutationExecutor;
|
|
25
|
-
/** Shorthand
|
|
24
|
+
/** Shorthand for the mock network monitor on {@link context}. */
|
|
26
25
|
networkMonitor: MockNetworkMonitor;
|
|
27
|
-
/**
|
|
28
|
-
mutationDispatcher: MockMutationDispatcher;
|
|
29
|
-
/** Cleanup everything */
|
|
26
|
+
/** Tears down the harness and resets its counters. */
|
|
30
27
|
cleanup: () => void;
|
|
31
28
|
}
|
|
32
29
|
export interface TestHarnessOptions {
|
|
@@ -34,7 +31,7 @@ export interface TestHarnessOptions {
|
|
|
34
31
|
startOffline?: boolean;
|
|
35
32
|
/** Initial sync ID for mutation executor */
|
|
36
33
|
initialSyncId?: number;
|
|
37
|
-
/**
|
|
34
|
+
/** InstanceCache config overrides */
|
|
38
35
|
poolConfig?: {
|
|
39
36
|
maxSize?: number;
|
|
40
37
|
maxAge?: number;
|
|
@@ -43,7 +40,9 @@ export interface TestHarnessOptions {
|
|
|
43
40
|
};
|
|
44
41
|
}
|
|
45
42
|
/**
|
|
46
|
-
*
|
|
43
|
+
* Builds a full test harness: real sync engine components wired to mocked
|
|
44
|
+
* input and output. Reset the counters and tear everything down through the
|
|
45
|
+
* returned {@link TestHarness.cleanup}.
|
|
47
46
|
*
|
|
48
47
|
* Usage:
|
|
49
48
|
* ```ts
|