@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
@@ -4,33 +4,52 @@ import { Schema } from '@livestore/utils/effect'
4
4
 
5
5
  import * as F from './field-defs.ts'
6
6
 
7
- describe.concurrent('FieldDefs', () => {
7
+ describe('FieldDefs', () => {
8
8
  test('text', () => {
9
- expect(F.text()).toMatchSnapshot()
10
- expect(F.text({})).toMatchSnapshot()
11
- expect(F.text({ default: null, nullable: true })).toMatchSnapshot()
12
- expect(F.text({ schema: Schema.Literal('foo'), nullable: true, default: 'foo' })).toMatchSnapshot()
13
- expect(F.text({ schema: Schema.Union(Schema.Literal('foo')), nullable: true, default: 'foo' })).toMatchSnapshot()
9
+ expect(columnDefSnapshot(F.text())).toMatchSnapshot()
10
+ expect(columnDefSnapshot(F.text({}))).toMatchSnapshot()
11
+ expect(columnDefSnapshot(F.text({ default: null, nullable: true }))).toMatchSnapshot()
12
+ expect(
13
+ columnDefSnapshot(F.text({ schema: Schema.Literal('foo'), nullable: true, default: 'foo' })),
14
+ ).toMatchSnapshot()
15
+ expect(
16
+ columnDefSnapshot(F.text({ schema: Schema.Union([Schema.Literal('foo')]), nullable: true, default: 'foo' })),
17
+ ).toMatchSnapshot()
14
18
  })
15
19
 
16
20
  test('json', () => {
17
- expect(F.json()).toMatchSnapshot()
18
- expect(F.json({ default: null, nullable: true })).toMatchSnapshot()
21
+ expect(columnDefSnapshot(F.json())).toMatchSnapshot()
22
+ expect(columnDefSnapshot(F.json({ default: null, nullable: true }))).toMatchSnapshot()
19
23
  expect(
20
- F.json({ schema: Schema.Struct({ name: Schema.String }), default: { name: 'Bob' }, nullable: true }),
24
+ columnDefSnapshot(
25
+ F.json({ schema: Schema.Struct({ name: Schema.String }), default: { name: 'Bob' }, nullable: true }),
26
+ ),
21
27
  ).toMatchSnapshot()
22
28
  })
23
29
 
24
30
  test('datetime', () => {
25
- expect(F.datetime()).toMatchSnapshot()
26
- expect(F.datetime({})).toMatchSnapshot()
27
- expect(F.datetime({ default: null, nullable: true })).toMatchSnapshot()
28
- expect(F.datetime({ default: new Date('2022-02-02') })).toMatchSnapshot()
31
+ expect(columnDefSnapshot(F.datetime())).toMatchSnapshot()
32
+ expect(columnDefSnapshot(F.datetime({}))).toMatchSnapshot()
33
+ expect(columnDefSnapshot(F.datetime({ default: null, nullable: true }))).toMatchSnapshot()
34
+ expect(columnDefSnapshot(F.datetime({ default: new Date('2022-02-02') }))).toMatchSnapshot()
29
35
  })
30
36
 
31
37
  test('boolean', () => {
32
- expect(F.boolean()).toMatchSnapshot()
33
- expect(F.boolean({})).toMatchSnapshot()
34
- expect(F.boolean({ default: false })).toMatchSnapshot()
38
+ expect(columnDefSnapshot(F.boolean())).toMatchSnapshot()
39
+ expect(columnDefSnapshot(F.boolean({}))).toMatchSnapshot()
40
+ expect(columnDefSnapshot(F.boolean({ default: false }))).toMatchSnapshot()
35
41
  })
36
42
  })
43
+
44
+ const columnDefSnapshot = (columnDef: F.ColumnDefinition.Any) => ({
45
+ ...columnDef,
46
+ schema: schemaSnapshot(columnDef.schema),
47
+ })
48
+
49
+ // Effect schemas expose a large inspectable object graph. Snapshot only the
50
+ // schema shape this DSL cares about.
51
+ const schemaSnapshot = (schema: Schema.Codec<unknown, unknown>) => ({
52
+ ast: schema.ast._tag,
53
+ encodedAst: Schema.toEncoded(schema).ast._tag,
54
+ decodedAst: Schema.toType(schema).ast._tag,
55
+ })
@@ -1,6 +1,8 @@
1
1
  import { casesHandled } from '@livestore/utils'
2
2
  import { Option, Schema } from '@livestore/utils/effect'
3
3
 
4
+ import { SqliteReal } from '../../../../../util.ts'
5
+
4
6
  export type SqlDefaultValue = {
5
7
  readonly sql: string
6
8
  }
@@ -21,7 +23,7 @@ export const resolveColumnDefault = <T>(value: ColumnDefaultValue<T>): T | null
21
23
 
22
24
  export type ColumnDefinition<TEncoded, TDecoded, TNullable extends boolean = boolean> = {
23
25
  readonly columnType: FieldColumnType
24
- readonly schema: Schema.Schema<TDecoded, TEncoded>
26
+ readonly schema: Schema.Codec<TDecoded, TEncoded>
25
27
  readonly default: Option.Option<ColumnDefaultValue<TDecoded>>
26
28
  /** @default false */
27
29
  readonly nullable: TNullable
@@ -55,7 +57,7 @@ type ColumnDefaultArg<T, TNullable extends boolean> =
55
57
  | NoDefault
56
58
 
57
59
  export type ColumnDefinitionInput = {
58
- readonly schema?: Schema.Schema<unknown>
60
+ readonly schema?: Schema.Codec<unknown, unknown>
59
61
  readonly default?: ColumnDefaultArg<unknown, boolean>
60
62
  readonly nullable?: boolean
61
63
  readonly primaryKey?: boolean
@@ -68,7 +70,7 @@ export type NoDefault = typeof NoDefault
68
70
  export type ColDefFn<TColumnType extends FieldColumnType> = {
69
71
  (): {
70
72
  columnType: TColumnType
71
- schema: Schema.Schema<DefaultEncodedForColumnType<TColumnType>>
73
+ schema: Schema.Codec<DefaultEncodedForColumnType<TColumnType>>
72
74
  default: Option.None<never>
73
75
  nullable: false
74
76
  primaryKey: false
@@ -82,7 +84,7 @@ export type ColDefFn<TColumnType extends FieldColumnType> = {
82
84
  const TPrimaryKey extends boolean = false,
83
85
  const TAutoIncrement extends boolean = false,
84
86
  >(args: {
85
- schema?: Schema.Schema<TDecoded, TEncoded>
87
+ schema?: Schema.Codec<TDecoded, TEncoded>
86
88
  default?: TDefault
87
89
  nullable?: TNullable
88
90
  primaryKey?: TPrimaryKey
@@ -90,8 +92,8 @@ export type ColDefFn<TColumnType extends FieldColumnType> = {
90
92
  }): {
91
93
  columnType: TColumnType
92
94
  schema: TNullable extends true
93
- ? Schema.Schema<NoInfer<TDecoded> | null, NoInfer<TEncoded> | null>
94
- : Schema.Schema<NoInfer<TDecoded>, NoInfer<TEncoded>>
95
+ ? Schema.Codec<NoInfer<TDecoded> | null, NoInfer<TEncoded> | null>
96
+ : Schema.Codec<NoInfer<TDecoded>, NoInfer<TEncoded>>
95
97
  default: TDefault extends NoDefault ? Option.None<never> : Option.Some<NoInfer<TDefault>>
96
98
  nullable: NoInfer<TNullable>
97
99
  primaryKey: NoInfer<TPrimaryKey>
@@ -103,7 +105,7 @@ const makeColDef =
103
105
  <TColumnType extends FieldColumnType>(columnType: TColumnType): ColDefFn<TColumnType> =>
104
106
  (def?: ColumnDefinitionInput) => {
105
107
  const nullable = def?.nullable ?? false
106
- const schemaWithoutNull: Schema.Schema<any> = def?.schema ?? defaultSchemaForColumnType(columnType)
108
+ const schemaWithoutNull = def?.schema ?? defaultSchemaForColumnType(columnType)
107
109
  const schema = nullable === true ? Schema.NullOr(schemaWithoutNull) : schemaWithoutNull
108
110
  const default_ = def?.default === undefined || def.default === NoDefault ? Option.none() : Option.some(def.default)
109
111
 
@@ -143,7 +145,7 @@ export type SpecializedColDefFn<
143
145
  > = {
144
146
  (): {
145
147
  columnType: TColumnType
146
- schema: Schema.Schema<TBaseDecoded, DefaultEncodedForColumnType<TColumnType>>
148
+ schema: Schema.Codec<TBaseDecoded, DefaultEncodedForColumnType<TColumnType>>
147
149
  default: Option.None<never>
148
150
  nullable: false
149
151
  primaryKey: false
@@ -158,7 +160,7 @@ export type SpecializedColDefFn<
158
160
  >(
159
161
  args: TAllowsCustomSchema extends true
160
162
  ? {
161
- schema?: Schema.Schema<TDecoded, any>
163
+ schema?: Schema.Codec<TDecoded, any>
162
164
  default?: TDefault
163
165
  nullable?: TNullable
164
166
  primaryKey?: TPrimaryKey
@@ -173,8 +175,8 @@ export type SpecializedColDefFn<
173
175
  ): {
174
176
  columnType: TColumnType
175
177
  schema: TNullable extends true
176
- ? Schema.Schema<NoInfer<TDecoded> | null, DefaultEncodedForColumnType<TColumnType> | null>
177
- : Schema.Schema<NoInfer<TDecoded>, DefaultEncodedForColumnType<TColumnType>>
178
+ ? Schema.Codec<NoInfer<TDecoded> | null, DefaultEncodedForColumnType<TColumnType> | null>
179
+ : Schema.Codec<NoInfer<TDecoded>, DefaultEncodedForColumnType<TColumnType>>
178
180
  default: TDefault extends NoDefault ? Option.None<never> : Option.Some<TDefault>
179
181
  nullable: NoInfer<TNullable>
180
182
  primaryKey: NoInfer<TPrimaryKey>
@@ -187,7 +189,7 @@ type MakeSpecializedColDefFn = {
187
189
  columnType: TColumnType,
188
190
  opts: {
189
191
  _tag: 'baseSchema'
190
- baseSchema: Schema.Schema<TBaseDecoded, DefaultEncodedForColumnType<TColumnType>>
192
+ baseSchema: Schema.Codec<TBaseDecoded, DefaultEncodedForColumnType<TColumnType>>
191
193
  },
192
194
  ): SpecializedColDefFn<TColumnType, false, TBaseDecoded>
193
195
  <TColumnType extends FieldColumnType, TBaseDecoded>(
@@ -195,8 +197,8 @@ type MakeSpecializedColDefFn = {
195
197
  opts: {
196
198
  _tag: 'baseSchemaFn'
197
199
  baseSchemaFn: <TDecoded>(
198
- customSchema: Schema.Schema<TDecoded, TBaseDecoded> | undefined,
199
- ) => Schema.Schema<TBaseDecoded, DefaultEncodedForColumnType<TColumnType>>
200
+ customSchema: Schema.Codec<TDecoded, TBaseDecoded> | undefined,
201
+ ) => Schema.Codec<TBaseDecoded, DefaultEncodedForColumnType<TColumnType>>
200
202
  },
201
203
  ): SpecializedColDefFn<TColumnType, true, TBaseDecoded>
202
204
  }
@@ -221,28 +223,22 @@ const makeSpecializedColDef: MakeSpecializedColDefFn = (columnType, opts) => (de
221
223
 
222
224
  export const json: SpecializedColDefFn<'text', true, unknown> = makeSpecializedColDef('text', {
223
225
  _tag: 'baseSchemaFn',
224
- baseSchemaFn: (customSchema) => Schema.parseJson(customSchema ?? Schema.Any),
226
+ baseSchemaFn: (customSchema) => Schema.fromJsonString(customSchema ?? Schema.Any),
225
227
  })
226
228
 
227
229
  export const datetime: SpecializedColDefFn<'text', false, Date> = makeSpecializedColDef('text', {
228
230
  _tag: 'baseSchema',
229
- baseSchema: Schema.Date,
231
+ baseSchema: Schema.DateFromString,
230
232
  })
231
233
 
232
234
  export const datetimeInteger: SpecializedColDefFn<'integer', false, Date> = makeSpecializedColDef('integer', {
233
235
  _tag: 'baseSchema',
234
- baseSchema: Schema.transform(Schema.Number, Schema.DateFromSelf, {
235
- decode: (ms) => new Date(ms),
236
- encode: (date) => date.getTime(),
237
- }),
236
+ baseSchema: Schema.DateFromMillis,
238
237
  })
239
238
 
240
239
  export const boolean: SpecializedColDefFn<'integer', false, boolean> = makeSpecializedColDef('integer', {
241
240
  _tag: 'baseSchema',
242
- baseSchema: Schema.transform(Schema.Number, Schema.Boolean, {
243
- decode: (_) => _ === 1,
244
- encode: (_) => (_ === true ? 1 : 0),
245
- }),
241
+ baseSchema: Schema.BooleanFromBit,
246
242
  })
247
243
 
248
244
  export type FieldColumnType = 'text' | 'integer' | 'real' | 'blob'
@@ -257,27 +253,25 @@ export type DefaultEncodedForColumnType<TColumnType extends FieldColumnType> = T
257
253
  ? Uint8Array<ArrayBuffer>
258
254
  : never
259
255
 
260
- export const defaultSchemaForColumnType = <TColumnType extends FieldColumnType>(
261
- columnType: TColumnType,
262
- ): Schema.Schema<DefaultEncodedForColumnType<TColumnType>> => {
256
+ export const defaultSchemaForColumnType = <TColumnType extends FieldColumnType>(columnType: TColumnType) => {
263
257
  type T = DefaultEncodedForColumnType<TColumnType>
264
258
 
265
259
  switch (columnType) {
266
260
  case 'text': {
267
261
  // oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- switch-based type narrowing for column type to schema mapping; each case is correct for its branch
268
- return Schema.String as any as Schema.Schema<T>
262
+ return Schema.String as Schema.Codec<T>
269
263
  }
270
264
  case 'integer': {
271
265
  // oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- switch-based type narrowing for column type to schema mapping; each case is correct for its branch
272
- return Schema.Number as any as Schema.Schema<T>
266
+ return Schema.Finite as Schema.Codec<T>
273
267
  }
274
268
  case 'real': {
275
269
  // oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- switch-based type narrowing for column type to schema mapping; each case is correct for its branch
276
- return Schema.Number as any as Schema.Schema<T>
270
+ return SqliteReal as Schema.Codec<T>
277
271
  }
278
272
  case 'blob': {
279
273
  // oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- switch-based type narrowing for column type to schema mapping; each case is correct for its branch
280
- return Schema.Uint8ArrayFromSelf as any as Schema.Schema<T>
274
+ return Schema.Uint8Array as Schema.Codec<T>
281
275
  }
282
276
  default: {
283
277
  return casesHandled(columnType)
@@ -1,7 +1,6 @@
1
1
  import type { Nullable } from '@livestore/utils'
2
2
  import { omitUndefineds } from '@livestore/utils'
3
- import type { Option, Types } from '@livestore/utils/effect'
4
- import { Schema } from '@livestore/utils/effect'
3
+ import { type Option, Schema, Struct, type Types } from '@livestore/utils/effect'
5
4
 
6
5
  import type * as SqliteAst from '../ast/sqlite.ts'
7
6
  import type { ColumnDefinition } from './field-defs.ts'
@@ -52,26 +51,41 @@ export const table = <TTableName extends string, TColumns extends Columns, TInde
52
51
  export type AnyIfConstained<In, Out> = '__constrained' extends keyof In ? any : Out
53
52
  export type EmptyObjIfConstained<In> = '__constrained' extends keyof In ? {} : In
54
53
 
55
- export type StructSchemaForColumns<TCols extends ConstraintColumns> = Schema.Schema<
56
- AnyIfConstained<TCols, FromColumns.RowDecoded<TCols>>,
57
- AnyIfConstained<TCols, FromColumns.RowEncoded<TCols>>
58
- >
54
+ export type StructFieldsForColumns<TCols extends ConstraintColumns> = '__constrained' extends keyof TCols
55
+ ? Record<string, Schema.Codec<any, any>>
56
+ : { readonly [K in keyof TCols]: TCols[K]['schema'] }
57
+
58
+ export type StructSchemaForColumns<TCols extends ConstraintColumns> = Schema.Struct<StructFieldsForColumns<TCols>>
59
59
 
60
- export type InsertStructSchemaForColumns<TCols extends ConstraintColumns> = Schema.Schema<
60
+ export type InsertStructSchemaForColumns<TCols extends ConstraintColumns> = Schema.Codec<
61
61
  AnyIfConstained<TCols, FromColumns.InsertRowDecoded<TCols>>,
62
62
  AnyIfConstained<TCols, FromColumns.InsertRowEncoded<TCols>>
63
63
  >
64
64
 
65
- export const structSchemaForTable = <TTableDefinition extends TableDefinition<any, any>>(
66
- tableDef: TTableDefinition,
67
- ): StructSchemaForColumns<TTableDefinition['columns']> =>
68
- Schema.Struct(Object.fromEntries(tableDef.ast.columns.map((column) => [column.name, column.schema]))).annotations({
65
+ interface GetColumnSchema extends Struct.Lambda {
66
+ <TEncoded, TDecoded, TNullable extends boolean>(
67
+ column: ColumnDefinition<TEncoded, TDecoded, TNullable>,
68
+ ): ColumnDefinition<TEncoded, TDecoded, TNullable>['schema']
69
+ readonly '~lambda.out': this['~lambda.in'] extends ColumnDefinition<any, any, any>
70
+ ? this['~lambda.in']['schema']
71
+ : never
72
+ }
73
+
74
+ const getColumnSchema = Struct.lambda<GetColumnSchema>((column) => column.schema)
75
+
76
+ const structFieldsForColumns = <TCols extends ConstraintColumns>(columns: TCols): StructFieldsForColumns<TCols> =>
77
+ Struct.map(columns, getColumnSchema)
78
+
79
+ export const structSchemaForTable = <TTableName extends string, TColumns extends ConstraintColumns>(
80
+ tableDef: TableDefinition<TTableName, TColumns>,
81
+ ): StructSchemaForColumns<TColumns> =>
82
+ Schema.Struct(structFieldsForColumns(tableDef.columns)).annotate({
69
83
  title: tableDef.name,
70
- }) as any
84
+ })
71
85
 
72
- export const insertStructSchemaForTable = <TTableDefinition extends TableDefinition<any, any>>(
73
- tableDef: TTableDefinition,
74
- ): InsertStructSchemaForColumns<TTableDefinition['columns']> =>
86
+ export const insertStructSchemaForTable = <TTableName extends string, TColumns extends ConstraintColumns>(
87
+ tableDef: TableDefinition<TTableName, TColumns>,
88
+ ): InsertStructSchemaForColumns<TColumns> =>
75
89
  Schema.Struct(
76
90
  Object.fromEntries(
77
91
  tableDef.ast.columns.map((column) => [
@@ -80,7 +94,7 @@ export const insertStructSchemaForTable = <TTableDefinition extends TableDefinit
80
94
  column.nullable === true || column.default._tag === 'Some' ? Schema.optional(column.schema) : column.schema,
81
95
  ]),
82
96
  ),
83
- ).annotations({
97
+ ).annotate({
84
98
  title: tableDef.name,
85
99
  }) as any
86
100
 
@@ -150,7 +164,7 @@ export namespace FromTable {
150
164
  }
151
165
 
152
166
  export type RowEncodeNonNullable<TTableDefinition extends TableDefinition<any, any>> = {
153
- [K in keyof TTableDefinition['columns']]: Schema.Schema.Encoded<TTableDefinition['columns'][K]['schema']>
167
+ [K in keyof TTableDefinition['columns']]: TTableDefinition['columns'][K]['schema']['Encoded']
154
168
  }
155
169
 
156
170
  export type RowEncoded<TTableDefinition extends TableDefinition<any, any>> = Types.Simplify<
@@ -167,7 +181,7 @@ export namespace FromTable {
167
181
  // >
168
182
 
169
183
  export type RowDecodedAll<TTableDefinition extends TableDefinition<any, any>> = {
170
- [K in keyof TTableDefinition['columns']]: Schema.Schema.Type<TTableDefinition['columns'][K]['schema']>
184
+ [K in keyof TTableDefinition['columns']]: TTableDefinition['columns'][K]['schema']['Type']
171
185
  }
172
186
  }
173
187
 
@@ -179,11 +193,11 @@ export namespace FromColumns {
179
193
  >
180
194
 
181
195
  export type RowDecodedAll<TColumns extends Columns> = {
182
- readonly [K in keyof TColumns]: Schema.Schema.Type<TColumns[K]['schema']>
196
+ readonly [K in keyof TColumns]: TColumns[K]['schema']['Type']
183
197
  }
184
198
 
185
199
  export type RowEncodedAll<TColumns extends Columns> = {
186
- readonly [K in keyof TColumns]: Schema.Schema.Encoded<TColumns[K]['schema']>
200
+ readonly [K in keyof TColumns]: TColumns[K]['schema']['Encoded']
187
201
  }
188
202
 
189
203
  export type RowEncoded<TColumns extends Columns> = Types.Simplify<
@@ -192,7 +206,7 @@ export namespace FromColumns {
192
206
  >
193
207
 
194
208
  export type RowEncodeNonNullable<TColumns extends Columns> = {
195
- readonly [K in keyof TColumns]: Schema.Schema.Encoded<TColumns[K]['schema']>
209
+ readonly [K in keyof TColumns]: TColumns[K]['schema']['Encoded']
196
210
  }
197
211
 
198
212
  export type NullableColumnNames<TColumns extends Columns> = keyof {
@@ -60,14 +60,12 @@ export const makeState = <TStateInput extends InputState>(inputSchema: TStateInp
60
60
  tables: [...tables.values()].map((_) => _.sqliteDef.ast),
61
61
  })
62
62
 
63
- return { sqlite: { tables, migrations: inputSchema.migrations ?? { strategy: 'auto' }, hash }, materializers }
63
+ return { sqlite: { tables, migrations: inputSchema.migrations ?? {}, hash }, materializers }
64
64
  }
65
65
 
66
66
  export type InputState = {
67
67
  readonly tables: Record<string, TableDefBase> | ReadonlyArray<TableDefBase>
68
68
  readonly materializers: Record<string, Materializer<any>>
69
- /**
70
- * @default { strategy: 'auto' }
71
- */
69
+ /** Configures hooks and logging for automatic state migration. */
72
70
  readonly migrations?: MigrationOptions
73
71
  }
@@ -0,0 +1,11 @@
1
+ import type { LiveStoreSchema } from '../../schema.ts'
2
+
3
+ /**
4
+ * Returns the schema-keyed base name shared by persisted state databases.
5
+ *
6
+ * @remarks
7
+ *
8
+ * Adapters append backend-specific storage-format namespaces and file
9
+ * extensions.
10
+ */
11
+ export const getStateDbBaseName = (schema: LiveStoreSchema): string => `state${schema.state.sqlite.hash}`
@@ -1,7 +1,7 @@
1
1
  import type { GetValForKey, SingleOrReadonlyArray } from '@livestore/utils'
2
2
  import { type Option, Predicate, type Schema } from '@livestore/utils/effect'
3
3
 
4
- import type { SessionIdSymbol } from '../../../../adapter-types.ts'
4
+ import type { SessionIdSymbol } from '../../../../session-id-symbol.ts'
5
5
  import type { SqlValue } from '../../../../util.ts'
6
6
  import type { ClientDocumentTableDef, ClientDocumentTableDefSymbol } from '../client-document-def.ts'
7
7
  import type { SqliteDsl } from '../db-schema/mod.ts'
@@ -32,14 +32,14 @@ export namespace QueryBuilderAst {
32
32
  readonly limit: Option.Option<number>
33
33
  readonly tableDef: TableDefBase
34
34
  readonly where: ReadonlyArray<QueryBuilderAst.Where>
35
- readonly resultSchemaSingle: Schema.Schema<any>
35
+ readonly resultSchemaSingle: Schema.Codec<any, any>
36
36
  }
37
37
 
38
38
  export interface CountQuery {
39
39
  readonly _tag: 'CountQuery'
40
40
  readonly tableDef: TableDefBase
41
41
  readonly where: ReadonlyArray<QueryBuilderAst.Where>
42
- readonly resultSchema: Schema.Schema<number, ReadonlyArray<{ count: number }>>
42
+ readonly resultSchema: Schema.Codec<number, ReadonlyArray<{ count: number }>>
43
43
  }
44
44
 
45
45
  export interface RowQuery {
@@ -55,7 +55,7 @@ export namespace QueryBuilderAst {
55
55
  readonly values: Record<string, unknown>
56
56
  readonly onConflict: OnConflict | undefined
57
57
  readonly returning: string[] | undefined
58
- readonly resultSchema: Schema.Schema<any>
58
+ readonly resultSchema: Schema.Codec<any, any>
59
59
  }
60
60
 
61
61
  export interface OnConflict {
@@ -76,7 +76,7 @@ export namespace QueryBuilderAst {
76
76
  readonly values: Record<string, unknown>
77
77
  readonly where: ReadonlyArray<QueryBuilderAst.Where>
78
78
  readonly returning: string[] | undefined
79
- readonly resultSchema: Schema.Schema<any>
79
+ readonly resultSchema: Schema.Codec<any, any>
80
80
  }
81
81
 
82
82
  export interface DeleteQuery {
@@ -84,7 +84,7 @@ export namespace QueryBuilderAst {
84
84
  readonly tableDef: TableDefBase
85
85
  readonly where: ReadonlyArray<QueryBuilderAst.Where>
86
86
  readonly returning: string[] | undefined
87
- readonly resultSchema: Schema.Schema<any>
87
+ readonly resultSchema: Schema.Codec<any, any>
88
88
  }
89
89
 
90
90
  export type WriteQuery = InsertQuery | UpdateQuery | DeleteQuery
@@ -115,7 +115,7 @@ export const isQueryBuilder = (value: unknown): value is QueryBuilder<any, any,
115
115
 
116
116
  export type QueryBuilder<
117
117
  TResult,
118
- TTableDef extends TableDefBase,
118
+ TTableDef extends TableDefBase<any, any>,
119
119
  /** Used to gradually remove features from the API based on the query context */
120
120
  TWithout extends QueryBuilder.ApiFeature = never,
121
121
  > = {
@@ -230,8 +230,8 @@ export namespace QueryBuilder {
230
230
  /** Select multiple columns */
231
231
  <TColumns extends keyof TTableDef['sqliteDef']['columns'] & string>(
232
232
  ...columns: TColumns[]
233
- )// params: QueryBuilderSelectParams, // TODO also support arbitrary SQL selects
234
- : QueryBuilder<
233
+ ): QueryBuilder<
234
+ // params: QueryBuilderSelectParams, // TODO also support arbitrary SQL selects
235
235
  ReadonlyArray<{
236
236
  readonly [K in TColumns]: TTableDef['sqliteDef']['columns'][K]['schema']['Type']
237
237
  }>,
@@ -1,48 +1,45 @@
1
1
  import { shouldNeverHappen } from '@livestore/utils'
2
- import { Schema, SchemaAST } from '@livestore/utils/effect'
2
+ import { Schema, SchemaAST, Struct } from '@livestore/utils/effect'
3
3
 
4
- import { SessionIdSymbol } from '../../../../adapter-types.ts'
4
+ import { SessionIdSymbol } from '../../../../session-id-symbol.ts'
5
5
  import type { SqlValue } from '../../../../util.ts'
6
6
  import type { State } from '../../../mod.ts'
7
7
  import type { QueryBuilderAst } from './api.ts'
8
8
 
9
9
  /**
10
- * Extracts array element schema from a JSON array transformation AST.
11
- * Returns the element schema, or undefined if not a JSON array transformation.
10
+ * Extracts array element schema from a JSON array AST with a JSON string encoding.
11
+ * Returns the element schema, or undefined if the AST is not a JSON array.
12
12
  */
13
- const extractArrayElementFromTransformation = (ast: SchemaAST.AST): Schema.Schema.Any | undefined => {
14
- if (SchemaAST.isTransformation(ast) === false) return undefined
13
+ const extractJsonArrayElementSchema = (ast: SchemaAST.AST): Schema.Top | undefined => {
14
+ if (hasJsonStringEncoding(ast) === false) return undefined
15
15
 
16
- const toAst = ast.to
17
- // Check if the "to" side is a TupleType (Effect's internal representation of Array)
18
- if (SchemaAST.isTupleType(toAst) === false) return undefined
16
+ const typeAst = SchemaAST.toType(ast)
17
+ // Check if the type side is Arrays (Effect's internal representation of Array)
18
+ if (SchemaAST.isArrays(typeAst) === false) return undefined
19
19
 
20
- // For Schema.Array, rest contains { type: AST } elements - get the first one's type
21
- const restElement = toAst.rest[0]
20
+ // For Schema.Array, rest contains the element AST - get the first one.
21
+ const restElement = typeAst.rest[0]
22
22
  if (restElement === undefined) return undefined
23
23
 
24
- return Schema.make(restElement.type)
24
+ return Schema.make(restElement)
25
25
  }
26
26
 
27
27
  /**
28
- * For JSON array columns, extracts the element schema from Schema.parseJson(Schema.Array(ElementSchema)).
29
- * Also handles nullable JSON arrays (Schema.NullOr(Schema.parseJson(Schema.Array(...)))).
28
+ * For JSON array columns, extracts the element schema from Schema.fromJsonString(Schema.Array(ElementSchema)).
29
+ * Also handles nullable JSON arrays (Schema.NullOr(Schema.fromJsonString(Schema.Array(...)))).
30
30
  * Returns the element schema, or undefined if the column is not a JSON array.
31
31
  */
32
- const getJsonArrayElementSchema = (colSchema: Schema.Schema.Any): Schema.Schema.Any | undefined => {
32
+ const getJsonArrayElementSchema = (colSchema: Schema.Top): Schema.Top | undefined => {
33
33
  const ast = colSchema.ast
34
34
 
35
- // Case 1: Direct transformation (non-nullable JSON array)
36
- // Schema.parseJson(Schema.Array(ElementSchema)) creates a Transformation AST
37
- if (SchemaAST.isTransformation(ast) === true) {
38
- return extractArrayElementFromTransformation(ast)
39
- }
35
+ // Case 1: Direct JSON string encoding (non-nullable JSON array)
36
+ const direct = extractJsonArrayElementSchema(ast)
37
+ if (direct !== undefined) return direct
40
38
 
41
- // Case 2: Nullable JSON array - Schema.NullOr wraps the parseJson in a Union
42
- // Structure: Union([Transformation (JSON array), Literal (null)])
39
+ // Case 2: Nullable JSON array - Schema.NullOr wraps the JSON array in a Union.
43
40
  if (SchemaAST.isUnion(ast) === true) {
44
41
  for (const member of ast.types) {
45
- const result = extractArrayElementFromTransformation(member)
42
+ const result = extractJsonArrayElementSchema(member)
46
43
  if (result !== undefined) return result
47
44
  }
48
45
  }
@@ -50,12 +47,20 @@ const getJsonArrayElementSchema = (colSchema: Schema.Schema.Any): Schema.Schema.
50
47
  return undefined
51
48
  }
52
49
 
50
+ /**
51
+ * `SchemaTransformation.fromJsonString` is a factory since Effect rc.109, so encoding links can no
52
+ * longer be matched by identity. `Schema.fromJsonString` annotates its encoded side as
53
+ * `application/json`, which identifies the link regardless of the reviver/replacer/space options.
54
+ */
55
+ const hasJsonStringEncoding = (ast: SchemaAST.AST): boolean =>
56
+ ast.encoding?.some((link) => link.to.annotations?.contentMediaType === 'application/json') === true
57
+
53
58
  /**
54
59
  * Encodes a JSON array element to the representation returned by SQLite's json_each().
55
60
  * Objects/arrays are stringified so they match json_each's TEXT representation.
56
61
  */
57
- const encodeJsonArrayElementValue = (elementSchema: Schema.Schema.Any, value: unknown): SqlValue => {
58
- const encoded = Schema.encodeSync(elementSchema as Schema.Schema<unknown, SqlValue>)(value)
62
+ const encodeJsonArrayElementValue = (elementSchema: Schema.Top, value: unknown): SqlValue => {
63
+ const encoded = Schema.encodeSync(elementSchema as Schema.Codec<unknown, SqlValue>)(value)
59
64
 
60
65
  if (encoded === null) return null
61
66
  if (typeof encoded === 'object') {
@@ -237,7 +242,7 @@ export const astToSql = (ast: QueryBuilderAst): { query: string; bindValues: Sql
237
242
  // return shouldNeverHappen('UPDATE query requires at least one column to set.')
238
243
  }
239
244
 
240
- const encodedValues = Schema.encodeSync(Schema.partial(ast.tableDef.rowSchema))(ast.values)
245
+ const encodedValues = Schema.encodeSync(ast.tableDef.rowSchema.mapFields(Struct.map(Schema.optional)))(ast.values)
241
246
 
242
247
  // Ensure bind values are added in the same order as columns
243
248
  setColumns.forEach((col) => {