@livestore/common 0.3.0-dev.28 → 0.3.0-dev.29

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 (277) 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 +22 -15
  7. package/dist/adapter-types.d.ts.map +1 -1
  8. package/dist/adapter-types.js +15 -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 +10 -10
  26. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  27. package/dist/leader-thread/LeaderSyncProcessor.js +63 -65
  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-event.js +103 -0
  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.js +18 -18
  38. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  39. package/dist/leader-thread/make-leader-thread-layer.d.ts +2 -2
  40. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  41. package/dist/leader-thread/make-leader-thread-layer.js +16 -16
  42. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  43. package/dist/leader-thread/mod.d.ts +1 -1
  44. package/dist/leader-thread/mod.d.ts.map +1 -1
  45. package/dist/leader-thread/mod.js +1 -1
  46. package/dist/leader-thread/mod.js.map +1 -1
  47. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  48. package/dist/leader-thread/recreate-db.js +6 -8
  49. package/dist/leader-thread/recreate-db.js.map +1 -1
  50. package/dist/leader-thread/types.d.ts +11 -11
  51. package/dist/leader-thread/types.d.ts.map +1 -1
  52. package/dist/materializer-helper.d.ts +23 -0
  53. package/dist/materializer-helper.d.ts.map +1 -0
  54. package/dist/materializer-helper.js +70 -0
  55. package/dist/materializer-helper.js.map +1 -0
  56. package/dist/query-builder/api.d.ts +58 -53
  57. package/dist/query-builder/api.d.ts.map +1 -1
  58. package/dist/query-builder/api.js +3 -5
  59. package/dist/query-builder/api.js.map +1 -1
  60. package/dist/query-builder/astToSql.d.ts.map +1 -1
  61. package/dist/query-builder/astToSql.js +59 -37
  62. package/dist/query-builder/astToSql.js.map +1 -1
  63. package/dist/query-builder/impl.d.ts +2 -3
  64. package/dist/query-builder/impl.d.ts.map +1 -1
  65. package/dist/query-builder/impl.js +48 -46
  66. package/dist/query-builder/impl.js.map +1 -1
  67. package/dist/query-builder/impl.test.d.ts +86 -1
  68. package/dist/query-builder/impl.test.d.ts.map +1 -1
  69. package/dist/query-builder/impl.test.js +244 -36
  70. package/dist/query-builder/impl.test.js.map +1 -1
  71. package/dist/rehydrate-from-eventlog.d.ts +14 -0
  72. package/dist/rehydrate-from-eventlog.d.ts.map +1 -0
  73. package/dist/{rehydrate-from-mutationlog.js → rehydrate-from-eventlog.js} +25 -26
  74. package/dist/rehydrate-from-eventlog.js.map +1 -0
  75. package/dist/schema/EventDef.d.ts +136 -0
  76. package/dist/schema/EventDef.d.ts.map +1 -0
  77. package/dist/schema/EventDef.js +58 -0
  78. package/dist/schema/EventDef.js.map +1 -0
  79. package/dist/schema/EventId.d.ts +2 -2
  80. package/dist/schema/EventId.d.ts.map +1 -1
  81. package/dist/schema/EventId.js +3 -2
  82. package/dist/schema/EventId.js.map +1 -1
  83. package/dist/schema/{MutationEvent.d.ts → LiveStoreEvent.d.ts} +56 -56
  84. package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
  85. package/dist/schema/{MutationEvent.js → LiveStoreEvent.js} +24 -24
  86. package/dist/schema/LiveStoreEvent.js.map +1 -0
  87. package/dist/schema/client-document-def.d.ts +223 -0
  88. package/dist/schema/client-document-def.d.ts.map +1 -0
  89. package/dist/schema/client-document-def.js +170 -0
  90. package/dist/schema/client-document-def.js.map +1 -0
  91. package/dist/schema/client-document-def.test.d.ts +2 -0
  92. package/dist/schema/client-document-def.test.d.ts.map +1 -0
  93. package/dist/schema/client-document-def.test.js +201 -0
  94. package/dist/schema/client-document-def.test.js.map +1 -0
  95. package/dist/schema/db-schema/dsl/mod.d.ts.map +1 -1
  96. package/dist/schema/events.d.ts +2 -0
  97. package/dist/schema/events.d.ts.map +1 -0
  98. package/dist/schema/events.js +2 -0
  99. package/dist/schema/events.js.map +1 -0
  100. package/dist/schema/mod.d.ts +4 -3
  101. package/dist/schema/mod.d.ts.map +1 -1
  102. package/dist/schema/mod.js +4 -3
  103. package/dist/schema/mod.js.map +1 -1
  104. package/dist/schema/schema.d.ts +27 -23
  105. package/dist/schema/schema.d.ts.map +1 -1
  106. package/dist/schema/schema.js +45 -43
  107. package/dist/schema/schema.js.map +1 -1
  108. package/dist/schema/sqlite-state.d.ts +12 -0
  109. package/dist/schema/sqlite-state.d.ts.map +1 -0
  110. package/dist/schema/sqlite-state.js +36 -0
  111. package/dist/schema/sqlite-state.js.map +1 -0
  112. package/dist/schema/system-tables.d.ts +67 -98
  113. package/dist/schema/system-tables.d.ts.map +1 -1
  114. package/dist/schema/system-tables.js +62 -48
  115. package/dist/schema/system-tables.js.map +1 -1
  116. package/dist/schema/table-def.d.ts +26 -96
  117. package/dist/schema/table-def.d.ts.map +1 -1
  118. package/dist/schema/table-def.js +16 -64
  119. package/dist/schema/table-def.js.map +1 -1
  120. package/dist/schema/view.d.ts +3 -0
  121. package/dist/schema/view.d.ts.map +1 -0
  122. package/dist/schema/view.js +3 -0
  123. package/dist/schema/view.js.map +1 -0
  124. package/dist/schema-management/common.d.ts +4 -4
  125. package/dist/schema-management/common.d.ts.map +1 -1
  126. package/dist/schema-management/migrations.d.ts.map +1 -1
  127. package/dist/schema-management/migrations.js +6 -6
  128. package/dist/schema-management/migrations.js.map +1 -1
  129. package/dist/schema-management/validate-mutation-defs.d.ts +3 -3
  130. package/dist/schema-management/validate-mutation-defs.d.ts.map +1 -1
  131. package/dist/schema-management/validate-mutation-defs.js +17 -17
  132. package/dist/schema-management/validate-mutation-defs.js.map +1 -1
  133. package/dist/sync/ClientSessionSyncProcessor.d.ts +7 -7
  134. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  135. package/dist/sync/ClientSessionSyncProcessor.js +31 -30
  136. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  137. package/dist/sync/next/facts.d.ts +19 -19
  138. package/dist/sync/next/facts.d.ts.map +1 -1
  139. package/dist/sync/next/facts.js +2 -2
  140. package/dist/sync/next/facts.js.map +1 -1
  141. package/dist/sync/next/history-dag-common.d.ts +3 -3
  142. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  143. package/dist/sync/next/history-dag-common.js +1 -1
  144. package/dist/sync/next/history-dag-common.js.map +1 -1
  145. package/dist/sync/next/history-dag.js +1 -1
  146. package/dist/sync/next/history-dag.js.map +1 -1
  147. package/dist/sync/next/rebase-events.d.ts +7 -7
  148. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  149. package/dist/sync/next/rebase-events.js +5 -5
  150. package/dist/sync/next/rebase-events.js.map +1 -1
  151. package/dist/sync/next/test/compact-events.calculator.test.js +38 -33
  152. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  153. package/dist/sync/next/test/compact-events.test.js +71 -71
  154. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  155. package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +29 -29
  156. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
  157. package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +60 -25
  158. package/dist/sync/next/test/event-fixtures.js.map +1 -0
  159. package/dist/sync/next/test/mod.d.ts +1 -1
  160. package/dist/sync/next/test/mod.d.ts.map +1 -1
  161. package/dist/sync/next/test/mod.js +1 -1
  162. package/dist/sync/next/test/mod.js.map +1 -1
  163. package/dist/sync/sync.d.ts +3 -3
  164. package/dist/sync/sync.d.ts.map +1 -1
  165. package/dist/sync/syncstate.d.ts +32 -32
  166. package/dist/sync/syncstate.d.ts.map +1 -1
  167. package/dist/sync/syncstate.js +10 -10
  168. package/dist/sync/syncstate.js.map +1 -1
  169. package/dist/sync/syncstate.test.js +5 -5
  170. package/dist/sync/syncstate.test.js.map +1 -1
  171. package/dist/sync/validate-push-payload.d.ts +2 -2
  172. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  173. package/dist/sync/validate-push-payload.js.map +1 -1
  174. package/dist/version.d.ts +1 -1
  175. package/dist/version.js +1 -1
  176. package/package.json +3 -3
  177. package/src/__tests__/fixture.ts +36 -15
  178. package/src/adapter-types.ts +23 -16
  179. package/src/debug-info.ts +1 -0
  180. package/src/devtools/devtools-messages-leader.ts +13 -13
  181. package/src/index.ts +2 -5
  182. package/src/leader-thread/LeaderSyncProcessor.ts +81 -91
  183. package/src/leader-thread/{apply-mutation.ts → apply-event.ts} +50 -74
  184. package/src/leader-thread/eventlog.ts +199 -0
  185. package/src/leader-thread/leader-worker-devtools.ts +18 -18
  186. package/src/leader-thread/make-leader-thread-layer.ts +18 -18
  187. package/src/leader-thread/mod.ts +1 -1
  188. package/src/leader-thread/recreate-db.ts +6 -9
  189. package/src/leader-thread/types.ts +12 -12
  190. package/src/materializer-helper.ts +110 -0
  191. package/src/query-builder/api.ts +79 -105
  192. package/src/query-builder/astToSql.ts +68 -39
  193. package/src/query-builder/impl.test.ts +264 -42
  194. package/src/query-builder/impl.ts +72 -56
  195. package/src/{rehydrate-from-mutationlog.ts → rehydrate-from-eventlog.ts} +33 -40
  196. package/src/schema/EventDef.ts +216 -0
  197. package/src/schema/EventId.ts +5 -3
  198. package/src/schema/{MutationEvent.ts → LiveStoreEvent.ts} +67 -68
  199. package/src/schema/client-document-def.test.ts +239 -0
  200. package/src/schema/client-document-def.ts +444 -0
  201. package/src/schema/db-schema/dsl/mod.ts +0 -1
  202. package/src/schema/events.ts +1 -0
  203. package/src/schema/mod.ts +4 -3
  204. package/src/schema/schema.ts +79 -69
  205. package/src/schema/sqlite-state.ts +62 -0
  206. package/src/schema/system-tables.ts +42 -53
  207. package/src/schema/table-def.ts +53 -209
  208. package/src/schema/view.ts +2 -0
  209. package/src/schema-management/common.ts +4 -4
  210. package/src/schema-management/migrations.ts +8 -9
  211. package/src/schema-management/validate-mutation-defs.ts +22 -24
  212. package/src/sync/ClientSessionSyncProcessor.ts +37 -36
  213. package/src/sync/next/facts.ts +31 -32
  214. package/src/sync/next/history-dag-common.ts +4 -4
  215. package/src/sync/next/history-dag.ts +1 -1
  216. package/src/sync/next/rebase-events.ts +13 -13
  217. package/src/sync/next/test/compact-events.calculator.test.ts +45 -45
  218. package/src/sync/next/test/compact-events.test.ts +73 -73
  219. package/src/sync/next/test/event-fixtures.ts +219 -0
  220. package/src/sync/next/test/mod.ts +1 -1
  221. package/src/sync/sync.ts +3 -3
  222. package/src/sync/syncstate.test.ts +8 -8
  223. package/src/sync/syncstate.ts +19 -19
  224. package/src/sync/validate-push-payload.ts +2 -2
  225. package/src/version.ts +1 -1
  226. package/tmp/pack.tgz +0 -0
  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 +0 -122
  242. package/dist/leader-thread/apply-mutation.js.map +0 -1
  243. package/dist/leader-thread/mutationlog.d.ts +0 -27
  244. package/dist/leader-thread/mutationlog.d.ts.map +0 -1
  245. package/dist/leader-thread/mutationlog.js +0 -124
  246. package/dist/leader-thread/mutationlog.js.map +0 -1
  247. package/dist/leader-thread/pull-queue-set.d.ts +0 -7
  248. package/dist/leader-thread/pull-queue-set.d.ts.map +0 -1
  249. package/dist/leader-thread/pull-queue-set.js +0 -38
  250. package/dist/leader-thread/pull-queue-set.js.map +0 -1
  251. package/dist/mutation.d.ts +0 -20
  252. package/dist/mutation.d.ts.map +0 -1
  253. package/dist/mutation.js +0 -68
  254. package/dist/mutation.js.map +0 -1
  255. package/dist/query-info.d.ts +0 -41
  256. package/dist/query-info.d.ts.map +0 -1
  257. package/dist/query-info.js +0 -7
  258. package/dist/query-info.js.map +0 -1
  259. package/dist/rehydrate-from-mutationlog.d.ts +0 -15
  260. package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
  261. package/dist/rehydrate-from-mutationlog.js.map +0 -1
  262. package/dist/schema/MutationEvent.d.ts.map +0 -1
  263. package/dist/schema/MutationEvent.js.map +0 -1
  264. package/dist/schema/mutations.d.ts +0 -115
  265. package/dist/schema/mutations.d.ts.map +0 -1
  266. package/dist/schema/mutations.js +0 -42
  267. package/dist/schema/mutations.js.map +0 -1
  268. package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
  269. package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
  270. package/src/derived-mutations.test.ts +0 -101
  271. package/src/derived-mutations.ts +0 -170
  272. package/src/init-singleton-tables.ts +0 -24
  273. package/src/leader-thread/mutationlog.ts +0 -202
  274. package/src/mutation.ts +0 -108
  275. package/src/query-info.ts +0 -83
  276. package/src/schema/mutations.ts +0 -193
  277. package/src/sync/next/test/mutation-fixtures.ts +0 -228
@@ -1,103 +1,101 @@
1
1
  import { isReadonlyArray, shouldNeverHappen } from '@livestore/utils'
2
2
 
3
3
  import type { MigrationOptions } from '../adapter-types.js'
4
- import { makeDerivedMutationDefsForTable } from '../derived-mutations.js'
4
+ import { tableIsClientDocumentTable } from './client-document-def.js'
5
5
  import type { SqliteDsl } from './db-schema/mod.js'
6
6
  import { SqliteAst } from './db-schema/mod.js'
7
- import {
8
- type MutationDef,
9
- type MutationDefMap,
10
- type MutationDefRecord,
11
- type RawSqlMutation,
12
- rawSqlMutation,
13
- } from './mutations.js'
7
+ import type { EventDef, EventDefRecord, Materializer, RawSqlEvent } from './EventDef.js'
8
+ import { rawSqlEvent } from './EventDef.js'
14
9
  import { systemTables } from './system-tables.js'
15
- import type { TableDef, TableDefBase } from './table-def.js'
16
- import { tableHasDerivedMutations } from './table-def.js'
10
+ import type { TableDef } from './table-def.js'
17
11
 
18
12
  export const LiveStoreSchemaSymbol = Symbol.for('livestore.LiveStoreSchema')
19
13
  export type LiveStoreSchemaSymbol = typeof LiveStoreSchemaSymbol
20
14
 
21
15
  export type LiveStoreSchema<
22
16
  TDbSchema extends SqliteDsl.DbSchema = SqliteDsl.DbSchema,
23
- TMutationsDefRecord extends MutationDefRecord = MutationDefRecord,
17
+ TEventsDefRecord extends EventDefRecord = EventDefRecord,
24
18
  > = {
25
19
  readonly _Type: LiveStoreSchemaSymbol
26
20
  /** Only used on type-level */
27
21
  readonly _DbSchemaType: TDbSchema
28
22
  /** Only used on type-level */
29
- readonly _MutationDefMapType: TMutationsDefRecord
23
+ readonly _EventDefMapType: TEventsDefRecord
30
24
 
25
+ // TODO remove in favour of `state`
31
26
  readonly tables: Map<string, TableDef>
32
- readonly mutations: MutationDefMap
33
27
  /** Compound hash of all table defs etc */
34
28
  readonly hash: number
29
+ readonly state: State
30
+
31
+ readonly eventsDefsMap: Map<string, EventDef.AnyWithoutFn>
32
+
33
+ // readonly materializers: Map<string, Materializer>
35
34
 
36
35
  migrationOptions: MigrationOptions
37
36
  }
38
37
 
38
+ export type State = {
39
+ readonly tables: Map<string, TableDef.Any>
40
+ readonly materializers: Map<string, Materializer>
41
+ }
42
+
39
43
  export type InputSchema = {
40
- readonly tables: Record<string, TableDefBase> | ReadonlyArray<TableDefBase>
41
- readonly mutations?: ReadonlyArray<MutationDef.Any> | Record<string, MutationDef.Any>
42
- /**
43
- * Can be used to isolate multiple LiveStore apps running in the same origin
44
- */
45
- // TODO remove this in favour of storeId
46
- readonly key?: string
44
+ readonly events: ReadonlyArray<EventDef.AnyWithoutFn> | Record<string, EventDef.AnyWithoutFn>
45
+ readonly state: State
47
46
  }
48
47
 
49
48
  export const makeSchema = <TInputSchema extends InputSchema>(
50
- /** Note when using the object-notation for tables/mutations, the object keys are ignored and not used as table/mutation names */
49
+ /** Note when using the object-notation for tables/events, the object keys are ignored and not used as table/mutation names */
51
50
  inputSchema: TInputSchema & {
52
51
  /** "hard-reset" is currently the default strategy */
53
- migrations?: MigrationOptions<FromInputSchema.DeriveSchema<TInputSchema>>
52
+ migrations?: MigrationOptions
54
53
  },
55
54
  ): FromInputSchema.DeriveSchema<TInputSchema> => {
56
- const inputTables: ReadonlyArray<TableDef> = Array.isArray(inputSchema.tables)
57
- ? inputSchema.tables
58
- : Object.values(inputSchema.tables)
55
+ // const inputTables: ReadonlyArray<TableDef> = Array.isArray(inputSchema.tables)
56
+ // ? inputSchema.tables
57
+ // : Object.values(inputSchema.tables)
59
58
 
60
- const tables = new Map<string, TableDef>()
59
+ // const inputTables = []
61
60
 
62
- for (const tableDef of inputTables) {
63
- // TODO validate tables (e.g. index names are unique)
64
- if (tables.has(tableDef.sqliteDef.ast.name)) {
65
- shouldNeverHappen(`Duplicate table name: ${tableDef.sqliteDef.ast.name}. Please use unique names for tables.`)
66
- }
67
- tables.set(tableDef.sqliteDef.ast.name, tableDef)
68
- }
61
+ // const tables = new Map<string, TableDef>()
62
+
63
+ // for (const tableDef of inputTables) {
64
+ // // TODO validate tables (e.g. index names are unique)
65
+ // if (tables.has(tableDef.sqliteDef.ast.name)) {
66
+ // shouldNeverHappen(`Duplicate table name: ${tableDef.sqliteDef.ast.name}. Please use unique names for tables.`)
67
+ // }
68
+ // tables.set(tableDef.sqliteDef.ast.name, tableDef)
69
+ // }
70
+
71
+ const state = inputSchema.state
72
+ const tables = inputSchema.state.tables
69
73
 
70
74
  for (const tableDef of systemTables) {
71
- // @ts-expect-error TODO fix type level issue
75
+ // // @ts-expect-error TODO fix type level issue
72
76
  tables.set(tableDef.sqliteDef.name, tableDef)
73
77
  }
74
78
 
75
- const mutations: MutationDefMap = {
76
- map: new Map(),
77
- wasProvided: inputSchema.mutations !== undefined,
78
- }
79
+ const eventsDefsMap = new Map<string, EventDef.AnyWithoutFn>()
79
80
 
80
- if (isReadonlyArray(inputSchema.mutations)) {
81
- for (const mutation of inputSchema.mutations) {
82
- mutations.map.set(mutation.name, mutation)
81
+ if (isReadonlyArray(inputSchema.events)) {
82
+ for (const eventDef of inputSchema.events) {
83
+ eventsDefsMap.set(eventDef.name, eventDef)
83
84
  }
84
85
  } else {
85
- for (const mutation of Object.values(inputSchema.mutations ?? {})) {
86
- if (mutations.map.has(mutation.name)) {
87
- shouldNeverHappen(`Duplicate mutation name: ${mutation.name}. Please use unique names for mutations.`)
86
+ for (const eventDef of Object.values(inputSchema.events ?? {})) {
87
+ if (eventsDefsMap.has(eventDef.name)) {
88
+ shouldNeverHappen(`Duplicate event name: ${eventDef.name}. Please use unique names for events.`)
88
89
  }
89
- mutations.map.set(mutation.name, mutation)
90
+ eventsDefsMap.set(eventDef.name, eventDef)
90
91
  }
91
92
  }
92
93
 
93
- mutations.map.set(rawSqlMutation.name, rawSqlMutation)
94
+ eventsDefsMap.set(rawSqlEvent.name, rawSqlEvent)
94
95
 
95
96
  for (const tableDef of tables.values()) {
96
- if (tableHasDerivedMutations(tableDef)) {
97
- const derivedMutationDefs = makeDerivedMutationDefsForTable(tableDef)
98
- mutations.map.set(derivedMutationDefs.insert.name, derivedMutationDefs.insert)
99
- mutations.map.set(derivedMutationDefs.update.name, derivedMutationDefs.update)
100
- mutations.map.set(derivedMutationDefs.delete.name, derivedMutationDefs.delete)
97
+ if (tableIsClientDocumentTable(tableDef) && eventsDefsMap.has(tableDef.set.name) === false) {
98
+ eventsDefsMap.set(tableDef.set.name, tableDef.set)
101
99
  }
102
100
  }
103
101
 
@@ -109,27 +107,39 @@ export const makeSchema = <TInputSchema extends InputSchema>(
109
107
  return {
110
108
  _Type: LiveStoreSchemaSymbol,
111
109
  _DbSchemaType: Symbol.for('livestore.DbSchemaType') as any,
112
- _MutationDefMapType: Symbol.for('livestore.MutationDefMapType') as any,
113
- tables,
114
- mutations,
115
- migrationOptions: inputSchema.migrations ?? { strategy: 'from-mutation-log' },
110
+ _EventDefMapType: Symbol.for('livestore.EventDefMapType') as any,
111
+ // tables,
112
+ // events,
113
+ state,
114
+ tables: state.tables,
115
+ eventsDefsMap,
116
+ migrationOptions: inputSchema.migrations ?? { strategy: 'from-eventlog' },
116
117
  hash,
117
118
  } satisfies LiveStoreSchema
118
119
  }
119
120
 
120
- export const getMutationDef = <TSchema extends LiveStoreSchema>(schema: TSchema, mutationName: string) => {
121
- const mutationDef = schema.mutations.map.get(mutationName)
122
- if (mutationDef === undefined) {
123
- const extraInfo = schema.mutations.wasProvided ? '' : ' Please provide \`mutations\` in the schema options.'
124
- return shouldNeverHappen(`No mutation definition found for \`${mutationName}\`.${extraInfo}`)
121
+ export const getEventDef = <TSchema extends LiveStoreSchema>(
122
+ schema: TSchema,
123
+ eventName: string,
124
+ ): {
125
+ eventDef: EventDef.AnyWithoutFn
126
+ materializer: Materializer
127
+ } => {
128
+ const eventDef = schema.eventsDefsMap.get(eventName)
129
+ if (eventDef === undefined) {
130
+ return shouldNeverHappen(`No mutation definition found for \`${eventName}\`.`)
131
+ }
132
+ const materializer = schema.state.materializers.get(eventName)
133
+ if (materializer === undefined) {
134
+ return shouldNeverHappen(`No materializer found for \`${eventName}\`.`)
125
135
  }
126
- return mutationDef
136
+ return { eventDef, materializer }
127
137
  }
128
138
 
129
139
  export namespace FromInputSchema {
130
140
  export type DeriveSchema<TInputSchema extends InputSchema> = LiveStoreSchema<
131
- DbSchemaFromInputSchemaTables<TInputSchema['tables']>,
132
- MutationDefRecordFromInputSchemaMutations<TInputSchema['mutations']>
141
+ DbSchemaFromInputSchemaTables<TInputSchema['state']['tables']>,
142
+ EventDefRecordFromInputSchemaEvents<TInputSchema['events']>
133
143
  >
134
144
 
135
145
  /**
@@ -137,17 +147,17 @@ export namespace FromInputSchema {
137
147
  * - array: we use the table name of each array item (= table definition) as the object key
138
148
  * - object: we discard the keys of the input object and use the table name of each object value (= table definition) as the new object key
139
149
  */
140
- type DbSchemaFromInputSchemaTables<TTables extends InputSchema['tables']> =
150
+ type DbSchemaFromInputSchemaTables<TTables extends InputSchema['state']['tables']> =
141
151
  TTables extends ReadonlyArray<TableDef>
142
152
  ? { [K in TTables[number] as K['sqliteDef']['name']]: K['sqliteDef'] }
143
153
  : TTables extends Record<string, TableDef>
144
154
  ? { [K in keyof TTables as TTables[K]['sqliteDef']['name']]: TTables[K]['sqliteDef'] }
145
155
  : never
146
156
 
147
- type MutationDefRecordFromInputSchemaMutations<TMutations extends InputSchema['mutations']> =
148
- TMutations extends ReadonlyArray<MutationDef.Any>
149
- ? { [K in TMutations[number] as K['name']]: K } & { 'livestore.RawSql': RawSqlMutation }
150
- : TMutations extends { [name: string]: MutationDef.Any }
151
- ? { [K in keyof TMutations as TMutations[K]['name']]: TMutations[K] } & { 'livestore.RawSql': RawSqlMutation }
157
+ type EventDefRecordFromInputSchemaEvents<TEvents extends InputSchema['events']> =
158
+ TEvents extends ReadonlyArray<EventDef.Any>
159
+ ? { [K in TEvents[number] as K['name']]: K } & { 'livestore.RawSql': RawSqlEvent }
160
+ : TEvents extends { [name: string]: EventDef.Any }
161
+ ? { [K in keyof TEvents as TEvents[K]['name']]: TEvents[K] } & { 'livestore.RawSql': RawSqlEvent }
152
162
  : never
153
163
  }
@@ -0,0 +1,62 @@
1
+ import { shouldNeverHappen } from '@livestore/utils'
2
+
3
+ import { ClientDocumentTableDefSymbol, tableIsClientDocumentTable } from './client-document-def.js'
4
+ import { type Materializer, rawSqlEvent, rawSqlMaterializer } from './EventDef.js'
5
+ import type { State } from './schema.js'
6
+ import { systemTables } from './system-tables.js'
7
+ import { type TableDef, type TableDefBase } from './table-def.js'
8
+
9
+ export * from './table-def.js'
10
+ export {
11
+ ClientDocumentTableDefSymbol,
12
+ tableIsClientDocumentTable,
13
+ clientDocument,
14
+ type ClientDocumentTableDef,
15
+ type ClientDocumentTableOptions,
16
+ } from './client-document-def.js'
17
+ export * from './EventDef.js'
18
+
19
+ export const makeState = <TStateInput extends InputState>(inputSchema: TStateInput): State => {
20
+ const inputTables: ReadonlyArray<TableDef> = Array.isArray(inputSchema.tables)
21
+ ? inputSchema.tables
22
+ : Object.values(inputSchema.tables)
23
+
24
+ const tables = new Map<string, TableDef.Any>()
25
+
26
+ for (const tableDef of inputTables) {
27
+ const sqliteDef = tableDef.sqliteDef
28
+ // TODO validate tables (e.g. index names are unique)
29
+ if (tables.has(sqliteDef.ast.name)) {
30
+ shouldNeverHappen(`Duplicate table name: ${sqliteDef.ast.name}. Please use unique names for tables.`)
31
+ }
32
+ tables.set(sqliteDef.ast.name, tableDef)
33
+ }
34
+
35
+ for (const tableDef of systemTables) {
36
+ tables.set(tableDef.sqliteDef.name, tableDef)
37
+ }
38
+
39
+ const materializers = new Map<string, Materializer<any>>()
40
+
41
+ for (const [name, materializer] of Object.entries(inputSchema.materializers)) {
42
+ materializers.set(name, materializer)
43
+ }
44
+
45
+ materializers.set(rawSqlEvent.name, rawSqlMaterializer)
46
+
47
+ for (const tableDef of inputTables) {
48
+ if (tableIsClientDocumentTable(tableDef)) {
49
+ materializers.set(
50
+ tableDef[ClientDocumentTableDefSymbol].derived.setEventDef.name,
51
+ tableDef[ClientDocumentTableDefSymbol].derived.setMaterializer,
52
+ )
53
+ }
54
+ }
55
+
56
+ return { tables, materializers }
57
+ }
58
+
59
+ export type InputState = {
60
+ readonly tables: Record<string, TableDefBase> | ReadonlyArray<TableDefBase>
61
+ readonly materializers: Record<string, Materializer<any>>
62
+ }
@@ -2,40 +2,37 @@ import { Schema } from '@livestore/utils/effect'
2
2
 
3
3
  import { SqliteDsl } from './db-schema/mod.js'
4
4
  import * as EventId from './EventId.js'
5
- import type { FromTable } from './table-def.js'
6
5
  import { table } from './table-def.js'
7
6
 
8
- /// App DB
7
+ /// Read model DB
9
8
 
10
9
  export const SCHEMA_META_TABLE = '__livestore_schema'
11
10
 
12
- export const schemaMetaTable = table(
13
- SCHEMA_META_TABLE,
14
- {
11
+ export const schemaMetaTable = table({
12
+ name: SCHEMA_META_TABLE,
13
+ columns: {
15
14
  tableName: SqliteDsl.text({ primaryKey: true }),
16
15
  schemaHash: SqliteDsl.integer({ nullable: false }),
17
16
  /** ISO date format */
18
17
  updatedAt: SqliteDsl.text({ nullable: false }),
19
18
  },
20
- { disableAutomaticIdColumn: true },
21
- )
19
+ })
22
20
 
23
- export type SchemaMetaRow = FromTable.RowDecoded<typeof schemaMetaTable>
21
+ export type SchemaMetaRow = typeof schemaMetaTable.Type
24
22
 
25
- export const SCHEMA_MUTATIONS_META_TABLE = '__livestore_schema_mutations'
23
+ export const SCHEMA_EVENT_DEFS_META_TABLE = '__livestore_schema_event_defs'
26
24
 
27
- export const schemaMutationsMetaTable = table(
28
- SCHEMA_MUTATIONS_META_TABLE,
29
- {
30
- mutationName: SqliteDsl.text({ primaryKey: true }),
25
+ export const schemaEventDefsMetaTable = table({
26
+ name: SCHEMA_EVENT_DEFS_META_TABLE,
27
+ columns: {
28
+ eventName: SqliteDsl.text({ primaryKey: true }),
31
29
  schemaHash: SqliteDsl.integer({ nullable: false }),
32
30
  /** ISO date format */
33
31
  updatedAt: SqliteDsl.text({ nullable: false }),
34
32
  },
35
- { disableAutomaticIdColumn: true },
36
- )
33
+ })
37
34
 
38
- export type SchemaMutationsMetaRow = FromTable.RowDecoded<typeof schemaMutationsMetaTable>
35
+ export type SchemaEventDefsMetaRow = typeof schemaEventDefsMetaTable.Type
39
36
 
40
37
  /**
41
38
  * Table which stores SQLite changeset blobs which is used for rolling back
@@ -43,84 +40,76 @@ export type SchemaMutationsMetaRow = FromTable.RowDecoded<typeof schemaMutations
43
40
  */
44
41
  export const SESSION_CHANGESET_META_TABLE = '__livestore_session_changeset'
45
42
 
46
- export const sessionChangesetMetaTable = table(
47
- SESSION_CHANGESET_META_TABLE,
48
- {
43
+ export const sessionChangesetMetaTable = table({
44
+ name: SESSION_CHANGESET_META_TABLE,
45
+ columns: {
49
46
  // TODO bring back primary key
50
47
  idGlobal: SqliteDsl.integer({ schema: EventId.GlobalEventId }),
51
48
  idClient: SqliteDsl.integer({ schema: EventId.ClientEventId }),
52
49
  changeset: SqliteDsl.blob({ nullable: true }),
53
50
  debug: SqliteDsl.json({ nullable: true }),
54
51
  },
55
- {
56
- disableAutomaticIdColumn: true,
57
- indexes: [{ columns: ['idGlobal', 'idClient'], name: 'idx_session_changeset_id' }],
58
- },
59
- )
52
+ indexes: [{ columns: ['idGlobal', 'idClient'], name: 'idx_session_changeset_id' }],
53
+ })
60
54
 
61
- export type SessionChangesetMetaRow = FromTable.RowDecoded<typeof sessionChangesetMetaTable>
55
+ export type SessionChangesetMetaRow = typeof sessionChangesetMetaTable.Type
62
56
 
63
57
  export const LEADER_MERGE_COUNTER_TABLE = '__livestore_leader_merge_counter'
64
58
 
65
- export const leaderMergeCounterTable = table(
66
- LEADER_MERGE_COUNTER_TABLE,
67
- {
59
+ export const leaderMergeCounterTable = table({
60
+ name: LEADER_MERGE_COUNTER_TABLE,
61
+ columns: {
68
62
  id: SqliteDsl.integer({ primaryKey: true, schema: Schema.Literal(0) }),
69
63
  mergeCounter: SqliteDsl.integer({ primaryKey: true }),
70
64
  },
71
- { disableAutomaticIdColumn: true },
72
- )
65
+ })
73
66
 
74
- export type LeaderMergeCounterRow = FromTable.RowDecoded<typeof leaderMergeCounterTable>
67
+ export type LeaderMergeCounterRow = typeof leaderMergeCounterTable.Type
75
68
 
76
69
  export const systemTables = [
77
70
  schemaMetaTable,
78
- schemaMutationsMetaTable,
71
+ schemaEventDefsMetaTable,
79
72
  sessionChangesetMetaTable,
80
73
  leaderMergeCounterTable,
81
74
  ]
82
75
 
83
- /// Mutation log DB
76
+ /// Eventlog DB
84
77
 
85
78
  export const SyncStatus = Schema.Literal('synced', 'pending', 'error', 'clientOnly')
86
79
  export type SyncStatus = typeof SyncStatus.Type
87
80
 
88
- export const MUTATION_LOG_META_TABLE = 'mutation_log'
81
+ export const EVENTLOG_META_TABLE = 'eventlog'
89
82
 
90
- export const mutationLogMetaTable = table(
91
- MUTATION_LOG_META_TABLE,
92
- {
83
+ export const eventlogMetaTable = table({
84
+ name: EVENTLOG_META_TABLE,
85
+ columns: {
93
86
  // TODO Adjust modeling so a global event never needs a client id component
94
87
  idGlobal: SqliteDsl.integer({ primaryKey: true, schema: EventId.GlobalEventId }),
95
88
  idClient: SqliteDsl.integer({ primaryKey: true, schema: EventId.ClientEventId }),
96
89
  parentIdGlobal: SqliteDsl.integer({ schema: EventId.GlobalEventId }),
97
90
  parentIdClient: SqliteDsl.integer({ schema: EventId.ClientEventId }),
98
- mutation: SqliteDsl.text({}),
91
+ name: SqliteDsl.text({}),
99
92
  argsJson: SqliteDsl.text({ schema: Schema.parseJson(Schema.Any) }),
100
93
  clientId: SqliteDsl.text({}),
101
94
  sessionId: SqliteDsl.text({}),
102
95
  schemaHash: SqliteDsl.integer({}),
103
96
  syncMetadataJson: SqliteDsl.text({ schema: Schema.parseJson(Schema.Option(Schema.JsonValue)) }),
104
97
  },
105
- {
106
- disableAutomaticIdColumn: true,
107
- indexes: [
108
- { columns: ['idGlobal'], name: 'idx_idGlobal' },
109
- { columns: ['idGlobal', 'idClient'], name: 'idx_mutationlog_id' },
110
- ],
111
- },
112
- )
98
+ indexes: [
99
+ { columns: ['idGlobal'], name: 'idx_eventlog_idGlobal' },
100
+ { columns: ['idGlobal', 'idClient'], name: 'idx_eventlog_id' },
101
+ ],
102
+ })
113
103
 
114
- export type MutationLogMetaRow = FromTable.RowDecoded<typeof mutationLogMetaTable>
104
+ export type EventlogMetaRow = typeof eventlogMetaTable.Type
115
105
 
116
106
  export const SYNC_STATUS_TABLE = '__livestore_sync_status'
117
107
 
118
- export const syncStatusTable = table(
119
- SYNC_STATUS_TABLE,
120
- {
108
+ export const syncStatusTable = table({
109
+ name: SYNC_STATUS_TABLE,
110
+ columns: {
121
111
  head: SqliteDsl.integer({ primaryKey: true }),
122
112
  },
123
- { disableAutomaticIdColumn: true },
124
- )
113
+ })
125
114
 
126
- export type SyncStatusRow = FromTable.RowDecoded<typeof syncStatusTable>
115
+ export type SyncStatusRow = typeof syncStatusTable.Type