@livestore/common 0.4.0 → 0.5.0-dev.1

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 (501) 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 +8 -8
  17. package/dist/__tests__/fixture.d.ts.map +1 -1
  18. package/dist/__tests__/fixture.js +4 -4
  19. package/dist/__tests__/fixture.js.map +1 -1
  20. package/dist/adapter-types.d.ts +33 -57
  21. package/dist/adapter-types.d.ts.map +1 -1
  22. package/dist/adapter-types.js +24 -41
  23. package/dist/adapter-types.js.map +1 -1
  24. package/dist/bounded-collections.d.ts.map +1 -1
  25. package/dist/bounded-collections.js.map +1 -1
  26. package/dist/debug-info.d.ts +56 -56
  27. package/dist/debug-info.d.ts.map +1 -1
  28. package/dist/debug-info.js +32 -44
  29. package/dist/debug-info.js.map +1 -1
  30. package/dist/defs.d.ts +9 -9
  31. package/dist/defs.js +2 -2
  32. package/dist/devtools/devtools-compatibility.test.js +2 -1
  33. package/dist/devtools/devtools-compatibility.test.js.map +1 -1
  34. package/dist/devtools/devtools-messages-client-session.d.ts +522 -334
  35. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  36. package/dist/devtools/devtools-messages-client-session.js +80 -78
  37. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  38. package/dist/devtools/devtools-messages-common.d.ts +27 -27
  39. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  40. package/dist/devtools/devtools-messages-common.js +6 -6
  41. package/dist/devtools/devtools-messages-common.js.map +1 -1
  42. package/dist/devtools/devtools-messages-leader.d.ts +410 -348
  43. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  44. package/dist/devtools/devtools-messages-leader.js +105 -93
  45. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  46. package/dist/devtools/devtools-messages.js +3 -3
  47. package/dist/devtools/devtools-sessioninfo.d.ts +18 -19
  48. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  49. package/dist/devtools/devtools-sessioninfo.js +8 -5
  50. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  51. package/dist/devtools/mod.d.ts +4 -5
  52. package/dist/devtools/mod.d.ts.map +1 -1
  53. package/dist/devtools/mod.js +12 -8
  54. package/dist/devtools/mod.js.map +1 -1
  55. package/dist/errors.d.ts +45 -69
  56. package/dist/errors.d.ts.map +1 -1
  57. package/dist/errors.js +19 -17
  58. package/dist/errors.js.map +1 -1
  59. package/dist/index.d.ts +4 -1
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +22 -19
  62. package/dist/index.js.map +1 -1
  63. package/dist/leader-thread/LeaderSyncProcessor.d.ts +87 -18
  64. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  65. package/dist/leader-thread/LeaderSyncProcessor.js +548 -480
  66. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  67. package/dist/leader-thread/RejectedPushError.d.ts +72 -41
  68. package/dist/leader-thread/RejectedPushError.d.ts.map +1 -1
  69. package/dist/leader-thread/RejectedPushError.js +25 -6
  70. package/dist/leader-thread/RejectedPushError.js.map +1 -1
  71. package/dist/leader-thread/connection.d.ts +1 -0
  72. package/dist/leader-thread/connection.d.ts.map +1 -1
  73. package/dist/leader-thread/connection.js +11 -10
  74. package/dist/leader-thread/connection.js.map +1 -1
  75. package/dist/leader-thread/eventlog.d.ts +15 -5
  76. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  77. package/dist/leader-thread/eventlog.js +19 -19
  78. package/dist/leader-thread/eventlog.js.map +1 -1
  79. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
  80. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  81. package/dist/leader-thread/leader-worker-devtools.js +36 -20
  82. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  83. package/dist/leader-thread/make-leader-thread-layer.d.ts +15 -5
  84. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  85. package/dist/leader-thread/make-leader-thread-layer.js +62 -58
  86. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  87. package/dist/leader-thread/make-leader-thread-layer.test.js +9 -9
  88. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -1
  89. package/dist/leader-thread/materialize-event.d.ts +2 -1
  90. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  91. package/dist/leader-thread/materialize-event.js +12 -8
  92. package/dist/leader-thread/materialize-event.js.map +1 -1
  93. package/dist/leader-thread/mod.js +9 -9
  94. package/dist/leader-thread/recreate-db.d.ts +5 -1
  95. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  96. package/dist/leader-thread/recreate-db.js +34 -59
  97. package/dist/leader-thread/recreate-db.js.map +1 -1
  98. package/dist/leader-thread/shutdown-channel.d.ts +2 -6
  99. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  100. package/dist/leader-thread/shutdown-channel.js +2 -3
  101. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  102. package/dist/leader-thread/stream-events.d.ts +4 -7
  103. package/dist/leader-thread/stream-events.d.ts.map +1 -1
  104. package/dist/leader-thread/stream-events.js +16 -21
  105. package/dist/leader-thread/stream-events.js.map +1 -1
  106. package/dist/leader-thread/types.d.ts +38 -73
  107. package/dist/leader-thread/types.d.ts.map +1 -1
  108. package/dist/leader-thread/types.js +10 -6
  109. package/dist/leader-thread/types.js.map +1 -1
  110. package/dist/logging.d.ts +5 -30
  111. package/dist/logging.d.ts.map +1 -1
  112. package/dist/logging.js +1 -32
  113. package/dist/logging.js.map +1 -1
  114. package/dist/make-client-session.d.ts +2 -3
  115. package/dist/make-client-session.d.ts.map +1 -1
  116. package/dist/make-client-session.js +5 -5
  117. package/dist/make-client-session.js.map +1 -1
  118. package/dist/materializer-helper.d.ts +0 -1
  119. package/dist/materializer-helper.d.ts.map +1 -1
  120. package/dist/materializer-helper.js +9 -37
  121. package/dist/materializer-helper.js.map +1 -1
  122. package/dist/otel.d.ts +2 -3
  123. package/dist/otel.d.ts.map +1 -1
  124. package/dist/otel.js +2 -7
  125. package/dist/otel.js.map +1 -1
  126. package/dist/rematerialize-from-eventlog.d.ts +3 -1
  127. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  128. package/dist/rematerialize-from-eventlog.js +42 -33
  129. package/dist/rematerialize-from-eventlog.js.map +1 -1
  130. package/dist/schema/EventDef/define.d.ts +6 -6
  131. package/dist/schema/EventDef/define.d.ts.map +1 -1
  132. package/dist/schema/EventDef/define.js +5 -5
  133. package/dist/schema/EventDef/define.js.map +1 -1
  134. package/dist/schema/EventDef/define.test.d.ts +2 -0
  135. package/dist/schema/EventDef/define.test.d.ts.map +1 -0
  136. package/dist/schema/EventDef/define.test.js +23 -0
  137. package/dist/schema/EventDef/define.test.js.map +1 -0
  138. package/dist/schema/EventDef/deprecated.d.ts +8 -13
  139. package/dist/schema/EventDef/deprecated.d.ts.map +1 -1
  140. package/dist/schema/EventDef/deprecated.js +12 -13
  141. package/dist/schema/EventDef/deprecated.js.map +1 -1
  142. package/dist/schema/EventDef/deprecated.test.js +3 -3
  143. package/dist/schema/EventDef/deprecated.test.js.map +1 -1
  144. package/dist/schema/EventDef/event-def.d.ts +1 -1
  145. package/dist/schema/EventDef/event-def.d.ts.map +1 -1
  146. package/dist/schema/EventDef/facts.d.ts.map +1 -1
  147. package/dist/schema/EventDef/materializer.d.ts +2 -2
  148. package/dist/schema/EventDef/materializer.d.ts.map +1 -1
  149. package/dist/schema/EventDef/mod.js +5 -5
  150. package/dist/schema/EventSequenceNumber/client.d.ts +12 -17
  151. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -1
  152. package/dist/schema/EventSequenceNumber/client.js +20 -24
  153. package/dist/schema/EventSequenceNumber/client.js.map +1 -1
  154. package/dist/schema/EventSequenceNumber/global.d.ts +2 -2
  155. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -1
  156. package/dist/schema/EventSequenceNumber/global.js +1 -1
  157. package/dist/schema/EventSequenceNumber/global.js.map +1 -1
  158. package/dist/schema/EventSequenceNumber/mod.js +2 -2
  159. package/dist/schema/EventSequenceNumber.test.js +6 -6
  160. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  161. package/dist/schema/LiveStoreEvent/client.d.ts +58 -187
  162. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -1
  163. package/dist/schema/LiveStoreEvent/client.js +33 -30
  164. package/dist/schema/LiveStoreEvent/client.js.map +1 -1
  165. package/dist/schema/LiveStoreEvent/client.test.js +13 -4
  166. package/dist/schema/LiveStoreEvent/client.test.js.map +1 -1
  167. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +7 -7
  168. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -1
  169. package/dist/schema/LiveStoreEvent/global.d.ts +6 -6
  170. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -1
  171. package/dist/schema/LiveStoreEvent/global.js +2 -2
  172. package/dist/schema/LiveStoreEvent/global.js.map +1 -1
  173. package/dist/schema/LiveStoreEvent/input.d.ts +6 -6
  174. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -1
  175. package/dist/schema/LiveStoreEvent/input.js +3 -3
  176. package/dist/schema/LiveStoreEvent/input.js.map +1 -1
  177. package/dist/schema/LiveStoreEvent/mod.js +4 -4
  178. package/dist/schema/events.js +1 -1
  179. package/dist/schema/mod.d.ts +1 -0
  180. package/dist/schema/mod.d.ts.map +1 -1
  181. package/dist/schema/mod.js +11 -10
  182. package/dist/schema/mod.js.map +1 -1
  183. package/dist/schema/schema.d.ts +1 -1
  184. package/dist/schema/schema.d.ts.map +1 -1
  185. package/dist/schema/schema.js +6 -5
  186. package/dist/schema/schema.js.map +1 -1
  187. package/dist/schema/state/mod.js +2 -2
  188. package/dist/schema/state/sqlite/client-document-def.d.ts +13 -18
  189. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  190. package/dist/schema/state/sqlite/client-document-def.js +30 -27
  191. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  192. package/dist/schema/state/sqlite/client-document-def.test.js +53 -18
  193. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  194. package/dist/schema/state/sqlite/column-annotations.d.ts +13 -13
  195. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  196. package/dist/schema/state/sqlite/column-annotations.js +13 -15
  197. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  198. package/dist/schema/state/sqlite/column-annotations.test.js +19 -43
  199. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  200. package/dist/schema/state/sqlite/column-def.d.ts +1 -1
  201. package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
  202. package/dist/schema/state/sqlite/column-def.js +73 -33
  203. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  204. package/dist/schema/state/sqlite/column-def.test.js +176 -75
  205. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  206. package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
  207. package/dist/schema/state/sqlite/column-spec.js +1 -1
  208. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  209. package/dist/schema/state/sqlite/column-spec.test.js +4 -4
  210. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  211. package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.d.ts +3 -0
  212. package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.d.ts.map +1 -0
  213. package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.js +5 -0
  214. package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.js.map +1 -0
  215. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.d.ts +5 -0
  216. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.d.ts.map +1 -0
  217. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.js +183 -0
  218. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.js.map +1 -0
  219. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.d.ts +2 -0
  220. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.d.ts.map +1 -0
  221. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.js +142 -0
  222. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.js.map +1 -0
  223. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +3 -8
  224. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
  225. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +1 -73
  226. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  227. package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts.map +1 -1
  228. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +9 -9
  229. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  230. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +9 -13
  231. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  232. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +28 -17
  233. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
  234. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +13 -11
  235. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  236. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +6 -4
  237. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  238. package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.d.ts +3 -0
  239. package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.d.ts.map +1 -0
  240. package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.js +6 -0
  241. package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.js.map +1 -0
  242. package/dist/schema/state/sqlite/db-schema/mod.js +2 -2
  243. package/dist/schema/state/sqlite/mod.d.ts +1 -3
  244. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  245. package/dist/schema/state/sqlite/mod.js +11 -10
  246. package/dist/schema/state/sqlite/mod.js.map +1 -1
  247. package/dist/schema/state/sqlite/persistence.d.ts +11 -0
  248. package/dist/schema/state/sqlite/persistence.d.ts.map +1 -0
  249. package/dist/schema/state/sqlite/persistence.js +10 -0
  250. package/dist/schema/state/sqlite/persistence.js.map +1 -0
  251. package/dist/schema/state/sqlite/query-builder/api.d.ts +7 -7
  252. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  253. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  254. package/dist/schema/state/sqlite/query-builder/astToSql.js +22 -23
  255. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  256. package/dist/schema/state/sqlite/query-builder/impl.d.ts +1 -1
  257. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  258. package/dist/schema/state/sqlite/query-builder/impl.js +18 -16
  259. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  260. package/dist/schema/state/sqlite/query-builder/impl.test.js +364 -598
  261. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  262. package/dist/schema/state/sqlite/query-builder/mod.js +2 -2
  263. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
  264. package/dist/schema/state/sqlite/schema-helpers.js +2 -2
  265. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  266. package/dist/schema/state/sqlite/schema-helpers.test.js +2 -2
  267. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts +102 -134
  268. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -1
  269. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +5 -5
  270. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -1
  271. package/dist/schema/state/sqlite/system-tables/mod.js +2 -2
  272. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +380 -115
  273. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -1
  274. package/dist/schema/state/sqlite/system-tables/state-tables.js +47 -6
  275. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -1
  276. package/dist/schema/state/sqlite/table-def.d.ts +17 -20
  277. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  278. package/dist/schema/state/sqlite/table-def.js +72 -6
  279. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  280. package/dist/schema/state/sqlite/table-def.test.js +207 -37
  281. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  282. package/dist/schema/unknown-events.d.ts.map +1 -1
  283. package/dist/schema/unknown-events.js +3 -2
  284. package/dist/schema/unknown-events.js.map +1 -1
  285. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +28 -6
  286. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -1
  287. package/dist/schema-management/common.d.ts.map +1 -1
  288. package/dist/schema-management/common.js +2 -2
  289. package/dist/schema-management/migrations.d.ts +4 -4
  290. package/dist/schema-management/migrations.d.ts.map +1 -1
  291. package/dist/schema-management/migrations.js +9 -9
  292. package/dist/schema-management/migrations.js.map +1 -1
  293. package/dist/schema-management/validate-schema.d.ts.map +1 -1
  294. package/dist/schema-management/validate-schema.js +1 -1
  295. package/dist/session-id-symbol.d.ts +29 -0
  296. package/dist/session-id-symbol.d.ts.map +1 -0
  297. package/dist/session-id-symbol.js +44 -0
  298. package/dist/session-id-symbol.js.map +1 -0
  299. package/dist/sql-queries/index.js +3 -3
  300. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  301. package/dist/sql-queries/sql-queries.js +11 -13
  302. package/dist/sql-queries/sql-queries.js.map +1 -1
  303. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  304. package/dist/sql-queries/sql-query-builder.js +1 -1
  305. package/dist/sql-queries/types.d.ts +6 -7
  306. package/dist/sql-queries/types.d.ts.map +1 -1
  307. package/dist/sql-queries/types.js.map +1 -1
  308. package/dist/sqlite-db-helper.d.ts +23 -3
  309. package/dist/sqlite-db-helper.d.ts.map +1 -1
  310. package/dist/sqlite-db-helper.js +39 -4
  311. package/dist/sqlite-db-helper.js.map +1 -1
  312. package/dist/sqlite-types.d.ts +3 -6
  313. package/dist/sqlite-types.d.ts.map +1 -1
  314. package/dist/sqlite-types.js +3 -3
  315. package/dist/sqlite-types.js.map +1 -1
  316. package/dist/sync/ClientSessionSyncProcessor.d.ts +41 -19
  317. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  318. package/dist/sync/ClientSessionSyncProcessor.js +200 -70
  319. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  320. package/dist/sync/errors.d.ts +12 -18
  321. package/dist/sync/errors.d.ts.map +1 -1
  322. package/dist/sync/errors.js +3 -3
  323. package/dist/sync/errors.js.map +1 -1
  324. package/dist/sync/index.js +6 -6
  325. package/dist/sync/mock-sync-backend.d.ts +2 -3
  326. package/dist/sync/mock-sync-backend.d.ts.map +1 -1
  327. package/dist/sync/mock-sync-backend.js +58 -37
  328. package/dist/sync/mock-sync-backend.js.map +1 -1
  329. package/dist/sync/mock-sync-backend.test.d.ts +2 -0
  330. package/dist/sync/mock-sync-backend.test.d.ts.map +1 -0
  331. package/dist/sync/mock-sync-backend.test.js +49 -0
  332. package/dist/sync/mock-sync-backend.test.js.map +1 -0
  333. package/dist/sync/next/compact-events.d.ts.map +1 -1
  334. package/dist/sync/next/compact-events.js +3 -3
  335. package/dist/sync/next/facts.d.ts.map +1 -1
  336. package/dist/sync/next/facts.js +1 -1
  337. package/dist/sync/next/history-dag-common.d.ts +5 -1
  338. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  339. package/dist/sync/next/history-dag-common.js +53 -32
  340. package/dist/sync/next/history-dag-common.js.map +1 -1
  341. package/dist/sync/next/history-dag.d.ts.map +1 -1
  342. package/dist/sync/next/history-dag.js +5 -4
  343. package/dist/sync/next/history-dag.js.map +1 -1
  344. package/dist/sync/next/mod.js +5 -5
  345. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  346. package/dist/sync/next/rebase-events.js +2 -2
  347. package/dist/sync/next/test/compact-events.calculator.test.js +6 -6
  348. package/dist/sync/next/test/compact-events.test.js +4 -4
  349. package/dist/sync/next/test/event-fixtures.d.ts +8 -8
  350. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  351. package/dist/sync/next/test/event-fixtures.js +6 -6
  352. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  353. package/dist/sync/next/test/history-dag-common.test.d.ts +2 -0
  354. package/dist/sync/next/test/history-dag-common.test.d.ts.map +1 -0
  355. package/dist/sync/next/test/history-dag-common.test.js +73 -0
  356. package/dist/sync/next/test/history-dag-common.test.js.map +1 -0
  357. package/dist/sync/next/test/mod.js +1 -1
  358. package/dist/sync/sync-backend-kv.d.ts.map +1 -1
  359. package/dist/sync/sync-backend-kv.js +5 -3
  360. package/dist/sync/sync-backend-kv.js.map +1 -1
  361. package/dist/sync/sync-backend.d.ts +15 -15
  362. package/dist/sync/sync-backend.d.ts.map +1 -1
  363. package/dist/sync/sync-backend.js +10 -6
  364. package/dist/sync/sync-backend.js.map +1 -1
  365. package/dist/sync/sync.d.ts +1 -1
  366. package/dist/sync/sync.d.ts.map +1 -1
  367. package/dist/sync/sync.js +2 -2
  368. package/dist/sync/syncstate.d.ts +100 -176
  369. package/dist/sync/syncstate.d.ts.map +1 -1
  370. package/dist/sync/syncstate.js +36 -39
  371. package/dist/sync/syncstate.js.map +1 -1
  372. package/dist/sync/syncstate.test.js +103 -64
  373. package/dist/sync/syncstate.test.js.map +1 -1
  374. package/dist/sync/transport-chunking.d.ts +15 -16
  375. package/dist/sync/transport-chunking.d.ts.map +1 -1
  376. package/dist/sync/transport-chunking.js +23 -32
  377. package/dist/sync/transport-chunking.js.map +1 -1
  378. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  379. package/dist/sync/validate-push-payload.js +2 -2
  380. package/dist/testing/event-factory.d.ts.map +1 -1
  381. package/dist/testing/event-factory.js +2 -2
  382. package/dist/testing/event-factory.js.map +1 -1
  383. package/dist/testing/mod.js +1 -1
  384. package/dist/util.d.ts +11 -4
  385. package/dist/util.d.ts.map +1 -1
  386. package/dist/util.js +20 -2
  387. package/dist/util.js.map +1 -1
  388. package/dist/version.d.ts.map +1 -1
  389. package/dist/version.js.map +1 -1
  390. package/package.json +40 -57
  391. package/src/ClientSessionLeaderThreadProxy.ts +1 -1
  392. package/src/MaterializationJournal.ts +184 -0
  393. package/src/StateHead.ts +80 -0
  394. package/src/WorkerTransportError.ts +4 -4
  395. package/src/__tests__/fixture.ts +3 -3
  396. package/src/adapter-types.ts +28 -61
  397. package/src/debug-info.ts +53 -70
  398. package/src/defs.ts +2 -2
  399. package/src/devtools/devtools-compatibility.test.ts +1 -0
  400. package/src/devtools/devtools-messages-client-session.ts +56 -65
  401. package/src/devtools/devtools-messages-common.ts +12 -11
  402. package/src/devtools/devtools-messages-leader.ts +71 -69
  403. package/src/devtools/devtools-sessioninfo.ts +13 -11
  404. package/src/devtools/mod.ts +4 -5
  405. package/src/errors.ts +46 -34
  406. package/src/index.ts +8 -1
  407. package/src/leader-thread/LeaderSyncProcessor.ts +777 -650
  408. package/src/leader-thread/RejectedPushError.ts +40 -27
  409. package/src/leader-thread/connection.ts +12 -8
  410. package/src/leader-thread/eventlog.ts +20 -12
  411. package/src/leader-thread/leader-worker-devtools.ts +38 -20
  412. package/src/leader-thread/make-leader-thread-layer.test.ts +7 -7
  413. package/src/leader-thread/make-leader-thread-layer.ts +100 -71
  414. package/src/leader-thread/materialize-event.ts +13 -8
  415. package/src/leader-thread/recreate-db.ts +41 -75
  416. package/src/leader-thread/shutdown-channel.ts +3 -14
  417. package/src/leader-thread/stream-events.ts +102 -101
  418. package/src/leader-thread/types.ts +29 -62
  419. package/src/logging.ts +5 -52
  420. package/src/make-client-session.ts +6 -6
  421. package/src/materializer-helper.ts +7 -36
  422. package/src/otel.ts +5 -14
  423. package/src/rematerialize-from-eventlog.ts +116 -98
  424. package/src/schema/EventDef/define.test.ts +28 -0
  425. package/src/schema/EventDef/define.ts +20 -19
  426. package/src/schema/EventDef/deprecated.test.ts +1 -8
  427. package/src/schema/EventDef/deprecated.ts +17 -20
  428. package/src/schema/EventDef/event-def.ts +2 -4
  429. package/src/schema/EventSequenceNumber/client.ts +20 -24
  430. package/src/schema/EventSequenceNumber/global.ts +1 -1
  431. package/src/schema/EventSequenceNumber.test.ts +5 -5
  432. package/src/schema/LiveStoreEvent/client.test.ts +17 -4
  433. package/src/schema/LiveStoreEvent/client.ts +36 -35
  434. package/src/schema/LiveStoreEvent/for-event-def.ts +7 -7
  435. package/src/schema/LiveStoreEvent/global.ts +1 -1
  436. package/src/schema/LiveStoreEvent/input.ts +6 -6
  437. package/src/schema/mod.ts +1 -0
  438. package/src/schema/schema.ts +4 -3
  439. package/src/schema/state/sqlite/client-document-def.test.ts +55 -20
  440. package/src/schema/state/sqlite/client-document-def.ts +95 -80
  441. package/src/schema/state/sqlite/column-annotations.test.ts +26 -45
  442. package/src/schema/state/sqlite/column-annotations.ts +26 -30
  443. package/src/schema/state/sqlite/column-def.test.ts +213 -77
  444. package/src/schema/state/sqlite/column-def.ts +87 -37
  445. package/src/schema/state/sqlite/column-spec.test.ts +2 -2
  446. package/src/schema/state/sqlite/column-spec.ts +3 -2
  447. package/src/schema/state/sqlite/db-schema/ast/fingerprint-digest.ts +6 -0
  448. package/src/schema/state/sqlite/db-schema/ast/fingerprint.test.ts +209 -0
  449. package/src/schema/state/sqlite/db-schema/ast/fingerprint.ts +225 -0
  450. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +2 -81
  451. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +123 -63
  452. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -16
  453. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +26 -31
  454. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +35 -21
  455. package/src/schema/state/sqlite/db-schema/has-json-string-encoding.ts +9 -0
  456. package/src/schema/state/sqlite/mod.ts +4 -5
  457. package/src/schema/state/sqlite/persistence.ts +11 -0
  458. package/src/schema/state/sqlite/query-builder/api.ts +9 -9
  459. package/src/schema/state/sqlite/query-builder/astToSql.ts +24 -26
  460. package/src/schema/state/sqlite/query-builder/impl.test.ts +433 -669
  461. package/src/schema/state/sqlite/query-builder/impl.ts +19 -15
  462. package/src/schema/state/sqlite/schema-helpers.ts +1 -1
  463. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +2 -2
  464. package/src/schema/state/sqlite/system-tables/state-tables.ts +54 -3
  465. package/src/schema/state/sqlite/table-def.test.ts +270 -66
  466. package/src/schema/state/sqlite/table-def.ts +112 -45
  467. package/src/schema/unknown-events.ts +3 -2
  468. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +35 -4
  469. package/src/schema-management/migrations.ts +7 -6
  470. package/src/session-id-symbol.ts +59 -0
  471. package/src/sql-queries/sql-queries.ts +9 -13
  472. package/src/sql-queries/types.ts +6 -7
  473. package/src/sqlite-db-helper.ts +64 -2
  474. package/src/sqlite-types.ts +5 -8
  475. package/src/sync/ClientSessionSyncProcessor.ts +303 -119
  476. package/src/sync/errors.ts +14 -12
  477. package/src/sync/mock-sync-backend.test.ts +78 -0
  478. package/src/sync/mock-sync-backend.ts +93 -47
  479. package/src/sync/next/history-dag-common.ts +60 -34
  480. package/src/sync/next/history-dag.ts +4 -1
  481. package/src/sync/next/test/compact-events.calculator.test.ts +2 -2
  482. package/src/sync/next/test/event-fixtures.ts +1 -1
  483. package/src/sync/next/test/history-dag-common.test.ts +87 -0
  484. package/src/sync/sync-backend-kv.ts +4 -2
  485. package/src/sync/sync-backend.ts +15 -15
  486. package/src/sync/sync.ts +1 -1
  487. package/src/sync/syncstate.test.ts +191 -140
  488. package/src/sync/syncstate.ts +63 -53
  489. package/src/sync/transport-chunking.ts +34 -39
  490. package/src/util.ts +19 -9
  491. package/src/version.ts +1 -2
  492. package/dist/schema/state/sqlite/db-schema/hash.d.ts +0 -2
  493. package/dist/schema/state/sqlite/db-schema/hash.d.ts.map +0 -1
  494. package/dist/schema/state/sqlite/db-schema/hash.js +0 -15
  495. package/dist/schema/state/sqlite/db-schema/hash.js.map +0 -1
  496. package/dist/sql-queries/misc.d.ts +0 -2
  497. package/dist/sql-queries/misc.d.ts.map +0 -1
  498. package/dist/sql-queries/misc.js +0 -2
  499. package/dist/sql-queries/misc.js.map +0 -1
  500. package/src/schema/state/sqlite/db-schema/hash.ts +0 -13
  501. package/src/sql-queries/misc.ts +0 -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'
@@ -72,7 +73,7 @@ export interface InternalState {
72
73
  readonly tables: Map<string, TableDef.Any>
73
74
  readonly migrations: MigrationOptions
74
75
  /** Compound hash of all table defs etc */
75
- readonly hash: number
76
+ readonly hash: string
76
77
  }
77
78
  readonly materializers: Map<string, Materializer>
78
79
  }
@@ -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
  }
@@ -10,9 +10,25 @@ import {
10
10
  createOptimisticEventSchema,
11
11
  mergeDefaultValues,
12
12
  } from './client-document-def.ts'
13
+ import { fingerprint } from './db-schema/ast/fingerprint.ts'
13
14
  import { getResultSchema } from './query-builder/impl.ts'
14
15
 
15
16
  describe('client document table', () => {
17
+ test('tracks application value-schema changes in the storage fingerprint', () => {
18
+ const first = clientDocument({
19
+ name: 'documents',
20
+ schema: Schema.Struct({ title: Schema.String.check(Schema.isMinLength(1)) }),
21
+ default: { id: 'default', value: { title: 'valid' } },
22
+ })
23
+ const second = clientDocument({
24
+ name: 'documents',
25
+ schema: Schema.Struct({ title: Schema.String.check(Schema.isMinLength(2)) }),
26
+ default: { id: 'default', value: { title: 'valid' } },
27
+ })
28
+
29
+ expect(fingerprint(first.sqliteDef.ast)).not.toBe(fingerprint(second.sqliteDef.ast))
30
+ })
31
+
16
32
  test('set event', () => {
17
33
  expect(patchId(tables.UiState.set({ showSidebar: false }, 'session-1'))).toMatchInlineSnapshot(`
18
34
  {
@@ -43,7 +59,7 @@ describe('client document table', () => {
43
59
  })
44
60
 
45
61
  describe('materializer', () => {
46
- const forSchema = <T>(schema: Schema.Schema<T, any>, value: T, id?: string, options?: { partialSet?: boolean }) => {
62
+ const forSchema = <T>(schema: Schema.Codec<T, any>, value: T, id?: string, options?: { partialSet?: boolean }) => {
47
63
  const Doc = clientDocument({
48
64
  name: 'test',
49
65
  schema,
@@ -78,9 +94,8 @@ describe('client document table', () => {
78
94
  })
79
95
 
80
96
  test('struct value (partial set=true)', () => {
81
- expect(
82
- forSchema(Schema.Struct({ a: Schema.String }), { a: 'hello' }, 'id1', { partialSet: true }),
83
- ).toMatchInlineSnapshot(`
97
+ expect(forSchema(Schema.Struct({ a: Schema.String }), { a: 'hello' }, 'id1', { partialSet: true }))
98
+ .toMatchInlineSnapshot(`
84
99
  {
85
100
  "bindValues": [
86
101
  "id1",
@@ -101,9 +116,8 @@ describe('client document table', () => {
101
116
  })
102
117
 
103
118
  test('struct value (partial set=false)', () => {
104
- expect(
105
- forSchema(Schema.Struct({ a: Schema.String }), { a: 'hello' }, 'id1', { partialSet: false }),
106
- ).toMatchInlineSnapshot(`
119
+ expect(forSchema(Schema.Struct({ a: Schema.String }), { a: 'hello' }, 'id1', { partialSet: false }))
120
+ .toMatchInlineSnapshot(`
107
121
  {
108
122
  "bindValues": [
109
123
  "id1",
@@ -121,7 +135,7 @@ describe('client document table', () => {
121
135
  test('struct value (partial set=true) advanced', () => {
122
136
  expect(
123
137
  forSchema(
124
- Schema.Struct({ a: Schema.String, b: Schema.String, c: Schema.Number }),
138
+ Schema.Struct({ a: Schema.String, b: Schema.String, c: Schema.Finite }),
125
139
  { a: 'hello', c: 123 } as any,
126
140
  'id1',
127
141
  { partialSet: true },
@@ -204,7 +218,7 @@ describe('client document table', () => {
204
218
  test('struct union value', () => {
205
219
  expect(
206
220
  forSchema(
207
- Schema.Union(Schema.Struct({ a: Schema.String }), Schema.Struct({ b: Schema.String })),
221
+ Schema.Union([Schema.Struct({ a: Schema.String }), Schema.Struct({ b: Schema.String })]),
208
222
  { a: 'hello' },
209
223
  'id1',
210
224
  ),
@@ -223,6 +237,27 @@ describe('client document table', () => {
223
237
  `)
224
238
  })
225
239
 
240
+ test('struct union with shared fields fully replaces', () => {
241
+ const ValueSchema = Schema.Union([
242
+ Schema.Struct({ kind: Schema.Literal('a'), value: Schema.String }),
243
+ Schema.Struct({ kind: Schema.Literal('b'), value: Schema.String }),
244
+ ])
245
+
246
+ expect(forSchema(ValueSchema, { kind: 'a', value: 'hello' }, 'id1')).toMatchInlineSnapshot(`
247
+ {
248
+ "bindValues": [
249
+ "id1",
250
+ "{"kind":"a","value":"hello"}",
251
+ "{"kind":"a","value":"hello"}",
252
+ ],
253
+ "sql": "INSERT INTO 'test' (id, value) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET value = ?",
254
+ "writeTables": Set {
255
+ "test",
256
+ },
257
+ }
258
+ `)
259
+ })
260
+
226
261
  test('array value', () => {
227
262
  expect(forSchema(Schema.Array(Schema.String), ['hello', 'world'], 'id1')).toMatchInlineSnapshot(`
228
263
  {
@@ -260,7 +295,7 @@ describe('client document table', () => {
260
295
  describe('optimistic schema', () => {
261
296
  /** Models persisted JSON using epoch numbers + base64 while app code expects Date + Uint8Array. */
262
297
  const valueSchema = Schema.Struct({
263
- createdAt: Schema.DateFromNumber,
298
+ createdAt: Schema.DateFromMillis,
264
299
  avatar: Schema.Uint8ArrayFromBase64,
265
300
  })
266
301
  const defaultValue = {
@@ -281,9 +316,9 @@ describe('client document table', () => {
281
316
  defaultValue,
282
317
  partialSet: false,
283
318
  })
284
- const rowSchema = Schema.parseJson(optimisticSchema)
319
+ const rowSchema = Schema.fromJsonString(optimisticSchema)
285
320
 
286
- expect(Schema.decodeUnknownSync(rowSchema)(JSON.stringify(value))).toEqual(defaultValue)
321
+ expect(Schema.decodeSync(rowSchema)(JSON.stringify(value))).toEqual(defaultValue)
287
322
  })
288
323
 
289
324
  test('decodes valid persisted JSON (encoded shape)', () => {
@@ -292,9 +327,9 @@ describe('client document table', () => {
292
327
  defaultValue,
293
328
  partialSet: false,
294
329
  })
295
- const rowSchema = Schema.parseJson(optimisticSchema)
330
+ const rowSchema = Schema.fromJsonString(optimisticSchema)
296
331
 
297
- expect(Schema.decodeUnknownSync(rowSchema)(JSON.stringify(validPayload))).toEqual({
332
+ expect(Schema.decodeSync(rowSchema)(JSON.stringify(validPayload))).toEqual({
298
333
  createdAt: new Date(42),
299
334
  avatar: new Uint8Array([1, 2]),
300
335
  })
@@ -306,9 +341,9 @@ describe('client document table', () => {
306
341
  defaultValue,
307
342
  partialSet: false,
308
343
  })
309
- const rowSchema = Schema.parseJson(optimisticSchema)
344
+ const rowSchema = Schema.fromJsonString(optimisticSchema)
310
345
 
311
- expect(Schema.decodeUnknownSync(rowSchema)(JSON.stringify(extraFieldsPayload))).toEqual({
346
+ expect(Schema.decodeSync(rowSchema)(JSON.stringify(extraFieldsPayload))).toEqual({
312
347
  createdAt: new Date(42),
313
348
  avatar: new Uint8Array([1, 2]),
314
349
  })
@@ -326,7 +361,7 @@ describe('client document table', () => {
326
361
  value: JSON.stringify(value),
327
362
  }
328
363
 
329
- expect(Schema.decodeUnknownSync(Doc.rowSchema)(row)).toEqual({ id: 'row-1', value: defaultValue })
364
+ expect(Schema.decodeSync(Doc.rowSchema)(row)).toEqual({ id: 'row-1', value: defaultValue })
330
365
  })
331
366
 
332
367
  test('decodes clientDocument rowSchema with valid encoded JSON', () => {
@@ -341,7 +376,7 @@ describe('client document table', () => {
341
376
  value: JSON.stringify(validPayload),
342
377
  }
343
378
 
344
- expect(Schema.decodeUnknownSync(Doc.rowSchema)(row)).toEqual({
379
+ expect(Schema.decodeSync(Doc.rowSchema)(row)).toEqual({
345
380
  id: 'row-1',
346
381
  value: { createdAt: new Date(42), avatar: new Uint8Array([1, 2]) },
347
382
  })
@@ -363,7 +398,7 @@ describe('client document table', () => {
363
398
  },
364
399
  ]
365
400
 
366
- expect(Schema.decodeUnknownSync(resultSchema)(rawDbResults)).toEqual(defaultValue)
401
+ expect(Schema.decodeSync(resultSchema)(rawDbResults)).toEqual(defaultValue)
367
402
  })
368
403
 
369
404
  test('decodes RowQuery result schema with valid encoded JSON', () => {
@@ -382,7 +417,7 @@ describe('client document table', () => {
382
417
  },
383
418
  ]
384
419
 
385
- expect(Schema.decodeUnknownSync(resultSchema)(rawDbResults)).toEqual({
420
+ expect(Schema.decodeSync(resultSchema)(rawDbResults)).toEqual({
386
421
  createdAt: new Date(42),
387
422
  avatar: new Uint8Array([1, 2]),
388
423
  })