@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 { TestSchema } from 'effect/testing';
1
2
  import { assert, describe, expect, it } from 'vitest';
2
- import { Schema } from '@livestore/utils/effect';
3
- import { objectToString } from '@livestore/utils';
4
- import * as State from "../mod.js";
5
- import { withAutoIncrement, withColumnType, withDefault, withPrimaryKey, withUnique } from "./column-annotations.js";
3
+ import { Schema, SchemaAST, SchemaTransformation, Struct } from '@livestore/utils/effect';
4
+ import * as State from '../mod.js';
5
+ import { withAutoIncrement, withColumnType, withDefault, withPrimaryKey, withUnique } from './column-annotations.js';
6
6
  describe('getColumnDefForSchema', () => {
7
7
  describe('basic types', () => {
8
8
  it('should map Schema.String to text column', () => {
@@ -10,7 +10,7 @@ describe('getColumnDefForSchema', () => {
10
10
  expect(columnDef.columnType).toBe('text');
11
11
  });
12
12
  it('should map Schema.Number to real column', () => {
13
- const columnDef = State.SQLite.getColumnDefForSchema(Schema.Number);
13
+ const columnDef = State.SQLite.getColumnDefForSchema(Schema.Finite);
14
14
  expect(columnDef.columnType).toBe('real');
15
15
  });
16
16
  it('should map Schema.Boolean to integer column', () => {
@@ -20,14 +20,73 @@ describe('getColumnDefForSchema', () => {
20
20
  it('should map Schema.Date to text column', () => {
21
21
  const columnDef = State.SQLite.getColumnDefForSchema(Schema.Date);
22
22
  expect(columnDef.columnType).toBe('text');
23
- expect(Schema.encodedSchema(columnDef.schema).toString()).toBe('string');
24
- expect(Schema.typeSchema(columnDef.schema).toString()).toBe('Date');
25
- });
26
- it('should map Schema.DateFromNumber to integer column', () => {
27
- const columnDef = State.SQLite.getColumnDefForSchema(Schema.DateFromNumber);
23
+ const date = new Date('2026-01-02T03:04:05.678Z');
24
+ expect(Schema.encodeUnknownSync(columnDef.schema)(date)).toBe(date.toISOString());
25
+ expect(Schema.decodeSync(columnDef.schema)(date.toISOString())).toEqual(date);
26
+ expect(Schema.toEncoded(columnDef.schema).ast._tag).toBe('String');
27
+ expect(SchemaAST.resolveAt('representation')(Schema.toType(columnDef.schema).ast)?.id).toBe('effect/schema/Date');
28
+ });
29
+ it('should map Schema.DateFromMillis to integer column', () => {
30
+ const columnDef = State.SQLite.getColumnDefForSchema(Schema.DateFromMillis);
28
31
  expect(columnDef.columnType).toBe('integer');
29
- expect(Schema.encodedSchema(columnDef.schema).toString()).toBe('number');
30
- expect(Schema.typeSchema(columnDef.schema).toString()).toBe('DateFromSelf');
32
+ expect(Schema.toEncoded(columnDef.schema).ast._tag).toBe('Number');
33
+ expect(SchemaAST.resolveAt('representation')(Schema.toType(columnDef.schema).ast)?.id).toBe('effect/schema/Date');
34
+ });
35
+ it('should preserve the Date representation through checks', () => {
36
+ const schema = Schema.DateFromMillis.check(Schema.isGreaterThanDate(new Date(0)));
37
+ expect(State.SQLite.getColumnDefForSchema(schema).columnType).toBe('integer');
38
+ });
39
+ it('should preserve bare Date checks on encoding and decoding', () => {
40
+ const schema = Schema.Date.check(Schema.isGreaterThanDate(new Date(0)));
41
+ const columnDef = State.SQLite.getColumnDefForSchema(schema);
42
+ const date = new Date('2026-01-02T03:04:05.678Z');
43
+ expect(Schema.encodeUnknownSync(columnDef.schema)(date)).toBe(date.toISOString());
44
+ expect(Schema.decodeSync(columnDef.schema)(date.toISOString())).toEqual(date);
45
+ expect(() => Schema.encodeUnknownSync(columnDef.schema)(new Date(0))).toThrow();
46
+ expect(() => Schema.decodeSync(columnDef.schema)(new Date(0).toISOString())).toThrow();
47
+ });
48
+ it('should round-trip transformations with an encoded Date', () => {
49
+ const schema = Schema.Date.pipe(Schema.decodeTo(Schema.String, SchemaTransformation.transform({
50
+ decode: (date) => date.toISOString(),
51
+ encode: (value) => new Date(value),
52
+ })));
53
+ const columnDef = State.SQLite.getColumnDefForSchema(schema);
54
+ const value = '2026-01-02T03:04:05.678Z';
55
+ expect(columnDef.columnType).toBe('text');
56
+ expect(Schema.encodeUnknownSync(columnDef.schema)(value)).toBe(value);
57
+ expect(Schema.decodeSync(columnDef.schema)(value)).toBe(value);
58
+ });
59
+ it.each(['nullable', 'optional'])('should round-trip %s transformations with an encoded Date', (wrapper) => {
60
+ const schema = Schema.Date.pipe(Schema.decodeTo(Schema.String, SchemaTransformation.transform({
61
+ decode: (date) => date.toISOString(),
62
+ encode: (value) => new Date(value),
63
+ })));
64
+ const field = wrapper === 'nullable' ? Schema.NullOr(schema) : Schema.optional(schema);
65
+ const { columns } = State.SQLite.table({ name: 'stamps', schema: Schema.Struct({ value: field }) }).sqliteDef;
66
+ const columnDef = columns.value;
67
+ const value = '2026-01-02T03:04:05.678Z';
68
+ expect(columnDef.nullable).toBe(true);
69
+ expect(columnDef.columnType).toBe('text');
70
+ const encoded = Schema.encodeUnknownSync(columnDef.schema)(value);
71
+ expect(Schema.decodeSync(columnDef.schema)(encoded)).toBe(value);
72
+ expect(encoded).toBe(value);
73
+ expect(Schema.encodeUnknownSync(columnDef.schema)(null)).toBeNull();
74
+ expect(Schema.decodeSync(columnDef.schema)(null)).toBeNull();
75
+ });
76
+ it('should round-trip transformations with an encoded nullable Date', () => {
77
+ const schema = Schema.NullOr(Schema.Date).pipe(Schema.decodeTo(Schema.String, SchemaTransformation.transform({
78
+ decode: (date) => (date === null ? 'none' : date.toISOString()),
79
+ encode: (value) => (value === 'none' ? null : new Date(value)),
80
+ })));
81
+ const { columns } = State.SQLite.table({ name: 'stamps', schema: Schema.Struct({ value: schema }) }).sqliteDef;
82
+ const columnDef = columns.value;
83
+ const value = '2026-01-02T03:04:05.678Z';
84
+ const encoded = Schema.encodeUnknownSync(columnDef.schema)(value);
85
+ expect(Schema.decodeSync(columnDef.schema)(encoded)).toBe(value);
86
+ expect(encoded).toBe(value);
87
+ expect(columnDef.nullable).toBe(true);
88
+ expect(Schema.encodeUnknownSync(columnDef.schema)('none')).toBeNull();
89
+ expect(Schema.decodeSync(columnDef.schema)(null)).toBe('none');
31
90
  });
32
91
  it('should map Schema.BigInt to text column', () => {
33
92
  const columnDef = State.SQLite.getColumnDefForSchema(Schema.BigInt);
@@ -38,16 +97,18 @@ describe('getColumnDefForSchema', () => {
38
97
  it('should map Schema.Int to integer column', () => {
39
98
  const columnDef = State.SQLite.getColumnDefForSchema(Schema.Int);
40
99
  expect(columnDef.columnType).toBe('integer');
100
+ const positiveInt = State.SQLite.getColumnDefForSchema(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)));
101
+ expect(positiveInt.columnType).toBe('integer');
41
102
  });
42
103
  it('should map string refinements to text column', () => {
43
104
  const refinements = [
44
105
  { schema: Schema.NonEmptyString, name: 'NonEmptyString' },
45
106
  { schema: Schema.Trim, name: 'Trim' },
46
- { schema: Schema.UUID, name: 'UUID' },
47
- { schema: Schema.ULID, name: 'ULID' },
48
- { schema: Schema.String.pipe(Schema.minLength(5)), name: 'minLength' },
107
+ { schema: Schema.String.check(Schema.isUUID()), name: 'UUID' },
108
+ { schema: Schema.String.check(Schema.isULID()), name: 'ULID' },
109
+ { schema: Schema.String.check(Schema.isMinLength(5)), name: 'minLength' },
49
110
  {
50
- schema: Schema.String.pipe(Schema.pattern(/^[A-Z]+$/)),
111
+ schema: Schema.String.check(Schema.isPattern(/^[A-Z]+$/)),
51
112
  name: 'pattern',
52
113
  },
53
114
  ];
@@ -59,8 +120,7 @@ describe('getColumnDefForSchema', () => {
59
120
  it('should map number refinements to real column', () => {
60
121
  const refinements = [
61
122
  { schema: Schema.Finite, name: 'Finite' },
62
- { schema: Schema.Number.pipe(Schema.positive()), name: 'positive' },
63
- { schema: Schema.Number.pipe(Schema.between(0, 100)), name: 'between' },
123
+ { schema: Schema.Finite.check(Schema.isBetween({ minimum: 0, maximum: 100 })), name: 'between' },
64
124
  ];
65
125
  for (const { schema, name } of refinements) {
66
126
  const columnDef = State.SQLite.getColumnDefForSchema(schema);
@@ -84,10 +144,7 @@ describe('getColumnDefForSchema', () => {
84
144
  });
85
145
  describe('transformations', () => {
86
146
  it('should map transformations based on target type', () => {
87
- const StringToNumber = Schema.String.pipe(Schema.transform(Schema.Number, {
88
- decode: Number.parseFloat,
89
- encode: String,
90
- }));
147
+ const StringToNumber = Schema.FiniteFromString;
91
148
  const columnDef = State.SQLite.getColumnDefForSchema(StringToNumber);
92
149
  expect(columnDef.columnType).toBe('text'); // Based on the encoded type (String)
93
150
  });
@@ -100,7 +157,7 @@ describe('getColumnDefForSchema', () => {
100
157
  it('should map structs to json column', () => {
101
158
  const UserSchema = Schema.Struct({
102
159
  name: Schema.String,
103
- age: Schema.Number,
160
+ age: Schema.Finite,
104
161
  });
105
162
  const columnDef = State.SQLite.getColumnDefForSchema(UserSchema);
106
163
  expect(columnDef.columnType).toBe('text');
@@ -110,17 +167,20 @@ describe('getColumnDefForSchema', () => {
110
167
  expect(columnDef.columnType).toBe('text');
111
168
  });
112
169
  it('should map records to json column', () => {
113
- const columnDef = State.SQLite.getColumnDefForSchema(Schema.Record({ key: Schema.String, value: Schema.Number }));
170
+ const columnDef = State.SQLite.getColumnDefForSchema(Schema.Record(Schema.String, Schema.Finite));
114
171
  expect(columnDef.columnType).toBe('text');
115
172
  });
116
173
  it('should map tuples to json column', () => {
117
- const columnDef = State.SQLite.getColumnDefForSchema(Schema.Tuple(Schema.String, Schema.Number));
174
+ const columnDef = State.SQLite.getColumnDefForSchema(Schema.Tuple([Schema.String, Schema.Finite]));
118
175
  expect(columnDef.columnType).toBe('text');
119
176
  });
120
177
  it('should map tagged unions to json column', () => {
121
- const ResultSchema = Schema.Union(Schema.TaggedStruct('success', {
122
- value: Schema.String,
123
- }), Schema.TaggedStruct('error', { error: Schema.String }));
178
+ const ResultSchema = Schema.Union([
179
+ Schema.TaggedStruct('success', {
180
+ value: Schema.String,
181
+ }),
182
+ Schema.TaggedStruct('error', { error: Schema.String }),
183
+ ]);
124
184
  const columnDef = State.SQLite.getColumnDefForSchema(ResultSchema);
125
185
  expect(columnDef.columnType).toBe('text');
126
186
  });
@@ -138,7 +198,7 @@ describe('getColumnDefForSchema', () => {
138
198
  expect(columnDef.columnType).toBe('text');
139
199
  });
140
200
  it('should handle optional nested schemas', () => {
141
- const columnDef = State.SQLite.getColumnDefForSchema(Schema.Union(Schema.Struct({ name: Schema.String }), Schema.Undefined));
201
+ const columnDef = State.SQLite.getColumnDefForSchema(Schema.Union([Schema.Struct({ name: Schema.String }), Schema.Undefined]));
142
202
  expect(columnDef.columnType).toBe('text');
143
203
  });
144
204
  });
@@ -159,7 +219,7 @@ describe('getColumnDefForSchema', () => {
159
219
  });
160
220
  it('should handle never schema', () => {
161
221
  // Create a schema that should never validate
162
- const neverSchema = Schema.String.pipe(Schema.filter(() => false, { message: () => 'Always fails' }));
222
+ const neverSchema = Schema.String.check(Schema.makeFilter(() => false, { message: 'Always fails' }));
163
223
  const columnDef = State.SQLite.getColumnDefForSchema(neverSchema);
164
224
  expect(columnDef.columnType).toBe('text');
165
225
  });
@@ -188,7 +248,7 @@ describe('getColumnDefForSchema', () => {
188
248
  name: Schema.String,
189
249
  email: Schema.String,
190
250
  });
191
- const PickedSchema = UserSchema.pipe(Schema.pick('id', 'name'));
251
+ const PickedSchema = UserSchema.mapFields(Struct.pick(['id', 'name']));
192
252
  const columnDef = State.SQLite.getColumnDefForSchema(PickedSchema);
193
253
  expect(columnDef.columnType).toBe('text');
194
254
  });
@@ -198,48 +258,58 @@ describe('getColumnDefForSchema', () => {
198
258
  name: Schema.String,
199
259
  password: Schema.String,
200
260
  });
201
- const PublicUserSchema = UserSchema.pipe(Schema.omit('password'));
261
+ const PublicUserSchema = UserSchema.mapFields(Struct.omit(['password']));
202
262
  const columnDef = State.SQLite.getColumnDefForSchema(PublicUserSchema);
203
263
  expect(columnDef.columnType).toBe('text');
204
264
  });
205
265
  });
206
266
  describe('annotations', () => {
207
267
  it('should handle schemas with custom annotations', () => {
208
- const AnnotatedString = Schema.String.annotations({
268
+ const AnnotatedString = Schema.String.annotate({
209
269
  description: 'A special string',
210
270
  });
211
- const AnnotatedNumber = Schema.Number.annotations({ min: 0, max: 100 });
271
+ const AnnotatedNumber = Schema.Finite.annotate({ min: 0, max: 100 });
212
272
  expect(State.SQLite.getColumnDefForSchema(AnnotatedString).columnType).toBe('text');
213
273
  expect(State.SQLite.getColumnDefForSchema(AnnotatedNumber).columnType).toBe('real');
214
274
  });
215
275
  });
216
276
  describe('enums and literal unions', () => {
217
277
  it('should handle enums and literal unions as text', () => {
218
- const StatusEnum = Schema.Enums({
278
+ const StatusEnum = Schema.Enum({
219
279
  PENDING: 'pending',
220
280
  ACTIVE: 'active',
221
281
  INACTIVE: 'inactive',
222
282
  });
223
- const StatusUnion = Schema.Literal('pending', 'active', 'inactive');
283
+ const StatusUnion = Schema.Literals(['pending', 'active', 'inactive']);
224
284
  expect(State.SQLite.getColumnDefForSchema(StatusEnum).columnType).toBe('text');
225
285
  expect(State.SQLite.getColumnDefForSchema(StatusUnion).columnType).toBe('text');
226
286
  });
227
287
  it('should handle unions of numeric literals as integer column', () => {
228
- const IntervalSchema = Schema.Literal(1, 5, 15, 30);
288
+ const IntervalSchema = Schema.Literals([1, 5, 15, 30]);
229
289
  const columnDef = State.SQLite.getColumnDefForSchema(IntervalSchema);
230
290
  expect(columnDef.columnType).toBe('integer');
231
291
  });
232
292
  it('should handle unions of non-integer numeric literals as real column', () => {
233
- const PercentSchema = Schema.Literal(0.1, 0.2, 0.25);
293
+ const PercentSchema = Schema.Literals([0.1, 0.2, 0.25]);
234
294
  const columnDef = State.SQLite.getColumnDefForSchema(PercentSchema);
235
295
  expect(columnDef.columnType).toBe('real');
236
296
  });
237
297
  });
238
298
  describe('binary data', () => {
239
- it('should handle Uint8Array as blob column', () => {
299
+ it('should handle Uint8Array as blob column', async () => {
240
300
  const columnDef = State.SQLite.getColumnDefForSchema(Schema.Uint8Array);
241
301
  expect(columnDef.columnType).toBe('blob');
242
- expect(objectToString(columnDef.schema)).toBe('Uint8ArrayFromSelf');
302
+ expect(SchemaAST.resolveAt('representation')(Schema.toType(columnDef.schema).ast)?.id).toBe('effect/schema/Uint8Array');
303
+ const asserts = new TestSchema.Asserts(columnDef.schema);
304
+ await asserts.decoding().succeed(new Uint8Array([1, 2, 3]));
305
+ });
306
+ it('should preserve Uint8Array checks on blob columns', () => {
307
+ const schema = Schema.Uint8Array.check(Schema.makeFilter((value) => value.byteLength > 0));
308
+ const columnDef = State.SQLite.getColumnDefForSchema(schema);
309
+ expect(columnDef.columnType).toBe('blob');
310
+ expect(columnDef.schema).toBe(schema);
311
+ expect(Schema.decodeSync(columnDef.schema)(new Uint8Array([1]))).toEqual(new Uint8Array([1]));
312
+ expect(() => Schema.decodeSync(columnDef.schema)(new Uint8Array())).toThrow();
243
313
  });
244
314
  });
245
315
  describe('recursive schemas', () => {
@@ -253,12 +323,12 @@ describe('getColumnDefForSchema', () => {
253
323
  });
254
324
  });
255
325
  describe('schema-based table definitions', () => {
256
- it('should handle optional fields in schema', () => {
326
+ it('should handle optional fields in schema', async () => {
257
327
  const UserSchema = Schema.Struct({
258
328
  id: Schema.String,
259
329
  name: Schema.String,
260
330
  email: Schema.optional(Schema.String),
261
- age: Schema.optional(Schema.Number),
331
+ age: Schema.optional(Schema.Finite),
262
332
  });
263
333
  const userTable = State.SQLite.table({
264
334
  name: 'users',
@@ -270,11 +340,15 @@ describe('getColumnDefForSchema', () => {
270
340
  // Non-optional fields should not be nullable
271
341
  expect(userTable.sqliteDef.columns.id.nullable).toBe(false);
272
342
  expect(userTable.sqliteDef.columns.name.nullable).toBe(false);
273
- // Row schema should show | null for optional fields
274
- expect(userTable.rowSchema.fields.email.toString()).toBe('string | null');
275
- expect(userTable.rowSchema.fields.age.toString()).toBe('number | null');
343
+ const asserts = new TestSchema.Asserts(userTable.rowSchema);
344
+ await asserts.decoding().succeed({
345
+ id: 'user-1',
346
+ name: 'Ada',
347
+ email: null,
348
+ age: null,
349
+ });
276
350
  });
277
- it('should handle optional boolean with proper transformation', () => {
351
+ it('should handle optional boolean with proper transformation', async () => {
278
352
  const schema = Schema.Struct({
279
353
  id: Schema.String,
280
354
  active: Schema.optional(Schema.Boolean),
@@ -282,10 +356,12 @@ describe('getColumnDefForSchema', () => {
282
356
  const table = State.SQLite.table({ name: 'test', schema });
283
357
  expect(table.sqliteDef.columns.active.nullable).toBe(true);
284
358
  expect(table.sqliteDef.columns.active.columnType).toBe('integer');
285
- expect(objectToString(table.sqliteDef.columns.active.schema)).toBe('(number <-> boolean) | null');
286
- expect(String(table.rowSchema.fields.active)).toBe('(number <-> boolean) | null');
359
+ const asserts = new TestSchema.Asserts(table.rowSchema);
360
+ await asserts.decoding().succeed({ id: 'row-1', active: 1 }, { id: 'row-1', active: true });
361
+ expect(Schema.encodeSync(table.sqliteDef.columns.active.schema)(false)).toBe(0);
362
+ await asserts.decoding().succeed({ id: 'row-1', active: null });
287
363
  });
288
- it('should handle optional complex types with JSON encoding', () => {
364
+ it('should handle optional complex types with JSON encoding', async () => {
289
365
  const schema = Schema.Struct({
290
366
  id: Schema.String,
291
367
  metadata: Schema.optional(Schema.Struct({ color: Schema.String })),
@@ -294,12 +370,21 @@ describe('getColumnDefForSchema', () => {
294
370
  const table = State.SQLite.table({ name: 'test', schema });
295
371
  expect(table.sqliteDef.columns.metadata.nullable).toBe(true);
296
372
  expect(table.sqliteDef.columns.metadata.columnType).toBe('text');
297
- expect(table.rowSchema.fields.metadata.toString()).toBe('(parseJson <-> { readonly color: string }) | null');
298
373
  expect(table.sqliteDef.columns.tags.nullable).toBe(true);
299
374
  expect(table.sqliteDef.columns.tags.columnType).toBe('text');
300
- expect(table.rowSchema.fields.tags.toString()).toBe('(parseJson <-> ReadonlyArray<string>) | null');
301
- });
302
- it('should handle Schema.NullOr', () => {
375
+ const asserts = new TestSchema.Asserts(table.rowSchema);
376
+ await asserts.decoding().succeed({
377
+ id: 'row-1',
378
+ metadata: JSON.stringify({ color: 'red' }),
379
+ tags: JSON.stringify(['urgent', 'local']),
380
+ }, {
381
+ id: 'row-1',
382
+ metadata: { color: 'red' },
383
+ tags: ['urgent', 'local'],
384
+ });
385
+ await asserts.decoding().succeed({ id: 'row-1', metadata: null, tags: null });
386
+ });
387
+ it('should handle Schema.NullOr', async () => {
303
388
  const schema = Schema.Struct({
304
389
  id: Schema.String,
305
390
  description: Schema.NullOr(Schema.String),
@@ -308,43 +393,59 @@ describe('getColumnDefForSchema', () => {
308
393
  const table = State.SQLite.table({ name: 'test', schema });
309
394
  expect(table.sqliteDef.columns.description.nullable).toBe(true);
310
395
  expect(table.sqliteDef.columns.count.nullable).toBe(true);
311
- expect(table.rowSchema.fields.description.toString()).toBe('string | null');
312
- expect(table.rowSchema.fields.count.toString()).toBe('Int | null');
396
+ const asserts = new TestSchema.Asserts(table.rowSchema);
397
+ await asserts.decoding().succeed({
398
+ id: 'row-1',
399
+ description: 'ready',
400
+ count: 1,
401
+ });
402
+ await asserts.decoding().succeed({
403
+ id: 'row-1',
404
+ description: null,
405
+ count: null,
406
+ });
313
407
  });
314
- it('should treat unions of string literals as text columns without JSON parsing', () => {
408
+ it('should treat unions of string literals as text columns without JSON parsing', async () => {
315
409
  const schema = Schema.Struct({
316
410
  id: Schema.String,
317
- status: Schema.Literal('idle', 'running', 'stopped'),
411
+ status: Schema.Literals(['idle', 'running', 'stopped']),
318
412
  });
319
413
  const table = State.SQLite.table({ name: 'timers', schema });
320
414
  expect(table.sqliteDef.columns.status.columnType).toBe('text');
321
- expect(objectToString(table.sqliteDef.columns.status.schema)).toBe('"idle" | "running" | "stopped"');
322
- expect(String(table.rowSchema.fields.status)).toBe('"idle" | "running" | "stopped"');
415
+ expect(Schema.toEncoded(table.sqliteDef.columns.status.schema).ast._tag).toBe('Union');
416
+ const asserts = new TestSchema.Asserts(table.rowSchema);
417
+ await asserts.decoding().succeed({ id: 'timer-1', status: 'idle' });
323
418
  });
324
- it('should handle Schema.NullOr with complex types', () => {
419
+ it('should handle Schema.NullOr with complex types', async () => {
325
420
  const schema = Schema.Struct({
326
- data: Schema.NullOr(Schema.Struct({ value: Schema.Number })),
327
- }).annotations({ title: 'test' });
421
+ data: Schema.NullOr(Schema.Struct({ value: Schema.Finite })),
422
+ }).annotate({ title: 'test' });
328
423
  const table = State.SQLite.table({ schema });
329
424
  expect(table.sqliteDef.columns.data.nullable).toBe(true);
330
425
  expect(table.sqliteDef.columns.data.columnType).toBe('text');
331
- expect(table.rowSchema.fields.data.toString()).toBe('(parseJson <-> { readonly value: number }) | null');
426
+ const asserts = new TestSchema.Asserts(table.rowSchema);
427
+ await asserts.decoding().succeed({ data: JSON.stringify({ value: 42 }) }, { data: { value: 42 } });
428
+ await asserts.decoding().succeed({ data: null });
332
429
  });
333
- it('should handle mixed nullable and optional fields', () => {
430
+ it('should handle mixed nullable and optional fields', async () => {
334
431
  const schema = Schema.Struct({
335
432
  nullableText: Schema.NullOr(Schema.String),
336
433
  optionalText: Schema.optional(Schema.String),
337
- optionalJson: Schema.optional(Schema.Struct({ x: Schema.Number })),
338
- }).annotations({ title: 'test' });
434
+ optionalJson: Schema.optional(Schema.Struct({ x: Schema.Finite })),
435
+ }).annotate({ title: 'test' });
339
436
  const table = State.SQLite.table({ schema });
340
437
  // Both should be nullable at column level
341
438
  expect(table.sqliteDef.columns.nullableText.nullable).toBe(true);
342
439
  expect(table.sqliteDef.columns.optionalText.nullable).toBe(true);
343
440
  expect(table.sqliteDef.columns.optionalJson.nullable).toBe(true);
344
- // Schema representations
345
- expect(table.rowSchema.fields.nullableText.toString()).toBe('string | null');
346
- expect(table.rowSchema.fields.optionalText.toString()).toBe('string | null');
347
- expect(table.rowSchema.fields.optionalJson.toString()).toBe('(parseJson <-> { readonly x: number }) | null');
441
+ const nullableTextAsserts = new TestSchema.Asserts(table.sqliteDef.columns.nullableText.schema);
442
+ const optionalTextAsserts = new TestSchema.Asserts(table.sqliteDef.columns.optionalText.schema);
443
+ const optionalJsonAsserts = new TestSchema.Asserts(table.sqliteDef.columns.optionalJson.schema);
444
+ await nullableTextAsserts.decoding().succeed('hello');
445
+ await nullableTextAsserts.decoding().succeed(null);
446
+ await optionalTextAsserts.decoding().succeed(null);
447
+ await optionalJsonAsserts.decoding().succeed(JSON.stringify({ x: 1 }), { x: 1 });
448
+ await optionalJsonAsserts.decoding().succeed(null);
348
449
  });
349
450
  // TODO bring back some time later
350
451
  // it('should handle lossy Schema.optional(Schema.NullOr(...)) with JSON encoding', () => {
@@ -352,7 +453,7 @@ describe('getColumnDefForSchema', () => {
352
453
  // id: Schema.String,
353
454
  // lossyText: Schema.optional(Schema.NullOr(Schema.String)),
354
455
  // lossyComplex: Schema.optional(Schema.NullOr(Schema.Struct({ value: Schema.Number }))),
355
- // }).annotations({ title: 'lossy_test' })
456
+ // }).annotate({ title: 'lossy_test' })
356
457
  // const table = State.SQLite.table({ schema })
357
458
  // // Check column definitions for lossy fields
358
459
  // expect(table.sqliteDef.columns.lossyText.nullable).toBe(true)
@@ -371,7 +472,7 @@ describe('getColumnDefForSchema', () => {
371
472
  describe('annotations', () => {
372
473
  describe('withColumnType', () => {
373
474
  it('should respect column type annotation for text', () => {
374
- const schema = Schema.Number.pipe(withColumnType('text'));
475
+ const schema = Schema.Finite.pipe(withColumnType('text'));
375
476
  const columnDef = State.SQLite.getColumnDefForSchema(schema);
376
477
  expect(columnDef.columnType).toBe('text');
377
478
  });
@@ -392,7 +493,7 @@ describe('getColumnDefForSchema', () => {
392
493
  });
393
494
  it('should override default type mapping', () => {
394
495
  // Number normally maps to real, but we override to text
395
- const schema = Schema.Number.pipe(withColumnType('text'));
496
+ const schema = Schema.Finite.pipe(withColumnType('text'));
396
497
  const columnDef = State.SQLite.getColumnDefForSchema(schema);
397
498
  expect(columnDef.columnType).toBe('text');
398
499
  });
@@ -424,7 +525,7 @@ describe('getColumnDefForSchema', () => {
424
525
  it('should throw when primary key is used with optional schema', () => {
425
526
  // Note: Schema.optional returns a property signature, not a schema, so we can't pipe it
426
527
  // Instead, we use Schema.Union to create an optional schema that can be piped
427
- const optionalString = Schema.Union(Schema.String, Schema.Undefined);
528
+ const optionalString = Schema.Union([Schema.String, Schema.Undefined]);
428
529
  const UserSchema = Schema.Struct({
429
530
  id: optionalString.pipe(withPrimaryKey),
430
531
  name: Schema.String,
@@ -446,7 +547,7 @@ describe('getColumnDefForSchema', () => {
446
547
  });
447
548
  it('should work with column type annotation', () => {
448
549
  const UserSchema = Schema.Struct({
449
- id: Schema.Number.pipe(withColumnType('integer'), withPrimaryKey),
550
+ id: Schema.Finite.pipe(withColumnType('integer'), withPrimaryKey),
450
551
  name: Schema.String,
451
552
  });
452
553
  const userTable = State.SQLite.table({