@livestore/common 0.4.0-dev.9 → 0.5.0-dev.0

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 (580) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +27 -12
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
  4. package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
  5. package/dist/MaterializationJournal.d.ts +44 -0
  6. package/dist/MaterializationJournal.d.ts.map +1 -0
  7. package/dist/MaterializationJournal.js +112 -0
  8. package/dist/MaterializationJournal.js.map +1 -0
  9. package/dist/StateHead.d.ts +26 -0
  10. package/dist/StateHead.d.ts.map +1 -0
  11. package/dist/StateHead.js +50 -0
  12. package/dist/StateHead.js.map +1 -0
  13. package/dist/WorkerTransportError.d.ts +11 -0
  14. package/dist/WorkerTransportError.d.ts.map +1 -0
  15. package/dist/WorkerTransportError.js +11 -0
  16. package/dist/WorkerTransportError.js.map +1 -0
  17. package/dist/__tests__/fixture.d.ts +1 -1
  18. package/dist/__tests__/fixture.d.ts.map +1 -1
  19. package/dist/__tests__/fixture.js +3 -3
  20. package/dist/__tests__/fixture.js.map +1 -1
  21. package/dist/adapter-types.d.ts +59 -57
  22. package/dist/adapter-types.d.ts.map +1 -1
  23. package/dist/adapter-types.js +31 -22
  24. package/dist/adapter-types.js.map +1 -1
  25. package/dist/bounded-collections.d.ts.map +1 -1
  26. package/dist/bounded-collections.js +6 -4
  27. package/dist/bounded-collections.js.map +1 -1
  28. package/dist/debug-info.d.ts +56 -56
  29. package/dist/debug-info.d.ts.map +1 -1
  30. package/dist/debug-info.js +46 -32
  31. package/dist/debug-info.js.map +1 -1
  32. package/dist/defs.d.ts +9 -9
  33. package/dist/defs.js +2 -2
  34. package/dist/devtools/devtools-compatibility.test.d.ts +2 -0
  35. package/dist/devtools/devtools-compatibility.test.d.ts.map +1 -0
  36. package/dist/devtools/devtools-compatibility.test.js +16 -0
  37. package/dist/devtools/devtools-compatibility.test.js.map +1 -0
  38. package/dist/devtools/devtools-messages-client-session.d.ts +531 -312
  39. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  40. package/dist/devtools/devtools-messages-client-session.js +86 -67
  41. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  42. package/dist/devtools/devtools-messages-common.d.ts +32 -35
  43. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  44. package/dist/devtools/devtools-messages-common.js +12 -14
  45. package/dist/devtools/devtools-messages-common.js.map +1 -1
  46. package/dist/devtools/devtools-messages-leader.d.ts +417 -320
  47. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  48. package/dist/devtools/devtools-messages-leader.js +117 -87
  49. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  50. package/dist/devtools/devtools-sessioninfo.d.ts +28 -17
  51. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  52. package/dist/devtools/devtools-sessioninfo.js +12 -6
  53. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  54. package/dist/devtools/mod.d.ts +17 -7
  55. package/dist/devtools/mod.d.ts.map +1 -1
  56. package/dist/devtools/mod.js +19 -8
  57. package/dist/devtools/mod.js.map +1 -1
  58. package/dist/errors.d.ts +52 -46
  59. package/dist/errors.d.ts.map +1 -1
  60. package/dist/errors.js +31 -21
  61. package/dist/errors.js.map +1 -1
  62. package/dist/index.d.ts +7 -1
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +7 -1
  65. package/dist/index.js.map +1 -1
  66. package/dist/leader-thread/LeaderSyncProcessor.d.ts +116 -21
  67. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  68. package/dist/leader-thread/LeaderSyncProcessor.js +596 -470
  69. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  70. package/dist/leader-thread/RejectedPushError.d.ts +138 -0
  71. package/dist/leader-thread/RejectedPushError.d.ts.map +1 -0
  72. package/dist/leader-thread/RejectedPushError.js +97 -0
  73. package/dist/leader-thread/RejectedPushError.js.map +1 -0
  74. package/dist/leader-thread/connection.d.ts +1 -0
  75. package/dist/leader-thread/connection.d.ts.map +1 -1
  76. package/dist/leader-thread/connection.js +10 -9
  77. package/dist/leader-thread/connection.js.map +1 -1
  78. package/dist/leader-thread/eventlog.d.ts +20 -15
  79. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  80. package/dist/leader-thread/eventlog.js +80 -20
  81. package/dist/leader-thread/eventlog.js.map +1 -1
  82. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -2
  83. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  84. package/dist/leader-thread/leader-worker-devtools.js +110 -62
  85. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  86. package/dist/leader-thread/make-leader-thread-layer.d.ts +19 -7
  87. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  88. package/dist/leader-thread/make-leader-thread-layer.js +67 -45
  89. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  90. package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
  91. package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
  92. package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
  93. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
  94. package/dist/leader-thread/materialize-event.d.ts +3 -2
  95. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  96. package/dist/leader-thread/materialize-event.js +32 -9
  97. package/dist/leader-thread/materialize-event.js.map +1 -1
  98. package/dist/leader-thread/mod.d.ts +1 -0
  99. package/dist/leader-thread/mod.d.ts.map +1 -1
  100. package/dist/leader-thread/mod.js +1 -0
  101. package/dist/leader-thread/mod.js.map +1 -1
  102. package/dist/leader-thread/recreate-db.d.ts +2 -2
  103. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  104. package/dist/leader-thread/recreate-db.js +19 -40
  105. package/dist/leader-thread/recreate-db.js.map +1 -1
  106. package/dist/leader-thread/shutdown-channel.d.ts +3 -7
  107. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  108. package/dist/leader-thread/shutdown-channel.js +2 -3
  109. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  110. package/dist/leader-thread/stream-events.d.ts +53 -0
  111. package/dist/leader-thread/stream-events.d.ts.map +1 -0
  112. package/dist/leader-thread/stream-events.js +164 -0
  113. package/dist/leader-thread/stream-events.js.map +1 -0
  114. package/dist/leader-thread/types.d.ts +92 -51
  115. package/dist/leader-thread/types.d.ts.map +1 -1
  116. package/dist/leader-thread/types.js +17 -4
  117. package/dist/leader-thread/types.js.map +1 -1
  118. package/dist/logging.d.ts +15 -0
  119. package/dist/logging.d.ts.map +1 -0
  120. package/dist/logging.js +2 -0
  121. package/dist/logging.js.map +1 -0
  122. package/dist/make-client-session.d.ts +6 -5
  123. package/dist/make-client-session.d.ts.map +1 -1
  124. package/dist/make-client-session.js +10 -7
  125. package/dist/make-client-session.js.map +1 -1
  126. package/dist/materializer-helper.d.ts +6 -7
  127. package/dist/materializer-helper.d.ts.map +1 -1
  128. package/dist/materializer-helper.js +22 -40
  129. package/dist/materializer-helper.js.map +1 -1
  130. package/dist/otel.d.ts +4 -4
  131. package/dist/otel.d.ts.map +1 -1
  132. package/dist/otel.js +8 -8
  133. package/dist/otel.js.map +1 -1
  134. package/dist/rematerialize-from-eventlog.d.ts +3 -3
  135. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  136. package/dist/rematerialize-from-eventlog.js +52 -39
  137. package/dist/rematerialize-from-eventlog.js.map +1 -1
  138. package/dist/schema/EventDef/define.d.ts +161 -0
  139. package/dist/schema/EventDef/define.d.ts.map +1 -0
  140. package/dist/schema/EventDef/define.js +140 -0
  141. package/dist/schema/EventDef/define.js.map +1 -0
  142. package/dist/schema/EventDef/define.test.d.ts +2 -0
  143. package/dist/schema/EventDef/define.test.d.ts.map +1 -0
  144. package/dist/schema/EventDef/define.test.js +23 -0
  145. package/dist/schema/EventDef/define.test.js.map +1 -0
  146. package/dist/schema/EventDef/deprecated.d.ts +94 -0
  147. package/dist/schema/EventDef/deprecated.d.ts.map +1 -0
  148. package/dist/schema/EventDef/deprecated.js +143 -0
  149. package/dist/schema/EventDef/deprecated.js.map +1 -0
  150. package/dist/schema/EventDef/deprecated.test.d.ts +2 -0
  151. package/dist/schema/EventDef/deprecated.test.d.ts.map +1 -0
  152. package/dist/schema/EventDef/deprecated.test.js +95 -0
  153. package/dist/schema/EventDef/deprecated.test.js.map +1 -0
  154. package/dist/schema/EventDef/event-def.d.ts +110 -0
  155. package/dist/schema/EventDef/event-def.d.ts.map +1 -0
  156. package/dist/schema/EventDef/event-def.js +2 -0
  157. package/dist/schema/EventDef/event-def.js.map +1 -0
  158. package/dist/schema/EventDef/facts.d.ts +118 -0
  159. package/dist/schema/EventDef/facts.d.ts.map +1 -0
  160. package/dist/schema/EventDef/facts.js +53 -0
  161. package/dist/schema/EventDef/facts.js.map +1 -0
  162. package/dist/schema/EventDef/materializer.d.ts +155 -0
  163. package/dist/schema/EventDef/materializer.d.ts.map +1 -0
  164. package/dist/schema/EventDef/materializer.js +83 -0
  165. package/dist/schema/EventDef/materializer.js.map +1 -0
  166. package/dist/schema/EventDef/mod.d.ts +6 -0
  167. package/dist/schema/EventDef/mod.d.ts.map +1 -0
  168. package/dist/schema/EventDef/mod.js +6 -0
  169. package/dist/schema/EventDef/mod.js.map +1 -0
  170. package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
  171. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
  172. package/dist/schema/EventSequenceNumber/client.js +192 -0
  173. package/dist/schema/EventSequenceNumber/client.js.map +1 -0
  174. package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
  175. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
  176. package/dist/schema/EventSequenceNumber/global.js +14 -0
  177. package/dist/schema/EventSequenceNumber/global.js.map +1 -0
  178. package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
  179. package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
  180. package/dist/schema/EventSequenceNumber/mod.js +37 -0
  181. package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
  182. package/dist/schema/EventSequenceNumber.test.js +44 -44
  183. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  184. package/dist/schema/LiveStoreEvent/client.d.ts +168 -0
  185. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
  186. package/dist/schema/LiveStoreEvent/client.js +179 -0
  187. package/dist/schema/LiveStoreEvent/client.js.map +1 -0
  188. package/dist/schema/LiveStoreEvent/client.test.d.ts +2 -0
  189. package/dist/schema/LiveStoreEvent/client.test.d.ts.map +1 -0
  190. package/dist/schema/LiveStoreEvent/client.test.js +120 -0
  191. package/dist/schema/LiveStoreEvent/client.test.js.map +1 -0
  192. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
  193. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
  194. package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
  195. package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
  196. package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
  197. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
  198. package/dist/schema/LiveStoreEvent/global.js +31 -0
  199. package/dist/schema/LiveStoreEvent/global.js.map +1 -0
  200. package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
  201. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
  202. package/dist/schema/LiveStoreEvent/input.js +26 -0
  203. package/dist/schema/LiveStoreEvent/input.js.map +1 -0
  204. package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
  205. package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
  206. package/dist/schema/LiveStoreEvent/mod.js +5 -0
  207. package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
  208. package/dist/schema/events.d.ts +1 -1
  209. package/dist/schema/events.d.ts.map +1 -1
  210. package/dist/schema/events.js +1 -1
  211. package/dist/schema/events.js.map +1 -1
  212. package/dist/schema/mod.d.ts +7 -4
  213. package/dist/schema/mod.d.ts.map +1 -1
  214. package/dist/schema/mod.js +6 -4
  215. package/dist/schema/mod.js.map +1 -1
  216. package/dist/schema/schema.d.ts +16 -1
  217. package/dist/schema/schema.d.ts.map +1 -1
  218. package/dist/schema/schema.js +34 -5
  219. package/dist/schema/schema.js.map +1 -1
  220. package/dist/schema/state/sqlite/client-document-def.d.ts +14 -18
  221. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  222. package/dist/schema/state/sqlite/client-document-def.js +54 -30
  223. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  224. package/dist/schema/state/sqlite/client-document-def.test.js +146 -6
  225. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  226. package/dist/schema/state/sqlite/column-annotations.d.ts +13 -13
  227. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  228. package/dist/schema/state/sqlite/column-annotations.js +13 -15
  229. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  230. package/dist/schema/state/sqlite/column-annotations.test.js +19 -43
  231. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  232. package/dist/schema/state/sqlite/column-def.d.ts +1 -1
  233. package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
  234. package/dist/schema/state/sqlite/column-def.js +132 -57
  235. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  236. package/dist/schema/state/sqlite/column-def.test.js +155 -70
  237. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  238. package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
  239. package/dist/schema/state/sqlite/column-spec.js +30 -12
  240. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  241. package/dist/schema/state/sqlite/column-spec.test.js +26 -17
  242. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  243. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -2
  244. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
  245. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +15 -6
  246. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  247. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +25 -19
  248. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  249. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +22 -16
  250. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  251. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +28 -17
  252. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
  253. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +14 -12
  254. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  255. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +6 -4
  256. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  257. package/dist/schema/state/sqlite/mod.d.ts +3 -5
  258. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  259. package/dist/schema/state/sqlite/mod.js +6 -8
  260. package/dist/schema/state/sqlite/mod.js.map +1 -1
  261. package/dist/schema/state/sqlite/persistence.d.ts +11 -0
  262. package/dist/schema/state/sqlite/persistence.d.ts.map +1 -0
  263. package/dist/schema/state/sqlite/persistence.js +10 -0
  264. package/dist/schema/state/sqlite/persistence.js.map +1 -0
  265. package/dist/schema/state/sqlite/query-builder/api.d.ts +58 -29
  266. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  267. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  268. package/dist/schema/state/sqlite/query-builder/astToSql.js +105 -24
  269. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  270. package/dist/schema/state/sqlite/query-builder/impl.d.ts +4 -2
  271. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  272. package/dist/schema/state/sqlite/query-builder/impl.js +42 -27
  273. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  274. package/dist/schema/state/sqlite/query-builder/impl.test.js +402 -498
  275. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  276. package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
  277. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
  278. package/dist/schema/state/sqlite/schema-helpers.js +24 -14
  279. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  280. package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
  281. package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
  282. package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
  283. package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
  284. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts +515 -0
  285. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
  286. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
  287. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
  288. package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
  289. package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
  290. package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
  291. package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
  292. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +678 -0
  293. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
  294. package/dist/schema/state/sqlite/system-tables/state-tables.js +87 -0
  295. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
  296. package/dist/schema/state/sqlite/table-def.d.ts +19 -20
  297. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  298. package/dist/schema/state/sqlite/table-def.js +54 -4
  299. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  300. package/dist/schema/state/sqlite/table-def.test.js +226 -20
  301. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  302. package/dist/schema/unknown-events.d.ts +47 -0
  303. package/dist/schema/unknown-events.d.ts.map +1 -0
  304. package/dist/schema/unknown-events.js +70 -0
  305. package/dist/schema/unknown-events.js.map +1 -0
  306. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
  307. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
  308. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
  309. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
  310. package/dist/schema-management/common.js +2 -2
  311. package/dist/schema-management/common.js.map +1 -1
  312. package/dist/schema-management/migrations.d.ts +32 -2
  313. package/dist/schema-management/migrations.d.ts.map +1 -1
  314. package/dist/schema-management/migrations.js +38 -6
  315. package/dist/schema-management/migrations.js.map +1 -1
  316. package/dist/schema-management/validate-schema.d.ts +3 -3
  317. package/dist/schema-management/validate-schema.d.ts.map +1 -1
  318. package/dist/schema-management/validate-schema.js +2 -2
  319. package/dist/schema-management/validate-schema.js.map +1 -1
  320. package/dist/session-id-symbol.d.ts +29 -0
  321. package/dist/session-id-symbol.d.ts.map +1 -0
  322. package/dist/session-id-symbol.js +44 -0
  323. package/dist/session-id-symbol.js.map +1 -0
  324. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  325. package/dist/sql-queries/sql-queries.js +26 -16
  326. package/dist/sql-queries/sql-queries.js.map +1 -1
  327. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  328. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  329. package/dist/sql-queries/types.d.ts +6 -7
  330. package/dist/sql-queries/types.d.ts.map +1 -1
  331. package/dist/sql-queries/types.js.map +1 -1
  332. package/dist/sqlite-db-helper.d.ts +21 -1
  333. package/dist/sqlite-db-helper.d.ts.map +1 -1
  334. package/dist/sqlite-db-helper.js +40 -5
  335. package/dist/sqlite-db-helper.js.map +1 -1
  336. package/dist/sqlite-types.d.ts +8 -11
  337. package/dist/sqlite-types.d.ts.map +1 -1
  338. package/dist/sqlite-types.js +3 -3
  339. package/dist/sqlite-types.js.map +1 -1
  340. package/dist/sync/ClientSessionSyncProcessor.d.ts +47 -25
  341. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  342. package/dist/sync/ClientSessionSyncProcessor.js +269 -154
  343. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  344. package/dist/sync/errors.d.ts +12 -51
  345. package/dist/sync/errors.d.ts.map +1 -1
  346. package/dist/sync/errors.js +7 -24
  347. package/dist/sync/errors.js.map +1 -1
  348. package/dist/sync/index.d.ts +2 -0
  349. package/dist/sync/index.d.ts.map +1 -1
  350. package/dist/sync/index.js +2 -0
  351. package/dist/sync/index.js.map +1 -1
  352. package/dist/sync/mock-sync-backend.d.ts +11 -10
  353. package/dist/sync/mock-sync-backend.d.ts.map +1 -1
  354. package/dist/sync/mock-sync-backend.js +97 -74
  355. package/dist/sync/mock-sync-backend.js.map +1 -1
  356. package/dist/sync/mock-sync-backend.test.d.ts +2 -0
  357. package/dist/sync/mock-sync-backend.test.d.ts.map +1 -0
  358. package/dist/sync/mock-sync-backend.test.js +49 -0
  359. package/dist/sync/mock-sync-backend.test.js.map +1 -0
  360. package/dist/sync/next/compact-events.d.ts.map +1 -1
  361. package/dist/sync/next/compact-events.js +11 -12
  362. package/dist/sync/next/compact-events.js.map +1 -1
  363. package/dist/sync/next/facts.d.ts +5 -5
  364. package/dist/sync/next/facts.d.ts.map +1 -1
  365. package/dist/sync/next/facts.js +7 -8
  366. package/dist/sync/next/facts.js.map +1 -1
  367. package/dist/sync/next/history-dag-common.d.ts +58 -15
  368. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  369. package/dist/sync/next/history-dag-common.js +219 -9
  370. package/dist/sync/next/history-dag-common.js.map +1 -1
  371. package/dist/sync/next/history-dag.d.ts.map +1 -1
  372. package/dist/sync/next/history-dag.js +12 -11
  373. package/dist/sync/next/history-dag.js.map +1 -1
  374. package/dist/sync/next/rebase-events.d.ts +5 -5
  375. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  376. package/dist/sync/next/rebase-events.js +6 -6
  377. package/dist/sync/next/rebase-events.js.map +1 -1
  378. package/dist/sync/next/test/compact-events.calculator.test.js +4 -4
  379. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  380. package/dist/sync/next/test/compact-events.test.d.ts.map +1 -1
  381. package/dist/sync/next/test/compact-events.test.js +2 -2
  382. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  383. package/dist/sync/next/test/event-fixtures.d.ts +9 -9
  384. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  385. package/dist/sync/next/test/event-fixtures.js +12 -12
  386. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  387. package/dist/sync/next/test/history-dag-common.test.d.ts +2 -0
  388. package/dist/sync/next/test/history-dag-common.test.d.ts.map +1 -0
  389. package/dist/sync/next/test/history-dag-common.test.js +73 -0
  390. package/dist/sync/next/test/history-dag-common.test.js.map +1 -0
  391. package/dist/sync/sync-backend-kv.d.ts +3 -3
  392. package/dist/sync/sync-backend-kv.d.ts.map +1 -1
  393. package/dist/sync/sync-backend-kv.js +6 -4
  394. package/dist/sync/sync-backend-kv.js.map +1 -1
  395. package/dist/sync/sync-backend.d.ts +41 -21
  396. package/dist/sync/sync-backend.d.ts.map +1 -1
  397. package/dist/sync/sync-backend.js +45 -4
  398. package/dist/sync/sync-backend.js.map +1 -1
  399. package/dist/sync/sync.d.ts +23 -2
  400. package/dist/sync/sync.d.ts.map +1 -1
  401. package/dist/sync/syncstate.d.ts +115 -191
  402. package/dist/sync/syncstate.d.ts.map +1 -1
  403. package/dist/sync/syncstate.js +108 -129
  404. package/dist/sync/syncstate.js.map +1 -1
  405. package/dist/sync/syncstate.test.js +289 -161
  406. package/dist/sync/syncstate.test.js.map +1 -1
  407. package/dist/sync/transport-chunking.d.ts +35 -0
  408. package/dist/sync/transport-chunking.d.ts.map +1 -0
  409. package/dist/sync/transport-chunking.js +47 -0
  410. package/dist/sync/transport-chunking.js.map +1 -0
  411. package/dist/sync/validate-push-payload.d.ts +2 -2
  412. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  413. package/dist/sync/validate-push-payload.js +4 -6
  414. package/dist/sync/validate-push-payload.js.map +1 -1
  415. package/dist/testing/event-factory.d.ts +3 -3
  416. package/dist/testing/event-factory.d.ts.map +1 -1
  417. package/dist/testing/event-factory.js +5 -7
  418. package/dist/testing/event-factory.js.map +1 -1
  419. package/dist/util.d.ts +11 -4
  420. package/dist/util.d.ts.map +1 -1
  421. package/dist/util.js +21 -4
  422. package/dist/util.js.map +1 -1
  423. package/dist/version.d.ts +24 -5
  424. package/dist/version.d.ts.map +1 -1
  425. package/dist/version.js +25 -8
  426. package/dist/version.js.map +1 -1
  427. package/package.json +50 -16
  428. package/src/ClientSessionLeaderThreadProxy.ts +27 -12
  429. package/src/MaterializationJournal.ts +184 -0
  430. package/src/StateHead.ts +80 -0
  431. package/src/WorkerTransportError.ts +12 -0
  432. package/src/__tests__/fixture.ts +3 -3
  433. package/src/adapter-types.ts +62 -56
  434. package/src/bounded-collections.ts +6 -5
  435. package/src/debug-info.ts +54 -43
  436. package/src/defs.ts +2 -2
  437. package/src/devtools/devtools-compatibility.test.ts +19 -0
  438. package/src/devtools/devtools-messages-client-session.ts +72 -63
  439. package/src/devtools/devtools-messages-common.ts +18 -22
  440. package/src/devtools/devtools-messages-leader.ts +89 -68
  441. package/src/devtools/devtools-sessioninfo.ts +17 -12
  442. package/src/devtools/mod.ts +15 -7
  443. package/src/errors.ts +58 -38
  444. package/src/index.ts +11 -1
  445. package/src/leader-thread/LeaderSyncProcessor.ts +927 -674
  446. package/src/leader-thread/RejectedPushError.ts +119 -0
  447. package/src/leader-thread/connection.ts +13 -9
  448. package/src/leader-thread/eventlog.ts +114 -41
  449. package/src/leader-thread/leader-worker-devtools.ts +223 -124
  450. package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
  451. package/src/leader-thread/make-leader-thread-layer.ts +170 -82
  452. package/src/leader-thread/materialize-event.ts +51 -16
  453. package/src/leader-thread/mod.ts +1 -0
  454. package/src/leader-thread/recreate-db.ts +26 -61
  455. package/src/leader-thread/shutdown-channel.ts +3 -18
  456. package/src/leader-thread/stream-events.ts +209 -0
  457. package/src/leader-thread/types.ts +77 -65
  458. package/src/logging.ts +15 -0
  459. package/src/make-client-session.ts +16 -10
  460. package/src/materializer-helper.ts +31 -49
  461. package/src/otel.ts +15 -13
  462. package/src/rematerialize-from-eventlog.ts +106 -93
  463. package/src/schema/EventDef/define.test.ts +28 -0
  464. package/src/schema/EventDef/define.ts +218 -0
  465. package/src/schema/EventDef/deprecated.test.ts +122 -0
  466. package/src/schema/EventDef/deprecated.ts +172 -0
  467. package/src/schema/EventDef/event-def.ts +123 -0
  468. package/src/schema/EventDef/facts.ts +135 -0
  469. package/src/schema/EventDef/materializer.ts +172 -0
  470. package/src/schema/EventDef/mod.ts +5 -0
  471. package/src/schema/EventSequenceNumber/client.ts +256 -0
  472. package/src/schema/EventSequenceNumber/global.ts +19 -0
  473. package/src/schema/EventSequenceNumber/mod.ts +37 -0
  474. package/src/schema/EventSequenceNumber.test.ts +72 -53
  475. package/src/schema/LiveStoreEvent/client.test.ts +142 -0
  476. package/src/schema/LiveStoreEvent/client.ts +236 -0
  477. package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
  478. package/src/schema/LiveStoreEvent/global.ts +45 -0
  479. package/src/schema/LiveStoreEvent/input.ts +63 -0
  480. package/src/schema/LiveStoreEvent/mod.ts +4 -0
  481. package/src/schema/events.ts +1 -1
  482. package/src/schema/mod.ts +7 -4
  483. package/src/schema/schema.ts +48 -6
  484. package/src/schema/state/sqlite/client-document-def.test.ts +172 -14
  485. package/src/schema/state/sqlite/client-document-def.ts +126 -98
  486. package/src/schema/state/sqlite/column-annotations.test.ts +27 -45
  487. package/src/schema/state/sqlite/column-annotations.ts +27 -30
  488. package/src/schema/state/sqlite/column-def.test.ts +186 -77
  489. package/src/schema/state/sqlite/column-def.ts +169 -62
  490. package/src/schema/state/sqlite/column-spec.test.ts +34 -19
  491. package/src/schema/state/sqlite/column-spec.ts +38 -11
  492. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +17 -7
  493. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +123 -63
  494. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +37 -17
  495. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +65 -45
  496. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +48 -40
  497. package/src/schema/state/sqlite/mod.ts +9 -12
  498. package/src/schema/state/sqlite/persistence.ts +11 -0
  499. package/src/schema/state/sqlite/query-builder/api.ts +61 -23
  500. package/src/schema/state/sqlite/query-builder/astToSql.ts +117 -23
  501. package/src/schema/state/sqlite/query-builder/impl.test.ts +489 -551
  502. package/src/schema/state/sqlite/query-builder/impl.ts +43 -26
  503. package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
  504. package/src/schema/state/sqlite/schema-helpers.ts +30 -22
  505. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
  506. package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
  507. package/src/schema/state/sqlite/system-tables/state-tables.ts +109 -0
  508. package/src/schema/state/sqlite/table-def.test.ts +295 -46
  509. package/src/schema/state/sqlite/table-def.ts +109 -64
  510. package/src/schema/unknown-events.ts +132 -0
  511. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +88 -0
  512. package/src/schema-management/common.ts +2 -2
  513. package/src/schema-management/migrations.ts +42 -9
  514. package/src/schema-management/validate-schema.ts +3 -3
  515. package/src/session-id-symbol.ts +59 -0
  516. package/src/sql-queries/sql-queries.ts +26 -18
  517. package/src/sql-queries/sql-query-builder.ts +1 -0
  518. package/src/sql-queries/types.ts +6 -7
  519. package/src/sqlite-db-helper.ts +67 -5
  520. package/src/sqlite-types.ts +9 -11
  521. package/src/sync/ClientSessionSyncProcessor.ts +388 -194
  522. package/src/sync/errors.ts +18 -28
  523. package/src/sync/index.ts +2 -0
  524. package/src/sync/mock-sync-backend.test.ts +78 -0
  525. package/src/sync/mock-sync-backend.ts +196 -108
  526. package/src/sync/next/compact-events.ts +10 -11
  527. package/src/sync/next/facts.ts +13 -14
  528. package/src/sync/next/history-dag-common.ts +306 -26
  529. package/src/sync/next/history-dag.ts +20 -13
  530. package/src/sync/next/rebase-events.ts +12 -12
  531. package/src/sync/next/test/compact-events.calculator.test.ts +5 -4
  532. package/src/sync/next/test/compact-events.test.ts +4 -3
  533. package/src/sync/next/test/event-fixtures.ts +14 -14
  534. package/src/sync/next/test/history-dag-common.test.ts +87 -0
  535. package/src/sync/sync-backend-kv.ts +7 -4
  536. package/src/sync/sync-backend.ts +75 -26
  537. package/src/sync/sync.ts +24 -2
  538. package/src/sync/syncstate.test.ts +657 -442
  539. package/src/sync/syncstate.ts +175 -160
  540. package/src/sync/transport-chunking.ts +85 -0
  541. package/src/sync/validate-push-payload.ts +6 -8
  542. package/src/testing/event-factory.ts +10 -12
  543. package/src/util.ts +20 -11
  544. package/src/version.ts +32 -8
  545. package/dist/schema/EventDef.d.ts +0 -126
  546. package/dist/schema/EventDef.d.ts.map +0 -1
  547. package/dist/schema/EventDef.js +0 -46
  548. package/dist/schema/EventDef.js.map +0 -1
  549. package/dist/schema/EventSequenceNumber.d.ts +0 -80
  550. package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
  551. package/dist/schema/EventSequenceNumber.js +0 -139
  552. package/dist/schema/EventSequenceNumber.js.map +0 -1
  553. package/dist/schema/LiveStoreEvent.d.ts +0 -306
  554. package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
  555. package/dist/schema/LiveStoreEvent.js +0 -147
  556. package/dist/schema/LiveStoreEvent.js.map +0 -1
  557. package/dist/schema/state/sqlite/system-tables.d.ts +0 -976
  558. package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
  559. package/dist/schema/state/sqlite/system-tables.js +0 -81
  560. package/dist/schema/state/sqlite/system-tables.js.map +0 -1
  561. package/dist/sql-queries/misc.d.ts +0 -2
  562. package/dist/sql-queries/misc.d.ts.map +0 -1
  563. package/dist/sql-queries/misc.js +0 -2
  564. package/dist/sql-queries/misc.js.map +0 -1
  565. package/dist/sync/next/graphology.d.ts +0 -8
  566. package/dist/sync/next/graphology.d.ts.map +0 -1
  567. package/dist/sync/next/graphology.js +0 -30
  568. package/dist/sync/next/graphology.js.map +0 -1
  569. package/dist/sync/next/graphology_.d.ts +0 -3
  570. package/dist/sync/next/graphology_.d.ts.map +0 -1
  571. package/dist/sync/next/graphology_.js +0 -3
  572. package/dist/sync/next/graphology_.js.map +0 -1
  573. package/src/schema/EventDef.ts +0 -222
  574. package/src/schema/EventSequenceNumber.ts +0 -199
  575. package/src/schema/LiveStoreEvent.ts +0 -286
  576. package/src/schema/state/sqlite/system-tables.ts +0 -106
  577. package/src/sql-queries/misc.ts +0 -2
  578. package/src/sync/next/ambient.d.ts +0 -3
  579. package/src/sync/next/graphology.ts +0 -41
  580. package/src/sync/next/graphology_.ts +0 -2
@@ -1,6 +1,5 @@
1
- /** biome-ignore-all lint/complexity/noArguments: using arguments is fine here */
2
1
  import { casesHandled, shouldNeverHappen } from '@livestore/utils'
3
- import { Match, Option, Predicate, Schema } from '@livestore/utils/effect'
2
+ import { Match, Option, Predicate, Schema, Struct } from '@livestore/utils/effect'
4
3
 
5
4
  import type { TableDefBase } from '../table-def.ts'
6
5
  import type { QueryBuilder, QueryBuilderAst } from './api.ts'
@@ -9,7 +8,7 @@ import { astToSql } from './astToSql.ts'
9
8
  export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
10
9
  tableDef: TTableDef,
11
10
  ast: QueryBuilderAst = emptyAst(tableDef),
12
- ): QueryBuilder<TResult, TTableDef, never> => {
11
+ ): QueryBuilder<TResult, TTableDef> => {
13
12
  const api = {
14
13
  select() {
15
14
  assertSelectQueryBuilderAst(ast)
@@ -18,24 +17,26 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
18
17
 
19
18
  // Pluck if there's only one column selected
20
19
  if (params.length === 1) {
20
+ // oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- arguments-based overload dispatch requires manual narrowing
21
21
  const [col] = params as any as [string]
22
22
  return makeQueryBuilder(tableDef, {
23
23
  ...ast,
24
- resultSchemaSingle: ast.resultSchemaSingle.pipe(Schema.pluck(col)),
24
+ resultSchemaSingle: ast.tableDef.rowSchema.pipe(Schema.pluck(col)),
25
25
  select: { columns: [col] },
26
26
  })
27
27
  }
28
28
 
29
+ // oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- arguments-based overload dispatch requires manual narrowing
29
30
  const columns = params as unknown as ReadonlyArray<string>
30
31
 
32
+ // oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- query builder return type depends on AST state; consumer type safety enforced by api.ts
31
33
  return makeQueryBuilder(tableDef, {
32
34
  ...ast,
33
35
  resultSchemaSingle:
34
- columns.length === 0 ? ast.resultSchemaSingle : ast.resultSchemaSingle.pipe(Schema.pick(...columns)),
36
+ columns.length === 0 ? ast.resultSchemaSingle : ast.tableDef.rowSchema.mapFields(Struct.pick(columns)),
35
37
  select: { columns },
36
38
  }) as any
37
39
  },
38
- // biome-ignore lint/complexity/useArrowFunction: prefer function over arrow function for this case
39
40
  where: function () {
40
41
  if (ast._tag === 'InsertQuery') return invalidQueryBuilder('Cannot use where with insert')
41
42
  if (ast._tag === 'RowQuery') return invalidQueryBuilder('Cannot use where with row')
@@ -45,8 +46,9 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
45
46
  const newOps = Object.entries(params)
46
47
  .filter(([, value]) => value !== undefined)
47
48
  .map<QueryBuilderAst.Where>(([col, value]) =>
48
- Predicate.hasProperty(value, 'op') && Predicate.hasProperty(value, 'value')
49
- ? ({ col, op: value.op, value: value.value } as any)
49
+ Predicate.hasProperty(value, 'op') === true && Predicate.hasProperty(value, 'value') === true
50
+ ? // oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- where clause construction; shape validated at runtime
51
+ ({ col, op: value.op, value: value.value } as any)
50
52
  : { col, op: '=', value },
51
53
  )
52
54
 
@@ -55,6 +57,7 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
55
57
  case 'SelectQuery':
56
58
  case 'UpdateQuery':
57
59
  case 'DeleteQuery': {
60
+ // oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- query builder return type depends on AST state; consumer type safety enforced by api.ts
58
61
  return makeQueryBuilder(tableDef, {
59
62
  ...ast,
60
63
  where: [...ast.where, ...newOps],
@@ -75,6 +78,7 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
75
78
  case 'SelectQuery':
76
79
  case 'UpdateQuery':
77
80
  case 'DeleteQuery': {
81
+ // oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- query builder return type depends on AST state; consumer type safety enforced by api.ts
78
82
  return makeQueryBuilder(tableDef, {
79
83
  ...ast,
80
84
  where: [...ast.where, { col, op, value }],
@@ -92,6 +96,7 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
92
96
  if (arguments.length === 0 || arguments.length > 2) return invalidQueryBuilder()
93
97
 
94
98
  if (arguments.length === 1) {
99
+ // oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- arguments-based overload dispatch requires manual narrowing
95
100
  const params = arguments[0] as QueryBuilder.OrderByParams<TTableDef>
96
101
  return makeQueryBuilder(tableDef, {
97
102
  ...ast,
@@ -99,8 +104,10 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
99
104
  })
100
105
  }
101
106
 
107
+ // oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- arguments-based overload dispatch requires manual narrowing
102
108
  const [col, direction] = arguments as any as [keyof TTableDef['sqliteDef']['columns'] & string, 'asc' | 'desc']
103
109
 
110
+ // oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- query builder return type depends on AST state; consumer type safety enforced by api.ts
104
111
  return makeQueryBuilder(tableDef, {
105
112
  ...ast,
106
113
  orderBy: [...ast.orderBy, { col, direction }],
@@ -117,14 +124,19 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
117
124
  return makeQueryBuilder(tableDef, { ...ast, offset: Option.some(offset) })
118
125
  },
119
126
  count: () => {
120
- if (isRowQuery(ast) || ast._tag === 'InsertQuery' || ast._tag === 'UpdateQuery' || ast._tag === 'DeleteQuery')
127
+ if (
128
+ isRowQuery(ast) === true ||
129
+ ast._tag === 'InsertQuery' ||
130
+ ast._tag === 'UpdateQuery' ||
131
+ ast._tag === 'DeleteQuery'
132
+ )
121
133
  return invalidQueryBuilder()
122
134
 
123
135
  return makeQueryBuilder(tableDef, {
124
136
  _tag: 'CountQuery',
125
137
  tableDef,
126
138
  where: ast.where,
127
- resultSchema: Schema.Struct({ count: Schema.Number }).pipe(
139
+ resultSchema: Schema.Struct({ count: Schema.Finite }).pipe(
128
140
  Schema.pluck('count'),
129
141
  Schema.Array,
130
142
  Schema.headOrElse(),
@@ -172,6 +184,7 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
172
184
  insert: (values) => {
173
185
  const filteredValues = Object.fromEntries(Object.entries(values).filter(([, value]) => value !== undefined))
174
186
 
187
+ // oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- query builder return type depends on AST state; consumer type safety enforced by api.ts
175
188
  return makeQueryBuilder(tableDef, {
176
189
  _tag: 'InsertQuery',
177
190
  tableDef,
@@ -186,7 +199,7 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
186
199
  action: 'ignore' | 'replace' | 'update',
187
200
  updateValues?: Record<string, unknown>,
188
201
  ) => {
189
- const targets = Array.isArray(targetOrTargets) ? targetOrTargets : [targetOrTargets]
202
+ const targets = Array.isArray(targetOrTargets) === true ? targetOrTargets : [targetOrTargets]
190
203
 
191
204
  assertInsertQueryBuilderAst(ast)
192
205
 
@@ -200,6 +213,7 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
200
213
  Match.exhaustive,
201
214
  )
202
215
 
216
+ // oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- query builder return type depends on AST state; consumer type safety enforced by api.ts
203
217
  return makeQueryBuilder(tableDef, {
204
218
  ...ast,
205
219
  onConflict,
@@ -209,10 +223,11 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
209
223
  returning: (...columns) => {
210
224
  assertWriteQueryBuilderAst(ast)
211
225
 
226
+ // oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- query builder return type depends on AST state; consumer type safety enforced by api.ts
212
227
  return makeQueryBuilder(tableDef, {
213
228
  ...ast,
214
229
  returning: columns,
215
- resultSchema: tableDef.rowSchema.pipe(Schema.pick(...columns), Schema.Array),
230
+ resultSchema: tableDef.rowSchema.mapFields(Struct.pick(columns)).pipe(Schema.Array),
216
231
  }) as any
217
232
  },
218
233
 
@@ -222,6 +237,7 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
222
237
  // Preserve where clauses if coming from a SelectQuery
223
238
  const whereClause = ast._tag === 'SelectQuery' ? ast.where : []
224
239
 
240
+ // oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- query builder return type depends on AST state; consumer type safety enforced by api.ts
225
241
  return makeQueryBuilder(tableDef, {
226
242
  _tag: 'UpdateQuery',
227
243
  tableDef,
@@ -236,6 +252,7 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
236
252
  // Preserve where clauses if coming from a SelectQuery
237
253
  const whereClause = ast._tag === 'SelectQuery' ? ast.where : []
238
254
 
255
+ // oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- query builder return type depends on AST state; consumer type safety enforced by api.ts
239
256
  return makeQueryBuilder(tableDef, {
240
257
  _tag: 'DeleteQuery',
241
258
  tableDef,
@@ -249,6 +266,7 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
249
266
  return {
250
267
  [QueryBuilderTypeId]: QueryBuilderTypeId,
251
268
  [QueryBuilderAstSymbol]: ast,
269
+ // oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- phantom type field for generic inference only
252
270
  ResultType: 'only-for-type-inference' as TResult,
253
271
  asSql: () => astToSql(ast),
254
272
  toString: () => {
@@ -278,19 +296,19 @@ const emptyAst = (tableDef: TableDefBase): QueryBuilderAst.SelectQuery => ({
278
296
 
279
297
  // Helper functions
280
298
 
281
- function assertSelectQueryBuilderAst(ast: QueryBuilderAst): asserts ast is QueryBuilderAst.SelectQuery {
299
+ const assertSelectQueryBuilderAst: (ast: QueryBuilderAst) => asserts ast is QueryBuilderAst.SelectQuery = (ast) => {
282
300
  if (ast._tag !== 'SelectQuery') {
283
301
  return shouldNeverHappen(`Expected SelectQuery but got ${ast._tag}`)
284
302
  }
285
303
  }
286
304
 
287
- function assertInsertQueryBuilderAst(ast: QueryBuilderAst): asserts ast is QueryBuilderAst.InsertQuery {
305
+ const assertInsertQueryBuilderAst: (ast: QueryBuilderAst) => asserts ast is QueryBuilderAst.InsertQuery = (ast) => {
288
306
  if (ast._tag !== 'InsertQuery') {
289
307
  return shouldNeverHappen(`Expected InsertQuery but got ${ast._tag}`)
290
308
  }
291
309
  }
292
310
 
293
- function assertWriteQueryBuilderAst(ast: QueryBuilderAst): asserts ast is QueryBuilderAst.WriteQuery {
311
+ const assertWriteQueryBuilderAst: (ast: QueryBuilderAst) => asserts ast is QueryBuilderAst.WriteQuery = (ast) => {
294
312
  if (ast._tag !== 'InsertQuery' && ast._tag !== 'UpdateQuery' && ast._tag !== 'DeleteQuery') {
295
313
  return shouldNeverHappen(`Expected WriteQuery but got ${ast._tag}`)
296
314
  }
@@ -299,10 +317,10 @@ function assertWriteQueryBuilderAst(ast: QueryBuilderAst): asserts ast is QueryB
299
317
  const isRowQuery = (ast: QueryBuilderAst): ast is QueryBuilderAst.RowQuery => ast._tag === 'RowQuery'
300
318
 
301
319
  export const invalidQueryBuilder = (msg?: string) => {
302
- return shouldNeverHappen(`Invalid query builder${msg ? `: ${msg}` : ''}`)
320
+ return shouldNeverHappen(`Invalid query builder${msg !== undefined ? `: ${msg}` : ''}`)
303
321
  }
304
322
 
305
- export const getResultSchema = (qb: QueryBuilder<any, any, any>): Schema.Schema<any> => {
323
+ export const getResultSchema = (qb: QueryBuilder<any, any, any>) => {
306
324
  const queryAst = qb[QueryBuilderAstSymbol]
307
325
  switch (queryAst._tag) {
308
326
  case 'SelectQuery': {
@@ -317,36 +335,35 @@ export const getResultSchema = (qb: QueryBuilder<any, any, any>): Schema.Schema<
317
335
  return arraySchema.pipe(Schema.headOrElse())
318
336
  } else {
319
337
  const fallbackValue = queryAst.pickFirst.fallback()
320
- return Schema.Union(arraySchema, Schema.Tuple(Schema.Literal(fallbackValue))).pipe(
338
+ return Schema.Array(Schema.Union([queryAst.resultSchemaSingle, Schema.Literal(fallbackValue)])).pipe(
321
339
  Schema.headOrElse(() => fallbackValue),
322
340
  )
323
341
  }
324
342
  }
325
343
  case 'CountQuery': {
326
- return Schema.Struct({ count: Schema.Number }).pipe(Schema.pluck('count'), Schema.Array, Schema.headOrElse())
344
+ return Schema.Struct({ count: Schema.Finite }).pipe(Schema.pluck('count'), Schema.Array, Schema.headOrElse())
327
345
  }
328
346
  case 'InsertQuery':
329
347
  case 'UpdateQuery':
330
348
  case 'DeleteQuery': {
331
349
  // For write operations with RETURNING clause, we need to return the appropriate schema
332
- if (queryAst.returning && queryAst.returning.length > 0) {
350
+ if (queryAst.returning !== undefined && queryAst.returning.length > 0) {
333
351
  // Create a schema for the returned columns
334
- return queryAst.tableDef.rowSchema.pipe(Schema.pick(...queryAst.returning), Schema.Array)
352
+ return queryAst.tableDef.rowSchema.mapFields(Struct.pick(queryAst.returning)).pipe(Schema.Array)
335
353
  }
336
354
 
337
355
  // For write operations without RETURNING, the result is the number of affected rows
338
- return Schema.Number
356
+ return Schema.Finite
339
357
  }
340
358
  case 'RowQuery': {
341
359
  return queryAst.tableDef.rowSchema.pipe(
342
360
  Schema.pluck('value'),
343
- Schema.annotations({ title: `${queryAst.tableDef.sqliteDef.name}.value` }),
361
+ Schema.annotate({ title: `${queryAst.tableDef.sqliteDef.name}.value` }),
344
362
  Schema.Array,
345
363
  Schema.headOrElse(),
346
364
  )
347
365
  }
348
- default: {
349
- casesHandled(queryAst)
350
- }
366
+ default:
367
+ return casesHandled(queryAst)
351
368
  }
352
369
  }
@@ -0,0 +1,44 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import * as State from '../mod.ts'
4
+ import { getDefaultValuesDecoded, getDefaultValuesEncoded } from './schema-helpers.ts'
5
+
6
+ describe('schema-helpers', () => {
7
+ it('resolves thunk defaults when decoding values', () => {
8
+ let counter = 0
9
+ const table = State.SQLite.table({
10
+ name: 'sessions',
11
+ columns: {
12
+ id: State.SQLite.text({ primaryKey: true }),
13
+ token: State.SQLite.text({ default: () => `token-${++counter}` }),
14
+ },
15
+ })
16
+
17
+ expect(counter).toBe(0)
18
+
19
+ const firstDefaults = getDefaultValuesDecoded(table)
20
+ const secondDefaults = getDefaultValuesDecoded(table)
21
+
22
+ expect(firstDefaults.token).toBe('token-1')
23
+ expect(secondDefaults.token).toBe('token-2')
24
+ })
25
+
26
+ it('resolves thunk defaults when encoding values', () => {
27
+ let counter = 0
28
+ const table = State.SQLite.table({
29
+ name: 'sessions_encoded',
30
+ columns: {
31
+ id: State.SQLite.text({ primaryKey: true }),
32
+ token: State.SQLite.text({ default: () => `encoded-${++counter}` }),
33
+ },
34
+ })
35
+
36
+ expect(counter).toBe(0)
37
+
38
+ const firstDefaults = getDefaultValuesEncoded(table)
39
+ const secondDefaults = getDefaultValuesEncoded(table)
40
+
41
+ expect(firstDefaults.token).toBe('encoded-1')
42
+ expect(secondDefaults.token).toBe('encoded-2')
43
+ })
44
+ })
@@ -2,9 +2,9 @@ import { shouldNeverHappen } from '@livestore/utils'
2
2
  import { pipe, ReadonlyRecord, Schema } from '@livestore/utils/effect'
3
3
 
4
4
  import { SqliteDsl } from './db-schema/mod.ts'
5
- import type { TableDef, TableDefBase } from './table-def.ts'
5
+ import type { TableDefBase } from './table-def.ts'
6
6
 
7
- export const getDefaultValuesEncoded = <TTableDef extends TableDef>(
7
+ export const getDefaultValuesEncoded = <TTableDef extends TableDefBase>(
8
8
  tableDef: TTableDef,
9
9
  fallbackValues?: Record<string, any>,
10
10
  ) =>
@@ -13,17 +13,21 @@ export const getDefaultValuesEncoded = <TTableDef extends TableDef>(
13
13
  ReadonlyRecord.filter((col, key) => {
14
14
  if (fallbackValues?.[key] !== undefined) return true
15
15
  if (key === 'id') return false
16
- return col!.default._tag === 'None' || SqliteDsl.isSqlDefaultValue(col!.default.value) === false
16
+ return col!.default._tag === 'None' || !SqliteDsl.isSqlDefaultValue(col!.default.value)
17
+ }),
18
+ ReadonlyRecord.map((column, columnName) => {
19
+ if (fallbackValues?.[columnName] !== undefined) return fallbackValues[columnName]
20
+ if (column!.default._tag === 'None') {
21
+ return column!.nullable === true
22
+ ? null
23
+ : shouldNeverHappen(`Column ${columnName} has no default value and is not nullable`)
24
+ }
25
+
26
+ const defaultValue = column!.default.value
27
+ const resolvedDefault = SqliteDsl.resolveColumnDefault(defaultValue)
28
+
29
+ return Schema.encodeSync(column!.schema)(resolvedDefault)
17
30
  }),
18
- ReadonlyRecord.map((column, columnName) =>
19
- fallbackValues?.[columnName] === undefined
20
- ? column!.default._tag === 'None'
21
- ? column!.nullable === true
22
- ? null
23
- : shouldNeverHappen(`Column ${columnName} has no default value and is not nullable`)
24
- : Schema.encodeSync(column!.schema)(column!.default.value)
25
- : fallbackValues[columnName],
26
- ),
27
31
  )
28
32
 
29
33
  export const getDefaultValuesDecoded = <TTableDef extends TableDefBase>(
@@ -35,15 +39,19 @@ export const getDefaultValuesDecoded = <TTableDef extends TableDefBase>(
35
39
  ReadonlyRecord.filter((col, key) => {
36
40
  if (fallbackValues?.[key] !== undefined) return true
37
41
  if (key === 'id') return false
38
- return col!.default._tag === 'None' || SqliteDsl.isSqlDefaultValue(col!.default.value) === false
42
+ return col!.default._tag === 'None' || !SqliteDsl.isSqlDefaultValue(col!.default.value)
43
+ }),
44
+ ReadonlyRecord.map((column, columnName) => {
45
+ if (fallbackValues?.[columnName] !== undefined) return fallbackValues[columnName]
46
+ if (column!.default._tag === 'None') {
47
+ return column!.nullable === true
48
+ ? null
49
+ : shouldNeverHappen(`Column ${columnName} has no default value and is not nullable`)
50
+ }
51
+
52
+ const defaultValue = column!.default.value
53
+ const resolvedDefault = SqliteDsl.resolveColumnDefault(defaultValue)
54
+
55
+ return Schema.decodeSync(Schema.toType(column!.schema))(resolvedDefault)
39
56
  }),
40
- ReadonlyRecord.map((column, columnName) =>
41
- fallbackValues?.[columnName] === undefined
42
- ? column!.default._tag === 'None'
43
- ? column!.nullable === true
44
- ? null
45
- : shouldNeverHappen(`Column ${columnName} has no default value and is not nullable`)
46
- : Schema.validateSync(column!.schema)(column!.default.value)
47
- : fallbackValues[columnName],
48
- ),
49
57
  )
@@ -0,0 +1,64 @@
1
+ import { Schema } from '@livestore/utils/effect'
2
+
3
+ import * as EventSequenceNumber from '../../../EventSequenceNumber/mod.ts'
4
+ import { SqliteDsl } from '../db-schema/mod.ts'
5
+ import { table } from '../table-def.ts'
6
+
7
+ /**
8
+ * EVENTLOG DATABASE SYSTEM TABLES
9
+ *
10
+ * ⚠️ CRITICAL: NEVER modify eventlog schemas without bumping `liveStoreStorageFormatVersion`!
11
+ * Eventlog is the source of truth - schema changes cause permanent data loss.
12
+ *
13
+ * TODO: Implement proper eventlog versioning system to prevent accidental data loss
14
+ */
15
+
16
+ export const EVENTLOG_META_TABLE = 'eventlog'
17
+
18
+ /**
19
+ * Main client-side event log storing all events (global and local/rebased).
20
+ */
21
+ export const eventlogMetaTable = table({
22
+ name: EVENTLOG_META_TABLE,
23
+ columns: {
24
+ // TODO Adjust modeling so a global event never needs a client id component
25
+ seqNumGlobal: SqliteDsl.integer({ primaryKey: true, schema: EventSequenceNumber.Global.Schema }),
26
+ seqNumClient: SqliteDsl.integer({ primaryKey: true, schema: EventSequenceNumber.Client.Schema }),
27
+ seqNumRebaseGeneration: SqliteDsl.integer({ primaryKey: true }),
28
+ parentSeqNumGlobal: SqliteDsl.integer({ schema: EventSequenceNumber.Global.Schema }),
29
+ parentSeqNumClient: SqliteDsl.integer({ schema: EventSequenceNumber.Client.Schema }),
30
+ parentSeqNumRebaseGeneration: SqliteDsl.integer({}),
31
+ /** Event definition name */
32
+ name: SqliteDsl.text({}),
33
+ argsJson: SqliteDsl.text({ schema: Schema.fromJsonString(Schema.Any) }),
34
+ clientId: SqliteDsl.text({}),
35
+ sessionId: SqliteDsl.text({}),
36
+ schemaHash: SqliteDsl.integer({}),
37
+ syncMetadataJson: SqliteDsl.text({ schema: Schema.fromJsonString(Schema.toCodecJson(Schema.Option(Schema.Json))) }),
38
+ },
39
+ indexes: [
40
+ { columns: ['seqNumGlobal'], name: 'idx_eventlog_seqNumGlobal' },
41
+ { columns: ['seqNumGlobal', 'seqNumClient', 'seqNumRebaseGeneration'], name: 'idx_eventlog_seqNum' },
42
+ ],
43
+ })
44
+
45
+ export type EventlogMetaRow = typeof eventlogMetaTable.Type
46
+
47
+ export const SYNC_STATUS_TABLE = '__livestore_sync_status'
48
+
49
+ /**
50
+ * Tracks sync status including the remote head position and backend identity.
51
+ */
52
+ // TODO support sync backend identity (to detect if sync backend changes)
53
+ export const syncStatusTable = table({
54
+ name: SYNC_STATUS_TABLE,
55
+ columns: {
56
+ head: SqliteDsl.integer({ primaryKey: true }),
57
+ // Null means the sync backend is not yet connected and we haven't yet seen a backend ID
58
+ backendId: SqliteDsl.text({ nullable: true }),
59
+ },
60
+ })
61
+
62
+ export type SyncStatusRow = typeof syncStatusTable.Type
63
+
64
+ export const eventlogSystemTables = [eventlogMetaTable, syncStatusTable] as const
@@ -0,0 +1,2 @@
1
+ export * from './eventlog-tables.ts'
2
+ export * from './state-tables.ts'
@@ -0,0 +1,109 @@
1
+ import * as EventSequenceNumber from '../../../EventSequenceNumber/mod.ts'
2
+ import { SqliteDsl } from '../db-schema/mod.ts'
3
+ import { table } from '../table-def.ts'
4
+
5
+ /**
6
+ * STATE DATABASE SYSTEM TABLES
7
+ *
8
+ * ⚠️ SAFE TO CHANGE: State tables are automatically rebuilt from eventlog when schema changes.
9
+ * No need to bump `liveStoreStorageFormatVersion` (uses hash-based migration via SqliteAst.hash()).
10
+ */
11
+
12
+ export const SCHEMA_META_TABLE = '__livestore_schema'
13
+
14
+ /**
15
+ * Tracks schema hashes for user-defined tables to detect schema changes.
16
+ */
17
+ export const schemaMetaTable = table({
18
+ name: SCHEMA_META_TABLE,
19
+ columns: {
20
+ tableName: SqliteDsl.text({ primaryKey: true }),
21
+ schemaHash: SqliteDsl.integer({ nullable: false }),
22
+ /** ISO date format */
23
+ updatedAt: SqliteDsl.text({ nullable: false }),
24
+ },
25
+ })
26
+
27
+ export type SchemaMetaRow = typeof schemaMetaTable.Type
28
+
29
+ export const SCHEMA_EVENT_DEFS_META_TABLE = '__livestore_schema_event_defs'
30
+
31
+ /**
32
+ * Tracks schema hashes for event definitions to detect event schema changes.
33
+ */
34
+ export const schemaEventDefsMetaTable = table({
35
+ name: SCHEMA_EVENT_DEFS_META_TABLE,
36
+ columns: {
37
+ eventName: SqliteDsl.text({ primaryKey: true }),
38
+ schemaHash: SqliteDsl.integer({ nullable: false }),
39
+ /** ISO date format */
40
+ updatedAt: SqliteDsl.text({ nullable: false }),
41
+ },
42
+ })
43
+
44
+ export type SchemaEventDefsMetaRow = typeof schemaEventDefsMetaTable.Type
45
+
46
+ export const STATE_HEAD_META_TABLE = '__livestore_state_head'
47
+
48
+ /**
49
+ * Single-row marker for the latest event sequence number reflected by the state DB.
50
+ *
51
+ * @remarks
52
+ * This is separate from the session changeset table because confirmed changesets
53
+ * can be removed after they are no longer needed for rollback.
54
+ */
55
+ export const stateHeadMetaTable = table({
56
+ name: STATE_HEAD_META_TABLE,
57
+ columns: {
58
+ id: SqliteDsl.integer({ primaryKey: true }),
59
+ seqNumGlobal: SqliteDsl.integer({ schema: EventSequenceNumber.Global.Schema }),
60
+ seqNumClient: SqliteDsl.integer({ schema: EventSequenceNumber.Client.Schema }),
61
+ seqNumRebaseGeneration: SqliteDsl.integer({}),
62
+ },
63
+ })
64
+
65
+ export type StateHeadMetaRow = typeof stateHeadMetaTable.Type
66
+
67
+ /**
68
+ * Table which stores SQLite changeset blobs which is used for rolling back
69
+ * read-model state during rebasing.
70
+ */
71
+ export const SESSION_CHANGESET_META_TABLE = '__livestore_session_changeset'
72
+
73
+ export const sessionChangesetMetaTable = table({
74
+ name: SESSION_CHANGESET_META_TABLE,
75
+ columns: {
76
+ // TODO bring back primary key
77
+ seqNumGlobal: SqliteDsl.integer({ schema: EventSequenceNumber.Global.Schema }),
78
+ seqNumClient: SqliteDsl.integer({ schema: EventSequenceNumber.Client.Schema }),
79
+ seqNumRebaseGeneration: SqliteDsl.integer({}),
80
+ changeset: SqliteDsl.blob({ nullable: true }),
81
+ debug: SqliteDsl.json({ nullable: true }),
82
+ },
83
+ indexes: [{ columns: ['seqNumGlobal', 'seqNumClient'], name: 'idx_session_changeset_id' }],
84
+ })
85
+
86
+ export type SessionChangesetMetaRow = typeof sessionChangesetMetaTable.Type
87
+
88
+ // TODO: Rename the physical table once legacy session changeset consumers have been migrated.
89
+ export const MATERIALIZATION_JOURNAL_META_TABLE = SESSION_CHANGESET_META_TABLE
90
+
91
+ /**
92
+ * Materialization journal used to roll back state database changes during rebasing.
93
+ *
94
+ * @remarks
95
+ * This aliases the legacy table definition until all session changeset consumers
96
+ * have adopted the journal service.
97
+ */
98
+ export const materializationJournalMetaTable = sessionChangesetMetaTable
99
+
100
+ export type MaterializationJournalMetaRow = SessionChangesetMetaRow
101
+
102
+ export const stateSystemTables = [
103
+ schemaMetaTable,
104
+ schemaEventDefsMetaTable,
105
+ stateHeadMetaTable,
106
+ sessionChangesetMetaTable,
107
+ ] as const
108
+
109
+ export const isStateSystemTable = (tableName: string) => stateSystemTables.some((_) => _.sqliteDef.name === tableName)