@livestore/common 0.0.0-snapshot-2ef046b02334f52613d31dbe06af53487685edc0 → 0.0.0-snapshot-8115ad48d5a57244358c943ecc92bb0a30274b87
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/dist/.tsbuildinfo +1 -1
- package/dist/__tests__/fixture.d.ts +83 -221
- package/dist/__tests__/fixture.d.ts.map +1 -1
- package/dist/__tests__/fixture.js +33 -11
- package/dist/__tests__/fixture.js.map +1 -1
- package/dist/adapter-types.d.ts +34 -13
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +20 -2
- package/dist/adapter-types.js.map +1 -1
- package/dist/bounded-collections.d.ts +1 -1
- package/dist/bounded-collections.d.ts.map +1 -1
- package/dist/debug-info.d.ts.map +1 -1
- package/dist/debug-info.js +1 -0
- package/dist/debug-info.js.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +21 -21
- package/dist/devtools/devtools-messages-common.d.ts +6 -6
- package/dist/devtools/devtools-messages-leader.d.ts +45 -45
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +11 -11
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/index.d.ts +2 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -5
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +25 -12
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +146 -98
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/{apply-mutation.d.ts → apply-event.d.ts} +7 -7
- package/dist/leader-thread/apply-event.d.ts.map +1 -0
- package/dist/leader-thread/{apply-mutation.js → apply-event.js} +45 -45
- package/dist/leader-thread/apply-event.js.map +1 -0
- package/dist/leader-thread/eventlog.d.ts +27 -0
- package/dist/leader-thread/eventlog.d.ts.map +1 -0
- package/dist/leader-thread/eventlog.js +123 -0
- package/dist/leader-thread/eventlog.js.map +1 -0
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +21 -19
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +16 -4
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +23 -16
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/mod.d.ts +1 -1
- package/dist/leader-thread/mod.d.ts.map +1 -1
- package/dist/leader-thread/mod.js +1 -1
- package/dist/leader-thread/mod.js.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +6 -7
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/types.d.ts +14 -15
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/materializer-helper.d.ts +23 -0
- package/dist/materializer-helper.d.ts.map +1 -0
- package/dist/materializer-helper.js +70 -0
- package/dist/materializer-helper.js.map +1 -0
- package/dist/query-builder/api.d.ts +56 -51
- package/dist/query-builder/api.d.ts.map +1 -1
- package/dist/query-builder/api.js +3 -5
- package/dist/query-builder/api.js.map +1 -1
- package/dist/query-builder/astToSql.d.ts.map +1 -1
- package/dist/query-builder/astToSql.js +59 -37
- package/dist/query-builder/astToSql.js.map +1 -1
- package/dist/query-builder/impl.d.ts +2 -3
- package/dist/query-builder/impl.d.ts.map +1 -1
- package/dist/query-builder/impl.js +48 -46
- package/dist/query-builder/impl.js.map +1 -1
- package/dist/query-builder/impl.test.d.ts +86 -1
- package/dist/query-builder/impl.test.d.ts.map +1 -1
- package/dist/query-builder/impl.test.js +223 -36
- package/dist/query-builder/impl.test.js.map +1 -1
- package/dist/rehydrate-from-eventlog.d.ts +15 -0
- package/dist/rehydrate-from-eventlog.d.ts.map +1 -0
- package/dist/{rehydrate-from-mutationlog.js → rehydrate-from-eventlog.js} +26 -25
- package/dist/rehydrate-from-eventlog.js.map +1 -0
- package/dist/schema/EventDef.d.ts +136 -0
- package/dist/schema/EventDef.d.ts.map +1 -0
- package/dist/schema/EventDef.js +58 -0
- package/dist/schema/EventDef.js.map +1 -0
- package/dist/schema/EventId.d.ts +7 -2
- package/dist/schema/EventId.d.ts.map +1 -1
- package/dist/schema/EventId.js +18 -3
- package/dist/schema/EventId.js.map +1 -1
- package/dist/schema/{MutationEvent.d.ts → LiveStoreEvent.d.ts} +56 -56
- package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
- package/dist/schema/{MutationEvent.js → LiveStoreEvent.js} +25 -25
- package/dist/schema/LiveStoreEvent.js.map +1 -0
- package/dist/schema/client-document-def.d.ts +223 -0
- package/dist/schema/client-document-def.d.ts.map +1 -0
- package/dist/schema/client-document-def.js +170 -0
- package/dist/schema/client-document-def.js.map +1 -0
- package/dist/schema/client-document-def.test.d.ts +2 -0
- package/dist/schema/client-document-def.test.d.ts.map +1 -0
- package/dist/schema/client-document-def.test.js +201 -0
- package/dist/schema/client-document-def.test.js.map +1 -0
- package/dist/schema/db-schema/dsl/mod.d.ts.map +1 -1
- package/dist/schema/events.d.ts +2 -0
- package/dist/schema/events.d.ts.map +1 -0
- package/dist/schema/events.js +2 -0
- package/dist/schema/events.js.map +1 -0
- package/dist/schema/mod.d.ts +4 -3
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +4 -3
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema.d.ts +26 -22
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +45 -43
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/sqlite-state.d.ts +12 -0
- package/dist/schema/sqlite-state.d.ts.map +1 -0
- package/dist/schema/sqlite-state.js +36 -0
- package/dist/schema/sqlite-state.js.map +1 -0
- package/dist/schema/system-tables.d.ts +67 -98
- package/dist/schema/system-tables.d.ts.map +1 -1
- package/dist/schema/system-tables.js +62 -48
- package/dist/schema/system-tables.js.map +1 -1
- package/dist/schema/table-def.d.ts +26 -96
- package/dist/schema/table-def.d.ts.map +1 -1
- package/dist/schema/table-def.js +14 -64
- package/dist/schema/table-def.js.map +1 -1
- package/dist/schema/view.d.ts +3 -0
- package/dist/schema/view.d.ts.map +1 -0
- package/dist/schema/view.js +3 -0
- package/dist/schema/view.js.map +1 -0
- package/dist/schema-management/common.d.ts +4 -4
- package/dist/schema-management/common.d.ts.map +1 -1
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +6 -6
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/schema-management/validate-mutation-defs.d.ts +3 -3
- package/dist/schema-management/validate-mutation-defs.d.ts.map +1 -1
- package/dist/schema-management/validate-mutation-defs.js +17 -17
- package/dist/schema-management/validate-mutation-defs.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +7 -7
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +33 -30
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/next/facts.d.ts +19 -19
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +2 -2
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +3 -3
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +1 -1
- package/dist/sync/next/history-dag-common.js.map +1 -1
- package/dist/sync/next/history-dag.js +1 -1
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts +7 -7
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +5 -5
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/compact-events.calculator.test.js +38 -33
- package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
- package/dist/sync/next/test/compact-events.test.js +71 -71
- package/dist/sync/next/test/compact-events.test.js.map +1 -1
- package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +25 -25
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
- package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +60 -25
- package/dist/sync/next/test/event-fixtures.js.map +1 -0
- package/dist/sync/next/test/mod.d.ts +1 -1
- package/dist/sync/next/test/mod.d.ts.map +1 -1
- package/dist/sync/next/test/mod.js +1 -1
- package/dist/sync/next/test/mod.js.map +1 -1
- package/dist/sync/sync.d.ts +3 -3
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/syncstate.d.ts +30 -30
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +73 -40
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +175 -184
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/validate-push-payload.d.ts +2 -2
- package/dist/sync/validate-push-payload.d.ts.map +1 -1
- package/dist/sync/validate-push-payload.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
- package/src/__tests__/fixture.ts +36 -15
- package/src/adapter-types.ts +33 -13
- package/src/debug-info.ts +1 -0
- package/src/devtools/devtools-messages-leader.ts +13 -13
- package/src/index.ts +2 -5
- package/src/leader-thread/LeaderSyncProcessor.ts +210 -138
- package/src/leader-thread/{apply-mutation.ts → apply-event.ts} +61 -61
- package/src/leader-thread/eventlog.ts +199 -0
- package/src/leader-thread/leader-worker-devtools.ts +22 -19
- package/src/leader-thread/make-leader-thread-layer.ts +51 -29
- package/src/leader-thread/mod.ts +1 -1
- package/src/leader-thread/recreate-db.ts +6 -8
- package/src/leader-thread/types.ts +15 -16
- package/src/materializer-helper.ts +110 -0
- package/src/query-builder/api.ts +77 -103
- package/src/query-builder/astToSql.ts +68 -39
- package/src/query-builder/impl.test.ts +239 -42
- package/src/query-builder/impl.ts +72 -56
- package/src/{rehydrate-from-mutationlog.ts → rehydrate-from-eventlog.ts} +35 -38
- package/src/schema/EventDef.ts +216 -0
- package/src/schema/EventId.ts +23 -4
- package/src/schema/{MutationEvent.ts → LiveStoreEvent.ts} +68 -69
- package/src/schema/client-document-def.test.ts +239 -0
- package/src/schema/client-document-def.ts +444 -0
- package/src/schema/db-schema/dsl/mod.ts +0 -1
- package/src/schema/events.ts +1 -0
- package/src/schema/mod.ts +4 -3
- package/src/schema/schema.ts +78 -68
- package/src/schema/sqlite-state.ts +62 -0
- package/src/schema/system-tables.ts +42 -53
- package/src/schema/table-def.ts +51 -209
- package/src/schema/view.ts +2 -0
- package/src/schema-management/common.ts +4 -4
- package/src/schema-management/migrations.ts +8 -9
- package/src/schema-management/validate-mutation-defs.ts +22 -24
- package/src/sync/ClientSessionSyncProcessor.ts +41 -36
- package/src/sync/next/facts.ts +31 -32
- package/src/sync/next/history-dag-common.ts +4 -4
- package/src/sync/next/history-dag.ts +1 -1
- package/src/sync/next/rebase-events.ts +13 -13
- package/src/sync/next/test/compact-events.calculator.test.ts +45 -45
- package/src/sync/next/test/compact-events.test.ts +73 -73
- package/src/sync/next/test/event-fixtures.ts +219 -0
- package/src/sync/next/test/mod.ts +1 -1
- package/src/sync/sync.ts +3 -3
- package/src/sync/syncstate.test.ts +180 -189
- package/src/sync/syncstate.ts +162 -100
- package/src/sync/validate-push-payload.ts +2 -2
- package/src/version.ts +1 -1
- package/tsconfig.json +1 -0
- package/dist/derived-mutations.d.ts +0 -109
- package/dist/derived-mutations.d.ts.map +0 -1
- package/dist/derived-mutations.js +0 -54
- package/dist/derived-mutations.js.map +0 -1
- package/dist/derived-mutations.test.d.ts +0 -2
- package/dist/derived-mutations.test.d.ts.map +0 -1
- package/dist/derived-mutations.test.js +0 -93
- package/dist/derived-mutations.test.js.map +0 -1
- package/dist/init-singleton-tables.d.ts +0 -4
- package/dist/init-singleton-tables.d.ts.map +0 -1
- package/dist/init-singleton-tables.js +0 -16
- package/dist/init-singleton-tables.js.map +0 -1
- package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
- package/dist/leader-thread/apply-mutation.js.map +0 -1
- package/dist/leader-thread/mutationlog.d.ts +0 -27
- package/dist/leader-thread/mutationlog.d.ts.map +0 -1
- package/dist/leader-thread/mutationlog.js +0 -124
- package/dist/leader-thread/mutationlog.js.map +0 -1
- package/dist/mutation.d.ts +0 -20
- package/dist/mutation.d.ts.map +0 -1
- package/dist/mutation.js +0 -68
- package/dist/mutation.js.map +0 -1
- package/dist/query-info.d.ts +0 -41
- package/dist/query-info.d.ts.map +0 -1
- package/dist/query-info.js +0 -7
- package/dist/query-info.js.map +0 -1
- package/dist/rehydrate-from-mutationlog.d.ts +0 -15
- package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
- package/dist/rehydrate-from-mutationlog.js.map +0 -1
- package/dist/schema/MutationEvent.d.ts.map +0 -1
- package/dist/schema/MutationEvent.js.map +0 -1
- package/dist/schema/mutations.d.ts +0 -115
- package/dist/schema/mutations.d.ts.map +0 -1
- package/dist/schema/mutations.js +0 -42
- package/dist/schema/mutations.js.map +0 -1
- package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
- package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
- package/src/derived-mutations.test.ts +0 -101
- package/src/derived-mutations.ts +0 -170
- package/src/init-singleton-tables.ts +0 -24
- package/src/leader-thread/mutationlog.ts +0 -202
- package/src/mutation.ts +0 -108
- package/src/query-info.ts +0 -83
- package/src/schema/mutations.ts +0 -193
- package/src/sync/next/test/mutation-fixtures.ts +0 -228
package/src/sync/syncstate.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { casesHandled, shouldNeverHappen } from '@livestore/utils'
|
|
1
|
+
import { casesHandled, LS_DEV, shouldNeverHappen } from '@livestore/utils'
|
|
2
2
|
import { Match, ReadonlyArray, Schema } from '@livestore/utils/effect'
|
|
3
3
|
|
|
4
4
|
import { UnexpectedError } from '../adapter-types.js'
|
|
5
5
|
import * as EventId from '../schema/EventId.js'
|
|
6
|
-
import * as
|
|
6
|
+
import * as LiveStoreEvent from '../schema/LiveStoreEvent.js'
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* SyncState represents the current sync state of a sync node relative to an upstream node.
|
|
@@ -43,7 +43,7 @@ import * as MutationEvent from '../schema/MutationEvent.js'
|
|
|
43
43
|
* handling cases such as upstream rebase, advance and local push.
|
|
44
44
|
*/
|
|
45
45
|
export class SyncState extends Schema.Class<SyncState>('SyncState')({
|
|
46
|
-
pending: Schema.Array(
|
|
46
|
+
pending: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
47
47
|
/** What this node expects the next upstream node to have as its own local head */
|
|
48
48
|
upstreamHead: EventId.EventId,
|
|
49
49
|
/** Equivalent to `pending.at(-1)?.id` if there are pending events */
|
|
@@ -61,17 +61,17 @@ export class SyncState extends Schema.Class<SyncState>('SyncState')({
|
|
|
61
61
|
*/
|
|
62
62
|
export class PayloadUpstreamRebase extends Schema.TaggedStruct('upstream-rebase', {
|
|
63
63
|
/** Events which need to be rolled back */
|
|
64
|
-
rollbackEvents: Schema.Array(
|
|
64
|
+
rollbackEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
65
65
|
/** Events which need to be applied after the rollback (already rebased by the upstream node) */
|
|
66
|
-
newEvents: Schema.Array(
|
|
66
|
+
newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
67
67
|
}) {}
|
|
68
68
|
|
|
69
69
|
export class PayloadUpstreamAdvance extends Schema.TaggedStruct('upstream-advance', {
|
|
70
|
-
newEvents: Schema.Array(
|
|
70
|
+
newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
71
71
|
}) {}
|
|
72
72
|
|
|
73
73
|
export class PayloadLocalPush extends Schema.TaggedStruct('local-push', {
|
|
74
|
-
newEvents: Schema.Array(
|
|
74
|
+
newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
75
75
|
}) {}
|
|
76
76
|
|
|
77
77
|
export class Payload extends Schema.Union(PayloadUpstreamRebase, PayloadUpstreamAdvance, PayloadLocalPush) {}
|
|
@@ -110,9 +110,9 @@ export class MergeContext extends Schema.Class<MergeContext>('MergeContext')({
|
|
|
110
110
|
export class MergeResultAdvance extends Schema.Class<MergeResultAdvance>('MergeResultAdvance')({
|
|
111
111
|
_tag: Schema.Literal('advance'),
|
|
112
112
|
newSyncState: SyncState,
|
|
113
|
-
newEvents: Schema.Array(
|
|
113
|
+
newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
114
114
|
/** Events which were previously pending but are now confirmed */
|
|
115
|
-
confirmedEvents: Schema.Array(
|
|
115
|
+
confirmedEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
116
116
|
mergeContext: MergeContext,
|
|
117
117
|
}) {
|
|
118
118
|
toJSON = (): any => {
|
|
@@ -129,9 +129,9 @@ export class MergeResultAdvance extends Schema.Class<MergeResultAdvance>('MergeR
|
|
|
129
129
|
export class MergeResultRebase extends Schema.Class<MergeResultRebase>('MergeResultRebase')({
|
|
130
130
|
_tag: Schema.Literal('rebase'),
|
|
131
131
|
newSyncState: SyncState,
|
|
132
|
-
newEvents: Schema.Array(
|
|
132
|
+
newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
133
133
|
/** Events which need to be rolled back */
|
|
134
|
-
rollbackEvents: Schema.Array(
|
|
134
|
+
rollbackEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
135
135
|
mergeContext: MergeContext,
|
|
136
136
|
}) {
|
|
137
137
|
toJSON = (): any => {
|
|
@@ -172,11 +172,16 @@ export class MergeResult extends Schema.Union(
|
|
|
172
172
|
MergeResultUnexpectedError,
|
|
173
173
|
) {}
|
|
174
174
|
|
|
175
|
-
const unexpectedError = (cause: unknown): MergeResultUnexpectedError =>
|
|
176
|
-
|
|
175
|
+
const unexpectedError = (cause: unknown): MergeResultUnexpectedError => {
|
|
176
|
+
if (LS_DEV) {
|
|
177
|
+
debugger
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return MergeResultUnexpectedError.make({
|
|
177
181
|
_tag: 'unexpected-error',
|
|
178
182
|
cause: new UnexpectedError({ cause }),
|
|
179
183
|
})
|
|
184
|
+
}
|
|
180
185
|
|
|
181
186
|
// TODO Idea: call merge recursively through hierarchy levels
|
|
182
187
|
/*
|
|
@@ -194,12 +199,13 @@ export const merge = ({
|
|
|
194
199
|
}: {
|
|
195
200
|
syncState: SyncState
|
|
196
201
|
payload: typeof Payload.Type
|
|
197
|
-
isClientEvent: (event:
|
|
198
|
-
isEqualEvent: (a:
|
|
202
|
+
isClientEvent: (event: LiveStoreEvent.EncodedWithMeta) => boolean
|
|
203
|
+
isEqualEvent: (a: LiveStoreEvent.EncodedWithMeta, b: LiveStoreEvent.EncodedWithMeta) => boolean
|
|
199
204
|
/** This is used in the leader which should ignore client events when receiving an upstream-advance payload */
|
|
200
205
|
ignoreClientEvents?: boolean
|
|
201
206
|
}): typeof MergeResult.Type => {
|
|
202
207
|
validateSyncState(syncState)
|
|
208
|
+
validatePayload(payload)
|
|
203
209
|
|
|
204
210
|
const mergeContext = MergeContext.make({ payload, syncState })
|
|
205
211
|
|
|
@@ -217,33 +223,37 @@ export const merge = ({
|
|
|
217
223
|
isClientEvent,
|
|
218
224
|
})
|
|
219
225
|
|
|
220
|
-
return
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
+
return validateMergeResult(
|
|
227
|
+
MergeResultRebase.make({
|
|
228
|
+
_tag: 'rebase',
|
|
229
|
+
newSyncState: new SyncState({
|
|
230
|
+
pending: rebasedPending,
|
|
231
|
+
upstreamHead: newUpstreamHead,
|
|
232
|
+
localHead: rebasedPending.at(-1)?.id ?? newUpstreamHead,
|
|
233
|
+
}),
|
|
234
|
+
newEvents: [...payload.newEvents, ...rebasedPending],
|
|
235
|
+
rollbackEvents,
|
|
236
|
+
mergeContext,
|
|
226
237
|
}),
|
|
227
|
-
|
|
228
|
-
rollbackEvents,
|
|
229
|
-
mergeContext,
|
|
230
|
-
})
|
|
238
|
+
)
|
|
231
239
|
}
|
|
232
240
|
|
|
233
241
|
// #region upstream-advance
|
|
234
242
|
case 'upstream-advance': {
|
|
235
243
|
if (payload.newEvents.length === 0) {
|
|
236
|
-
return
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
244
|
+
return validateMergeResult(
|
|
245
|
+
MergeResultAdvance.make({
|
|
246
|
+
_tag: 'advance',
|
|
247
|
+
newSyncState: new SyncState({
|
|
248
|
+
pending: syncState.pending,
|
|
249
|
+
upstreamHead: syncState.upstreamHead,
|
|
250
|
+
localHead: syncState.localHead,
|
|
251
|
+
}),
|
|
252
|
+
newEvents: [],
|
|
253
|
+
confirmedEvents: [],
|
|
254
|
+
mergeContext: mergeContext,
|
|
242
255
|
}),
|
|
243
|
-
|
|
244
|
-
confirmedEvents: [],
|
|
245
|
-
mergeContext: mergeContext,
|
|
246
|
-
})
|
|
256
|
+
)
|
|
247
257
|
}
|
|
248
258
|
|
|
249
259
|
// Validate that newEvents are sorted in ascending order by eventId
|
|
@@ -265,17 +275,6 @@ export const merge = ({
|
|
|
265
275
|
)
|
|
266
276
|
}
|
|
267
277
|
|
|
268
|
-
// Validate that the parent id of the first incoming event is known
|
|
269
|
-
const knownEventGlobalIds = [...syncState.pending].flatMap((e) => [e.id.global, e.parentId.global])
|
|
270
|
-
knownEventGlobalIds.push(syncState.upstreamHead.global)
|
|
271
|
-
const firstNewEvent = payload.newEvents[0]!
|
|
272
|
-
const hasUnknownParentId = knownEventGlobalIds.includes(firstNewEvent.parentId.global) === false
|
|
273
|
-
if (hasUnknownParentId) {
|
|
274
|
-
return unexpectedError(
|
|
275
|
-
`Incoming events must have a known parent id. Received: [${payload.newEvents.map((e) => EventId.toString(e.id)).join(', ')}]`,
|
|
276
|
-
)
|
|
277
|
-
}
|
|
278
|
-
|
|
279
278
|
const newUpstreamHead = payload.newEvents.at(-1)!.id
|
|
280
279
|
|
|
281
280
|
const divergentPendingIndex = findDivergencePoint({
|
|
@@ -313,17 +312,19 @@ export const merge = ({
|
|
|
313
312
|
},
|
|
314
313
|
)
|
|
315
314
|
|
|
316
|
-
return
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
315
|
+
return validateMergeResult(
|
|
316
|
+
MergeResultAdvance.make({
|
|
317
|
+
_tag: 'advance',
|
|
318
|
+
newSyncState: new SyncState({
|
|
319
|
+
pending: pendingRemaining,
|
|
320
|
+
upstreamHead: newUpstreamHead,
|
|
321
|
+
localHead: pendingRemaining.at(-1)?.id ?? EventId.max(syncState.localHead, newUpstreamHead),
|
|
322
|
+
}),
|
|
323
|
+
newEvents,
|
|
324
|
+
confirmedEvents: pendingMatching,
|
|
325
|
+
mergeContext: mergeContext,
|
|
322
326
|
}),
|
|
323
|
-
|
|
324
|
-
confirmedEvents: pendingMatching,
|
|
325
|
-
mergeContext: mergeContext,
|
|
326
|
-
})
|
|
327
|
+
)
|
|
327
328
|
} else {
|
|
328
329
|
const divergentPending = syncState.pending.slice(divergentPendingIndex)
|
|
329
330
|
const rebasedPending = rebaseEvents({
|
|
@@ -340,17 +341,19 @@ export const merge = ({
|
|
|
340
341
|
ignoreClientEvents,
|
|
341
342
|
})
|
|
342
343
|
|
|
343
|
-
return
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
344
|
+
return validateMergeResult(
|
|
345
|
+
MergeResultRebase.make({
|
|
346
|
+
_tag: 'rebase',
|
|
347
|
+
newSyncState: new SyncState({
|
|
348
|
+
pending: rebasedPending,
|
|
349
|
+
upstreamHead: newUpstreamHead,
|
|
350
|
+
localHead: rebasedPending.at(-1)!.id,
|
|
351
|
+
}),
|
|
352
|
+
newEvents: [...payload.newEvents.slice(divergentNewEventsIndex), ...rebasedPending],
|
|
353
|
+
rollbackEvents: divergentPending,
|
|
354
|
+
mergeContext,
|
|
349
355
|
}),
|
|
350
|
-
|
|
351
|
-
rollbackEvents: divergentPending,
|
|
352
|
-
mergeContext,
|
|
353
|
-
})
|
|
356
|
+
)
|
|
354
357
|
}
|
|
355
358
|
}
|
|
356
359
|
// #endregion
|
|
@@ -358,13 +361,15 @@ export const merge = ({
|
|
|
358
361
|
// This is the same as what's running in the sync backend
|
|
359
362
|
case 'local-push': {
|
|
360
363
|
if (payload.newEvents.length === 0) {
|
|
361
|
-
return
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
364
|
+
return validateMergeResult(
|
|
365
|
+
MergeResultAdvance.make({
|
|
366
|
+
_tag: 'advance',
|
|
367
|
+
newSyncState: syncState,
|
|
368
|
+
newEvents: [],
|
|
369
|
+
confirmedEvents: [],
|
|
370
|
+
mergeContext: mergeContext,
|
|
371
|
+
}),
|
|
372
|
+
)
|
|
368
373
|
}
|
|
369
374
|
|
|
370
375
|
const newEventsFirst = payload.newEvents.at(0)!
|
|
@@ -372,23 +377,27 @@ export const merge = ({
|
|
|
372
377
|
|
|
373
378
|
if (invalidEventId) {
|
|
374
379
|
const expectedMinimumId = EventId.nextPair(syncState.localHead, true).id
|
|
375
|
-
return
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
+
return validateMergeResult(
|
|
381
|
+
MergeResultReject.make({
|
|
382
|
+
_tag: 'reject',
|
|
383
|
+
expectedMinimumId,
|
|
384
|
+
mergeContext,
|
|
385
|
+
}),
|
|
386
|
+
)
|
|
380
387
|
} else {
|
|
381
|
-
return
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
388
|
+
return validateMergeResult(
|
|
389
|
+
MergeResultAdvance.make({
|
|
390
|
+
_tag: 'advance',
|
|
391
|
+
newSyncState: new SyncState({
|
|
392
|
+
pending: [...syncState.pending, ...payload.newEvents],
|
|
393
|
+
upstreamHead: syncState.upstreamHead,
|
|
394
|
+
localHead: payload.newEvents.at(-1)!.id,
|
|
395
|
+
}),
|
|
396
|
+
newEvents: payload.newEvents,
|
|
397
|
+
confirmedEvents: [],
|
|
398
|
+
mergeContext: mergeContext,
|
|
387
399
|
}),
|
|
388
|
-
|
|
389
|
-
confirmedEvents: [],
|
|
390
|
-
mergeContext: mergeContext,
|
|
391
|
-
})
|
|
400
|
+
)
|
|
392
401
|
}
|
|
393
402
|
}
|
|
394
403
|
|
|
@@ -409,10 +418,10 @@ export const findDivergencePoint = ({
|
|
|
409
418
|
isClientEvent,
|
|
410
419
|
ignoreClientEvents,
|
|
411
420
|
}: {
|
|
412
|
-
existingEvents: ReadonlyArray<
|
|
413
|
-
incomingEvents: ReadonlyArray<
|
|
414
|
-
isEqualEvent: (a:
|
|
415
|
-
isClientEvent: (event:
|
|
421
|
+
existingEvents: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>
|
|
422
|
+
incomingEvents: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>
|
|
423
|
+
isEqualEvent: (a: LiveStoreEvent.EncodedWithMeta, b: LiveStoreEvent.EncodedWithMeta) => boolean
|
|
424
|
+
isClientEvent: (event: LiveStoreEvent.EncodedWithMeta) => boolean
|
|
416
425
|
ignoreClientEvents: boolean
|
|
417
426
|
}): number => {
|
|
418
427
|
if (ignoreClientEvents) {
|
|
@@ -444,10 +453,10 @@ const rebaseEvents = ({
|
|
|
444
453
|
baseEventId,
|
|
445
454
|
isClientEvent,
|
|
446
455
|
}: {
|
|
447
|
-
events: ReadonlyArray<
|
|
456
|
+
events: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>
|
|
448
457
|
baseEventId: EventId.EventId
|
|
449
|
-
isClientEvent: (event:
|
|
450
|
-
}): ReadonlyArray<
|
|
458
|
+
isClientEvent: (event: LiveStoreEvent.EncodedWithMeta) => boolean
|
|
459
|
+
}): ReadonlyArray<LiveStoreEvent.EncodedWithMeta> => {
|
|
451
460
|
let prevEventId = baseEventId
|
|
452
461
|
return events.map((event) => {
|
|
453
462
|
const isLocal = isClientEvent(event)
|
|
@@ -466,17 +475,30 @@ const rebaseEvents = ({
|
|
|
466
475
|
*/
|
|
467
476
|
const _flattenMergeResults = (_updateResults: ReadonlyArray<MergeResult>) => {}
|
|
468
477
|
|
|
478
|
+
const validatePayload = (payload: typeof Payload.Type) => {
|
|
479
|
+
for (let i = 1; i < payload.newEvents.length; i++) {
|
|
480
|
+
if (EventId.isGreaterThanOrEqual(payload.newEvents[i - 1]!.id, payload.newEvents[i]!.id)) {
|
|
481
|
+
return unexpectedError(
|
|
482
|
+
`Events must be ordered in monotonically ascending order by eventId. Received: [${payload.newEvents.map((e) => EventId.toString(e.id)).join(', ')}]`,
|
|
483
|
+
)
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
|
|
469
488
|
const validateSyncState = (syncState: SyncState) => {
|
|
470
489
|
for (let i = 0; i < syncState.pending.length; i++) {
|
|
471
490
|
const event = syncState.pending[i]!
|
|
472
491
|
const nextEvent = syncState.pending[i + 1]
|
|
473
492
|
if (nextEvent === undefined) break // Reached end of chain
|
|
474
493
|
|
|
475
|
-
if (EventId.
|
|
476
|
-
shouldNeverHappen(
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
494
|
+
if (EventId.isGreaterThanOrEqual(event.id, nextEvent.id)) {
|
|
495
|
+
shouldNeverHappen(
|
|
496
|
+
`Events must be ordered in monotonically ascending order by eventId. Received: [${syncState.pending.map((e) => EventId.toString(e.id)).join(', ')}]`,
|
|
497
|
+
{
|
|
498
|
+
event,
|
|
499
|
+
nextEvent,
|
|
500
|
+
},
|
|
501
|
+
)
|
|
480
502
|
}
|
|
481
503
|
|
|
482
504
|
// If the global id has increased, then the client id must be 0
|
|
@@ -503,3 +525,43 @@ const validateSyncState = (syncState: SyncState) => {
|
|
|
503
525
|
}
|
|
504
526
|
}
|
|
505
527
|
}
|
|
528
|
+
|
|
529
|
+
const validateMergeResult = (mergeResult: typeof MergeResult.Type) => {
|
|
530
|
+
if (mergeResult._tag === 'unexpected-error' || mergeResult._tag === 'reject') return mergeResult
|
|
531
|
+
|
|
532
|
+
validateSyncState(mergeResult.newSyncState)
|
|
533
|
+
|
|
534
|
+
// Ensure local head is always greater than or equal to upstream head
|
|
535
|
+
if (EventId.isGreaterThan(mergeResult.newSyncState.upstreamHead, mergeResult.newSyncState.localHead)) {
|
|
536
|
+
shouldNeverHappen('Local head must be greater than or equal to upstream head', {
|
|
537
|
+
localHead: mergeResult.newSyncState.localHead,
|
|
538
|
+
upstreamHead: mergeResult.newSyncState.upstreamHead,
|
|
539
|
+
})
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
// Ensure new local head is greater than or equal to the previous local head
|
|
543
|
+
if (
|
|
544
|
+
EventId.isGreaterThanOrEqual(mergeResult.newSyncState.localHead, mergeResult.mergeContext.syncState.localHead) ===
|
|
545
|
+
false
|
|
546
|
+
) {
|
|
547
|
+
shouldNeverHappen('New local head must be greater than or equal to the previous local head', {
|
|
548
|
+
localHead: mergeResult.newSyncState.localHead,
|
|
549
|
+
previousLocalHead: mergeResult.mergeContext.syncState.localHead,
|
|
550
|
+
})
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
// Ensure new upstream head is greater than or equal to the previous upstream head
|
|
554
|
+
if (
|
|
555
|
+
EventId.isGreaterThanOrEqual(
|
|
556
|
+
mergeResult.newSyncState.upstreamHead,
|
|
557
|
+
mergeResult.mergeContext.syncState.upstreamHead,
|
|
558
|
+
) === false
|
|
559
|
+
) {
|
|
560
|
+
shouldNeverHappen('New upstream head must be greater than or equal to the previous upstream head', {
|
|
561
|
+
upstreamHead: mergeResult.newSyncState.upstreamHead,
|
|
562
|
+
previousUpstreamHead: mergeResult.mergeContext.syncState.upstreamHead,
|
|
563
|
+
})
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
return mergeResult
|
|
567
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Effect } from '@livestore/utils/effect'
|
|
2
2
|
|
|
3
|
-
import type { EventId,
|
|
3
|
+
import type { EventId, LiveStoreEvent } from '../schema/mod.js'
|
|
4
4
|
import { InvalidPushError } from './sync.js'
|
|
5
5
|
|
|
6
6
|
// TODO proper batch validation
|
|
7
7
|
export const validatePushPayload = (
|
|
8
|
-
batch: ReadonlyArray<
|
|
8
|
+
batch: ReadonlyArray<LiveStoreEvent.AnyEncodedGlobal>,
|
|
9
9
|
currentEventId: EventId.GlobalEventId,
|
|
10
10
|
) =>
|
|
11
11
|
Effect.gen(function* () {
|
package/src/version.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// import packageJson from '../package.json' with { type: 'json' }
|
|
3
3
|
// export const liveStoreVersion = packageJson.version
|
|
4
4
|
|
|
5
|
-
export const liveStoreVersion = '0.3.0-dev.
|
|
5
|
+
export const liveStoreVersion = '0.3.0-dev.28' as const
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* This version number is incremented whenever the internal storage format changes in a breaking way.
|
package/tsconfig.json
CHANGED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import type { GetValForKey } from '@livestore/utils';
|
|
2
|
-
import type { SqliteDsl } from './schema/db-schema/mod.js';
|
|
3
|
-
import type * as MutationEvent from './schema/MutationEvent.js';
|
|
4
|
-
import type * as DbSchema from './schema/table-def.js';
|
|
5
|
-
export declare const makeDerivedMutationDefsForTable: <TTableDef extends DbSchema.TableDefBase<DbSchema.DefaultSqliteTableDefConstrained, DbSchema.TableOptions & {
|
|
6
|
-
deriveMutations: {
|
|
7
|
-
enabled: true;
|
|
8
|
-
};
|
|
9
|
-
}>>(table: TTableDef) => {
|
|
10
|
-
insert: import("./schema/mutations.js").MutationDef<`_Derived_Create_${string}`, {
|
|
11
|
-
readonly [x: string]: any;
|
|
12
|
-
} & {
|
|
13
|
-
readonly [x: string]: any;
|
|
14
|
-
}, {
|
|
15
|
-
readonly [x: string]: any;
|
|
16
|
-
} & {
|
|
17
|
-
readonly [x: string]: any;
|
|
18
|
-
}>;
|
|
19
|
-
update: import("./schema/mutations.js").MutationDef<`_Derived_Update_${string}`, {
|
|
20
|
-
readonly values: {
|
|
21
|
-
[x: string]: any;
|
|
22
|
-
};
|
|
23
|
-
readonly where: {
|
|
24
|
-
[x: string]: any;
|
|
25
|
-
};
|
|
26
|
-
}, {
|
|
27
|
-
readonly values: {
|
|
28
|
-
[x: string]: any;
|
|
29
|
-
};
|
|
30
|
-
readonly where: {
|
|
31
|
-
[x: string]: any;
|
|
32
|
-
};
|
|
33
|
-
}>;
|
|
34
|
-
delete: import("./schema/mutations.js").MutationDef<`_Derived_Delete_${string}`, {
|
|
35
|
-
readonly where: {
|
|
36
|
-
[x: string]: any;
|
|
37
|
-
};
|
|
38
|
-
}, {
|
|
39
|
-
readonly where: {
|
|
40
|
-
[x: string]: any;
|
|
41
|
-
};
|
|
42
|
-
}>;
|
|
43
|
-
};
|
|
44
|
-
export declare const deriveCreateMutationDef: <TTableDef extends DbSchema.TableDefBase<DbSchema.DefaultSqliteTableDefConstrained, DbSchema.TableOptions & {
|
|
45
|
-
deriveMutations: {
|
|
46
|
-
enabled: true;
|
|
47
|
-
};
|
|
48
|
-
}>>(table: TTableDef) => import("./schema/mutations.js").MutationDef<`_Derived_Create_${string}`, {
|
|
49
|
-
readonly [x: string]: any;
|
|
50
|
-
} & {
|
|
51
|
-
readonly [x: string]: any;
|
|
52
|
-
}, {
|
|
53
|
-
readonly [x: string]: any;
|
|
54
|
-
} & {
|
|
55
|
-
readonly [x: string]: any;
|
|
56
|
-
}>;
|
|
57
|
-
export declare const deriveUpdateMutationDef: <TTableDef extends DbSchema.TableDefBase<DbSchema.DefaultSqliteTableDefConstrained, DbSchema.TableOptions & {
|
|
58
|
-
deriveMutations: {
|
|
59
|
-
enabled: true;
|
|
60
|
-
};
|
|
61
|
-
}>>(table: TTableDef) => import("./schema/mutations.js").MutationDef<`_Derived_Update_${string}`, {
|
|
62
|
-
readonly values: {
|
|
63
|
-
[x: string]: any;
|
|
64
|
-
};
|
|
65
|
-
readonly where: {
|
|
66
|
-
[x: string]: any;
|
|
67
|
-
};
|
|
68
|
-
}, {
|
|
69
|
-
readonly values: {
|
|
70
|
-
[x: string]: any;
|
|
71
|
-
};
|
|
72
|
-
readonly where: {
|
|
73
|
-
[x: string]: any;
|
|
74
|
-
};
|
|
75
|
-
}>;
|
|
76
|
-
export declare const deriveDeleteMutationDef: <TTableDef extends DbSchema.TableDefBase<DbSchema.DefaultSqliteTableDefConstrained, DbSchema.TableOptions & {
|
|
77
|
-
deriveMutations: {
|
|
78
|
-
enabled: true;
|
|
79
|
-
};
|
|
80
|
-
}>>(table: TTableDef) => import("./schema/mutations.js").MutationDef<`_Derived_Delete_${string}`, {
|
|
81
|
-
readonly where: {
|
|
82
|
-
[x: string]: any;
|
|
83
|
-
};
|
|
84
|
-
}, {
|
|
85
|
-
readonly where: {
|
|
86
|
-
[x: string]: any;
|
|
87
|
-
};
|
|
88
|
-
}>;
|
|
89
|
-
/**
|
|
90
|
-
* Convenience helper functions on top of the derived mutation definitions.
|
|
91
|
-
*/
|
|
92
|
-
export type DerivedMutationHelperFns<TColumns extends SqliteDsl.ConstraintColumns, TOptions extends DbSchema.TableOptions> = {
|
|
93
|
-
insert: DerivedMutationHelperFns.InsertMutationFn<TColumns, TOptions>;
|
|
94
|
-
update: DerivedMutationHelperFns.UpdateMutationFn<TColumns, TOptions>;
|
|
95
|
-
delete: DerivedMutationHelperFns.DeleteMutationFn<TColumns, TOptions>;
|
|
96
|
-
};
|
|
97
|
-
export declare namespace DerivedMutationHelperFns {
|
|
98
|
-
export type InsertMutationFn<TColumns extends SqliteDsl.ConstraintColumns, TOptions extends DbSchema.TableOptions> = SqliteDsl.AnyIfConstained<TColumns, UseShortcut<TOptions> extends true ? (values?: GetValForKey<SqliteDsl.FromColumns.InsertRowDecoded<TColumns>, 'value'>) => MutationEvent.PartialAnyDecoded : (values: SqliteDsl.FromColumns.InsertRowDecoded<TColumns>) => MutationEvent.PartialAnyDecoded>;
|
|
99
|
-
export type UpdateMutationFn<TColumns extends SqliteDsl.ConstraintColumns, TOptions extends DbSchema.TableOptions> = SqliteDsl.AnyIfConstained<TColumns, UseShortcut<TOptions> extends true ? (values: Partial<GetValForKey<SqliteDsl.FromColumns.RowDecoded<TColumns>, 'value'>>) => MutationEvent.PartialAnyDecoded : (args: {
|
|
100
|
-
where: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>>;
|
|
101
|
-
values: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>>;
|
|
102
|
-
}) => MutationEvent.PartialAnyDecoded>;
|
|
103
|
-
export type DeleteMutationFn<TColumns extends SqliteDsl.ConstraintColumns, _TOptions extends DbSchema.TableOptions> = (args: {
|
|
104
|
-
where: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>>;
|
|
105
|
-
}) => MutationEvent.PartialAnyDecoded;
|
|
106
|
-
type UseShortcut<TOptions extends DbSchema.TableOptions> = TOptions['isSingleColumn'] extends true ? TOptions['isSingleton'] extends true ? true : false : false;
|
|
107
|
-
export {};
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=derived-mutations.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"derived-mutations.d.ts","sourceRoot":"","sources":["../src/derived-mutations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { ReadonlyRecord, Schema } from '@livestore/utils/effect';
|
|
2
|
-
import { defineMutation } from './schema/mutations.js';
|
|
3
|
-
import { getDefaultValuesDecoded } from './schema/schema-helpers.js';
|
|
4
|
-
import { deleteRows, insertRow, updateRows } from './sql-queries/sql-queries.js';
|
|
5
|
-
export const makeDerivedMutationDefsForTable = (table) => ({
|
|
6
|
-
insert: deriveCreateMutationDef(table),
|
|
7
|
-
update: deriveUpdateMutationDef(table),
|
|
8
|
-
delete: deriveDeleteMutationDef(table),
|
|
9
|
-
});
|
|
10
|
-
export const deriveCreateMutationDef = (table) => {
|
|
11
|
-
const tableName = table.sqliteDef.name;
|
|
12
|
-
const [optionalFields, requiredColumns] = ReadonlyRecord.partition(table.sqliteDef.columns, (col) => col.nullable === false && col.default._tag === 'None');
|
|
13
|
-
const insertSchema = Schema.Struct(ReadonlyRecord.map(requiredColumns, (col) => col.schema))
|
|
14
|
-
.pipe(Schema.extend(Schema.partial(Schema.Struct(ReadonlyRecord.map(optionalFields, (col) => col.schema)))))
|
|
15
|
-
.annotations({ title: `${tableName}:Insert` });
|
|
16
|
-
return defineMutation(`_Derived_Create_${tableName}`, insertSchema, ({ id, ...explicitDefaultValues }) => {
|
|
17
|
-
const defaultValues = getDefaultValuesDecoded(table, explicitDefaultValues);
|
|
18
|
-
const [sql, bindValues] = insertRow({
|
|
19
|
-
tableName: table.sqliteDef.name,
|
|
20
|
-
columns: table.sqliteDef.columns,
|
|
21
|
-
values: { ...defaultValues, id },
|
|
22
|
-
});
|
|
23
|
-
return { sql, bindValues, writeTables: new Set([tableName]) };
|
|
24
|
-
}, { clientOnly: table.options.deriveMutations.clientOnly });
|
|
25
|
-
};
|
|
26
|
-
export const deriveUpdateMutationDef = (table) => {
|
|
27
|
-
const tableName = table.sqliteDef.name;
|
|
28
|
-
return defineMutation(`_Derived_Update_${tableName}`, Schema.Struct({
|
|
29
|
-
where: Schema.partial(table.schema),
|
|
30
|
-
values: Schema.partial(table.schema),
|
|
31
|
-
}).annotations({ title: `${tableName}:Update` }), ({ where, values }) => {
|
|
32
|
-
const [sql, bindValues] = updateRows({
|
|
33
|
-
tableName: table.sqliteDef.name,
|
|
34
|
-
columns: table.sqliteDef.columns,
|
|
35
|
-
where,
|
|
36
|
-
updateValues: values,
|
|
37
|
-
});
|
|
38
|
-
return { sql, bindValues, writeTables: new Set([tableName]) };
|
|
39
|
-
}, { clientOnly: table.options.deriveMutations.clientOnly });
|
|
40
|
-
};
|
|
41
|
-
export const deriveDeleteMutationDef = (table) => {
|
|
42
|
-
const tableName = table.sqliteDef.name;
|
|
43
|
-
return defineMutation(`_Derived_Delete_${tableName}`, Schema.Struct({
|
|
44
|
-
where: Schema.partial(table.schema),
|
|
45
|
-
}), ({ where }) => {
|
|
46
|
-
const [sql, bindValues] = deleteRows({
|
|
47
|
-
tableName: table.sqliteDef.name,
|
|
48
|
-
columns: table.sqliteDef.columns,
|
|
49
|
-
where,
|
|
50
|
-
});
|
|
51
|
-
return { sql, bindValues, writeTables: new Set([tableName]) };
|
|
52
|
-
}, { clientOnly: table.options.deriveMutations.clientOnly });
|
|
53
|
-
};
|
|
54
|
-
//# sourceMappingURL=derived-mutations.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"derived-mutations.js","sourceRoot":"","sources":["../src/derived-mutations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"derived-mutations.test.d.ts","sourceRoot":"","sources":["../src/derived-mutations.test.ts"],"names":[],"mappings":""}
|