@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,8 +1,8 @@
1
- import { objectToString } from '@livestore/utils'
2
-
3
- import { Schema } from '@livestore/utils/effect'
1
+ import { TestSchema } from 'effect/testing'
4
2
  import { describe, expect, expectTypeOf, it } from 'vitest'
5
3
 
4
+ import { Schema, SchemaAST, SchemaTransformation } from '@livestore/utils/effect'
5
+
6
6
  import { State } from '../../mod.ts'
7
7
 
8
8
  describe('table function overloads', () => {
@@ -11,7 +11,7 @@ describe('table function overloads', () => {
11
11
  id: Schema.String,
12
12
  text: Schema.String,
13
13
  completed: Schema.Boolean,
14
- }).annotations({ title: 'todos' })
14
+ }).annotate({ title: 'todos' })
15
15
 
16
16
  const todosTable = State.SQLite.table({
17
17
  schema: TodoSchema,
@@ -25,7 +25,7 @@ describe('table function overloads', () => {
25
25
  id: Schema.String,
26
26
  text: Schema.String,
27
27
  completed: Schema.Boolean,
28
- }).annotations({ identifier: 'TodoItem' })
28
+ }).annotate({ identifier: 'TodoItem' })
29
29
 
30
30
  const todosTable = State.SQLite.table({ schema: TodoSchema })
31
31
 
@@ -37,7 +37,7 @@ describe('table function overloads', () => {
37
37
  id: Schema.String,
38
38
  text: Schema.String,
39
39
  completed: Schema.Boolean,
40
- }).annotations({
40
+ }).annotate({
41
41
  title: 'todos',
42
42
  identifier: 'TodoItem',
43
43
  })
@@ -59,7 +59,7 @@ describe('table function overloads', () => {
59
59
  )
60
60
  })
61
61
 
62
- it('should work with columns parameter', () => {
62
+ it('should work with columns parameter', async () => {
63
63
  const todosTable = State.SQLite.table({
64
64
  name: 'todos',
65
65
  columns: {
@@ -74,7 +74,6 @@ describe('table function overloads', () => {
74
74
  },
75
75
  })
76
76
 
77
- expect((todosTable.rowSchema as any).fields.completed.toString()).toMatchInlineSnapshot(`"(number <-> boolean)"`)
78
77
  expect(todosTable.sqliteDef.name).toBe('todos')
79
78
  expect(todosTable.sqliteDef.columns).toHaveProperty('id')
80
79
  expect(todosTable.sqliteDef.columns).toHaveProperty('text')
@@ -82,15 +81,42 @@ describe('table function overloads', () => {
82
81
  expect(todosTable.sqliteDef.columns).toHaveProperty('optionalComplex')
83
82
 
84
83
  expect(todosTable.sqliteDef.columns.optionalBoolean.nullable).toBe(true)
85
- expect(objectToString(todosTable.sqliteDef.columns.optionalBoolean.schema)).toBe('(number <-> boolean) | null')
86
- expect((todosTable.rowSchema as any).fields.optionalBoolean.toString()).toBe('(number <-> boolean) | null')
84
+ expect(Schema.encodeSync(todosTable.sqliteDef.columns.optionalBoolean.schema)(false)).toBe(0)
87
85
 
88
86
  expect(todosTable.sqliteDef.columns.optionalComplex.nullable).toBe(true)
89
- expect(objectToString(todosTable.sqliteDef.columns.optionalComplex.schema)).toBe(
90
- '(parseJson <-> { readonly color: string } | undefined) | null',
87
+
88
+ const asserts = new TestSchema.Asserts(todosTable.rowSchema)
89
+ await asserts.decoding().succeed(
90
+ {
91
+ id: 'todo-1',
92
+ text: 'Buy milk',
93
+ completed: 1,
94
+ optionalBoolean: null,
95
+ optionalComplex: JSON.stringify({ color: 'red' }),
96
+ },
97
+ {
98
+ id: 'todo-1',
99
+ text: 'Buy milk',
100
+ completed: true,
101
+ optionalBoolean: null,
102
+ optionalComplex: { color: 'red' },
103
+ },
91
104
  )
92
- expect((todosTable.rowSchema as any).fields.optionalComplex.toString()).toBe(
93
- '(parseJson <-> { readonly color: string } | undefined) | null',
105
+ await asserts.decoding().succeed(
106
+ {
107
+ id: 'todo-1',
108
+ text: 'Buy milk',
109
+ completed: 0,
110
+ optionalBoolean: null,
111
+ optionalComplex: null,
112
+ },
113
+ {
114
+ id: 'todo-1',
115
+ text: 'Buy milk',
116
+ completed: false,
117
+ optionalBoolean: null,
118
+ optionalComplex: null,
119
+ },
94
120
  )
95
121
  })
96
122
 
@@ -156,6 +182,54 @@ describe('table function overloads', () => {
156
182
  expect(userTable.sqliteDef.columns.email.nullable).toBe(true)
157
183
  })
158
184
 
185
+ it('keeps a date codec so the column round-trips through its encoded form', () => {
186
+ const StampSchema = Schema.Struct({
187
+ id: Schema.String.pipe(State.SQLite.withPrimaryKey),
188
+ createdAt: Schema.DateFromString,
189
+ seenAt: Schema.DateFromMillis,
190
+ bornAt: Schema.Date,
191
+ deletedAt: Schema.NullOr(Schema.DateFromString),
192
+ archivedAt: Schema.optional(Schema.DateFromString),
193
+ })
194
+
195
+ const { columns } = State.SQLite.table({ name: 'stamps', schema: StampSchema }).sqliteDef
196
+ const date = new Date('2026-01-02T03:04:05.678Z')
197
+ const roundTrip = (column: { schema: Schema.Codec<any, any> }, value: unknown) =>
198
+ Schema.decodeUnknownSync(column.schema)(Schema.encodeUnknownSync(column.schema)(value))
199
+
200
+ expect(columns.createdAt.columnType).toBe('text')
201
+ expect(Schema.encodeUnknownSync(columns.createdAt.schema)(date)).toBe(date.toISOString())
202
+ expect(roundTrip(columns.createdAt, date)).toEqual(date)
203
+
204
+ expect(columns.seenAt.columnType).toBe('integer')
205
+ expect(Schema.encodeUnknownSync(columns.seenAt.schema)(date)).toBe(date.getTime())
206
+ expect(roundTrip(columns.seenAt, date)).toEqual(date)
207
+
208
+ expect(columns.bornAt.columnType).toBe('text')
209
+ expect(Schema.encodeUnknownSync(columns.bornAt.schema)(date)).toBe(date.toISOString())
210
+ expect(roundTrip(columns.bornAt, date)).toEqual(date)
211
+
212
+ expect(columns.deletedAt.nullable).toBe(true)
213
+ expect(roundTrip(columns.deletedAt, date)).toEqual(date)
214
+ expect(roundTrip(columns.deletedAt, null)).toBeNull()
215
+
216
+ expect(columns.archivedAt.nullable).toBe(true)
217
+ expect(roundTrip(columns.archivedAt, date)).toEqual(date)
218
+ })
219
+
220
+ it('stores a codec field in its encoded form, like getColumnDefForSchema does', () => {
221
+ const CounterSchema = Schema.Struct({
222
+ id: Schema.String,
223
+ count: Schema.FiniteFromString,
224
+ })
225
+
226
+ const { columns } = State.SQLite.table({ name: 'counters', schema: CounterSchema }).sqliteDef
227
+
228
+ expect(columns.count.columnType).toBe('text')
229
+ expect(Schema.encodeUnknownSync(columns.count.schema)(42)).toBe('42')
230
+ expect(Schema.decodeSync(columns.count.schema)('42')).toBe(42)
231
+ })
232
+
159
233
  it('should handle Schema.Int as integer column', () => {
160
234
  const CounterSchema = Schema.Struct({
161
235
  id: Schema.String,
@@ -197,6 +271,24 @@ describe('table function overloads', () => {
197
271
  expect(userTable.sqliteDef.columns.age.columnType).toBe('integer')
198
272
  })
199
273
 
274
+ it('preserves Date field codecs in Schema.Class tables', () => {
275
+ class Stamp extends Schema.Class<Stamp>('Stamp')({
276
+ id: Schema.String,
277
+ createdAt: Schema.DateFromString,
278
+ seenAt: Schema.DateFromMillis,
279
+ }) {}
280
+
281
+ const { columns } = State.SQLite.table({ name: 'stamps', schema: Stamp }).sqliteDef
282
+ const date = new Date('2026-01-02T03:04:05.678Z')
283
+
284
+ expect(columns.createdAt.columnType).toBe('text')
285
+ expect(Schema.decodeSync(columns.createdAt.schema)(date.toISOString())).toEqual(date)
286
+ expect(Schema.encodeUnknownSync(columns.createdAt.schema)(date)).toBe(date.toISOString())
287
+ expect(columns.seenAt.columnType).toBe('integer')
288
+ expect(Schema.decodeSync(columns.seenAt.schema)(date.getTime())).toEqual(date)
289
+ expect(Schema.encodeUnknownSync(columns.seenAt.schema)(date)).toBe(date.getTime())
290
+ })
291
+
200
292
  it('should support schemas that transform flat columns into nested types', () => {
201
293
  const Flat = Schema.Struct({
202
294
  id: Schema.String.pipe(State.SQLite.withPrimaryKey),
@@ -205,32 +297,33 @@ describe('table function overloads', () => {
205
297
  contactEmail: Schema.String.pipe(State.SQLite.withUnique),
206
298
  })
207
299
 
208
- const Nested = Schema.transform(
209
- Flat,
210
- Schema.Struct({
211
- id: Schema.String,
212
- contact: Schema.Struct({
213
- firstName: Schema.String,
214
- lastName: Schema.String,
215
- email: Schema.String,
216
- }),
217
- }),
218
- {
219
- decode: ({ id, contactFirstName, contactLastName, contactEmail }) => ({
220
- id,
221
- contact: {
222
- firstName: contactFirstName,
223
- lastName: contactLastName,
224
- email: contactEmail,
225
- },
300
+ const Nested = Flat.pipe(
301
+ Schema.decodeTo(
302
+ Schema.Struct({
303
+ id: Schema.String,
304
+ contact: Schema.Struct({
305
+ firstName: Schema.String,
306
+ lastName: Schema.String,
307
+ email: Schema.String,
308
+ }),
226
309
  }),
227
- encode: ({ id, contact }) => ({
228
- id,
229
- contactFirstName: contact.firstName,
230
- contactLastName: contact.lastName,
231
- contactEmail: contact.email,
310
+ SchemaTransformation.transform({
311
+ decode: ({ id, contactFirstName, contactLastName, contactEmail }) => ({
312
+ id,
313
+ contact: {
314
+ firstName: contactFirstName,
315
+ lastName: contactLastName,
316
+ email: contactEmail,
317
+ },
318
+ }),
319
+ encode: ({ id, contact }) => ({
320
+ id,
321
+ contactFirstName: contact.firstName,
322
+ contactLastName: contact.lastName,
323
+ contactEmail: contact.email,
324
+ }),
232
325
  }),
233
- },
326
+ ),
234
327
  )
235
328
 
236
329
  const contactsTable = State.SQLite.table({
@@ -266,13 +359,13 @@ describe('table function overloads', () => {
266
359
  expect(todosTable.sqliteDef.name).toBe('TodoItem')
267
360
  })
268
361
 
269
- it('should properly infer types from schema', () => {
362
+ it('should properly infer types from schema', async () => {
270
363
  const UserSchema = Schema.Struct({
271
364
  id: Schema.String,
272
365
  name: Schema.String,
273
366
  age: Schema.Int,
274
367
  active: Schema.Boolean,
275
- metadata: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Unknown })),
368
+ metadata: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),
276
369
  })
277
370
 
278
371
  const userTable = State.SQLite.table({
@@ -297,13 +390,6 @@ describe('table function overloads', () => {
297
390
  type ActiveColumn = typeof userTable.sqliteDef.columns.active
298
391
  type MetadataColumn = typeof userTable.sqliteDef.columns.metadata
299
392
 
300
- // Should derive proper column schema
301
- expect((userTable.rowSchema as any).fields.age.toString()).toMatchInlineSnapshot(`"Int"`)
302
- expect((userTable.rowSchema as any).fields.active.toString()).toMatchInlineSnapshot(`"(number <-> boolean)"`)
303
- expect((userTable.rowSchema as any).fields.metadata.toString()).toMatchInlineSnapshot(
304
- `"(parseJson <-> { readonly [x: string]: unknown }) | null"`,
305
- )
306
-
307
393
  // These should compile without errors
308
394
  const _idCheck: IdColumn['schema']['Type'] = 'string'
309
395
  const _nameCheck: NameColumn['schema']['Type'] = 'string'
@@ -318,6 +404,28 @@ describe('table function overloads', () => {
318
404
  expect(userTable.sqliteDef.columns.active.columnType).toBe('integer')
319
405
  expect(userTable.sqliteDef.columns.metadata.columnType).toBe('text')
320
406
  expect(userTable.sqliteDef.columns.metadata.nullable).toBe(true)
407
+
408
+ const asserts = new TestSchema.Asserts(userTable.rowSchema)
409
+ await asserts.decoding().succeed(
410
+ {
411
+ id: 'test-id',
412
+ name: 'John',
413
+ age: 30,
414
+ active: 1,
415
+ metadata: JSON.stringify({ key1: 'value1', key2: 123 }),
416
+ },
417
+ {
418
+ id: 'test-id',
419
+ name: 'John',
420
+ age: 30,
421
+ active: true,
422
+ metadata: { key1: 'value1', key2: 123 },
423
+ },
424
+ )
425
+ const activeAsserts = new TestSchema.Asserts(userTable.sqliteDef.columns.active.schema)
426
+ const metadataAsserts = new TestSchema.Asserts(userTable.sqliteDef.columns.metadata.schema)
427
+ await activeAsserts.decoding().succeed(0, false)
428
+ await metadataAsserts.decoding().succeed(null)
321
429
  })
322
430
 
323
431
  it('should allow omitting nullable fields in insert()', () => {
@@ -347,41 +455,117 @@ describe('table function overloads', () => {
347
455
  .toBeCallableWith({ id: '1', undefined: undefined, null: null, undefinedOrString: undefined })
348
456
  .toBeCallableWith({ id: '1', undefined: undefined, null: null, undefinedOrString: 'string' })
349
457
  .toBeCallableWith({ id: '1', undefined: undefined, null: null, undefinedOrString: 'string', nullOrString: null })
350
- .toBeCallableWith({ id: '1', undefined: undefined, null: null, undefinedOrString: 'string', nullOrString: 'string' })
351
- .toBeCallableWith({ id: '1', undefined: undefined, null: null, undefinedOrString: 'string', nullOrString: 'string', optionalString: 'string' })
352
- .toBeCallableWith({ id: '1', undefined: undefined, null: null, undefinedOrString: 'string', nullOrString: 'string', optionalString: 'string', optionalNullOrString: null })
353
- .toBeCallableWith({ id: '1', undefined: undefined, null: null, undefinedOrString: 'string', nullOrString: 'string', optionalString: 'string', optionalNullOrString: 'string' })
458
+ .toBeCallableWith({
459
+ id: '1',
460
+ undefined: undefined,
461
+ null: null,
462
+ undefinedOrString: 'string',
463
+ nullOrString: 'string',
464
+ })
465
+ .toBeCallableWith({
466
+ id: '1',
467
+ undefined: undefined,
468
+ null: null,
469
+ undefinedOrString: 'string',
470
+ nullOrString: 'string',
471
+ optionalString: 'string',
472
+ })
473
+ .toBeCallableWith({
474
+ id: '1',
475
+ undefined: undefined,
476
+ null: null,
477
+ undefinedOrString: 'string',
478
+ nullOrString: 'string',
479
+ optionalString: 'string',
480
+ optionalNullOrString: null,
481
+ })
482
+ .toBeCallableWith({
483
+ id: '1',
484
+ undefined: undefined,
485
+ null: null,
486
+ undefinedOrString: 'string',
487
+ nullOrString: 'string',
488
+ optionalString: 'string',
489
+ optionalNullOrString: 'string',
490
+ })
354
491
 
355
492
  expect(() => usersTable.insert({ id: '1' }).asSql()).not.toThrow()
356
493
  expect(() => usersTable.insert({ id: '1', undefined: undefined }).asSql()).not.toThrow()
357
494
  expect(() => usersTable.insert({ id: '1', undefined: undefined, null: null }).asSql()).not.toThrow()
358
- expect(() => usersTable.insert({ id: '1', undefined: undefined, null: null, undefinedOrString: undefined }).asSql()).not.toThrow()
359
- expect(() => usersTable.insert({ id: '1', undefined: undefined, null: null, undefinedOrString: 'string' }).asSql()).not.toThrow()
360
- expect(() => usersTable.insert({ id: '1', undefined: undefined, null: null, undefinedOrString: 'string', nullOrString: null }).asSql()).not.toThrow()
361
- expect(() => usersTable.insert({ id: '1', undefined: undefined, null: null, undefinedOrString: 'string', nullOrString: 'string' }).asSql()).not.toThrow()
362
- expect(() => usersTable.insert({ id: '1', undefined: undefined, null: null, undefinedOrString: 'string', nullOrString: 'string', optionalString: 'string' }).asSql()).not.toThrow()
363
- expect(() => usersTable.insert({ id: '1', undefined: undefined, null: null, undefinedOrString: 'string', nullOrString: 'string', optionalString: 'string', optionalNullOrString: null }).asSql()).not.toThrow()
364
- expect(() => usersTable.insert({ id: '1', undefined: undefined, null: null, undefinedOrString: 'string', nullOrString: 'string', optionalString: 'string', optionalNullOrString: 'string' }).asSql()).not.toThrow()
495
+ expect(() =>
496
+ usersTable.insert({ id: '1', undefined: undefined, null: null, undefinedOrString: undefined }).asSql(),
497
+ ).not.toThrow()
498
+ expect(() =>
499
+ usersTable.insert({ id: '1', undefined: undefined, null: null, undefinedOrString: 'string' }).asSql(),
500
+ ).not.toThrow()
501
+ expect(() =>
502
+ usersTable
503
+ .insert({ id: '1', undefined: undefined, null: null, undefinedOrString: 'string', nullOrString: null })
504
+ .asSql(),
505
+ ).not.toThrow()
506
+ expect(() =>
507
+ usersTable
508
+ .insert({ id: '1', undefined: undefined, null: null, undefinedOrString: 'string', nullOrString: 'string' })
509
+ .asSql(),
510
+ ).not.toThrow()
511
+ expect(() =>
512
+ usersTable
513
+ .insert({
514
+ id: '1',
515
+ undefined: undefined,
516
+ null: null,
517
+ undefinedOrString: 'string',
518
+ nullOrString: 'string',
519
+ optionalString: 'string',
520
+ })
521
+ .asSql(),
522
+ ).not.toThrow()
523
+ expect(() =>
524
+ usersTable
525
+ .insert({
526
+ id: '1',
527
+ undefined: undefined,
528
+ null: null,
529
+ undefinedOrString: 'string',
530
+ nullOrString: 'string',
531
+ optionalString: 'string',
532
+ optionalNullOrString: null,
533
+ })
534
+ .asSql(),
535
+ ).not.toThrow()
536
+ expect(() =>
537
+ usersTable
538
+ .insert({
539
+ id: '1',
540
+ undefined: undefined,
541
+ null: null,
542
+ undefinedOrString: 'string',
543
+ nullOrString: 'string',
544
+ optionalString: 'string',
545
+ optionalNullOrString: 'string',
546
+ })
547
+ .asSql(),
548
+ ).not.toThrow()
365
549
  })
366
550
 
367
551
  it('supports discriminated unions with parsed JSON payloads', () => {
368
552
  const CircleDataSchema = Schema.Struct({
369
- radius: Schema.Number,
553
+ radius: Schema.Finite,
370
554
  })
371
555
  const CircleSchema = Schema.Struct({
372
556
  kind: Schema.Literal('circle'),
373
- data: Schema.parseJson(CircleDataSchema),
557
+ data: Schema.fromJsonString(CircleDataSchema),
374
558
  })
375
559
 
376
560
  const SquareDataSchema = Schema.Struct({
377
- sideLength: Schema.Number,
561
+ sideLength: Schema.Finite,
378
562
  })
379
563
  const SquareSchema = Schema.Struct({
380
564
  kind: Schema.Literal('square'),
381
- data: Schema.parseJson(SquareDataSchema),
565
+ data: Schema.fromJsonString(SquareDataSchema),
382
566
  })
383
567
 
384
- const ShapeSchema = Schema.Union(CircleSchema, SquareSchema)
568
+ const ShapeSchema = Schema.Union([CircleSchema, SquareSchema])
385
569
 
386
570
  const shapes = State.SQLite.table({
387
571
  name: 'shapes',
@@ -389,9 +573,7 @@ describe('table function overloads', () => {
389
573
  })
390
574
 
391
575
  expect(shapes.sqliteDef.columns.kind.columnType).toBe('text')
392
-
393
- const kindSchema = objectToString(shapes.sqliteDef.columns.kind.schema)
394
- expect(kindSchema).toContain('"circle" | "square"')
576
+ expect(SchemaAST.isUnion(Schema.toEncoded(shapes.sqliteDef.columns.kind.schema).ast)).toBe(true)
395
577
 
396
578
  expect(() =>
397
579
  shapes
@@ -411,4 +593,26 @@ describe('table function overloads', () => {
411
593
  .asSql(),
412
594
  ).not.toThrow()
413
595
  })
596
+
597
+ it('treats optional common union fields as nullable columns', () => {
598
+ const StateSchema = Schema.Union([
599
+ Schema.Struct({
600
+ kind: Schema.Literal('empty'),
601
+ note: Schema.optional(Schema.String),
602
+ }),
603
+ Schema.Struct({
604
+ kind: Schema.Literal('ready'),
605
+ note: Schema.optional(Schema.String),
606
+ }),
607
+ ])
608
+
609
+ const states = State.SQLite.table({
610
+ name: 'states',
611
+ schema: StateSchema,
612
+ })
613
+
614
+ expect(states.sqliteDef.columns.kind.columnType).toBe('text')
615
+ expect(states.sqliteDef.columns.note.columnType).toBe('text')
616
+ expect(states.sqliteDef.columns.note.nullable).toBe(true)
617
+ })
414
618
  })