@livestore/common 0.4.0-dev.9 → 0.5.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (580) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +27 -12
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
  4. package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
  5. package/dist/MaterializationJournal.d.ts +44 -0
  6. package/dist/MaterializationJournal.d.ts.map +1 -0
  7. package/dist/MaterializationJournal.js +112 -0
  8. package/dist/MaterializationJournal.js.map +1 -0
  9. package/dist/StateHead.d.ts +26 -0
  10. package/dist/StateHead.d.ts.map +1 -0
  11. package/dist/StateHead.js +50 -0
  12. package/dist/StateHead.js.map +1 -0
  13. package/dist/WorkerTransportError.d.ts +11 -0
  14. package/dist/WorkerTransportError.d.ts.map +1 -0
  15. package/dist/WorkerTransportError.js +11 -0
  16. package/dist/WorkerTransportError.js.map +1 -0
  17. package/dist/__tests__/fixture.d.ts +1 -1
  18. package/dist/__tests__/fixture.d.ts.map +1 -1
  19. package/dist/__tests__/fixture.js +3 -3
  20. package/dist/__tests__/fixture.js.map +1 -1
  21. package/dist/adapter-types.d.ts +59 -57
  22. package/dist/adapter-types.d.ts.map +1 -1
  23. package/dist/adapter-types.js +31 -22
  24. package/dist/adapter-types.js.map +1 -1
  25. package/dist/bounded-collections.d.ts.map +1 -1
  26. package/dist/bounded-collections.js +6 -4
  27. package/dist/bounded-collections.js.map +1 -1
  28. package/dist/debug-info.d.ts +56 -56
  29. package/dist/debug-info.d.ts.map +1 -1
  30. package/dist/debug-info.js +46 -32
  31. package/dist/debug-info.js.map +1 -1
  32. package/dist/defs.d.ts +9 -9
  33. package/dist/defs.js +2 -2
  34. package/dist/devtools/devtools-compatibility.test.d.ts +2 -0
  35. package/dist/devtools/devtools-compatibility.test.d.ts.map +1 -0
  36. package/dist/devtools/devtools-compatibility.test.js +16 -0
  37. package/dist/devtools/devtools-compatibility.test.js.map +1 -0
  38. package/dist/devtools/devtools-messages-client-session.d.ts +531 -312
  39. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  40. package/dist/devtools/devtools-messages-client-session.js +86 -67
  41. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  42. package/dist/devtools/devtools-messages-common.d.ts +32 -35
  43. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  44. package/dist/devtools/devtools-messages-common.js +12 -14
  45. package/dist/devtools/devtools-messages-common.js.map +1 -1
  46. package/dist/devtools/devtools-messages-leader.d.ts +417 -320
  47. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  48. package/dist/devtools/devtools-messages-leader.js +117 -87
  49. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  50. package/dist/devtools/devtools-sessioninfo.d.ts +28 -17
  51. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  52. package/dist/devtools/devtools-sessioninfo.js +12 -6
  53. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  54. package/dist/devtools/mod.d.ts +17 -7
  55. package/dist/devtools/mod.d.ts.map +1 -1
  56. package/dist/devtools/mod.js +19 -8
  57. package/dist/devtools/mod.js.map +1 -1
  58. package/dist/errors.d.ts +52 -46
  59. package/dist/errors.d.ts.map +1 -1
  60. package/dist/errors.js +31 -21
  61. package/dist/errors.js.map +1 -1
  62. package/dist/index.d.ts +7 -1
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +7 -1
  65. package/dist/index.js.map +1 -1
  66. package/dist/leader-thread/LeaderSyncProcessor.d.ts +116 -21
  67. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  68. package/dist/leader-thread/LeaderSyncProcessor.js +596 -470
  69. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  70. package/dist/leader-thread/RejectedPushError.d.ts +138 -0
  71. package/dist/leader-thread/RejectedPushError.d.ts.map +1 -0
  72. package/dist/leader-thread/RejectedPushError.js +97 -0
  73. package/dist/leader-thread/RejectedPushError.js.map +1 -0
  74. package/dist/leader-thread/connection.d.ts +1 -0
  75. package/dist/leader-thread/connection.d.ts.map +1 -1
  76. package/dist/leader-thread/connection.js +10 -9
  77. package/dist/leader-thread/connection.js.map +1 -1
  78. package/dist/leader-thread/eventlog.d.ts +20 -15
  79. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  80. package/dist/leader-thread/eventlog.js +80 -20
  81. package/dist/leader-thread/eventlog.js.map +1 -1
  82. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -2
  83. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  84. package/dist/leader-thread/leader-worker-devtools.js +110 -62
  85. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  86. package/dist/leader-thread/make-leader-thread-layer.d.ts +19 -7
  87. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  88. package/dist/leader-thread/make-leader-thread-layer.js +67 -45
  89. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  90. package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
  91. package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
  92. package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
  93. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
  94. package/dist/leader-thread/materialize-event.d.ts +3 -2
  95. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  96. package/dist/leader-thread/materialize-event.js +32 -9
  97. package/dist/leader-thread/materialize-event.js.map +1 -1
  98. package/dist/leader-thread/mod.d.ts +1 -0
  99. package/dist/leader-thread/mod.d.ts.map +1 -1
  100. package/dist/leader-thread/mod.js +1 -0
  101. package/dist/leader-thread/mod.js.map +1 -1
  102. package/dist/leader-thread/recreate-db.d.ts +2 -2
  103. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  104. package/dist/leader-thread/recreate-db.js +19 -40
  105. package/dist/leader-thread/recreate-db.js.map +1 -1
  106. package/dist/leader-thread/shutdown-channel.d.ts +3 -7
  107. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  108. package/dist/leader-thread/shutdown-channel.js +2 -3
  109. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  110. package/dist/leader-thread/stream-events.d.ts +53 -0
  111. package/dist/leader-thread/stream-events.d.ts.map +1 -0
  112. package/dist/leader-thread/stream-events.js +164 -0
  113. package/dist/leader-thread/stream-events.js.map +1 -0
  114. package/dist/leader-thread/types.d.ts +92 -51
  115. package/dist/leader-thread/types.d.ts.map +1 -1
  116. package/dist/leader-thread/types.js +17 -4
  117. package/dist/leader-thread/types.js.map +1 -1
  118. package/dist/logging.d.ts +15 -0
  119. package/dist/logging.d.ts.map +1 -0
  120. package/dist/logging.js +2 -0
  121. package/dist/logging.js.map +1 -0
  122. package/dist/make-client-session.d.ts +6 -5
  123. package/dist/make-client-session.d.ts.map +1 -1
  124. package/dist/make-client-session.js +10 -7
  125. package/dist/make-client-session.js.map +1 -1
  126. package/dist/materializer-helper.d.ts +6 -7
  127. package/dist/materializer-helper.d.ts.map +1 -1
  128. package/dist/materializer-helper.js +22 -40
  129. package/dist/materializer-helper.js.map +1 -1
  130. package/dist/otel.d.ts +4 -4
  131. package/dist/otel.d.ts.map +1 -1
  132. package/dist/otel.js +8 -8
  133. package/dist/otel.js.map +1 -1
  134. package/dist/rematerialize-from-eventlog.d.ts +3 -3
  135. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  136. package/dist/rematerialize-from-eventlog.js +52 -39
  137. package/dist/rematerialize-from-eventlog.js.map +1 -1
  138. package/dist/schema/EventDef/define.d.ts +161 -0
  139. package/dist/schema/EventDef/define.d.ts.map +1 -0
  140. package/dist/schema/EventDef/define.js +140 -0
  141. package/dist/schema/EventDef/define.js.map +1 -0
  142. package/dist/schema/EventDef/define.test.d.ts +2 -0
  143. package/dist/schema/EventDef/define.test.d.ts.map +1 -0
  144. package/dist/schema/EventDef/define.test.js +23 -0
  145. package/dist/schema/EventDef/define.test.js.map +1 -0
  146. package/dist/schema/EventDef/deprecated.d.ts +94 -0
  147. package/dist/schema/EventDef/deprecated.d.ts.map +1 -0
  148. package/dist/schema/EventDef/deprecated.js +143 -0
  149. package/dist/schema/EventDef/deprecated.js.map +1 -0
  150. package/dist/schema/EventDef/deprecated.test.d.ts +2 -0
  151. package/dist/schema/EventDef/deprecated.test.d.ts.map +1 -0
  152. package/dist/schema/EventDef/deprecated.test.js +95 -0
  153. package/dist/schema/EventDef/deprecated.test.js.map +1 -0
  154. package/dist/schema/EventDef/event-def.d.ts +110 -0
  155. package/dist/schema/EventDef/event-def.d.ts.map +1 -0
  156. package/dist/schema/EventDef/event-def.js +2 -0
  157. package/dist/schema/EventDef/event-def.js.map +1 -0
  158. package/dist/schema/EventDef/facts.d.ts +118 -0
  159. package/dist/schema/EventDef/facts.d.ts.map +1 -0
  160. package/dist/schema/EventDef/facts.js +53 -0
  161. package/dist/schema/EventDef/facts.js.map +1 -0
  162. package/dist/schema/EventDef/materializer.d.ts +155 -0
  163. package/dist/schema/EventDef/materializer.d.ts.map +1 -0
  164. package/dist/schema/EventDef/materializer.js +83 -0
  165. package/dist/schema/EventDef/materializer.js.map +1 -0
  166. package/dist/schema/EventDef/mod.d.ts +6 -0
  167. package/dist/schema/EventDef/mod.d.ts.map +1 -0
  168. package/dist/schema/EventDef/mod.js +6 -0
  169. package/dist/schema/EventDef/mod.js.map +1 -0
  170. package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
  171. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
  172. package/dist/schema/EventSequenceNumber/client.js +192 -0
  173. package/dist/schema/EventSequenceNumber/client.js.map +1 -0
  174. package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
  175. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
  176. package/dist/schema/EventSequenceNumber/global.js +14 -0
  177. package/dist/schema/EventSequenceNumber/global.js.map +1 -0
  178. package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
  179. package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
  180. package/dist/schema/EventSequenceNumber/mod.js +37 -0
  181. package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
  182. package/dist/schema/EventSequenceNumber.test.js +44 -44
  183. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  184. package/dist/schema/LiveStoreEvent/client.d.ts +168 -0
  185. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
  186. package/dist/schema/LiveStoreEvent/client.js +179 -0
  187. package/dist/schema/LiveStoreEvent/client.js.map +1 -0
  188. package/dist/schema/LiveStoreEvent/client.test.d.ts +2 -0
  189. package/dist/schema/LiveStoreEvent/client.test.d.ts.map +1 -0
  190. package/dist/schema/LiveStoreEvent/client.test.js +120 -0
  191. package/dist/schema/LiveStoreEvent/client.test.js.map +1 -0
  192. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
  193. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
  194. package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
  195. package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
  196. package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
  197. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
  198. package/dist/schema/LiveStoreEvent/global.js +31 -0
  199. package/dist/schema/LiveStoreEvent/global.js.map +1 -0
  200. package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
  201. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
  202. package/dist/schema/LiveStoreEvent/input.js +26 -0
  203. package/dist/schema/LiveStoreEvent/input.js.map +1 -0
  204. package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
  205. package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
  206. package/dist/schema/LiveStoreEvent/mod.js +5 -0
  207. package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
  208. package/dist/schema/events.d.ts +1 -1
  209. package/dist/schema/events.d.ts.map +1 -1
  210. package/dist/schema/events.js +1 -1
  211. package/dist/schema/events.js.map +1 -1
  212. package/dist/schema/mod.d.ts +7 -4
  213. package/dist/schema/mod.d.ts.map +1 -1
  214. package/dist/schema/mod.js +6 -4
  215. package/dist/schema/mod.js.map +1 -1
  216. package/dist/schema/schema.d.ts +16 -1
  217. package/dist/schema/schema.d.ts.map +1 -1
  218. package/dist/schema/schema.js +34 -5
  219. package/dist/schema/schema.js.map +1 -1
  220. package/dist/schema/state/sqlite/client-document-def.d.ts +14 -18
  221. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  222. package/dist/schema/state/sqlite/client-document-def.js +54 -30
  223. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  224. package/dist/schema/state/sqlite/client-document-def.test.js +146 -6
  225. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  226. package/dist/schema/state/sqlite/column-annotations.d.ts +13 -13
  227. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  228. package/dist/schema/state/sqlite/column-annotations.js +13 -15
  229. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  230. package/dist/schema/state/sqlite/column-annotations.test.js +19 -43
  231. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  232. package/dist/schema/state/sqlite/column-def.d.ts +1 -1
  233. package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
  234. package/dist/schema/state/sqlite/column-def.js +132 -57
  235. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  236. package/dist/schema/state/sqlite/column-def.test.js +155 -70
  237. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  238. package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
  239. package/dist/schema/state/sqlite/column-spec.js +30 -12
  240. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  241. package/dist/schema/state/sqlite/column-spec.test.js +26 -17
  242. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  243. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -2
  244. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
  245. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +15 -6
  246. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  247. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +25 -19
  248. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  249. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +22 -16
  250. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  251. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +28 -17
  252. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
  253. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +14 -12
  254. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  255. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +6 -4
  256. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  257. package/dist/schema/state/sqlite/mod.d.ts +3 -5
  258. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  259. package/dist/schema/state/sqlite/mod.js +6 -8
  260. package/dist/schema/state/sqlite/mod.js.map +1 -1
  261. package/dist/schema/state/sqlite/persistence.d.ts +11 -0
  262. package/dist/schema/state/sqlite/persistence.d.ts.map +1 -0
  263. package/dist/schema/state/sqlite/persistence.js +10 -0
  264. package/dist/schema/state/sqlite/persistence.js.map +1 -0
  265. package/dist/schema/state/sqlite/query-builder/api.d.ts +58 -29
  266. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  267. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  268. package/dist/schema/state/sqlite/query-builder/astToSql.js +105 -24
  269. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  270. package/dist/schema/state/sqlite/query-builder/impl.d.ts +4 -2
  271. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  272. package/dist/schema/state/sqlite/query-builder/impl.js +42 -27
  273. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  274. package/dist/schema/state/sqlite/query-builder/impl.test.js +402 -498
  275. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  276. package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
  277. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
  278. package/dist/schema/state/sqlite/schema-helpers.js +24 -14
  279. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  280. package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
  281. package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
  282. package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
  283. package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
  284. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts +515 -0
  285. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
  286. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
  287. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
  288. package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
  289. package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
  290. package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
  291. package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
  292. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +678 -0
  293. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
  294. package/dist/schema/state/sqlite/system-tables/state-tables.js +87 -0
  295. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
  296. package/dist/schema/state/sqlite/table-def.d.ts +19 -20
  297. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  298. package/dist/schema/state/sqlite/table-def.js +54 -4
  299. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  300. package/dist/schema/state/sqlite/table-def.test.js +226 -20
  301. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  302. package/dist/schema/unknown-events.d.ts +47 -0
  303. package/dist/schema/unknown-events.d.ts.map +1 -0
  304. package/dist/schema/unknown-events.js +70 -0
  305. package/dist/schema/unknown-events.js.map +1 -0
  306. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
  307. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
  308. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
  309. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
  310. package/dist/schema-management/common.js +2 -2
  311. package/dist/schema-management/common.js.map +1 -1
  312. package/dist/schema-management/migrations.d.ts +32 -2
  313. package/dist/schema-management/migrations.d.ts.map +1 -1
  314. package/dist/schema-management/migrations.js +38 -6
  315. package/dist/schema-management/migrations.js.map +1 -1
  316. package/dist/schema-management/validate-schema.d.ts +3 -3
  317. package/dist/schema-management/validate-schema.d.ts.map +1 -1
  318. package/dist/schema-management/validate-schema.js +2 -2
  319. package/dist/schema-management/validate-schema.js.map +1 -1
  320. package/dist/session-id-symbol.d.ts +29 -0
  321. package/dist/session-id-symbol.d.ts.map +1 -0
  322. package/dist/session-id-symbol.js +44 -0
  323. package/dist/session-id-symbol.js.map +1 -0
  324. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  325. package/dist/sql-queries/sql-queries.js +26 -16
  326. package/dist/sql-queries/sql-queries.js.map +1 -1
  327. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  328. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  329. package/dist/sql-queries/types.d.ts +6 -7
  330. package/dist/sql-queries/types.d.ts.map +1 -1
  331. package/dist/sql-queries/types.js.map +1 -1
  332. package/dist/sqlite-db-helper.d.ts +21 -1
  333. package/dist/sqlite-db-helper.d.ts.map +1 -1
  334. package/dist/sqlite-db-helper.js +40 -5
  335. package/dist/sqlite-db-helper.js.map +1 -1
  336. package/dist/sqlite-types.d.ts +8 -11
  337. package/dist/sqlite-types.d.ts.map +1 -1
  338. package/dist/sqlite-types.js +3 -3
  339. package/dist/sqlite-types.js.map +1 -1
  340. package/dist/sync/ClientSessionSyncProcessor.d.ts +47 -25
  341. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  342. package/dist/sync/ClientSessionSyncProcessor.js +269 -154
  343. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  344. package/dist/sync/errors.d.ts +12 -51
  345. package/dist/sync/errors.d.ts.map +1 -1
  346. package/dist/sync/errors.js +7 -24
  347. package/dist/sync/errors.js.map +1 -1
  348. package/dist/sync/index.d.ts +2 -0
  349. package/dist/sync/index.d.ts.map +1 -1
  350. package/dist/sync/index.js +2 -0
  351. package/dist/sync/index.js.map +1 -1
  352. package/dist/sync/mock-sync-backend.d.ts +11 -10
  353. package/dist/sync/mock-sync-backend.d.ts.map +1 -1
  354. package/dist/sync/mock-sync-backend.js +97 -74
  355. package/dist/sync/mock-sync-backend.js.map +1 -1
  356. package/dist/sync/mock-sync-backend.test.d.ts +2 -0
  357. package/dist/sync/mock-sync-backend.test.d.ts.map +1 -0
  358. package/dist/sync/mock-sync-backend.test.js +49 -0
  359. package/dist/sync/mock-sync-backend.test.js.map +1 -0
  360. package/dist/sync/next/compact-events.d.ts.map +1 -1
  361. package/dist/sync/next/compact-events.js +11 -12
  362. package/dist/sync/next/compact-events.js.map +1 -1
  363. package/dist/sync/next/facts.d.ts +5 -5
  364. package/dist/sync/next/facts.d.ts.map +1 -1
  365. package/dist/sync/next/facts.js +7 -8
  366. package/dist/sync/next/facts.js.map +1 -1
  367. package/dist/sync/next/history-dag-common.d.ts +58 -15
  368. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  369. package/dist/sync/next/history-dag-common.js +219 -9
  370. package/dist/sync/next/history-dag-common.js.map +1 -1
  371. package/dist/sync/next/history-dag.d.ts.map +1 -1
  372. package/dist/sync/next/history-dag.js +12 -11
  373. package/dist/sync/next/history-dag.js.map +1 -1
  374. package/dist/sync/next/rebase-events.d.ts +5 -5
  375. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  376. package/dist/sync/next/rebase-events.js +6 -6
  377. package/dist/sync/next/rebase-events.js.map +1 -1
  378. package/dist/sync/next/test/compact-events.calculator.test.js +4 -4
  379. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  380. package/dist/sync/next/test/compact-events.test.d.ts.map +1 -1
  381. package/dist/sync/next/test/compact-events.test.js +2 -2
  382. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  383. package/dist/sync/next/test/event-fixtures.d.ts +9 -9
  384. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  385. package/dist/sync/next/test/event-fixtures.js +12 -12
  386. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  387. package/dist/sync/next/test/history-dag-common.test.d.ts +2 -0
  388. package/dist/sync/next/test/history-dag-common.test.d.ts.map +1 -0
  389. package/dist/sync/next/test/history-dag-common.test.js +73 -0
  390. package/dist/sync/next/test/history-dag-common.test.js.map +1 -0
  391. package/dist/sync/sync-backend-kv.d.ts +3 -3
  392. package/dist/sync/sync-backend-kv.d.ts.map +1 -1
  393. package/dist/sync/sync-backend-kv.js +6 -4
  394. package/dist/sync/sync-backend-kv.js.map +1 -1
  395. package/dist/sync/sync-backend.d.ts +41 -21
  396. package/dist/sync/sync-backend.d.ts.map +1 -1
  397. package/dist/sync/sync-backend.js +45 -4
  398. package/dist/sync/sync-backend.js.map +1 -1
  399. package/dist/sync/sync.d.ts +23 -2
  400. package/dist/sync/sync.d.ts.map +1 -1
  401. package/dist/sync/syncstate.d.ts +115 -191
  402. package/dist/sync/syncstate.d.ts.map +1 -1
  403. package/dist/sync/syncstate.js +108 -129
  404. package/dist/sync/syncstate.js.map +1 -1
  405. package/dist/sync/syncstate.test.js +289 -161
  406. package/dist/sync/syncstate.test.js.map +1 -1
  407. package/dist/sync/transport-chunking.d.ts +35 -0
  408. package/dist/sync/transport-chunking.d.ts.map +1 -0
  409. package/dist/sync/transport-chunking.js +47 -0
  410. package/dist/sync/transport-chunking.js.map +1 -0
  411. package/dist/sync/validate-push-payload.d.ts +2 -2
  412. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  413. package/dist/sync/validate-push-payload.js +4 -6
  414. package/dist/sync/validate-push-payload.js.map +1 -1
  415. package/dist/testing/event-factory.d.ts +3 -3
  416. package/dist/testing/event-factory.d.ts.map +1 -1
  417. package/dist/testing/event-factory.js +5 -7
  418. package/dist/testing/event-factory.js.map +1 -1
  419. package/dist/util.d.ts +11 -4
  420. package/dist/util.d.ts.map +1 -1
  421. package/dist/util.js +21 -4
  422. package/dist/util.js.map +1 -1
  423. package/dist/version.d.ts +24 -5
  424. package/dist/version.d.ts.map +1 -1
  425. package/dist/version.js +25 -8
  426. package/dist/version.js.map +1 -1
  427. package/package.json +50 -16
  428. package/src/ClientSessionLeaderThreadProxy.ts +27 -12
  429. package/src/MaterializationJournal.ts +184 -0
  430. package/src/StateHead.ts +80 -0
  431. package/src/WorkerTransportError.ts +12 -0
  432. package/src/__tests__/fixture.ts +3 -3
  433. package/src/adapter-types.ts +62 -56
  434. package/src/bounded-collections.ts +6 -5
  435. package/src/debug-info.ts +54 -43
  436. package/src/defs.ts +2 -2
  437. package/src/devtools/devtools-compatibility.test.ts +19 -0
  438. package/src/devtools/devtools-messages-client-session.ts +72 -63
  439. package/src/devtools/devtools-messages-common.ts +18 -22
  440. package/src/devtools/devtools-messages-leader.ts +89 -68
  441. package/src/devtools/devtools-sessioninfo.ts +17 -12
  442. package/src/devtools/mod.ts +15 -7
  443. package/src/errors.ts +58 -38
  444. package/src/index.ts +11 -1
  445. package/src/leader-thread/LeaderSyncProcessor.ts +927 -674
  446. package/src/leader-thread/RejectedPushError.ts +119 -0
  447. package/src/leader-thread/connection.ts +13 -9
  448. package/src/leader-thread/eventlog.ts +114 -41
  449. package/src/leader-thread/leader-worker-devtools.ts +223 -124
  450. package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
  451. package/src/leader-thread/make-leader-thread-layer.ts +170 -82
  452. package/src/leader-thread/materialize-event.ts +51 -16
  453. package/src/leader-thread/mod.ts +1 -0
  454. package/src/leader-thread/recreate-db.ts +26 -61
  455. package/src/leader-thread/shutdown-channel.ts +3 -18
  456. package/src/leader-thread/stream-events.ts +209 -0
  457. package/src/leader-thread/types.ts +77 -65
  458. package/src/logging.ts +15 -0
  459. package/src/make-client-session.ts +16 -10
  460. package/src/materializer-helper.ts +31 -49
  461. package/src/otel.ts +15 -13
  462. package/src/rematerialize-from-eventlog.ts +106 -93
  463. package/src/schema/EventDef/define.test.ts +28 -0
  464. package/src/schema/EventDef/define.ts +218 -0
  465. package/src/schema/EventDef/deprecated.test.ts +122 -0
  466. package/src/schema/EventDef/deprecated.ts +172 -0
  467. package/src/schema/EventDef/event-def.ts +123 -0
  468. package/src/schema/EventDef/facts.ts +135 -0
  469. package/src/schema/EventDef/materializer.ts +172 -0
  470. package/src/schema/EventDef/mod.ts +5 -0
  471. package/src/schema/EventSequenceNumber/client.ts +256 -0
  472. package/src/schema/EventSequenceNumber/global.ts +19 -0
  473. package/src/schema/EventSequenceNumber/mod.ts +37 -0
  474. package/src/schema/EventSequenceNumber.test.ts +72 -53
  475. package/src/schema/LiveStoreEvent/client.test.ts +142 -0
  476. package/src/schema/LiveStoreEvent/client.ts +236 -0
  477. package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
  478. package/src/schema/LiveStoreEvent/global.ts +45 -0
  479. package/src/schema/LiveStoreEvent/input.ts +63 -0
  480. package/src/schema/LiveStoreEvent/mod.ts +4 -0
  481. package/src/schema/events.ts +1 -1
  482. package/src/schema/mod.ts +7 -4
  483. package/src/schema/schema.ts +48 -6
  484. package/src/schema/state/sqlite/client-document-def.test.ts +172 -14
  485. package/src/schema/state/sqlite/client-document-def.ts +126 -98
  486. package/src/schema/state/sqlite/column-annotations.test.ts +27 -45
  487. package/src/schema/state/sqlite/column-annotations.ts +27 -30
  488. package/src/schema/state/sqlite/column-def.test.ts +186 -77
  489. package/src/schema/state/sqlite/column-def.ts +169 -62
  490. package/src/schema/state/sqlite/column-spec.test.ts +34 -19
  491. package/src/schema/state/sqlite/column-spec.ts +38 -11
  492. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +17 -7
  493. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +123 -63
  494. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +37 -17
  495. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +65 -45
  496. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +48 -40
  497. package/src/schema/state/sqlite/mod.ts +9 -12
  498. package/src/schema/state/sqlite/persistence.ts +11 -0
  499. package/src/schema/state/sqlite/query-builder/api.ts +61 -23
  500. package/src/schema/state/sqlite/query-builder/astToSql.ts +117 -23
  501. package/src/schema/state/sqlite/query-builder/impl.test.ts +489 -551
  502. package/src/schema/state/sqlite/query-builder/impl.ts +43 -26
  503. package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
  504. package/src/schema/state/sqlite/schema-helpers.ts +30 -22
  505. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
  506. package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
  507. package/src/schema/state/sqlite/system-tables/state-tables.ts +109 -0
  508. package/src/schema/state/sqlite/table-def.test.ts +295 -46
  509. package/src/schema/state/sqlite/table-def.ts +109 -64
  510. package/src/schema/unknown-events.ts +132 -0
  511. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +88 -0
  512. package/src/schema-management/common.ts +2 -2
  513. package/src/schema-management/migrations.ts +42 -9
  514. package/src/schema-management/validate-schema.ts +3 -3
  515. package/src/session-id-symbol.ts +59 -0
  516. package/src/sql-queries/sql-queries.ts +26 -18
  517. package/src/sql-queries/sql-query-builder.ts +1 -0
  518. package/src/sql-queries/types.ts +6 -7
  519. package/src/sqlite-db-helper.ts +67 -5
  520. package/src/sqlite-types.ts +9 -11
  521. package/src/sync/ClientSessionSyncProcessor.ts +388 -194
  522. package/src/sync/errors.ts +18 -28
  523. package/src/sync/index.ts +2 -0
  524. package/src/sync/mock-sync-backend.test.ts +78 -0
  525. package/src/sync/mock-sync-backend.ts +196 -108
  526. package/src/sync/next/compact-events.ts +10 -11
  527. package/src/sync/next/facts.ts +13 -14
  528. package/src/sync/next/history-dag-common.ts +306 -26
  529. package/src/sync/next/history-dag.ts +20 -13
  530. package/src/sync/next/rebase-events.ts +12 -12
  531. package/src/sync/next/test/compact-events.calculator.test.ts +5 -4
  532. package/src/sync/next/test/compact-events.test.ts +4 -3
  533. package/src/sync/next/test/event-fixtures.ts +14 -14
  534. package/src/sync/next/test/history-dag-common.test.ts +87 -0
  535. package/src/sync/sync-backend-kv.ts +7 -4
  536. package/src/sync/sync-backend.ts +75 -26
  537. package/src/sync/sync.ts +24 -2
  538. package/src/sync/syncstate.test.ts +657 -442
  539. package/src/sync/syncstate.ts +175 -160
  540. package/src/sync/transport-chunking.ts +85 -0
  541. package/src/sync/validate-push-payload.ts +6 -8
  542. package/src/testing/event-factory.ts +10 -12
  543. package/src/util.ts +20 -11
  544. package/src/version.ts +32 -8
  545. package/dist/schema/EventDef.d.ts +0 -126
  546. package/dist/schema/EventDef.d.ts.map +0 -1
  547. package/dist/schema/EventDef.js +0 -46
  548. package/dist/schema/EventDef.js.map +0 -1
  549. package/dist/schema/EventSequenceNumber.d.ts +0 -80
  550. package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
  551. package/dist/schema/EventSequenceNumber.js +0 -139
  552. package/dist/schema/EventSequenceNumber.js.map +0 -1
  553. package/dist/schema/LiveStoreEvent.d.ts +0 -306
  554. package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
  555. package/dist/schema/LiveStoreEvent.js +0 -147
  556. package/dist/schema/LiveStoreEvent.js.map +0 -1
  557. package/dist/schema/state/sqlite/system-tables.d.ts +0 -976
  558. package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
  559. package/dist/schema/state/sqlite/system-tables.js +0 -81
  560. package/dist/schema/state/sqlite/system-tables.js.map +0 -1
  561. package/dist/sql-queries/misc.d.ts +0 -2
  562. package/dist/sql-queries/misc.d.ts.map +0 -1
  563. package/dist/sql-queries/misc.js +0 -2
  564. package/dist/sql-queries/misc.js.map +0 -1
  565. package/dist/sync/next/graphology.d.ts +0 -8
  566. package/dist/sync/next/graphology.d.ts.map +0 -1
  567. package/dist/sync/next/graphology.js +0 -30
  568. package/dist/sync/next/graphology.js.map +0 -1
  569. package/dist/sync/next/graphology_.d.ts +0 -3
  570. package/dist/sync/next/graphology_.d.ts.map +0 -1
  571. package/dist/sync/next/graphology_.js +0 -3
  572. package/dist/sync/next/graphology_.js.map +0 -1
  573. package/src/schema/EventDef.ts +0 -222
  574. package/src/schema/EventSequenceNumber.ts +0 -199
  575. package/src/schema/LiveStoreEvent.ts +0 -286
  576. package/src/schema/state/sqlite/system-tables.ts +0 -106
  577. package/src/sql-queries/misc.ts +0 -2
  578. package/src/sync/next/ambient.d.ts +0 -3
  579. package/src/sync/next/graphology.ts +0 -41
  580. package/src/sync/next/graphology_.ts +0 -2
@@ -1,5 +1,7 @@
1
- import { Schema } from '@livestore/utils/effect'
2
- import { describe, expect, it } from 'vitest'
1
+ import { TestSchema } from 'effect/testing'
2
+ import { assert, describe, expect, it } from 'vitest'
3
+
4
+ import { Schema, SchemaAST, Struct } from '@livestore/utils/effect'
3
5
 
4
6
  import * as State from '../mod.ts'
5
7
  import { withAutoIncrement, withColumnType, withDefault, withPrimaryKey, withUnique } from './column-annotations.ts'
@@ -12,7 +14,7 @@ describe('getColumnDefForSchema', () => {
12
14
  })
13
15
 
14
16
  it('should map Schema.Number to real column', () => {
15
- const columnDef = State.SQLite.getColumnDefForSchema(Schema.Number)
17
+ const columnDef = State.SQLite.getColumnDefForSchema(Schema.Finite)
16
18
  expect(columnDef.columnType).toBe('real')
17
19
  })
18
20
 
@@ -24,15 +26,25 @@ describe('getColumnDefForSchema', () => {
24
26
  it('should map Schema.Date to text column', () => {
25
27
  const columnDef = State.SQLite.getColumnDefForSchema(Schema.Date)
26
28
  expect(columnDef.columnType).toBe('text')
27
- expect(Schema.encodedSchema(columnDef.schema).toString()).toBe('string')
28
- expect(Schema.typeSchema(columnDef.schema).toString()).toBe('Date')
29
+ expect(Schema.toEncoded(columnDef.schema).ast._tag).toBe('String')
30
+ expect(
31
+ SchemaAST.resolveAt<{ readonly id: string }>('representation')(Schema.toType(columnDef.schema).ast)?.id,
32
+ ).toBe('effect/schema/Date')
29
33
  })
30
34
 
31
- it('should map Schema.DateFromNumber to integer column', () => {
32
- const columnDef = State.SQLite.getColumnDefForSchema(Schema.DateFromNumber)
35
+ it('should map Schema.DateFromMillis to integer column', () => {
36
+ const columnDef = State.SQLite.getColumnDefForSchema(Schema.DateFromMillis)
33
37
  expect(columnDef.columnType).toBe('integer')
34
- expect(Schema.encodedSchema(columnDef.schema).toString()).toBe('number')
35
- expect(Schema.typeSchema(columnDef.schema).toString()).toBe('DateFromSelf')
38
+ expect(Schema.toEncoded(columnDef.schema).ast._tag).toBe('Number')
39
+ expect(
40
+ SchemaAST.resolveAt<{ readonly id: string }>('representation')(Schema.toType(columnDef.schema).ast)?.id,
41
+ ).toBe('effect/schema/Date')
42
+ })
43
+
44
+ it('should preserve the Date representation through checks', () => {
45
+ const schema = Schema.DateFromMillis.check(Schema.isGreaterThanDate(new Date(0)))
46
+
47
+ expect(State.SQLite.getColumnDefForSchema(schema).columnType).toBe('integer')
36
48
  })
37
49
 
38
50
  it('should map Schema.BigInt to text column', () => {
@@ -45,17 +57,20 @@ describe('getColumnDefForSchema', () => {
45
57
  it('should map Schema.Int to integer column', () => {
46
58
  const columnDef = State.SQLite.getColumnDefForSchema(Schema.Int)
47
59
  expect(columnDef.columnType).toBe('integer')
60
+
61
+ const positiveInt = State.SQLite.getColumnDefForSchema(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)))
62
+ expect(positiveInt.columnType).toBe('integer')
48
63
  })
49
64
 
50
65
  it('should map string refinements to text column', () => {
51
66
  const refinements = [
52
67
  { schema: Schema.NonEmptyString, name: 'NonEmptyString' },
53
68
  { schema: Schema.Trim, name: 'Trim' },
54
- { schema: Schema.UUID, name: 'UUID' },
55
- { schema: Schema.ULID, name: 'ULID' },
56
- { schema: Schema.String.pipe(Schema.minLength(5)), name: 'minLength' },
69
+ { schema: Schema.String.check(Schema.isUUID()), name: 'UUID' },
70
+ { schema: Schema.String.check(Schema.isULID()), name: 'ULID' },
71
+ { schema: Schema.String.check(Schema.isMinLength(5)), name: 'minLength' },
57
72
  {
58
- schema: Schema.String.pipe(Schema.pattern(/^[A-Z]+$/)),
73
+ schema: Schema.String.check(Schema.isPattern(/^[A-Z]+$/)),
59
74
  name: 'pattern',
60
75
  },
61
76
  ]
@@ -69,8 +84,7 @@ describe('getColumnDefForSchema', () => {
69
84
  it('should map number refinements to real column', () => {
70
85
  const refinements = [
71
86
  { schema: Schema.Finite, name: 'Finite' },
72
- { schema: Schema.Number.pipe(Schema.positive()), name: 'positive' },
73
- { schema: Schema.Number.pipe(Schema.between(0, 100)), name: 'between' },
87
+ { schema: Schema.Finite.check(Schema.isBetween({ minimum: 0, maximum: 100 })), name: 'between' },
74
88
  ]
75
89
 
76
90
  for (const { schema, name } of refinements) {
@@ -99,12 +113,7 @@ describe('getColumnDefForSchema', () => {
99
113
 
100
114
  describe('transformations', () => {
101
115
  it('should map transformations based on target type', () => {
102
- const StringToNumber = Schema.String.pipe(
103
- Schema.transform(Schema.Number, {
104
- decode: Number.parseFloat,
105
- encode: String,
106
- }),
107
- )
116
+ const StringToNumber = Schema.FiniteFromString
108
117
 
109
118
  const columnDef = State.SQLite.getColumnDefForSchema(StringToNumber)
110
119
  expect(columnDef.columnType).toBe('text') // Based on the encoded type (String)
@@ -120,7 +129,7 @@ describe('getColumnDefForSchema', () => {
120
129
  it('should map structs to json column', () => {
121
130
  const UserSchema = Schema.Struct({
122
131
  name: Schema.String,
123
- age: Schema.Number,
132
+ age: Schema.Finite,
124
133
  })
125
134
 
126
135
  const columnDef = State.SQLite.getColumnDefForSchema(UserSchema)
@@ -133,23 +142,22 @@ describe('getColumnDefForSchema', () => {
133
142
  })
134
143
 
135
144
  it('should map records to json column', () => {
136
- const columnDef = State.SQLite.getColumnDefForSchema(Schema.Record({ key: Schema.String, value: Schema.Number }))
145
+ const columnDef = State.SQLite.getColumnDefForSchema(Schema.Record(Schema.String, Schema.Finite))
137
146
  expect(columnDef.columnType).toBe('text')
138
147
  })
139
148
 
140
149
  it('should map tuples to json column', () => {
141
- const columnDef = State.SQLite.getColumnDefForSchema(Schema.Tuple(Schema.String, Schema.Number))
150
+ const columnDef = State.SQLite.getColumnDefForSchema(Schema.Tuple([Schema.String, Schema.Finite]))
142
151
  expect(columnDef.columnType).toBe('text')
143
152
  })
144
153
 
145
154
  it('should map tagged unions to json column', () => {
146
- const ResultSchema = Schema.Union(
147
- Schema.Struct({
148
- _tag: Schema.Literal('success'),
155
+ const ResultSchema = Schema.Union([
156
+ Schema.TaggedStruct('success', {
149
157
  value: Schema.String,
150
158
  }),
151
- Schema.Struct({ _tag: Schema.Literal('error'), error: Schema.String }),
152
- )
159
+ Schema.TaggedStruct('error', { error: Schema.String }),
160
+ ])
153
161
 
154
162
  const columnDef = State.SQLite.getColumnDefForSchema(ResultSchema)
155
163
  expect(columnDef.columnType).toBe('text')
@@ -172,7 +180,7 @@ describe('getColumnDefForSchema', () => {
172
180
 
173
181
  it('should handle optional nested schemas', () => {
174
182
  const columnDef = State.SQLite.getColumnDefForSchema(
175
- Schema.Union(Schema.Struct({ name: Schema.String }), Schema.Undefined),
183
+ Schema.Union([Schema.Struct({ name: Schema.String }), Schema.Undefined]),
176
184
  )
177
185
  expect(columnDef.columnType).toBe('text')
178
186
  })
@@ -197,7 +205,7 @@ describe('getColumnDefForSchema', () => {
197
205
 
198
206
  it('should handle never schema', () => {
199
207
  // Create a schema that should never validate
200
- const neverSchema = Schema.String.pipe(Schema.filter(() => false, { message: () => 'Always fails' }))
208
+ const neverSchema = Schema.String.check(Schema.makeFilter(() => false, { message: 'Always fails' }))
201
209
 
202
210
  const columnDef = State.SQLite.getColumnDefForSchema(neverSchema)
203
211
  expect(columnDef.columnType).toBe('text')
@@ -233,7 +241,7 @@ describe('getColumnDefForSchema', () => {
233
241
  email: Schema.String,
234
242
  })
235
243
 
236
- const PickedSchema = UserSchema.pipe(Schema.pick('id', 'name'))
244
+ const PickedSchema = UserSchema.mapFields(Struct.pick(['id', 'name']))
237
245
 
238
246
  const columnDef = State.SQLite.getColumnDefForSchema(PickedSchema)
239
247
  expect(columnDef.columnType).toBe('text')
@@ -246,7 +254,7 @@ describe('getColumnDefForSchema', () => {
246
254
  password: Schema.String,
247
255
  })
248
256
 
249
- const PublicUserSchema = UserSchema.pipe(Schema.omit('password'))
257
+ const PublicUserSchema = UserSchema.mapFields(Struct.omit(['password']))
250
258
 
251
259
  const columnDef = State.SQLite.getColumnDefForSchema(PublicUserSchema)
252
260
  expect(columnDef.columnType).toBe('text')
@@ -255,10 +263,10 @@ describe('getColumnDefForSchema', () => {
255
263
 
256
264
  describe('annotations', () => {
257
265
  it('should handle schemas with custom annotations', () => {
258
- const AnnotatedString = Schema.String.annotations({
266
+ const AnnotatedString = Schema.String.annotate({
259
267
  description: 'A special string',
260
268
  })
261
- const AnnotatedNumber = Schema.Number.annotations({ min: 0, max: 100 })
269
+ const AnnotatedNumber = Schema.Finite.annotate({ min: 0, max: 100 })
262
270
 
263
271
  expect(State.SQLite.getColumnDefForSchema(AnnotatedString).columnType).toBe('text')
264
272
  expect(State.SQLite.getColumnDefForSchema(AnnotatedNumber).columnType).toBe('real')
@@ -267,23 +275,55 @@ describe('getColumnDefForSchema', () => {
267
275
 
268
276
  describe('enums and literal unions', () => {
269
277
  it('should handle enums and literal unions as text', () => {
270
- const StatusEnum = Schema.Enums({
278
+ const StatusEnum = Schema.Enum({
271
279
  PENDING: 'pending',
272
280
  ACTIVE: 'active',
273
281
  INACTIVE: 'inactive',
274
282
  })
275
283
 
276
- const StatusUnion = Schema.Union(Schema.Literal('pending'), Schema.Literal('active'), Schema.Literal('inactive'))
284
+ const StatusUnion = Schema.Literals(['pending', 'active', 'inactive'])
277
285
 
278
286
  expect(State.SQLite.getColumnDefForSchema(StatusEnum).columnType).toBe('text')
279
287
  expect(State.SQLite.getColumnDefForSchema(StatusUnion).columnType).toBe('text')
280
288
  })
289
+
290
+ it('should handle unions of numeric literals as integer column', () => {
291
+ const IntervalSchema = Schema.Literals([1, 5, 15, 30])
292
+
293
+ const columnDef = State.SQLite.getColumnDefForSchema(IntervalSchema)
294
+
295
+ expect(columnDef.columnType).toBe('integer')
296
+ })
297
+
298
+ it('should handle unions of non-integer numeric literals as real column', () => {
299
+ const PercentSchema = Schema.Literals([0.1, 0.2, 0.25])
300
+
301
+ const columnDef = State.SQLite.getColumnDefForSchema(PercentSchema)
302
+
303
+ expect(columnDef.columnType).toBe('real')
304
+ })
281
305
  })
282
306
 
283
307
  describe('binary data', () => {
284
- it('should handle Uint8Array as blob column', () => {
308
+ it('should handle Uint8Array as blob column', async () => {
285
309
  const columnDef = State.SQLite.getColumnDefForSchema(Schema.Uint8Array)
286
- expect(columnDef.columnType).toBe('text') // Stored as JSON
310
+ expect(columnDef.columnType).toBe('blob')
311
+ expect(
312
+ SchemaAST.resolveAt<{ readonly id: string }>('representation')(Schema.toType(columnDef.schema).ast)?.id,
313
+ ).toBe('effect/schema/Uint8Array')
314
+
315
+ const asserts = new TestSchema.Asserts(columnDef.schema)
316
+ await asserts.decoding().succeed(new Uint8Array([1, 2, 3]))
317
+ })
318
+
319
+ it('should preserve Uint8Array checks on blob columns', () => {
320
+ const schema = Schema.Uint8Array.check(Schema.makeFilter((value) => value.byteLength > 0))
321
+ const columnDef = State.SQLite.getColumnDefForSchema(schema)
322
+
323
+ expect(columnDef.columnType).toBe('blob')
324
+ expect(columnDef.schema).toBe(schema)
325
+ expect(Schema.decodeUnknownSync(columnDef.schema)(new Uint8Array([1]))).toEqual(new Uint8Array([1]))
326
+ expect(() => Schema.decodeUnknownSync(columnDef.schema)(new Uint8Array())).toThrow()
287
327
  })
288
328
  })
289
329
 
@@ -304,12 +344,12 @@ describe('getColumnDefForSchema', () => {
304
344
  })
305
345
 
306
346
  describe('schema-based table definitions', () => {
307
- it('should handle optional fields in schema', () => {
347
+ it('should handle optional fields in schema', async () => {
308
348
  const UserSchema = Schema.Struct({
309
349
  id: Schema.String,
310
350
  name: Schema.String,
311
351
  email: Schema.optional(Schema.String),
312
- age: Schema.optional(Schema.Number),
352
+ age: Schema.optional(Schema.Finite),
313
353
  })
314
354
 
315
355
  const userTable = State.SQLite.table({
@@ -325,12 +365,16 @@ describe('getColumnDefForSchema', () => {
325
365
  expect(userTable.sqliteDef.columns.id.nullable).toBe(false)
326
366
  expect(userTable.sqliteDef.columns.name.nullable).toBe(false)
327
367
 
328
- // Row schema should show | null for optional fields
329
- expect((userTable.rowSchema as any).fields.email.toString()).toBe('string | null')
330
- expect((userTable.rowSchema as any).fields.age.toString()).toBe('number | null')
368
+ const asserts = new TestSchema.Asserts(userTable.rowSchema)
369
+ await asserts.decoding().succeed({
370
+ id: 'user-1',
371
+ name: 'Ada',
372
+ email: null,
373
+ age: null,
374
+ })
331
375
  })
332
376
 
333
- it('should handle optional boolean with proper transformation', () => {
377
+ it('should handle optional boolean with proper transformation', async () => {
334
378
  const schema = Schema.Struct({
335
379
  id: Schema.String,
336
380
  active: Schema.optional(Schema.Boolean),
@@ -340,11 +384,13 @@ describe('getColumnDefForSchema', () => {
340
384
 
341
385
  expect(table.sqliteDef.columns.active.nullable).toBe(true)
342
386
  expect(table.sqliteDef.columns.active.columnType).toBe('integer')
343
- expect(table.sqliteDef.columns.active.schema.toString()).toBe('(number <-> boolean) | null')
344
- expect((table.rowSchema as any).fields.active.toString()).toBe('(number <-> boolean) | null')
387
+ const asserts = new TestSchema.Asserts(table.rowSchema)
388
+ await asserts.decoding().succeed({ id: 'row-1', active: 1 }, { id: 'row-1', active: true })
389
+ expect(Schema.encodeSync(table.sqliteDef.columns.active.schema)(false)).toBe(0)
390
+ await asserts.decoding().succeed({ id: 'row-1', active: null })
345
391
  })
346
392
 
347
- it('should handle optional complex types with JSON encoding', () => {
393
+ it('should handle optional complex types with JSON encoding', async () => {
348
394
  const schema = Schema.Struct({
349
395
  id: Schema.String,
350
396
  metadata: Schema.optional(Schema.Struct({ color: Schema.String })),
@@ -355,17 +401,27 @@ describe('getColumnDefForSchema', () => {
355
401
 
356
402
  expect(table.sqliteDef.columns.metadata.nullable).toBe(true)
357
403
  expect(table.sqliteDef.columns.metadata.columnType).toBe('text')
358
- expect((table.rowSchema as any).fields.metadata.toString()).toBe(
359
- '(parseJson <-> { readonly color: string }) | null',
360
- // '(parseJson <-> { readonly color: string } | null)', // not sure yet about which semantics we want here
361
- )
362
404
 
363
405
  expect(table.sqliteDef.columns.tags.nullable).toBe(true)
364
406
  expect(table.sqliteDef.columns.tags.columnType).toBe('text')
365
- expect((table.rowSchema as any).fields.tags.toString()).toBe('(parseJson <-> ReadonlyArray<string>) | null')
407
+
408
+ const asserts = new TestSchema.Asserts(table.rowSchema)
409
+ await asserts.decoding().succeed(
410
+ {
411
+ id: 'row-1',
412
+ metadata: JSON.stringify({ color: 'red' }),
413
+ tags: JSON.stringify(['urgent', 'local']),
414
+ },
415
+ {
416
+ id: 'row-1',
417
+ metadata: { color: 'red' },
418
+ tags: ['urgent', 'local'],
419
+ },
420
+ )
421
+ await asserts.decoding().succeed({ id: 'row-1', metadata: null, tags: null })
366
422
  })
367
423
 
368
- it('should handle Schema.NullOr', () => {
424
+ it('should handle Schema.NullOr', async () => {
369
425
  const schema = Schema.Struct({
370
426
  id: Schema.String,
371
427
  description: Schema.NullOr(Schema.String),
@@ -377,28 +433,55 @@ describe('getColumnDefForSchema', () => {
377
433
  expect(table.sqliteDef.columns.description.nullable).toBe(true)
378
434
  expect(table.sqliteDef.columns.count.nullable).toBe(true)
379
435
 
380
- expect((table.rowSchema as any).fields.description.toString()).toBe('string | null')
381
- expect((table.rowSchema as any).fields.count.toString()).toBe('Int | null')
436
+ const asserts = new TestSchema.Asserts(table.rowSchema)
437
+ await asserts.decoding().succeed({
438
+ id: 'row-1',
439
+ description: 'ready',
440
+ count: 1,
441
+ })
442
+ await asserts.decoding().succeed({
443
+ id: 'row-1',
444
+ description: null,
445
+ count: null,
446
+ })
447
+ })
448
+
449
+ it('should treat unions of string literals as text columns without JSON parsing', async () => {
450
+ const schema = Schema.Struct({
451
+ id: Schema.String,
452
+ status: Schema.Literals(['idle', 'running', 'stopped']),
453
+ })
454
+
455
+ const table = State.SQLite.table({ name: 'timers', schema })
456
+
457
+ expect(table.sqliteDef.columns.status.columnType).toBe('text')
458
+ expect(Schema.toEncoded(table.sqliteDef.columns.status.schema).ast._tag).toBe('Union')
459
+
460
+ const asserts = new TestSchema.Asserts(table.rowSchema)
461
+ await asserts.decoding().succeed({ id: 'timer-1', status: 'idle' })
382
462
  })
383
463
 
384
- it('should handle Schema.NullOr with complex types', () => {
464
+ it('should handle Schema.NullOr with complex types', async () => {
385
465
  const schema = Schema.Struct({
386
- data: Schema.NullOr(Schema.Struct({ value: Schema.Number })),
387
- }).annotations({ title: 'test' })
466
+ data: Schema.NullOr(Schema.Struct({ value: Schema.Finite })),
467
+ }).annotate({ title: 'test' })
388
468
 
389
469
  const table = State.SQLite.table({ schema })
390
470
 
391
471
  expect(table.sqliteDef.columns.data.nullable).toBe(true)
392
472
  expect(table.sqliteDef.columns.data.columnType).toBe('text')
393
- expect((table.rowSchema as any).fields.data.toString()).toBe('(parseJson <-> { readonly value: number }) | null')
473
+
474
+ const asserts = new TestSchema.Asserts(table.rowSchema)
475
+ await asserts.decoding().succeed({ data: JSON.stringify({ value: 42 }) }, { data: { value: 42 } })
476
+ await asserts.decoding().succeed({ data: null })
394
477
  })
395
478
 
396
- it('should handle mixed nullable and optional fields', () => {
479
+ it('should handle mixed nullable and optional fields', async () => {
397
480
  const schema = Schema.Struct({
398
481
  nullableText: Schema.NullOr(Schema.String),
399
482
  optionalText: Schema.optional(Schema.String),
400
- optionalJson: Schema.optional(Schema.Struct({ x: Schema.Number })),
401
- }).annotations({ title: 'test' })
483
+ optionalJson: Schema.optional(Schema.Struct({ x: Schema.Finite })),
484
+ }).annotate({ title: 'test' })
402
485
 
403
486
  const table = State.SQLite.table({ schema })
404
487
 
@@ -407,12 +490,15 @@ describe('getColumnDefForSchema', () => {
407
490
  expect(table.sqliteDef.columns.optionalText.nullable).toBe(true)
408
491
  expect(table.sqliteDef.columns.optionalJson.nullable).toBe(true)
409
492
 
410
- // Schema representations
411
- expect((table.rowSchema as any).fields.nullableText.toString()).toBe('string | null')
412
- expect((table.rowSchema as any).fields.optionalText.toString()).toBe('string | null')
413
- expect((table.rowSchema as any).fields.optionalJson.toString()).toBe(
414
- '(parseJson <-> { readonly x: number }) | null',
415
- )
493
+ const nullableTextAsserts = new TestSchema.Asserts(table.sqliteDef.columns.nullableText.schema)
494
+ const optionalTextAsserts = new TestSchema.Asserts(table.sqliteDef.columns.optionalText.schema)
495
+ const optionalJsonAsserts = new TestSchema.Asserts(table.sqliteDef.columns.optionalJson.schema)
496
+
497
+ await nullableTextAsserts.decoding().succeed('hello')
498
+ await nullableTextAsserts.decoding().succeed(null)
499
+ await optionalTextAsserts.decoding().succeed(null)
500
+ await optionalJsonAsserts.decoding().succeed(JSON.stringify({ x: 1 }), { x: 1 })
501
+ await optionalJsonAsserts.decoding().succeed(null)
416
502
  })
417
503
 
418
504
  // TODO bring back some time later
@@ -421,7 +507,7 @@ describe('getColumnDefForSchema', () => {
421
507
  // id: Schema.String,
422
508
  // lossyText: Schema.optional(Schema.NullOr(Schema.String)),
423
509
  // lossyComplex: Schema.optional(Schema.NullOr(Schema.Struct({ value: Schema.Number }))),
424
- // }).annotations({ title: 'lossy_test' })
510
+ // }).annotate({ title: 'lossy_test' })
425
511
 
426
512
  // const table = State.SQLite.table({ schema })
427
513
 
@@ -445,7 +531,7 @@ describe('getColumnDefForSchema', () => {
445
531
  describe('annotations', () => {
446
532
  describe('withColumnType', () => {
447
533
  it('should respect column type annotation for text', () => {
448
- const schema = Schema.Number.pipe(withColumnType('text'))
534
+ const schema = Schema.Finite.pipe(withColumnType('text'))
449
535
  const columnDef = State.SQLite.getColumnDefForSchema(schema)
450
536
  expect(columnDef.columnType).toBe('text')
451
537
  })
@@ -470,7 +556,7 @@ describe('getColumnDefForSchema', () => {
470
556
 
471
557
  it('should override default type mapping', () => {
472
558
  // Number normally maps to real, but we override to text
473
- const schema = Schema.Number.pipe(withColumnType('text'))
559
+ const schema = Schema.Finite.pipe(withColumnType('text'))
474
560
  const columnDef = State.SQLite.getColumnDefForSchema(schema)
475
561
  expect(columnDef.columnType).toBe('text')
476
562
  })
@@ -509,7 +595,7 @@ describe('getColumnDefForSchema', () => {
509
595
  it('should throw when primary key is used with optional schema', () => {
510
596
  // Note: Schema.optional returns a property signature, not a schema, so we can't pipe it
511
597
  // Instead, we use Schema.Union to create an optional schema that can be piped
512
- const optionalString = Schema.Union(Schema.String, Schema.Undefined)
598
+ const optionalString = Schema.Union([Schema.String, Schema.Undefined])
513
599
  const UserSchema = Schema.Struct({
514
600
  id: optionalString.pipe(withPrimaryKey),
515
601
  name: Schema.String,
@@ -539,7 +625,7 @@ describe('getColumnDefForSchema', () => {
539
625
 
540
626
  it('should work with column type annotation', () => {
541
627
  const UserSchema = Schema.Struct({
542
- id: Schema.Number.pipe(withColumnType('integer')).pipe(withPrimaryKey),
628
+ id: Schema.Finite.pipe(withColumnType('integer'), withPrimaryKey),
543
629
  name: Schema.String,
544
630
  })
545
631
 
@@ -571,7 +657,7 @@ describe('getColumnDefForSchema', () => {
571
657
  describe('withAutoIncrement', () => {
572
658
  it('should add autoIncrement annotation to schema', () => {
573
659
  const UserSchema = Schema.Struct({
574
- id: Schema.Int.pipe(withPrimaryKey).pipe(withAutoIncrement),
660
+ id: Schema.Int.pipe(withPrimaryKey, withAutoIncrement),
575
661
  name: Schema.String,
576
662
  })
577
663
  const userTable = State.SQLite.table({
@@ -623,6 +709,29 @@ describe('getColumnDefForSchema', () => {
623
709
  table2.sqliteDef.columns.count.default._tag === 'Some' && table2.sqliteDef.columns.count.default.value,
624
710
  ).toBe(0)
625
711
  })
712
+
713
+ it('should support thunk defaults without eager evaluation', () => {
714
+ let counter = 0
715
+ const UserSchema = Schema.Struct({
716
+ id: Schema.String.pipe(
717
+ withDefault(() => {
718
+ counter += 1
719
+ return `user-${counter}`
720
+ }),
721
+ ),
722
+ })
723
+
724
+ const table = State.SQLite.table({ name: 'users_with_thunk', schema: UserSchema })
725
+
726
+ expect(counter).toBe(0)
727
+ expect(table.sqliteDef.columns.id.default._tag).toBe('Some')
728
+ if (table.sqliteDef.columns.id.default._tag === 'Some') {
729
+ const defaultThunk = table.sqliteDef.columns.id.default.value
730
+ assert(typeof defaultThunk === 'function')
731
+ expect(defaultThunk()).toBe('user-1')
732
+ expect(defaultThunk()).toBe('user-2')
733
+ }
734
+ })
626
735
  })
627
736
 
628
737
  describe('withUnique', () => {
@@ -668,7 +777,7 @@ describe('getColumnDefForSchema', () => {
668
777
 
669
778
  describe('combined annotations', () => {
670
779
  it('should work with multiple annotations', () => {
671
- const schema = Schema.Uint8ArrayFromBase64.pipe(withColumnType('blob')).pipe(withPrimaryKey)
780
+ const schema = Schema.Uint8ArrayFromBase64.pipe(withColumnType('blob'), withPrimaryKey)
672
781
 
673
782
  const UserSchema = Schema.Struct({
674
783
  id: schema,
@@ -686,7 +795,7 @@ describe('getColumnDefForSchema', () => {
686
795
 
687
796
  it('should combine all annotations', () => {
688
797
  const UserSchema = Schema.Struct({
689
- id: Schema.Int.pipe(withPrimaryKey).pipe(withAutoIncrement),
798
+ id: Schema.Int.pipe(withPrimaryKey, withAutoIncrement),
690
799
  email: Schema.String.pipe(withUnique),
691
800
  status: Schema.String.pipe(withDefault('active')),
692
801
  metadata: Schema.Unknown.pipe(withColumnType('text')),