@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
package/dist/Model.d.ts
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Model
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* - Return updates/changes (not perform them)
|
|
9
|
-
*
|
|
10
|
-
* Models do NOT:
|
|
11
|
-
* - Access stores or singletons
|
|
12
|
-
* - Perform side effects (saving, notifications)
|
|
13
|
-
* - Know about sync infrastructure
|
|
2
|
+
* Model is the base class for the sync engine's domain models. A model is a
|
|
3
|
+
* plain domain object: it holds data and business logic, tracks its own
|
|
4
|
+
* property changes, and validates itself, and it returns the changes to apply
|
|
5
|
+
* rather than applying them. It does not reach into stores or singletons and
|
|
6
|
+
* does not perform side effects such as saving or sending notifications;
|
|
7
|
+
* persistence and sync are driven by the store that owns the model.
|
|
14
8
|
*/
|
|
15
9
|
/** Store interface — methods that Model subclasses can call on the store */
|
|
16
10
|
interface SyncStoreRef {
|
|
@@ -67,9 +61,10 @@ export interface ModelChanges {
|
|
|
67
61
|
timestamp: Date;
|
|
68
62
|
}
|
|
69
63
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
64
|
+
* The abstract base class every domain model extends. It holds the model's id
|
|
65
|
+
* and timestamps, tracks in-place property changes for change detection and
|
|
66
|
+
* undo, and serializes itself, while leaving persistence and sync to the store
|
|
67
|
+
* that owns it.
|
|
73
68
|
*/
|
|
74
69
|
export declare abstract class Model {
|
|
75
70
|
/** Static reference to active SyncedStore for reactive queries */
|
|
@@ -156,27 +151,17 @@ export declare abstract class Model {
|
|
|
156
151
|
*/
|
|
157
152
|
isNew(): boolean;
|
|
158
153
|
/**
|
|
159
|
-
*
|
|
160
|
-
* load.
|
|
161
|
-
*
|
|
162
|
-
* `modifiedProperties
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
* Architectural note: this method exists because we allow direct
|
|
166
|
-
* property writes (`slide.title = 'foo'`) AND mutator-recorded
|
|
167
|
-
* writes to coexist. Zero / Replicache structurally avoids this:
|
|
168
|
-
* every mutation MUST go through a registered mutator function,
|
|
169
|
-
* mutator args are serialized, and on server pull all unacked
|
|
170
|
-
* mutations are dropped and the mutator functions are replayed on
|
|
171
|
-
* the new basis (rebase). That makes per-instance baselines
|
|
172
|
-
* unnecessary because the b-tree at the new basis IS the
|
|
173
|
-
* authoritative pre-session state.
|
|
154
|
+
* Return a read-only view of the snapshot taken at {@link markAsPersisted}
|
|
155
|
+
* or at load time. The undo machinery uses it to recover a field's pre-edit
|
|
156
|
+
* value when the field was written without first being tracked in
|
|
157
|
+
* `modifiedProperties`. The returned object is the live snapshot, so callers
|
|
158
|
+
* must not mutate it.
|
|
174
159
|
*
|
|
175
|
-
*
|
|
176
|
-
*
|
|
177
|
-
* `
|
|
178
|
-
*
|
|
179
|
-
*
|
|
160
|
+
* This per-instance baseline is needed because application code can edit a
|
|
161
|
+
* model in two ways that coexist: a direct property write
|
|
162
|
+
* (`slide.title = 'foo'`) and a recorded mutation. A design in which every
|
|
163
|
+
* write went through a single recorded path would not need it, since the
|
|
164
|
+
* last acknowledged state would already be the authoritative baseline.
|
|
180
165
|
*/
|
|
181
166
|
getOriginalSnapshot(): Readonly<ModelData> | undefined;
|
|
182
167
|
/**
|
|
@@ -184,7 +169,7 @@ export declare abstract class Model {
|
|
|
184
169
|
*/
|
|
185
170
|
clearChanges(): void;
|
|
186
171
|
/**
|
|
187
|
-
* Capture a before-image for `keys` — the
|
|
172
|
+
* Capture a before-image for `keys` — the single source of truth for the
|
|
188
173
|
* "previous value" that undo inverses are built from. Both undo paths call
|
|
189
174
|
* this so they can never drift: the stream path
|
|
190
175
|
* (`TransactionQueue.extractPreviousData`) and the manual-record path
|
|
@@ -194,10 +179,10 @@ export declare abstract class Model {
|
|
|
194
179
|
* 1. `modifiedProperties.get(key).old` — first-old-wins pre-session
|
|
195
180
|
* baseline, set whenever the field was mutated in place before commit.
|
|
196
181
|
* 2. `getOriginalSnapshot()[key]` — the last loaded/acked row, the correct
|
|
197
|
-
* before-image for a key written
|
|
182
|
+
* before-image for a key written without a prior in-place mutation
|
|
198
183
|
* (e.g. a `precomputedChanges` write).
|
|
199
184
|
* 3. `fallbackToLive` only — the current live value. The manual-record path
|
|
200
|
-
* wants this last resort; the stream path deliberately
|
|
185
|
+
* wants this last resort; the stream path deliberately omits unresolved
|
|
201
186
|
* keys so `buildUndoOps` drops an un-revertible inverse rather than
|
|
202
187
|
* inventing one. The flag is the one intentional difference between the
|
|
203
188
|
* two callers — do not collapse it.
|
|
@@ -205,8 +190,8 @@ export declare abstract class Model {
|
|
|
205
190
|
* `id` is always skipped. Values are read out per-key, so the
|
|
206
191
|
* `getOriginalSnapshot()` "callers must not mutate" contract is preserved.
|
|
207
192
|
*
|
|
208
|
-
* Invariant this relies on: a given undo scope is
|
|
209
|
-
* (`recordFromStream: true`)
|
|
193
|
+
* Invariant this relies on: a given undo scope is either stream-recorded
|
|
194
|
+
* (`recordFromStream: true`) or manual (`useMutators({ undoScope })`), never
|
|
210
195
|
* both — otherwise a write would be captured twice. No surface sets both.
|
|
211
196
|
*/
|
|
212
197
|
capturePreviousValues(keys: Iterable<string>, opts?: {
|
|
@@ -214,7 +199,7 @@ export declare abstract class Model {
|
|
|
214
199
|
}): ModelData;
|
|
215
200
|
/**
|
|
216
201
|
* Drop the `modifiedProperties` entries for `keys` — re-baselines a field
|
|
217
|
-
* after its `.old` has been frozen into a committed transaction, so the
|
|
202
|
+
* after its `.old` has been frozen into a committed transaction, so the next
|
|
218
203
|
* write to the same field starts from this commit's result rather than the
|
|
219
204
|
* stale pre-session `.old` that {@link propertyChanged}'s first-old-wins
|
|
220
205
|
* policy preserves. Safe because the committed transaction owns its own
|
|
@@ -257,7 +242,7 @@ export declare abstract class Model {
|
|
|
257
242
|
* properties, and coercing date fields. Shared by `updateFromData`
|
|
258
243
|
* (hydration) and `applyChanges` (local user update).
|
|
259
244
|
*
|
|
260
|
-
* Change tracking is
|
|
245
|
+
* Change tracking is explicit: for every field actually
|
|
261
246
|
* written, `onWrite(key, oldValue, newValue)` is invoked with the value
|
|
262
247
|
* captured immediately before assignment. `applyChanges` passes a hook
|
|
263
248
|
* that records the change in `modifiedProperties`; `updateFromData`
|
|
@@ -270,10 +255,10 @@ export declare abstract class Model {
|
|
|
270
255
|
* Update from raw data (hydration)
|
|
271
256
|
*
|
|
272
257
|
* Used for inbound server deltas and pool upserts. Change tracking is
|
|
273
|
-
* deliberately suppressed: hydration writes must
|
|
258
|
+
* deliberately suppressed: hydration writes must not land in
|
|
274
259
|
* `modifiedProperties`, otherwise applying a server delta would queue a
|
|
275
260
|
* brand-new outbound mutation and the record would echo forever. For a
|
|
276
|
-
*
|
|
261
|
+
* local user edit, use `applyChanges` instead.
|
|
277
262
|
*
|
|
278
263
|
* Suppression is belt-and-suspenders: we pass no `onWrite` hook AND
|
|
279
264
|
* clear/restore `modifiedProperties` around the assignment, so any
|
|
@@ -282,18 +267,18 @@ export declare abstract class Model {
|
|
|
282
267
|
*/
|
|
283
268
|
updateFromData(data: ModelData): void;
|
|
284
269
|
/**
|
|
285
|
-
* Apply a
|
|
286
|
-
* path for `proxy.update({ id, data })`, which is the
|
|
270
|
+
* Apply a local, user-initiated update from a data object — the write
|
|
271
|
+
* path for `proxy.update({ id, data })`, which is the one and only way
|
|
287
272
|
* application code mutates synced fields.
|
|
288
273
|
*
|
|
289
274
|
* Unlike `updateFromData` (hydration, untracked), this records every
|
|
290
275
|
* written field in `modifiedProperties` via `propertyChanged`, so
|
|
291
|
-
* `getChanges()`
|
|
292
|
-
* server and the undo system gets a correct pre-write baseline.
|
|
293
|
-
*
|
|
294
|
-
*
|
|
276
|
+
* `getChanges()` and the transaction queue send the edited fields to the
|
|
277
|
+
* server and the undo system gets a correct pre-write baseline. Recording
|
|
278
|
+
* is explicit here, through the `onWrite` hook, and does not rely on any
|
|
279
|
+
* MobX `observe()` side channel.
|
|
295
280
|
*
|
|
296
|
-
* `_originalData` is intentionally
|
|
281
|
+
* `_originalData` is intentionally not reset here: it stays as the
|
|
297
282
|
* last-persisted baseline until `clearChanges()` runs on sync-ack.
|
|
298
283
|
*/
|
|
299
284
|
applyChanges(data: ModelData): void;
|
|
@@ -335,7 +320,7 @@ export declare abstract class Model {
|
|
|
335
320
|
_unregisterObservedCollection(collection: Disposable): void;
|
|
336
321
|
/**
|
|
337
322
|
* Check if any collection on this model is currently being observed by React
|
|
338
|
-
* Used by
|
|
323
|
+
* Used by InstanceCache GC to prevent disposing models in active use
|
|
339
324
|
*/
|
|
340
325
|
hasObservedCollections(): boolean;
|
|
341
326
|
/**
|
package/dist/Model.js
CHANGED
|
@@ -1,20 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Model
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* - Return updates/changes (not perform them)
|
|
9
|
-
*
|
|
10
|
-
* Models do NOT:
|
|
11
|
-
* - Access stores or singletons
|
|
12
|
-
* - Perform side effects (saving, notifications)
|
|
13
|
-
* - Know about sync infrastructure
|
|
2
|
+
* Model is the base class for the sync engine's domain models. A model is a
|
|
3
|
+
* plain domain object: it holds data and business logic, tracks its own
|
|
4
|
+
* property changes, and validates itself, and it returns the changes to apply
|
|
5
|
+
* rather than applying them. It does not reach into stores or singletons and
|
|
6
|
+
* does not perform side effects such as saving or sending notifications;
|
|
7
|
+
* persistence and sync are driven by the store that owns the model.
|
|
14
8
|
*/
|
|
15
9
|
import { runInAction, isComputedProp } from 'mobx';
|
|
16
10
|
import { v4 as uuid } from 'uuid';
|
|
17
|
-
import { M1 } from './utils/
|
|
11
|
+
import { M1 } from './utils/mobxSetup.js';
|
|
18
12
|
import { getActiveRegistry, hasActiveRegistry } from './ModelRegistry.js';
|
|
19
13
|
import { getContext } from './context.js';
|
|
20
14
|
import { AbloValidationError } from './errors.js';
|
|
@@ -30,9 +24,10 @@ export class ValidationError extends Error {
|
|
|
30
24
|
}
|
|
31
25
|
}
|
|
32
26
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
27
|
+
* The abstract base class every domain model extends. It holds the model's id
|
|
28
|
+
* and timestamps, tracks in-place property changes for change detection and
|
|
29
|
+
* undo, and serializes itself, while leaving persistence and sync to the store
|
|
30
|
+
* that owns it.
|
|
36
31
|
*/
|
|
37
32
|
export class Model {
|
|
38
33
|
/** Static reference to active SyncedStore for reactive queries */
|
|
@@ -70,7 +65,7 @@ export class Model {
|
|
|
70
65
|
_observedCollections = new Set();
|
|
71
66
|
constructor(data = {}) {
|
|
72
67
|
// Always generate permanent UUID on client
|
|
73
|
-
this.id = data.id
|
|
68
|
+
this.id = data.id ?? Model.generateId();
|
|
74
69
|
this.clientId = this.id; // No more temp IDs!
|
|
75
70
|
// Ensure dates are Date objects, not strings
|
|
76
71
|
this.createdAt = data.createdAt
|
|
@@ -91,7 +86,7 @@ export class Model {
|
|
|
91
86
|
: data.createdAt
|
|
92
87
|
? new Date(this.createdAt)
|
|
93
88
|
: new Date();
|
|
94
|
-
this.syncStatus = data.syncStatus
|
|
89
|
+
this.syncStatus = data.syncStatus ?? 'pending';
|
|
95
90
|
}
|
|
96
91
|
/**
|
|
97
92
|
* Generate unique ID
|
|
@@ -189,27 +184,17 @@ export class Model {
|
|
|
189
184
|
return this._isNew;
|
|
190
185
|
}
|
|
191
186
|
/**
|
|
192
|
-
*
|
|
193
|
-
* load.
|
|
194
|
-
*
|
|
195
|
-
* `modifiedProperties
|
|
196
|
-
*
|
|
187
|
+
* Return a read-only view of the snapshot taken at {@link markAsPersisted}
|
|
188
|
+
* or at load time. The undo machinery uses it to recover a field's pre-edit
|
|
189
|
+
* value when the field was written without first being tracked in
|
|
190
|
+
* `modifiedProperties`. The returned object is the live snapshot, so callers
|
|
191
|
+
* must not mutate it.
|
|
197
192
|
*
|
|
198
|
-
*
|
|
199
|
-
*
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
*
|
|
203
|
-
* mutations are dropped and the mutator functions are replayed on
|
|
204
|
-
* the new basis (rebase). That makes per-instance baselines
|
|
205
|
-
* unnecessary because the b-tree at the new basis IS the
|
|
206
|
-
* authoritative pre-session state.
|
|
207
|
-
*
|
|
208
|
-
* If we ever migrate to "mutators are the only write path," this
|
|
209
|
-
* snapshot field, `_originalData`, and most of
|
|
210
|
-
* `RecordingTransaction.snapshotFields` become dead code. See
|
|
211
|
-
* `packages/replicache/src/db/rebase.ts` (rocicorp/mono) for the
|
|
212
|
-
* pattern.
|
|
193
|
+
* This per-instance baseline is needed because application code can edit a
|
|
194
|
+
* model in two ways that coexist: a direct property write
|
|
195
|
+
* (`slide.title = 'foo'`) and a recorded mutation. A design in which every
|
|
196
|
+
* write went through a single recorded path would not need it, since the
|
|
197
|
+
* last acknowledged state would already be the authoritative baseline.
|
|
213
198
|
*/
|
|
214
199
|
getOriginalSnapshot() {
|
|
215
200
|
return this._originalData;
|
|
@@ -224,7 +209,7 @@ export class Model {
|
|
|
224
209
|
});
|
|
225
210
|
}
|
|
226
211
|
/**
|
|
227
|
-
* Capture a before-image for `keys` — the
|
|
212
|
+
* Capture a before-image for `keys` — the single source of truth for the
|
|
228
213
|
* "previous value" that undo inverses are built from. Both undo paths call
|
|
229
214
|
* this so they can never drift: the stream path
|
|
230
215
|
* (`TransactionQueue.extractPreviousData`) and the manual-record path
|
|
@@ -234,10 +219,10 @@ export class Model {
|
|
|
234
219
|
* 1. `modifiedProperties.get(key).old` — first-old-wins pre-session
|
|
235
220
|
* baseline, set whenever the field was mutated in place before commit.
|
|
236
221
|
* 2. `getOriginalSnapshot()[key]` — the last loaded/acked row, the correct
|
|
237
|
-
* before-image for a key written
|
|
222
|
+
* before-image for a key written without a prior in-place mutation
|
|
238
223
|
* (e.g. a `precomputedChanges` write).
|
|
239
224
|
* 3. `fallbackToLive` only — the current live value. The manual-record path
|
|
240
|
-
* wants this last resort; the stream path deliberately
|
|
225
|
+
* wants this last resort; the stream path deliberately omits unresolved
|
|
241
226
|
* keys so `buildUndoOps` drops an un-revertible inverse rather than
|
|
242
227
|
* inventing one. The flag is the one intentional difference between the
|
|
243
228
|
* two callers — do not collapse it.
|
|
@@ -245,8 +230,8 @@ export class Model {
|
|
|
245
230
|
* `id` is always skipped. Values are read out per-key, so the
|
|
246
231
|
* `getOriginalSnapshot()` "callers must not mutate" contract is preserved.
|
|
247
232
|
*
|
|
248
|
-
* Invariant this relies on: a given undo scope is
|
|
249
|
-
* (`recordFromStream: true`)
|
|
233
|
+
* Invariant this relies on: a given undo scope is either stream-recorded
|
|
234
|
+
* (`recordFromStream: true`) or manual (`useMutators({ undoScope })`), never
|
|
250
235
|
* both — otherwise a write would be captured twice. No surface sets both.
|
|
251
236
|
*/
|
|
252
237
|
capturePreviousValues(keys, opts) {
|
|
@@ -271,7 +256,7 @@ export class Model {
|
|
|
271
256
|
}
|
|
272
257
|
/**
|
|
273
258
|
* Drop the `modifiedProperties` entries for `keys` — re-baselines a field
|
|
274
|
-
* after its `.old` has been frozen into a committed transaction, so the
|
|
259
|
+
* after its `.old` has been frozen into a committed transaction, so the next
|
|
275
260
|
* write to the same field starts from this commit's result rather than the
|
|
276
261
|
* stale pre-session `.old` that {@link propertyChanged}'s first-old-wins
|
|
277
262
|
* policy preserves. Safe because the committed transaction owns its own
|
|
@@ -340,9 +325,7 @@ export class Model {
|
|
|
340
325
|
* Add validation rule
|
|
341
326
|
*/
|
|
342
327
|
addValidationRule(propName, rule) {
|
|
343
|
-
|
|
344
|
-
this.validationRules[propName] = [];
|
|
345
|
-
}
|
|
328
|
+
this.validationRules[propName] ??= [];
|
|
346
329
|
this.validationRules[propName].push(rule);
|
|
347
330
|
}
|
|
348
331
|
/**
|
|
@@ -364,7 +347,7 @@ export class Model {
|
|
|
364
347
|
// New model - return create operation
|
|
365
348
|
return {
|
|
366
349
|
type: 'create',
|
|
367
|
-
modelName: this.getModelName(), //
|
|
350
|
+
modelName: this.getModelName(), // the registered model name
|
|
368
351
|
modelId: this.id,
|
|
369
352
|
timestamp: new Date(),
|
|
370
353
|
};
|
|
@@ -373,7 +356,7 @@ export class Model {
|
|
|
373
356
|
// Existing model with changes - return update operation
|
|
374
357
|
return {
|
|
375
358
|
type: 'update',
|
|
376
|
-
modelName: this.getModelName(), //
|
|
359
|
+
modelName: this.getModelName(), // the registered model name
|
|
377
360
|
modelId: this.id,
|
|
378
361
|
changes: new Map(this.modifiedProperties),
|
|
379
362
|
timestamp: new Date(),
|
|
@@ -394,7 +377,7 @@ export class Model {
|
|
|
394
377
|
this.willDelete();
|
|
395
378
|
return {
|
|
396
379
|
type: 'delete',
|
|
397
|
-
modelName: this.getModelName(), //
|
|
380
|
+
modelName: this.getModelName(), // the registered model name
|
|
398
381
|
modelId: this.id,
|
|
399
382
|
timestamp: new Date(),
|
|
400
383
|
};
|
|
@@ -411,7 +394,7 @@ export class Model {
|
|
|
411
394
|
this.archivedAt = new Date();
|
|
412
395
|
return {
|
|
413
396
|
type: 'archive',
|
|
414
|
-
modelName: this.getModelName(), //
|
|
397
|
+
modelName: this.getModelName(), // the registered model name
|
|
415
398
|
modelId: this.id,
|
|
416
399
|
timestamp: new Date(),
|
|
417
400
|
};
|
|
@@ -428,7 +411,7 @@ export class Model {
|
|
|
428
411
|
this.archivedAt = null;
|
|
429
412
|
return {
|
|
430
413
|
type: 'unarchive',
|
|
431
|
-
modelName: this.getModelName(), //
|
|
414
|
+
modelName: this.getModelName(), // the registered model name
|
|
432
415
|
modelId: this.id,
|
|
433
416
|
timestamp: new Date(),
|
|
434
417
|
};
|
|
@@ -439,7 +422,7 @@ export class Model {
|
|
|
439
422
|
* properties, and coercing date fields. Shared by `updateFromData`
|
|
440
423
|
* (hydration) and `applyChanges` (local user update).
|
|
441
424
|
*
|
|
442
|
-
* Change tracking is
|
|
425
|
+
* Change tracking is explicit: for every field actually
|
|
443
426
|
* written, `onWrite(key, oldValue, newValue)` is invoked with the value
|
|
444
427
|
* captured immediately before assignment. `applyChanges` passes a hook
|
|
445
428
|
* that records the change in `modifiedProperties`; `updateFromData`
|
|
@@ -499,10 +482,10 @@ export class Model {
|
|
|
499
482
|
* Update from raw data (hydration)
|
|
500
483
|
*
|
|
501
484
|
* Used for inbound server deltas and pool upserts. Change tracking is
|
|
502
|
-
* deliberately suppressed: hydration writes must
|
|
485
|
+
* deliberately suppressed: hydration writes must not land in
|
|
503
486
|
* `modifiedProperties`, otherwise applying a server delta would queue a
|
|
504
487
|
* brand-new outbound mutation and the record would echo forever. For a
|
|
505
|
-
*
|
|
488
|
+
* local user edit, use `applyChanges` instead.
|
|
506
489
|
*
|
|
507
490
|
* Suppression is belt-and-suspenders: we pass no `onWrite` hook AND
|
|
508
491
|
* clear/restore `modifiedProperties` around the assignment, so any
|
|
@@ -529,18 +512,18 @@ export class Model {
|
|
|
529
512
|
this.didUpdate();
|
|
530
513
|
}
|
|
531
514
|
/**
|
|
532
|
-
* Apply a
|
|
533
|
-
* path for `proxy.update({ id, data })`, which is the
|
|
515
|
+
* Apply a local, user-initiated update from a data object — the write
|
|
516
|
+
* path for `proxy.update({ id, data })`, which is the one and only way
|
|
534
517
|
* application code mutates synced fields.
|
|
535
518
|
*
|
|
536
519
|
* Unlike `updateFromData` (hydration, untracked), this records every
|
|
537
520
|
* written field in `modifiedProperties` via `propertyChanged`, so
|
|
538
|
-
* `getChanges()`
|
|
539
|
-
* server and the undo system gets a correct pre-write baseline.
|
|
540
|
-
*
|
|
541
|
-
*
|
|
521
|
+
* `getChanges()` and the transaction queue send the edited fields to the
|
|
522
|
+
* server and the undo system gets a correct pre-write baseline. Recording
|
|
523
|
+
* is explicit here, through the `onWrite` hook, and does not rely on any
|
|
524
|
+
* MobX `observe()` side channel.
|
|
542
525
|
*
|
|
543
|
-
* `_originalData` is intentionally
|
|
526
|
+
* `_originalData` is intentionally not reset here: it stays as the
|
|
544
527
|
* last-persisted baseline until `clearChanges()` runs on sync-ack.
|
|
545
528
|
*/
|
|
546
529
|
applyChanges(data) {
|
|
@@ -566,8 +549,8 @@ export class Model {
|
|
|
566
549
|
const modelName = this.getModelName();
|
|
567
550
|
const properties = getActiveRegistry().getProperties(modelName);
|
|
568
551
|
const result = {
|
|
569
|
-
__class: this.getModelName(), //
|
|
570
|
-
__typename: this.getModelName(), //
|
|
552
|
+
__class: this.getModelName(), // the registered model name for consistency
|
|
553
|
+
__typename: this.getModelName(), // __typename mirrors __class as the wire type discriminator
|
|
571
554
|
id: this.id,
|
|
572
555
|
createdAt: this.createdAt?.toISOString(),
|
|
573
556
|
updatedAt: this.updatedAt?.toISOString(),
|
|
@@ -575,7 +558,7 @@ export class Model {
|
|
|
575
558
|
syncStatus: this.syncStatus,
|
|
576
559
|
};
|
|
577
560
|
if (this.archivedAt !== undefined) {
|
|
578
|
-
result.archivedAt = this.archivedAt?.toISOString()
|
|
561
|
+
result.archivedAt = this.archivedAt?.toISOString() ?? null;
|
|
579
562
|
}
|
|
580
563
|
if (properties) {
|
|
581
564
|
const self = this;
|
|
@@ -616,7 +599,7 @@ export class Model {
|
|
|
616
599
|
const className = this.constructor.name;
|
|
617
600
|
// Use consumer-provided fallback map from config (replaces hardcoded Prisma name map)
|
|
618
601
|
const fallbackMap = getContext().config.classNameFallbackMap;
|
|
619
|
-
return fallbackMap[className]
|
|
602
|
+
return fallbackMap[className] ?? className.replace(/Model$/, '');
|
|
620
603
|
}
|
|
621
604
|
/**
|
|
622
605
|
* Read a field value by name. Runtime-safe dynamic field access —
|
|
@@ -658,7 +641,7 @@ export class Model {
|
|
|
658
641
|
}
|
|
659
642
|
/**
|
|
660
643
|
* Check if any collection on this model is currently being observed by React
|
|
661
|
-
* Used by
|
|
644
|
+
* Used by InstanceCache GC to prevent disposing models in active use
|
|
662
645
|
*/
|
|
663
646
|
hasObservedCollections() {
|
|
664
647
|
return this._observedCollections.size > 0;
|
|
@@ -809,13 +792,13 @@ export class Model {
|
|
|
809
792
|
*/
|
|
810
793
|
static fromJSON(data) {
|
|
811
794
|
// Support both __class and __typename, and handle both old and new naming
|
|
812
|
-
const modelIdentifier = data.__typename
|
|
795
|
+
const modelIdentifier = data.__typename ?? data.__class ?? data.modelName;
|
|
813
796
|
if (!modelIdentifier) {
|
|
814
797
|
throw new AbloValidationError('Model identifier (__typename, __class, or modelName) not found in data', { code: 'model_identifier_missing' });
|
|
815
798
|
}
|
|
816
799
|
// Try to get model class by identifier
|
|
817
800
|
let ModelClass = getActiveRegistry().getModelByName(modelIdentifier);
|
|
818
|
-
// If not found
|
|
801
|
+
// If not found by registered name, try mapping to the class name
|
|
819
802
|
if (!ModelClass) {
|
|
820
803
|
const classNameMap = {
|
|
821
804
|
Task: 'TaskModel',
|
package/dist/ModelRegistry.d.ts
CHANGED
|
@@ -1,17 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ModelRegistry
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* - Comprehensive error reporting
|
|
10
|
-
* - Best practices from Linear Sync Engine
|
|
2
|
+
* ModelRegistry is the source of truth for model metadata: which model classes
|
|
3
|
+
* exist, the properties and references declared on each, the back-references
|
|
4
|
+
* used for cascade handling, and a stable hash of the whole schema.
|
|
5
|
+
* {@link Model} instances resolve their metadata through the active registry,
|
|
6
|
+
* and {@link InstanceCache} uses it to map between model names and constructor
|
|
7
|
+
* classes. References resolve lazily, so a model may declare a reference to
|
|
8
|
+
* another model that is registered later.
|
|
11
9
|
*/
|
|
12
|
-
import { ModelMetadata, PropertyMetadata, ReferenceMetadata, LoadStrategy } from './types/index.js';
|
|
10
|
+
import { type ModelMetadata, type PropertyMetadata, type ReferenceMetadata, LoadStrategy } from './types/index.js';
|
|
11
|
+
import type { Model } from './Model.js';
|
|
12
|
+
import type { ConcreteModelConstructor } from './BaseSyncedStore.js';
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
14
|
+
* What callers may hand to {@link ModelRegistry.registerModel}: any concrete
|
|
15
|
+
* `Model` subclass constructor. `never[]` params make every subclass
|
|
16
|
+
* constructor assignable (construct-signature params are contravariant).
|
|
17
|
+
*/
|
|
18
|
+
export type ModelClassInput = new (...args: never[]) => Model;
|
|
19
|
+
/**
|
|
20
|
+
* What the registry hands BACK: a registered model class — concretely
|
|
21
|
+
* constructible with an optional data row (`ConcreteModelConstructor`, the
|
|
22
|
+
* SDK's existing Model-vs-row construction seam) and carrying `Model`'s
|
|
23
|
+
* statics (`fromJSON`, …). `Omit<typeof Model, never>` keeps the statics
|
|
24
|
+
* while stripping the ABSTRACT construct signature (mapped types drop
|
|
25
|
+
* construct signatures), so `new registry.getModelByName(n)!(...)` is legal.
|
|
26
|
+
* The one cast from {@link ModelClassInput} lives at the validated
|
|
27
|
+
* registration boundary below.
|
|
28
|
+
*/
|
|
29
|
+
export type RegisteredModelClass = Omit<typeof Model, never> & ConcreteModelConstructor<Model>;
|
|
30
|
+
/**
|
|
31
|
+
* {@link ReferenceMetadata} extended with cascade behavior: what happens to a
|
|
32
|
+
* referencing model when the referenced model is deleted or archived.
|
|
15
33
|
*/
|
|
16
34
|
export interface ExtendedReferenceMetadata extends ReferenceMetadata {
|
|
17
35
|
onDelete?: 'cascade' | 'nullify' | 'restrict';
|
|
@@ -28,8 +46,9 @@ export interface SerializedReferenceMetadata extends Omit<ExtendedReferenceMetad
|
|
|
28
46
|
referencedModel: string;
|
|
29
47
|
}
|
|
30
48
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
49
|
+
* Metadata that records a child model's foreign key to a parent model, used
|
|
50
|
+
* for cascade-aware transaction handling: when the parent is deleted, the
|
|
51
|
+
* child's pending transactions can be cancelled.
|
|
33
52
|
*/
|
|
34
53
|
export interface BackReferenceMetadata {
|
|
35
54
|
/** The parent model name (e.g., 'SlideDeck') */
|
|
@@ -62,7 +81,6 @@ export declare class ModelRegistry {
|
|
|
62
81
|
private schemaHash?;
|
|
63
82
|
private config;
|
|
64
83
|
private registeredModels;
|
|
65
|
-
private batchMode;
|
|
66
84
|
private pendingHashUpdate;
|
|
67
85
|
constructor(config?: RegistryConfig);
|
|
68
86
|
private validateModelConstructor;
|
|
@@ -73,7 +91,7 @@ export declare class ModelRegistry {
|
|
|
73
91
|
/**
|
|
74
92
|
* Register a model with validation
|
|
75
93
|
*/
|
|
76
|
-
registerModel(name: string, constructor:
|
|
94
|
+
registerModel(name: string, constructor: ModelClassInput, metadata?: ModelMetadata): void;
|
|
77
95
|
/**
|
|
78
96
|
* Register property with validation
|
|
79
97
|
*/
|
|
@@ -83,19 +101,20 @@ export declare class ModelRegistry {
|
|
|
83
101
|
*/
|
|
84
102
|
registerReference(modelName: string, propertyName: string, metadata: ExtendedReferenceMetadata): void;
|
|
85
103
|
/**
|
|
86
|
-
*
|
|
104
|
+
* Register a back-reference for cascade-aware transaction handling.
|
|
87
105
|
*
|
|
88
|
-
* When a parent model is deleted, the
|
|
89
|
-
* transactions for
|
|
106
|
+
* When a parent model is deleted, the transaction queue cancels pending
|
|
107
|
+
* transactions for every child model that declares a back-reference to that
|
|
108
|
+
* parent.
|
|
90
109
|
*
|
|
91
|
-
* @param childModelName - The model that
|
|
92
|
-
* @param metadata -
|
|
110
|
+
* @param childModelName - The model that holds a foreign key to the parent (e.g., 'Slide')
|
|
111
|
+
* @param metadata - The back-reference configuration
|
|
93
112
|
*/
|
|
94
113
|
registerBackReference(childModelName: string, metadata: BackReferenceMetadata): void;
|
|
95
114
|
/** Get all models with specific load strategy. */
|
|
96
115
|
getModelsByLoadStrategy(strategy: LoadStrategy): string[];
|
|
97
116
|
/** Get model name from constructor (production-safe). */
|
|
98
|
-
getModelNameFromConstructor(constructor:
|
|
117
|
+
getModelNameFromConstructor(constructor: unknown): string | undefined;
|
|
99
118
|
/** Get properties for a model. */
|
|
100
119
|
getPropertiesForModel(modelName: string): Map<string, PropertyMetadata>;
|
|
101
120
|
/**
|
|
@@ -103,7 +122,7 @@ export declare class ModelRegistry {
|
|
|
103
122
|
*/
|
|
104
123
|
getRegisteredModelNames(): string[];
|
|
105
124
|
/** Get model constructor by name */
|
|
106
|
-
getModelByName(name: string):
|
|
125
|
+
getModelByName(name: string): RegisteredModelClass | undefined;
|
|
107
126
|
/** Check if model is registered */
|
|
108
127
|
hasModel(name: string): boolean;
|
|
109
128
|
/** Get model metadata by name */
|
|
@@ -117,12 +136,14 @@ export declare class ModelRegistry {
|
|
|
117
136
|
/** Get back-references for a child model */
|
|
118
137
|
getBackReferences(childModelName: string): BackReferenceMetadata[];
|
|
119
138
|
/** Get child models for a parent */
|
|
120
|
-
getChildModels(parentModelName: string):
|
|
139
|
+
getChildModels(parentModelName: string): {
|
|
121
140
|
childModel: string;
|
|
122
141
|
foreignKey: string;
|
|
123
|
-
}
|
|
142
|
+
}[];
|
|
124
143
|
/**
|
|
125
|
-
*
|
|
144
|
+
* Compute a stable hash of the registered schema — model names, property
|
|
145
|
+
* types, and their indexed and optional flags. Memoized until the schema
|
|
146
|
+
* changes.
|
|
126
147
|
*/
|
|
127
148
|
getSchemaHash(): string;
|
|
128
149
|
/**
|