@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,7 +1,7 @@
1
+ import { TestSchema } from 'effect/testing'
1
2
  import { assert, describe, expect, it } from 'vitest'
2
3
 
3
- import { Schema } from '@livestore/utils/effect'
4
- import { objectToString } from '@livestore/utils'
4
+ import { Schema, SchemaAST, SchemaTransformation, Struct } from '@livestore/utils/effect'
5
5
 
6
6
  import * as State from '../mod.ts'
7
7
  import { withAutoIncrement, withColumnType, withDefault, withPrimaryKey, withUnique } from './column-annotations.ts'
@@ -14,7 +14,7 @@ describe('getColumnDefForSchema', () => {
14
14
  })
15
15
 
16
16
  it('should map Schema.Number to real column', () => {
17
- const columnDef = State.SQLite.getColumnDefForSchema(Schema.Number)
17
+ const columnDef = State.SQLite.getColumnDefForSchema(Schema.Finite)
18
18
  expect(columnDef.columnType).toBe('real')
19
19
  })
20
20
 
@@ -26,15 +26,106 @@ describe('getColumnDefForSchema', () => {
26
26
  it('should map Schema.Date to text column', () => {
27
27
  const columnDef = State.SQLite.getColumnDefForSchema(Schema.Date)
28
28
  expect(columnDef.columnType).toBe('text')
29
- expect(Schema.encodedSchema(columnDef.schema).toString()).toBe('string')
30
- expect(Schema.typeSchema(columnDef.schema).toString()).toBe('Date')
29
+ const date = new Date('2026-01-02T03:04:05.678Z')
30
+ expect(Schema.encodeUnknownSync(columnDef.schema)(date)).toBe(date.toISOString())
31
+ expect(Schema.decodeSync(columnDef.schema)(date.toISOString())).toEqual(date)
32
+ expect(Schema.toEncoded(columnDef.schema).ast._tag).toBe('String')
33
+ expect(
34
+ SchemaAST.resolveAt<{ readonly id: string }>('representation')(Schema.toType(columnDef.schema).ast)?.id,
35
+ ).toBe('effect/schema/Date')
31
36
  })
32
37
 
33
- it('should map Schema.DateFromNumber to integer column', () => {
34
- const columnDef = State.SQLite.getColumnDefForSchema(Schema.DateFromNumber)
38
+ it('should map Schema.DateFromMillis to integer column', () => {
39
+ const columnDef = State.SQLite.getColumnDefForSchema(Schema.DateFromMillis)
35
40
  expect(columnDef.columnType).toBe('integer')
36
- expect(Schema.encodedSchema(columnDef.schema).toString()).toBe('number')
37
- expect(Schema.typeSchema(columnDef.schema).toString()).toBe('DateFromSelf')
41
+ expect(Schema.toEncoded(columnDef.schema).ast._tag).toBe('Number')
42
+ expect(
43
+ SchemaAST.resolveAt<{ readonly id: string }>('representation')(Schema.toType(columnDef.schema).ast)?.id,
44
+ ).toBe('effect/schema/Date')
45
+ })
46
+
47
+ it('should preserve the Date representation through checks', () => {
48
+ const schema = Schema.DateFromMillis.check(Schema.isGreaterThanDate(new Date(0)))
49
+
50
+ expect(State.SQLite.getColumnDefForSchema(schema).columnType).toBe('integer')
51
+ })
52
+
53
+ it('should preserve bare Date checks on encoding and decoding', () => {
54
+ const schema = Schema.Date.check(Schema.isGreaterThanDate(new Date(0)))
55
+ const columnDef = State.SQLite.getColumnDefForSchema(schema)
56
+ const date = new Date('2026-01-02T03:04:05.678Z')
57
+
58
+ expect(Schema.encodeUnknownSync(columnDef.schema)(date)).toBe(date.toISOString())
59
+ expect(Schema.decodeSync(columnDef.schema)(date.toISOString())).toEqual(date)
60
+ expect(() => Schema.encodeUnknownSync(columnDef.schema)(new Date(0))).toThrow()
61
+ expect(() => Schema.decodeSync(columnDef.schema)(new Date(0).toISOString())).toThrow()
62
+ })
63
+
64
+ it('should round-trip transformations with an encoded Date', () => {
65
+ const schema = Schema.Date.pipe(
66
+ Schema.decodeTo(
67
+ Schema.String,
68
+ SchemaTransformation.transform({
69
+ decode: (date) => date.toISOString(),
70
+ encode: (value) => new Date(value),
71
+ }),
72
+ ),
73
+ )
74
+ const columnDef = State.SQLite.getColumnDefForSchema(schema)
75
+ const value = '2026-01-02T03:04:05.678Z'
76
+
77
+ expect(columnDef.columnType).toBe('text')
78
+ expect(Schema.encodeUnknownSync(columnDef.schema)(value)).toBe(value)
79
+ expect(Schema.decodeSync(columnDef.schema)(value)).toBe(value)
80
+ })
81
+
82
+ it.each(['nullable', 'optional'] as const)(
83
+ 'should round-trip %s transformations with an encoded Date',
84
+ (wrapper) => {
85
+ const schema = Schema.Date.pipe(
86
+ Schema.decodeTo(
87
+ Schema.String,
88
+ SchemaTransformation.transform({
89
+ decode: (date) => date.toISOString(),
90
+ encode: (value) => new Date(value),
91
+ }),
92
+ ),
93
+ )
94
+ const field = wrapper === 'nullable' ? Schema.NullOr(schema) : Schema.optional(schema)
95
+ const { columns } = State.SQLite.table({ name: 'stamps', schema: Schema.Struct({ value: field }) }).sqliteDef
96
+ const columnDef = columns.value
97
+ const value = '2026-01-02T03:04:05.678Z'
98
+
99
+ expect(columnDef.nullable).toBe(true)
100
+ expect(columnDef.columnType).toBe('text')
101
+ const encoded = Schema.encodeUnknownSync(columnDef.schema)(value)
102
+ expect(Schema.decodeSync(columnDef.schema)(encoded)).toBe(value)
103
+ expect(encoded).toBe(value)
104
+ expect(Schema.encodeUnknownSync(columnDef.schema)(null)).toBeNull()
105
+ expect(Schema.decodeSync(columnDef.schema)(null)).toBeNull()
106
+ },
107
+ )
108
+
109
+ it('should round-trip transformations with an encoded nullable Date', () => {
110
+ const schema = Schema.NullOr(Schema.Date).pipe(
111
+ Schema.decodeTo(
112
+ Schema.String,
113
+ SchemaTransformation.transform({
114
+ decode: (date) => (date === null ? 'none' : date.toISOString()),
115
+ encode: (value) => (value === 'none' ? null : new Date(value)),
116
+ }),
117
+ ),
118
+ )
119
+ const { columns } = State.SQLite.table({ name: 'stamps', schema: Schema.Struct({ value: schema }) }).sqliteDef
120
+ const columnDef = columns.value
121
+ const value = '2026-01-02T03:04:05.678Z'
122
+ const encoded = Schema.encodeUnknownSync(columnDef.schema)(value)
123
+
124
+ expect(Schema.decodeSync(columnDef.schema)(encoded)).toBe(value)
125
+ expect(encoded).toBe(value)
126
+ expect(columnDef.nullable).toBe(true)
127
+ expect(Schema.encodeUnknownSync(columnDef.schema)('none')).toBeNull()
128
+ expect(Schema.decodeSync(columnDef.schema)(null)).toBe('none')
38
129
  })
39
130
 
40
131
  it('should map Schema.BigInt to text column', () => {
@@ -47,17 +138,20 @@ describe('getColumnDefForSchema', () => {
47
138
  it('should map Schema.Int to integer column', () => {
48
139
  const columnDef = State.SQLite.getColumnDefForSchema(Schema.Int)
49
140
  expect(columnDef.columnType).toBe('integer')
141
+
142
+ const positiveInt = State.SQLite.getColumnDefForSchema(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)))
143
+ expect(positiveInt.columnType).toBe('integer')
50
144
  })
51
145
 
52
146
  it('should map string refinements to text column', () => {
53
147
  const refinements = [
54
148
  { schema: Schema.NonEmptyString, name: 'NonEmptyString' },
55
149
  { schema: Schema.Trim, name: 'Trim' },
56
- { schema: Schema.UUID, name: 'UUID' },
57
- { schema: Schema.ULID, name: 'ULID' },
58
- { schema: Schema.String.pipe(Schema.minLength(5)), name: 'minLength' },
150
+ { schema: Schema.String.check(Schema.isUUID()), name: 'UUID' },
151
+ { schema: Schema.String.check(Schema.isULID()), name: 'ULID' },
152
+ { schema: Schema.String.check(Schema.isMinLength(5)), name: 'minLength' },
59
153
  {
60
- schema: Schema.String.pipe(Schema.pattern(/^[A-Z]+$/)),
154
+ schema: Schema.String.check(Schema.isPattern(/^[A-Z]+$/)),
61
155
  name: 'pattern',
62
156
  },
63
157
  ]
@@ -71,8 +165,7 @@ describe('getColumnDefForSchema', () => {
71
165
  it('should map number refinements to real column', () => {
72
166
  const refinements = [
73
167
  { schema: Schema.Finite, name: 'Finite' },
74
- { schema: Schema.Number.pipe(Schema.positive()), name: 'positive' },
75
- { schema: Schema.Number.pipe(Schema.between(0, 100)), name: 'between' },
168
+ { schema: Schema.Finite.check(Schema.isBetween({ minimum: 0, maximum: 100 })), name: 'between' },
76
169
  ]
77
170
 
78
171
  for (const { schema, name } of refinements) {
@@ -101,12 +194,7 @@ describe('getColumnDefForSchema', () => {
101
194
 
102
195
  describe('transformations', () => {
103
196
  it('should map transformations based on target type', () => {
104
- const StringToNumber = Schema.String.pipe(
105
- Schema.transform(Schema.Number, {
106
- decode: Number.parseFloat,
107
- encode: String,
108
- }),
109
- )
197
+ const StringToNumber = Schema.FiniteFromString
110
198
 
111
199
  const columnDef = State.SQLite.getColumnDefForSchema(StringToNumber)
112
200
  expect(columnDef.columnType).toBe('text') // Based on the encoded type (String)
@@ -122,7 +210,7 @@ describe('getColumnDefForSchema', () => {
122
210
  it('should map structs to json column', () => {
123
211
  const UserSchema = Schema.Struct({
124
212
  name: Schema.String,
125
- age: Schema.Number,
213
+ age: Schema.Finite,
126
214
  })
127
215
 
128
216
  const columnDef = State.SQLite.getColumnDefForSchema(UserSchema)
@@ -135,22 +223,22 @@ describe('getColumnDefForSchema', () => {
135
223
  })
136
224
 
137
225
  it('should map records to json column', () => {
138
- const columnDef = State.SQLite.getColumnDefForSchema(Schema.Record({ key: Schema.String, value: Schema.Number }))
226
+ const columnDef = State.SQLite.getColumnDefForSchema(Schema.Record(Schema.String, Schema.Finite))
139
227
  expect(columnDef.columnType).toBe('text')
140
228
  })
141
229
 
142
230
  it('should map tuples to json column', () => {
143
- const columnDef = State.SQLite.getColumnDefForSchema(Schema.Tuple(Schema.String, Schema.Number))
231
+ const columnDef = State.SQLite.getColumnDefForSchema(Schema.Tuple([Schema.String, Schema.Finite]))
144
232
  expect(columnDef.columnType).toBe('text')
145
233
  })
146
234
 
147
235
  it('should map tagged unions to json column', () => {
148
- const ResultSchema = Schema.Union(
236
+ const ResultSchema = Schema.Union([
149
237
  Schema.TaggedStruct('success', {
150
238
  value: Schema.String,
151
239
  }),
152
240
  Schema.TaggedStruct('error', { error: Schema.String }),
153
- )
241
+ ])
154
242
 
155
243
  const columnDef = State.SQLite.getColumnDefForSchema(ResultSchema)
156
244
  expect(columnDef.columnType).toBe('text')
@@ -173,7 +261,7 @@ describe('getColumnDefForSchema', () => {
173
261
 
174
262
  it('should handle optional nested schemas', () => {
175
263
  const columnDef = State.SQLite.getColumnDefForSchema(
176
- Schema.Union(Schema.Struct({ name: Schema.String }), Schema.Undefined),
264
+ Schema.Union([Schema.Struct({ name: Schema.String }), Schema.Undefined]),
177
265
  )
178
266
  expect(columnDef.columnType).toBe('text')
179
267
  })
@@ -198,7 +286,7 @@ describe('getColumnDefForSchema', () => {
198
286
 
199
287
  it('should handle never schema', () => {
200
288
  // Create a schema that should never validate
201
- const neverSchema = Schema.String.pipe(Schema.filter(() => false, { message: () => 'Always fails' }))
289
+ const neverSchema = Schema.String.check(Schema.makeFilter(() => false, { message: 'Always fails' }))
202
290
 
203
291
  const columnDef = State.SQLite.getColumnDefForSchema(neverSchema)
204
292
  expect(columnDef.columnType).toBe('text')
@@ -234,7 +322,7 @@ describe('getColumnDefForSchema', () => {
234
322
  email: Schema.String,
235
323
  })
236
324
 
237
- const PickedSchema = UserSchema.pipe(Schema.pick('id', 'name'))
325
+ const PickedSchema = UserSchema.mapFields(Struct.pick(['id', 'name']))
238
326
 
239
327
  const columnDef = State.SQLite.getColumnDefForSchema(PickedSchema)
240
328
  expect(columnDef.columnType).toBe('text')
@@ -247,7 +335,7 @@ describe('getColumnDefForSchema', () => {
247
335
  password: Schema.String,
248
336
  })
249
337
 
250
- const PublicUserSchema = UserSchema.pipe(Schema.omit('password'))
338
+ const PublicUserSchema = UserSchema.mapFields(Struct.omit(['password']))
251
339
 
252
340
  const columnDef = State.SQLite.getColumnDefForSchema(PublicUserSchema)
253
341
  expect(columnDef.columnType).toBe('text')
@@ -256,10 +344,10 @@ describe('getColumnDefForSchema', () => {
256
344
 
257
345
  describe('annotations', () => {
258
346
  it('should handle schemas with custom annotations', () => {
259
- const AnnotatedString = Schema.String.annotations({
347
+ const AnnotatedString = Schema.String.annotate({
260
348
  description: 'A special string',
261
349
  })
262
- const AnnotatedNumber = Schema.Number.annotations({ min: 0, max: 100 })
350
+ const AnnotatedNumber = Schema.Finite.annotate({ min: 0, max: 100 })
263
351
 
264
352
  expect(State.SQLite.getColumnDefForSchema(AnnotatedString).columnType).toBe('text')
265
353
  expect(State.SQLite.getColumnDefForSchema(AnnotatedNumber).columnType).toBe('real')
@@ -268,20 +356,20 @@ describe('getColumnDefForSchema', () => {
268
356
 
269
357
  describe('enums and literal unions', () => {
270
358
  it('should handle enums and literal unions as text', () => {
271
- const StatusEnum = Schema.Enums({
359
+ const StatusEnum = Schema.Enum({
272
360
  PENDING: 'pending',
273
361
  ACTIVE: 'active',
274
362
  INACTIVE: 'inactive',
275
363
  })
276
364
 
277
- const StatusUnion = Schema.Literal('pending', 'active', 'inactive')
365
+ const StatusUnion = Schema.Literals(['pending', 'active', 'inactive'])
278
366
 
279
367
  expect(State.SQLite.getColumnDefForSchema(StatusEnum).columnType).toBe('text')
280
368
  expect(State.SQLite.getColumnDefForSchema(StatusUnion).columnType).toBe('text')
281
369
  })
282
370
 
283
371
  it('should handle unions of numeric literals as integer column', () => {
284
- const IntervalSchema = Schema.Literal(1, 5, 15, 30)
372
+ const IntervalSchema = Schema.Literals([1, 5, 15, 30])
285
373
 
286
374
  const columnDef = State.SQLite.getColumnDefForSchema(IntervalSchema)
287
375
 
@@ -289,7 +377,7 @@ describe('getColumnDefForSchema', () => {
289
377
  })
290
378
 
291
379
  it('should handle unions of non-integer numeric literals as real column', () => {
292
- const PercentSchema = Schema.Literal(0.1, 0.2, 0.25)
380
+ const PercentSchema = Schema.Literals([0.1, 0.2, 0.25])
293
381
 
294
382
  const columnDef = State.SQLite.getColumnDefForSchema(PercentSchema)
295
383
 
@@ -298,10 +386,25 @@ describe('getColumnDefForSchema', () => {
298
386
  })
299
387
 
300
388
  describe('binary data', () => {
301
- it('should handle Uint8Array as blob column', () => {
389
+ it('should handle Uint8Array as blob column', async () => {
302
390
  const columnDef = State.SQLite.getColumnDefForSchema(Schema.Uint8Array)
303
391
  expect(columnDef.columnType).toBe('blob')
304
- expect(objectToString(columnDef.schema)).toBe('Uint8ArrayFromSelf')
392
+ expect(
393
+ SchemaAST.resolveAt<{ readonly id: string }>('representation')(Schema.toType(columnDef.schema).ast)?.id,
394
+ ).toBe('effect/schema/Uint8Array')
395
+
396
+ const asserts = new TestSchema.Asserts(columnDef.schema)
397
+ await asserts.decoding().succeed(new Uint8Array([1, 2, 3]))
398
+ })
399
+
400
+ it('should preserve Uint8Array checks on blob columns', () => {
401
+ const schema = Schema.Uint8Array.check(Schema.makeFilter((value) => value.byteLength > 0))
402
+ const columnDef = State.SQLite.getColumnDefForSchema(schema)
403
+
404
+ expect(columnDef.columnType).toBe('blob')
405
+ expect(columnDef.schema).toBe(schema)
406
+ expect(Schema.decodeSync(columnDef.schema)(new Uint8Array([1]))).toEqual(new Uint8Array([1]))
407
+ expect(() => Schema.decodeSync(columnDef.schema)(new Uint8Array())).toThrow()
305
408
  })
306
409
  })
307
410
 
@@ -322,12 +425,12 @@ describe('getColumnDefForSchema', () => {
322
425
  })
323
426
 
324
427
  describe('schema-based table definitions', () => {
325
- it('should handle optional fields in schema', () => {
428
+ it('should handle optional fields in schema', async () => {
326
429
  const UserSchema = Schema.Struct({
327
430
  id: Schema.String,
328
431
  name: Schema.String,
329
432
  email: Schema.optional(Schema.String),
330
- age: Schema.optional(Schema.Number),
433
+ age: Schema.optional(Schema.Finite),
331
434
  })
332
435
 
333
436
  const userTable = State.SQLite.table({
@@ -343,12 +446,16 @@ describe('getColumnDefForSchema', () => {
343
446
  expect(userTable.sqliteDef.columns.id.nullable).toBe(false)
344
447
  expect(userTable.sqliteDef.columns.name.nullable).toBe(false)
345
448
 
346
- // Row schema should show | null for optional fields
347
- expect((userTable.rowSchema as any).fields.email.toString()).toBe('string | null')
348
- expect((userTable.rowSchema as any).fields.age.toString()).toBe('number | null')
449
+ const asserts = new TestSchema.Asserts(userTable.rowSchema)
450
+ await asserts.decoding().succeed({
451
+ id: 'user-1',
452
+ name: 'Ada',
453
+ email: null,
454
+ age: null,
455
+ })
349
456
  })
350
457
 
351
- it('should handle optional boolean with proper transformation', () => {
458
+ it('should handle optional boolean with proper transformation', async () => {
352
459
  const schema = Schema.Struct({
353
460
  id: Schema.String,
354
461
  active: Schema.optional(Schema.Boolean),
@@ -358,11 +465,13 @@ describe('getColumnDefForSchema', () => {
358
465
 
359
466
  expect(table.sqliteDef.columns.active.nullable).toBe(true)
360
467
  expect(table.sqliteDef.columns.active.columnType).toBe('integer')
361
- expect(objectToString(table.sqliteDef.columns.active.schema)).toBe('(number <-> boolean) | null')
362
- expect(String((table.rowSchema as any).fields.active)).toBe('(number <-> boolean) | null')
468
+ const asserts = new TestSchema.Asserts(table.rowSchema)
469
+ await asserts.decoding().succeed({ id: 'row-1', active: 1 }, { id: 'row-1', active: true })
470
+ expect(Schema.encodeSync(table.sqliteDef.columns.active.schema)(false)).toBe(0)
471
+ await asserts.decoding().succeed({ id: 'row-1', active: null })
363
472
  })
364
473
 
365
- it('should handle optional complex types with JSON encoding', () => {
474
+ it('should handle optional complex types with JSON encoding', async () => {
366
475
  const schema = Schema.Struct({
367
476
  id: Schema.String,
368
477
  metadata: Schema.optional(Schema.Struct({ color: Schema.String })),
@@ -373,17 +482,27 @@ describe('getColumnDefForSchema', () => {
373
482
 
374
483
  expect(table.sqliteDef.columns.metadata.nullable).toBe(true)
375
484
  expect(table.sqliteDef.columns.metadata.columnType).toBe('text')
376
- expect((table.rowSchema as any).fields.metadata.toString()).toBe(
377
- '(parseJson <-> { readonly color: string }) | null',
378
- // '(parseJson <-> { readonly color: string } | null)', // not sure yet about which semantics we want here
379
- )
380
485
 
381
486
  expect(table.sqliteDef.columns.tags.nullable).toBe(true)
382
487
  expect(table.sqliteDef.columns.tags.columnType).toBe('text')
383
- expect((table.rowSchema as any).fields.tags.toString()).toBe('(parseJson <-> ReadonlyArray<string>) | null')
488
+
489
+ const asserts = new TestSchema.Asserts(table.rowSchema)
490
+ await asserts.decoding().succeed(
491
+ {
492
+ id: 'row-1',
493
+ metadata: JSON.stringify({ color: 'red' }),
494
+ tags: JSON.stringify(['urgent', 'local']),
495
+ },
496
+ {
497
+ id: 'row-1',
498
+ metadata: { color: 'red' },
499
+ tags: ['urgent', 'local'],
500
+ },
501
+ )
502
+ await asserts.decoding().succeed({ id: 'row-1', metadata: null, tags: null })
384
503
  })
385
504
 
386
- it('should handle Schema.NullOr', () => {
505
+ it('should handle Schema.NullOr', async () => {
387
506
  const schema = Schema.Struct({
388
507
  id: Schema.String,
389
508
  description: Schema.NullOr(Schema.String),
@@ -395,41 +514,55 @@ describe('getColumnDefForSchema', () => {
395
514
  expect(table.sqliteDef.columns.description.nullable).toBe(true)
396
515
  expect(table.sqliteDef.columns.count.nullable).toBe(true)
397
516
 
398
- expect((table.rowSchema as any).fields.description.toString()).toBe('string | null')
399
- expect((table.rowSchema as any).fields.count.toString()).toBe('Int | null')
517
+ const asserts = new TestSchema.Asserts(table.rowSchema)
518
+ await asserts.decoding().succeed({
519
+ id: 'row-1',
520
+ description: 'ready',
521
+ count: 1,
522
+ })
523
+ await asserts.decoding().succeed({
524
+ id: 'row-1',
525
+ description: null,
526
+ count: null,
527
+ })
400
528
  })
401
529
 
402
- it('should treat unions of string literals as text columns without JSON parsing', () => {
530
+ it('should treat unions of string literals as text columns without JSON parsing', async () => {
403
531
  const schema = Schema.Struct({
404
532
  id: Schema.String,
405
- status: Schema.Literal('idle', 'running', 'stopped'),
533
+ status: Schema.Literals(['idle', 'running', 'stopped']),
406
534
  })
407
535
 
408
536
  const table = State.SQLite.table({ name: 'timers', schema })
409
537
 
410
538
  expect(table.sqliteDef.columns.status.columnType).toBe('text')
411
- expect(objectToString(table.sqliteDef.columns.status.schema)).toBe('"idle" | "running" | "stopped"')
412
- expect(String((table.rowSchema as any).fields.status)).toBe('"idle" | "running" | "stopped"')
539
+ expect(Schema.toEncoded(table.sqliteDef.columns.status.schema).ast._tag).toBe('Union')
540
+
541
+ const asserts = new TestSchema.Asserts(table.rowSchema)
542
+ await asserts.decoding().succeed({ id: 'timer-1', status: 'idle' })
413
543
  })
414
544
 
415
- it('should handle Schema.NullOr with complex types', () => {
545
+ it('should handle Schema.NullOr with complex types', async () => {
416
546
  const schema = Schema.Struct({
417
- data: Schema.NullOr(Schema.Struct({ value: Schema.Number })),
418
- }).annotations({ title: 'test' })
547
+ data: Schema.NullOr(Schema.Struct({ value: Schema.Finite })),
548
+ }).annotate({ title: 'test' })
419
549
 
420
550
  const table = State.SQLite.table({ schema })
421
551
 
422
552
  expect(table.sqliteDef.columns.data.nullable).toBe(true)
423
553
  expect(table.sqliteDef.columns.data.columnType).toBe('text')
424
- expect((table.rowSchema as any).fields.data.toString()).toBe('(parseJson <-> { readonly value: number }) | null')
554
+
555
+ const asserts = new TestSchema.Asserts(table.rowSchema)
556
+ await asserts.decoding().succeed({ data: JSON.stringify({ value: 42 }) }, { data: { value: 42 } })
557
+ await asserts.decoding().succeed({ data: null })
425
558
  })
426
559
 
427
- it('should handle mixed nullable and optional fields', () => {
560
+ it('should handle mixed nullable and optional fields', async () => {
428
561
  const schema = Schema.Struct({
429
562
  nullableText: Schema.NullOr(Schema.String),
430
563
  optionalText: Schema.optional(Schema.String),
431
- optionalJson: Schema.optional(Schema.Struct({ x: Schema.Number })),
432
- }).annotations({ title: 'test' })
564
+ optionalJson: Schema.optional(Schema.Struct({ x: Schema.Finite })),
565
+ }).annotate({ title: 'test' })
433
566
 
434
567
  const table = State.SQLite.table({ schema })
435
568
 
@@ -438,12 +571,15 @@ describe('getColumnDefForSchema', () => {
438
571
  expect(table.sqliteDef.columns.optionalText.nullable).toBe(true)
439
572
  expect(table.sqliteDef.columns.optionalJson.nullable).toBe(true)
440
573
 
441
- // Schema representations
442
- expect((table.rowSchema as any).fields.nullableText.toString()).toBe('string | null')
443
- expect((table.rowSchema as any).fields.optionalText.toString()).toBe('string | null')
444
- expect((table.rowSchema as any).fields.optionalJson.toString()).toBe(
445
- '(parseJson <-> { readonly x: number }) | null',
446
- )
574
+ const nullableTextAsserts = new TestSchema.Asserts(table.sqliteDef.columns.nullableText.schema)
575
+ const optionalTextAsserts = new TestSchema.Asserts(table.sqliteDef.columns.optionalText.schema)
576
+ const optionalJsonAsserts = new TestSchema.Asserts(table.sqliteDef.columns.optionalJson.schema)
577
+
578
+ await nullableTextAsserts.decoding().succeed('hello')
579
+ await nullableTextAsserts.decoding().succeed(null)
580
+ await optionalTextAsserts.decoding().succeed(null)
581
+ await optionalJsonAsserts.decoding().succeed(JSON.stringify({ x: 1 }), { x: 1 })
582
+ await optionalJsonAsserts.decoding().succeed(null)
447
583
  })
448
584
 
449
585
  // TODO bring back some time later
@@ -452,7 +588,7 @@ describe('getColumnDefForSchema', () => {
452
588
  // id: Schema.String,
453
589
  // lossyText: Schema.optional(Schema.NullOr(Schema.String)),
454
590
  // lossyComplex: Schema.optional(Schema.NullOr(Schema.Struct({ value: Schema.Number }))),
455
- // }).annotations({ title: 'lossy_test' })
591
+ // }).annotate({ title: 'lossy_test' })
456
592
 
457
593
  // const table = State.SQLite.table({ schema })
458
594
 
@@ -476,7 +612,7 @@ describe('getColumnDefForSchema', () => {
476
612
  describe('annotations', () => {
477
613
  describe('withColumnType', () => {
478
614
  it('should respect column type annotation for text', () => {
479
- const schema = Schema.Number.pipe(withColumnType('text'))
615
+ const schema = Schema.Finite.pipe(withColumnType('text'))
480
616
  const columnDef = State.SQLite.getColumnDefForSchema(schema)
481
617
  expect(columnDef.columnType).toBe('text')
482
618
  })
@@ -501,7 +637,7 @@ describe('getColumnDefForSchema', () => {
501
637
 
502
638
  it('should override default type mapping', () => {
503
639
  // Number normally maps to real, but we override to text
504
- const schema = Schema.Number.pipe(withColumnType('text'))
640
+ const schema = Schema.Finite.pipe(withColumnType('text'))
505
641
  const columnDef = State.SQLite.getColumnDefForSchema(schema)
506
642
  expect(columnDef.columnType).toBe('text')
507
643
  })
@@ -540,7 +676,7 @@ describe('getColumnDefForSchema', () => {
540
676
  it('should throw when primary key is used with optional schema', () => {
541
677
  // Note: Schema.optional returns a property signature, not a schema, so we can't pipe it
542
678
  // Instead, we use Schema.Union to create an optional schema that can be piped
543
- const optionalString = Schema.Union(Schema.String, Schema.Undefined)
679
+ const optionalString = Schema.Union([Schema.String, Schema.Undefined])
544
680
  const UserSchema = Schema.Struct({
545
681
  id: optionalString.pipe(withPrimaryKey),
546
682
  name: Schema.String,
@@ -570,7 +706,7 @@ describe('getColumnDefForSchema', () => {
570
706
 
571
707
  it('should work with column type annotation', () => {
572
708
  const UserSchema = Schema.Struct({
573
- id: Schema.Number.pipe(withColumnType('integer'), withPrimaryKey),
709
+ id: Schema.Finite.pipe(withColumnType('integer'), withPrimaryKey),
574
710
  name: Schema.String,
575
711
  })
576
712