@livestore/common 0.3.0-dev.11 → 0.3.0-dev.13

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 (280) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/__tests__/fixture.d.ts +21 -21
  3. package/dist/adapter-types.d.ts +41 -18
  4. package/dist/adapter-types.d.ts.map +1 -1
  5. package/dist/adapter-types.js +12 -0
  6. package/dist/adapter-types.js.map +1 -1
  7. package/dist/db-schema/ast/sqlite.d.ts +69 -0
  8. package/dist/db-schema/ast/sqlite.d.ts.map +1 -0
  9. package/dist/db-schema/ast/sqlite.js +71 -0
  10. package/dist/db-schema/ast/sqlite.js.map +1 -0
  11. package/dist/db-schema/ast/validate.d.ts +3 -0
  12. package/dist/db-schema/ast/validate.d.ts.map +1 -0
  13. package/dist/db-schema/ast/validate.js +12 -0
  14. package/dist/db-schema/ast/validate.js.map +1 -0
  15. package/dist/db-schema/dsl/field-defs.d.ts +90 -0
  16. package/dist/db-schema/dsl/field-defs.d.ts.map +1 -0
  17. package/dist/db-schema/dsl/field-defs.js +87 -0
  18. package/dist/db-schema/dsl/field-defs.js.map +1 -0
  19. package/dist/db-schema/dsl/field-defs.test.d.ts +2 -0
  20. package/dist/db-schema/dsl/field-defs.test.d.ts.map +1 -0
  21. package/dist/db-schema/dsl/field-defs.test.js +29 -0
  22. package/dist/db-schema/dsl/field-defs.test.js.map +1 -0
  23. package/dist/db-schema/dsl/index.d.ts +88 -0
  24. package/dist/db-schema/dsl/index.d.ts.map +1 -0
  25. package/dist/db-schema/dsl/index.js +35 -0
  26. package/dist/db-schema/dsl/index.js.map +1 -0
  27. package/dist/db-schema/dsl/mod.d.ts +90 -0
  28. package/dist/db-schema/dsl/mod.d.ts.map +1 -0
  29. package/dist/db-schema/dsl/mod.js +35 -0
  30. package/dist/db-schema/dsl/mod.js.map +1 -0
  31. package/dist/db-schema/dsl/sqlite/field-defs.d.ts +90 -0
  32. package/dist/db-schema/dsl/sqlite/field-defs.d.ts.map +1 -0
  33. package/dist/db-schema/dsl/sqlite/field-defs.js +86 -0
  34. package/dist/db-schema/dsl/sqlite/field-defs.js.map +1 -0
  35. package/dist/db-schema/dsl/sqlite/field-defs.test.d.ts +2 -0
  36. package/dist/db-schema/dsl/sqlite/field-defs.test.d.ts.map +1 -0
  37. package/dist/db-schema/dsl/sqlite/field-defs.test.js +29 -0
  38. package/dist/db-schema/dsl/sqlite/field-defs.test.js.map +1 -0
  39. package/dist/db-schema/dsl/sqlite/index.d.ts +88 -0
  40. package/dist/db-schema/dsl/sqlite/index.d.ts.map +1 -0
  41. package/dist/db-schema/dsl/sqlite/index.js +35 -0
  42. package/dist/db-schema/dsl/sqlite/index.js.map +1 -0
  43. package/dist/db-schema/hash.d.ts +2 -0
  44. package/dist/db-schema/hash.d.ts.map +1 -0
  45. package/dist/db-schema/hash.js +14 -0
  46. package/dist/db-schema/hash.js.map +1 -0
  47. package/dist/db-schema/index.d.ts +4 -0
  48. package/dist/db-schema/index.d.ts.map +1 -0
  49. package/dist/db-schema/index.js +6 -0
  50. package/dist/db-schema/index.js.map +1 -0
  51. package/dist/db-schema/mod.d.ts +3 -0
  52. package/dist/db-schema/mod.d.ts.map +1 -0
  53. package/dist/db-schema/mod.js +3 -0
  54. package/dist/db-schema/mod.js.map +1 -0
  55. package/dist/derived-mutations.d.ts +1 -1
  56. package/dist/derived-mutations.d.ts.map +1 -1
  57. package/dist/derived-mutations.js +3 -3
  58. package/dist/derived-mutations.js.map +1 -1
  59. package/dist/devtools/devtools-bridge.d.ts +10 -7
  60. package/dist/devtools/devtools-bridge.d.ts.map +1 -1
  61. package/dist/devtools/devtools-messages-client-session.d.ts +101 -28
  62. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  63. package/dist/devtools/devtools-messages-client-session.js +19 -3
  64. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  65. package/dist/devtools/devtools-messages-common.d.ts +24 -32
  66. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  67. package/dist/devtools/devtools-messages-common.js +19 -10
  68. package/dist/devtools/devtools-messages-common.js.map +1 -1
  69. package/dist/devtools/devtools-messages-leader.d.ts +220 -56
  70. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  71. package/dist/devtools/devtools-messages-leader.js +57 -9
  72. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  73. package/dist/devtools/devtools-messages.d.ts +2 -2
  74. package/dist/devtools/devtools-messages.d.ts.map +1 -1
  75. package/dist/devtools/devtools-messages.js +2 -2
  76. package/dist/devtools/devtools-messages.js.map +1 -1
  77. package/dist/index.d.ts +1 -1
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +1 -1
  80. package/dist/index.js.map +1 -1
  81. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  82. package/dist/leader-thread/LeaderSyncProcessor.js +50 -35
  83. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  84. package/dist/leader-thread/apply-mutation.d.ts.map +1 -1
  85. package/dist/leader-thread/apply-mutation.js +8 -6
  86. package/dist/leader-thread/apply-mutation.js.map +1 -1
  87. package/dist/leader-thread/connection.d.ts +31 -3
  88. package/dist/leader-thread/connection.d.ts.map +1 -1
  89. package/dist/leader-thread/connection.js +18 -3
  90. package/dist/leader-thread/connection.js.map +1 -1
  91. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  92. package/dist/leader-thread/leader-worker-devtools.js +56 -31
  93. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  94. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  95. package/dist/leader-thread/make-leader-thread-layer.js +23 -6
  96. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  97. package/dist/leader-thread/mutationlog.d.ts +1 -1
  98. package/dist/leader-thread/mutationlog.d.ts.map +1 -1
  99. package/dist/leader-thread/mutationlog.js +7 -5
  100. package/dist/leader-thread/mutationlog.js.map +1 -1
  101. package/dist/leader-thread/pull-queue-set.d.ts.map +1 -1
  102. package/dist/leader-thread/recreate-db.d.ts +4 -2
  103. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  104. package/dist/leader-thread/recreate-db.js +13 -8
  105. package/dist/leader-thread/recreate-db.js.map +1 -1
  106. package/dist/leader-thread/types.d.ts +22 -15
  107. package/dist/leader-thread/types.d.ts.map +1 -1
  108. package/dist/leader-thread/types.js +1 -3
  109. package/dist/leader-thread/types.js.map +1 -1
  110. package/dist/query-builder/api.d.ts +3 -3
  111. package/dist/query-builder/api.d.ts.map +1 -1
  112. package/dist/query-builder/impl.js.map +1 -1
  113. package/dist/query-builder/impl.test.js +16 -1
  114. package/dist/query-builder/impl.test.js.map +1 -1
  115. package/dist/query-info.d.ts +3 -3
  116. package/dist/query-info.d.ts.map +1 -1
  117. package/dist/rehydrate-from-mutationlog.d.ts.map +1 -1
  118. package/dist/rehydrate-from-mutationlog.js +8 -6
  119. package/dist/rehydrate-from-mutationlog.js.map +1 -1
  120. package/dist/schema/EventId.d.ts +10 -9
  121. package/dist/schema/EventId.d.ts.map +1 -1
  122. package/dist/schema/EventId.js +14 -11
  123. package/dist/schema/EventId.js.map +1 -1
  124. package/dist/schema/EventId.test.js +3 -3
  125. package/dist/schema/EventId.test.js.map +1 -1
  126. package/dist/schema/MutationEvent.d.ts +37 -12
  127. package/dist/schema/MutationEvent.d.ts.map +1 -1
  128. package/dist/schema/MutationEvent.js +20 -4
  129. package/dist/schema/MutationEvent.js.map +1 -1
  130. package/dist/schema/db-schema/ast/sqlite.d.ts +69 -0
  131. package/dist/schema/db-schema/ast/sqlite.d.ts.map +1 -0
  132. package/dist/schema/db-schema/ast/sqlite.js +71 -0
  133. package/dist/schema/db-schema/ast/sqlite.js.map +1 -0
  134. package/dist/schema/db-schema/ast/validate.d.ts +3 -0
  135. package/dist/schema/db-schema/ast/validate.d.ts.map +1 -0
  136. package/dist/schema/db-schema/ast/validate.js +12 -0
  137. package/dist/schema/db-schema/ast/validate.js.map +1 -0
  138. package/dist/schema/db-schema/dsl/field-defs.d.ts +90 -0
  139. package/dist/schema/db-schema/dsl/field-defs.d.ts.map +1 -0
  140. package/dist/schema/db-schema/dsl/field-defs.js +87 -0
  141. package/dist/schema/db-schema/dsl/field-defs.js.map +1 -0
  142. package/dist/schema/db-schema/dsl/field-defs.test.d.ts +2 -0
  143. package/dist/schema/db-schema/dsl/field-defs.test.d.ts.map +1 -0
  144. package/dist/schema/db-schema/dsl/field-defs.test.js +29 -0
  145. package/dist/schema/db-schema/dsl/field-defs.test.js.map +1 -0
  146. package/dist/schema/db-schema/dsl/mod.d.ts +88 -0
  147. package/dist/schema/db-schema/dsl/mod.d.ts.map +1 -0
  148. package/dist/schema/db-schema/dsl/mod.js +35 -0
  149. package/dist/schema/db-schema/dsl/mod.js.map +1 -0
  150. package/dist/schema/db-schema/hash.d.ts +2 -0
  151. package/dist/schema/db-schema/hash.d.ts.map +1 -0
  152. package/dist/schema/db-schema/hash.js +14 -0
  153. package/dist/schema/db-schema/hash.js.map +1 -0
  154. package/dist/schema/db-schema/mod.d.ts +3 -0
  155. package/dist/schema/db-schema/mod.d.ts.map +1 -0
  156. package/dist/schema/db-schema/mod.js +3 -0
  157. package/dist/schema/db-schema/mod.js.map +1 -0
  158. package/dist/schema/mod.d.ts +1 -0
  159. package/dist/schema/mod.d.ts.map +1 -1
  160. package/dist/schema/mod.js +1 -0
  161. package/dist/schema/mod.js.map +1 -1
  162. package/dist/schema/mutations.d.ts +4 -8
  163. package/dist/schema/mutations.d.ts.map +1 -1
  164. package/dist/schema/mutations.js +2 -2
  165. package/dist/schema/mutations.js.map +1 -1
  166. package/dist/schema/schema-helpers.js +1 -1
  167. package/dist/schema/schema-helpers.js.map +1 -1
  168. package/dist/schema/schema.d.ts +1 -1
  169. package/dist/schema/schema.d.ts.map +1 -1
  170. package/dist/schema/schema.js +1 -1
  171. package/dist/schema/schema.js.map +1 -1
  172. package/dist/schema/system-tables.d.ts +47 -29
  173. package/dist/schema/system-tables.d.ts.map +1 -1
  174. package/dist/schema/system-tables.js +10 -7
  175. package/dist/schema/system-tables.js.map +1 -1
  176. package/dist/schema/table-def.d.ts +18 -14
  177. package/dist/schema/table-def.d.ts.map +1 -1
  178. package/dist/schema/table-def.js +3 -4
  179. package/dist/schema/table-def.js.map +1 -1
  180. package/dist/schema-management/migrations.d.ts +3 -3
  181. package/dist/schema-management/migrations.d.ts.map +1 -1
  182. package/dist/schema-management/migrations.js +7 -2
  183. package/dist/schema-management/migrations.js.map +1 -1
  184. package/dist/sql-queries/sql-queries.d.ts +1 -1
  185. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  186. package/dist/sql-queries/sql-queries.js.map +1 -1
  187. package/dist/sql-queries/sql-query-builder.d.ts +1 -1
  188. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  189. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  190. package/dist/sql-queries/types.d.ts +2 -1
  191. package/dist/sql-queries/types.d.ts.map +1 -1
  192. package/dist/sql-queries/types.js.map +1 -1
  193. package/dist/sync/ClientSessionSyncProcessor.d.ts +3 -5
  194. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  195. package/dist/sync/ClientSessionSyncProcessor.js +38 -12
  196. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  197. package/dist/sync/next/facts.js +1 -1
  198. package/dist/sync/next/facts.js.map +1 -1
  199. package/dist/sync/next/history-dag-common.d.ts +2 -0
  200. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  201. package/dist/sync/next/history-dag-common.js +3 -1
  202. package/dist/sync/next/history-dag-common.js.map +1 -1
  203. package/dist/sync/next/history-dag.d.ts.map +1 -1
  204. package/dist/sync/next/history-dag.js +1 -1
  205. package/dist/sync/next/history-dag.js.map +1 -1
  206. package/dist/sync/next/rebase-events.d.ts +3 -1
  207. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  208. package/dist/sync/next/rebase-events.js +5 -3
  209. package/dist/sync/next/rebase-events.js.map +1 -1
  210. package/dist/sync/next/test/compact-events.calculator.test.js +12 -12
  211. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  212. package/dist/sync/next/test/compact-events.test.js +43 -43
  213. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  214. package/dist/sync/next/test/mutation-fixtures.d.ts +11 -11
  215. package/dist/sync/next/test/mutation-fixtures.d.ts.map +1 -1
  216. package/dist/sync/next/test/mutation-fixtures.js +12 -10
  217. package/dist/sync/next/test/mutation-fixtures.js.map +1 -1
  218. package/dist/sync/sync.d.ts +2 -2
  219. package/dist/sync/syncstate.d.ts +9 -9
  220. package/dist/sync/syncstate.js +6 -6
  221. package/dist/sync/syncstate.js.map +1 -1
  222. package/dist/sync/syncstate.test.js +18 -16
  223. package/dist/sync/syncstate.test.js.map +1 -1
  224. package/dist/version.d.ts +1 -1
  225. package/dist/version.js +1 -1
  226. package/package.json +2 -3
  227. package/src/adapter-types.ts +35 -17
  228. package/src/derived-mutations.ts +4 -4
  229. package/src/devtools/devtools-bridge.ts +10 -7
  230. package/src/devtools/devtools-messages-client-session.ts +26 -10
  231. package/src/devtools/devtools-messages-common.ts +37 -8
  232. package/src/devtools/devtools-messages-leader.ts +78 -16
  233. package/src/devtools/devtools-messages.ts +2 -2
  234. package/src/index.ts +1 -1
  235. package/src/leader-thread/LeaderSyncProcessor.ts +59 -38
  236. package/src/leader-thread/apply-mutation.ts +15 -5
  237. package/src/leader-thread/connection.ts +48 -3
  238. package/src/leader-thread/leader-worker-devtools.ts +85 -35
  239. package/src/leader-thread/make-leader-thread-layer.ts +29 -9
  240. package/src/leader-thread/mutationlog.ts +8 -6
  241. package/src/leader-thread/recreate-db.ts +19 -10
  242. package/src/leader-thread/types.ts +22 -15
  243. package/src/query-builder/api.ts +4 -4
  244. package/src/query-builder/impl.test.ts +22 -1
  245. package/src/query-builder/impl.ts +2 -2
  246. package/src/query-info.ts +3 -3
  247. package/src/rehydrate-from-mutationlog.ts +8 -6
  248. package/src/schema/EventId.test.ts +3 -3
  249. package/src/schema/EventId.ts +20 -16
  250. package/src/schema/MutationEvent.ts +31 -6
  251. package/src/schema/db-schema/ast/sqlite.ts +142 -0
  252. package/src/schema/db-schema/ast/validate.ts +13 -0
  253. package/src/schema/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +206 -0
  254. package/src/schema/db-schema/dsl/field-defs.test.ts +35 -0
  255. package/src/schema/db-schema/dsl/field-defs.ts +242 -0
  256. package/src/schema/db-schema/dsl/mod.ts +195 -0
  257. package/src/schema/db-schema/hash.ts +14 -0
  258. package/src/schema/db-schema/mod.ts +2 -0
  259. package/src/schema/mod.ts +1 -0
  260. package/src/schema/mutations.ts +6 -19
  261. package/src/schema/schema-helpers.ts +1 -1
  262. package/src/schema/schema.ts +2 -2
  263. package/src/schema/system-tables.ts +10 -7
  264. package/src/schema/table-def.ts +17 -16
  265. package/src/schema-management/migrations.ts +10 -6
  266. package/src/sql-queries/sql-queries.ts +1 -1
  267. package/src/sql-queries/sql-query-builder.ts +1 -2
  268. package/src/sql-queries/types.ts +3 -1
  269. package/src/sync/ClientSessionSyncProcessor.ts +44 -14
  270. package/src/sync/next/facts.ts +1 -1
  271. package/src/sync/next/history-dag-common.ts +5 -1
  272. package/src/sync/next/history-dag.ts +1 -1
  273. package/src/sync/next/rebase-events.ts +8 -2
  274. package/src/sync/next/test/compact-events.calculator.test.ts +12 -12
  275. package/src/sync/next/test/compact-events.test.ts +43 -43
  276. package/src/sync/next/test/mutation-fixtures.ts +16 -12
  277. package/src/sync/syncstate.test.ts +19 -17
  278. package/src/sync/syncstate.ts +6 -6
  279. package/src/version.ts +1 -1
  280. package/tsconfig.json +1 -1
@@ -10,7 +10,7 @@ export type MutationEventPartial<TMutationsDef extends MutationDef.Any> = {
10
10
  args: Schema.Schema.Type<TMutationsDef['schema']>
11
11
  }
12
12
 
13
- export type MutationEventPartialEncoded<TMutationsDef extends MutationDef.Any> = {
13
+ export type PartialEncoded<TMutationsDef extends MutationDef.Any> = {
14
14
  mutation: TMutationsDef['name']
15
15
  args: Schema.Schema.Encoded<TMutationsDef['schema']>
16
16
  }
@@ -20,6 +20,8 @@ export type MutationEvent<TMutationsDef extends MutationDef.Any> = {
20
20
  args: Schema.Schema.Type<TMutationsDef['schema']>
21
21
  id: EventId.EventId
22
22
  parentId: EventId.EventId
23
+ clientId: string
24
+ sessionId: string | undefined
23
25
  }
24
26
 
25
27
  export type MutationEventEncoded<TMutationsDef extends MutationDef.Any> = {
@@ -27,6 +29,8 @@ export type MutationEventEncoded<TMutationsDef extends MutationDef.Any> = {
27
29
  args: Schema.Schema.Encoded<TMutationsDef['schema']>
28
30
  id: EventId.EventId
29
31
  parentId: EventId.EventId
32
+ clientId: string
33
+ sessionId: string | undefined
30
34
  }
31
35
 
32
36
  export type AnyDecoded = MutationEvent<MutationDef.Any>
@@ -35,6 +39,8 @@ export const AnyDecoded = Schema.Struct({
35
39
  args: Schema.Any,
36
40
  id: EventId.EventId,
37
41
  parentId: EventId.EventId,
42
+ clientId: Schema.String,
43
+ sessionId: Schema.UndefinedOr(Schema.String),
38
44
  }).annotations({ title: 'MutationEvent.AnyDecoded' })
39
45
 
40
46
  export type AnyEncoded = MutationEventEncoded<MutationDef.Any>
@@ -43,6 +49,8 @@ export const AnyEncoded = Schema.Struct({
43
49
  args: Schema.Any,
44
50
  id: EventId.EventId,
45
51
  parentId: EventId.EventId,
52
+ clientId: Schema.String,
53
+ sessionId: Schema.UndefinedOr(Schema.String),
46
54
  }).annotations({ title: 'MutationEvent.AnyEncoded' })
47
55
 
48
56
  export const AnyEncodedGlobal = Schema.Struct({
@@ -50,11 +58,17 @@ export const AnyEncodedGlobal = Schema.Struct({
50
58
  args: Schema.Any,
51
59
  id: EventId.GlobalEventId,
52
60
  parentId: EventId.GlobalEventId,
61
+ clientId: Schema.String,
53
62
  }).annotations({ title: 'MutationEvent.AnyEncodedGlobal' })
54
63
  export type AnyEncodedGlobal = typeof AnyEncodedGlobal.Type
55
64
 
56
65
  export type PartialAnyDecoded = MutationEventPartial<MutationDef.Any>
57
- export type PartialAnyEncoded = MutationEventPartialEncoded<MutationDef.Any>
66
+ export type PartialAnyEncoded = PartialEncoded<MutationDef.Any>
67
+
68
+ export const PartialAnyEncoded = Schema.Struct({
69
+ mutation: Schema.String,
70
+ args: Schema.Any,
71
+ })
58
72
 
59
73
  export type PartialForSchema<TSchema extends LiveStoreSchema> = {
60
74
  [K in keyof TSchema['_MutationDefMapType']]: MutationEventPartial<TSchema['_MutationDefMapType'][K]>
@@ -75,6 +89,8 @@ export type ForMutationDefRecord<TMutationsDefRecord extends MutationDefRecord>
75
89
  args: Schema.Schema.Type<TMutationsDefRecord[K]['schema']>
76
90
  id: EventId.EventId
77
91
  parentId: EventId.EventId
92
+ clientId: string
93
+ sessionId: string | undefined
78
94
  }
79
95
  }[keyof TMutationsDefRecord],
80
96
  {
@@ -83,6 +99,8 @@ export type ForMutationDefRecord<TMutationsDefRecord extends MutationDefRecord>
83
99
  args: Schema.Schema.Encoded<TMutationsDefRecord[K]['schema']>
84
100
  id: EventId.EventId
85
101
  parentId: EventId.EventId
102
+ clientId: string
103
+ sessionId: string | undefined
86
104
  }
87
105
  }[keyof TMutationsDefRecord]
88
106
  >
@@ -112,6 +130,8 @@ export const makeMutationEventSchema = <TSchema extends LiveStoreSchema>(
112
130
  args: def.schema,
113
131
  id: EventId.EventId,
114
132
  parentId: EventId.EventId,
133
+ clientId: Schema.String,
134
+ sessionId: Schema.UndefinedOr(Schema.String),
115
135
  }),
116
136
  ),
117
137
  ).annotations({ title: 'MutationEvent' }) as any
@@ -136,6 +156,8 @@ export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('MutationEven
136
156
  args: Schema.Any,
137
157
  id: EventId.EventId,
138
158
  parentId: EventId.EventId,
159
+ clientId: Schema.String,
160
+ sessionId: Schema.UndefinedOr(Schema.String),
139
161
  // TODO get rid of `meta` again by cleaning up the usage implementations
140
162
  meta: Schema.optionalWith(
141
163
  Schema.Any as Schema.Schema<{
@@ -149,7 +171,7 @@ export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('MutationEven
149
171
  // - More readable way to print the id + parentId
150
172
  // - not including `meta`
151
173
  return {
152
- id: `(${this.id.global},${this.id.local}) → (${this.parentId.global},${this.parentId.local})`,
174
+ id: `(${this.id.global},${this.id.client}) → (${this.parentId.global},${this.parentId.client})`,
153
175
  mutation: this.mutation,
154
176
  args: this.args,
155
177
  }
@@ -164,8 +186,9 @@ export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('MutationEven
164
186
  static fromGlobal = (mutationEvent: AnyEncodedGlobal) =>
165
187
  new EncodedWithMeta({
166
188
  ...mutationEvent,
167
- id: { global: mutationEvent.id, local: EventId.localDefault },
168
- parentId: { global: mutationEvent.parentId, local: EventId.localDefault },
189
+ id: { global: mutationEvent.id, client: EventId.clientDefault },
190
+ parentId: { global: mutationEvent.parentId, client: EventId.clientDefault },
191
+ sessionId: undefined,
169
192
  })
170
193
 
171
194
  toGlobal = (): AnyEncodedGlobal => ({
@@ -177,7 +200,9 @@ export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('MutationEven
177
200
 
178
201
  export const isEqualEncoded = (a: AnyEncoded, b: AnyEncoded) =>
179
202
  a.id.global === b.id.global &&
180
- a.id.local === b.id.local &&
203
+ a.id.client === b.id.client &&
181
204
  a.mutation === b.mutation &&
205
+ a.clientId === b.clientId &&
206
+ // a.sessionId === b.sessionId &&
182
207
  // TODO use schema equality here
183
208
  JSON.stringify(a.args) === JSON.stringify(b.args)
@@ -0,0 +1,142 @@
1
+ import { type Option, Schema } from '@livestore/utils/effect'
2
+
3
+ import { hashCode } from '../hash.js'
4
+
5
+ export namespace ColumnType {
6
+ export type ColumnType = Text | Null | Real | Integer | Blob
7
+
8
+ export type Text = { _tag: 'text' }
9
+
10
+ export type Null = { _tag: 'null' }
11
+
12
+ export type Real = { _tag: 'real' }
13
+
14
+ export type Integer = { _tag: 'integer' }
15
+
16
+ export type Blob = { _tag: 'blob' }
17
+ }
18
+
19
+ export type Column = {
20
+ _tag: 'column'
21
+ name: string
22
+ type: ColumnType.ColumnType
23
+ primaryKey: boolean
24
+ nullable: boolean
25
+ default: Option.Option<any>
26
+ schema: Schema.Schema<any>
27
+ }
28
+
29
+ export const column = (props: Omit<Column, '_tag'>): Column => ({ _tag: 'column', ...props })
30
+
31
+ export type Index = {
32
+ _tag: 'index'
33
+ columns: ReadonlyArray<string>
34
+ name?: string
35
+ unique?: boolean
36
+ primaryKey?: boolean
37
+ }
38
+
39
+ export const index = (
40
+ columns: ReadonlyArray<string>,
41
+ name?: string,
42
+ unique?: boolean,
43
+ primaryKey?: boolean,
44
+ ): Index => ({
45
+ _tag: 'index',
46
+ columns,
47
+ name,
48
+ unique,
49
+ primaryKey,
50
+ })
51
+
52
+ export type ForeignKey = {
53
+ _tag: 'foreignKey'
54
+ references: {
55
+ table: string
56
+ columns: ReadonlyArray<string>
57
+ }
58
+ key: {
59
+ table: string
60
+ columns: ReadonlyArray<string>
61
+ }
62
+ columns: ReadonlyArray<string>
63
+ }
64
+
65
+ export type Table = {
66
+ _tag: 'table'
67
+ name: string
68
+ columns: ReadonlyArray<Column>
69
+ indexes: ReadonlyArray<Index>
70
+ }
71
+
72
+ export const table = (name: string, columns: ReadonlyArray<Column>, indexes: ReadonlyArray<Index>): Table => ({
73
+ _tag: 'table',
74
+ name,
75
+ columns,
76
+ indexes,
77
+ })
78
+
79
+ export type DbSchema = {
80
+ _tag: 'dbSchema'
81
+ tables: Table[]
82
+ }
83
+
84
+ export const dbSchema = (tables: Table[]): DbSchema => ({ _tag: 'dbSchema', tables })
85
+
86
+ /**
87
+ * NOTE we're only including SQLite-relevant information in the hash (which excludes the schema mapping)
88
+ */
89
+ export const hash = (obj: Table | Column | Index | ForeignKey | DbSchema): number =>
90
+ hashCode(JSON.stringify(trimInfoForHasing(obj)))
91
+
92
+ const trimInfoForHasing = (obj: Table | Column | Index | ForeignKey | DbSchema): Record<string, any> => {
93
+ switch (obj._tag) {
94
+ case 'table': {
95
+ return {
96
+ _tag: 'table',
97
+ name: obj.name,
98
+ columns: obj.columns.map((column) => trimInfoForHasing(column)),
99
+ indexes: obj.indexes.map((index) => trimInfoForHasing(index)),
100
+ }
101
+ }
102
+ case 'column': {
103
+ return {
104
+ _tag: 'column',
105
+ name: obj.name,
106
+ type: obj.type._tag,
107
+ primaryKey: obj.primaryKey,
108
+ nullable: obj.nullable,
109
+ default: obj.default,
110
+ }
111
+ }
112
+ case 'index': {
113
+ return {
114
+ _tag: 'index',
115
+ columns: obj.columns,
116
+ name: obj.name,
117
+ unique: obj.unique,
118
+ primaryKey: obj.primaryKey,
119
+ }
120
+ }
121
+ case 'foreignKey': {
122
+ return {
123
+ _tag: 'foreignKey',
124
+ references: obj.references,
125
+ key: obj.key,
126
+ columns: obj.columns,
127
+ }
128
+ }
129
+ case 'dbSchema': {
130
+ return {
131
+ _tag: 'dbSchema',
132
+ tables: obj.tables.map(trimInfoForHasing),
133
+ }
134
+ }
135
+ default: {
136
+ throw new Error(`Unreachable: ${obj}`)
137
+ }
138
+ }
139
+ }
140
+
141
+ export const structSchemaForTable = (tableDef: Table) =>
142
+ Schema.Struct(Object.fromEntries(tableDef.columns.map((column) => [column.name, column.schema])))
@@ -0,0 +1,13 @@
1
+ import type { DbSchema } from './sqlite.js'
2
+
3
+ // TODO
4
+ export const validate = (_dbSchema: DbSchema) => {
5
+ /*
6
+ TODO:
7
+
8
+ - ensure no duplicate table names
9
+ - ensure no duplicate column names within a table
10
+ - ensure no duplicate index names globally
11
+ - ...
12
+ */
13
+ }
@@ -0,0 +1,206 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`FieldDefs > boolean 1`] = `
4
+ {
5
+ "columnType": "text",
6
+ "default": {
7
+ "_id": "Option",
8
+ "_tag": "None",
9
+ },
10
+ "nullable": false,
11
+ "primaryKey": false,
12
+ "schema": [Function],
13
+ }
14
+ `;
15
+
16
+ exports[`FieldDefs > boolean 2`] = `
17
+ {
18
+ "columnType": "text",
19
+ "default": {
20
+ "_id": "Option",
21
+ "_tag": "None",
22
+ },
23
+ "nullable": false,
24
+ "primaryKey": false,
25
+ "schema": [Function],
26
+ }
27
+ `;
28
+
29
+ exports[`FieldDefs > boolean 3`] = `
30
+ {
31
+ "columnType": "text",
32
+ "default": {
33
+ "_id": "Option",
34
+ "_tag": "Some",
35
+ "value": null,
36
+ },
37
+ "nullable": true,
38
+ "primaryKey": false,
39
+ "schema": [Function],
40
+ }
41
+ `;
42
+
43
+ exports[`FieldDefs > boolean 4`] = `
44
+ {
45
+ "columnType": "text",
46
+ "default": {
47
+ "_id": "Option",
48
+ "_tag": "Some",
49
+ "value": "foo",
50
+ },
51
+ "nullable": true,
52
+ "primaryKey": false,
53
+ "schema": [Function],
54
+ }
55
+ `;
56
+
57
+ exports[`FieldDefs > boolean 5`] = `
58
+ {
59
+ "columnType": "text",
60
+ "default": {
61
+ "_id": "Option",
62
+ "_tag": "Some",
63
+ "value": "foo",
64
+ },
65
+ "nullable": true,
66
+ "primaryKey": false,
67
+ "schema": [Function],
68
+ }
69
+ `;
70
+
71
+ exports[`FieldDefs > boolean 6`] = `
72
+ {
73
+ "columnType": "text",
74
+ "default": {
75
+ "_id": "Option",
76
+ "_tag": "None",
77
+ },
78
+ "nullable": false,
79
+ "primaryKey": false,
80
+ "schema": [Function],
81
+ }
82
+ `;
83
+
84
+ exports[`FieldDefs > boolean 7`] = `
85
+ {
86
+ "columnType": "text",
87
+ "default": {
88
+ "_id": "Option",
89
+ "_tag": "Some",
90
+ "value": null,
91
+ },
92
+ "nullable": true,
93
+ "primaryKey": false,
94
+ "schema": [Function],
95
+ }
96
+ `;
97
+
98
+ exports[`FieldDefs > boolean 8`] = `
99
+ {
100
+ "columnType": "text",
101
+ "default": {
102
+ "_id": "Option",
103
+ "_tag": "Some",
104
+ "value": {
105
+ "name": "Bob",
106
+ },
107
+ },
108
+ "nullable": true,
109
+ "primaryKey": false,
110
+ "schema": [Function],
111
+ }
112
+ `;
113
+
114
+ exports[`FieldDefs > boolean 9`] = `
115
+ {
116
+ "columnType": "text",
117
+ "default": {
118
+ "_id": "Option",
119
+ "_tag": "None",
120
+ },
121
+ "nullable": false,
122
+ "primaryKey": false,
123
+ "schema": [Function],
124
+ }
125
+ `;
126
+
127
+ exports[`FieldDefs > boolean 10`] = `
128
+ {
129
+ "columnType": "text",
130
+ "default": {
131
+ "_id": "Option",
132
+ "_tag": "None",
133
+ },
134
+ "nullable": false,
135
+ "primaryKey": false,
136
+ "schema": [Function],
137
+ }
138
+ `;
139
+
140
+ exports[`FieldDefs > boolean 11`] = `
141
+ {
142
+ "columnType": "text",
143
+ "default": {
144
+ "_id": "Option",
145
+ "_tag": "Some",
146
+ "value": null,
147
+ },
148
+ "nullable": true,
149
+ "primaryKey": false,
150
+ "schema": [Function],
151
+ }
152
+ `;
153
+
154
+ exports[`FieldDefs > boolean 12`] = `
155
+ {
156
+ "columnType": "text",
157
+ "default": {
158
+ "_id": "Option",
159
+ "_tag": "Some",
160
+ "value": 2022-02-02T00:00:00.000Z,
161
+ },
162
+ "nullable": false,
163
+ "primaryKey": false,
164
+ "schema": [Function],
165
+ }
166
+ `;
167
+
168
+ exports[`FieldDefs > boolean 13`] = `
169
+ {
170
+ "columnType": "integer",
171
+ "default": {
172
+ "_id": "Option",
173
+ "_tag": "None",
174
+ },
175
+ "nullable": false,
176
+ "primaryKey": false,
177
+ "schema": [Function],
178
+ }
179
+ `;
180
+
181
+ exports[`FieldDefs > boolean 14`] = `
182
+ {
183
+ "columnType": "integer",
184
+ "default": {
185
+ "_id": "Option",
186
+ "_tag": "None",
187
+ },
188
+ "nullable": false,
189
+ "primaryKey": false,
190
+ "schema": [Function],
191
+ }
192
+ `;
193
+
194
+ exports[`FieldDefs > boolean 15`] = `
195
+ {
196
+ "columnType": "integer",
197
+ "default": {
198
+ "_id": "Option",
199
+ "_tag": "Some",
200
+ "value": false,
201
+ },
202
+ "nullable": false,
203
+ "primaryKey": false,
204
+ "schema": [Function],
205
+ }
206
+ `;
@@ -0,0 +1,35 @@
1
+ import { Schema } from '@livestore/utils/effect'
2
+ import { describe, expect, test } from 'vitest'
3
+
4
+ import * as F from './field-defs.js'
5
+
6
+ describe.concurrent('FieldDefs', () => {
7
+ test('text', () => {
8
+ expect(F.text()).toMatchSnapshot()
9
+ expect(F.text({})).toMatchSnapshot()
10
+ expect(F.text({ default: null, nullable: true })).toMatchSnapshot()
11
+ expect(F.text({ schema: Schema.Literal('foo'), nullable: true, default: 'foo' })).toMatchSnapshot()
12
+ expect(F.text({ schema: Schema.Union(Schema.Literal('foo')), nullable: true, default: 'foo' })).toMatchSnapshot()
13
+ })
14
+
15
+ test('json', () => {
16
+ expect(F.json()).toMatchSnapshot()
17
+ expect(F.json({ default: null, nullable: true })).toMatchSnapshot()
18
+ expect(
19
+ F.json({ schema: Schema.Struct({ name: Schema.String }), default: { name: 'Bob' }, nullable: true }),
20
+ ).toMatchSnapshot()
21
+ })
22
+
23
+ test('datetime', () => {
24
+ expect(F.datetime()).toMatchSnapshot()
25
+ expect(F.datetime({})).toMatchSnapshot()
26
+ expect(F.datetime({ default: null, nullable: true })).toMatchSnapshot()
27
+ expect(F.datetime({ default: new Date('2022-02-02') })).toMatchSnapshot()
28
+ })
29
+
30
+ test('boolean', () => {
31
+ expect(F.boolean()).toMatchSnapshot()
32
+ expect(F.boolean({})).toMatchSnapshot()
33
+ expect(F.boolean({ default: false })).toMatchSnapshot()
34
+ })
35
+ })