@livestore/common 0.3.0-dev.3 → 0.3.0-dev.31

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 (426) 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 +128 -68
  7. package/dist/adapter-types.d.ts.map +1 -1
  8. package/dist/adapter-types.js +36 -7
  9. package/dist/adapter-types.js.map +1 -1
  10. package/dist/bounded-collections.d.ts.map +1 -1
  11. package/dist/debug-info.d.ts +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 +389 -0
  16. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -0
  17. package/dist/devtools/devtools-messages-client-session.js +96 -0
  18. package/dist/devtools/devtools-messages-client-session.js.map +1 -0
  19. package/dist/devtools/devtools-messages-common.d.ts +68 -0
  20. package/dist/devtools/devtools-messages-common.d.ts.map +1 -0
  21. package/dist/devtools/devtools-messages-common.js +60 -0
  22. package/dist/devtools/devtools-messages-common.js.map +1 -0
  23. package/dist/devtools/devtools-messages-leader.d.ts +394 -0
  24. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -0
  25. package/dist/devtools/devtools-messages-leader.js +147 -0
  26. package/dist/devtools/devtools-messages-leader.js.map +1 -0
  27. package/dist/devtools/devtools-messages.d.ts +3 -592
  28. package/dist/devtools/devtools-messages.d.ts.map +1 -1
  29. package/dist/devtools/devtools-messages.js +3 -171
  30. package/dist/devtools/devtools-messages.js.map +1 -1
  31. package/dist/devtools/devtools-sessioninfo.d.ts +28 -0
  32. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -0
  33. package/dist/devtools/devtools-sessioninfo.js +34 -0
  34. package/dist/devtools/devtools-sessioninfo.js.map +1 -0
  35. package/dist/devtools/mod.d.ts +39 -0
  36. package/dist/devtools/mod.d.ts.map +1 -0
  37. package/dist/devtools/mod.js +27 -0
  38. package/dist/devtools/mod.js.map +1 -0
  39. package/dist/index.d.ts +4 -11
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +4 -7
  42. package/dist/index.js.map +1 -1
  43. package/dist/leader-thread/LeaderSyncProcessor.d.ts +62 -0
  44. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -0
  45. package/dist/leader-thread/LeaderSyncProcessor.js +589 -0
  46. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -0
  47. package/dist/leader-thread/apply-event.d.ts +16 -0
  48. package/dist/leader-thread/apply-event.d.ts.map +1 -0
  49. package/dist/leader-thread/apply-event.js +103 -0
  50. package/dist/leader-thread/apply-event.js.map +1 -0
  51. package/dist/leader-thread/connection.d.ts +34 -6
  52. package/dist/leader-thread/connection.d.ts.map +1 -1
  53. package/dist/leader-thread/connection.js +22 -7
  54. package/dist/leader-thread/connection.js.map +1 -1
  55. package/dist/leader-thread/eventlog.d.ts +27 -0
  56. package/dist/leader-thread/eventlog.d.ts.map +1 -0
  57. package/dist/leader-thread/eventlog.js +123 -0
  58. package/dist/leader-thread/eventlog.js.map +1 -0
  59. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
  60. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  61. package/dist/leader-thread/leader-worker-devtools.js +154 -132
  62. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  63. package/dist/leader-thread/make-leader-thread-layer.d.ts +26 -12
  64. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  65. package/dist/leader-thread/make-leader-thread-layer.js +82 -47
  66. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  67. package/dist/leader-thread/mod.d.ts +1 -1
  68. package/dist/leader-thread/mod.d.ts.map +1 -1
  69. package/dist/leader-thread/mod.js +1 -1
  70. package/dist/leader-thread/mod.js.map +1 -1
  71. package/dist/leader-thread/recreate-db.d.ts +4 -2
  72. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  73. package/dist/leader-thread/recreate-db.js +35 -25
  74. package/dist/leader-thread/recreate-db.js.map +1 -1
  75. package/dist/leader-thread/shutdown-channel.d.ts +2 -5
  76. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  77. package/dist/leader-thread/shutdown-channel.js +2 -4
  78. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  79. package/dist/leader-thread/types.d.ts +86 -39
  80. package/dist/leader-thread/types.d.ts.map +1 -1
  81. package/dist/leader-thread/types.js +1 -3
  82. package/dist/leader-thread/types.js.map +1 -1
  83. package/dist/materializer-helper.d.ts +23 -0
  84. package/dist/materializer-helper.d.ts.map +1 -0
  85. package/dist/materializer-helper.js +70 -0
  86. package/dist/materializer-helper.js.map +1 -0
  87. package/dist/otel.d.ts +2 -0
  88. package/dist/otel.d.ts.map +1 -1
  89. package/dist/otel.js +5 -0
  90. package/dist/otel.js.map +1 -1
  91. package/dist/query-builder/api.d.ts +158 -55
  92. package/dist/query-builder/api.d.ts.map +1 -1
  93. package/dist/query-builder/api.js +3 -5
  94. package/dist/query-builder/api.js.map +1 -1
  95. package/dist/query-builder/astToSql.d.ts +7 -0
  96. package/dist/query-builder/astToSql.d.ts.map +1 -0
  97. package/dist/query-builder/astToSql.js +190 -0
  98. package/dist/query-builder/astToSql.js.map +1 -0
  99. package/dist/query-builder/impl.d.ts +3 -8
  100. package/dist/query-builder/impl.d.ts.map +1 -1
  101. package/dist/query-builder/impl.js +166 -124
  102. package/dist/query-builder/impl.js.map +1 -1
  103. package/dist/query-builder/impl.test.d.ts +86 -1
  104. package/dist/query-builder/impl.test.d.ts.map +1 -1
  105. package/dist/query-builder/impl.test.js +411 -69
  106. package/dist/query-builder/impl.test.js.map +1 -1
  107. package/dist/query-builder/mod.d.ts +7 -0
  108. package/dist/query-builder/mod.d.ts.map +1 -1
  109. package/dist/query-builder/mod.js +7 -0
  110. package/dist/query-builder/mod.js.map +1 -1
  111. package/dist/rehydrate-from-eventlog.d.ts +14 -0
  112. package/dist/rehydrate-from-eventlog.d.ts.map +1 -0
  113. package/dist/rehydrate-from-eventlog.js +65 -0
  114. package/dist/rehydrate-from-eventlog.js.map +1 -0
  115. package/dist/schema/EventDef.d.ts +136 -0
  116. package/dist/schema/EventDef.d.ts.map +1 -0
  117. package/dist/schema/EventDef.js +58 -0
  118. package/dist/schema/EventDef.js.map +1 -0
  119. package/dist/schema/EventId.d.ts +35 -15
  120. package/dist/schema/EventId.d.ts.map +1 -1
  121. package/dist/schema/EventId.js +57 -11
  122. package/dist/schema/EventId.js.map +1 -1
  123. package/dist/schema/EventId.test.d.ts +2 -0
  124. package/dist/schema/EventId.test.d.ts.map +1 -0
  125. package/dist/schema/EventId.test.js +11 -0
  126. package/dist/schema/EventId.test.js.map +1 -0
  127. package/dist/schema/LiveStoreEvent.d.ts +255 -0
  128. package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
  129. package/dist/schema/LiveStoreEvent.js +118 -0
  130. package/dist/schema/LiveStoreEvent.js.map +1 -0
  131. package/dist/schema/client-document-def.d.ts +223 -0
  132. package/dist/schema/client-document-def.d.ts.map +1 -0
  133. package/dist/schema/client-document-def.js +170 -0
  134. package/dist/schema/client-document-def.js.map +1 -0
  135. package/dist/schema/client-document-def.test.d.ts +2 -0
  136. package/dist/schema/client-document-def.test.d.ts.map +1 -0
  137. package/dist/schema/client-document-def.test.js +201 -0
  138. package/dist/schema/client-document-def.test.js.map +1 -0
  139. package/dist/schema/db-schema/ast/sqlite.d.ts +69 -0
  140. package/dist/schema/db-schema/ast/sqlite.d.ts.map +1 -0
  141. package/dist/schema/db-schema/ast/sqlite.js +71 -0
  142. package/dist/schema/db-schema/ast/sqlite.js.map +1 -0
  143. package/dist/schema/db-schema/ast/validate.d.ts +3 -0
  144. package/dist/schema/db-schema/ast/validate.d.ts.map +1 -0
  145. package/dist/schema/db-schema/ast/validate.js +12 -0
  146. package/dist/schema/db-schema/ast/validate.js.map +1 -0
  147. package/dist/schema/db-schema/dsl/field-defs.d.ts +90 -0
  148. package/dist/schema/db-schema/dsl/field-defs.d.ts.map +1 -0
  149. package/dist/schema/db-schema/dsl/field-defs.js +87 -0
  150. package/dist/schema/db-schema/dsl/field-defs.js.map +1 -0
  151. package/dist/schema/db-schema/dsl/field-defs.test.d.ts +2 -0
  152. package/dist/schema/db-schema/dsl/field-defs.test.d.ts.map +1 -0
  153. package/dist/schema/db-schema/dsl/field-defs.test.js +29 -0
  154. package/dist/schema/db-schema/dsl/field-defs.test.js.map +1 -0
  155. package/dist/schema/db-schema/dsl/mod.d.ts +90 -0
  156. package/dist/schema/db-schema/dsl/mod.d.ts.map +1 -0
  157. package/dist/schema/db-schema/dsl/mod.js +41 -0
  158. package/dist/schema/db-schema/dsl/mod.js.map +1 -0
  159. package/dist/schema/db-schema/hash.d.ts +2 -0
  160. package/dist/schema/db-schema/hash.d.ts.map +1 -0
  161. package/dist/schema/db-schema/hash.js +14 -0
  162. package/dist/schema/db-schema/hash.js.map +1 -0
  163. package/dist/schema/db-schema/mod.d.ts +3 -0
  164. package/dist/schema/db-schema/mod.d.ts.map +1 -0
  165. package/dist/schema/db-schema/mod.js +3 -0
  166. package/dist/schema/db-schema/mod.js.map +1 -0
  167. package/dist/schema/events.d.ts +2 -0
  168. package/dist/schema/events.d.ts.map +1 -0
  169. package/dist/schema/events.js +2 -0
  170. package/dist/schema/events.js.map +1 -0
  171. package/dist/schema/mod.d.ts +5 -3
  172. package/dist/schema/mod.d.ts.map +1 -1
  173. package/dist/schema/mod.js +5 -3
  174. package/dist/schema/mod.js.map +1 -1
  175. package/dist/schema/schema-helpers.d.ts.map +1 -1
  176. package/dist/schema/schema-helpers.js +1 -1
  177. package/dist/schema/schema-helpers.js.map +1 -1
  178. package/dist/schema/schema.d.ts +30 -23
  179. package/dist/schema/schema.d.ts.map +1 -1
  180. package/dist/schema/schema.js +48 -35
  181. package/dist/schema/schema.js.map +1 -1
  182. package/dist/schema/sqlite-state.d.ts +12 -0
  183. package/dist/schema/sqlite-state.d.ts.map +1 -0
  184. package/dist/schema/sqlite-state.js +36 -0
  185. package/dist/schema/sqlite-state.js.map +1 -0
  186. package/dist/schema/system-tables.d.ts +179 -125
  187. package/dist/schema/system-tables.d.ts.map +1 -1
  188. package/dist/schema/system-tables.js +76 -41
  189. package/dist/schema/system-tables.js.map +1 -1
  190. package/dist/schema/table-def.d.ts +37 -109
  191. package/dist/schema/table-def.d.ts.map +1 -1
  192. package/dist/schema/table-def.js +23 -66
  193. package/dist/schema/table-def.js.map +1 -1
  194. package/dist/schema/view.d.ts +3 -0
  195. package/dist/schema/view.d.ts.map +1 -0
  196. package/dist/schema/view.js +3 -0
  197. package/dist/schema/view.js.map +1 -0
  198. package/dist/schema-management/common.d.ts +7 -7
  199. package/dist/schema-management/common.d.ts.map +1 -1
  200. package/dist/schema-management/common.js.map +1 -1
  201. package/dist/schema-management/migrations.d.ts +6 -6
  202. package/dist/schema-management/migrations.d.ts.map +1 -1
  203. package/dist/schema-management/migrations.js +19 -14
  204. package/dist/schema-management/migrations.js.map +1 -1
  205. package/dist/schema-management/validate-mutation-defs.d.ts +3 -3
  206. package/dist/schema-management/validate-mutation-defs.d.ts.map +1 -1
  207. package/dist/schema-management/validate-mutation-defs.js +17 -17
  208. package/dist/schema-management/validate-mutation-defs.js.map +1 -1
  209. package/dist/sql-queries/misc.d.ts.map +1 -1
  210. package/dist/sql-queries/sql-queries.d.ts +1 -1
  211. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  212. package/dist/sql-queries/sql-queries.js.map +1 -1
  213. package/dist/sql-queries/sql-query-builder.d.ts +1 -1
  214. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  215. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  216. package/dist/sql-queries/types.d.ts +2 -1
  217. package/dist/sql-queries/types.d.ts.map +1 -1
  218. package/dist/sql-queries/types.js.map +1 -1
  219. package/dist/sync/ClientSessionSyncProcessor.d.ts +66 -0
  220. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -0
  221. package/dist/sync/ClientSessionSyncProcessor.js +209 -0
  222. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -0
  223. package/dist/sync/index.d.ts +1 -1
  224. package/dist/sync/index.d.ts.map +1 -1
  225. package/dist/sync/index.js +1 -1
  226. package/dist/sync/index.js.map +1 -1
  227. package/dist/sync/next/compact-events.d.ts.map +1 -1
  228. package/dist/sync/next/facts.d.ts +19 -19
  229. package/dist/sync/next/facts.d.ts.map +1 -1
  230. package/dist/sync/next/facts.js +3 -3
  231. package/dist/sync/next/facts.js.map +1 -1
  232. package/dist/sync/next/history-dag-common.d.ts +6 -7
  233. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  234. package/dist/sync/next/history-dag-common.js +4 -2
  235. package/dist/sync/next/history-dag-common.js.map +1 -1
  236. package/dist/sync/next/history-dag.d.ts.map +1 -1
  237. package/dist/sync/next/history-dag.js +2 -2
  238. package/dist/sync/next/history-dag.js.map +1 -1
  239. package/dist/sync/next/rebase-events.d.ts +10 -8
  240. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  241. package/dist/sync/next/rebase-events.js +11 -8
  242. package/dist/sync/next/rebase-events.js.map +1 -1
  243. package/dist/sync/next/test/compact-events.calculator.test.js +38 -33
  244. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  245. package/dist/sync/next/test/compact-events.test.js +76 -76
  246. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  247. package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +29 -29
  248. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
  249. package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +67 -36
  250. package/dist/sync/next/test/event-fixtures.js.map +1 -0
  251. package/dist/sync/next/test/mod.d.ts +1 -1
  252. package/dist/sync/next/test/mod.d.ts.map +1 -1
  253. package/dist/sync/next/test/mod.js +1 -1
  254. package/dist/sync/next/test/mod.js.map +1 -1
  255. package/dist/sync/sync.d.ts +55 -20
  256. package/dist/sync/sync.d.ts.map +1 -1
  257. package/dist/sync/sync.js +7 -3
  258. package/dist/sync/sync.js.map +1 -1
  259. package/dist/sync/syncstate.d.ts +213 -82
  260. package/dist/sync/syncstate.d.ts.map +1 -1
  261. package/dist/sync/syncstate.js +319 -120
  262. package/dist/sync/syncstate.js.map +1 -1
  263. package/dist/sync/syncstate.test.js +295 -275
  264. package/dist/sync/syncstate.test.js.map +1 -1
  265. package/dist/sync/validate-push-payload.d.ts +2 -2
  266. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  267. package/dist/sync/validate-push-payload.js +2 -2
  268. package/dist/sync/validate-push-payload.js.map +1 -1
  269. package/dist/util.d.ts +2 -2
  270. package/dist/util.d.ts.map +1 -1
  271. package/dist/version.d.ts +1 -1
  272. package/dist/version.d.ts.map +1 -1
  273. package/dist/version.js +1 -1
  274. package/dist/version.js.map +1 -1
  275. package/package.json +6 -6
  276. package/src/__tests__/fixture.ts +36 -15
  277. package/src/adapter-types.ts +111 -74
  278. package/src/debug-info.ts +1 -0
  279. package/src/devtools/devtools-messages-client-session.ts +141 -0
  280. package/src/devtools/devtools-messages-common.ts +115 -0
  281. package/src/devtools/devtools-messages-leader.ts +191 -0
  282. package/src/devtools/devtools-messages.ts +3 -243
  283. package/src/devtools/devtools-sessioninfo.ts +99 -0
  284. package/src/devtools/mod.ts +36 -0
  285. package/src/index.ts +4 -13
  286. package/src/leader-thread/LeaderSyncProcessor.ts +935 -0
  287. package/src/leader-thread/apply-event.ts +173 -0
  288. package/src/leader-thread/connection.ts +54 -9
  289. package/src/leader-thread/eventlog.ts +199 -0
  290. package/src/leader-thread/leader-worker-devtools.ts +212 -189
  291. package/src/leader-thread/make-leader-thread-layer.ts +143 -77
  292. package/src/leader-thread/mod.ts +1 -1
  293. package/src/leader-thread/recreate-db.ts +41 -30
  294. package/src/leader-thread/shutdown-channel.ts +2 -4
  295. package/src/leader-thread/types.ts +95 -51
  296. package/src/materializer-helper.ts +110 -0
  297. package/src/otel.ts +8 -0
  298. package/src/query-builder/api.ts +236 -85
  299. package/src/query-builder/astToSql.ts +232 -0
  300. package/src/query-builder/impl.test.ts +447 -78
  301. package/src/query-builder/impl.ts +209 -144
  302. package/src/query-builder/mod.ts +7 -0
  303. package/src/rehydrate-from-eventlog.ts +114 -0
  304. package/src/schema/EventDef.ts +216 -0
  305. package/src/schema/EventId.test.ts +12 -0
  306. package/src/schema/EventId.ts +75 -15
  307. package/src/schema/LiveStoreEvent.ts +239 -0
  308. package/src/schema/client-document-def.test.ts +239 -0
  309. package/src/schema/client-document-def.ts +444 -0
  310. package/src/schema/db-schema/ast/sqlite.ts +142 -0
  311. package/src/schema/db-schema/ast/validate.ts +13 -0
  312. package/src/schema/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +206 -0
  313. package/src/schema/db-schema/dsl/field-defs.test.ts +35 -0
  314. package/src/schema/db-schema/dsl/field-defs.ts +242 -0
  315. package/src/schema/db-schema/dsl/mod.ts +222 -0
  316. package/src/schema/db-schema/hash.ts +14 -0
  317. package/src/schema/db-schema/mod.ts +2 -0
  318. package/src/schema/events.ts +1 -0
  319. package/src/schema/mod.ts +5 -3
  320. package/src/schema/schema-helpers.ts +1 -1
  321. package/src/schema/schema.ts +84 -62
  322. package/src/schema/sqlite-state.ts +62 -0
  323. package/src/schema/system-tables.ts +68 -50
  324. package/src/schema/table-def.ts +68 -214
  325. package/src/schema/view.ts +2 -0
  326. package/src/schema-management/common.ts +7 -7
  327. package/src/schema-management/migrations.ts +27 -24
  328. package/src/schema-management/validate-mutation-defs.ts +22 -24
  329. package/src/sql-queries/sql-queries.ts +1 -1
  330. package/src/sql-queries/sql-query-builder.ts +1 -2
  331. package/src/sql-queries/types.ts +3 -1
  332. package/src/sync/ClientSessionSyncProcessor.ts +332 -0
  333. package/src/sync/index.ts +1 -1
  334. package/src/sync/next/facts.ts +32 -33
  335. package/src/sync/next/history-dag-common.ts +9 -5
  336. package/src/sync/next/history-dag.ts +2 -2
  337. package/src/sync/next/rebase-events.ts +22 -16
  338. package/src/sync/next/test/compact-events.calculator.test.ts +45 -45
  339. package/src/sync/next/test/compact-events.test.ts +78 -78
  340. package/src/sync/next/test/event-fixtures.ts +219 -0
  341. package/src/sync/next/test/mod.ts +1 -1
  342. package/src/sync/sync.ts +51 -19
  343. package/src/sync/syncstate.test.ts +335 -308
  344. package/src/sync/syncstate.ts +394 -212
  345. package/src/sync/validate-push-payload.ts +7 -4
  346. package/src/version.ts +1 -1
  347. package/tmp/pack.tgz +0 -0
  348. package/tsconfig.json +2 -1
  349. package/dist/derived-mutations.d.ts +0 -109
  350. package/dist/derived-mutations.d.ts.map +0 -1
  351. package/dist/derived-mutations.js +0 -54
  352. package/dist/derived-mutations.js.map +0 -1
  353. package/dist/derived-mutations.test.d.ts +0 -2
  354. package/dist/derived-mutations.test.d.ts.map +0 -1
  355. package/dist/derived-mutations.test.js +0 -93
  356. package/dist/derived-mutations.test.js.map +0 -1
  357. package/dist/devtools/devtools-bridge.d.ts +0 -12
  358. package/dist/devtools/devtools-bridge.d.ts.map +0 -1
  359. package/dist/devtools/devtools-bridge.js +0 -2
  360. package/dist/devtools/devtools-bridge.js.map +0 -1
  361. package/dist/devtools/index.d.ts +0 -42
  362. package/dist/devtools/index.d.ts.map +0 -1
  363. package/dist/devtools/index.js +0 -48
  364. package/dist/devtools/index.js.map +0 -1
  365. package/dist/init-singleton-tables.d.ts +0 -4
  366. package/dist/init-singleton-tables.d.ts.map +0 -1
  367. package/dist/init-singleton-tables.js +0 -16
  368. package/dist/init-singleton-tables.js.map +0 -1
  369. package/dist/leader-thread/apply-mutation.d.ts +0 -8
  370. package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
  371. package/dist/leader-thread/apply-mutation.js +0 -95
  372. package/dist/leader-thread/apply-mutation.js.map +0 -1
  373. package/dist/leader-thread/leader-sync-processor.d.ts +0 -47
  374. package/dist/leader-thread/leader-sync-processor.d.ts.map +0 -1
  375. package/dist/leader-thread/leader-sync-processor.js +0 -422
  376. package/dist/leader-thread/leader-sync-processor.js.map +0 -1
  377. package/dist/leader-thread/mutationlog.d.ts +0 -23
  378. package/dist/leader-thread/mutationlog.d.ts.map +0 -1
  379. package/dist/leader-thread/mutationlog.js +0 -27
  380. package/dist/leader-thread/mutationlog.js.map +0 -1
  381. package/dist/leader-thread/pull-queue-set.d.ts +0 -7
  382. package/dist/leader-thread/pull-queue-set.d.ts.map +0 -1
  383. package/dist/leader-thread/pull-queue-set.js +0 -39
  384. package/dist/leader-thread/pull-queue-set.js.map +0 -1
  385. package/dist/mutation.d.ts +0 -13
  386. package/dist/mutation.d.ts.map +0 -1
  387. package/dist/mutation.js +0 -57
  388. package/dist/mutation.js.map +0 -1
  389. package/dist/query-info.d.ts +0 -38
  390. package/dist/query-info.d.ts.map +0 -1
  391. package/dist/query-info.js +0 -7
  392. package/dist/query-info.js.map +0 -1
  393. package/dist/rehydrate-from-mutationlog.d.ts +0 -14
  394. package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
  395. package/dist/rehydrate-from-mutationlog.js +0 -72
  396. package/dist/rehydrate-from-mutationlog.js.map +0 -1
  397. package/dist/schema/MutationEvent.d.ts +0 -191
  398. package/dist/schema/MutationEvent.d.ts.map +0 -1
  399. package/dist/schema/MutationEvent.js +0 -56
  400. package/dist/schema/MutationEvent.js.map +0 -1
  401. package/dist/schema/mutations.d.ts +0 -107
  402. package/dist/schema/mutations.d.ts.map +0 -1
  403. package/dist/schema/mutations.js +0 -42
  404. package/dist/schema/mutations.js.map +0 -1
  405. package/dist/sync/client-session-sync-processor.d.ts +0 -45
  406. package/dist/sync/client-session-sync-processor.d.ts.map +0 -1
  407. package/dist/sync/client-session-sync-processor.js +0 -131
  408. package/dist/sync/client-session-sync-processor.js.map +0 -1
  409. package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
  410. package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
  411. package/src/derived-mutations.test.ts +0 -101
  412. package/src/derived-mutations.ts +0 -166
  413. package/src/devtools/devtools-bridge.ts +0 -13
  414. package/src/devtools/index.ts +0 -48
  415. package/src/init-singleton-tables.ts +0 -24
  416. package/src/leader-thread/apply-mutation.ts +0 -143
  417. package/src/leader-thread/leader-sync-processor.ts +0 -666
  418. package/src/leader-thread/mutationlog.ts +0 -42
  419. package/src/leader-thread/pull-queue-set.ts +0 -58
  420. package/src/mutation.ts +0 -81
  421. package/src/query-info.ts +0 -78
  422. package/src/rehydrate-from-mutationlog.ts +0 -127
  423. package/src/schema/MutationEvent.ts +0 -161
  424. package/src/schema/mutations.ts +0 -192
  425. package/src/sync/client-session-sync-processor.ts +0 -207
  426. package/src/sync/next/test/mutation-fixtures.ts +0 -231
@@ -0,0 +1,222 @@
1
+ import type { Nullable } from '@livestore/utils'
2
+ import type { Option, Types } from '@livestore/utils/effect'
3
+ import { Schema } from '@livestore/utils/effect'
4
+
5
+ import type * as SqliteAst from '../ast/sqlite.js'
6
+ import type { ColumnDefinition } from './field-defs.js'
7
+
8
+ export * from './field-defs.js'
9
+
10
+ export type DbSchema = {
11
+ [key: string]: TableDefinition<string, Columns>
12
+ }
13
+
14
+ /** Note when using the object-notation, the object keys are ignored and not used as table names */
15
+ export type DbSchemaInput = Record<string, TableDefinition<any, any>> | ReadonlyArray<TableDefinition<any, any>>
16
+
17
+ /**
18
+ * In case of ...
19
+ * - array: we use the table name of each array item (= table definition) as the object key
20
+ * - 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
21
+ */
22
+ export type DbSchemaFromInputSchema<TSchemaInput extends DbSchemaInput> =
23
+ TSchemaInput extends ReadonlyArray<TableDefinition<any, any>>
24
+ ? { [K in TSchemaInput[number] as K['name']]: K }
25
+ : TSchemaInput extends Record<string, TableDefinition<any, any>>
26
+ ? { [K in keyof TSchemaInput as TSchemaInput[K]['name']]: TSchemaInput[K] }
27
+ : never
28
+
29
+ // TODO ensure via runtime check (possibly even via type-level check) that all index names are unique
30
+ export const makeDbSchema = <TDbSchemaInput extends DbSchemaInput>(
31
+ schema: TDbSchemaInput,
32
+ ): DbSchemaFromInputSchema<TDbSchemaInput> => {
33
+ return Array.isArray(schema) ? Object.fromEntries(schema.map((_) => [_.name, _])) : (schema as any)
34
+ }
35
+
36
+ export const table = <TTableName extends string, TColumns extends Columns, TIndexes extends Index[]>(
37
+ name: TTableName,
38
+ columns: TColumns,
39
+ indexes?: TIndexes,
40
+ ): TableDefinition<TTableName, TColumns> => {
41
+ const ast: SqliteAst.Table = {
42
+ _tag: 'table',
43
+ name,
44
+ columns: columsToAst(columns),
45
+ indexes: indexesToAst(indexes ?? []),
46
+ }
47
+
48
+ return { name, columns, indexes, ast }
49
+ }
50
+
51
+ export type AnyIfConstained<In, Out> = '__constrained' extends keyof In ? any : Out
52
+ export type EmptyObjIfConstained<In> = '__constrained' extends keyof In ? {} : In
53
+
54
+ export type StructSchemaForColumns<TCols extends ConstraintColumns> = Schema.Schema<
55
+ AnyIfConstained<TCols, FromColumns.RowDecoded<TCols>>,
56
+ AnyIfConstained<TCols, FromColumns.RowEncoded<TCols>>
57
+ >
58
+
59
+ export type InsertStructSchemaForColumns<TCols extends ConstraintColumns> = Schema.Schema<
60
+ AnyIfConstained<TCols, FromColumns.InsertRowDecoded<TCols>>,
61
+ AnyIfConstained<TCols, FromColumns.InsertRowEncoded<TCols>>
62
+ >
63
+
64
+ export const structSchemaForTable = <TTableDefinition extends TableDefinition<any, any>>(
65
+ tableDef: TTableDefinition,
66
+ ): StructSchemaForColumns<TTableDefinition['columns']> =>
67
+ Schema.Struct(Object.fromEntries(tableDef.ast.columns.map((column) => [column.name, column.schema]))).annotations({
68
+ title: tableDef.name,
69
+ }) as any
70
+
71
+ export const insertStructSchemaForTable = <TTableDefinition extends TableDefinition<any, any>>(
72
+ tableDef: TTableDefinition,
73
+ ): InsertStructSchemaForColumns<TTableDefinition['columns']> =>
74
+ Schema.Struct(
75
+ Object.fromEntries(
76
+ tableDef.ast.columns.map((column) => [
77
+ column.name,
78
+ column.nullable === true || column.default._tag === 'Some' ? Schema.optional(column.schema) : column.schema,
79
+ ]),
80
+ ),
81
+ ).annotations({
82
+ title: tableDef.name,
83
+ }) as any
84
+
85
+ const columsToAst = (columns: Columns): ReadonlyArray<SqliteAst.Column> => {
86
+ return Object.entries(columns).map(([name, column]) => {
87
+ return {
88
+ _tag: 'column',
89
+ name,
90
+ schema: column.schema,
91
+ default: column.default as any,
92
+ nullable: column.nullable ?? false,
93
+ primaryKey: column.primaryKey ?? false,
94
+ type: { _tag: column.columnType },
95
+ } satisfies SqliteAst.Column
96
+ })
97
+ }
98
+
99
+ const indexesToAst = (indexes: ReadonlyArray<Index>): ReadonlyArray<SqliteAst.Index> => {
100
+ return indexes.map(
101
+ (_) => ({ _tag: 'index', columns: _.columns, name: _.name, unique: _.isUnique ?? false }) satisfies SqliteAst.Index,
102
+ )
103
+ }
104
+
105
+ /// Other
106
+
107
+ export type TableDefinition<TName extends string, TColumns extends Columns> = {
108
+ name: TName
109
+ columns: TColumns
110
+ indexes?: ReadonlyArray<Index>
111
+ ast: SqliteAst.Table
112
+ }
113
+
114
+ export type Columns = Record<string, ColumnDefinition<any, any>>
115
+
116
+ export type IsSingleColumn<TColumns extends Columns | ColumnDefinition<any, any>> =
117
+ TColumns extends ColumnDefinition<any, any> ? true : false
118
+
119
+ /**
120
+ * NOTE this is only needed to avoid a TS limitation where `StructSchemaForColumns` in the default case
121
+ * results in `Record<string, any>` instead of `any`. (Thanks to Andarist for the workaround)
122
+ *
123
+ * Hopefully this can be removed in the future
124
+ */
125
+ export type ConstraintColumns = Record<string, ColumnDefinition<any, any>> & { __constrained?: never }
126
+
127
+ export type Index = {
128
+ name: string
129
+ columns: ReadonlyArray<string>
130
+ /** @default false */
131
+ isUnique?: boolean
132
+ }
133
+
134
+ export namespace FromTable {
135
+ // TODO this sometimes doesn't preserve the order of columns
136
+ export type RowDecoded<TTableDefinition extends TableDefinition<any, any>> = Types.Simplify<
137
+ Nullable<Pick<RowDecodedAll<TTableDefinition>, NullableColumnNames<TTableDefinition>>> &
138
+ Omit<RowDecodedAll<TTableDefinition>, NullableColumnNames<TTableDefinition>>
139
+ >
140
+
141
+ export type NullableColumnNames<TTableDefinition extends TableDefinition<any, any>> = FromColumns.NullableColumnNames<
142
+ TTableDefinition['columns']
143
+ >
144
+
145
+ export type Columns<TTableDefinition extends TableDefinition<any, any>> = {
146
+ [K in keyof TTableDefinition['columns']]: TTableDefinition['columns'][K]['columnType']
147
+ }
148
+
149
+ export type RowEncodeNonNullable<TTableDefinition extends TableDefinition<any, any>> = {
150
+ [K in keyof TTableDefinition['columns']]: Schema.Schema.Encoded<TTableDefinition['columns'][K]['schema']>
151
+ }
152
+
153
+ export type RowEncoded<TTableDefinition extends TableDefinition<any, any>> = Types.Simplify<
154
+ Nullable<Pick<RowEncodeNonNullable<TTableDefinition>, NullableColumnNames<TTableDefinition>>> &
155
+ Omit<RowEncodeNonNullable<TTableDefinition>, NullableColumnNames<TTableDefinition>>
156
+ >
157
+
158
+ // export type RowEncoded<TTableDefinition extends TableDefinition<any, any>> = NullableColumnNames<
159
+ // TTableDefinition['columns']
160
+ // >
161
+
162
+ // &
163
+ // Omit<RowEncodeNonNullable<TTableDefinition>, NullableColumnNames<TTableDefinition['columns']>>
164
+ // >
165
+
166
+ export type RowDecodedAll<TTableDefinition extends TableDefinition<any, any>> = {
167
+ [K in keyof TTableDefinition['columns']]: Schema.Schema.Type<TTableDefinition['columns'][K]['schema']>
168
+ }
169
+ }
170
+
171
+ export namespace FromColumns {
172
+ // TODO this sometimes doesn't preserve the order of columns
173
+ export type RowDecoded<TColumns extends Columns> = Types.Simplify<
174
+ Nullable<Pick<RowDecodedAll<TColumns>, NullableColumnNames<TColumns>>> &
175
+ Omit<RowDecodedAll<TColumns>, NullableColumnNames<TColumns>>
176
+ >
177
+
178
+ export type RowDecodedAll<TColumns extends Columns> = {
179
+ readonly [K in keyof TColumns]: Schema.Schema.Type<TColumns[K]['schema']>
180
+ }
181
+
182
+ export type RowEncodedAll<TColumns extends Columns> = {
183
+ readonly [K in keyof TColumns]: Schema.Schema.Encoded<TColumns[K]['schema']>
184
+ }
185
+
186
+ export type RowEncoded<TColumns extends Columns> = Types.Simplify<
187
+ Nullable<Pick<RowEncodeNonNullable<TColumns>, NullableColumnNames<TColumns>>> &
188
+ Omit<RowEncodeNonNullable<TColumns>, NullableColumnNames<TColumns>>
189
+ >
190
+
191
+ export type RowEncodeNonNullable<TColumns extends Columns> = {
192
+ readonly [K in keyof TColumns]: Schema.Schema.Encoded<TColumns[K]['schema']>
193
+ }
194
+
195
+ export type NullableColumnNames<TColumns extends Columns> = keyof {
196
+ // TODO double check why there is a `true` in the type
197
+ [K in keyof TColumns as TColumns[K] extends ColumnDefinition<any, true> ? K : never]: {}
198
+ }
199
+
200
+ export type RequiredInsertColumns<TColumns extends Columns> = {
201
+ [K in keyof TColumns as TColumns[K]['nullable'] extends true
202
+ ? never
203
+ : TColumns[K]['default'] extends Option.Some<any>
204
+ ? never
205
+ : K]: {}
206
+ }
207
+
208
+ export type RequiredInsertColumnNames<TColumns extends Columns> = keyof RequiredInsertColumns<TColumns>
209
+
210
+ export type RequiresInsertValues<TColumns extends Columns> =
211
+ RequiredInsertColumnNames<TColumns> extends never ? false : true
212
+
213
+ export type InsertRowDecoded<TColumns extends Columns> = Types.Simplify<
214
+ Pick<RowDecodedAll<TColumns>, RequiredInsertColumnNames<TColumns>> &
215
+ Partial<Omit<RowDecodedAll<TColumns>, RequiredInsertColumnNames<TColumns>>>
216
+ >
217
+
218
+ export type InsertRowEncoded<TColumns extends Columns> = Types.Simplify<
219
+ Pick<RowEncodedAll<TColumns>, RequiredInsertColumnNames<TColumns>> &
220
+ Partial<Omit<RowEncodedAll<TColumns>, RequiredInsertColumnNames<TColumns>>>
221
+ >
222
+ }
@@ -0,0 +1,14 @@
1
+ // Based on https://stackoverflow.com/a/7616484
2
+ export const hashCode = (str: string) => {
3
+ let hash = 0,
4
+ i,
5
+ chr
6
+ if (str.length === 0) return hash
7
+ for (i = 0; i < str.length; i++) {
8
+ // eslint-disable-next-line unicorn/prefer-code-point
9
+ chr = str.charCodeAt(i)
10
+ hash = (hash << 5) - hash + chr
11
+ hash = Math.trunc(hash) // Convert to 32bit integer
12
+ }
13
+ return hash
14
+ }
@@ -0,0 +1,2 @@
1
+ export * as SqliteDsl from './dsl/mod.js'
2
+ export * as SqliteAst from './ast/sqlite.js'
@@ -0,0 +1 @@
1
+ export { defineEvent, synced, clientOnly } from './EventDef.js'
package/src/schema/mod.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  export * from './system-tables.js'
2
- export * as DbSchema from './table-def.js'
3
- export * from './mutations.js'
2
+ export { SqliteAst, SqliteDsl } from './db-schema/mod.js'
3
+ export * from './EventDef.js'
4
4
  export * from './schema-helpers.js'
5
5
  export * from './schema.js'
6
- export * as MutationEvent from './MutationEvent.js'
6
+ export * as State from './view.js'
7
+ export * as LiveStoreEvent from './LiveStoreEvent.js'
7
8
  export * as EventId from './EventId.js'
9
+ export * as Events from './events.js'
@@ -1,7 +1,7 @@
1
- import { SqliteDsl } from '@livestore/db-schema'
2
1
  import { shouldNeverHappen } from '@livestore/utils'
3
2
  import { pipe, ReadonlyRecord, Schema } from '@livestore/utils/effect'
4
3
 
4
+ import { SqliteDsl } from '../schema/db-schema/mod.js'
5
5
  import type { TableDef, TableDefBase } from './table-def.js'
6
6
 
7
7
  export const getDefaultValuesEncoded = <TTableDef extends TableDef>(
@@ -1,100 +1,101 @@
1
- import type { SqliteDsl } from '@livestore/db-schema'
2
- import { SqliteAst } from '@livestore/db-schema'
3
1
  import { isReadonlyArray, shouldNeverHappen } from '@livestore/utils'
4
2
 
5
3
  import type { MigrationOptions } from '../adapter-types.js'
6
- import { makeDerivedMutationDefsForTable } from '../derived-mutations.js'
7
- import {
8
- type MutationDef,
9
- type MutationDefMap,
10
- type MutationDefRecord,
11
- type RawSqlMutation,
12
- rawSqlMutation,
13
- } from './mutations.js'
4
+ import { tableIsClientDocumentTable } from './client-document-def.js'
5
+ import type { SqliteDsl } from './db-schema/mod.js'
6
+ import { SqliteAst } from './db-schema/mod.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 = new Map()
79
+ const eventsDefsMap = new Map<string, EventDef.AnyWithoutFn>()
76
80
 
77
- if (isReadonlyArray(inputSchema.mutations)) {
78
- for (const mutation of inputSchema.mutations) {
79
- mutations.set(mutation.name, mutation)
81
+ if (isReadonlyArray(inputSchema.events)) {
82
+ for (const eventDef of inputSchema.events) {
83
+ eventsDefsMap.set(eventDef.name, eventDef)
80
84
  }
81
85
  } else {
82
- for (const mutation of Object.values(inputSchema.mutations ?? {})) {
83
- if (mutations.has(mutation.name)) {
84
- 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.`)
85
89
  }
86
- mutations.set(mutation.name, mutation)
90
+ eventsDefsMap.set(eventDef.name, eventDef)
87
91
  }
88
92
  }
89
93
 
90
- mutations.set(rawSqlMutation.name, rawSqlMutation)
94
+ eventsDefsMap.set(rawSqlEvent.name, rawSqlEvent)
91
95
 
92
96
  for (const tableDef of tables.values()) {
93
- if (tableHasDerivedMutations(tableDef)) {
94
- const derivedMutationDefs = makeDerivedMutationDefsForTable(tableDef)
95
- mutations.set(derivedMutationDefs.insert.name, derivedMutationDefs.insert)
96
- mutations.set(derivedMutationDefs.update.name, derivedMutationDefs.update)
97
- mutations.set(derivedMutationDefs.delete.name, derivedMutationDefs.delete)
97
+ if (tableIsClientDocumentTable(tableDef) && eventsDefsMap.has(tableDef.set.name) === false) {
98
+ eventsDefsMap.set(tableDef.set.name, tableDef.set)
98
99
  }
99
100
  }
100
101
 
@@ -106,18 +107,39 @@ export const makeSchema = <TInputSchema extends InputSchema>(
106
107
  return {
107
108
  _Type: LiveStoreSchemaSymbol,
108
109
  _DbSchemaType: Symbol.for('livestore.DbSchemaType') as any,
109
- _MutationDefMapType: Symbol.for('livestore.MutationDefMapType') as any,
110
- tables,
111
- mutations,
112
- migrationOptions: inputSchema.migrations ?? { strategy: 'hard-reset' },
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' },
113
117
  hash,
114
118
  } satisfies LiveStoreSchema
115
119
  }
116
120
 
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}\`.`)
135
+ }
136
+ return { eventDef, materializer }
137
+ }
138
+
117
139
  export namespace FromInputSchema {
118
140
  export type DeriveSchema<TInputSchema extends InputSchema> = LiveStoreSchema<
119
- DbSchemaFromInputSchemaTables<TInputSchema['tables']>,
120
- MutationDefRecordFromInputSchemaMutations<TInputSchema['mutations']>
141
+ DbSchemaFromInputSchemaTables<TInputSchema['state']['tables']>,
142
+ EventDefRecordFromInputSchemaEvents<TInputSchema['events']>
121
143
  >
122
144
 
123
145
  /**
@@ -125,17 +147,17 @@ export namespace FromInputSchema {
125
147
  * - array: we use the table name of each array item (= table definition) as the object key
126
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
127
149
  */
128
- type DbSchemaFromInputSchemaTables<TTables extends InputSchema['tables']> =
150
+ type DbSchemaFromInputSchemaTables<TTables extends InputSchema['state']['tables']> =
129
151
  TTables extends ReadonlyArray<TableDef>
130
152
  ? { [K in TTables[number] as K['sqliteDef']['name']]: K['sqliteDef'] }
131
153
  : TTables extends Record<string, TableDef>
132
154
  ? { [K in keyof TTables as TTables[K]['sqliteDef']['name']]: TTables[K]['sqliteDef'] }
133
155
  : never
134
156
 
135
- type MutationDefRecordFromInputSchemaMutations<TMutations extends InputSchema['mutations']> =
136
- TMutations extends ReadonlyArray<MutationDef.Any>
137
- ? { [K in TMutations[number] as K['name']]: K } & { 'livestore.RawSql': RawSqlMutation }
138
- : TMutations extends { [name: string]: MutationDef.Any }
139
- ? { [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 }
140
162
  : never
141
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
+ }