@livestore/common 0.3.0-dev.9 → 0.3.1-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 (479) hide show
  1. package/LICENSE +201 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/fixture.d.ts +83 -221
  4. package/dist/__tests__/fixture.d.ts.map +1 -1
  5. package/dist/__tests__/fixture.js +33 -11
  6. package/dist/__tests__/fixture.js.map +1 -1
  7. package/dist/adapter-types.d.ts +120 -64
  8. package/dist/adapter-types.d.ts.map +1 -1
  9. package/dist/adapter-types.js +39 -8
  10. package/dist/adapter-types.js.map +1 -1
  11. package/dist/bounded-collections.d.ts.map +1 -1
  12. package/dist/debug-info.d.ts +1 -1
  13. package/dist/debug-info.d.ts.map +1 -1
  14. package/dist/debug-info.js +1 -0
  15. package/dist/debug-info.js.map +1 -1
  16. package/dist/devtools/devtools-messages-client-session.d.ts +390 -0
  17. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -0
  18. package/dist/devtools/devtools-messages-client-session.js +97 -0
  19. package/dist/devtools/devtools-messages-client-session.js.map +1 -0
  20. package/dist/devtools/devtools-messages-common.d.ts +68 -0
  21. package/dist/devtools/devtools-messages-common.d.ts.map +1 -0
  22. package/dist/devtools/devtools-messages-common.js +60 -0
  23. package/dist/devtools/devtools-messages-common.js.map +1 -0
  24. package/dist/devtools/devtools-messages-leader.d.ts +394 -0
  25. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -0
  26. package/dist/devtools/devtools-messages-leader.js +147 -0
  27. package/dist/devtools/devtools-messages-leader.js.map +1 -0
  28. package/dist/devtools/devtools-messages.d.ts +3 -580
  29. package/dist/devtools/devtools-messages.d.ts.map +1 -1
  30. package/dist/devtools/devtools-messages.js +3 -174
  31. package/dist/devtools/devtools-messages.js.map +1 -1
  32. package/dist/devtools/devtools-sessioninfo.d.ts +32 -0
  33. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -0
  34. package/dist/devtools/devtools-sessioninfo.js +36 -0
  35. package/dist/devtools/devtools-sessioninfo.js.map +1 -0
  36. package/dist/devtools/mod.d.ts +55 -0
  37. package/dist/devtools/mod.d.ts.map +1 -0
  38. package/dist/devtools/mod.js +33 -0
  39. package/dist/devtools/mod.js.map +1 -0
  40. package/dist/index.d.ts +7 -9
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +7 -9
  43. package/dist/index.js.map +1 -1
  44. package/dist/leader-thread/LeaderSyncProcessor.d.ts +36 -11
  45. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  46. package/dist/leader-thread/LeaderSyncProcessor.js +426 -252
  47. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  48. package/dist/leader-thread/connection.d.ts +34 -6
  49. package/dist/leader-thread/connection.d.ts.map +1 -1
  50. package/dist/leader-thread/connection.js +22 -7
  51. package/dist/leader-thread/connection.js.map +1 -1
  52. package/dist/leader-thread/eventlog.d.ts +27 -0
  53. package/dist/leader-thread/eventlog.d.ts.map +1 -0
  54. package/dist/leader-thread/eventlog.js +119 -0
  55. package/dist/leader-thread/eventlog.js.map +1 -0
  56. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  57. package/dist/leader-thread/leader-worker-devtools.js +155 -80
  58. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  59. package/dist/leader-thread/make-leader-thread-layer.d.ts +22 -9
  60. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  61. package/dist/leader-thread/make-leader-thread-layer.js +67 -45
  62. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  63. package/dist/leader-thread/materialize-event.d.ts +16 -0
  64. package/dist/leader-thread/materialize-event.d.ts.map +1 -0
  65. package/dist/leader-thread/materialize-event.js +109 -0
  66. package/dist/leader-thread/materialize-event.js.map +1 -0
  67. package/dist/leader-thread/mod.d.ts +1 -1
  68. package/dist/leader-thread/mod.d.ts.map +1 -1
  69. package/dist/leader-thread/mod.js +1 -1
  70. package/dist/leader-thread/mod.js.map +1 -1
  71. package/dist/leader-thread/recreate-db.d.ts +4 -2
  72. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  73. package/dist/leader-thread/recreate-db.js +28 -32
  74. package/dist/leader-thread/recreate-db.js.map +1 -1
  75. package/dist/leader-thread/shutdown-channel.d.ts +2 -5
  76. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  77. package/dist/leader-thread/shutdown-channel.js +2 -4
  78. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  79. package/dist/leader-thread/types.d.ts +79 -38
  80. package/dist/leader-thread/types.d.ts.map +1 -1
  81. package/dist/leader-thread/types.js +1 -3
  82. package/dist/leader-thread/types.js.map +1 -1
  83. package/dist/make-client-session.d.ts +23 -0
  84. package/dist/make-client-session.d.ts.map +1 -0
  85. package/dist/make-client-session.js +57 -0
  86. package/dist/make-client-session.js.map +1 -0
  87. package/dist/materializer-helper.d.ts +23 -0
  88. package/dist/materializer-helper.d.ts.map +1 -0
  89. package/dist/materializer-helper.js +86 -0
  90. package/dist/materializer-helper.js.map +1 -0
  91. package/dist/otel.d.ts +2 -0
  92. package/dist/otel.d.ts.map +1 -1
  93. package/dist/otel.js +5 -0
  94. package/dist/otel.js.map +1 -1
  95. package/dist/rematerialize-from-eventlog.d.ts +14 -0
  96. package/dist/rematerialize-from-eventlog.d.ts.map +1 -0
  97. package/dist/rematerialize-from-eventlog.js +64 -0
  98. package/dist/rematerialize-from-eventlog.js.map +1 -0
  99. package/dist/schema/EventDef.d.ts +146 -0
  100. package/dist/schema/EventDef.d.ts.map +1 -0
  101. package/dist/schema/EventDef.js +58 -0
  102. package/dist/schema/EventDef.js.map +1 -0
  103. package/dist/schema/EventSequenceNumber.d.ts +57 -0
  104. package/dist/schema/EventSequenceNumber.d.ts.map +1 -0
  105. package/dist/schema/EventSequenceNumber.js +82 -0
  106. package/dist/schema/EventSequenceNumber.js.map +1 -0
  107. package/dist/schema/EventSequenceNumber.test.d.ts +2 -0
  108. package/dist/schema/EventSequenceNumber.test.d.ts.map +1 -0
  109. package/dist/schema/EventSequenceNumber.test.js +11 -0
  110. package/dist/schema/EventSequenceNumber.test.js.map +1 -0
  111. package/dist/schema/LiveStoreEvent.d.ts +257 -0
  112. package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
  113. package/dist/schema/LiveStoreEvent.js +117 -0
  114. package/dist/schema/LiveStoreEvent.js.map +1 -0
  115. package/dist/schema/events.d.ts +2 -0
  116. package/dist/schema/events.d.ts.map +1 -0
  117. package/dist/schema/events.js +2 -0
  118. package/dist/schema/events.js.map +1 -0
  119. package/dist/schema/mod.d.ts +8 -6
  120. package/dist/schema/mod.d.ts.map +1 -1
  121. package/dist/schema/mod.js +8 -6
  122. package/dist/schema/mod.js.map +1 -1
  123. package/dist/schema/schema.d.ts +50 -32
  124. package/dist/schema/schema.d.ts.map +1 -1
  125. package/dist/schema/schema.js +36 -43
  126. package/dist/schema/schema.js.map +1 -1
  127. package/dist/schema/state/mod.d.ts +3 -0
  128. package/dist/schema/state/mod.d.ts.map +1 -0
  129. package/dist/schema/state/mod.js +3 -0
  130. package/dist/schema/state/mod.js.map +1 -0
  131. package/dist/schema/state/sqlite/client-document-def.d.ts +223 -0
  132. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -0
  133. package/dist/schema/state/sqlite/client-document-def.js +170 -0
  134. package/dist/schema/state/sqlite/client-document-def.js.map +1 -0
  135. package/dist/schema/state/sqlite/client-document-def.test.d.ts +2 -0
  136. package/dist/schema/state/sqlite/client-document-def.test.d.ts.map +1 -0
  137. package/dist/schema/state/sqlite/client-document-def.test.js +201 -0
  138. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -0
  139. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +69 -0
  140. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -0
  141. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +71 -0
  142. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -0
  143. package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts +3 -0
  144. package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts.map +1 -0
  145. package/dist/schema/state/sqlite/db-schema/ast/validate.js +12 -0
  146. package/dist/schema/state/sqlite/db-schema/ast/validate.js.map +1 -0
  147. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +90 -0
  148. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -0
  149. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +87 -0
  150. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -0
  151. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.d.ts +2 -0
  152. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.d.ts.map +1 -0
  153. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +29 -0
  154. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -0
  155. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +90 -0
  156. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -0
  157. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +41 -0
  158. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -0
  159. package/dist/schema/state/sqlite/db-schema/hash.d.ts +2 -0
  160. package/dist/schema/state/sqlite/db-schema/hash.d.ts.map +1 -0
  161. package/dist/schema/state/sqlite/db-schema/hash.js +14 -0
  162. package/dist/schema/state/sqlite/db-schema/hash.js.map +1 -0
  163. package/dist/schema/state/sqlite/db-schema/mod.d.ts +3 -0
  164. package/dist/schema/state/sqlite/db-schema/mod.d.ts.map +1 -0
  165. package/dist/schema/state/sqlite/db-schema/mod.js +3 -0
  166. package/dist/schema/state/sqlite/db-schema/mod.js.map +1 -0
  167. package/dist/schema/state/sqlite/mod.d.ts +17 -0
  168. package/dist/schema/state/sqlite/mod.d.ts.map +1 -0
  169. package/dist/schema/state/sqlite/mod.js +41 -0
  170. package/dist/schema/state/sqlite/mod.js.map +1 -0
  171. package/dist/schema/state/sqlite/query-builder/api.d.ts +294 -0
  172. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -0
  173. package/dist/schema/state/sqlite/query-builder/api.js +6 -0
  174. package/dist/schema/state/sqlite/query-builder/api.js.map +1 -0
  175. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts +7 -0
  176. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -0
  177. package/dist/schema/state/sqlite/query-builder/astToSql.js +190 -0
  178. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -0
  179. package/dist/schema/state/sqlite/query-builder/impl.d.ts +7 -0
  180. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -0
  181. package/dist/schema/state/sqlite/query-builder/impl.js +286 -0
  182. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -0
  183. package/dist/schema/state/sqlite/query-builder/impl.test.d.ts +87 -0
  184. package/dist/schema/state/sqlite/query-builder/impl.test.d.ts.map +1 -0
  185. package/dist/schema/state/sqlite/query-builder/impl.test.js +563 -0
  186. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -0
  187. package/dist/{query-builder → schema/state/sqlite/query-builder}/mod.d.ts +7 -0
  188. package/dist/schema/state/sqlite/query-builder/mod.d.ts.map +1 -0
  189. package/dist/{query-builder → schema/state/sqlite/query-builder}/mod.js +7 -0
  190. package/dist/schema/state/sqlite/query-builder/mod.js.map +1 -0
  191. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -0
  192. package/dist/schema/{schema-helpers.js → state/sqlite/schema-helpers.js} +1 -1
  193. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -0
  194. package/dist/schema/state/sqlite/system-tables.d.ts +574 -0
  195. package/dist/schema/state/sqlite/system-tables.d.ts.map +1 -0
  196. package/dist/schema/state/sqlite/system-tables.js +88 -0
  197. package/dist/schema/state/sqlite/system-tables.js.map +1 -0
  198. package/dist/schema/state/sqlite/table-def.d.ts +84 -0
  199. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -0
  200. package/dist/schema/state/sqlite/table-def.js +36 -0
  201. package/dist/schema/state/sqlite/table-def.js.map +1 -0
  202. package/dist/schema-management/common.d.ts +7 -7
  203. package/dist/schema-management/common.d.ts.map +1 -1
  204. package/dist/schema-management/common.js.map +1 -1
  205. package/dist/schema-management/migrations.d.ts +6 -6
  206. package/dist/schema-management/migrations.d.ts.map +1 -1
  207. package/dist/schema-management/migrations.js +27 -18
  208. package/dist/schema-management/migrations.js.map +1 -1
  209. package/dist/schema-management/validate-schema.d.ts +8 -0
  210. package/dist/schema-management/validate-schema.d.ts.map +1 -0
  211. package/dist/schema-management/validate-schema.js +39 -0
  212. package/dist/schema-management/validate-schema.js.map +1 -0
  213. package/dist/sql-queries/misc.d.ts.map +1 -1
  214. package/dist/sql-queries/sql-queries.d.ts +1 -1
  215. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  216. package/dist/sql-queries/sql-queries.js.map +1 -1
  217. package/dist/sql-queries/sql-query-builder.d.ts +1 -1
  218. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  219. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  220. package/dist/sql-queries/types.d.ts +2 -1
  221. package/dist/sql-queries/types.d.ts.map +1 -1
  222. package/dist/sql-queries/types.js.map +1 -1
  223. package/dist/sync/ClientSessionSyncProcessor.d.ts +40 -19
  224. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  225. package/dist/sync/ClientSessionSyncProcessor.js +149 -73
  226. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  227. package/dist/sync/next/compact-events.d.ts.map +1 -1
  228. package/dist/sync/next/compact-events.js +38 -35
  229. package/dist/sync/next/compact-events.js.map +1 -1
  230. package/dist/sync/next/facts.d.ts +21 -21
  231. package/dist/sync/next/facts.d.ts.map +1 -1
  232. package/dist/sync/next/facts.js +11 -11
  233. package/dist/sync/next/facts.js.map +1 -1
  234. package/dist/sync/next/history-dag-common.d.ts +9 -7
  235. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  236. package/dist/sync/next/history-dag-common.js +10 -5
  237. package/dist/sync/next/history-dag-common.js.map +1 -1
  238. package/dist/sync/next/history-dag.d.ts +0 -2
  239. package/dist/sync/next/history-dag.d.ts.map +1 -1
  240. package/dist/sync/next/history-dag.js +16 -14
  241. package/dist/sync/next/history-dag.js.map +1 -1
  242. package/dist/sync/next/rebase-events.d.ts +10 -8
  243. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  244. package/dist/sync/next/rebase-events.js +18 -10
  245. package/dist/sync/next/rebase-events.js.map +1 -1
  246. package/dist/sync/next/test/compact-events.calculator.test.js +39 -34
  247. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  248. package/dist/sync/next/test/compact-events.test.js +77 -77
  249. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  250. package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +35 -25
  251. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
  252. package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +83 -38
  253. package/dist/sync/next/test/event-fixtures.js.map +1 -0
  254. package/dist/sync/next/test/mod.d.ts +1 -1
  255. package/dist/sync/next/test/mod.d.ts.map +1 -1
  256. package/dist/sync/next/test/mod.js +1 -1
  257. package/dist/sync/next/test/mod.js.map +1 -1
  258. package/dist/sync/sync.d.ts +46 -21
  259. package/dist/sync/sync.d.ts.map +1 -1
  260. package/dist/sync/sync.js +10 -6
  261. package/dist/sync/sync.js.map +1 -1
  262. package/dist/sync/syncstate.d.ts +193 -84
  263. package/dist/sync/syncstate.d.ts.map +1 -1
  264. package/dist/sync/syncstate.js +305 -151
  265. package/dist/sync/syncstate.js.map +1 -1
  266. package/dist/sync/syncstate.test.js +267 -303
  267. package/dist/sync/syncstate.test.js.map +1 -1
  268. package/dist/sync/validate-push-payload.d.ts +2 -2
  269. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  270. package/dist/sync/validate-push-payload.js +4 -4
  271. package/dist/sync/validate-push-payload.js.map +1 -1
  272. package/dist/util.d.ts +2 -2
  273. package/dist/util.d.ts.map +1 -1
  274. package/dist/version.d.ts +3 -3
  275. package/dist/version.js +3 -3
  276. package/package.json +11 -4
  277. package/src/__tests__/fixture.ts +36 -15
  278. package/src/adapter-types.ts +107 -68
  279. package/src/debug-info.ts +1 -0
  280. package/src/devtools/devtools-messages-client-session.ts +142 -0
  281. package/src/devtools/devtools-messages-common.ts +115 -0
  282. package/src/devtools/devtools-messages-leader.ts +191 -0
  283. package/src/devtools/devtools-messages.ts +3 -246
  284. package/src/devtools/devtools-sessioninfo.ts +101 -0
  285. package/src/devtools/mod.ts +59 -0
  286. package/src/index.ts +7 -9
  287. package/src/leader-thread/LeaderSyncProcessor.ts +664 -394
  288. package/src/leader-thread/connection.ts +54 -9
  289. package/src/leader-thread/eventlog.ts +199 -0
  290. package/src/leader-thread/leader-worker-devtools.ts +227 -104
  291. package/src/leader-thread/make-leader-thread-layer.ts +121 -72
  292. package/src/leader-thread/materialize-event.ts +173 -0
  293. package/src/leader-thread/mod.ts +1 -1
  294. package/src/leader-thread/recreate-db.ts +33 -38
  295. package/src/leader-thread/shutdown-channel.ts +2 -4
  296. package/src/leader-thread/types.ts +84 -46
  297. package/src/make-client-session.ts +136 -0
  298. package/src/materializer-helper.ts +138 -0
  299. package/src/otel.ts +8 -0
  300. package/src/rematerialize-from-eventlog.ts +117 -0
  301. package/src/schema/EventDef.ts +227 -0
  302. package/src/schema/EventSequenceNumber.test.ts +12 -0
  303. package/src/schema/EventSequenceNumber.ts +121 -0
  304. package/src/schema/LiveStoreEvent.ts +240 -0
  305. package/src/schema/events.ts +1 -0
  306. package/src/schema/mod.ts +8 -6
  307. package/src/schema/schema.ts +88 -84
  308. package/src/schema/state/mod.ts +2 -0
  309. package/src/schema/state/sqlite/client-document-def.test.ts +238 -0
  310. package/src/schema/state/sqlite/client-document-def.ts +444 -0
  311. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +142 -0
  312. package/src/schema/state/sqlite/db-schema/ast/validate.ts +13 -0
  313. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +206 -0
  314. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -0
  315. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +242 -0
  316. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +222 -0
  317. package/src/schema/state/sqlite/db-schema/hash.ts +14 -0
  318. package/src/schema/state/sqlite/db-schema/mod.ts +2 -0
  319. package/src/schema/state/sqlite/mod.ts +73 -0
  320. package/src/schema/state/sqlite/query-builder/api.ts +440 -0
  321. package/src/schema/state/sqlite/query-builder/astToSql.ts +232 -0
  322. package/src/schema/state/sqlite/query-builder/impl.test.ts +617 -0
  323. package/src/schema/state/sqlite/query-builder/impl.ts +351 -0
  324. package/src/{query-builder → schema/state/sqlite/query-builder}/mod.ts +7 -0
  325. package/src/schema/{schema-helpers.ts → state/sqlite/schema-helpers.ts} +1 -1
  326. package/src/schema/state/sqlite/system-tables.ts +117 -0
  327. package/src/schema/state/sqlite/table-def.ts +197 -0
  328. package/src/schema-management/common.ts +7 -7
  329. package/src/schema-management/migrations.ts +37 -31
  330. package/src/schema-management/validate-schema.ts +61 -0
  331. package/src/sql-queries/sql-queries.ts +1 -1
  332. package/src/sql-queries/sql-query-builder.ts +1 -2
  333. package/src/sql-queries/types.ts +3 -1
  334. package/src/sync/ClientSessionSyncProcessor.ts +218 -94
  335. package/src/sync/next/compact-events.ts +38 -35
  336. package/src/sync/next/facts.ts +43 -41
  337. package/src/sync/next/history-dag-common.ts +17 -10
  338. package/src/sync/next/history-dag.ts +16 -17
  339. package/src/sync/next/rebase-events.ts +29 -17
  340. package/src/sync/next/test/compact-events.calculator.test.ts +46 -46
  341. package/src/sync/next/test/compact-events.test.ts +79 -79
  342. package/src/sync/next/test/event-fixtures.ts +228 -0
  343. package/src/sync/next/test/mod.ts +1 -1
  344. package/src/sync/sync.ts +46 -21
  345. package/src/sync/syncstate.test.ts +312 -345
  346. package/src/sync/syncstate.ts +414 -224
  347. package/src/sync/validate-push-payload.ts +6 -6
  348. package/src/version.ts +3 -3
  349. package/dist/derived-mutations.d.ts +0 -109
  350. package/dist/derived-mutations.d.ts.map +0 -1
  351. package/dist/derived-mutations.js +0 -54
  352. package/dist/derived-mutations.js.map +0 -1
  353. package/dist/derived-mutations.test.d.ts +0 -2
  354. package/dist/derived-mutations.test.d.ts.map +0 -1
  355. package/dist/derived-mutations.test.js +0 -93
  356. package/dist/derived-mutations.test.js.map +0 -1
  357. package/dist/devtools/devtools-bridge.d.ts +0 -13
  358. package/dist/devtools/devtools-bridge.d.ts.map +0 -1
  359. package/dist/devtools/devtools-bridge.js +0 -2
  360. package/dist/devtools/devtools-bridge.js.map +0 -1
  361. package/dist/devtools/devtools-window-message.d.ts +0 -29
  362. package/dist/devtools/devtools-window-message.d.ts.map +0 -1
  363. package/dist/devtools/devtools-window-message.js +0 -33
  364. package/dist/devtools/devtools-window-message.js.map +0 -1
  365. package/dist/devtools/index.d.ts +0 -42
  366. package/dist/devtools/index.d.ts.map +0 -1
  367. package/dist/devtools/index.js +0 -48
  368. package/dist/devtools/index.js.map +0 -1
  369. package/dist/init-singleton-tables.d.ts +0 -4
  370. package/dist/init-singleton-tables.d.ts.map +0 -1
  371. package/dist/init-singleton-tables.js +0 -16
  372. package/dist/init-singleton-tables.js.map +0 -1
  373. package/dist/leader-thread/apply-mutation.d.ts +0 -11
  374. package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
  375. package/dist/leader-thread/apply-mutation.js +0 -107
  376. package/dist/leader-thread/apply-mutation.js.map +0 -1
  377. package/dist/leader-thread/leader-sync-processor.d.ts +0 -47
  378. package/dist/leader-thread/leader-sync-processor.d.ts.map +0 -1
  379. package/dist/leader-thread/leader-sync-processor.js +0 -430
  380. package/dist/leader-thread/leader-sync-processor.js.map +0 -1
  381. package/dist/leader-thread/mutationlog.d.ts +0 -10
  382. package/dist/leader-thread/mutationlog.d.ts.map +0 -1
  383. package/dist/leader-thread/mutationlog.js +0 -28
  384. package/dist/leader-thread/mutationlog.js.map +0 -1
  385. package/dist/leader-thread/pull-queue-set.d.ts +0 -7
  386. package/dist/leader-thread/pull-queue-set.d.ts.map +0 -1
  387. package/dist/leader-thread/pull-queue-set.js +0 -39
  388. package/dist/leader-thread/pull-queue-set.js.map +0 -1
  389. package/dist/mutation.d.ts +0 -20
  390. package/dist/mutation.d.ts.map +0 -1
  391. package/dist/mutation.js +0 -57
  392. package/dist/mutation.js.map +0 -1
  393. package/dist/query-builder/api.d.ts +0 -190
  394. package/dist/query-builder/api.d.ts.map +0 -1
  395. package/dist/query-builder/api.js +0 -8
  396. package/dist/query-builder/api.js.map +0 -1
  397. package/dist/query-builder/impl.d.ts +0 -12
  398. package/dist/query-builder/impl.d.ts.map +0 -1
  399. package/dist/query-builder/impl.js +0 -244
  400. package/dist/query-builder/impl.js.map +0 -1
  401. package/dist/query-builder/impl.test.d.ts +0 -2
  402. package/dist/query-builder/impl.test.d.ts.map +0 -1
  403. package/dist/query-builder/impl.test.js +0 -212
  404. package/dist/query-builder/impl.test.js.map +0 -1
  405. package/dist/query-builder/mod.d.ts.map +0 -1
  406. package/dist/query-builder/mod.js.map +0 -1
  407. package/dist/query-info.d.ts +0 -38
  408. package/dist/query-info.d.ts.map +0 -1
  409. package/dist/query-info.js +0 -7
  410. package/dist/query-info.js.map +0 -1
  411. package/dist/rehydrate-from-mutationlog.d.ts +0 -14
  412. package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
  413. package/dist/rehydrate-from-mutationlog.js +0 -66
  414. package/dist/rehydrate-from-mutationlog.js.map +0 -1
  415. package/dist/schema/EventId.d.ts +0 -39
  416. package/dist/schema/EventId.d.ts.map +0 -1
  417. package/dist/schema/EventId.js +0 -38
  418. package/dist/schema/EventId.js.map +0 -1
  419. package/dist/schema/EventId.test.d.ts +0 -2
  420. package/dist/schema/EventId.test.d.ts.map +0 -1
  421. package/dist/schema/EventId.test.js +0 -11
  422. package/dist/schema/EventId.test.js.map +0 -1
  423. package/dist/schema/MutationEvent.d.ts +0 -167
  424. package/dist/schema/MutationEvent.d.ts.map +0 -1
  425. package/dist/schema/MutationEvent.js +0 -72
  426. package/dist/schema/MutationEvent.js.map +0 -1
  427. package/dist/schema/MutationEvent.test.d.ts +0 -2
  428. package/dist/schema/MutationEvent.test.d.ts.map +0 -1
  429. package/dist/schema/MutationEvent.test.js +0 -2
  430. package/dist/schema/MutationEvent.test.js.map +0 -1
  431. package/dist/schema/mutations.d.ts +0 -107
  432. package/dist/schema/mutations.d.ts.map +0 -1
  433. package/dist/schema/mutations.js +0 -42
  434. package/dist/schema/mutations.js.map +0 -1
  435. package/dist/schema/schema-helpers.d.ts.map +0 -1
  436. package/dist/schema/schema-helpers.js.map +0 -1
  437. package/dist/schema/system-tables.d.ts +0 -399
  438. package/dist/schema/system-tables.d.ts.map +0 -1
  439. package/dist/schema/system-tables.js +0 -59
  440. package/dist/schema/system-tables.js.map +0 -1
  441. package/dist/schema/table-def.d.ts +0 -156
  442. package/dist/schema/table-def.d.ts.map +0 -1
  443. package/dist/schema/table-def.js +0 -79
  444. package/dist/schema/table-def.js.map +0 -1
  445. package/dist/schema-management/validate-mutation-defs.d.ts +0 -8
  446. package/dist/schema-management/validate-mutation-defs.d.ts.map +0 -1
  447. package/dist/schema-management/validate-mutation-defs.js +0 -39
  448. package/dist/schema-management/validate-mutation-defs.js.map +0 -1
  449. package/dist/sync/client-session-sync-processor.d.ts +0 -45
  450. package/dist/sync/client-session-sync-processor.d.ts.map +0 -1
  451. package/dist/sync/client-session-sync-processor.js +0 -131
  452. package/dist/sync/client-session-sync-processor.js.map +0 -1
  453. package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
  454. package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
  455. package/src/derived-mutations.test.ts +0 -101
  456. package/src/derived-mutations.ts +0 -170
  457. package/src/devtools/devtools-bridge.ts +0 -14
  458. package/src/devtools/devtools-window-message.ts +0 -27
  459. package/src/devtools/index.ts +0 -48
  460. package/src/init-singleton-tables.ts +0 -24
  461. package/src/leader-thread/apply-mutation.ts +0 -161
  462. package/src/leader-thread/mutationlog.ts +0 -46
  463. package/src/leader-thread/pull-queue-set.ts +0 -58
  464. package/src/mutation.ts +0 -91
  465. package/src/query-builder/api.ts +0 -289
  466. package/src/query-builder/impl.test.ts +0 -239
  467. package/src/query-builder/impl.ts +0 -285
  468. package/src/query-info.ts +0 -78
  469. package/src/rehydrate-from-mutationlog.ts +0 -119
  470. package/src/schema/EventId.test.ts +0 -12
  471. package/src/schema/EventId.ts +0 -60
  472. package/src/schema/MutationEvent.ts +0 -185
  473. package/src/schema/mutations.ts +0 -192
  474. package/src/schema/system-tables.ts +0 -105
  475. package/src/schema/table-def.ts +0 -343
  476. package/src/schema-management/validate-mutation-defs.ts +0 -63
  477. package/src/sync/next/test/mutation-fixtures.ts +0 -224
  478. package/tsconfig.json +0 -11
  479. /package/dist/schema/{schema-helpers.d.ts → state/sqlite/schema-helpers.d.ts} +0 -0
@@ -1,289 +0,0 @@
1
- import type { GetValForKey } from '@livestore/utils'
2
- import { type Option, Predicate, type Schema } from '@livestore/utils/effect'
3
-
4
- import type { SessionIdSymbol } from '../adapter-types.js'
5
- import type { QueryInfo } from '../query-info.js'
6
- import type { DbSchema } from '../schema/mod.js'
7
- import type { SqliteDsl } from '../schema/table-def.js'
8
- import type { SqlValue } from '../util.js'
9
-
10
- export type QueryBuilderAst = QueryBuilderAst.SelectQuery | QueryBuilderAst.CountQuery | QueryBuilderAst.RowQuery
11
-
12
- export namespace QueryBuilderAst {
13
- export type SelectQuery = {
14
- readonly _tag: 'SelectQuery'
15
- readonly columns: string[]
16
- readonly pickFirst: false | { fallback: () => any }
17
- readonly select: {
18
- columns: ReadonlyArray<string>
19
- }
20
- readonly orderBy: ReadonlyArray<OrderBy>
21
- readonly offset: Option.Option<number>
22
- readonly limit: Option.Option<number>
23
- readonly tableDef: DbSchema.TableDefBase
24
- readonly where: ReadonlyArray<QueryBuilderAst.Where>
25
- readonly resultSchemaSingle: Schema.Schema<any>
26
- }
27
-
28
- export type CountQuery = {
29
- readonly _tag: 'CountQuery'
30
- readonly tableDef: DbSchema.TableDefBase
31
- readonly where: ReadonlyArray<QueryBuilderAst.Where>
32
- readonly resultSchema: Schema.Schema<number, ReadonlyArray<{ count: number }>>
33
- }
34
-
35
- export type RowQuery = {
36
- readonly _tag: 'RowQuery'
37
- readonly tableDef: DbSchema.TableDefBase
38
- readonly id: string | SessionIdSymbol
39
- readonly insertValues: Record<string, unknown>
40
- }
41
-
42
- export type Where = {
43
- readonly col: string
44
- readonly op: QueryBuilder.WhereOps
45
- readonly value: unknown
46
- }
47
-
48
- export type OrderBy = {
49
- readonly col: string
50
- readonly direction: 'asc' | 'desc'
51
- }
52
- }
53
-
54
- export const QueryBuilderAstSymbol = Symbol.for('QueryBuilderAst')
55
- export type QueryBuilderAstSymbol = typeof QueryBuilderAstSymbol
56
- export const TypeId = Symbol.for('QueryBuilder')
57
- export type TypeId = typeof TypeId
58
-
59
- export const isQueryBuilder = (value: unknown): value is QueryBuilder<any, any, any> =>
60
- Predicate.hasProperty(value, TypeId)
61
-
62
- export type QueryBuilder<
63
- TResult,
64
- TTableDef extends DbSchema.TableDefBase,
65
- /** Used to gradually remove features from the API based on the query context */
66
- TWithout extends QueryBuilder.ApiFeature = never,
67
- TQueryInfo extends QueryInfo = QueryInfo.None,
68
- > = {
69
- readonly [TypeId]: TypeId
70
- readonly [QueryBuilderAstSymbol]: QueryBuilderAst
71
- readonly asSql: () => { query: string; bindValues: SqlValue[] }
72
- readonly toString: () => string
73
- } & Omit<QueryBuilder.ApiFull<TResult, TTableDef, TWithout, TQueryInfo>, TWithout>
74
-
75
- export namespace QueryBuilder {
76
- export type Any = QueryBuilder<any, any, any, any>
77
- export type WhereOps = WhereOps.Equality | WhereOps.Order | WhereOps.Like | WhereOps.In
78
-
79
- export namespace WhereOps {
80
- export type Equality = '=' | '!='
81
- export type Order = '<' | '>' | '<=' | '>='
82
- export type Like = 'LIKE' | 'NOT LIKE' | 'ILIKE' | 'NOT ILIKE'
83
- export type In = 'IN' | 'NOT IN'
84
-
85
- export type SingleValue = Equality | Order | Like
86
- export type MultiValue = In
87
- }
88
-
89
- export type ApiFeature = 'select' | 'where' | 'count' | 'orderBy' | 'offset' | 'limit' | 'first' | 'row'
90
-
91
- export type WhereParams<TTableDef extends DbSchema.TableDefBase> = Partial<{
92
- [K in keyof TTableDef['sqliteDef']['columns']]:
93
- | TTableDef['sqliteDef']['columns'][K]['schema']['Type']
94
- | { op: QueryBuilder.WhereOps.SingleValue; value: TTableDef['sqliteDef']['columns'][K]['schema']['Type'] }
95
- | {
96
- op: QueryBuilder.WhereOps.MultiValue
97
- value: ReadonlyArray<TTableDef['sqliteDef']['columns'][K]['schema']['Type']>
98
- }
99
- | undefined
100
- }>
101
-
102
- export type OrderByParams<TTableDef extends DbSchema.TableDefBase> = ReadonlyArray<{
103
- col: keyof TTableDef['sqliteDef']['columns'] & string
104
- direction: 'asc' | 'desc'
105
- }>
106
-
107
- export type ApiFull<
108
- TResult,
109
- TTableDef extends DbSchema.TableDefBase,
110
- TWithout extends ApiFeature,
111
- TQueryInfo extends QueryInfo,
112
- > = {
113
- /**
114
- * `SELECT *` is the default
115
- *
116
- * Example:
117
- * ```ts
118
- * db.todos.select('id', 'text', 'completed')
119
- * db.todos.select('id', { pluck: true })
120
- * ```
121
- */
122
- readonly select: {
123
- <TColumn extends keyof TTableDef['sqliteDef']['columns'] & string, TPluck extends boolean = false>(
124
- column: TColumn,
125
- options?: { pluck: TPluck },
126
- ): QueryBuilder<
127
- TPluck extends true
128
- ? ReadonlyArray<TTableDef['sqliteDef']['columns'][TColumn]['schema']['Type']>
129
- : ReadonlyArray<{
130
- readonly [K in TColumn]: TTableDef['sqliteDef']['columns'][K]['schema']['Type']
131
- }>,
132
- TTableDef,
133
- TWithout | 'row' | 'select',
134
- TQueryInfo
135
- >
136
- <TColumns extends keyof TTableDef['sqliteDef']['columns'] & string>(
137
- ...columns: TColumns[]
138
- // TODO also support arbitrary SQL selects
139
- // params: QueryBuilderSelectParams,
140
- ): QueryBuilder<
141
- ReadonlyArray<{
142
- readonly [K in TColumns]: TTableDef['sqliteDef']['columns'][K]['schema']['Type']
143
- }>,
144
- TTableDef,
145
- TWithout | 'row' | 'select' | 'count',
146
- TQueryInfo
147
- >
148
- }
149
-
150
- /**
151
- * Notes:
152
- * - All where clauses are `AND`ed together by default.
153
- * - `null` values only support `=` and `!=` which is translated to `IS NULL` and `IS NOT NULL`.
154
- *
155
- * Example:
156
- * ```ts
157
- * db.todos.where('completed', true)
158
- * db.todos.where('completed', '!=', true)
159
- * db.todos.where({ completed: true })
160
- * db.todos.where({ completed: { op: '!=', value: true } })
161
- * ```
162
- *
163
- * TODO: Also support `OR`
164
- */
165
- readonly where: {
166
- <TParams extends QueryBuilder.WhereParams<TTableDef>>(
167
- params: TParams,
168
- ): QueryBuilder<TResult, TTableDef, TWithout | 'row' | 'select', TQueryInfo>
169
- <TColName extends keyof TTableDef['sqliteDef']['columns']>(
170
- col: TColName,
171
- value: TTableDef['sqliteDef']['columns'][TColName]['schema']['Type'],
172
- ): QueryBuilder<TResult, TTableDef, TWithout | 'row' | 'select', TQueryInfo>
173
- <TColName extends keyof TTableDef['sqliteDef']['columns']>(
174
- col: TColName,
175
- op: QueryBuilder.WhereOps,
176
- value: TTableDef['sqliteDef']['columns'][TColName]['schema']['Type'],
177
- ): QueryBuilder<TResult, TTableDef, TWithout | 'row' | 'select', TQueryInfo>
178
- }
179
-
180
- /**
181
- * Example:
182
- * ```ts
183
- * db.todos.count()
184
- * db.todos.count().where('completed', true)
185
- * ```
186
- */
187
- readonly count: () => QueryBuilder<
188
- number,
189
- TTableDef,
190
- TWithout | 'row' | 'count' | 'select' | 'orderBy' | 'first' | 'offset' | 'limit',
191
- TQueryInfo
192
- >
193
-
194
- /**
195
- * Example:
196
- * ```ts
197
- * db.todos.orderBy('createdAt', 'desc')
198
- * ```
199
- */
200
- readonly orderBy: {
201
- <TColName extends keyof TTableDef['sqliteDef']['columns'] & string>(
202
- col: TColName,
203
- direction: 'asc' | 'desc',
204
- ): QueryBuilder<TResult, TTableDef, TWithout, TQueryInfo>
205
- <TParams extends QueryBuilder.OrderByParams<TTableDef>>(
206
- params: TParams,
207
- ): QueryBuilder<TResult, TTableDef, TWithout, TQueryInfo>
208
- }
209
-
210
- /**
211
- * Example:
212
- * ```ts
213
- * db.todos.offset(10)
214
- * ```
215
- */
216
- readonly offset: (
217
- offset: number,
218
- ) => QueryBuilder<TResult, TTableDef, TWithout | 'row' | 'offset' | 'orderBy', TQueryInfo>
219
-
220
- /**
221
- * Example:
222
- * ```ts
223
- * db.todos.limit(10)
224
- * ```
225
- */
226
- readonly limit: (
227
- limit: number,
228
- ) => QueryBuilder<TResult, TTableDef, TWithout | 'row' | 'limit' | 'offset' | 'first' | 'orderBy', TQueryInfo>
229
-
230
- /**
231
- * Example:
232
- * ```ts
233
- * db.todos.first()
234
- * ```
235
- */
236
- readonly first: <TFallback extends GetSingle<TResult> = never>(options?: {
237
- fallback?: () => TFallback
238
- }) => QueryBuilder<
239
- TFallback | GetSingle<TResult>,
240
- TTableDef,
241
- TWithout | 'row' | 'first' | 'orderBy' | 'select' | 'limit' | 'offset' | 'where',
242
- TQueryInfo
243
- >
244
-
245
- /**
246
- * Gets a single row from the table and will create it if it doesn't exist yet.
247
- */
248
- // TODO maybe call `getsert`?
249
- readonly row: TTableDef['options']['isSingleton'] extends true
250
- ? () => QueryBuilder<RowQuery.Result<TTableDef>, TTableDef, QueryBuilder.ApiFeature, QueryInfo.Row>
251
- : TTableDef['options']['deriveMutations']['enabled'] extends false
252
- ? (_: 'Error: Need to enable deriveMutations to use row()') => any
253
- : TTableDef['options']['requiredInsertColumnNames'] extends never
254
- ? (
255
- id: string | SessionIdSymbol,
256
- ) => QueryBuilder<RowQuery.Result<TTableDef>, TTableDef, QueryBuilder.ApiFeature, QueryInfo.Row>
257
- : <TOptions extends RowQuery.RequiredColumnsOptions<TTableDef>>(
258
- id: string | SessionIdSymbol,
259
- opts: TOptions,
260
- ) => QueryBuilder<RowQuery.Result<TTableDef>, TTableDef, QueryBuilder.ApiFeature, QueryInfo.Row>
261
- }
262
- }
263
-
264
- export namespace RowQuery {
265
- export type RequiredColumnsOptions<TTableDef extends DbSchema.TableDefBase> = {
266
- /**
267
- * Values to be inserted into the row if it doesn't exist yet
268
- */
269
- insertValues: Pick<
270
- SqliteDsl.FromColumns.RowDecodedAll<TTableDef['sqliteDef']['columns']>,
271
- SqliteDsl.FromColumns.RequiredInsertColumnNames<Omit<TTableDef['sqliteDef']['columns'], 'id'>>
272
- >
273
- }
274
-
275
- export type Result<TTableDef extends DbSchema.TableDefBase> = TTableDef['options']['isSingleColumn'] extends true
276
- ? GetValForKey<SqliteDsl.FromColumns.RowDecoded<TTableDef['sqliteDef']['columns']>, 'value'>
277
- : SqliteDsl.FromColumns.RowDecoded<TTableDef['sqliteDef']['columns']>
278
-
279
- export type ResultEncoded<TTableDef extends DbSchema.TableDefBase> =
280
- TTableDef['options']['isSingleColumn'] extends true
281
- ? GetValForKey<SqliteDsl.FromColumns.RowEncoded<TTableDef['sqliteDef']['columns']>, 'value'>
282
- : SqliteDsl.FromColumns.RowEncoded<TTableDef['sqliteDef']['columns']>
283
- }
284
-
285
- type GetSingle<T> = T extends ReadonlyArray<infer U> ? U : never
286
-
287
- // export type QueryBuilderParamRef = { _tag: 'QueryBuilderParamRef' }
288
- // export type QueryBuilderSelectParams = { [key: string]: QueryBuilderSelectParam }
289
- // export type QueryBuilderSelectParam = boolean | ((ref: QueryBuilderParamRef) => QueryBuilder<any, any>)
@@ -1,239 +0,0 @@
1
- import { Schema } from '@livestore/utils/effect'
2
- import { describe, expect, it } from 'vitest'
3
-
4
- import { DbSchema } from '../schema/mod.js'
5
- import { getResultSchema } from './impl.js'
6
-
7
- const todos = DbSchema.table(
8
- 'todos',
9
- {
10
- id: DbSchema.text({ primaryKey: true }),
11
- text: DbSchema.text({ default: '', nullable: false }),
12
- completed: DbSchema.boolean({ default: false, nullable: false }),
13
- status: DbSchema.text({ schema: Schema.Literal('active', 'completed') }),
14
- deletedAt: DbSchema.datetime({ nullable: true }),
15
- // TODO consider leaning more into Effect schema
16
- // other: Schema.Number.pipe(DbSchema.asInteger),
17
- },
18
- { deriveMutations: true },
19
- )
20
-
21
- const comments = DbSchema.table('comments', {
22
- id: DbSchema.text({ primaryKey: true }),
23
- text: DbSchema.text({ default: '', nullable: false }),
24
- todoId: DbSchema.text({}),
25
- })
26
-
27
- const db = { todos: todos.query, comments: comments.query }
28
-
29
- describe('query builder', () => {
30
- describe('result schema', () => {
31
- it('should print the schema', () => {
32
- expect(String(getResultSchema(db.todos))).toMatchInlineSnapshot(`"ReadonlyArray<todos>"`)
33
- })
34
- })
35
-
36
- describe('basic queries', () => {
37
- it('should handle simple SELECT queries', () => {
38
- expect(db.todos.asSql()).toMatchInlineSnapshot(`
39
- {
40
- "bindValues": [],
41
- "query": "SELECT * FROM 'todos'",
42
- }
43
- `)
44
-
45
- expect(db.todos.select('id', 'text').asSql()).toMatchInlineSnapshot(`
46
- {
47
- "bindValues": [],
48
- "query": "SELECT id, text FROM 'todos'",
49
- }
50
- `)
51
- })
52
-
53
- it('should handle WHERE clauses', () => {
54
- expect(db.todos.select('id', 'text').where('completed', true).asSql()).toMatchInlineSnapshot(`
55
- {
56
- "bindValues": [
57
- 1,
58
- ],
59
- "query": "SELECT id, text FROM 'todos' WHERE completed = ?",
60
- }
61
- `)
62
- expect(db.todos.select('id', 'text').where('completed', '!=', true).asSql()).toMatchInlineSnapshot(`
63
- {
64
- "bindValues": [
65
- 1,
66
- ],
67
- "query": "SELECT id, text FROM 'todos' WHERE completed != ?",
68
- }
69
- `)
70
- expect(db.todos.select('id', 'text').where({ completed: true }).asSql()).toMatchInlineSnapshot(`
71
- {
72
- "bindValues": [
73
- 1,
74
- ],
75
- "query": "SELECT id, text FROM 'todos' WHERE completed = ?",
76
- }
77
- `)
78
- expect(db.todos.select('id', 'text').where({ completed: undefined }).asSql()).toMatchInlineSnapshot(`
79
- {
80
- "bindValues": [],
81
- "query": "SELECT id, text FROM 'todos'",
82
- }
83
- `)
84
- expect(
85
- db.todos
86
- .select('id', 'text')
87
- .where({ deletedAt: { op: '<=', value: new Date('2024-01-01') } })
88
- .asSql(),
89
- ).toMatchInlineSnapshot(`
90
- {
91
- "bindValues": [
92
- "2024-01-01T00:00:00.000Z",
93
- ],
94
- "query": "SELECT id, text FROM 'todos' WHERE deletedAt <= ?",
95
- }
96
- `)
97
- expect(
98
- db.todos
99
- .select('id', 'text')
100
- .where({ status: { op: 'IN', value: ['active'] } })
101
- .asSql(),
102
- ).toMatchInlineSnapshot(`
103
- {
104
- "bindValues": [
105
- "active",
106
- ],
107
- "query": "SELECT id, text FROM 'todos' WHERE status IN (?)",
108
- }
109
- `)
110
- expect(
111
- db.todos
112
- .select('id', 'text')
113
- .where({ status: { op: 'NOT IN', value: ['active', 'completed'] } })
114
- .asSql(),
115
- ).toMatchInlineSnapshot(`
116
- {
117
- "bindValues": [
118
- "active",
119
- "completed",
120
- ],
121
- "query": "SELECT id, text FROM 'todos' WHERE status NOT IN (?, ?)",
122
- }
123
- `)
124
- })
125
-
126
- it('should handle OFFSET and LIMIT clauses', () => {
127
- expect(db.todos.select('id', 'text').where('completed', true).offset(10).limit(10).asSql())
128
- .toMatchInlineSnapshot(`
129
- {
130
- "bindValues": [
131
- 1,
132
- 10,
133
- 10,
134
- ],
135
- "query": "SELECT id, text FROM 'todos' WHERE completed = ? OFFSET ? LIMIT ?",
136
- }
137
- `)
138
- })
139
-
140
- it('should handle COUNT queries', () => {
141
- expect(db.todos.count().asSql()).toMatchInlineSnapshot(`
142
- {
143
- "bindValues": [],
144
- "query": "SELECT COUNT(*) as count FROM 'todos'",
145
- }
146
- `)
147
- expect(db.todos.count().where('completed', true).asSql()).toMatchInlineSnapshot(`
148
- {
149
- "bindValues": [
150
- 1,
151
- ],
152
- "query": "SELECT COUNT(*) as count FROM 'todos' WHERE completed = ?",
153
- }
154
- `)
155
- })
156
-
157
- it('should handle NULL comparisons', () => {
158
- expect(db.todos.select('id', 'text').where('deletedAt', '=', null).asSql()).toMatchInlineSnapshot(`
159
- {
160
- "bindValues": [],
161
- "query": "SELECT id, text FROM 'todos' WHERE deletedAt IS NULL",
162
- }
163
- `)
164
- expect(db.todos.select('id', 'text').where('deletedAt', '!=', null).asSql()).toMatchInlineSnapshot(`
165
- {
166
- "bindValues": [],
167
- "query": "SELECT id, text FROM 'todos' WHERE deletedAt IS NOT NULL",
168
- }
169
- `)
170
- })
171
-
172
- it('should handle orderBy', () => {
173
- expect(db.todos.orderBy('completed', 'desc').asSql()).toMatchInlineSnapshot(`
174
- {
175
- "bindValues": [],
176
- "query": "SELECT * FROM 'todos' ORDER BY completed desc",
177
- }
178
- `)
179
-
180
- expect(db.todos.orderBy([{ col: 'completed', direction: 'desc' }]).asSql()).toMatchInlineSnapshot(`
181
- {
182
- "bindValues": [],
183
- "query": "SELECT * FROM 'todos' ORDER BY completed desc",
184
- }
185
- `)
186
-
187
- expect(db.todos.orderBy([]).asSql()).toMatchInlineSnapshot(`
188
- {
189
- "bindValues": [],
190
- "query": "SELECT * FROM 'todos'",
191
- }
192
- `)
193
- })
194
- })
195
-
196
- describe('row queries', () => {
197
- it('should handle row queries', () => {
198
- expect(db.todos.row('123', { insertValues: { status: 'completed' } }).asSql()).toMatchInlineSnapshot(`
199
- {
200
- "bindValues": [
201
- "123",
202
- ],
203
- "query": "SELECT * FROM 'todos' WHERE id = ?",
204
- }
205
- `)
206
- })
207
- })
208
- })
209
-
210
- // TODO nested queries
211
- // const rawSql = <A, I>(sql: string, params: { [key: string]: any }, schema: Schema.Schema<A, I>) =>
212
- // ({
213
- // sql,
214
- // params,
215
- // schema,
216
- // }) as any as QueryBuilder<A, any>
217
-
218
- // Translates to
219
- // SELECT todos.*, (SELECT COUNT(*) FROM comments WHERE comments.todoId = todos.id) AS commentsCount
220
- // FROM todos WHERE todos.completed = true
221
- // const q4CommentsCountSchema = Schema.Struct({ count: Schema.Number }).pipe(
222
- // Schema.pluck('count'),
223
- // Schema.Array,
224
- // Schema.headOrElse(),
225
- // )
226
- // const _q4$ = db.todos
227
- // .select({
228
- // commentsCount: (ref) =>
229
- // rawSql(
230
- // sql`SELECT COUNT(*) as count FROM comments WHERE comments.todoId = $todoId`,
231
- // { todoId: ref },
232
- // q4CommentsCountSchema,
233
- // ),
234
- // })
235
- // .where({ completed: true })
236
-
237
- // const _q5$ = db.todos
238
- // .select({ commentsCount: (todoId: TODO) => comments.query.where({ todoId }).count() })
239
- // .where({ completed: true })