@livestore/common 0.4.0-dev.2 → 0.4.0-dev.21

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 (465) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +20 -12
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
  4. package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
  5. package/dist/adapter-types.d.ts +14 -6
  6. package/dist/adapter-types.d.ts.map +1 -1
  7. package/dist/adapter-types.js.map +1 -1
  8. package/dist/debug-info.d.ts.map +1 -1
  9. package/dist/debug-info.js +33 -6
  10. package/dist/debug-info.js.map +1 -1
  11. package/dist/devtools/devtools-messages-client-session.d.ts +28 -23
  12. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  13. package/dist/devtools/devtools-messages-client-session.js +2 -2
  14. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  15. package/dist/devtools/devtools-messages-common.d.ts +7 -14
  16. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  17. package/dist/devtools/devtools-messages-common.js +1 -6
  18. package/dist/devtools/devtools-messages-common.js.map +1 -1
  19. package/dist/devtools/devtools-messages-leader.d.ts +38 -29
  20. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  21. package/dist/devtools/devtools-messages-leader.js +9 -8
  22. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  23. package/dist/devtools/devtools-sessioninfo.d.ts +14 -2
  24. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  25. package/dist/devtools/devtools-sessioninfo.js +7 -4
  26. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  27. package/dist/devtools/mod.d.ts +13 -2
  28. package/dist/devtools/mod.d.ts.map +1 -1
  29. package/dist/devtools/mod.js +10 -3
  30. package/dist/devtools/mod.js.map +1 -1
  31. package/dist/errors.d.ts +52 -10
  32. package/dist/errors.d.ts.map +1 -1
  33. package/dist/errors.js +25 -6
  34. package/dist/errors.js.map +1 -1
  35. package/dist/index.d.ts +2 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +2 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/leader-thread/LeaderSyncProcessor.d.ts +41 -4
  40. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  41. package/dist/leader-thread/LeaderSyncProcessor.js +158 -75
  42. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  43. package/dist/leader-thread/eventlog.d.ts +21 -22
  44. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  45. package/dist/leader-thread/eventlog.js +77 -20
  46. package/dist/leader-thread/eventlog.js.map +1 -1
  47. package/dist/leader-thread/leader-worker-devtools.d.ts +2 -2
  48. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  49. package/dist/leader-thread/leader-worker-devtools.js +56 -45
  50. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  51. package/dist/leader-thread/make-leader-thread-layer.d.ts +6 -6
  52. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  53. package/dist/leader-thread/make-leader-thread-layer.js +79 -27
  54. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  55. package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
  56. package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
  57. package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
  58. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
  59. package/dist/leader-thread/materialize-event.d.ts +3 -3
  60. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  61. package/dist/leader-thread/materialize-event.js +25 -11
  62. package/dist/leader-thread/materialize-event.js.map +1 -1
  63. package/dist/leader-thread/mod.d.ts +1 -0
  64. package/dist/leader-thread/mod.d.ts.map +1 -1
  65. package/dist/leader-thread/mod.js +1 -0
  66. package/dist/leader-thread/mod.js.map +1 -1
  67. package/dist/leader-thread/recreate-db.d.ts +2 -3
  68. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  69. package/dist/leader-thread/recreate-db.js +5 -5
  70. package/dist/leader-thread/recreate-db.js.map +1 -1
  71. package/dist/leader-thread/shutdown-channel.d.ts +2 -2
  72. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  73. package/dist/leader-thread/shutdown-channel.js +2 -2
  74. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  75. package/dist/leader-thread/stream-events.d.ts +56 -0
  76. package/dist/leader-thread/stream-events.d.ts.map +1 -0
  77. package/dist/leader-thread/stream-events.js +166 -0
  78. package/dist/leader-thread/stream-events.js.map +1 -0
  79. package/dist/leader-thread/types.d.ts +98 -20
  80. package/dist/leader-thread/types.d.ts.map +1 -1
  81. package/dist/leader-thread/types.js +13 -0
  82. package/dist/leader-thread/types.js.map +1 -1
  83. package/dist/logging.d.ts +40 -0
  84. package/dist/logging.d.ts.map +1 -0
  85. package/dist/logging.js +33 -0
  86. package/dist/logging.js.map +1 -0
  87. package/dist/make-client-session.d.ts +5 -3
  88. package/dist/make-client-session.d.ts.map +1 -1
  89. package/dist/make-client-session.js +5 -2
  90. package/dist/make-client-session.js.map +1 -1
  91. package/dist/materializer-helper.d.ts +6 -6
  92. package/dist/materializer-helper.d.ts.map +1 -1
  93. package/dist/materializer-helper.js +20 -4
  94. package/dist/materializer-helper.js.map +1 -1
  95. package/dist/otel.d.ts +2 -1
  96. package/dist/otel.d.ts.map +1 -1
  97. package/dist/otel.js +5 -0
  98. package/dist/otel.js.map +1 -1
  99. package/dist/rematerialize-from-eventlog.d.ts +2 -2
  100. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  101. package/dist/rematerialize-from-eventlog.js +29 -20
  102. package/dist/rematerialize-from-eventlog.js.map +1 -1
  103. package/dist/schema/EventDef/define.d.ts +147 -0
  104. package/dist/schema/EventDef/define.d.ts.map +1 -0
  105. package/dist/schema/EventDef/define.js +139 -0
  106. package/dist/schema/EventDef/define.js.map +1 -0
  107. package/dist/schema/EventDef/event-def.d.ts +106 -0
  108. package/dist/schema/EventDef/event-def.d.ts.map +1 -0
  109. package/dist/schema/EventDef/event-def.js +2 -0
  110. package/dist/schema/EventDef/event-def.js.map +1 -0
  111. package/dist/schema/EventDef/facts.d.ts +118 -0
  112. package/dist/schema/EventDef/facts.d.ts.map +1 -0
  113. package/dist/schema/EventDef/facts.js +53 -0
  114. package/dist/schema/EventDef/facts.js.map +1 -0
  115. package/dist/schema/EventDef/materializer.d.ts +155 -0
  116. package/dist/schema/EventDef/materializer.d.ts.map +1 -0
  117. package/dist/schema/EventDef/materializer.js +83 -0
  118. package/dist/schema/EventDef/materializer.js.map +1 -0
  119. package/dist/schema/EventDef/mod.d.ts +5 -0
  120. package/dist/schema/EventDef/mod.d.ts.map +1 -0
  121. package/dist/schema/EventDef/mod.js +5 -0
  122. package/dist/schema/EventDef/mod.js.map +1 -0
  123. package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
  124. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
  125. package/dist/schema/EventSequenceNumber/client.js +193 -0
  126. package/dist/schema/EventSequenceNumber/client.js.map +1 -0
  127. package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
  128. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
  129. package/dist/schema/EventSequenceNumber/global.js +14 -0
  130. package/dist/schema/EventSequenceNumber/global.js.map +1 -0
  131. package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
  132. package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
  133. package/dist/schema/EventSequenceNumber/mod.js +37 -0
  134. package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
  135. package/dist/schema/EventSequenceNumber.test.js +43 -43
  136. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  137. package/dist/schema/{LiveStoreEvent.d.ts → LiveStoreEvent/client.d.ts} +89 -106
  138. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
  139. package/dist/schema/{LiveStoreEvent.js → LiveStoreEvent/client.js} +74 -58
  140. package/dist/schema/LiveStoreEvent/client.js.map +1 -0
  141. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
  142. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
  143. package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
  144. package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
  145. package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
  146. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
  147. package/dist/schema/LiveStoreEvent/global.js +31 -0
  148. package/dist/schema/LiveStoreEvent/global.js.map +1 -0
  149. package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
  150. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
  151. package/dist/schema/LiveStoreEvent/input.js +26 -0
  152. package/dist/schema/LiveStoreEvent/input.js.map +1 -0
  153. package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
  154. package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
  155. package/dist/schema/LiveStoreEvent/mod.js +5 -0
  156. package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
  157. package/dist/schema/events.d.ts +1 -1
  158. package/dist/schema/events.d.ts.map +1 -1
  159. package/dist/schema/events.js +1 -1
  160. package/dist/schema/events.js.map +1 -1
  161. package/dist/schema/mod.d.ts +6 -4
  162. package/dist/schema/mod.d.ts.map +1 -1
  163. package/dist/schema/mod.js +5 -4
  164. package/dist/schema/mod.js.map +1 -1
  165. package/dist/schema/schema.d.ts +16 -1
  166. package/dist/schema/schema.d.ts.map +1 -1
  167. package/dist/schema/schema.js +27 -2
  168. package/dist/schema/schema.js.map +1 -1
  169. package/dist/schema/state/sqlite/client-document-def.d.ts +36 -6
  170. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  171. package/dist/schema/state/sqlite/client-document-def.js +97 -6
  172. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  173. package/dist/schema/state/sqlite/client-document-def.test.js +16 -0
  174. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  175. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  176. package/dist/schema/state/sqlite/column-annotations.js +14 -6
  177. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  178. package/dist/schema/state/sqlite/column-annotations.test.js +1 -1
  179. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  180. package/dist/schema/state/sqlite/column-def.js +69 -22
  181. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  182. package/dist/schema/state/sqlite/column-def.test.js +48 -10
  183. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  184. package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
  185. package/dist/schema/state/sqlite/column-spec.js +30 -12
  186. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  187. package/dist/schema/state/sqlite/column-spec.test.js +23 -14
  188. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  189. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -1
  190. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
  191. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +23 -6
  192. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  193. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +14 -8
  194. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  195. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +5 -3
  196. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  197. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  198. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +2 -1
  199. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  200. package/dist/schema/state/sqlite/mod.d.ts +3 -3
  201. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  202. package/dist/schema/state/sqlite/mod.js +3 -3
  203. package/dist/schema/state/sqlite/mod.js.map +1 -1
  204. package/dist/schema/state/sqlite/query-builder/api.d.ts +19 -11
  205. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  206. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  207. package/dist/schema/state/sqlite/query-builder/astToSql.js +22 -15
  208. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  209. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  210. package/dist/schema/state/sqlite/query-builder/impl.js +6 -3
  211. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  212. package/dist/schema/state/sqlite/query-builder/impl.test.js +252 -88
  213. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  214. package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
  215. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
  216. package/dist/schema/state/sqlite/schema-helpers.js +22 -12
  217. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  218. package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
  219. package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
  220. package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
  221. package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
  222. package/dist/schema/state/sqlite/{system-tables.d.ts → system-tables/eventlog-tables.d.ts} +63 -456
  223. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
  224. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
  225. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
  226. package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
  227. package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
  228. package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
  229. package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
  230. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +456 -0
  231. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
  232. package/dist/schema/state/sqlite/system-tables/state-tables.js +55 -0
  233. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
  234. package/dist/schema/state/sqlite/table-def.d.ts +4 -4
  235. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  236. package/dist/schema/state/sqlite/table-def.js +2 -2
  237. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  238. package/dist/schema/state/sqlite/table-def.test.js +80 -0
  239. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  240. package/dist/schema/unknown-events.d.ts +47 -0
  241. package/dist/schema/unknown-events.d.ts.map +1 -0
  242. package/dist/schema/unknown-events.js +69 -0
  243. package/dist/schema/unknown-events.js.map +1 -0
  244. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
  245. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
  246. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
  247. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
  248. package/dist/schema-management/migrations.d.ts +32 -2
  249. package/dist/schema-management/migrations.d.ts.map +1 -1
  250. package/dist/schema-management/migrations.js +37 -5
  251. package/dist/schema-management/migrations.js.map +1 -1
  252. package/dist/schema-management/validate-schema.d.ts +3 -3
  253. package/dist/schema-management/validate-schema.d.ts.map +1 -1
  254. package/dist/schema-management/validate-schema.js +2 -2
  255. package/dist/schema-management/validate-schema.js.map +1 -1
  256. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  257. package/dist/sql-queries/sql-queries.js +11 -1
  258. package/dist/sql-queries/sql-queries.js.map +1 -1
  259. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  260. package/dist/sql-queries/sql-query-builder.js +2 -1
  261. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  262. package/dist/sqlite-types.d.ts +3 -3
  263. package/dist/sqlite-types.d.ts.map +1 -1
  264. package/dist/sync/ClientSessionSyncProcessor.d.ts +11 -13
  265. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  266. package/dist/sync/ClientSessionSyncProcessor.js +45 -42
  267. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  268. package/dist/sync/errors.d.ts +66 -0
  269. package/dist/sync/errors.d.ts.map +1 -0
  270. package/dist/sync/errors.js +36 -0
  271. package/dist/sync/errors.js.map +1 -0
  272. package/dist/sync/index.d.ts +3 -0
  273. package/dist/sync/index.d.ts.map +1 -1
  274. package/dist/sync/index.js +3 -0
  275. package/dist/sync/index.js.map +1 -1
  276. package/dist/sync/mock-sync-backend.d.ts +23 -0
  277. package/dist/sync/mock-sync-backend.d.ts.map +1 -0
  278. package/dist/sync/mock-sync-backend.js +114 -0
  279. package/dist/sync/mock-sync-backend.js.map +1 -0
  280. package/dist/sync/next/compact-events.d.ts.map +1 -1
  281. package/dist/sync/next/compact-events.js +6 -7
  282. package/dist/sync/next/compact-events.js.map +1 -1
  283. package/dist/sync/next/facts.d.ts +5 -5
  284. package/dist/sync/next/facts.d.ts.map +1 -1
  285. package/dist/sync/next/facts.js +1 -2
  286. package/dist/sync/next/facts.js.map +1 -1
  287. package/dist/sync/next/history-dag-common.d.ts +54 -15
  288. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  289. package/dist/sync/next/history-dag-common.js +198 -9
  290. package/dist/sync/next/history-dag-common.js.map +1 -1
  291. package/dist/sync/next/history-dag.d.ts.map +1 -1
  292. package/dist/sync/next/history-dag.js +10 -8
  293. package/dist/sync/next/history-dag.js.map +1 -1
  294. package/dist/sync/next/rebase-events.d.ts +5 -5
  295. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  296. package/dist/sync/next/rebase-events.js +5 -5
  297. package/dist/sync/next/rebase-events.js.map +1 -1
  298. package/dist/sync/next/test/event-fixtures.d.ts +2 -2
  299. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  300. package/dist/sync/next/test/event-fixtures.js +9 -9
  301. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  302. package/dist/sync/sync-backend-kv.d.ts +7 -0
  303. package/dist/sync/sync-backend-kv.d.ts.map +1 -0
  304. package/dist/sync/sync-backend-kv.js +18 -0
  305. package/dist/sync/sync-backend-kv.js.map +1 -0
  306. package/dist/sync/sync-backend.d.ts +105 -0
  307. package/dist/sync/sync-backend.d.ts.map +1 -0
  308. package/dist/sync/sync-backend.js +61 -0
  309. package/dist/sync/sync-backend.js.map +1 -0
  310. package/dist/sync/sync.d.ts +9 -86
  311. package/dist/sync/sync.d.ts.map +1 -1
  312. package/dist/sync/sync.js +2 -27
  313. package/dist/sync/sync.js.map +1 -1
  314. package/dist/sync/syncstate.d.ts +57 -44
  315. package/dist/sync/syncstate.d.ts.map +1 -1
  316. package/dist/sync/syncstate.js +50 -45
  317. package/dist/sync/syncstate.js.map +1 -1
  318. package/dist/sync/syncstate.test.js +83 -46
  319. package/dist/sync/syncstate.test.js.map +1 -1
  320. package/dist/sync/transport-chunking.d.ts +36 -0
  321. package/dist/sync/transport-chunking.d.ts.map +1 -0
  322. package/dist/sync/transport-chunking.js +56 -0
  323. package/dist/sync/transport-chunking.js.map +1 -0
  324. package/dist/sync/validate-push-payload.d.ts +2 -2
  325. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  326. package/dist/sync/validate-push-payload.js +6 -6
  327. package/dist/sync/validate-push-payload.js.map +1 -1
  328. package/dist/testing/event-factory.d.ts +68 -0
  329. package/dist/testing/event-factory.d.ts.map +1 -0
  330. package/dist/testing/event-factory.js +78 -0
  331. package/dist/testing/event-factory.js.map +1 -0
  332. package/dist/testing/mod.d.ts +2 -0
  333. package/dist/testing/mod.d.ts.map +1 -0
  334. package/dist/testing/mod.js +2 -0
  335. package/dist/testing/mod.js.map +1 -0
  336. package/dist/version.d.ts +16 -6
  337. package/dist/version.d.ts.map +1 -1
  338. package/dist/version.js +16 -6
  339. package/dist/version.js.map +1 -1
  340. package/package.json +7 -8
  341. package/src/ClientSessionLeaderThreadProxy.ts +20 -12
  342. package/src/adapter-types.ts +18 -6
  343. package/src/debug-info.ts +37 -6
  344. package/src/devtools/devtools-messages-client-session.ts +2 -2
  345. package/src/devtools/devtools-messages-common.ts +1 -8
  346. package/src/devtools/devtools-messages-leader.ts +9 -8
  347. package/src/devtools/devtools-sessioninfo.ts +8 -5
  348. package/src/devtools/mod.ts +11 -2
  349. package/src/errors.ts +38 -11
  350. package/src/index.ts +2 -1
  351. package/src/leader-thread/LeaderSyncProcessor.ts +277 -105
  352. package/src/leader-thread/eventlog.ts +113 -38
  353. package/src/leader-thread/leader-worker-devtools.ts +86 -55
  354. package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
  355. package/src/leader-thread/make-leader-thread-layer.ts +156 -37
  356. package/src/leader-thread/materialize-event.ts +37 -12
  357. package/src/leader-thread/mod.ts +1 -0
  358. package/src/leader-thread/recreate-db.ts +15 -7
  359. package/src/leader-thread/shutdown-channel.ts +16 -2
  360. package/src/leader-thread/stream-events.ts +201 -0
  361. package/src/leader-thread/types.ts +70 -20
  362. package/src/logging.ts +62 -0
  363. package/src/make-client-session.ts +9 -3
  364. package/src/materializer-helper.ts +27 -10
  365. package/src/otel.ts +10 -0
  366. package/src/rematerialize-from-eventlog.ts +37 -27
  367. package/src/schema/EventDef/define.ts +201 -0
  368. package/src/schema/EventDef/event-def.ts +120 -0
  369. package/src/schema/EventDef/facts.ts +135 -0
  370. package/src/schema/EventDef/materializer.ts +172 -0
  371. package/src/schema/EventDef/mod.ts +4 -0
  372. package/src/schema/EventSequenceNumber/client.ts +257 -0
  373. package/src/schema/EventSequenceNumber/global.ts +19 -0
  374. package/src/schema/EventSequenceNumber/mod.ts +37 -0
  375. package/src/schema/EventSequenceNumber.test.ts +70 -52
  376. package/src/schema/LiveStoreEvent/client.ts +221 -0
  377. package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
  378. package/src/schema/LiveStoreEvent/global.ts +45 -0
  379. package/src/schema/LiveStoreEvent/input.ts +63 -0
  380. package/src/schema/LiveStoreEvent/mod.ts +4 -0
  381. package/src/schema/events.ts +1 -1
  382. package/src/schema/mod.ts +6 -4
  383. package/src/schema/schema.ts +39 -3
  384. package/src/schema/state/sqlite/client-document-def.test.ts +19 -2
  385. package/src/schema/state/sqlite/client-document-def.ts +127 -25
  386. package/src/schema/state/sqlite/column-annotations.test.ts +1 -1
  387. package/src/schema/state/sqlite/column-annotations.ts +16 -6
  388. package/src/schema/state/sqlite/column-def.test.ts +62 -10
  389. package/src/schema/state/sqlite/column-def.ts +88 -21
  390. package/src/schema/state/sqlite/column-spec.test.ts +29 -16
  391. package/src/schema/state/sqlite/column-spec.ts +36 -11
  392. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +26 -6
  393. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +29 -12
  394. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +12 -17
  395. package/src/schema/state/sqlite/mod.ts +4 -3
  396. package/src/schema/state/sqlite/query-builder/api.ts +25 -11
  397. package/src/schema/state/sqlite/query-builder/astToSql.ts +23 -14
  398. package/src/schema/state/sqlite/query-builder/impl.test.ts +305 -92
  399. package/src/schema/state/sqlite/query-builder/impl.ts +8 -3
  400. package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
  401. package/src/schema/state/sqlite/schema-helpers.ts +28 -20
  402. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
  403. package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
  404. package/src/schema/state/sqlite/system-tables/state-tables.ts +69 -0
  405. package/src/schema/state/sqlite/table-def.test.ts +101 -0
  406. package/src/schema/state/sqlite/table-def.ts +8 -6
  407. package/src/schema/unknown-events.ts +131 -0
  408. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +86 -0
  409. package/src/schema-management/migrations.ts +41 -8
  410. package/src/schema-management/validate-schema.ts +3 -3
  411. package/src/sql-queries/sql-queries.ts +9 -1
  412. package/src/sql-queries/sql-query-builder.ts +2 -1
  413. package/src/sqlite-types.ts +3 -3
  414. package/src/sync/ClientSessionSyncProcessor.ts +69 -62
  415. package/src/sync/errors.ts +38 -0
  416. package/src/sync/index.ts +3 -0
  417. package/src/sync/mock-sync-backend.ts +184 -0
  418. package/src/sync/next/compact-events.ts +6 -7
  419. package/src/sync/next/facts.ts +7 -9
  420. package/src/sync/next/history-dag-common.ts +277 -26
  421. package/src/sync/next/history-dag.ts +16 -10
  422. package/src/sync/next/rebase-events.ts +11 -11
  423. package/src/sync/next/test/event-fixtures.ts +11 -11
  424. package/src/sync/sync-backend-kv.ts +22 -0
  425. package/src/sync/sync-backend.ts +185 -0
  426. package/src/sync/sync.ts +9 -91
  427. package/src/sync/syncstate.test.ts +96 -52
  428. package/src/sync/syncstate.ts +69 -58
  429. package/src/sync/transport-chunking.ts +90 -0
  430. package/src/sync/validate-push-payload.ts +8 -9
  431. package/src/testing/event-factory.ts +131 -0
  432. package/src/testing/mod.ts +1 -0
  433. package/src/version.ts +16 -6
  434. package/dist/schema/EventDef.d.ts +0 -123
  435. package/dist/schema/EventDef.d.ts.map +0 -1
  436. package/dist/schema/EventDef.js +0 -46
  437. package/dist/schema/EventDef.js.map +0 -1
  438. package/dist/schema/EventSequenceNumber.d.ts +0 -80
  439. package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
  440. package/dist/schema/EventSequenceNumber.js +0 -139
  441. package/dist/schema/EventSequenceNumber.js.map +0 -1
  442. package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
  443. package/dist/schema/LiveStoreEvent.js.map +0 -1
  444. package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
  445. package/dist/schema/state/sqlite/system-tables.js +0 -79
  446. package/dist/schema/state/sqlite/system-tables.js.map +0 -1
  447. package/dist/schema-management/migrations.test.d.ts +0 -2
  448. package/dist/schema-management/migrations.test.d.ts.map +0 -1
  449. package/dist/schema-management/migrations.test.js +0 -52
  450. package/dist/schema-management/migrations.test.js.map +0 -1
  451. package/dist/sync/next/graphology.d.ts +0 -8
  452. package/dist/sync/next/graphology.d.ts.map +0 -1
  453. package/dist/sync/next/graphology.js +0 -30
  454. package/dist/sync/next/graphology.js.map +0 -1
  455. package/dist/sync/next/graphology_.d.ts +0 -3
  456. package/dist/sync/next/graphology_.d.ts.map +0 -1
  457. package/dist/sync/next/graphology_.js +0 -3
  458. package/dist/sync/next/graphology_.js.map +0 -1
  459. package/src/schema/EventDef.ts +0 -219
  460. package/src/schema/EventSequenceNumber.ts +0 -199
  461. package/src/schema/LiveStoreEvent.ts +0 -287
  462. package/src/schema/state/sqlite/system-tables.ts +0 -104
  463. package/src/sync/next/ambient.d.ts +0 -3
  464. package/src/sync/next/graphology.ts +0 -41
  465. package/src/sync/next/graphology_.ts +0 -2
@@ -73,7 +73,15 @@ const issue = State.SQLite.table({
73
73
  ],
74
74
  })
75
75
 
76
- const db = { todos, todosWithIntId, comments, issue, UiState, UiStateWithDefaultId }
76
+ const selections = State.SQLite.table({
77
+ name: 'selections',
78
+ columns: {
79
+ id: State.SQLite.integer({ primaryKey: true }),
80
+ group: State.SQLite.text({}),
81
+ },
82
+ })
83
+
84
+ const db = { todos, todosWithIntId, comments, issue, selections, UiState, UiStateWithDefaultId }
77
85
 
78
86
  const dump = (qb: QueryBuilder<any, any, any>) => ({
79
87
  bindValues: qb.asSql().bindValues,
@@ -95,7 +103,7 @@ describe('query builder', () => {
95
103
  expect(dump(db.todos.select('id'))).toMatchInlineSnapshot(`
96
104
  {
97
105
  "bindValues": [],
98
- "query": "SELECT id FROM 'todos'",
106
+ "query": "SELECT "id" FROM 'todos'",
99
107
  "schema": "ReadonlyArray<({ readonly id: string } <-> string)>",
100
108
  }
101
109
  `)
@@ -103,7 +111,7 @@ describe('query builder', () => {
103
111
  expect(dump(db.todos.select('id', 'text'))).toMatchInlineSnapshot(`
104
112
  {
105
113
  "bindValues": [],
106
- "query": "SELECT id, text FROM 'todos'",
114
+ "query": "SELECT "id", "text" FROM 'todos'",
107
115
  "schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
108
116
  }
109
117
  `)
@@ -115,7 +123,7 @@ describe('query builder', () => {
115
123
  "bindValues": [
116
124
  1,
117
125
  ],
118
- "query": "SELECT id, text FROM 'todos' LIMIT ?",
126
+ "query": "SELECT "id", "text" FROM 'todos' LIMIT ?",
119
127
  "schema": "(ReadonlyArray<{ readonly id: string; readonly text: string } | undefined> <-> { readonly id: string; readonly text: string } | undefined)",
120
128
  }
121
129
  `)
@@ -125,7 +133,7 @@ describe('query builder', () => {
125
133
  "bindValues": [
126
134
  1,
127
135
  ],
128
- "query": "SELECT id, text FROM 'todos' LIMIT ?",
136
+ "query": "SELECT "id", "text" FROM 'todos' LIMIT ?",
129
137
  "schema": "(ReadonlyArray<{ readonly id: string; readonly text: string }> <-> { readonly id: string; readonly text: string })",
130
138
  }
131
139
  `)
@@ -137,7 +145,7 @@ describe('query builder', () => {
137
145
  "bindValues": [
138
146
  1,
139
147
  ],
140
- "query": "SELECT id, text FROM 'todos' LIMIT ?",
148
+ "query": "SELECT "id", "text" FROM 'todos' LIMIT ?",
141
149
  "schema": "(ReadonlyArray<{ readonly id: string; readonly text: string }> | readonly [undefined] <-> { readonly id: string; readonly text: string } | undefined)",
142
150
  }
143
151
  `)
@@ -149,7 +157,7 @@ describe('query builder', () => {
149
157
  "bindValues": [
150
158
  1,
151
159
  ],
152
- "query": "SELECT id, text FROM 'todos' WHERE completed = ?",
160
+ "query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ?",
153
161
  "schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
154
162
  }
155
163
  `)
@@ -158,7 +166,7 @@ describe('query builder', () => {
158
166
  "bindValues": [
159
167
  1,
160
168
  ],
161
- "query": "SELECT id, text FROM 'todos' WHERE completed != ?",
169
+ "query": "SELECT "id", "text" FROM 'todos' WHERE "completed" != ?",
162
170
  "schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
163
171
  }
164
172
  `)
@@ -167,51 +175,51 @@ describe('query builder', () => {
167
175
  "bindValues": [
168
176
  1,
169
177
  ],
170
- "query": "SELECT id, text FROM 'todos' WHERE completed = ?",
178
+ "query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ?",
171
179
  "schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
172
180
  }
173
181
  `)
174
182
  expect(dump(db.todos.select('id', 'text').where({ completed: undefined }))).toMatchInlineSnapshot(`
175
183
  {
176
184
  "bindValues": [],
177
- "query": "SELECT id, text FROM 'todos'",
185
+ "query": "SELECT "id", "text" FROM 'todos'",
178
186
  "schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
179
187
  }
180
188
  `)
181
189
  expect(
182
190
  dump(db.todos.select('id', 'text').where({ deletedAt: { op: '<=', value: new Date('2024-01-01') } })),
183
191
  ).toMatchInlineSnapshot(`
184
- {
185
- "bindValues": [
186
- "2024-01-01T00:00:00.000Z",
187
- ],
188
- "query": "SELECT id, text FROM 'todos' WHERE deletedAt <= ?",
189
- "schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
190
- }
191
- `)
192
+ {
193
+ "bindValues": [
194
+ "2024-01-01T00:00:00.000Z",
195
+ ],
196
+ "query": "SELECT "id", "text" FROM 'todos' WHERE "deletedAt" <= ?",
197
+ "schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
198
+ }
199
+ `)
192
200
  expect(
193
201
  dump(db.todos.select('id', 'text').where({ status: { op: 'IN', value: ['active'] } })),
194
202
  ).toMatchInlineSnapshot(`
195
- {
196
- "bindValues": [
197
- "active",
198
- ],
199
- "query": "SELECT id, text FROM 'todos' WHERE status IN (?)",
200
- "schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
201
- }
202
- `)
203
+ {
204
+ "bindValues": [
205
+ "active",
206
+ ],
207
+ "query": "SELECT "id", "text" FROM 'todos' WHERE "status" IN (?)",
208
+ "schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
209
+ }
210
+ `)
203
211
  expect(
204
212
  dump(db.todos.select('id', 'text').where({ status: { op: 'NOT IN', value: ['active', 'completed'] } })),
205
213
  ).toMatchInlineSnapshot(`
206
- {
207
- "bindValues": [
208
- "active",
209
- "completed",
210
- ],
211
- "query": "SELECT id, text FROM 'todos' WHERE status NOT IN (?, ?)",
212
- "schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
213
- }
214
- `)
214
+ {
215
+ "bindValues": [
216
+ "active",
217
+ "completed",
218
+ ],
219
+ "query": "SELECT "id", "text" FROM 'todos' WHERE "status" NOT IN (?, ?)",
220
+ "schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
221
+ }
222
+ `)
215
223
 
216
224
  expect(
217
225
  dump(
@@ -222,15 +230,15 @@ describe('query builder', () => {
222
230
  .where({ deletedAt: undefined }),
223
231
  ),
224
232
  ).toMatchInlineSnapshot(`
225
- {
226
- "bindValues": [
227
- 0,
228
- "active",
229
- ],
230
- "query": "SELECT id, text FROM 'todos' WHERE completed = ? AND status IN (?)",
231
- "schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
232
- }
233
- `)
233
+ {
234
+ "bindValues": [
235
+ 0,
236
+ "active",
237
+ ],
238
+ "query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? AND "status" IN (?)",
239
+ "schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
240
+ }
241
+ `)
234
242
  })
235
243
 
236
244
  it('should handle OFFSET and LIMIT clauses', () => {
@@ -241,7 +249,7 @@ describe('query builder', () => {
241
249
  10,
242
250
  10,
243
251
  ],
244
- "query": "SELECT id, text FROM 'todos' WHERE completed = ? OFFSET ? LIMIT ?",
252
+ "query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? LIMIT ? OFFSET ?",
245
253
  "schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
246
254
  }
247
255
  `)
@@ -253,10 +261,10 @@ describe('query builder', () => {
253
261
  {
254
262
  "bindValues": [
255
263
  1,
256
- 5,
257
264
  10,
265
+ 5,
258
266
  ],
259
- "query": "SELECT id, text FROM 'todos' WHERE completed = ? OFFSET ? LIMIT ?",
267
+ "query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? LIMIT ? OFFSET ?",
260
268
  "schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
261
269
  }
262
270
  `)
@@ -268,7 +276,7 @@ describe('query builder', () => {
268
276
  1,
269
277
  5,
270
278
  ],
271
- "query": "SELECT id, text FROM 'todos' WHERE completed = ? OFFSET ?",
279
+ "query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? OFFSET ?",
272
280
  "schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
273
281
  }
274
282
  `)
@@ -280,7 +288,7 @@ describe('query builder', () => {
280
288
  1,
281
289
  10,
282
290
  ],
283
- "query": "SELECT id, text FROM 'todos' WHERE completed = ? LIMIT ?",
291
+ "query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? LIMIT ?",
284
292
  "schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
285
293
  }
286
294
  `)
@@ -299,7 +307,7 @@ describe('query builder', () => {
299
307
  "bindValues": [
300
308
  1,
301
309
  ],
302
- "query": "SELECT COUNT(*) as count FROM 'todos' WHERE completed = ?",
310
+ "query": "SELECT COUNT(*) as count FROM 'todos' WHERE "completed" = ?",
303
311
  "schema": "(ReadonlyArray<({ readonly count: number } <-> number)> <-> number)",
304
312
  }
305
313
  `)
@@ -308,7 +316,7 @@ describe('query builder', () => {
308
316
  "bindValues": [
309
317
  1,
310
318
  ],
311
- "query": "SELECT COUNT(*) as count FROM 'todos' WHERE completed = ?",
319
+ "query": "SELECT COUNT(*) as count FROM 'todos' WHERE "completed" = ?",
312
320
  "schema": "(ReadonlyArray<({ readonly count: number } <-> number)> <-> number)",
313
321
  }
314
322
  `)
@@ -318,14 +326,14 @@ describe('query builder', () => {
318
326
  expect(dump(db.todos.select('id', 'text').where('deletedAt', '=', null))).toMatchInlineSnapshot(`
319
327
  {
320
328
  "bindValues": [],
321
- "query": "SELECT id, text FROM 'todos' WHERE deletedAt IS NULL",
329
+ "query": "SELECT "id", "text" FROM 'todos' WHERE "deletedAt" IS NULL",
322
330
  "schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
323
331
  }
324
332
  `)
325
333
  expect(dump(db.todos.select('id', 'text').where('deletedAt', '!=', null))).toMatchInlineSnapshot(`
326
334
  {
327
335
  "bindValues": [],
328
- "query": "SELECT id, text FROM 'todos' WHERE deletedAt IS NOT NULL",
336
+ "query": "SELECT "id", "text" FROM 'todos' WHERE "deletedAt" IS NOT NULL",
329
337
  "schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
330
338
  }
331
339
  `)
@@ -335,7 +343,7 @@ describe('query builder', () => {
335
343
  expect(dump(db.todos.orderBy('completed', 'desc'))).toMatchInlineSnapshot(`
336
344
  {
337
345
  "bindValues": [],
338
- "query": "SELECT * FROM 'todos' ORDER BY completed desc",
346
+ "query": "SELECT * FROM 'todos' ORDER BY "completed" desc",
339
347
  "schema": "ReadonlyArray<todos>",
340
348
  }
341
349
  `)
@@ -343,7 +351,7 @@ describe('query builder', () => {
343
351
  expect(dump(db.todos.orderBy([{ col: 'completed', direction: 'desc' }]))).toMatchInlineSnapshot(`
344
352
  {
345
353
  "bindValues": [],
346
- "query": "SELECT * FROM 'todos' ORDER BY completed desc",
354
+ "query": "SELECT * FROM 'todos' ORDER BY "completed" desc",
347
355
  "schema": "ReadonlyArray<todos>",
348
356
  }
349
357
  `)
@@ -402,23 +410,21 @@ describe('query builder', () => {
402
410
  "Buy milk",
403
411
  "active",
404
412
  ],
405
- "query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?)",
413
+ "query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?)",
406
414
  "schema": "number",
407
415
  }
408
416
  `)
409
417
  })
410
418
 
411
419
  it('should handle INSERT queries with undefined values', () => {
412
- expect(
413
- dump(db.todos.insert({ id: '123', text: 'Buy milk', status: 'active', completed: undefined })),
414
- ).toMatchInlineSnapshot(`
420
+ expect(dump(db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' }))).toMatchInlineSnapshot(`
415
421
  {
416
422
  "bindValues": [
417
423
  "123",
418
424
  "Buy milk",
419
425
  "active",
420
426
  ],
421
- "query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?)",
427
+ "query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?)",
422
428
  "schema": "number",
423
429
  }
424
430
  `)
@@ -449,7 +455,7 @@ describe('query builder', () => {
449
455
  "a2",
450
456
  "John Doe",
451
457
  ],
452
- "query": "INSERT INTO 'issue' (id, title, priority, created, modified, kanbanorder, creator) VALUES (?, ?, ?, ?, ?, ?, ?)",
458
+ "query": "INSERT INTO 'issue' ("id", "title", "priority", "created", "modified", "kanbanorder", "creator") VALUES (?, ?, ?, ?, ?, ?, ?)",
453
459
  "schema": "number",
454
460
  }
455
461
  `)
@@ -462,7 +468,7 @@ describe('query builder', () => {
462
468
  "completed",
463
469
  "123",
464
470
  ],
465
- "query": "UPDATE 'todos' SET status = ? WHERE id = ?",
471
+ "query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ?",
466
472
  "schema": "number",
467
473
  }
468
474
  `)
@@ -478,15 +484,13 @@ describe('query builder', () => {
478
484
  })
479
485
 
480
486
  it('should handle UPDATE queries with undefined values', () => {
481
- expect(
482
- dump(db.todos.update({ status: undefined, text: 'some text' }).where({ id: '123' })),
483
- ).toMatchInlineSnapshot(`
487
+ expect(dump(db.todos.update({ text: 'some text' }).where({ id: '123' }))).toMatchInlineSnapshot(`
484
488
  {
485
489
  "bindValues": [
486
490
  "some text",
487
491
  "123",
488
492
  ],
489
- "query": "UPDATE 'todos' SET text = ? WHERE id = ?",
493
+ "query": "UPDATE 'todos' SET "text" = ? WHERE "id" = ?",
490
494
  "schema": "number",
491
495
  }
492
496
  `)
@@ -500,7 +504,7 @@ describe('query builder', () => {
500
504
  "John Doe",
501
505
  1,
502
506
  ],
503
- "query": "UPDATE 'issue' SET priority = ?, creator = ? WHERE id = ?",
507
+ "query": "UPDATE 'issue' SET "priority" = ?, "creator" = ? WHERE "id" = ?",
504
508
  "schema": "number",
505
509
  }
506
510
  `)
@@ -512,7 +516,7 @@ describe('query builder', () => {
512
516
  "bindValues": [
513
517
  "completed",
514
518
  ],
515
- "query": "DELETE FROM 'todos' WHERE status = ?",
519
+ "query": "DELETE FROM 'todos' WHERE "status" = ?",
516
520
  "schema": "number",
517
521
  }
518
522
  `)
@@ -528,7 +532,7 @@ describe('query builder', () => {
528
532
  "Buy milk",
529
533
  "active",
530
534
  ],
531
- "query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?) ON CONFLICT (id) DO NOTHING",
535
+ "query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) ON CONFLICT ("id") DO NOTHING",
532
536
  "schema": "number",
533
537
  }
534
538
  `)
@@ -548,7 +552,7 @@ describe('query builder', () => {
548
552
  "Buy soy milk",
549
553
  "active",
550
554
  ],
551
- "query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?) ON CONFLICT (id) DO UPDATE SET text = ?, status = ?",
555
+ "query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) ON CONFLICT ("id") DO UPDATE SET "text" = ?, "status" = ?",
552
556
  "schema": "number",
553
557
  }
554
558
  `)
@@ -562,7 +566,31 @@ describe('query builder', () => {
562
566
  "Buy milk",
563
567
  "active",
564
568
  ],
565
- "query": "INSERT OR REPLACE INTO 'todos' (id, text, status) VALUES (?, ?, ?)",
569
+ "query": "INSERT OR REPLACE INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?)",
570
+ "schema": "number",
571
+ }
572
+ `)
573
+ })
574
+
575
+ it('should quote reserved column names', () => {
576
+ expect(dump(db.selections.insert({ id: 1, group: 'alpha' }).onConflict('id', 'ignore'))).toMatchInlineSnapshot(`
577
+ {
578
+ "bindValues": [
579
+ 1,
580
+ "alpha",
581
+ ],
582
+ "query": "INSERT INTO 'selections' ("id", "group") VALUES (?, ?) ON CONFLICT ("id") DO NOTHING",
583
+ "schema": "number",
584
+ }
585
+ `)
586
+
587
+ expect(dump(db.selections.update({ group: 'beta' }).where({ id: 1 }))).toMatchInlineSnapshot(`
588
+ {
589
+ "bindValues": [
590
+ "beta",
591
+ 1,
592
+ ],
593
+ "query": "UPDATE 'selections' SET "group" = ? WHERE "id" = ?",
566
594
  "schema": "number",
567
595
  }
568
596
  `)
@@ -578,7 +606,7 @@ describe('query builder', () => {
578
606
  "Buy milk",
579
607
  "active",
580
608
  ],
581
- "query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?) ON CONFLICT (id, status) DO NOTHING",
609
+ "query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) ON CONFLICT ("id", "status") DO NOTHING",
582
610
  "schema": "number",
583
611
  }
584
612
  `)
@@ -588,40 +616,225 @@ describe('query builder', () => {
588
616
  expect(
589
617
  dump(db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' }).returning('id')),
590
618
  ).toMatchInlineSnapshot(`
591
- {
592
- "bindValues": [
593
- "123",
594
- "Buy milk",
595
- "active",
596
- ],
597
- "query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?) RETURNING id",
598
- "schema": "ReadonlyArray<{ readonly id: string }>",
599
- }
600
- `)
619
+ {
620
+ "bindValues": [
621
+ "123",
622
+ "Buy milk",
623
+ "active",
624
+ ],
625
+ "query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) RETURNING "id"",
626
+ "schema": "ReadonlyArray<{ readonly id: string }>",
627
+ }
628
+ `)
601
629
 
602
630
  expect(
603
631
  dump(db.todos.update({ status: 'completed' }).where({ id: '123' }).returning('id')),
604
632
  ).toMatchInlineSnapshot(`
605
- {
606
- "bindValues": [
607
- "completed",
608
- "123",
609
- ],
610
- "query": "UPDATE 'todos' SET status = ? WHERE id = ? RETURNING id",
611
- "schema": "ReadonlyArray<{ readonly id: string }>",
612
- }
613
- `)
633
+ {
634
+ "bindValues": [
635
+ "completed",
636
+ "123",
637
+ ],
638
+ "query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ? RETURNING "id"",
639
+ "schema": "ReadonlyArray<{ readonly id: string }>",
640
+ }
641
+ `)
614
642
 
615
643
  expect(dump(db.todos.delete().where({ status: 'completed' }).returning('id'))).toMatchInlineSnapshot(`
616
644
  {
617
645
  "bindValues": [
618
646
  "completed",
619
647
  ],
620
- "query": "DELETE FROM 'todos' WHERE status = ? RETURNING id",
648
+ "query": "DELETE FROM 'todos' WHERE "status" = ? RETURNING "id"",
621
649
  "schema": "ReadonlyArray<{ readonly id: string }>",
622
650
  }
623
651
  `)
624
652
  })
653
+
654
+ it('should handle where().delete() - preserving where clauses', () => {
655
+ expect(dump(db.todos.where({ status: 'completed' }).delete())).toMatchInlineSnapshot(`
656
+ {
657
+ "bindValues": [
658
+ "completed",
659
+ ],
660
+ "query": "DELETE FROM 'todos' WHERE "status" = ?",
661
+ "schema": "number",
662
+ }
663
+ `)
664
+
665
+ // Multiple where clauses
666
+ expect(dump(db.todos.where({ status: 'completed' }).where({ deletedAt: null }).delete())).toMatchInlineSnapshot(`
667
+ {
668
+ "bindValues": [
669
+ "completed",
670
+ ],
671
+ "query": "DELETE FROM 'todos' WHERE "status" = ? AND "deletedAt" IS NULL",
672
+ "schema": "number",
673
+ }
674
+ `)
675
+ })
676
+
677
+ it('should handle where().update() - preserving where clauses', () => {
678
+ expect(dump(db.todos.where({ id: '123' }).update({ status: 'completed' }))).toMatchInlineSnapshot(`
679
+ {
680
+ "bindValues": [
681
+ "completed",
682
+ "123",
683
+ ],
684
+ "query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ?",
685
+ "schema": "number",
686
+ }
687
+ `)
688
+
689
+ // Multiple where clauses
690
+ expect(
691
+ dump(db.todos.where({ id: '123' }).where({ deletedAt: null }).update({ status: 'completed' })),
692
+ ).toMatchInlineSnapshot(`
693
+ {
694
+ "bindValues": [
695
+ "completed",
696
+ "123",
697
+ ],
698
+ "query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ? AND "deletedAt" IS NULL",
699
+ "schema": "number",
700
+ }
701
+ `)
702
+ })
703
+
704
+ it('should have equivalent behavior for both delete patterns', () => {
705
+ const pattern1 = dump(db.todos.where({ status: 'completed', id: '123' }).delete())
706
+ const pattern2 = dump(db.todos.delete().where({ status: 'completed', id: '123' }))
707
+
708
+ expect(pattern1).toEqual(pattern2)
709
+ })
710
+
711
+ it('should have equivalent behavior for both update patterns', () => {
712
+ const pattern1 = dump(db.todos.where({ id: '123' }).update({ status: 'completed', text: 'Updated' }))
713
+ const pattern2 = dump(db.todos.update({ status: 'completed', text: 'Updated' }).where({ id: '123' }))
714
+
715
+ expect(pattern1).toEqual(pattern2)
716
+ })
717
+ })
718
+
719
+ describe('schema transforms', () => {
720
+ const Flat = Schema.Struct({
721
+ id: Schema.String.pipe(State.SQLite.withPrimaryKey),
722
+ contactFirstName: Schema.String,
723
+ contactLastName: Schema.String,
724
+ contactEmail: Schema.String.pipe(State.SQLite.withUnique),
725
+ })
726
+
727
+ const Nested = Schema.transform(
728
+ Flat,
729
+ Schema.Struct({
730
+ id: Schema.String,
731
+ contact: Schema.Struct({
732
+ firstName: Schema.String,
733
+ lastName: Schema.String,
734
+ email: Schema.String,
735
+ }),
736
+ }),
737
+ {
738
+ decode: ({ id, contactFirstName, contactLastName, contactEmail }) => ({
739
+ id,
740
+ contact: {
741
+ firstName: contactFirstName,
742
+ lastName: contactLastName,
743
+ email: contactEmail,
744
+ },
745
+ }),
746
+ encode: ({ id, contact }) => ({
747
+ id,
748
+ contactFirstName: contact.firstName,
749
+ contactLastName: contact.lastName,
750
+ contactEmail: contact.email,
751
+ }),
752
+ },
753
+ )
754
+
755
+ const makeContactsTable = () =>
756
+ State.SQLite.table({
757
+ name: 'contacts',
758
+ schema: Nested,
759
+ // schema: Flat,
760
+ })
761
+
762
+ it('exposes flattened insert type while schema type is nested', () => {
763
+ const contactsTable = makeContactsTable()
764
+
765
+ type InsertInput = Parameters<(typeof contactsTable)['insert']>[0]
766
+ type NestedType = Schema.Schema.Type<typeof Nested>
767
+
768
+ type Assert<T extends true> = T
769
+
770
+ type InsertKeys = keyof InsertInput
771
+ type NestedKeys = keyof NestedType
772
+
773
+ type _InsertHasFlattenedColumns = Assert<
774
+ 'contactFirstName' extends InsertKeys
775
+ ? 'contactLastName' extends InsertKeys
776
+ ? 'contactEmail' extends InsertKeys
777
+ ? true
778
+ : false
779
+ : false
780
+ : false
781
+ >
782
+
783
+ type _InsertDoesNotExposeNested = Assert<Extract<'contact', InsertKeys> extends never ? true : false>
784
+
785
+ type _SchemaTypeIsNested = Assert<'contact' extends NestedKeys ? true : false>
786
+
787
+ void contactsTable
788
+ })
789
+
790
+ it('fails to encode nested inserts because flat columns are required', () => {
791
+ const contactsTable = makeContactsTable()
792
+
793
+ expect(
794
+ contactsTable
795
+ // TODO in the future we should use decoded types here instead of encoded
796
+ .insert({
797
+ id: 'person-1',
798
+ contactFirstName: 'Ada',
799
+ contactLastName: 'Lovelace',
800
+ contactEmail: 'ada@example.com',
801
+ })
802
+ .asSql(),
803
+ ).toMatchInlineSnapshot(`
804
+ {
805
+ "bindValues": [
806
+ "person-1",
807
+ "Ada",
808
+ "Lovelace",
809
+ "ada@example.com",
810
+ ],
811
+ "query": "INSERT INTO 'contacts' ("id", "contactFirstName", "contactLastName", "contactEmail") VALUES (?, ?, ?, ?)",
812
+ "usedTables": Set {
813
+ "contacts",
814
+ },
815
+ }
816
+ `)
817
+ })
818
+
819
+ it('fails to encode nested inserts because flat columns are required', () => {
820
+ const contactsTable = makeContactsTable()
821
+
822
+ expect(() =>
823
+ contactsTable
824
+ .insert({
825
+ id: 'person-1',
826
+ // @ts-expect-error
827
+ contact: {
828
+ firstName: 'Ada',
829
+ lastName: 'Lovelace',
830
+ email: 'ada@example.com',
831
+ },
832
+ })
833
+ .asSql(),
834
+ ).toThrowErrorMatchingInlineSnapshot(`
835
+ [ParseError: contacts\n└─ ["contactFirstName"]\n └─ is missing]
836
+ `)
837
+ })
625
838
  })
626
839
  })
627
840