@livestore/common 0.4.0 → 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 (421) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +1 -1
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
  4. package/dist/MaterializationJournal.d.ts +44 -0
  5. package/dist/MaterializationJournal.d.ts.map +1 -0
  6. package/dist/MaterializationJournal.js +112 -0
  7. package/dist/MaterializationJournal.js.map +1 -0
  8. package/dist/StateHead.d.ts +26 -0
  9. package/dist/StateHead.d.ts.map +1 -0
  10. package/dist/StateHead.js +50 -0
  11. package/dist/StateHead.js.map +1 -0
  12. package/dist/WorkerTransportError.d.ts +3 -3
  13. package/dist/WorkerTransportError.d.ts.map +1 -1
  14. package/dist/WorkerTransportError.js +3 -3
  15. package/dist/WorkerTransportError.js.map +1 -1
  16. package/dist/__tests__/fixture.d.ts +1 -1
  17. package/dist/__tests__/fixture.d.ts.map +1 -1
  18. package/dist/__tests__/fixture.js +3 -3
  19. package/dist/__tests__/fixture.js.map +1 -1
  20. package/dist/adapter-types.d.ts +29 -57
  21. package/dist/adapter-types.d.ts.map +1 -1
  22. package/dist/adapter-types.js +20 -37
  23. package/dist/adapter-types.js.map +1 -1
  24. package/dist/debug-info.d.ts +56 -56
  25. package/dist/debug-info.d.ts.map +1 -1
  26. package/dist/debug-info.js +28 -41
  27. package/dist/debug-info.js.map +1 -1
  28. package/dist/defs.d.ts +9 -9
  29. package/dist/defs.js +2 -2
  30. package/dist/devtools/devtools-compatibility.test.js +1 -0
  31. package/dist/devtools/devtools-compatibility.test.js.map +1 -1
  32. package/dist/devtools/devtools-messages-client-session.d.ts +520 -332
  33. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  34. package/dist/devtools/devtools-messages-client-session.js +76 -74
  35. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  36. package/dist/devtools/devtools-messages-common.d.ts +27 -27
  37. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  38. package/dist/devtools/devtools-messages-common.js +5 -5
  39. package/dist/devtools/devtools-messages-common.js.map +1 -1
  40. package/dist/devtools/devtools-messages-leader.d.ts +405 -343
  41. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  42. package/dist/devtools/devtools-messages-leader.js +101 -89
  43. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  44. package/dist/devtools/devtools-sessioninfo.d.ts +18 -19
  45. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  46. package/dist/devtools/devtools-sessioninfo.js +8 -5
  47. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  48. package/dist/devtools/mod.d.ts +4 -5
  49. package/dist/devtools/mod.d.ts.map +1 -1
  50. package/dist/devtools/mod.js +9 -5
  51. package/dist/devtools/mod.js.map +1 -1
  52. package/dist/errors.d.ts +45 -69
  53. package/dist/errors.d.ts.map +1 -1
  54. package/dist/errors.js +18 -16
  55. package/dist/errors.js.map +1 -1
  56. package/dist/index.d.ts +4 -1
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +4 -1
  59. package/dist/index.js.map +1 -1
  60. package/dist/leader-thread/LeaderSyncProcessor.d.ts +66 -18
  61. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  62. package/dist/leader-thread/LeaderSyncProcessor.js +519 -461
  63. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  64. package/dist/leader-thread/RejectedPushError.d.ts +67 -36
  65. package/dist/leader-thread/RejectedPushError.d.ts.map +1 -1
  66. package/dist/leader-thread/RejectedPushError.js +24 -5
  67. package/dist/leader-thread/RejectedPushError.js.map +1 -1
  68. package/dist/leader-thread/connection.d.ts +1 -0
  69. package/dist/leader-thread/connection.d.ts.map +1 -1
  70. package/dist/leader-thread/connection.js +9 -8
  71. package/dist/leader-thread/connection.js.map +1 -1
  72. package/dist/leader-thread/eventlog.d.ts +4 -4
  73. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  74. package/dist/leader-thread/eventlog.js +6 -6
  75. package/dist/leader-thread/eventlog.js.map +1 -1
  76. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
  77. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  78. package/dist/leader-thread/leader-worker-devtools.js +33 -17
  79. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  80. package/dist/leader-thread/make-leader-thread-layer.d.ts +9 -5
  81. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  82. package/dist/leader-thread/make-leader-thread-layer.js +25 -35
  83. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  84. package/dist/leader-thread/make-leader-thread-layer.test.js +7 -7
  85. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -1
  86. package/dist/leader-thread/materialize-event.d.ts +2 -1
  87. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  88. package/dist/leader-thread/materialize-event.js +4 -0
  89. package/dist/leader-thread/materialize-event.js.map +1 -1
  90. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  91. package/dist/leader-thread/recreate-db.js +18 -39
  92. package/dist/leader-thread/recreate-db.js.map +1 -1
  93. package/dist/leader-thread/shutdown-channel.d.ts +2 -6
  94. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  95. package/dist/leader-thread/shutdown-channel.js +2 -3
  96. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  97. package/dist/leader-thread/stream-events.d.ts +4 -7
  98. package/dist/leader-thread/stream-events.d.ts.map +1 -1
  99. package/dist/leader-thread/stream-events.js +13 -16
  100. package/dist/leader-thread/stream-events.js.map +1 -1
  101. package/dist/leader-thread/types.d.ts +32 -69
  102. package/dist/leader-thread/types.d.ts.map +1 -1
  103. package/dist/leader-thread/types.js +5 -5
  104. package/dist/leader-thread/types.js.map +1 -1
  105. package/dist/logging.d.ts +5 -30
  106. package/dist/logging.d.ts.map +1 -1
  107. package/dist/logging.js +1 -32
  108. package/dist/logging.js.map +1 -1
  109. package/dist/make-client-session.d.ts +1 -2
  110. package/dist/make-client-session.d.ts.map +1 -1
  111. package/dist/make-client-session.js +3 -3
  112. package/dist/make-client-session.js.map +1 -1
  113. package/dist/materializer-helper.d.ts +0 -1
  114. package/dist/materializer-helper.d.ts.map +1 -1
  115. package/dist/materializer-helper.js +7 -35
  116. package/dist/materializer-helper.js.map +1 -1
  117. package/dist/otel.d.ts +2 -3
  118. package/dist/otel.d.ts.map +1 -1
  119. package/dist/otel.js +2 -7
  120. package/dist/otel.js.map +1 -1
  121. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  122. package/dist/rematerialize-from-eventlog.js +28 -26
  123. package/dist/rematerialize-from-eventlog.js.map +1 -1
  124. package/dist/schema/EventDef/define.d.ts +4 -4
  125. package/dist/schema/EventDef/define.d.ts.map +1 -1
  126. package/dist/schema/EventDef/define.js +5 -5
  127. package/dist/schema/EventDef/define.js.map +1 -1
  128. package/dist/schema/EventDef/define.test.d.ts +2 -0
  129. package/dist/schema/EventDef/define.test.d.ts.map +1 -0
  130. package/dist/schema/EventDef/define.test.js +23 -0
  131. package/dist/schema/EventDef/define.test.js.map +1 -0
  132. package/dist/schema/EventDef/deprecated.d.ts +8 -13
  133. package/dist/schema/EventDef/deprecated.d.ts.map +1 -1
  134. package/dist/schema/EventDef/deprecated.js +12 -13
  135. package/dist/schema/EventDef/deprecated.js.map +1 -1
  136. package/dist/schema/EventDef/deprecated.test.js +1 -1
  137. package/dist/schema/EventDef/deprecated.test.js.map +1 -1
  138. package/dist/schema/EventDef/event-def.d.ts +1 -1
  139. package/dist/schema/EventDef/event-def.d.ts.map +1 -1
  140. package/dist/schema/EventSequenceNumber/client.d.ts +12 -12
  141. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -1
  142. package/dist/schema/EventSequenceNumber/client.js +8 -9
  143. package/dist/schema/EventSequenceNumber/client.js.map +1 -1
  144. package/dist/schema/EventSequenceNumber/global.d.ts +2 -2
  145. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -1
  146. package/dist/schema/EventSequenceNumber/global.js +1 -1
  147. package/dist/schema/EventSequenceNumber/global.js.map +1 -1
  148. package/dist/schema/EventSequenceNumber.test.js +5 -5
  149. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  150. package/dist/schema/LiveStoreEvent/client.d.ts +50 -179
  151. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -1
  152. package/dist/schema/LiveStoreEvent/client.js +32 -29
  153. package/dist/schema/LiveStoreEvent/client.js.map +1 -1
  154. package/dist/schema/LiveStoreEvent/client.test.js +11 -2
  155. package/dist/schema/LiveStoreEvent/client.test.js.map +1 -1
  156. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +7 -7
  157. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -1
  158. package/dist/schema/LiveStoreEvent/global.d.ts +6 -6
  159. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -1
  160. package/dist/schema/LiveStoreEvent/global.js +1 -1
  161. package/dist/schema/LiveStoreEvent/global.js.map +1 -1
  162. package/dist/schema/LiveStoreEvent/input.d.ts +5 -5
  163. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -1
  164. package/dist/schema/LiveStoreEvent/input.js +3 -3
  165. package/dist/schema/LiveStoreEvent/input.js.map +1 -1
  166. package/dist/schema/mod.d.ts +1 -0
  167. package/dist/schema/mod.d.ts.map +1 -1
  168. package/dist/schema/mod.js +1 -0
  169. package/dist/schema/mod.js.map +1 -1
  170. package/dist/schema/schema.d.ts.map +1 -1
  171. package/dist/schema/schema.js +3 -2
  172. package/dist/schema/schema.js.map +1 -1
  173. package/dist/schema/state/sqlite/client-document-def.d.ts +12 -17
  174. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  175. package/dist/schema/state/sqlite/client-document-def.js +23 -20
  176. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  177. package/dist/schema/state/sqlite/client-document-def.test.js +29 -8
  178. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  179. package/dist/schema/state/sqlite/column-annotations.d.ts +13 -13
  180. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  181. package/dist/schema/state/sqlite/column-annotations.js +13 -15
  182. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  183. package/dist/schema/state/sqlite/column-annotations.test.js +19 -43
  184. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  185. package/dist/schema/state/sqlite/column-def.d.ts +1 -1
  186. package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
  187. package/dist/schema/state/sqlite/column-def.js +57 -31
  188. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  189. package/dist/schema/state/sqlite/column-def.test.js +118 -72
  190. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  191. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  192. package/dist/schema/state/sqlite/column-spec.test.js +2 -2
  193. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -2
  194. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
  195. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +13 -4
  196. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  197. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +9 -9
  198. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  199. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +8 -13
  200. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  201. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +27 -16
  202. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
  203. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +13 -11
  204. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  205. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +5 -3
  206. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  207. package/dist/schema/state/sqlite/mod.d.ts +1 -3
  208. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  209. package/dist/schema/state/sqlite/mod.js +1 -1
  210. package/dist/schema/state/sqlite/mod.js.map +1 -1
  211. package/dist/schema/state/sqlite/persistence.d.ts +11 -0
  212. package/dist/schema/state/sqlite/persistence.d.ts.map +1 -0
  213. package/dist/schema/state/sqlite/persistence.js +10 -0
  214. package/dist/schema/state/sqlite/persistence.js.map +1 -0
  215. package/dist/schema/state/sqlite/query-builder/api.d.ts +7 -7
  216. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  217. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  218. package/dist/schema/state/sqlite/query-builder/astToSql.js +27 -23
  219. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  220. package/dist/schema/state/sqlite/query-builder/impl.d.ts +3 -1
  221. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  222. package/dist/schema/state/sqlite/query-builder/impl.js +16 -14
  223. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  224. package/dist/schema/state/sqlite/query-builder/impl.test.js +362 -596
  225. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  226. package/dist/schema/state/sqlite/schema-helpers.js +1 -1
  227. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  228. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts +102 -134
  229. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -1
  230. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +2 -2
  231. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -1
  232. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +328 -106
  233. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -1
  234. package/dist/schema/state/sqlite/system-tables/state-tables.js +33 -1
  235. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -1
  236. package/dist/schema/state/sqlite/table-def.d.ts +16 -19
  237. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  238. package/dist/schema/state/sqlite/table-def.js +53 -3
  239. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  240. package/dist/schema/state/sqlite/table-def.test.js +153 -36
  241. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  242. package/dist/schema/unknown-events.d.ts.map +1 -1
  243. package/dist/schema/unknown-events.js +2 -1
  244. package/dist/schema/unknown-events.js.map +1 -1
  245. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +2 -2
  246. package/dist/session-id-symbol.d.ts +29 -0
  247. package/dist/session-id-symbol.d.ts.map +1 -0
  248. package/dist/session-id-symbol.js +44 -0
  249. package/dist/session-id-symbol.js.map +1 -0
  250. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  251. package/dist/sql-queries/sql-queries.js +8 -10
  252. package/dist/sql-queries/sql-queries.js.map +1 -1
  253. package/dist/sql-queries/types.d.ts +6 -7
  254. package/dist/sql-queries/types.d.ts.map +1 -1
  255. package/dist/sql-queries/types.js.map +1 -1
  256. package/dist/sqlite-db-helper.d.ts +21 -1
  257. package/dist/sqlite-db-helper.d.ts.map +1 -1
  258. package/dist/sqlite-db-helper.js +37 -2
  259. package/dist/sqlite-db-helper.js.map +1 -1
  260. package/dist/sqlite-types.d.ts +3 -6
  261. package/dist/sqlite-types.d.ts.map +1 -1
  262. package/dist/sqlite-types.js +3 -3
  263. package/dist/sqlite-types.js.map +1 -1
  264. package/dist/sync/ClientSessionSyncProcessor.d.ts +38 -16
  265. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  266. package/dist/sync/ClientSessionSyncProcessor.js +196 -66
  267. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  268. package/dist/sync/errors.d.ts +12 -18
  269. package/dist/sync/errors.d.ts.map +1 -1
  270. package/dist/sync/errors.js +2 -2
  271. package/dist/sync/errors.js.map +1 -1
  272. package/dist/sync/mock-sync-backend.d.ts +2 -3
  273. package/dist/sync/mock-sync-backend.d.ts.map +1 -1
  274. package/dist/sync/mock-sync-backend.js +54 -33
  275. package/dist/sync/mock-sync-backend.js.map +1 -1
  276. package/dist/sync/mock-sync-backend.test.d.ts +2 -0
  277. package/dist/sync/mock-sync-backend.test.d.ts.map +1 -0
  278. package/dist/sync/mock-sync-backend.test.js +49 -0
  279. package/dist/sync/mock-sync-backend.test.js.map +1 -0
  280. package/dist/sync/next/history-dag-common.d.ts +4 -0
  281. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  282. package/dist/sync/next/history-dag-common.js +52 -31
  283. package/dist/sync/next/history-dag-common.js.map +1 -1
  284. package/dist/sync/next/history-dag.d.ts.map +1 -1
  285. package/dist/sync/next/history-dag.js +2 -1
  286. package/dist/sync/next/history-dag.js.map +1 -1
  287. package/dist/sync/next/test/compact-events.calculator.test.js +2 -2
  288. package/dist/sync/next/test/event-fixtures.d.ts +7 -7
  289. package/dist/sync/next/test/event-fixtures.js +1 -1
  290. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  291. package/dist/sync/next/test/history-dag-common.test.d.ts +2 -0
  292. package/dist/sync/next/test/history-dag-common.test.d.ts.map +1 -0
  293. package/dist/sync/next/test/history-dag-common.test.js +73 -0
  294. package/dist/sync/next/test/history-dag-common.test.js.map +1 -0
  295. package/dist/sync/sync-backend-kv.d.ts.map +1 -1
  296. package/dist/sync/sync-backend-kv.js +4 -2
  297. package/dist/sync/sync-backend-kv.js.map +1 -1
  298. package/dist/sync/sync-backend.d.ts +15 -15
  299. package/dist/sync/sync-backend.d.ts.map +1 -1
  300. package/dist/sync/sync-backend.js +9 -5
  301. package/dist/sync/sync-backend.js.map +1 -1
  302. package/dist/sync/sync.d.ts +1 -1
  303. package/dist/sync/sync.d.ts.map +1 -1
  304. package/dist/sync/syncstate.d.ts +97 -173
  305. package/dist/sync/syncstate.d.ts.map +1 -1
  306. package/dist/sync/syncstate.js +34 -37
  307. package/dist/sync/syncstate.js.map +1 -1
  308. package/dist/sync/syncstate.test.js +100 -61
  309. package/dist/sync/syncstate.test.js.map +1 -1
  310. package/dist/sync/transport-chunking.d.ts +15 -16
  311. package/dist/sync/transport-chunking.d.ts.map +1 -1
  312. package/dist/sync/transport-chunking.js +23 -32
  313. package/dist/sync/transport-chunking.js.map +1 -1
  314. package/dist/util.d.ts +11 -4
  315. package/dist/util.d.ts.map +1 -1
  316. package/dist/util.js +19 -2
  317. package/dist/util.js.map +1 -1
  318. package/dist/version.d.ts.map +1 -1
  319. package/dist/version.js.map +1 -1
  320. package/package.json +19 -37
  321. package/src/ClientSessionLeaderThreadProxy.ts +1 -1
  322. package/src/MaterializationJournal.ts +184 -0
  323. package/src/StateHead.ts +80 -0
  324. package/src/WorkerTransportError.ts +4 -4
  325. package/src/__tests__/fixture.ts +3 -3
  326. package/src/adapter-types.ts +24 -61
  327. package/src/debug-info.ts +50 -70
  328. package/src/defs.ts +2 -2
  329. package/src/devtools/devtools-compatibility.test.ts +1 -0
  330. package/src/devtools/devtools-messages-client-session.ts +56 -65
  331. package/src/devtools/devtools-messages-common.ts +12 -11
  332. package/src/devtools/devtools-messages-leader.ts +71 -69
  333. package/src/devtools/devtools-sessioninfo.ts +13 -11
  334. package/src/devtools/mod.ts +4 -5
  335. package/src/errors.ts +46 -34
  336. package/src/index.ts +8 -1
  337. package/src/leader-thread/LeaderSyncProcessor.ts +794 -691
  338. package/src/leader-thread/RejectedPushError.ts +40 -27
  339. package/src/leader-thread/connection.ts +12 -8
  340. package/src/leader-thread/eventlog.ts +7 -7
  341. package/src/leader-thread/leader-worker-devtools.ts +37 -19
  342. package/src/leader-thread/make-leader-thread-layer.test.ts +7 -7
  343. package/src/leader-thread/make-leader-thread-layer.ts +56 -53
  344. package/src/leader-thread/materialize-event.ts +13 -8
  345. package/src/leader-thread/recreate-db.ts +24 -59
  346. package/src/leader-thread/shutdown-channel.ts +3 -14
  347. package/src/leader-thread/stream-events.ts +104 -101
  348. package/src/leader-thread/types.ts +24 -62
  349. package/src/logging.ts +5 -52
  350. package/src/make-client-session.ts +6 -6
  351. package/src/materializer-helper.ts +8 -37
  352. package/src/otel.ts +5 -14
  353. package/src/rematerialize-from-eventlog.ts +97 -94
  354. package/src/schema/EventDef/define.test.ts +28 -0
  355. package/src/schema/EventDef/define.ts +20 -19
  356. package/src/schema/EventDef/deprecated.test.ts +1 -8
  357. package/src/schema/EventDef/deprecated.ts +17 -20
  358. package/src/schema/EventDef/event-def.ts +2 -4
  359. package/src/schema/EventSequenceNumber/client.ts +8 -9
  360. package/src/schema/EventSequenceNumber/global.ts +1 -1
  361. package/src/schema/EventSequenceNumber.test.ts +5 -5
  362. package/src/schema/LiveStoreEvent/client.test.ts +17 -4
  363. package/src/schema/LiveStoreEvent/client.ts +36 -35
  364. package/src/schema/LiveStoreEvent/for-event-def.ts +7 -7
  365. package/src/schema/LiveStoreEvent/global.ts +1 -1
  366. package/src/schema/LiveStoreEvent/input.ts +6 -6
  367. package/src/schema/mod.ts +1 -0
  368. package/src/schema/schema.ts +3 -2
  369. package/src/schema/state/sqlite/client-document-def.test.ts +32 -13
  370. package/src/schema/state/sqlite/client-document-def.ts +95 -80
  371. package/src/schema/state/sqlite/column-annotations.test.ts +26 -45
  372. package/src/schema/state/sqlite/column-annotations.ts +26 -30
  373. package/src/schema/state/sqlite/column-def.test.ts +132 -77
  374. package/src/schema/state/sqlite/column-def.ts +72 -37
  375. package/src/schema/state/sqlite/column-spec.test.ts +2 -2
  376. package/src/schema/state/sqlite/column-spec.ts +3 -2
  377. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +15 -5
  378. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +123 -63
  379. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -16
  380. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +25 -31
  381. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +35 -21
  382. package/src/schema/state/sqlite/mod.ts +2 -4
  383. package/src/schema/state/sqlite/persistence.ts +11 -0
  384. package/src/schema/state/sqlite/query-builder/api.ts +9 -9
  385. package/src/schema/state/sqlite/query-builder/astToSql.ts +31 -26
  386. package/src/schema/state/sqlite/query-builder/impl.test.ts +433 -669
  387. package/src/schema/state/sqlite/query-builder/impl.ts +19 -15
  388. package/src/schema/state/sqlite/schema-helpers.ts +1 -1
  389. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +2 -2
  390. package/src/schema/state/sqlite/system-tables/state-tables.ts +41 -1
  391. package/src/schema/state/sqlite/table-def.test.ts +204 -66
  392. package/src/schema/state/sqlite/table-def.ts +96 -45
  393. package/src/schema/unknown-events.ts +3 -2
  394. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +2 -2
  395. package/src/session-id-symbol.ts +59 -0
  396. package/src/sql-queries/sql-queries.ts +8 -12
  397. package/src/sql-queries/types.ts +6 -7
  398. package/src/sqlite-db-helper.ts +64 -2
  399. package/src/sqlite-types.ts +5 -8
  400. package/src/sync/ClientSessionSyncProcessor.ts +303 -119
  401. package/src/sync/errors.ts +14 -12
  402. package/src/sync/mock-sync-backend.test.ts +78 -0
  403. package/src/sync/mock-sync-backend.ts +93 -47
  404. package/src/sync/next/history-dag-common.ts +60 -34
  405. package/src/sync/next/history-dag.ts +4 -1
  406. package/src/sync/next/test/compact-events.calculator.test.ts +2 -2
  407. package/src/sync/next/test/event-fixtures.ts +1 -1
  408. package/src/sync/next/test/history-dag-common.test.ts +87 -0
  409. package/src/sync/sync-backend-kv.ts +4 -2
  410. package/src/sync/sync-backend.ts +15 -15
  411. package/src/sync/sync.ts +1 -1
  412. package/src/sync/syncstate.test.ts +191 -140
  413. package/src/sync/syncstate.ts +63 -53
  414. package/src/sync/transport-chunking.ts +34 -39
  415. package/src/util.ts +18 -9
  416. package/src/version.ts +1 -2
  417. package/dist/sql-queries/misc.d.ts +0 -2
  418. package/dist/sql-queries/misc.d.ts.map +0 -1
  419. package/dist/sql-queries/misc.js +0 -2
  420. package/dist/sql-queries/misc.js.map +0 -1
  421. package/src/sql-queries/misc.ts +0 -2
@@ -8,7 +8,7 @@ export type Type = Brand.Branded<number, 'ClientEventSequenceNumber'>
8
8
  const ClientBrand = Brand.nominal<Type>()
9
9
 
10
10
  /** Effect Schema for encoding/decoding client sequence numbers. */
11
- export const Schema = S.fromBrand(ClientBrand)(S.Int)
11
+ export const Schema = S.fromBrand('ClientEventSequenceNumber', ClientBrand)(S.Int)
12
12
 
13
13
  /**
14
14
  * Creates a branded client sequence number from a plain number.
@@ -177,10 +177,9 @@ const CompositeSchema = S.Struct({
177
177
  client: Schema,
178
178
  // Client only
179
179
  rebaseGeneration: S.Int,
180
- }).annotations({
181
- title: 'EventSequenceNumber.Composite',
182
- pretty: () => (seqNum) => toString(seqNum),
183
180
  })
181
+ .annotate({ title: 'EventSequenceNumber.Composite' })
182
+ .pipe(S.overrideToFormatter(() => (seqNum) => toString(seqNum)))
184
183
 
185
184
  /**
186
185
  * Creates a validated Composite sequence number from input.
@@ -222,19 +221,19 @@ export const ROOT = {
222
221
  /**
223
222
  * Computes the next sequence number and its parent based on the current position.
224
223
  *
225
- * For client-local events (isClient=true): increments the client component, keeps global.
226
- * For global events (isClient=false): increments global, resets client to 0.
224
+ * For client-only events (isClientOnly=true): increments the client component, keeps global.
225
+ * For global events (isClientOnly=false): increments global, resets client to 0.
227
226
  */
228
227
  export const nextPair = ({
229
228
  seqNum,
230
- isClient,
229
+ isClientOnly,
231
230
  rebaseGeneration,
232
231
  }: {
233
232
  seqNum: Composite
234
- isClient: boolean
233
+ isClientOnly: boolean
235
234
  rebaseGeneration?: number
236
235
  }): CompositePair => {
237
- if (isClient === true) {
236
+ if (isClientOnly === true) {
238
237
  return {
239
238
  seqNum: {
240
239
  global: seqNum.global,
@@ -6,7 +6,7 @@ export type Type = Brand.Branded<number, 'GlobalEventSequenceNumber'>
6
6
  const GlobalBrand = Brand.nominal<Type>()
7
7
 
8
8
  /** Effect Schema for encoding/decoding global sequence numbers. */
9
- export const Schema = S.fromBrand(GlobalBrand)(S.Int)
9
+ export const Schema = S.fromBrand('GlobalEventSequenceNumber', GlobalBrand)(S.Int)
10
10
 
11
11
  /**
12
12
  * Creates a branded global sequence number from a plain number.
@@ -7,12 +7,12 @@ import { EventSequenceNumber } from './mod.ts'
7
7
  Vitest.describe('EventSequenceNumber', () => {
8
8
  Vitest.test('nextPair (no rebase)', () => {
9
9
  const e_0_0 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0 })
10
- expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClient: false }).seqNum).toStrictEqual({
10
+ expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClientOnly: false }).seqNum).toStrictEqual({
11
11
  global: 1,
12
12
  client: 0,
13
13
  rebaseGeneration: 0,
14
14
  })
15
- expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClient: true }).seqNum).toStrictEqual({
15
+ expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClientOnly: true }).seqNum).toStrictEqual({
16
16
  global: 0,
17
17
  client: 1,
18
18
  rebaseGeneration: 0,
@@ -22,14 +22,14 @@ Vitest.describe('EventSequenceNumber', () => {
22
22
  Vitest.test('nextPair (rebase)', () => {
23
23
  const e_0_0 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0 })
24
24
  expect(
25
- EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClient: false, rebaseGeneration: 1 }).seqNum,
25
+ EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClientOnly: false, rebaseGeneration: 1 }).seqNum,
26
26
  ).toStrictEqual({
27
27
  global: 1,
28
28
  client: 0,
29
29
  rebaseGeneration: 1,
30
30
  })
31
31
  expect(
32
- EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClient: true, rebaseGeneration: 1 }).seqNum,
32
+ EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClientOnly: true, rebaseGeneration: 1 }).seqNum,
33
33
  ).toStrictEqual({
34
34
  global: 0,
35
35
  client: 1,
@@ -37,7 +37,7 @@ Vitest.describe('EventSequenceNumber', () => {
37
37
  })
38
38
 
39
39
  const e_0_0_g1 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0, rebaseGeneration: 2 })
40
- expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0_g1, isClient: false }).seqNum).toStrictEqual({
40
+ expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0_g1, isClientOnly: false }).seqNum).toStrictEqual({
41
41
  global: 1,
42
42
  client: 0,
43
43
  rebaseGeneration: 2,
@@ -1,10 +1,10 @@
1
1
  import { expect } from 'vitest'
2
2
 
3
- import { Option, Schema } from '@livestore/utils/effect'
4
3
  import { Vitest } from '@livestore/utils-dev/node-vitest'
4
+ import { Option, Schema } from '@livestore/utils/effect'
5
5
 
6
6
  import * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
7
- import { EncodedWithMeta, isEqualEncoded, type Encoded } from './client.ts'
7
+ import { type Encoded, EncodedWithMeta, isEqualEncoded } from './client.ts'
8
8
 
9
9
  Vitest.describe('EncodedWithMeta', () => {
10
10
  Vitest.test('toGlobal() produces numeric seqNums through JSON.stringify', () => {
@@ -107,10 +107,23 @@ Vitest.describe('isEqualEncoded', () => {
107
107
  expect(isEqualEncoded(a, b)).toBe(true)
108
108
  })
109
109
 
110
- Vitest.it('should consider Effect Schema UndefinedOr-encoded args equal to their JSON-roundtripped form', () => {
110
+ Vitest.it(
111
+ 'should consider Effect Schema UndefinedOr-encoded args with explicit undefined equal to their JSON-roundtripped form',
112
+ () => {
113
+ const argsSchema = Schema.Struct({
114
+ id: Schema.String,
115
+ flag: Schema.UndefinedOr(Schema.Boolean),
116
+ })
117
+ const localArgs = Schema.encodeUnknownSync(argsSchema)({ id: 'abc', flag: undefined } as any)
118
+ const wireArgs = JSON.parse(JSON.stringify(localArgs))
119
+ expect(isEqualEncoded(makeEncodedEvent(localArgs), makeEncodedEvent(wireArgs))).toBe(true)
120
+ },
121
+ )
122
+
123
+ Vitest.it('should consider Effect Schema optionalKey-encoded args equal to their JSON-roundtripped form', () => {
111
124
  const argsSchema = Schema.Struct({
112
125
  id: Schema.String,
113
- flag: Schema.UndefinedOr(Schema.Boolean),
126
+ label: Schema.optionalKey(Schema.String),
114
127
  })
115
128
  const localArgs = Schema.encodeUnknownSync(argsSchema)({ id: 'abc' } as any)
116
129
  const wireArgs = JSON.parse(JSON.stringify(localArgs))
@@ -1,5 +1,5 @@
1
1
  import { deepEqual, memoizeByRef } from '@livestore/utils'
2
- import { Option, Schema } from '@livestore/utils/effect'
2
+ import { Effect, Option, Schema, Struct } from '@livestore/utils/effect'
3
3
 
4
4
  import type { EventDef } from '../EventDef/mod.ts'
5
5
  import * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
@@ -15,7 +15,7 @@ export const Decoded = Schema.Struct({
15
15
  parentSeqNum: EventSequenceNumber.Client.Composite,
16
16
  clientId: Schema.String,
17
17
  sessionId: Schema.String,
18
- }).annotations({ title: 'LiveStoreEvent.Client.Decoded' })
18
+ }).annotate({ title: 'LiveStoreEvent.Client.Decoded' })
19
19
 
20
20
  /**
21
21
  * Effect Schema for client events with encoded args.
@@ -45,7 +45,7 @@ export const Encoded = Schema.Struct({
45
45
  parentSeqNum: EventSequenceNumber.Client.Composite,
46
46
  clientId: Schema.String,
47
47
  sessionId: Schema.String,
48
- }).annotations({ title: 'LiveStoreEvent.Client.Encoded' })
48
+ }).annotate({ title: 'LiveStoreEvent.Client.Encoded' })
49
49
 
50
50
  /** Event with composite sequence numbers and decoded (native TypeScript) args. */
51
51
  export type Decoded = ForEventDef.Decoded<EventDef.Any>
@@ -73,36 +73,38 @@ export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('LiveStoreEve
73
73
  sessionId: Schema.String,
74
74
  // TODO get rid of `meta` again by cleaning up the usage implementations
75
75
  meta: Schema.Struct({
76
- sessionChangeset: Schema.Union(
76
+ sessionChangeset: Schema.Union([
77
77
  Schema.TaggedStruct('sessionChangeset', {
78
- data: Schema.Uint8Array as any as Schema.Schema<Uint8Array<ArrayBuffer>>,
78
+ data: Schema.Uint8Array as any as Schema.Codec<Uint8Array<ArrayBuffer>>,
79
79
  debug: Schema.Any.pipe(Schema.optional),
80
80
  }),
81
81
  Schema.TaggedStruct('no-op', {}),
82
82
  Schema.TaggedStruct('unset', {}),
83
- ),
84
- syncMetadata: Schema.Option(Schema.JsonValue),
83
+ ]),
84
+ syncMetadata: Schema.Option(Schema.Json),
85
85
  /** Used to detect if the materializer is side effecting (during dev) */
86
- materializerHashLeader: Schema.Option(Schema.Number),
87
- materializerHashSession: Schema.Option(Schema.Number),
88
- }).pipe(
89
- Schema.mutable,
90
- Schema.optional,
91
- Schema.withDefaults({
92
- constructor: () => ({
93
- sessionChangeset: { _tag: 'unset' as const },
94
- syncMetadata: Option.none(),
95
- materializerHashLeader: Option.none(),
96
- materializerHashSession: Option.none(),
97
- }),
98
- decoding: () => ({
99
- sessionChangeset: { _tag: 'unset' as const },
100
- syncMetadata: Option.none(),
101
- materializerHashLeader: Option.none(),
102
- materializerHashSession: Option.none(),
103
- }),
104
- }),
105
- ),
86
+ materializerHashLeader: Schema.Option(Schema.Finite),
87
+ materializerHashSession: Schema.Option(Schema.Finite),
88
+ })
89
+ .mapFields(Struct.map(Schema.mutableKey))
90
+ .pipe(
91
+ Schema.withDecodingDefaultType(
92
+ Effect.succeed({
93
+ sessionChangeset: { _tag: 'unset' as const },
94
+ syncMetadata: Option.none(),
95
+ materializerHashLeader: Option.none(),
96
+ materializerHashSession: Option.none(),
97
+ }),
98
+ ),
99
+ Schema.withConstructorDefault(
100
+ Effect.succeed({
101
+ sessionChangeset: { _tag: 'unset' as const },
102
+ syncMetadata: Option.none(),
103
+ materializerHashLeader: Option.none(),
104
+ materializerHashSession: Option.none(),
105
+ }),
106
+ ),
107
+ ),
106
108
  }) {
107
109
  toJSON = (): any => {
108
110
  // Only used for logging/debugging
@@ -134,22 +136,22 @@ export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('LiveStoreEve
134
136
  */
135
137
  rebase = ({
136
138
  parentSeqNum,
137
- isClient,
139
+ isClientOnly,
138
140
  rebaseGeneration,
139
141
  }: {
140
142
  parentSeqNum: EventSequenceNumber.Client.Composite
141
- isClient: boolean
143
+ isClientOnly: boolean
142
144
  rebaseGeneration: number
143
145
  }) =>
144
146
  new EncodedWithMeta({
145
147
  ...this,
146
- ...EventSequenceNumber.Client.nextPair({ seqNum: parentSeqNum, isClient, rebaseGeneration }),
148
+ ...EventSequenceNumber.Client.nextPair({ seqNum: parentSeqNum, isClientOnly, rebaseGeneration }),
147
149
  })
148
150
 
149
151
  static fromGlobal = (
150
152
  event: Global.Encoded,
151
153
  meta: {
152
- syncMetadata: Option.Option<Schema.JsonValue>
154
+ syncMetadata: Option.Option<Schema.Json>
153
155
  materializerHashLeader: Option.Option<number>
154
156
  materializerHashSession: Option.Option<number>
155
157
  },
@@ -204,8 +206,7 @@ export const isEqualEncoded = (a: Encoded, b: Encoded) =>
204
206
  a.sessionId === b.sessionId &&
205
207
  deepEqual(canonicalizeArgs(a.args), canonicalizeArgs(b.args)) // TODO use schema equality here
206
208
 
207
- const canonicalizeArgs = (args: unknown): unknown =>
208
- args === undefined ? args : JSON.parse(JSON.stringify(args))
209
+ const canonicalizeArgs = (args: unknown): unknown => (args === undefined ? args : JSON.parse(JSON.stringify(args)))
209
210
 
210
211
  /**
211
212
  * Creates an Effect Schema union for all event types in a schema (with composite sequence numbers).
@@ -219,7 +220,7 @@ export const makeSchema = <TSchema extends LiveStoreSchema>(
219
220
  schema: TSchema,
220
221
  ): ForEventDef.ForRecord<TSchema['_EventDefMapType']> =>
221
222
  Schema.Union(
222
- ...[...schema.eventsDefsMap.values()].map((def) =>
223
+ [...schema.eventsDefsMap.values()].map((def) =>
223
224
  Schema.Struct({
224
225
  name: Schema.Literal(def.name),
225
226
  args: def.schema,
@@ -229,7 +230,7 @@ export const makeSchema = <TSchema extends LiveStoreSchema>(
229
230
  sessionId: Schema.String,
230
231
  }),
231
232
  ),
232
- ).annotations({ title: 'LiveStoreEvent.Client' }) as any
233
+ ).annotate({ title: 'LiveStoreEvent.Client' }) as any
233
234
 
234
235
  /** Memoized `makeSchema` - caches the generated schema by reference. */
235
236
  export const makeSchemaMemo = memoizeByRef(makeSchema)
@@ -6,19 +6,19 @@ import type * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
6
6
  /** Event without sequence numbers, with decoded (native TypeScript) args. Used as input to `store.commit()`. */
7
7
  export type InputDecoded<TEventDef extends EventDef.Any> = {
8
8
  name: TEventDef['name']
9
- args: Schema.Schema.Type<TEventDef['schema']>
9
+ args: TEventDef['schema']['Type']
10
10
  }
11
11
 
12
12
  /** Event without sequence numbers, with encoded (serialized) args. Used as input to `store.commit()`. */
13
13
  export type InputEncoded<TEventDef extends EventDef.Any> = {
14
14
  name: TEventDef['name']
15
- args: Schema.Schema.Encoded<TEventDef['schema']>
15
+ args: TEventDef['schema']['Encoded']
16
16
  }
17
17
 
18
18
  /** Full event with composite sequence numbers and decoded args. Includes clientId/sessionId for sync. */
19
19
  export type Decoded<TEventDef extends EventDef.Any> = {
20
20
  name: TEventDef['name']
21
- args: Schema.Schema.Type<TEventDef['schema']>
21
+ args: TEventDef['schema']['Type']
22
22
  seqNum: EventSequenceNumber.Client.Composite
23
23
  parentSeqNum: EventSequenceNumber.Client.Composite
24
24
  clientId: string
@@ -28,7 +28,7 @@ export type Decoded<TEventDef extends EventDef.Any> = {
28
28
  /** Full event with composite sequence numbers and encoded args. Includes clientId/sessionId for sync. */
29
29
  export type Encoded<TEventDef extends EventDef.Any> = {
30
30
  name: TEventDef['name']
31
- args: Schema.Schema.Encoded<TEventDef['schema']>
31
+ args: TEventDef['schema']['Encoded']
32
32
  seqNum: EventSequenceNumber.Client.Composite
33
33
  parentSeqNum: EventSequenceNumber.Client.Composite
34
34
  clientId: string
@@ -36,11 +36,11 @@ export type Encoded<TEventDef extends EventDef.Any> = {
36
36
  }
37
37
 
38
38
  /** Effect Schema union of all event types in an EventDefRecord (with composite sequence numbers). */
39
- export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Schema<
39
+ export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Codec<
40
40
  {
41
41
  [K in keyof TEventDefRecord]: {
42
42
  name: K
43
- args: Schema.Schema.Type<TEventDefRecord[K]['schema']>
43
+ args: TEventDefRecord[K]['schema']['Type']
44
44
  seqNum: EventSequenceNumber.Client.Composite
45
45
  parentSeqNum: EventSequenceNumber.Client.Composite
46
46
  clientId: string
@@ -50,7 +50,7 @@ export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Schema<
50
50
  {
51
51
  [K in keyof TEventDefRecord]: {
52
52
  name: K
53
- args: Schema.Schema.Encoded<TEventDefRecord[K]['schema']>
53
+ args: TEventDefRecord[K]['schema']['Encoded']
54
54
  seqNum: EventSequenceNumber.Client.Composite
55
55
  parentSeqNum: EventSequenceNumber.Client.Composite
56
56
  clientId: string
@@ -23,7 +23,7 @@ export const Encoded = Schema.Struct({
23
23
  parentSeqNum: EventSequenceNumber.Global.Schema,
24
24
  clientId: Schema.String,
25
25
  sessionId: Schema.String,
26
- }).annotations({ title: 'LiveStoreEvent.Global.Encoded' })
26
+ }).annotate({ title: 'LiveStoreEvent.Global.Encoded' })
27
27
 
28
28
  /** Event with integer sequence numbers for sync backend wire format. */
29
29
  export type Encoded = typeof Encoded.Type
@@ -15,7 +15,7 @@ import type * as ForEventDef from './for-event-def.ts'
15
15
  export const Encoded = Schema.Struct({
16
16
  name: Schema.String,
17
17
  args: Schema.Any,
18
- }).annotations({ title: 'LiveStoreEvent.Input.Encoded' })
18
+ }).annotate({ title: 'LiveStoreEvent.Input.Encoded' })
19
19
 
20
20
  /** Event without sequence numbers, with decoded (native TypeScript) args. */
21
21
  export type Decoded = ForEventDef.InputDecoded<EventDef.Any>
@@ -29,17 +29,17 @@ export type ForSchema<TSchema extends LiveStoreSchema> = {
29
29
  }[keyof TSchema['_EventDefMapType']]
30
30
 
31
31
  /** Effect Schema union of all event types in an EventDefRecord (input format, no sequence numbers). */
32
- export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Schema<
32
+ export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Codec<
33
33
  {
34
34
  [K in keyof TEventDefRecord]: {
35
35
  name: K
36
- args: Schema.Schema.Type<TEventDefRecord[K]['schema']>
36
+ args: TEventDefRecord[K]['schema']['Type']
37
37
  }
38
38
  }[keyof TEventDefRecord],
39
39
  {
40
40
  [K in keyof TEventDefRecord]: {
41
41
  name: K
42
- args: Schema.Schema.Encoded<TEventDefRecord[K]['schema']>
42
+ args: TEventDefRecord[K]['schema']['Encoded']
43
43
  }
44
44
  }[keyof TEventDefRecord]
45
45
  >
@@ -54,10 +54,10 @@ export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Schema<
54
54
  */
55
55
  export const makeSchema = <TSchema extends LiveStoreSchema>(schema: TSchema): ForRecord<TSchema['_EventDefMapType']> =>
56
56
  Schema.Union(
57
- ...[...schema.eventsDefsMap.values()].map((def) =>
57
+ [...schema.eventsDefsMap.values()].map((def) =>
58
58
  Schema.Struct({
59
59
  name: Schema.Literal(def.name),
60
60
  args: def.schema,
61
61
  }),
62
62
  ),
63
- ).annotations({ title: 'LiveStoreEvent.Input' }) as any
63
+ ).annotate({ title: 'LiveStoreEvent.Input' }) as any
package/src/schema/mod.ts CHANGED
@@ -5,6 +5,7 @@ export * as LiveStoreEvent from './LiveStoreEvent/mod.ts'
5
5
  export * from './schema.ts'
6
6
  export * as State from './state/mod.ts'
7
7
  export { SqliteAst, SqliteDsl } from './state/sqlite/db-schema/mod.ts'
8
+ export * from './state/sqlite/persistence.ts'
8
9
  export * from './state/sqlite/schema-helpers.ts'
9
10
  export * as SystemTables from './state/sqlite/system-tables/mod.ts'
10
11
  export type { UnknownEvents } from './unknown-events.ts'
@@ -1,4 +1,5 @@
1
- import { isReadonlyArray, shouldNeverHappen } from '@livestore/utils'
1
+ import { shouldNeverHappen } from '@livestore/utils'
2
+ import { ReadonlyArray as EffectArray } from '@livestore/utils/effect'
2
3
 
3
4
  import type { MigrationOptions } from '../adapter-types.ts'
4
5
  import type { EventDef, EventDefRecord, Materializer } from './EventDef/mod.ts'
@@ -108,7 +109,7 @@ export const makeSchema = <TInputSchema extends InputSchema>(
108
109
 
109
110
  const eventsDefsMap = new Map<string, EventDef.AnyWithoutFn>()
110
111
 
111
- if (isReadonlyArray(inputSchema.events) === true) {
112
+ if (EffectArray.isArray<InputSchema['events']>(inputSchema.events) === true) {
112
113
  for (const eventDef of inputSchema.events) {
113
114
  eventsDefsMap.set(eventDef.name, eventDef)
114
115
  }
@@ -43,7 +43,7 @@ describe('client document table', () => {
43
43
  })
44
44
 
45
45
  describe('materializer', () => {
46
- const forSchema = <T>(schema: Schema.Schema<T, any>, value: T, id?: string, options?: { partialSet?: boolean }) => {
46
+ const forSchema = <T>(schema: Schema.Codec<T, any>, value: T, id?: string, options?: { partialSet?: boolean }) => {
47
47
  const Doc = clientDocument({
48
48
  name: 'test',
49
49
  schema,
@@ -78,9 +78,8 @@ describe('client document table', () => {
78
78
  })
79
79
 
80
80
  test('struct value (partial set=true)', () => {
81
- expect(
82
- forSchema(Schema.Struct({ a: Schema.String }), { a: 'hello' }, 'id1', { partialSet: true }),
83
- ).toMatchInlineSnapshot(`
81
+ expect(forSchema(Schema.Struct({ a: Schema.String }), { a: 'hello' }, 'id1', { partialSet: true }))
82
+ .toMatchInlineSnapshot(`
84
83
  {
85
84
  "bindValues": [
86
85
  "id1",
@@ -101,9 +100,8 @@ describe('client document table', () => {
101
100
  })
102
101
 
103
102
  test('struct value (partial set=false)', () => {
104
- expect(
105
- forSchema(Schema.Struct({ a: Schema.String }), { a: 'hello' }, 'id1', { partialSet: false }),
106
- ).toMatchInlineSnapshot(`
103
+ expect(forSchema(Schema.Struct({ a: Schema.String }), { a: 'hello' }, 'id1', { partialSet: false }))
104
+ .toMatchInlineSnapshot(`
107
105
  {
108
106
  "bindValues": [
109
107
  "id1",
@@ -121,7 +119,7 @@ describe('client document table', () => {
121
119
  test('struct value (partial set=true) advanced', () => {
122
120
  expect(
123
121
  forSchema(
124
- Schema.Struct({ a: Schema.String, b: Schema.String, c: Schema.Number }),
122
+ Schema.Struct({ a: Schema.String, b: Schema.String, c: Schema.Finite }),
125
123
  { a: 'hello', c: 123 } as any,
126
124
  'id1',
127
125
  { partialSet: true },
@@ -204,7 +202,7 @@ describe('client document table', () => {
204
202
  test('struct union value', () => {
205
203
  expect(
206
204
  forSchema(
207
- Schema.Union(Schema.Struct({ a: Schema.String }), Schema.Struct({ b: Schema.String })),
205
+ Schema.Union([Schema.Struct({ a: Schema.String }), Schema.Struct({ b: Schema.String })]),
208
206
  { a: 'hello' },
209
207
  'id1',
210
208
  ),
@@ -223,6 +221,27 @@ describe('client document table', () => {
223
221
  `)
224
222
  })
225
223
 
224
+ test('struct union with shared fields fully replaces', () => {
225
+ const ValueSchema = Schema.Union([
226
+ Schema.Struct({ kind: Schema.Literal('a'), value: Schema.String }),
227
+ Schema.Struct({ kind: Schema.Literal('b'), value: Schema.String }),
228
+ ])
229
+
230
+ expect(forSchema(ValueSchema, { kind: 'a', value: 'hello' }, 'id1')).toMatchInlineSnapshot(`
231
+ {
232
+ "bindValues": [
233
+ "id1",
234
+ "{"kind":"a","value":"hello"}",
235
+ "{"kind":"a","value":"hello"}",
236
+ ],
237
+ "sql": "INSERT INTO 'test' (id, value) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET value = ?",
238
+ "writeTables": Set {
239
+ "test",
240
+ },
241
+ }
242
+ `)
243
+ })
244
+
226
245
  test('array value', () => {
227
246
  expect(forSchema(Schema.Array(Schema.String), ['hello', 'world'], 'id1')).toMatchInlineSnapshot(`
228
247
  {
@@ -260,7 +279,7 @@ describe('client document table', () => {
260
279
  describe('optimistic schema', () => {
261
280
  /** Models persisted JSON using epoch numbers + base64 while app code expects Date + Uint8Array. */
262
281
  const valueSchema = Schema.Struct({
263
- createdAt: Schema.DateFromNumber,
282
+ createdAt: Schema.DateFromMillis,
264
283
  avatar: Schema.Uint8ArrayFromBase64,
265
284
  })
266
285
  const defaultValue = {
@@ -281,7 +300,7 @@ describe('client document table', () => {
281
300
  defaultValue,
282
301
  partialSet: false,
283
302
  })
284
- const rowSchema = Schema.parseJson(optimisticSchema)
303
+ const rowSchema = Schema.fromJsonString(optimisticSchema)
285
304
 
286
305
  expect(Schema.decodeUnknownSync(rowSchema)(JSON.stringify(value))).toEqual(defaultValue)
287
306
  })
@@ -292,7 +311,7 @@ describe('client document table', () => {
292
311
  defaultValue,
293
312
  partialSet: false,
294
313
  })
295
- const rowSchema = Schema.parseJson(optimisticSchema)
314
+ const rowSchema = Schema.fromJsonString(optimisticSchema)
296
315
 
297
316
  expect(Schema.decodeUnknownSync(rowSchema)(JSON.stringify(validPayload))).toEqual({
298
317
  createdAt: new Date(42),
@@ -306,7 +325,7 @@ describe('client document table', () => {
306
325
  defaultValue,
307
326
  partialSet: false,
308
327
  })
309
- const rowSchema = Schema.parseJson(optimisticSchema)
328
+ const rowSchema = Schema.fromJsonString(optimisticSchema)
310
329
 
311
330
  expect(Schema.decodeUnknownSync(rowSchema)(JSON.stringify(extraFieldsPayload))).toEqual({
312
331
  createdAt: new Date(42),