@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
|
@@ -1,133 +1,132 @@
|
|
|
1
1
|
import { memoizeByRef } from '@livestore/utils'
|
|
2
2
|
import { Option, Schema } from '@livestore/utils/effect'
|
|
3
3
|
|
|
4
|
+
import type { EventDef, EventDefRecord } from './EventDef.js'
|
|
4
5
|
import * as EventId from './EventId.js'
|
|
5
|
-
import type { MutationDef, MutationDefRecord } from './mutations.js'
|
|
6
6
|
import type { LiveStoreSchema } from './schema.js'
|
|
7
7
|
|
|
8
|
-
export type
|
|
9
|
-
|
|
10
|
-
args: Schema.Schema.Type<
|
|
8
|
+
export type EventDefPartial<TEventDef extends EventDef.Any> = {
|
|
9
|
+
name: TEventDef['name']
|
|
10
|
+
args: Schema.Schema.Type<TEventDef['schema']>
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
export type PartialEncoded<
|
|
14
|
-
|
|
15
|
-
args: Schema.Schema.Encoded<
|
|
13
|
+
export type PartialEncoded<TEventDef extends EventDef.Any> = {
|
|
14
|
+
name: TEventDef['name']
|
|
15
|
+
args: Schema.Schema.Encoded<TEventDef['schema']>
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
export type
|
|
19
|
-
|
|
20
|
-
args: Schema.Schema.Type<
|
|
18
|
+
export type ForEventDef<TEventDef extends EventDef.Any> = {
|
|
19
|
+
name: TEventDef['name']
|
|
20
|
+
args: Schema.Schema.Type<TEventDef['schema']>
|
|
21
21
|
id: EventId.EventId
|
|
22
22
|
parentId: EventId.EventId
|
|
23
23
|
clientId: string
|
|
24
24
|
sessionId: string
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
export type
|
|
28
|
-
|
|
29
|
-
args: Schema.Schema.Encoded<
|
|
27
|
+
export type EventDefEncoded<TEventDef extends EventDef.Any> = {
|
|
28
|
+
name: TEventDef['name']
|
|
29
|
+
args: Schema.Schema.Encoded<TEventDef['schema']>
|
|
30
30
|
id: EventId.EventId
|
|
31
31
|
parentId: EventId.EventId
|
|
32
32
|
clientId: string
|
|
33
33
|
sessionId: string
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
export type AnyDecoded =
|
|
36
|
+
export type AnyDecoded = ForEventDef<EventDef.Any>
|
|
37
37
|
export const AnyDecoded = Schema.Struct({
|
|
38
|
-
|
|
38
|
+
name: Schema.String,
|
|
39
39
|
args: Schema.Any,
|
|
40
40
|
id: EventId.EventId,
|
|
41
41
|
parentId: EventId.EventId,
|
|
42
42
|
clientId: Schema.String,
|
|
43
43
|
sessionId: Schema.String,
|
|
44
|
-
}).annotations({ title: '
|
|
44
|
+
}).annotations({ title: 'LiveStoreEvent.AnyDecoded' })
|
|
45
45
|
|
|
46
|
-
export type AnyEncoded =
|
|
46
|
+
export type AnyEncoded = EventDefEncoded<EventDef.Any>
|
|
47
47
|
export const AnyEncoded = Schema.Struct({
|
|
48
|
-
|
|
48
|
+
name: Schema.String,
|
|
49
49
|
args: Schema.Any,
|
|
50
50
|
id: EventId.EventId,
|
|
51
51
|
parentId: EventId.EventId,
|
|
52
52
|
clientId: Schema.String,
|
|
53
53
|
sessionId: Schema.String,
|
|
54
|
-
}).annotations({ title: '
|
|
54
|
+
}).annotations({ title: 'LiveStoreEvent.AnyEncoded' })
|
|
55
55
|
|
|
56
56
|
export const AnyEncodedGlobal = Schema.Struct({
|
|
57
|
-
|
|
57
|
+
name: Schema.String,
|
|
58
58
|
args: Schema.Any,
|
|
59
59
|
id: EventId.GlobalEventId,
|
|
60
60
|
parentId: EventId.GlobalEventId,
|
|
61
61
|
clientId: Schema.String,
|
|
62
62
|
sessionId: Schema.String,
|
|
63
|
-
}).annotations({ title: '
|
|
63
|
+
}).annotations({ title: 'LiveStoreEvent.AnyEncodedGlobal' })
|
|
64
64
|
export type AnyEncodedGlobal = typeof AnyEncodedGlobal.Type
|
|
65
65
|
|
|
66
|
-
export type PartialAnyDecoded =
|
|
67
|
-
export type PartialAnyEncoded = PartialEncoded<
|
|
66
|
+
export type PartialAnyDecoded = EventDefPartial<EventDef.Any>
|
|
67
|
+
export type PartialAnyEncoded = PartialEncoded<EventDef.Any>
|
|
68
68
|
|
|
69
69
|
export const PartialAnyEncoded = Schema.Struct({
|
|
70
|
-
|
|
70
|
+
name: Schema.String,
|
|
71
71
|
args: Schema.Any,
|
|
72
72
|
})
|
|
73
73
|
|
|
74
74
|
export type PartialForSchema<TSchema extends LiveStoreSchema> = {
|
|
75
|
-
[K in keyof TSchema['
|
|
76
|
-
}[keyof TSchema['
|
|
75
|
+
[K in keyof TSchema['_EventDefMapType']]: EventDefPartial<TSchema['_EventDefMapType'][K]>
|
|
76
|
+
}[keyof TSchema['_EventDefMapType']]
|
|
77
77
|
|
|
78
78
|
export type ForSchema<TSchema extends LiveStoreSchema> = {
|
|
79
|
-
[K in keyof TSchema['
|
|
80
|
-
}[keyof TSchema['
|
|
79
|
+
[K in keyof TSchema['_EventDefMapType']]: ForEventDef<TSchema['_EventDefMapType'][K]>
|
|
80
|
+
}[keyof TSchema['_EventDefMapType']]
|
|
81
81
|
|
|
82
|
-
export const
|
|
83
|
-
|
|
84
|
-
): mutationEvent is PartialAnyDecoded => 'id' in mutationEvent === false && 'parentId' in mutationEvent === false
|
|
82
|
+
export const isPartialEventDef = (event: AnyDecoded | PartialAnyDecoded): event is PartialAnyDecoded =>
|
|
83
|
+
'id' in event === false && 'parentId' in event === false
|
|
85
84
|
|
|
86
|
-
export type
|
|
85
|
+
export type ForEventDefRecord<TEventDefRecord extends EventDefRecord> = Schema.Schema<
|
|
87
86
|
{
|
|
88
|
-
[K in keyof
|
|
89
|
-
|
|
90
|
-
args: Schema.Schema.Type<
|
|
87
|
+
[K in keyof TEventDefRecord]: {
|
|
88
|
+
name: K
|
|
89
|
+
args: Schema.Schema.Type<TEventDefRecord[K]['schema']>
|
|
91
90
|
id: EventId.EventId
|
|
92
91
|
parentId: EventId.EventId
|
|
93
92
|
clientId: string
|
|
94
93
|
sessionId: string
|
|
95
94
|
}
|
|
96
|
-
}[keyof
|
|
95
|
+
}[keyof TEventDefRecord],
|
|
97
96
|
{
|
|
98
|
-
[K in keyof
|
|
99
|
-
|
|
100
|
-
args: Schema.Schema.Encoded<
|
|
97
|
+
[K in keyof TEventDefRecord]: {
|
|
98
|
+
name: K
|
|
99
|
+
args: Schema.Schema.Encoded<TEventDefRecord[K]['schema']>
|
|
101
100
|
id: EventId.EventId
|
|
102
101
|
parentId: EventId.EventId
|
|
103
102
|
clientId: string
|
|
104
103
|
sessionId: string
|
|
105
104
|
}
|
|
106
|
-
}[keyof
|
|
105
|
+
}[keyof TEventDefRecord]
|
|
107
106
|
>
|
|
108
107
|
|
|
109
|
-
export type
|
|
108
|
+
export type EventDefPartialSchema<TEventDefRecord extends EventDefRecord> = Schema.Schema<
|
|
110
109
|
{
|
|
111
|
-
[K in keyof
|
|
112
|
-
|
|
113
|
-
args: Schema.Schema.Type<
|
|
110
|
+
[K in keyof TEventDefRecord]: {
|
|
111
|
+
name: K
|
|
112
|
+
args: Schema.Schema.Type<TEventDefRecord[K]['schema']>
|
|
114
113
|
}
|
|
115
|
-
}[keyof
|
|
114
|
+
}[keyof TEventDefRecord],
|
|
116
115
|
{
|
|
117
|
-
[K in keyof
|
|
118
|
-
|
|
119
|
-
args: Schema.Schema.Encoded<
|
|
116
|
+
[K in keyof TEventDefRecord]: {
|
|
117
|
+
name: K
|
|
118
|
+
args: Schema.Schema.Encoded<TEventDefRecord[K]['schema']>
|
|
120
119
|
}
|
|
121
|
-
}[keyof
|
|
120
|
+
}[keyof TEventDefRecord]
|
|
122
121
|
>
|
|
123
122
|
|
|
124
|
-
export const
|
|
123
|
+
export const makeEventDefSchema = <TSchema extends LiveStoreSchema>(
|
|
125
124
|
schema: TSchema,
|
|
126
|
-
):
|
|
125
|
+
): ForEventDefRecord<TSchema['_EventDefMapType']> =>
|
|
127
126
|
Schema.Union(
|
|
128
|
-
...[...schema.
|
|
127
|
+
...[...schema.eventsDefsMap.values()].map((def) =>
|
|
129
128
|
Schema.Struct({
|
|
130
|
-
|
|
129
|
+
name: Schema.Literal(def.name),
|
|
131
130
|
args: def.schema,
|
|
132
131
|
id: EventId.EventId,
|
|
133
132
|
parentId: EventId.EventId,
|
|
@@ -135,25 +134,25 @@ export const makeMutationEventSchema = <TSchema extends LiveStoreSchema>(
|
|
|
135
134
|
sessionId: Schema.String,
|
|
136
135
|
}),
|
|
137
136
|
),
|
|
138
|
-
).annotations({ title: '
|
|
137
|
+
).annotations({ title: 'EventDef' }) as any
|
|
139
138
|
|
|
140
|
-
export const
|
|
139
|
+
export const makeEventDefPartialSchema = <TSchema extends LiveStoreSchema>(
|
|
141
140
|
schema: TSchema,
|
|
142
|
-
):
|
|
141
|
+
): EventDefPartialSchema<TSchema['_EventDefMapType']> =>
|
|
143
142
|
Schema.Union(
|
|
144
|
-
...[...schema.
|
|
143
|
+
...[...schema.eventsDefsMap.values()].map((def) =>
|
|
145
144
|
Schema.Struct({
|
|
146
|
-
|
|
145
|
+
name: Schema.Literal(def.name),
|
|
147
146
|
args: def.schema,
|
|
148
147
|
}),
|
|
149
148
|
),
|
|
150
|
-
).annotations({ title: '
|
|
149
|
+
).annotations({ title: 'EventDefPartial' }) as any
|
|
151
150
|
|
|
152
|
-
export const
|
|
151
|
+
export const makeEventDefSchemaMemo = memoizeByRef(makeEventDefSchema)
|
|
153
152
|
|
|
154
153
|
/** Equivalent to AnyEncoded but with a meta field and some convenience methods */
|
|
155
|
-
export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('
|
|
156
|
-
|
|
154
|
+
export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('LiveStoreEvent.EncodedWithMeta')({
|
|
155
|
+
name: Schema.String,
|
|
157
156
|
args: Schema.Any,
|
|
158
157
|
// TODO rename to `.num` / `.parentNum`
|
|
159
158
|
id: EventId.EventId,
|
|
@@ -185,8 +184,8 @@ export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('MutationEven
|
|
|
185
184
|
// - More readable way to print the id + parentId
|
|
186
185
|
// - not including `meta`, `clientId`, `sessionId`
|
|
187
186
|
return {
|
|
188
|
-
id: `${EventId.toString(this.id)} → ${EventId.toString(this.parentId)}`,
|
|
189
|
-
|
|
187
|
+
id: `${EventId.toString(this.id)} → ${EventId.toString(this.parentId)} (${this.clientId}, ${this.sessionId})`,
|
|
188
|
+
name: this.name,
|
|
190
189
|
args: this.args,
|
|
191
190
|
}
|
|
192
191
|
}
|
|
@@ -214,11 +213,11 @@ export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('MutationEven
|
|
|
214
213
|
...EventId.nextPair(parentId, isClient),
|
|
215
214
|
})
|
|
216
215
|
|
|
217
|
-
static fromGlobal = (
|
|
216
|
+
static fromGlobal = (event: AnyEncodedGlobal, syncMetadata: Option.Option<Schema.JsonValue>) =>
|
|
218
217
|
new EncodedWithMeta({
|
|
219
|
-
...
|
|
220
|
-
id: { global:
|
|
221
|
-
parentId: { global:
|
|
218
|
+
...event,
|
|
219
|
+
id: { global: event.id, client: EventId.clientDefault },
|
|
220
|
+
parentId: { global: event.parentId, client: EventId.clientDefault },
|
|
222
221
|
meta: { sessionChangeset: { _tag: 'unset' as const }, syncMetadata },
|
|
223
222
|
})
|
|
224
223
|
|
|
@@ -233,7 +232,7 @@ export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('MutationEven
|
|
|
233
232
|
export const isEqualEncoded = (a: AnyEncoded, b: AnyEncoded) =>
|
|
234
233
|
a.id.global === b.id.global &&
|
|
235
234
|
a.id.client === b.id.client &&
|
|
236
|
-
a.
|
|
235
|
+
a.name === b.name &&
|
|
237
236
|
a.clientId === b.clientId &&
|
|
238
237
|
a.sessionId === b.sessionId &&
|
|
239
238
|
// TODO use schema equality here
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { Schema } from '@livestore/utils/effect'
|
|
2
|
+
import { describe, expect, test } from 'vitest'
|
|
3
|
+
|
|
4
|
+
import { tables } from '../__tests__/fixture.js'
|
|
5
|
+
import { clientDocument, ClientDocumentTableDefSymbol } from './client-document-def.js'
|
|
6
|
+
import type * as LiveStoreEvent from './LiveStoreEvent.js'
|
|
7
|
+
|
|
8
|
+
const materializerContext = {
|
|
9
|
+
currentFacts: new Map(),
|
|
10
|
+
clientOnly: false,
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
describe('client document table', () => {
|
|
14
|
+
test('set event', () => {
|
|
15
|
+
expect(patchId(tables.UiState.set({ showSidebar: false }, 'session-1'))).toMatchInlineSnapshot(`
|
|
16
|
+
{
|
|
17
|
+
"args": {
|
|
18
|
+
"id": "session-1",
|
|
19
|
+
"value": {
|
|
20
|
+
"showSidebar": false,
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
"id": "00000000-0000-0000-0000-000000000000",
|
|
24
|
+
"name": "UiStateSet",
|
|
25
|
+
}
|
|
26
|
+
`)
|
|
27
|
+
|
|
28
|
+
expect(patchId(tables.appConfig.set({ fontSize: 12, theme: 'dark' }))).toMatchInlineSnapshot(`
|
|
29
|
+
{
|
|
30
|
+
"args": {
|
|
31
|
+
"id": "static",
|
|
32
|
+
"value": {
|
|
33
|
+
"fontSize": 12,
|
|
34
|
+
"theme": "dark",
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
"id": "00000000-0000-0000-0000-000000000000",
|
|
38
|
+
"name": "AppConfigSet",
|
|
39
|
+
}
|
|
40
|
+
`)
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
describe('materializer', () => {
|
|
44
|
+
const forSchema = <T>(schema: Schema.Schema<T, any>, value: T, id?: string, options?: { partialSet?: boolean }) => {
|
|
45
|
+
const Doc = clientDocument({
|
|
46
|
+
name: 'test',
|
|
47
|
+
schema,
|
|
48
|
+
default: { value },
|
|
49
|
+
...options,
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
const materializer = Doc[ClientDocumentTableDefSymbol].derived.setMaterializer
|
|
53
|
+
|
|
54
|
+
return materializer(Doc.set(value, id as any).args, materializerContext)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
test('string value', () => {
|
|
58
|
+
expect(forSchema(Schema.String, 'hello', 'id1')).toMatchInlineSnapshot(`
|
|
59
|
+
{
|
|
60
|
+
"bindValues": [
|
|
61
|
+
"id1",
|
|
62
|
+
""hello"",
|
|
63
|
+
""hello"",
|
|
64
|
+
],
|
|
65
|
+
"sql": "INSERT INTO 'test' (id, value) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET value = ?",
|
|
66
|
+
"writeTables": Set {
|
|
67
|
+
"test",
|
|
68
|
+
},
|
|
69
|
+
}
|
|
70
|
+
`)
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
test('struct value (partial set=true)', () => {
|
|
74
|
+
expect(forSchema(Schema.Struct({ a: Schema.String }), { a: 'hello' }, 'id1', { partialSet: true }))
|
|
75
|
+
.toMatchInlineSnapshot(`
|
|
76
|
+
{
|
|
77
|
+
"bindValues": [
|
|
78
|
+
"id1",
|
|
79
|
+
"{"a":"hello"}",
|
|
80
|
+
"$.a",
|
|
81
|
+
""hello"",
|
|
82
|
+
],
|
|
83
|
+
"sql": "
|
|
84
|
+
INSERT INTO 'test' (id, value)
|
|
85
|
+
VALUES (?, ?)
|
|
86
|
+
ON CONFLICT (id) DO UPDATE SET value = json_set(value, ?, json(?))
|
|
87
|
+
",
|
|
88
|
+
"writeTables": Set {
|
|
89
|
+
"test",
|
|
90
|
+
},
|
|
91
|
+
}
|
|
92
|
+
`)
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
test('struct value (partial set=false)', () => {
|
|
96
|
+
expect(forSchema(Schema.Struct({ a: Schema.String }), { a: 'hello' }, 'id1', { partialSet: false }))
|
|
97
|
+
.toMatchInlineSnapshot(`
|
|
98
|
+
{
|
|
99
|
+
"bindValues": [
|
|
100
|
+
"id1",
|
|
101
|
+
"{"a":"hello"}",
|
|
102
|
+
"{"a":"hello"}",
|
|
103
|
+
],
|
|
104
|
+
"sql": "INSERT INTO 'test' (id, value) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET value = ?",
|
|
105
|
+
"writeTables": Set {
|
|
106
|
+
"test",
|
|
107
|
+
},
|
|
108
|
+
}
|
|
109
|
+
`)
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
test('struct value (partial set=true) advanced', () => {
|
|
113
|
+
expect(
|
|
114
|
+
forSchema(
|
|
115
|
+
Schema.Struct({ a: Schema.String, b: Schema.String, c: Schema.Number }),
|
|
116
|
+
{ a: 'hello', c: 123 } as any,
|
|
117
|
+
'id1',
|
|
118
|
+
{ partialSet: true },
|
|
119
|
+
),
|
|
120
|
+
).toMatchInlineSnapshot(`
|
|
121
|
+
{
|
|
122
|
+
"bindValues": [
|
|
123
|
+
"id1",
|
|
124
|
+
"{"a":"hello","c":123}",
|
|
125
|
+
"$.a",
|
|
126
|
+
""hello"",
|
|
127
|
+
"$.c",
|
|
128
|
+
"123",
|
|
129
|
+
],
|
|
130
|
+
"sql": "
|
|
131
|
+
INSERT INTO 'test' (id, value)
|
|
132
|
+
VALUES (?, ?)
|
|
133
|
+
ON CONFLICT (id) DO UPDATE SET value = json_set(json_set(value, ?, json(?)), ?, json(?))
|
|
134
|
+
",
|
|
135
|
+
"writeTables": Set {
|
|
136
|
+
"test",
|
|
137
|
+
},
|
|
138
|
+
}
|
|
139
|
+
`)
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
test('struct value (partial set=true), explicit undefined, filter out undefined values', () => {
|
|
143
|
+
expect(
|
|
144
|
+
forSchema(
|
|
145
|
+
Schema.Struct({ a: Schema.String.pipe(Schema.optional), b: Schema.String }),
|
|
146
|
+
{ a: undefined, b: 'hello' },
|
|
147
|
+
'id1',
|
|
148
|
+
{
|
|
149
|
+
partialSet: true,
|
|
150
|
+
},
|
|
151
|
+
),
|
|
152
|
+
).toMatchInlineSnapshot(`
|
|
153
|
+
{
|
|
154
|
+
"bindValues": [
|
|
155
|
+
"id1",
|
|
156
|
+
"{"b":"hello"}",
|
|
157
|
+
"$.b",
|
|
158
|
+
""hello"",
|
|
159
|
+
],
|
|
160
|
+
"sql": "
|
|
161
|
+
INSERT INTO 'test' (id, value)
|
|
162
|
+
VALUES (?, ?)
|
|
163
|
+
ON CONFLICT (id) DO UPDATE SET value = json_set(value, ?, json(?))
|
|
164
|
+
",
|
|
165
|
+
"writeTables": Set {
|
|
166
|
+
"test",
|
|
167
|
+
},
|
|
168
|
+
}
|
|
169
|
+
`)
|
|
170
|
+
})
|
|
171
|
+
|
|
172
|
+
test('struct value (partial set=true), explicit undefined, nothing to update', () => {
|
|
173
|
+
expect(
|
|
174
|
+
forSchema(Schema.Struct({ a: Schema.String.pipe(Schema.optional) }), { a: undefined }, 'id1', {
|
|
175
|
+
partialSet: true,
|
|
176
|
+
}),
|
|
177
|
+
).toMatchInlineSnapshot(`
|
|
178
|
+
{
|
|
179
|
+
"bindValues": [
|
|
180
|
+
"id1",
|
|
181
|
+
"{}",
|
|
182
|
+
],
|
|
183
|
+
"sql": "
|
|
184
|
+
INSERT INTO 'test' (id, value)
|
|
185
|
+
VALUES (?, ?)
|
|
186
|
+
ON CONFLICT (id) DO NOTHING
|
|
187
|
+
",
|
|
188
|
+
"writeTables": Set {
|
|
189
|
+
"test",
|
|
190
|
+
},
|
|
191
|
+
}
|
|
192
|
+
`)
|
|
193
|
+
})
|
|
194
|
+
|
|
195
|
+
test('struct union value', () => {
|
|
196
|
+
expect(
|
|
197
|
+
forSchema(
|
|
198
|
+
Schema.Union(Schema.Struct({ a: Schema.String }), Schema.Struct({ b: Schema.String })),
|
|
199
|
+
{ a: 'hello' },
|
|
200
|
+
'id1',
|
|
201
|
+
),
|
|
202
|
+
).toMatchInlineSnapshot(`
|
|
203
|
+
{
|
|
204
|
+
"bindValues": [
|
|
205
|
+
"id1",
|
|
206
|
+
"{"a":"hello"}",
|
|
207
|
+
"{"a":"hello"}",
|
|
208
|
+
],
|
|
209
|
+
"sql": "INSERT INTO 'test' (id, value) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET value = ?",
|
|
210
|
+
"writeTables": Set {
|
|
211
|
+
"test",
|
|
212
|
+
},
|
|
213
|
+
}
|
|
214
|
+
`)
|
|
215
|
+
})
|
|
216
|
+
|
|
217
|
+
test('array value', () => {
|
|
218
|
+
expect(forSchema(Schema.Array(Schema.String), ['hello', 'world'], 'id1')).toMatchInlineSnapshot(`
|
|
219
|
+
{
|
|
220
|
+
"bindValues": [
|
|
221
|
+
"id1",
|
|
222
|
+
"["hello","world"]",
|
|
223
|
+
"["hello","world"]",
|
|
224
|
+
],
|
|
225
|
+
"sql": "INSERT INTO 'test' (id, value) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET value = ?",
|
|
226
|
+
"writeTables": Set {
|
|
227
|
+
"test",
|
|
228
|
+
},
|
|
229
|
+
}
|
|
230
|
+
`)
|
|
231
|
+
})
|
|
232
|
+
})
|
|
233
|
+
})
|
|
234
|
+
|
|
235
|
+
const patchId = (muationEvent: LiveStoreEvent.PartialAnyDecoded) => {
|
|
236
|
+
// TODO use new id paradigm
|
|
237
|
+
const id = `00000000-0000-0000-0000-000000000000`
|
|
238
|
+
return { ...muationEvent, id }
|
|
239
|
+
}
|