@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
@@ -12,27 +12,28 @@ import { SqliteDsl } from './db-schema/mod.ts'
12
12
  * Fields with both null and undefined will emit a warning as this is a lossy conversion.
13
13
  */
14
14
  export const getColumnDefForSchema = (
15
- schema: Schema.Schema.AnyNoContext,
15
+ schema: Schema.Top,
16
16
  propertySignature?: SchemaAST.PropertySignature,
17
17
  forceNullable = false,
18
18
  ): SqliteDsl.ColumnDefinition.Any => {
19
19
  const ast = schema.ast
20
20
 
21
21
  // Extract annotations
22
- const getAnnotation = <T>(annotationId: symbol): Option.Option<T> =>
23
- propertySignature
22
+ const getAnnotation = <T>(annotationId: string): Option.Option<T> =>
23
+ propertySignature !== undefined
24
24
  ? hasPropertyAnnotation<T>(propertySignature, annotationId)
25
- : SchemaAST.getAnnotation<T>(annotationId)(ast)
25
+ : Option.fromUndefinedOr(SchemaAST.resolveAt<T>(annotationId)(ast))
26
26
 
27
- const columnType = SchemaAST.getAnnotation<SqliteDsl.FieldColumnType>(ColumnType)(ast)
27
+ const columnType = Option.fromUndefinedOr(SchemaAST.resolveAt<SqliteDsl.FieldColumnType>(ColumnType)(ast))
28
28
 
29
29
  // Check if schema has null (e.g., Schema.NullOr) or undefined or if it's forced nullable (optional field)
30
- const isNullable = forceNullable || hasNull(ast) || hasUndefined(ast)
30
+ const isNullable = forceNullable === true || hasNull(ast) === true || hasUndefined(ast) === true
31
31
 
32
32
  // Get base column definition with nullable flag
33
- const baseColumn = Option.isSome(columnType)
34
- ? getColumnForType(columnType.value, isNullable)
35
- : getColumnForSchema(schema, isNullable)
33
+ const baseColumn =
34
+ Option.isSome(columnType) === true
35
+ ? getColumnForType(columnType.value, isNullable)
36
+ : getColumnForSchema(schema, isNullable)
36
37
 
37
38
  // Apply annotations
38
39
  const primaryKey = getAnnotation<boolean>(PrimaryKeyId).pipe(Option.getOrElse(() => false))
@@ -41,21 +42,21 @@ export const getColumnDefForSchema = (
41
42
 
42
43
  return {
43
44
  ...baseColumn,
44
- ...(primaryKey && { primaryKey: true }),
45
- ...(autoIncrement && { autoIncrement: true }),
46
- ...(Option.isSome(defaultValue) && { default: Option.some(defaultValue.value) }),
45
+ ...(primaryKey === true ? { primaryKey: true } : {}),
46
+ ...(autoIncrement === true ? { autoIncrement: true } : {}),
47
+ ...(Option.isSome(defaultValue) === true ? { default: Option.some(defaultValue.value) } : {}),
47
48
  }
48
49
  }
49
50
 
50
51
  const hasPropertyAnnotation = <T>(
51
52
  propertySignature: SchemaAST.PropertySignature,
52
- annotationId: symbol,
53
+ annotationId: string,
53
54
  ): Option.Option<T> => {
54
- if ('annotations' in propertySignature && propertySignature.annotations) {
55
- const annotation = SchemaAST.getAnnotation<T>(annotationId)(propertySignature as any)
56
- if (Option.isSome(annotation)) return annotation
55
+ const keyAnnotation = propertySignature.type.context?.annotations?.[annotationId] as T | undefined
56
+ if (keyAnnotation !== undefined) {
57
+ return Option.some(keyAnnotation)
57
58
  }
58
- return SchemaAST.getAnnotation<T>(annotationId)(propertySignature.type)
59
+ return Option.fromUndefinedOr(SchemaAST.resolveAt<T>(annotationId)(propertySignature.type))
59
60
  }
60
61
 
61
62
  /**
@@ -71,18 +72,19 @@ export const schemaFieldsToColumns = (
71
72
  for (const prop of propertySignatures) {
72
73
  if (typeof prop.name !== 'string') continue
73
74
 
74
- const fieldSchema = Schema.make(prop.type)
75
+ const isOptional = SchemaAST.isOptional(prop.type)
76
+ const fieldSchema = Schema.make<Schema.Top>(prop.type)
75
77
 
76
78
  // Warn about lossy conversion for fields with both null and undefined
77
- if (prop.isOptional) {
79
+ if (isOptional === true) {
78
80
  const { hasNull, hasUndefined } = checkNullUndefined(fieldSchema.ast)
79
- if (hasNull && hasUndefined) {
81
+ if (hasNull === true && hasUndefined === true) {
80
82
  console.warn(`Field '${prop.name}' has both null and undefined - treating | undefined as | null`)
81
83
  }
82
84
  }
83
85
 
84
86
  // Get column definition - pass nullable flag for optional fields
85
- const columnDef = getColumnDefForSchema(fieldSchema, prop, prop.isOptional)
87
+ const columnDef = getColumnDefForSchema(fieldSchema, prop, isOptional === true)
86
88
 
87
89
  // Check for primary key and unique annotations
88
90
  const hasPrimaryKey = hasPropertyAnnotation<boolean>(prop, PrimaryKeyId).pipe(Option.getOrElse(() => false))
@@ -91,16 +93,16 @@ export const schemaFieldsToColumns = (
91
93
  // Build final column
92
94
  columns[prop.name] = {
93
95
  ...columnDef,
94
- ...(hasPrimaryKey && { primaryKey: true }),
96
+ ...(hasPrimaryKey === true ? { primaryKey: true } : {}),
95
97
  }
96
98
 
97
99
  // Validate primary key + nullable
98
100
  const column = columns[prop.name]
99
- if (column?.primaryKey && column.nullable) {
101
+ if (column?.primaryKey === true && column.nullable === true) {
100
102
  throw new Error('Primary key columns cannot be nullable')
101
103
  }
102
104
 
103
- if (hasUnique) uniqueColumns.push(prop.name)
105
+ if (hasUnique === true) uniqueColumns.push(prop.name)
104
106
  }
105
107
 
106
108
  return { columns, uniqueColumns }
@@ -111,9 +113,9 @@ const checkNullUndefined = (ast: SchemaAST.AST): { hasNull: boolean; hasUndefine
111
113
  let hasUndefined = false
112
114
 
113
115
  const visit = (type: SchemaAST.AST): void => {
114
- if (SchemaAST.isUndefinedKeyword(type)) hasUndefined = true
115
- else if (SchemaAST.isLiteral(type) && type.literal === null) hasNull = true
116
- else if (SchemaAST.isUnion(type)) type.types.forEach(visit)
116
+ if (SchemaAST.isUndefined(type) === true) hasUndefined = true
117
+ else if (SchemaAST.isNull(type) === true) hasNull = true
118
+ else if (SchemaAST.isUnion(type) === true) type.types.forEach(visit)
117
119
  }
118
120
 
119
121
  visit(ast)
@@ -121,16 +123,16 @@ const checkNullUndefined = (ast: SchemaAST.AST): { hasNull: boolean; hasUndefine
121
123
  }
122
124
 
123
125
  const hasNull = (ast: SchemaAST.AST): boolean => {
124
- if (SchemaAST.isLiteral(ast) && ast.literal === null) return true
125
- if (SchemaAST.isUnion(ast)) {
126
+ if (SchemaAST.isNull(ast) === true) return true
127
+ if (SchemaAST.isUnion(ast) === true) {
126
128
  return ast.types.some((type) => hasNull(type))
127
129
  }
128
130
  return false
129
131
  }
130
132
 
131
133
  const hasUndefined = (ast: SchemaAST.AST): boolean => {
132
- if (SchemaAST.isUndefinedKeyword(ast)) return true
133
- if (SchemaAST.isUnion(ast)) {
134
+ if (SchemaAST.isUndefined(ast) === true) return true
135
+ if (SchemaAST.isUnion(ast) === true) {
134
136
  return ast.types.some((type) => hasUndefined(type))
135
137
  }
136
138
  return false
@@ -151,65 +153,170 @@ const getColumnForType = (columnType: string, nullable = false): SqliteDsl.Colum
151
153
  }
152
154
  }
153
155
 
154
- const getColumnForSchema = (schema: Schema.Schema.AnyNoContext, nullable = false): SqliteDsl.ColumnDefinition.Any => {
156
+ const getColumnForSchema = (schema: Schema.Top, nullable = false): SqliteDsl.ColumnDefinition.Any => {
155
157
  const ast = schema.ast
156
158
  // Strip nullable wrapper to get core type
157
159
  const coreAst = stripNullable(ast)
158
- const coreSchema = stripNullable(ast) === ast ? schema : Schema.make(coreAst)
160
+ const coreSchema = (stripNullable(ast) === ast ? schema : Schema.make(coreAst)) as Schema.Codec<any, any>
159
161
 
160
162
  // Special case: Boolean is transformed to integer in SQLite
161
- if (SchemaAST.isBooleanKeyword(coreAst)) {
163
+ if (SchemaAST.isBoolean(coreAst) === true) {
162
164
  return SqliteDsl.boolean({ nullable })
163
165
  }
164
166
 
165
167
  // Get the encoded AST - what actually gets stored in SQLite
166
- const encodedAst = Schema.encodedSchema(coreSchema).ast
168
+ const encodedAst = Schema.toEncoded(coreSchema).ast
167
169
 
168
170
  // Check if the encoded type matches SQLite native types
169
- if (SchemaAST.isStringKeyword(encodedAst)) {
171
+ if (SchemaAST.isString(encodedAst) === true) {
170
172
  return SqliteDsl.text({ schema: coreSchema, nullable })
171
173
  }
172
174
 
173
- if (SchemaAST.isNumberKeyword(encodedAst)) {
174
- // Special cases for integer columns
175
- const id = SchemaAST.getIdentifierAnnotation(coreAst).pipe(Option.getOrElse(() => ''))
176
- if (id === 'Int' || id === 'DateFromNumber') {
175
+ if (SchemaAST.isNumber(encodedAst) === true) {
176
+ if (hasCheck(coreAst.checks, 'effect/schema/isInt') === true || hasDateRepresentation(coreAst) === true) {
177
177
  return SqliteDsl.integer({ schema: coreSchema, nullable })
178
178
  }
179
179
  return SqliteDsl.real({ schema: coreSchema, nullable })
180
180
  }
181
181
 
182
- // Literals based on their type
183
- if (SchemaAST.isLiteral(coreAst)) {
184
- const value = coreAst.literal
185
- if (typeof value === 'boolean') return SqliteDsl.boolean({ nullable })
182
+ if (isUint8ArraySchema(coreAst) === true || isUint8ArraySchema(encodedAst) === true) {
183
+ return SqliteDsl.blob({ schema: coreSchema, nullable })
186
184
  }
187
185
 
188
- // Literals based on their encoded type
189
- if (SchemaAST.isLiteral(encodedAst)) {
190
- const value = encodedAst.literal
191
- if (typeof value === 'string') return SqliteDsl.text({ schema: coreSchema, nullable })
192
- if (typeof value === 'number') {
193
- // Check if the original schema is Int
194
- const id = SchemaAST.getIdentifierAnnotation(coreAst).pipe(Option.getOrElse(() => ''))
195
- if (id === 'Int') {
196
- return SqliteDsl.integer({ schema: coreSchema, nullable })
197
- }
198
- return SqliteDsl.real({ schema: coreSchema, nullable })
199
- }
200
- }
186
+ const literalColumn = getLiteralColumnDefinition(encodedAst, coreSchema, nullable, coreAst)
187
+ if (literalColumn !== null) return literalColumn
188
+
189
+ // Fallback to checking the original AST in case the encoded schema differs
190
+ const coreLiteralColumn = getLiteralColumnDefinition(coreAst, coreSchema, nullable, coreAst)
191
+ if (coreLiteralColumn !== null) return coreLiteralColumn
201
192
 
202
193
  // Everything else needs JSON encoding
203
194
  return SqliteDsl.json({ schema: coreSchema, nullable })
204
195
  }
205
196
 
206
197
  const stripNullable = (ast: SchemaAST.AST): SchemaAST.AST => {
207
- if (!SchemaAST.isUnion(ast)) return ast
198
+ if (SchemaAST.isUnion(ast) === false) return ast
208
199
 
209
- // Find non-null/undefined type
210
- const core = ast.types.find(
211
- (type) => !(SchemaAST.isLiteral(type) && type.literal === null) && !SchemaAST.isUndefinedKeyword(type),
200
+ // Filter out null/undefined members while preserving any annotations on the union
201
+ const coreTypes = ast.types.filter(
202
+ (type) => SchemaAST.isNull(type) === false && SchemaAST.isUndefined(type) === false,
212
203
  )
213
204
 
214
- return core || ast
205
+ if (coreTypes.length === 0 || coreTypes.length === ast.types.length) {
206
+ return ast
207
+ }
208
+
209
+ if (coreTypes.length === 1) {
210
+ return coreTypes[0]!
211
+ }
212
+
213
+ return new SchemaAST.Union(coreTypes, ast.mode, ast.annotations)
214
+ }
215
+
216
+ const getLiteralColumnDefinition = (
217
+ ast: SchemaAST.AST,
218
+ schema: Schema.Codec<any, any>,
219
+ nullable: boolean,
220
+ sourceAst: SchemaAST.AST,
221
+ ): SqliteDsl.ColumnDefinition.Any | null => {
222
+ const literalValues = extractLiteralValues(ast)
223
+ if (literalValues == null) return null
224
+
225
+ const literalType = getLiteralValueType(literalValues)
226
+ switch (literalType) {
227
+ case 'string':
228
+ return SqliteDsl.text({ schema, nullable })
229
+ case 'number': {
230
+ if (hasCheck(sourceAst.checks, 'effect/schema/isInt') === true || hasDateRepresentation(sourceAst) === true) {
231
+ return SqliteDsl.integer({ schema, nullable })
232
+ }
233
+
234
+ const useIntegerColumn =
235
+ literalValues.length > 1 && literalValues.every((value) => typeof value === 'number' && Number.isInteger(value))
236
+
237
+ return useIntegerColumn === true ? SqliteDsl.integer({ schema, nullable }) : SqliteDsl.real({ schema, nullable })
238
+ }
239
+ case 'boolean':
240
+ return SqliteDsl.boolean({ nullable })
241
+ case 'bigint':
242
+ return SqliteDsl.integer({ schema, nullable })
243
+ default:
244
+ return null
245
+ }
246
+ }
247
+
248
+ /** Effect's built-in date codecs expose their semantic type through the Date representation annotation. */
249
+ const hasDateRepresentation = (ast: SchemaAST.AST): boolean => hasRepresentation(ast, 'effect/schema/Date')
250
+
251
+ const extractLiteralValues = (ast: SchemaAST.AST): ReadonlyArray<SchemaAST.LiteralValue> | null => {
252
+ if (SchemaAST.isLiteral(ast) === true) return [ast.literal]
253
+
254
+ if (
255
+ SchemaAST.isUnion(ast) === true &&
256
+ ast.types.length > 0 &&
257
+ ast.types.every((type) => SchemaAST.isLiteral(type)) === true
258
+ ) {
259
+ return ast.types.map((type) => type.literal)
260
+ }
261
+
262
+ return null
263
+ }
264
+
265
+ const getLiteralValueType = (
266
+ literals: ReadonlyArray<SchemaAST.LiteralValue>,
267
+ ): 'string' | 'number' | 'boolean' | 'bigint' | null => {
268
+ const literalTypes = new Set(literals.map((value) => typeof value))
269
+ if (literalTypes.size !== 1) return null
270
+
271
+ const [literalType] = literalTypes
272
+ return literalType === 'string' || literalType === 'number' || literalType === 'boolean' || literalType === 'bigint'
273
+ ? literalType
274
+ : null
275
+ }
276
+
277
+ /**
278
+ * Recursively checks for Effect built-in check metadata.
279
+ *
280
+ * Checks can be attached directly as `Filter`s or nested in `FilterGroup`s when
281
+ * schemas compose multiple refinements, e.g. `Schema.Int.check(...)`.
282
+ *
283
+ * Effect rc.109 replaced the closed `meta` annotation with the open `representation`
284
+ * identity, so built-in checks are matched by their representation id.
285
+ */
286
+ const hasCheck = (checks: ReadonlyArray<SchemaAST.Check<unknown>> | undefined, representationId: string): boolean => {
287
+ return (
288
+ checks?.some((check) => {
289
+ switch (check._tag) {
290
+ case 'Filter':
291
+ return check.annotations?.representation?.id === representationId
292
+ case 'FilterGroup':
293
+ return hasCheck(check.checks, representationId)
294
+ }
295
+ }) === true
296
+ )
297
+ }
298
+
299
+ const isUint8ArraySchema = (ast: SchemaAST.AST): boolean => {
300
+ // `resolveAt` reads the last check's annotations, which can mask the declaration's representation.
301
+ if (hasRepresentation(ast, 'effect/schema/Uint8Array') === true) {
302
+ return true
303
+ }
304
+
305
+ const identifier = SchemaAST.resolveIdentifier(ast)
306
+ if (identifier !== undefined && identifier.includes('Uint8Array') === true) {
307
+ return true
308
+ }
309
+
310
+ if (SchemaAST.isArrays(ast) === true) {
311
+ return ast.elements.length === 0 && ast.rest.length === 1 && SchemaAST.isNumber(ast.rest[0]!)
312
+ }
313
+
314
+ return false
315
+ }
316
+
317
+ const hasRepresentation = (ast: SchemaAST.AST, id: string): boolean => {
318
+ const representation = ast.annotations?.representation
319
+ return (
320
+ typeof representation === 'object' && representation !== null && 'id' in representation && representation.id === id
321
+ )
215
322
  }
@@ -1,5 +1,7 @@
1
- import { Option, Schema } from '@livestore/utils/effect'
2
1
  import { describe, expect, it } from 'vitest'
2
+
3
+ import { Option, Schema } from '@livestore/utils/effect'
4
+
3
5
  import { makeColumnSpec } from './column-spec.ts'
4
6
  import { SqliteAst } from './db-schema/mod.ts'
5
7
 
@@ -26,9 +28,9 @@ const createColumn = (
26
28
  case 'text':
27
29
  return Schema.String
28
30
  case 'integer':
29
- return options.defaultValue === true || options.defaultValue === false ? Schema.Boolean : Schema.Number
31
+ return options.defaultValue === true || options.defaultValue === false ? Schema.Boolean : Schema.Finite
30
32
  case 'real':
31
- return Schema.Number
33
+ return Schema.Finite
32
34
  case 'blob':
33
35
  return Schema.Uint8ArrayFromBase64
34
36
  default:
@@ -56,9 +58,9 @@ describe('makeColumnSpec', () => {
56
58
  )
57
59
 
58
60
  const result = makeColumnSpec(table)
59
- expect(result).toMatchInlineSnapshot(`"'order' integer not null , 'group' text "`)
60
- expect(result).toContain("'order'")
61
- expect(result).toContain("'group'")
61
+ expect(result).toMatchInlineSnapshot(`""order" integer not null , "group" text "`)
62
+ expect(result).toContain('"order"')
63
+ expect(result).toContain('"group"')
62
64
  })
63
65
 
64
66
  it('should handle basic columns with primary keys', () => {
@@ -69,8 +71,7 @@ describe('makeColumnSpec', () => {
69
71
  )
70
72
 
71
73
  const result = makeColumnSpec(table)
72
- expect(result).toMatchInlineSnapshot(`"'id' text not null , 'name' text , PRIMARY KEY ('id')"`)
73
- expect(result).toContain("PRIMARY KEY ('id')")
74
+ expect(result).toMatchInlineSnapshot(`""id" text primary key , "name" text "`)
74
75
  })
75
76
 
76
77
  it('should handle multi-column primary keys', () => {
@@ -85,9 +86,9 @@ describe('makeColumnSpec', () => {
85
86
 
86
87
  const result = makeColumnSpec(table)
87
88
  expect(result).toMatchInlineSnapshot(
88
- `"'tenant_id' text not null , 'user_id' text not null , PRIMARY KEY ('tenant_id', 'user_id')"`,
89
+ `""tenant_id" text not null , "user_id" text not null , PRIMARY KEY ("tenant_id", "user_id")"`,
89
90
  )
90
- expect(result).toContain("PRIMARY KEY ('tenant_id', 'user_id')")
91
+ expect(result).toContain('PRIMARY KEY ("tenant_id", "user_id")')
91
92
  })
92
93
 
93
94
  it('should handle auto-increment columns', () => {
@@ -101,9 +102,9 @@ describe('makeColumnSpec', () => {
101
102
  )
102
103
 
103
104
  const result = makeColumnSpec(table)
104
- expect(result).toMatchInlineSnapshot(`"'id' integer not null autoincrement , 'title' text , PRIMARY KEY ('id')"`)
105
+ expect(result).toMatchInlineSnapshot(`""id" integer primary key autoincrement , "title" text "`)
105
106
  expect(result).toContain('autoincrement')
106
- expect(result).toContain("PRIMARY KEY ('id')")
107
+ expect(result).not.toContain("PRIMARY KEY ('id')")
107
108
  })
108
109
 
109
110
  it('should handle columns with default values', () => {
@@ -121,7 +122,7 @@ describe('makeColumnSpec', () => {
121
122
 
122
123
  const result = makeColumnSpec(table)
123
124
  expect(result).toMatchInlineSnapshot(
124
- `"'id' integer not null , 'name' text not null , 'price' real default 0, 'active' integer default true, 'description' text default 'No description', PRIMARY KEY ('id')"`,
125
+ `""id" integer primary key , "name" text not null , "price" real default 0, "active" integer default true, "description" text default 'No description'"`,
125
126
  )
126
127
  expect(result).toContain('default 0')
127
128
  expect(result).toContain('default true')
@@ -141,12 +142,28 @@ describe('makeColumnSpec', () => {
141
142
 
142
143
  const result = makeColumnSpec(table)
143
144
  expect(result).toMatchInlineSnapshot(
144
- `"'id' integer not null , 'created_at' text default CURRENT_TIMESTAMP, 'random_value' real default RANDOM(), PRIMARY KEY ('id')"`,
145
+ `""id" integer primary key , "created_at" text default CURRENT_TIMESTAMP, "random_value" real default RANDOM()"`,
145
146
  )
146
147
  expect(result).toContain('default CURRENT_TIMESTAMP')
147
148
  expect(result).toContain('default RANDOM()')
148
149
  })
149
150
 
151
+ it('should omit default clause for thunk defaults', () => {
152
+ const table = SqliteAst.table(
153
+ 'thunks',
154
+ [
155
+ createColumn('id', 'integer', { nullable: false, primaryKey: true }),
156
+ createColumn('token', 'text', { defaultValue: () => 'dynamic-token' }),
157
+ ],
158
+ [],
159
+ )
160
+
161
+ const result = makeColumnSpec(table)
162
+ expect(result).toMatchInlineSnapshot(`""id" integer primary key , "token" text "`)
163
+ expect(result).not.toContain('dynamic-token')
164
+ expect(result).not.toMatch(/token" text\s+default/i)
165
+ })
166
+
150
167
  it('should handle null default values', () => {
151
168
  const table = SqliteAst.table(
152
169
  'nullable_defaults',
@@ -158,9 +175,7 @@ describe('makeColumnSpec', () => {
158
175
  )
159
176
 
160
177
  const result = makeColumnSpec(table)
161
- expect(result).toMatchInlineSnapshot(
162
- `"'id' integer not null , 'optional_text' text default null, PRIMARY KEY ('id')"`,
163
- )
178
+ expect(result).toMatchInlineSnapshot(`""id" integer primary key , "optional_text" text default null"`)
164
179
  expect(result).toContain('default null')
165
180
  })
166
181
 
@@ -190,7 +205,7 @@ describe('makeColumnSpec', () => {
190
205
 
191
206
  const result = makeColumnSpec(table)
192
207
  expect(result).toMatchInlineSnapshot(
193
- `"'id' integer not null autoincrement , 'name' text not null default 'Unnamed', 'created_at' text not null default CURRENT_TIMESTAMP, 'status' text default 'pending', PRIMARY KEY ('id')"`,
208
+ `""id" integer primary key autoincrement , "name" text not null default 'Unnamed', "created_at" text not null default CURRENT_TIMESTAMP, "status" text default 'pending'"`,
194
209
  )
195
210
  })
196
211
 
@@ -213,7 +228,7 @@ describe('makeColumnSpec', () => {
213
228
  const result = makeColumnSpec(table)
214
229
  // The makeColumnSpec function only generates column specifications, not indexes
215
230
  expect(result).toMatchInlineSnapshot(
216
- `"'id' integer not null autoincrement , 'email' text not null , 'username' text not null , 'created_at' text default CURRENT_TIMESTAMP, PRIMARY KEY ('id')"`,
231
+ `""id" integer primary key autoincrement , "email" text not null , "username" text not null , "created_at" text default CURRENT_TIMESTAMP"`,
217
232
  )
218
233
  // Verify the table has the indexes (even though they're not in the column spec)
219
234
  expect(table.indexes).toHaveLength(3)
@@ -1,4 +1,5 @@
1
1
  import { Schema } from '@livestore/utils/effect'
2
+
2
3
  import { type SqliteAst, SqliteDsl } from './db-schema/mod.ts'
3
4
 
4
5
  /**
@@ -10,33 +11,59 @@ import { type SqliteAst, SqliteDsl } from './db-schema/mod.ts'
10
11
  * ```
11
12
  */
12
13
  export const makeColumnSpec = (tableAst: SqliteAst.Table) => {
13
- const primaryKeys = tableAst.columns.filter((_) => _.primaryKey).map((_) => `'${_.name}'`)
14
- const columnDefStrs = tableAst.columns.map(toSqliteColumnSpec)
14
+ const pkColumns = tableAst.columns.filter((_) => _.primaryKey)
15
+ const hasSinglePk = pkColumns.length === 1
16
+ const pkColumn = hasSinglePk === true ? pkColumns[0] : undefined
17
+
18
+ // Build column definitions, handling the special SQLite rule that AUTOINCREMENT
19
+ // is only valid on a single column declared as INTEGER PRIMARY KEY (column-level).
20
+ const columnDefStrs = tableAst.columns.map((column) =>
21
+ toSqliteColumnSpec(column, {
22
+ inlinePrimaryKey: hasSinglePk && column === pkColumn && column.primaryKey,
23
+ }),
24
+ )
15
25
 
16
- if (primaryKeys.length > 0) {
17
- columnDefStrs.push(`PRIMARY KEY (${primaryKeys.join(', ')})`)
26
+ // For composite primary keys, add a table-level PRIMARY KEY clause.
27
+ if (pkColumns.length > 1) {
28
+ const quotedPkCols = pkColumns.map((_) => `"${_.name}"`)
29
+ columnDefStrs.push(`PRIMARY KEY (${quotedPkCols.join(', ')})`)
18
30
  }
19
31
 
20
32
  return columnDefStrs.join(', ')
21
33
  }
22
34
 
23
35
  /** NOTE primary keys are applied on a table level not on a column level to account for multi-column primary keys */
24
- const toSqliteColumnSpec = (column: SqliteAst.Column) => {
36
+ const toSqliteColumnSpec = (column: SqliteAst.Column, opts: { inlinePrimaryKey: boolean }) => {
25
37
  const columnTypeStr = column.type._tag
26
- const nullableStr = column.nullable === false ? 'not null' : ''
27
- const autoIncrementStr = column.autoIncrement ? 'autoincrement' : ''
38
+ // When PRIMARY KEY is declared inline, NOT NULL is implied and should not be emitted,
39
+ // and AUTOINCREMENT must immediately follow PRIMARY KEY within the same constraint.
40
+ const nullableStr = opts.inlinePrimaryKey === true ? '' : column.nullable === false ? 'not null' : ''
41
+
42
+ // Only include AUTOINCREMENT when it's valid: single-column INTEGER PRIMARY KEY
43
+ const includeAutoIncrement =
44
+ opts.inlinePrimaryKey === true && column.type._tag === 'integer' && column.autoIncrement === true
45
+
46
+ const pkStr = opts.inlinePrimaryKey === true ? 'primary key' : ''
47
+ const autoIncrementStr = includeAutoIncrement === true ? 'autoincrement' : ''
48
+
28
49
  const defaultValueStr = (() => {
29
50
  if (column.default._tag === 'None') return ''
30
51
 
31
- if (column.default.value === null) return 'default null'
32
- if (SqliteDsl.isSqlDefaultValue(column.default.value)) return `default ${column.default.value.sql}`
52
+ const defaultValue = column.default.value
53
+ if (SqliteDsl.isDefaultThunk(defaultValue) === true) return ''
54
+
55
+ const resolvedDefault = SqliteDsl.resolveColumnDefault(defaultValue)
56
+
57
+ if (resolvedDefault === null) return 'default null'
58
+ if (SqliteDsl.isSqlDefaultValue(resolvedDefault) === true) return `default ${resolvedDefault.sql}`
33
59
 
34
60
  const encodeValue = Schema.encodeSync(column.schema)
35
- const encodedDefaultValue = encodeValue(column.default.value)
61
+ const encodedDefaultValue = encodeValue(resolvedDefault)
36
62
 
37
63
  if (columnTypeStr === 'text') return `default '${encodedDefaultValue}'`
38
64
  return `default ${encodedDefaultValue}`
39
65
  })()
40
66
 
41
- return `'${column.name}' ${columnTypeStr} ${nullableStr} ${autoIncrementStr} ${defaultValueStr}`
67
+ // Ensure order: PRIMARY KEY [AUTOINCREMENT] [NOT NULL] ...
68
+ return `"${column.name}" ${columnTypeStr} ${pkStr} ${autoIncrementStr} ${nullableStr} ${defaultValueStr}`
42
69
  }
@@ -25,7 +25,7 @@ export type Column = {
25
25
  nullable: boolean
26
26
  autoIncrement: boolean
27
27
  default: Option.Option<any>
28
- schema: Schema.Schema<any>
28
+ schema: Schema.Codec<any, any>
29
29
  }
30
30
 
31
31
  export const column = (props: Omit<Column, '_tag'>): Column => ({ _tag: 'column', ...props })
@@ -84,14 +84,24 @@ export type DbSchema = {
84
84
  export const dbSchema = (tables: Table[]): DbSchema => ({ _tag: 'dbSchema', tables })
85
85
 
86
86
  /**
87
- * Helper to detect if a column is a JSON column (has parseJson transformation)
87
+ * Helper to detect if a column is a JSON column (encoded as a JSON string)
88
88
  */
89
89
  const isJsonColumn = (column: Column): boolean => {
90
90
  if (column.type._tag !== 'text') return false
91
91
 
92
- // Check if the schema AST is a parseJson transformation
93
- const ast = column.schema.ast
94
- return ast._tag === 'Transformation' && ast.annotations.schemaId === SchemaAST.ParseJsonSchemaId
92
+ return hasJsonStringEncoding(column.schema.ast)
93
+ }
94
+
95
+ /**
96
+ * `SchemaTransformation.fromJsonString` is a factory since Effect rc.109, so encoding links can no
97
+ * longer be matched by identity. `Schema.fromJsonString` annotates its encoded side as
98
+ * `application/json`, which identifies the link regardless of the reviver/replacer/space options.
99
+ */
100
+ const hasJsonStringEncoding = (ast: SchemaAST.AST): boolean => {
101
+ if (ast.encoding?.some((link) => link.to.annotations?.contentMediaType === 'application/json') === true) {
102
+ return true
103
+ }
104
+ return SchemaAST.isUnion(ast) === true && ast.types.some(hasJsonStringEncoding)
95
105
  }
96
106
 
97
107
  /**
@@ -124,7 +134,7 @@ const trimInfoForHasing = (obj: Table | Column | Index | ForeignKey | DbSchema):
124
134
 
125
135
  // NEW: Include schema hash for JSON columns
126
136
  // This ensures that changes to the JSON schema are detected
127
- if (isJsonColumn(obj) && obj.schema) {
137
+ if (isJsonColumn(obj) === true && obj.schema !== undefined) {
128
138
  // Use Effect's Schema.hash for consistent hashing
129
139
  baseInfo.jsonSchemaHash = Schema.hash(obj.schema)
130
140
  }
@@ -155,7 +165,7 @@ const trimInfoForHasing = (obj: Table | Column | Index | ForeignKey | DbSchema):
155
165
  }
156
166
  }
157
167
  default: {
158
- throw new Error(`Unreachable: ${obj}`)
168
+ throw new Error(`Unreachable: ${String(obj)}`)
159
169
  }
160
170
  }
161
171
  }