@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.
Files changed (272) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/__tests__/fixture.d.ts +83 -221
  3. package/dist/__tests__/fixture.d.ts.map +1 -1
  4. package/dist/__tests__/fixture.js +33 -11
  5. package/dist/__tests__/fixture.js.map +1 -1
  6. package/dist/adapter-types.d.ts +34 -13
  7. package/dist/adapter-types.d.ts.map +1 -1
  8. package/dist/adapter-types.js +20 -2
  9. package/dist/adapter-types.js.map +1 -1
  10. package/dist/bounded-collections.d.ts +1 -1
  11. package/dist/bounded-collections.d.ts.map +1 -1
  12. package/dist/debug-info.d.ts.map +1 -1
  13. package/dist/debug-info.js +1 -0
  14. package/dist/debug-info.js.map +1 -1
  15. package/dist/devtools/devtools-messages-client-session.d.ts +21 -21
  16. package/dist/devtools/devtools-messages-common.d.ts +6 -6
  17. package/dist/devtools/devtools-messages-leader.d.ts +45 -45
  18. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  19. package/dist/devtools/devtools-messages-leader.js +11 -11
  20. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  21. package/dist/index.d.ts +2 -5
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +2 -5
  24. package/dist/index.js.map +1 -1
  25. package/dist/leader-thread/LeaderSyncProcessor.d.ts +25 -12
  26. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  27. package/dist/leader-thread/LeaderSyncProcessor.js +146 -98
  28. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  29. package/dist/leader-thread/{apply-mutation.d.ts → apply-event.d.ts} +7 -7
  30. package/dist/leader-thread/apply-event.d.ts.map +1 -0
  31. package/dist/leader-thread/{apply-mutation.js → apply-event.js} +45 -45
  32. package/dist/leader-thread/apply-event.js.map +1 -0
  33. package/dist/leader-thread/eventlog.d.ts +27 -0
  34. package/dist/leader-thread/eventlog.d.ts.map +1 -0
  35. package/dist/leader-thread/eventlog.js +123 -0
  36. package/dist/leader-thread/eventlog.js.map +1 -0
  37. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  38. package/dist/leader-thread/leader-worker-devtools.js +21 -19
  39. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  40. package/dist/leader-thread/make-leader-thread-layer.d.ts +16 -4
  41. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  42. package/dist/leader-thread/make-leader-thread-layer.js +23 -16
  43. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  44. package/dist/leader-thread/mod.d.ts +1 -1
  45. package/dist/leader-thread/mod.d.ts.map +1 -1
  46. package/dist/leader-thread/mod.js +1 -1
  47. package/dist/leader-thread/mod.js.map +1 -1
  48. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  49. package/dist/leader-thread/recreate-db.js +6 -7
  50. package/dist/leader-thread/recreate-db.js.map +1 -1
  51. package/dist/leader-thread/types.d.ts +14 -15
  52. package/dist/leader-thread/types.d.ts.map +1 -1
  53. package/dist/materializer-helper.d.ts +23 -0
  54. package/dist/materializer-helper.d.ts.map +1 -0
  55. package/dist/materializer-helper.js +70 -0
  56. package/dist/materializer-helper.js.map +1 -0
  57. package/dist/query-builder/api.d.ts +56 -51
  58. package/dist/query-builder/api.d.ts.map +1 -1
  59. package/dist/query-builder/api.js +3 -5
  60. package/dist/query-builder/api.js.map +1 -1
  61. package/dist/query-builder/astToSql.d.ts.map +1 -1
  62. package/dist/query-builder/astToSql.js +59 -37
  63. package/dist/query-builder/astToSql.js.map +1 -1
  64. package/dist/query-builder/impl.d.ts +2 -3
  65. package/dist/query-builder/impl.d.ts.map +1 -1
  66. package/dist/query-builder/impl.js +48 -46
  67. package/dist/query-builder/impl.js.map +1 -1
  68. package/dist/query-builder/impl.test.d.ts +86 -1
  69. package/dist/query-builder/impl.test.d.ts.map +1 -1
  70. package/dist/query-builder/impl.test.js +223 -36
  71. package/dist/query-builder/impl.test.js.map +1 -1
  72. package/dist/rehydrate-from-eventlog.d.ts +15 -0
  73. package/dist/rehydrate-from-eventlog.d.ts.map +1 -0
  74. package/dist/{rehydrate-from-mutationlog.js → rehydrate-from-eventlog.js} +26 -25
  75. package/dist/rehydrate-from-eventlog.js.map +1 -0
  76. package/dist/schema/EventDef.d.ts +136 -0
  77. package/dist/schema/EventDef.d.ts.map +1 -0
  78. package/dist/schema/EventDef.js +58 -0
  79. package/dist/schema/EventDef.js.map +1 -0
  80. package/dist/schema/EventId.d.ts +7 -2
  81. package/dist/schema/EventId.d.ts.map +1 -1
  82. package/dist/schema/EventId.js +18 -3
  83. package/dist/schema/EventId.js.map +1 -1
  84. package/dist/schema/{MutationEvent.d.ts → LiveStoreEvent.d.ts} +56 -56
  85. package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
  86. package/dist/schema/{MutationEvent.js → LiveStoreEvent.js} +25 -25
  87. package/dist/schema/LiveStoreEvent.js.map +1 -0
  88. package/dist/schema/client-document-def.d.ts +223 -0
  89. package/dist/schema/client-document-def.d.ts.map +1 -0
  90. package/dist/schema/client-document-def.js +170 -0
  91. package/dist/schema/client-document-def.js.map +1 -0
  92. package/dist/schema/client-document-def.test.d.ts +2 -0
  93. package/dist/schema/client-document-def.test.d.ts.map +1 -0
  94. package/dist/schema/client-document-def.test.js +201 -0
  95. package/dist/schema/client-document-def.test.js.map +1 -0
  96. package/dist/schema/db-schema/dsl/mod.d.ts.map +1 -1
  97. package/dist/schema/events.d.ts +2 -0
  98. package/dist/schema/events.d.ts.map +1 -0
  99. package/dist/schema/events.js +2 -0
  100. package/dist/schema/events.js.map +1 -0
  101. package/dist/schema/mod.d.ts +4 -3
  102. package/dist/schema/mod.d.ts.map +1 -1
  103. package/dist/schema/mod.js +4 -3
  104. package/dist/schema/mod.js.map +1 -1
  105. package/dist/schema/schema.d.ts +26 -22
  106. package/dist/schema/schema.d.ts.map +1 -1
  107. package/dist/schema/schema.js +45 -43
  108. package/dist/schema/schema.js.map +1 -1
  109. package/dist/schema/sqlite-state.d.ts +12 -0
  110. package/dist/schema/sqlite-state.d.ts.map +1 -0
  111. package/dist/schema/sqlite-state.js +36 -0
  112. package/dist/schema/sqlite-state.js.map +1 -0
  113. package/dist/schema/system-tables.d.ts +67 -98
  114. package/dist/schema/system-tables.d.ts.map +1 -1
  115. package/dist/schema/system-tables.js +62 -48
  116. package/dist/schema/system-tables.js.map +1 -1
  117. package/dist/schema/table-def.d.ts +26 -96
  118. package/dist/schema/table-def.d.ts.map +1 -1
  119. package/dist/schema/table-def.js +14 -64
  120. package/dist/schema/table-def.js.map +1 -1
  121. package/dist/schema/view.d.ts +3 -0
  122. package/dist/schema/view.d.ts.map +1 -0
  123. package/dist/schema/view.js +3 -0
  124. package/dist/schema/view.js.map +1 -0
  125. package/dist/schema-management/common.d.ts +4 -4
  126. package/dist/schema-management/common.d.ts.map +1 -1
  127. package/dist/schema-management/migrations.d.ts.map +1 -1
  128. package/dist/schema-management/migrations.js +6 -6
  129. package/dist/schema-management/migrations.js.map +1 -1
  130. package/dist/schema-management/validate-mutation-defs.d.ts +3 -3
  131. package/dist/schema-management/validate-mutation-defs.d.ts.map +1 -1
  132. package/dist/schema-management/validate-mutation-defs.js +17 -17
  133. package/dist/schema-management/validate-mutation-defs.js.map +1 -1
  134. package/dist/sync/ClientSessionSyncProcessor.d.ts +7 -7
  135. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  136. package/dist/sync/ClientSessionSyncProcessor.js +33 -30
  137. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  138. package/dist/sync/next/facts.d.ts +19 -19
  139. package/dist/sync/next/facts.d.ts.map +1 -1
  140. package/dist/sync/next/facts.js +2 -2
  141. package/dist/sync/next/facts.js.map +1 -1
  142. package/dist/sync/next/history-dag-common.d.ts +3 -3
  143. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  144. package/dist/sync/next/history-dag-common.js +1 -1
  145. package/dist/sync/next/history-dag-common.js.map +1 -1
  146. package/dist/sync/next/history-dag.js +1 -1
  147. package/dist/sync/next/history-dag.js.map +1 -1
  148. package/dist/sync/next/rebase-events.d.ts +7 -7
  149. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  150. package/dist/sync/next/rebase-events.js +5 -5
  151. package/dist/sync/next/rebase-events.js.map +1 -1
  152. package/dist/sync/next/test/compact-events.calculator.test.js +38 -33
  153. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  154. package/dist/sync/next/test/compact-events.test.js +71 -71
  155. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  156. package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +25 -25
  157. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
  158. package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +60 -25
  159. package/dist/sync/next/test/event-fixtures.js.map +1 -0
  160. package/dist/sync/next/test/mod.d.ts +1 -1
  161. package/dist/sync/next/test/mod.d.ts.map +1 -1
  162. package/dist/sync/next/test/mod.js +1 -1
  163. package/dist/sync/next/test/mod.js.map +1 -1
  164. package/dist/sync/sync.d.ts +3 -3
  165. package/dist/sync/sync.d.ts.map +1 -1
  166. package/dist/sync/syncstate.d.ts +30 -30
  167. package/dist/sync/syncstate.d.ts.map +1 -1
  168. package/dist/sync/syncstate.js +73 -40
  169. package/dist/sync/syncstate.js.map +1 -1
  170. package/dist/sync/syncstate.test.js +175 -184
  171. package/dist/sync/syncstate.test.js.map +1 -1
  172. package/dist/sync/validate-push-payload.d.ts +2 -2
  173. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  174. package/dist/sync/validate-push-payload.js.map +1 -1
  175. package/dist/version.d.ts +1 -1
  176. package/dist/version.js +1 -1
  177. package/package.json +3 -3
  178. package/src/__tests__/fixture.ts +36 -15
  179. package/src/adapter-types.ts +33 -13
  180. package/src/debug-info.ts +1 -0
  181. package/src/devtools/devtools-messages-leader.ts +13 -13
  182. package/src/index.ts +2 -5
  183. package/src/leader-thread/LeaderSyncProcessor.ts +210 -138
  184. package/src/leader-thread/{apply-mutation.ts → apply-event.ts} +61 -61
  185. package/src/leader-thread/eventlog.ts +199 -0
  186. package/src/leader-thread/leader-worker-devtools.ts +22 -19
  187. package/src/leader-thread/make-leader-thread-layer.ts +51 -29
  188. package/src/leader-thread/mod.ts +1 -1
  189. package/src/leader-thread/recreate-db.ts +6 -8
  190. package/src/leader-thread/types.ts +15 -16
  191. package/src/materializer-helper.ts +110 -0
  192. package/src/query-builder/api.ts +77 -103
  193. package/src/query-builder/astToSql.ts +68 -39
  194. package/src/query-builder/impl.test.ts +239 -42
  195. package/src/query-builder/impl.ts +72 -56
  196. package/src/{rehydrate-from-mutationlog.ts → rehydrate-from-eventlog.ts} +35 -38
  197. package/src/schema/EventDef.ts +216 -0
  198. package/src/schema/EventId.ts +23 -4
  199. package/src/schema/{MutationEvent.ts → LiveStoreEvent.ts} +68 -69
  200. package/src/schema/client-document-def.test.ts +239 -0
  201. package/src/schema/client-document-def.ts +444 -0
  202. package/src/schema/db-schema/dsl/mod.ts +0 -1
  203. package/src/schema/events.ts +1 -0
  204. package/src/schema/mod.ts +4 -3
  205. package/src/schema/schema.ts +78 -68
  206. package/src/schema/sqlite-state.ts +62 -0
  207. package/src/schema/system-tables.ts +42 -53
  208. package/src/schema/table-def.ts +51 -209
  209. package/src/schema/view.ts +2 -0
  210. package/src/schema-management/common.ts +4 -4
  211. package/src/schema-management/migrations.ts +8 -9
  212. package/src/schema-management/validate-mutation-defs.ts +22 -24
  213. package/src/sync/ClientSessionSyncProcessor.ts +41 -36
  214. package/src/sync/next/facts.ts +31 -32
  215. package/src/sync/next/history-dag-common.ts +4 -4
  216. package/src/sync/next/history-dag.ts +1 -1
  217. package/src/sync/next/rebase-events.ts +13 -13
  218. package/src/sync/next/test/compact-events.calculator.test.ts +45 -45
  219. package/src/sync/next/test/compact-events.test.ts +73 -73
  220. package/src/sync/next/test/event-fixtures.ts +219 -0
  221. package/src/sync/next/test/mod.ts +1 -1
  222. package/src/sync/sync.ts +3 -3
  223. package/src/sync/syncstate.test.ts +180 -189
  224. package/src/sync/syncstate.ts +162 -100
  225. package/src/sync/validate-push-payload.ts +2 -2
  226. package/src/version.ts +1 -1
  227. package/tsconfig.json +1 -0
  228. package/dist/derived-mutations.d.ts +0 -109
  229. package/dist/derived-mutations.d.ts.map +0 -1
  230. package/dist/derived-mutations.js +0 -54
  231. package/dist/derived-mutations.js.map +0 -1
  232. package/dist/derived-mutations.test.d.ts +0 -2
  233. package/dist/derived-mutations.test.d.ts.map +0 -1
  234. package/dist/derived-mutations.test.js +0 -93
  235. package/dist/derived-mutations.test.js.map +0 -1
  236. package/dist/init-singleton-tables.d.ts +0 -4
  237. package/dist/init-singleton-tables.d.ts.map +0 -1
  238. package/dist/init-singleton-tables.js +0 -16
  239. package/dist/init-singleton-tables.js.map +0 -1
  240. package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
  241. package/dist/leader-thread/apply-mutation.js.map +0 -1
  242. package/dist/leader-thread/mutationlog.d.ts +0 -27
  243. package/dist/leader-thread/mutationlog.d.ts.map +0 -1
  244. package/dist/leader-thread/mutationlog.js +0 -124
  245. package/dist/leader-thread/mutationlog.js.map +0 -1
  246. package/dist/mutation.d.ts +0 -20
  247. package/dist/mutation.d.ts.map +0 -1
  248. package/dist/mutation.js +0 -68
  249. package/dist/mutation.js.map +0 -1
  250. package/dist/query-info.d.ts +0 -41
  251. package/dist/query-info.d.ts.map +0 -1
  252. package/dist/query-info.js +0 -7
  253. package/dist/query-info.js.map +0 -1
  254. package/dist/rehydrate-from-mutationlog.d.ts +0 -15
  255. package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
  256. package/dist/rehydrate-from-mutationlog.js.map +0 -1
  257. package/dist/schema/MutationEvent.d.ts.map +0 -1
  258. package/dist/schema/MutationEvent.js.map +0 -1
  259. package/dist/schema/mutations.d.ts +0 -115
  260. package/dist/schema/mutations.d.ts.map +0 -1
  261. package/dist/schema/mutations.js +0 -42
  262. package/dist/schema/mutations.js.map +0 -1
  263. package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
  264. package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
  265. package/src/derived-mutations.test.ts +0 -101
  266. package/src/derived-mutations.ts +0 -170
  267. package/src/init-singleton-tables.ts +0 -24
  268. package/src/leader-thread/mutationlog.ts +0 -202
  269. package/src/mutation.ts +0 -108
  270. package/src/query-info.ts +0 -83
  271. package/src/schema/mutations.ts +0 -193
  272. 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 MutationEventPartial<TMutationsDef extends MutationDef.Any> = {
9
- mutation: TMutationsDef['name']
10
- args: Schema.Schema.Type<TMutationsDef['schema']>
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<TMutationsDef extends MutationDef.Any> = {
14
- mutation: TMutationsDef['name']
15
- args: Schema.Schema.Encoded<TMutationsDef['schema']>
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 MutationEvent<TMutationsDef extends MutationDef.Any> = {
19
- mutation: TMutationsDef['name']
20
- args: Schema.Schema.Type<TMutationsDef['schema']>
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 MutationEventEncoded<TMutationsDef extends MutationDef.Any> = {
28
- mutation: TMutationsDef['name']
29
- args: Schema.Schema.Encoded<TMutationsDef['schema']>
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 = MutationEvent<MutationDef.Any>
36
+ export type AnyDecoded = ForEventDef<EventDef.Any>
37
37
  export const AnyDecoded = Schema.Struct({
38
- mutation: Schema.String,
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: 'MutationEvent.AnyDecoded' })
44
+ }).annotations({ title: 'LiveStoreEvent.AnyDecoded' })
45
45
 
46
- export type AnyEncoded = MutationEventEncoded<MutationDef.Any>
46
+ export type AnyEncoded = EventDefEncoded<EventDef.Any>
47
47
  export const AnyEncoded = Schema.Struct({
48
- mutation: Schema.String,
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: 'MutationEvent.AnyEncoded' })
54
+ }).annotations({ title: 'LiveStoreEvent.AnyEncoded' })
55
55
 
56
56
  export const AnyEncodedGlobal = Schema.Struct({
57
- mutation: Schema.String,
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: 'MutationEvent.AnyEncodedGlobal' })
63
+ }).annotations({ title: 'LiveStoreEvent.AnyEncodedGlobal' })
64
64
  export type AnyEncodedGlobal = typeof AnyEncodedGlobal.Type
65
65
 
66
- export type PartialAnyDecoded = MutationEventPartial<MutationDef.Any>
67
- export type PartialAnyEncoded = PartialEncoded<MutationDef.Any>
66
+ export type PartialAnyDecoded = EventDefPartial<EventDef.Any>
67
+ export type PartialAnyEncoded = PartialEncoded<EventDef.Any>
68
68
 
69
69
  export const PartialAnyEncoded = Schema.Struct({
70
- mutation: Schema.String,
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['_MutationDefMapType']]: MutationEventPartial<TSchema['_MutationDefMapType'][K]>
76
- }[keyof TSchema['_MutationDefMapType']]
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['_MutationDefMapType']]: MutationEvent<TSchema['_MutationDefMapType'][K]>
80
- }[keyof TSchema['_MutationDefMapType']]
79
+ [K in keyof TSchema['_EventDefMapType']]: ForEventDef<TSchema['_EventDefMapType'][K]>
80
+ }[keyof TSchema['_EventDefMapType']]
81
81
 
82
- export const isPartialMutationEvent = (
83
- mutationEvent: AnyDecoded | PartialAnyDecoded,
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 ForMutationDefRecord<TMutationsDefRecord extends MutationDefRecord> = Schema.Schema<
85
+ export type ForEventDefRecord<TEventDefRecord extends EventDefRecord> = Schema.Schema<
87
86
  {
88
- [K in keyof TMutationsDefRecord]: {
89
- mutation: K
90
- args: Schema.Schema.Type<TMutationsDefRecord[K]['schema']>
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 TMutationsDefRecord],
95
+ }[keyof TEventDefRecord],
97
96
  {
98
- [K in keyof TMutationsDefRecord]: {
99
- mutation: K
100
- args: Schema.Schema.Encoded<TMutationsDefRecord[K]['schema']>
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 TMutationsDefRecord]
105
+ }[keyof TEventDefRecord]
107
106
  >
108
107
 
109
- export type MutationEventPartialSchema<TMutationsDefRecord extends MutationDefRecord> = Schema.Schema<
108
+ export type EventDefPartialSchema<TEventDefRecord extends EventDefRecord> = Schema.Schema<
110
109
  {
111
- [K in keyof TMutationsDefRecord]: {
112
- mutation: K
113
- args: Schema.Schema.Type<TMutationsDefRecord[K]['schema']>
110
+ [K in keyof TEventDefRecord]: {
111
+ name: K
112
+ args: Schema.Schema.Type<TEventDefRecord[K]['schema']>
114
113
  }
115
- }[keyof TMutationsDefRecord],
114
+ }[keyof TEventDefRecord],
116
115
  {
117
- [K in keyof TMutationsDefRecord]: {
118
- mutation: K
119
- args: Schema.Schema.Encoded<TMutationsDefRecord[K]['schema']>
116
+ [K in keyof TEventDefRecord]: {
117
+ name: K
118
+ args: Schema.Schema.Encoded<TEventDefRecord[K]['schema']>
120
119
  }
121
- }[keyof TMutationsDefRecord]
120
+ }[keyof TEventDefRecord]
122
121
  >
123
122
 
124
- export const makeMutationEventSchema = <TSchema extends LiveStoreSchema>(
123
+ export const makeEventDefSchema = <TSchema extends LiveStoreSchema>(
125
124
  schema: TSchema,
126
- ): ForMutationDefRecord<TSchema['_MutationDefMapType']> =>
125
+ ): ForEventDefRecord<TSchema['_EventDefMapType']> =>
127
126
  Schema.Union(
128
- ...[...schema.mutations.map.values()].map((def) =>
127
+ ...[...schema.eventsDefsMap.values()].map((def) =>
129
128
  Schema.Struct({
130
- mutation: Schema.Literal(def.name),
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: 'MutationEvent' }) as any
137
+ ).annotations({ title: 'EventDef' }) as any
139
138
 
140
- export const makeMutationEventPartialSchema = <TSchema extends LiveStoreSchema>(
139
+ export const makeEventDefPartialSchema = <TSchema extends LiveStoreSchema>(
141
140
  schema: TSchema,
142
- ): MutationEventPartialSchema<TSchema['_MutationDefMapType']> =>
141
+ ): EventDefPartialSchema<TSchema['_EventDefMapType']> =>
143
142
  Schema.Union(
144
- ...[...schema.mutations.map.values()].map((def) =>
143
+ ...[...schema.eventsDefsMap.values()].map((def) =>
145
144
  Schema.Struct({
146
- mutation: Schema.Literal(def.name),
145
+ name: Schema.Literal(def.name),
147
146
  args: def.schema,
148
147
  }),
149
148
  ),
150
- ).annotations({ title: 'MutationEventPartial' }) as any
149
+ ).annotations({ title: 'EventDefPartial' }) as any
151
150
 
152
- export const makeMutationEventSchemaMemo = memoizeByRef(makeMutationEventSchema)
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>('MutationEvent.EncodedWithMeta')({
156
- mutation: Schema.String,
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
- mutation: this.mutation,
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 = (mutationEvent: AnyEncodedGlobal, syncMetadata: Option.Option<Schema.JsonValue>) =>
216
+ static fromGlobal = (event: AnyEncodedGlobal, syncMetadata: Option.Option<Schema.JsonValue>) =>
218
217
  new EncodedWithMeta({
219
- ...mutationEvent,
220
- id: { global: mutationEvent.id, client: EventId.clientDefault },
221
- parentId: { global: mutationEvent.parentId, client: EventId.clientDefault },
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.mutation === b.mutation &&
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
+ }