@livestore/common 0.3.0-dev.8 → 0.3.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 (480) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/__tests__/fixture.d.ts +83 -221
  3. package/dist/__tests__/fixture.d.ts.map +1 -1
  4. package/dist/__tests__/fixture.js +33 -11
  5. package/dist/__tests__/fixture.js.map +1 -1
  6. package/dist/adapter-types.d.ts +120 -64
  7. package/dist/adapter-types.d.ts.map +1 -1
  8. package/dist/adapter-types.js +39 -8
  9. package/dist/adapter-types.js.map +1 -1
  10. package/dist/bounded-collections.d.ts.map +1 -1
  11. package/dist/debug-info.d.ts +1 -1
  12. package/dist/debug-info.d.ts.map +1 -1
  13. package/dist/debug-info.js +1 -0
  14. package/dist/debug-info.js.map +1 -1
  15. package/dist/devtools/devtools-messages-client-session.d.ts +390 -0
  16. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -0
  17. package/dist/devtools/devtools-messages-client-session.js +97 -0
  18. package/dist/devtools/devtools-messages-client-session.js.map +1 -0
  19. package/dist/devtools/devtools-messages-common.d.ts +68 -0
  20. package/dist/devtools/devtools-messages-common.d.ts.map +1 -0
  21. package/dist/devtools/devtools-messages-common.js +60 -0
  22. package/dist/devtools/devtools-messages-common.js.map +1 -0
  23. package/dist/devtools/devtools-messages-leader.d.ts +394 -0
  24. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -0
  25. package/dist/devtools/devtools-messages-leader.js +147 -0
  26. package/dist/devtools/devtools-messages-leader.js.map +1 -0
  27. package/dist/devtools/devtools-messages.d.ts +3 -580
  28. package/dist/devtools/devtools-messages.d.ts.map +1 -1
  29. package/dist/devtools/devtools-messages.js +3 -174
  30. package/dist/devtools/devtools-messages.js.map +1 -1
  31. package/dist/devtools/devtools-sessioninfo.d.ts +32 -0
  32. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -0
  33. package/dist/devtools/devtools-sessioninfo.js +36 -0
  34. package/dist/devtools/devtools-sessioninfo.js.map +1 -0
  35. package/dist/devtools/mod.d.ts +55 -0
  36. package/dist/devtools/mod.d.ts.map +1 -0
  37. package/dist/devtools/mod.js +33 -0
  38. package/dist/devtools/mod.js.map +1 -0
  39. package/dist/index.d.ts +7 -9
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +7 -9
  42. package/dist/index.js.map +1 -1
  43. package/dist/leader-thread/LeaderSyncProcessor.d.ts +45 -30
  44. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  45. package/dist/leader-thread/LeaderSyncProcessor.js +484 -321
  46. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  47. package/dist/leader-thread/connection.d.ts +34 -6
  48. package/dist/leader-thread/connection.d.ts.map +1 -1
  49. package/dist/leader-thread/connection.js +22 -7
  50. package/dist/leader-thread/connection.js.map +1 -1
  51. package/dist/leader-thread/eventlog.d.ts +27 -0
  52. package/dist/leader-thread/eventlog.d.ts.map +1 -0
  53. package/dist/leader-thread/eventlog.js +119 -0
  54. package/dist/leader-thread/eventlog.js.map +1 -0
  55. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  56. package/dist/leader-thread/leader-worker-devtools.js +155 -80
  57. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  58. package/dist/leader-thread/make-leader-thread-layer.d.ts +22 -9
  59. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  60. package/dist/leader-thread/make-leader-thread-layer.js +67 -45
  61. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  62. package/dist/leader-thread/materialize-event.d.ts +16 -0
  63. package/dist/leader-thread/materialize-event.d.ts.map +1 -0
  64. package/dist/leader-thread/materialize-event.js +109 -0
  65. package/dist/leader-thread/materialize-event.js.map +1 -0
  66. package/dist/leader-thread/mod.d.ts +1 -1
  67. package/dist/leader-thread/mod.d.ts.map +1 -1
  68. package/dist/leader-thread/mod.js +1 -1
  69. package/dist/leader-thread/mod.js.map +1 -1
  70. package/dist/leader-thread/recreate-db.d.ts +4 -2
  71. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  72. package/dist/leader-thread/recreate-db.js +28 -32
  73. package/dist/leader-thread/recreate-db.js.map +1 -1
  74. package/dist/leader-thread/shutdown-channel.d.ts +2 -5
  75. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  76. package/dist/leader-thread/shutdown-channel.js +2 -4
  77. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  78. package/dist/leader-thread/types.d.ts +85 -38
  79. package/dist/leader-thread/types.d.ts.map +1 -1
  80. package/dist/leader-thread/types.js +1 -3
  81. package/dist/leader-thread/types.js.map +1 -1
  82. package/dist/make-client-session.d.ts +23 -0
  83. package/dist/make-client-session.d.ts.map +1 -0
  84. package/dist/make-client-session.js +57 -0
  85. package/dist/make-client-session.js.map +1 -0
  86. package/dist/materializer-helper.d.ts +23 -0
  87. package/dist/materializer-helper.d.ts.map +1 -0
  88. package/dist/materializer-helper.js +86 -0
  89. package/dist/materializer-helper.js.map +1 -0
  90. package/dist/otel.d.ts +2 -0
  91. package/dist/otel.d.ts.map +1 -1
  92. package/dist/otel.js +5 -0
  93. package/dist/otel.js.map +1 -1
  94. package/dist/rematerialize-from-eventlog.d.ts +14 -0
  95. package/dist/rematerialize-from-eventlog.d.ts.map +1 -0
  96. package/dist/rematerialize-from-eventlog.js +64 -0
  97. package/dist/rematerialize-from-eventlog.js.map +1 -0
  98. package/dist/schema/EventDef.d.ts +146 -0
  99. package/dist/schema/EventDef.d.ts.map +1 -0
  100. package/dist/schema/EventDef.js +58 -0
  101. package/dist/schema/EventDef.js.map +1 -0
  102. package/dist/schema/EventSequenceNumber.d.ts +57 -0
  103. package/dist/schema/EventSequenceNumber.d.ts.map +1 -0
  104. package/dist/schema/EventSequenceNumber.js +82 -0
  105. package/dist/schema/EventSequenceNumber.js.map +1 -0
  106. package/dist/schema/EventSequenceNumber.test.d.ts +2 -0
  107. package/dist/schema/EventSequenceNumber.test.d.ts.map +1 -0
  108. package/dist/schema/EventSequenceNumber.test.js +11 -0
  109. package/dist/schema/EventSequenceNumber.test.js.map +1 -0
  110. package/dist/schema/LiveStoreEvent.d.ts +257 -0
  111. package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
  112. package/dist/schema/LiveStoreEvent.js +117 -0
  113. package/dist/schema/LiveStoreEvent.js.map +1 -0
  114. package/dist/schema/events.d.ts +2 -0
  115. package/dist/schema/events.d.ts.map +1 -0
  116. package/dist/schema/events.js +2 -0
  117. package/dist/schema/events.js.map +1 -0
  118. package/dist/schema/mod.d.ts +8 -6
  119. package/dist/schema/mod.d.ts.map +1 -1
  120. package/dist/schema/mod.js +8 -6
  121. package/dist/schema/mod.js.map +1 -1
  122. package/dist/schema/schema.d.ts +50 -32
  123. package/dist/schema/schema.d.ts.map +1 -1
  124. package/dist/schema/schema.js +36 -43
  125. package/dist/schema/schema.js.map +1 -1
  126. package/dist/schema/state/mod.d.ts +3 -0
  127. package/dist/schema/state/mod.d.ts.map +1 -0
  128. package/dist/schema/state/mod.js +3 -0
  129. package/dist/schema/state/mod.js.map +1 -0
  130. package/dist/schema/state/sqlite/client-document-def.d.ts +223 -0
  131. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -0
  132. package/dist/schema/state/sqlite/client-document-def.js +170 -0
  133. package/dist/schema/state/sqlite/client-document-def.js.map +1 -0
  134. package/dist/schema/state/sqlite/client-document-def.test.d.ts +2 -0
  135. package/dist/schema/state/sqlite/client-document-def.test.d.ts.map +1 -0
  136. package/dist/schema/state/sqlite/client-document-def.test.js +201 -0
  137. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -0
  138. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +69 -0
  139. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -0
  140. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +71 -0
  141. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -0
  142. package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts +3 -0
  143. package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts.map +1 -0
  144. package/dist/schema/state/sqlite/db-schema/ast/validate.js +12 -0
  145. package/dist/schema/state/sqlite/db-schema/ast/validate.js.map +1 -0
  146. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +90 -0
  147. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -0
  148. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +87 -0
  149. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -0
  150. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.d.ts +2 -0
  151. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.d.ts.map +1 -0
  152. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +29 -0
  153. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -0
  154. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +90 -0
  155. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -0
  156. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +41 -0
  157. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -0
  158. package/dist/schema/state/sqlite/db-schema/hash.d.ts +2 -0
  159. package/dist/schema/state/sqlite/db-schema/hash.d.ts.map +1 -0
  160. package/dist/schema/state/sqlite/db-schema/hash.js +14 -0
  161. package/dist/schema/state/sqlite/db-schema/hash.js.map +1 -0
  162. package/dist/schema/state/sqlite/db-schema/mod.d.ts +3 -0
  163. package/dist/schema/state/sqlite/db-schema/mod.d.ts.map +1 -0
  164. package/dist/schema/state/sqlite/db-schema/mod.js +3 -0
  165. package/dist/schema/state/sqlite/db-schema/mod.js.map +1 -0
  166. package/dist/schema/state/sqlite/mod.d.ts +17 -0
  167. package/dist/schema/state/sqlite/mod.d.ts.map +1 -0
  168. package/dist/schema/state/sqlite/mod.js +41 -0
  169. package/dist/schema/state/sqlite/mod.js.map +1 -0
  170. package/dist/schema/state/sqlite/query-builder/api.d.ts +294 -0
  171. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -0
  172. package/dist/schema/state/sqlite/query-builder/api.js +6 -0
  173. package/dist/schema/state/sqlite/query-builder/api.js.map +1 -0
  174. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts +7 -0
  175. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -0
  176. package/dist/schema/state/sqlite/query-builder/astToSql.js +190 -0
  177. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -0
  178. package/dist/schema/state/sqlite/query-builder/impl.d.ts +7 -0
  179. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -0
  180. package/dist/schema/state/sqlite/query-builder/impl.js +286 -0
  181. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -0
  182. package/dist/schema/state/sqlite/query-builder/impl.test.d.ts +87 -0
  183. package/dist/schema/state/sqlite/query-builder/impl.test.d.ts.map +1 -0
  184. package/dist/schema/state/sqlite/query-builder/impl.test.js +563 -0
  185. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -0
  186. package/dist/{query-builder → schema/state/sqlite/query-builder}/mod.d.ts +7 -0
  187. package/dist/schema/state/sqlite/query-builder/mod.d.ts.map +1 -0
  188. package/dist/{query-builder → schema/state/sqlite/query-builder}/mod.js +7 -0
  189. package/dist/schema/state/sqlite/query-builder/mod.js.map +1 -0
  190. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -0
  191. package/dist/schema/{schema-helpers.js → state/sqlite/schema-helpers.js} +1 -1
  192. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -0
  193. package/dist/schema/state/sqlite/system-tables.d.ts +574 -0
  194. package/dist/schema/state/sqlite/system-tables.d.ts.map +1 -0
  195. package/dist/schema/state/sqlite/system-tables.js +88 -0
  196. package/dist/schema/state/sqlite/system-tables.js.map +1 -0
  197. package/dist/schema/state/sqlite/table-def.d.ts +84 -0
  198. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -0
  199. package/dist/schema/state/sqlite/table-def.js +36 -0
  200. package/dist/schema/state/sqlite/table-def.js.map +1 -0
  201. package/dist/schema-management/common.d.ts +7 -7
  202. package/dist/schema-management/common.d.ts.map +1 -1
  203. package/dist/schema-management/common.js.map +1 -1
  204. package/dist/schema-management/migrations.d.ts +6 -6
  205. package/dist/schema-management/migrations.d.ts.map +1 -1
  206. package/dist/schema-management/migrations.js +27 -18
  207. package/dist/schema-management/migrations.js.map +1 -1
  208. package/dist/schema-management/validate-schema.d.ts +8 -0
  209. package/dist/schema-management/validate-schema.d.ts.map +1 -0
  210. package/dist/schema-management/validate-schema.js +39 -0
  211. package/dist/schema-management/validate-schema.js.map +1 -0
  212. package/dist/sql-queries/misc.d.ts.map +1 -1
  213. package/dist/sql-queries/sql-queries.d.ts +1 -1
  214. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  215. package/dist/sql-queries/sql-queries.js.map +1 -1
  216. package/dist/sql-queries/sql-query-builder.d.ts +1 -1
  217. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  218. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  219. package/dist/sql-queries/types.d.ts +2 -1
  220. package/dist/sql-queries/types.d.ts.map +1 -1
  221. package/dist/sql-queries/types.js.map +1 -1
  222. package/dist/sync/ClientSessionSyncProcessor.d.ts +40 -19
  223. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  224. package/dist/sync/ClientSessionSyncProcessor.js +150 -72
  225. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  226. package/dist/sync/next/compact-events.d.ts.map +1 -1
  227. package/dist/sync/next/compact-events.js +38 -35
  228. package/dist/sync/next/compact-events.js.map +1 -1
  229. package/dist/sync/next/facts.d.ts +21 -21
  230. package/dist/sync/next/facts.d.ts.map +1 -1
  231. package/dist/sync/next/facts.js +11 -11
  232. package/dist/sync/next/facts.js.map +1 -1
  233. package/dist/sync/next/history-dag-common.d.ts +9 -7
  234. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  235. package/dist/sync/next/history-dag-common.js +10 -5
  236. package/dist/sync/next/history-dag-common.js.map +1 -1
  237. package/dist/sync/next/history-dag.d.ts +0 -2
  238. package/dist/sync/next/history-dag.d.ts.map +1 -1
  239. package/dist/sync/next/history-dag.js +16 -14
  240. package/dist/sync/next/history-dag.js.map +1 -1
  241. package/dist/sync/next/rebase-events.d.ts +10 -8
  242. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  243. package/dist/sync/next/rebase-events.js +18 -10
  244. package/dist/sync/next/rebase-events.js.map +1 -1
  245. package/dist/sync/next/test/compact-events.calculator.test.js +39 -34
  246. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  247. package/dist/sync/next/test/compact-events.test.js +77 -77
  248. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  249. package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +35 -25
  250. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
  251. package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +81 -38
  252. package/dist/sync/next/test/event-fixtures.js.map +1 -0
  253. package/dist/sync/next/test/mod.d.ts +1 -1
  254. package/dist/sync/next/test/mod.d.ts.map +1 -1
  255. package/dist/sync/next/test/mod.js +1 -1
  256. package/dist/sync/next/test/mod.js.map +1 -1
  257. package/dist/sync/sync.d.ts +46 -21
  258. package/dist/sync/sync.d.ts.map +1 -1
  259. package/dist/sync/sync.js +10 -6
  260. package/dist/sync/sync.js.map +1 -1
  261. package/dist/sync/syncstate.d.ts +213 -82
  262. package/dist/sync/syncstate.d.ts.map +1 -1
  263. package/dist/sync/syncstate.js +337 -139
  264. package/dist/sync/syncstate.js.map +1 -1
  265. package/dist/sync/syncstate.test.js +309 -286
  266. package/dist/sync/syncstate.test.js.map +1 -1
  267. package/dist/sync/validate-push-payload.d.ts +2 -2
  268. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  269. package/dist/sync/validate-push-payload.js +4 -4
  270. package/dist/sync/validate-push-payload.js.map +1 -1
  271. package/dist/util.d.ts +2 -2
  272. package/dist/util.d.ts.map +1 -1
  273. package/dist/version.d.ts +2 -2
  274. package/dist/version.d.ts.map +1 -1
  275. package/dist/version.js +2 -2
  276. package/dist/version.js.map +1 -1
  277. package/package.json +10 -4
  278. package/src/__tests__/fixture.ts +36 -15
  279. package/src/adapter-types.ts +107 -68
  280. package/src/debug-info.ts +1 -0
  281. package/src/devtools/devtools-messages-client-session.ts +142 -0
  282. package/src/devtools/devtools-messages-common.ts +115 -0
  283. package/src/devtools/devtools-messages-leader.ts +191 -0
  284. package/src/devtools/devtools-messages.ts +3 -246
  285. package/src/devtools/devtools-sessioninfo.ts +101 -0
  286. package/src/devtools/mod.ts +59 -0
  287. package/src/index.ts +7 -9
  288. package/src/leader-thread/LeaderSyncProcessor.ts +738 -477
  289. package/src/leader-thread/connection.ts +54 -9
  290. package/src/leader-thread/eventlog.ts +199 -0
  291. package/src/leader-thread/leader-worker-devtools.ts +227 -104
  292. package/src/leader-thread/make-leader-thread-layer.ts +121 -72
  293. package/src/leader-thread/materialize-event.ts +173 -0
  294. package/src/leader-thread/mod.ts +1 -1
  295. package/src/leader-thread/recreate-db.ts +33 -38
  296. package/src/leader-thread/shutdown-channel.ts +2 -4
  297. package/src/leader-thread/types.ts +94 -48
  298. package/src/make-client-session.ts +136 -0
  299. package/src/materializer-helper.ts +138 -0
  300. package/src/otel.ts +8 -0
  301. package/src/rematerialize-from-eventlog.ts +117 -0
  302. package/src/schema/EventDef.ts +227 -0
  303. package/src/schema/EventSequenceNumber.test.ts +12 -0
  304. package/src/schema/EventSequenceNumber.ts +121 -0
  305. package/src/schema/LiveStoreEvent.ts +240 -0
  306. package/src/schema/events.ts +1 -0
  307. package/src/schema/mod.ts +8 -6
  308. package/src/schema/schema.ts +88 -84
  309. package/src/schema/state/mod.ts +2 -0
  310. package/src/schema/state/sqlite/client-document-def.test.ts +238 -0
  311. package/src/schema/state/sqlite/client-document-def.ts +444 -0
  312. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +142 -0
  313. package/src/schema/state/sqlite/db-schema/ast/validate.ts +13 -0
  314. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +206 -0
  315. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -0
  316. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +242 -0
  317. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +222 -0
  318. package/src/schema/state/sqlite/db-schema/hash.ts +14 -0
  319. package/src/schema/state/sqlite/db-schema/mod.ts +2 -0
  320. package/src/schema/state/sqlite/mod.ts +73 -0
  321. package/src/schema/state/sqlite/query-builder/api.ts +440 -0
  322. package/src/schema/state/sqlite/query-builder/astToSql.ts +232 -0
  323. package/src/schema/state/sqlite/query-builder/impl.test.ts +617 -0
  324. package/src/schema/state/sqlite/query-builder/impl.ts +351 -0
  325. package/src/{query-builder → schema/state/sqlite/query-builder}/mod.ts +7 -0
  326. package/src/schema/{schema-helpers.ts → state/sqlite/schema-helpers.ts} +1 -1
  327. package/src/schema/state/sqlite/system-tables.ts +117 -0
  328. package/src/schema/state/sqlite/table-def.ts +197 -0
  329. package/src/schema-management/common.ts +7 -7
  330. package/src/schema-management/migrations.ts +37 -31
  331. package/src/schema-management/validate-schema.ts +61 -0
  332. package/src/sql-queries/sql-queries.ts +1 -1
  333. package/src/sql-queries/sql-query-builder.ts +1 -2
  334. package/src/sql-queries/types.ts +3 -1
  335. package/src/sync/ClientSessionSyncProcessor.ts +220 -94
  336. package/src/sync/next/compact-events.ts +38 -35
  337. package/src/sync/next/facts.ts +43 -41
  338. package/src/sync/next/history-dag-common.ts +17 -10
  339. package/src/sync/next/history-dag.ts +16 -17
  340. package/src/sync/next/rebase-events.ts +29 -17
  341. package/src/sync/next/test/compact-events.calculator.test.ts +46 -46
  342. package/src/sync/next/test/compact-events.test.ts +79 -79
  343. package/src/sync/next/test/event-fixtures.ts +226 -0
  344. package/src/sync/next/test/mod.ts +1 -1
  345. package/src/sync/sync.ts +46 -21
  346. package/src/sync/syncstate.test.ts +346 -320
  347. package/src/sync/syncstate.ts +422 -230
  348. package/src/sync/validate-push-payload.ts +6 -6
  349. package/src/version.ts +2 -2
  350. package/dist/derived-mutations.d.ts +0 -109
  351. package/dist/derived-mutations.d.ts.map +0 -1
  352. package/dist/derived-mutations.js +0 -54
  353. package/dist/derived-mutations.js.map +0 -1
  354. package/dist/derived-mutations.test.d.ts +0 -2
  355. package/dist/derived-mutations.test.d.ts.map +0 -1
  356. package/dist/derived-mutations.test.js +0 -93
  357. package/dist/derived-mutations.test.js.map +0 -1
  358. package/dist/devtools/devtools-bridge.d.ts +0 -13
  359. package/dist/devtools/devtools-bridge.d.ts.map +0 -1
  360. package/dist/devtools/devtools-bridge.js +0 -2
  361. package/dist/devtools/devtools-bridge.js.map +0 -1
  362. package/dist/devtools/devtools-window-message.d.ts +0 -29
  363. package/dist/devtools/devtools-window-message.d.ts.map +0 -1
  364. package/dist/devtools/devtools-window-message.js +0 -33
  365. package/dist/devtools/devtools-window-message.js.map +0 -1
  366. package/dist/devtools/index.d.ts +0 -42
  367. package/dist/devtools/index.d.ts.map +0 -1
  368. package/dist/devtools/index.js +0 -48
  369. package/dist/devtools/index.js.map +0 -1
  370. package/dist/init-singleton-tables.d.ts +0 -4
  371. package/dist/init-singleton-tables.d.ts.map +0 -1
  372. package/dist/init-singleton-tables.js +0 -16
  373. package/dist/init-singleton-tables.js.map +0 -1
  374. package/dist/leader-thread/apply-mutation.d.ts +0 -11
  375. package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
  376. package/dist/leader-thread/apply-mutation.js +0 -107
  377. package/dist/leader-thread/apply-mutation.js.map +0 -1
  378. package/dist/leader-thread/leader-sync-processor.d.ts +0 -47
  379. package/dist/leader-thread/leader-sync-processor.d.ts.map +0 -1
  380. package/dist/leader-thread/leader-sync-processor.js +0 -430
  381. package/dist/leader-thread/leader-sync-processor.js.map +0 -1
  382. package/dist/leader-thread/mutationlog.d.ts +0 -10
  383. package/dist/leader-thread/mutationlog.d.ts.map +0 -1
  384. package/dist/leader-thread/mutationlog.js +0 -28
  385. package/dist/leader-thread/mutationlog.js.map +0 -1
  386. package/dist/leader-thread/pull-queue-set.d.ts +0 -7
  387. package/dist/leader-thread/pull-queue-set.d.ts.map +0 -1
  388. package/dist/leader-thread/pull-queue-set.js +0 -39
  389. package/dist/leader-thread/pull-queue-set.js.map +0 -1
  390. package/dist/mutation.d.ts +0 -20
  391. package/dist/mutation.d.ts.map +0 -1
  392. package/dist/mutation.js +0 -57
  393. package/dist/mutation.js.map +0 -1
  394. package/dist/query-builder/api.d.ts +0 -190
  395. package/dist/query-builder/api.d.ts.map +0 -1
  396. package/dist/query-builder/api.js +0 -8
  397. package/dist/query-builder/api.js.map +0 -1
  398. package/dist/query-builder/impl.d.ts +0 -12
  399. package/dist/query-builder/impl.d.ts.map +0 -1
  400. package/dist/query-builder/impl.js +0 -244
  401. package/dist/query-builder/impl.js.map +0 -1
  402. package/dist/query-builder/impl.test.d.ts +0 -2
  403. package/dist/query-builder/impl.test.d.ts.map +0 -1
  404. package/dist/query-builder/impl.test.js +0 -212
  405. package/dist/query-builder/impl.test.js.map +0 -1
  406. package/dist/query-builder/mod.d.ts.map +0 -1
  407. package/dist/query-builder/mod.js.map +0 -1
  408. package/dist/query-info.d.ts +0 -38
  409. package/dist/query-info.d.ts.map +0 -1
  410. package/dist/query-info.js +0 -7
  411. package/dist/query-info.js.map +0 -1
  412. package/dist/rehydrate-from-mutationlog.d.ts +0 -14
  413. package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
  414. package/dist/rehydrate-from-mutationlog.js +0 -66
  415. package/dist/rehydrate-from-mutationlog.js.map +0 -1
  416. package/dist/schema/EventId.d.ts +0 -39
  417. package/dist/schema/EventId.d.ts.map +0 -1
  418. package/dist/schema/EventId.js +0 -38
  419. package/dist/schema/EventId.js.map +0 -1
  420. package/dist/schema/EventId.test.d.ts +0 -2
  421. package/dist/schema/EventId.test.d.ts.map +0 -1
  422. package/dist/schema/EventId.test.js +0 -11
  423. package/dist/schema/EventId.test.js.map +0 -1
  424. package/dist/schema/MutationEvent.d.ts +0 -166
  425. package/dist/schema/MutationEvent.d.ts.map +0 -1
  426. package/dist/schema/MutationEvent.js +0 -72
  427. package/dist/schema/MutationEvent.js.map +0 -1
  428. package/dist/schema/MutationEvent.test.d.ts +0 -2
  429. package/dist/schema/MutationEvent.test.d.ts.map +0 -1
  430. package/dist/schema/MutationEvent.test.js +0 -2
  431. package/dist/schema/MutationEvent.test.js.map +0 -1
  432. package/dist/schema/mutations.d.ts +0 -107
  433. package/dist/schema/mutations.d.ts.map +0 -1
  434. package/dist/schema/mutations.js +0 -42
  435. package/dist/schema/mutations.js.map +0 -1
  436. package/dist/schema/schema-helpers.d.ts.map +0 -1
  437. package/dist/schema/schema-helpers.js.map +0 -1
  438. package/dist/schema/system-tables.d.ts +0 -399
  439. package/dist/schema/system-tables.d.ts.map +0 -1
  440. package/dist/schema/system-tables.js +0 -59
  441. package/dist/schema/system-tables.js.map +0 -1
  442. package/dist/schema/table-def.d.ts +0 -156
  443. package/dist/schema/table-def.d.ts.map +0 -1
  444. package/dist/schema/table-def.js +0 -79
  445. package/dist/schema/table-def.js.map +0 -1
  446. package/dist/schema-management/validate-mutation-defs.d.ts +0 -8
  447. package/dist/schema-management/validate-mutation-defs.d.ts.map +0 -1
  448. package/dist/schema-management/validate-mutation-defs.js +0 -39
  449. package/dist/schema-management/validate-mutation-defs.js.map +0 -1
  450. package/dist/sync/client-session-sync-processor.d.ts +0 -45
  451. package/dist/sync/client-session-sync-processor.d.ts.map +0 -1
  452. package/dist/sync/client-session-sync-processor.js +0 -131
  453. package/dist/sync/client-session-sync-processor.js.map +0 -1
  454. package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
  455. package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
  456. package/src/derived-mutations.test.ts +0 -101
  457. package/src/derived-mutations.ts +0 -170
  458. package/src/devtools/devtools-bridge.ts +0 -14
  459. package/src/devtools/devtools-window-message.ts +0 -27
  460. package/src/devtools/index.ts +0 -48
  461. package/src/init-singleton-tables.ts +0 -24
  462. package/src/leader-thread/apply-mutation.ts +0 -161
  463. package/src/leader-thread/mutationlog.ts +0 -46
  464. package/src/leader-thread/pull-queue-set.ts +0 -58
  465. package/src/mutation.ts +0 -91
  466. package/src/query-builder/api.ts +0 -289
  467. package/src/query-builder/impl.test.ts +0 -239
  468. package/src/query-builder/impl.ts +0 -285
  469. package/src/query-info.ts +0 -78
  470. package/src/rehydrate-from-mutationlog.ts +0 -119
  471. package/src/schema/EventId.test.ts +0 -12
  472. package/src/schema/EventId.ts +0 -60
  473. package/src/schema/MutationEvent.ts +0 -181
  474. package/src/schema/mutations.ts +0 -192
  475. package/src/schema/system-tables.ts +0 -105
  476. package/src/schema/table-def.ts +0 -343
  477. package/src/schema-management/validate-mutation-defs.ts +0 -63
  478. package/src/sync/next/test/mutation-fixtures.ts +0 -224
  479. package/tsconfig.json +0 -11
  480. /package/dist/schema/{schema-helpers.d.ts → state/sqlite/schema-helpers.d.ts} +0 -0
@@ -0,0 +1,14 @@
1
+ // Based on https://stackoverflow.com/a/7616484
2
+ export const hashCode = (str: string) => {
3
+ let hash = 0,
4
+ i,
5
+ chr
6
+ if (str.length === 0) return hash
7
+ for (i = 0; i < str.length; i++) {
8
+ // eslint-disable-next-line unicorn/prefer-code-point
9
+ chr = str.charCodeAt(i)
10
+ hash = (hash << 5) - hash + chr
11
+ hash = Math.trunc(hash) // Convert to 32bit integer
12
+ }
13
+ return hash
14
+ }
@@ -0,0 +1,2 @@
1
+ export * as SqliteDsl from './dsl/mod.js'
2
+ export * as SqliteAst from './ast/sqlite.js'
@@ -0,0 +1,73 @@
1
+ import { shouldNeverHappen } from '@livestore/utils'
2
+
3
+ import type { MigrationOptions } from '../../../adapter-types.js'
4
+ import { type Materializer, rawSqlEvent, rawSqlMaterializer } from '../../EventDef.js'
5
+ import type { InternalState } from '../../schema.js'
6
+ import { ClientDocumentTableDefSymbol, tableIsClientDocumentTable } from './client-document-def.js'
7
+ import { SqliteAst } from './db-schema/mod.js'
8
+ import { stateSystemTables } from './system-tables.js'
9
+ import { type TableDef, type TableDefBase } from './table-def.js'
10
+
11
+ export * from './table-def.js'
12
+ export {
13
+ ClientDocumentTableDefSymbol,
14
+ tableIsClientDocumentTable,
15
+ clientDocument,
16
+ type ClientDocumentTableDef,
17
+ type ClientDocumentTableOptions,
18
+ } from './client-document-def.js'
19
+ export * from '../../EventDef.js'
20
+
21
+ export const makeState = <TStateInput extends InputState>(inputSchema: TStateInput): InternalState => {
22
+ const inputTables: ReadonlyArray<TableDef> = Array.isArray(inputSchema.tables)
23
+ ? inputSchema.tables
24
+ : Object.values(inputSchema.tables)
25
+
26
+ const tables = new Map<string, TableDef.Any>()
27
+
28
+ for (const tableDef of inputTables) {
29
+ const sqliteDef = tableDef.sqliteDef
30
+ // TODO validate tables (e.g. index names are unique)
31
+ if (tables.has(sqliteDef.ast.name)) {
32
+ shouldNeverHappen(`Duplicate table name: ${sqliteDef.ast.name}. Please use unique names for tables.`)
33
+ }
34
+ tables.set(sqliteDef.ast.name, tableDef)
35
+ }
36
+
37
+ for (const tableDef of stateSystemTables) {
38
+ tables.set(tableDef.sqliteDef.name, tableDef)
39
+ }
40
+
41
+ const materializers = new Map<string, Materializer<any>>()
42
+
43
+ for (const [name, materializer] of Object.entries(inputSchema.materializers)) {
44
+ materializers.set(name, materializer)
45
+ }
46
+
47
+ materializers.set(rawSqlEvent.name, rawSqlMaterializer)
48
+
49
+ for (const tableDef of inputTables) {
50
+ if (tableIsClientDocumentTable(tableDef)) {
51
+ materializers.set(
52
+ tableDef[ClientDocumentTableDefSymbol].derived.setEventDef.name,
53
+ tableDef[ClientDocumentTableDefSymbol].derived.setMaterializer,
54
+ )
55
+ }
56
+ }
57
+
58
+ const hash = SqliteAst.hash({
59
+ _tag: 'dbSchema',
60
+ tables: [...tables.values()].map((_) => _.sqliteDef.ast),
61
+ })
62
+
63
+ return { sqlite: { tables, migrations: inputSchema.migrations ?? { strategy: 'auto' }, hash }, materializers }
64
+ }
65
+
66
+ export type InputState = {
67
+ readonly tables: Record<string, TableDefBase> | ReadonlyArray<TableDefBase>
68
+ readonly materializers: Record<string, Materializer<any>>
69
+ /**
70
+ * @default { strategy: 'auto' }
71
+ */
72
+ readonly migrations?: MigrationOptions
73
+ }
@@ -0,0 +1,440 @@
1
+ import type { GetValForKey, SingleOrReadonlyArray } 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 { SqlValue } from '../../../../util.js'
6
+ import type { ClientDocumentTableDef } from '../client-document-def.js'
7
+ import type { SqliteDsl } from '../db-schema/mod.js'
8
+ import type { TableDefBase } from '../table-def.js'
9
+
10
+ export type QueryBuilderAst =
11
+ | QueryBuilderAst.SelectQuery
12
+ | QueryBuilderAst.CountQuery
13
+ | QueryBuilderAst.RowQuery
14
+ | QueryBuilderAst.InsertQuery
15
+ | QueryBuilderAst.UpdateQuery
16
+ | QueryBuilderAst.DeleteQuery
17
+
18
+ export namespace QueryBuilderAst {
19
+ export interface SelectQuery {
20
+ readonly _tag: 'SelectQuery'
21
+ readonly columns: string[]
22
+ readonly pickFirst: false | { fallback: () => any } | 'throws'
23
+ readonly select: {
24
+ columns: ReadonlyArray<string>
25
+ }
26
+ readonly orderBy: ReadonlyArray<OrderBy>
27
+ readonly offset: Option.Option<number>
28
+ readonly limit: Option.Option<number>
29
+ readonly tableDef: TableDefBase
30
+ readonly where: ReadonlyArray<QueryBuilderAst.Where>
31
+ readonly resultSchemaSingle: Schema.Schema<any>
32
+ }
33
+
34
+ export interface CountQuery {
35
+ readonly _tag: 'CountQuery'
36
+ readonly tableDef: TableDefBase
37
+ readonly where: ReadonlyArray<QueryBuilderAst.Where>
38
+ readonly resultSchema: Schema.Schema<number, ReadonlyArray<{ count: number }>>
39
+ }
40
+
41
+ export interface RowQuery {
42
+ readonly _tag: 'RowQuery'
43
+ readonly tableDef: ClientDocumentTableDef.Any
44
+ readonly id: string | SessionIdSymbol
45
+ readonly explicitDefaultValues: Record<string, unknown>
46
+ }
47
+
48
+ export interface InsertQuery {
49
+ readonly _tag: 'InsertQuery'
50
+ readonly tableDef: TableDefBase
51
+ readonly values: Record<string, unknown>
52
+ readonly onConflict: OnConflict | undefined
53
+ readonly returning: string[] | undefined
54
+ readonly resultSchema: Schema.Schema<any>
55
+ }
56
+
57
+ export interface OnConflict {
58
+ /** Conflicting column name */
59
+ readonly targets: string[]
60
+ readonly action:
61
+ | { readonly _tag: 'ignore' }
62
+ | { readonly _tag: 'replace' }
63
+ | {
64
+ readonly _tag: 'update'
65
+ readonly update: Record<string, unknown>
66
+ }
67
+ }
68
+
69
+ export interface UpdateQuery {
70
+ readonly _tag: 'UpdateQuery'
71
+ readonly tableDef: TableDefBase
72
+ readonly values: Record<string, unknown>
73
+ readonly where: ReadonlyArray<QueryBuilderAst.Where>
74
+ readonly returning: string[] | undefined
75
+ readonly resultSchema: Schema.Schema<any>
76
+ }
77
+
78
+ export interface DeleteQuery {
79
+ readonly _tag: 'DeleteQuery'
80
+ readonly tableDef: TableDefBase
81
+ readonly where: ReadonlyArray<QueryBuilderAst.Where>
82
+ readonly returning: string[] | undefined
83
+ readonly resultSchema: Schema.Schema<any>
84
+ }
85
+
86
+ export type WriteQuery = InsertQuery | UpdateQuery | DeleteQuery
87
+
88
+ export interface Where {
89
+ readonly col: string
90
+ readonly op: QueryBuilder.WhereOps
91
+ readonly value: unknown
92
+ }
93
+
94
+ export interface OrderBy {
95
+ readonly col: string
96
+ readonly direction: 'asc' | 'desc'
97
+ }
98
+ }
99
+
100
+ export const QueryBuilderAstSymbol = Symbol.for('QueryBuilderAst')
101
+ export type QueryBuilderAstSymbol = typeof QueryBuilderAstSymbol
102
+
103
+ export const QueryBuilderResultSymbol = Symbol.for('QueryBuilderResult')
104
+ export type QueryBuilderResultSymbol = typeof QueryBuilderResultSymbol
105
+
106
+ export const QueryBuilderTypeId = Symbol.for('QueryBuilder')
107
+ export type QueryBuilderTypeId = typeof QueryBuilderTypeId
108
+
109
+ export const isQueryBuilder = (value: unknown): value is QueryBuilder<any, any, any> =>
110
+ Predicate.hasProperty(value, QueryBuilderTypeId)
111
+
112
+ export type QueryBuilder<
113
+ TResult,
114
+ TTableDef extends TableDefBase,
115
+ /** Used to gradually remove features from the API based on the query context */
116
+ TWithout extends QueryBuilder.ApiFeature = never,
117
+ > = {
118
+ readonly [QueryBuilderTypeId]: QueryBuilderTypeId
119
+ readonly [QueryBuilderAstSymbol]: QueryBuilderAst
120
+ readonly ['ResultType']: TResult
121
+ readonly asSql: () => { query: string; bindValues: SqlValue[] }
122
+ readonly toString: () => string
123
+ } & Omit<QueryBuilder.ApiFull<TResult, TTableDef, TWithout>, TWithout>
124
+
125
+ export namespace QueryBuilder {
126
+ export type Any = QueryBuilder<any, any, any>
127
+ export type WhereOps = WhereOps.Equality | WhereOps.Order | WhereOps.Like | WhereOps.In
128
+
129
+ export namespace WhereOps {
130
+ export type Equality = '=' | '!='
131
+ export type Order = '<' | '>' | '<=' | '>='
132
+ export type Like = 'LIKE' | 'NOT LIKE' | 'ILIKE' | 'NOT ILIKE'
133
+ export type In = 'IN' | 'NOT IN'
134
+
135
+ export type SingleValue = Equality | Order | Like
136
+ export type MultiValue = In
137
+ }
138
+
139
+ export type ApiFeature =
140
+ | 'select'
141
+ | 'where'
142
+ | 'count'
143
+ | 'orderBy'
144
+ | 'offset'
145
+ | 'limit'
146
+ | 'first'
147
+ | 'row'
148
+ | 'insert'
149
+ | 'update'
150
+ | 'delete'
151
+ | 'returning'
152
+ | 'onConflict'
153
+
154
+ export type WhereParams<TTableDef extends TableDefBase> = Partial<{
155
+ [K in keyof TTableDef['sqliteDef']['columns']]:
156
+ | TTableDef['sqliteDef']['columns'][K]['schema']['Type']
157
+ | { op: QueryBuilder.WhereOps.SingleValue; value: TTableDef['sqliteDef']['columns'][K]['schema']['Type'] }
158
+ | {
159
+ op: QueryBuilder.WhereOps.MultiValue
160
+ value: ReadonlyArray<TTableDef['sqliteDef']['columns'][K]['schema']['Type']>
161
+ }
162
+ | undefined
163
+ }>
164
+
165
+ export type OrderByParams<TTableDef extends TableDefBase> = ReadonlyArray<{
166
+ col: keyof TTableDef['sqliteDef']['columns'] & string
167
+ direction: 'asc' | 'desc'
168
+ }>
169
+
170
+ export type ApiFull<TResult, TTableDef extends TableDefBase, TWithout extends ApiFeature> = {
171
+ /**
172
+ * `SELECT *` is the default
173
+ *
174
+ * Example:
175
+ * ```ts
176
+ * db.todos.select('id', 'text', 'completed')
177
+ * db.todos.select('id')
178
+ * ```
179
+ */
180
+ readonly select: {
181
+ /** Selects and plucks a single column */
182
+ <TColumn extends keyof TTableDef['sqliteDef']['columns'] & string>(
183
+ pluckColumn: TColumn,
184
+ ): QueryBuilder<
185
+ ReadonlyArray<TTableDef['sqliteDef']['columns'][TColumn]['schema']['Type']>,
186
+ TTableDef,
187
+ TWithout | 'row' | 'select' | 'returning' | 'onConflict'
188
+ >
189
+ /** Select multiple columns */
190
+ <TColumns extends keyof TTableDef['sqliteDef']['columns'] & string>(
191
+ ...columns: TColumns[]
192
+ // TODO also support arbitrary SQL selects
193
+ // params: QueryBuilderSelectParams,
194
+ ): QueryBuilder<
195
+ ReadonlyArray<{
196
+ readonly [K in TColumns]: TTableDef['sqliteDef']['columns'][K]['schema']['Type']
197
+ }>,
198
+ TTableDef,
199
+ TWithout | 'row' | 'select' | 'count' | 'returning' | 'onConflict'
200
+ >
201
+ }
202
+
203
+ /**
204
+ * Notes:
205
+ * - All where clauses are `AND`ed together by default.
206
+ * - `null` values only support `=` and `!=` which is translated to `IS NULL` and `IS NOT NULL`.
207
+ *
208
+ * Example:
209
+ * ```ts
210
+ * db.todos.where('completed', true)
211
+ * db.todos.where('completed', '!=', true)
212
+ * db.todos.where({ completed: true })
213
+ * db.todos.where({ completed: { op: '!=', value: true } })
214
+ * ```
215
+ *
216
+ * TODO: Also support `OR`
217
+ */
218
+ readonly where: {
219
+ (params: QueryBuilder.WhereParams<TTableDef>): QueryBuilder<TResult, TTableDef, TWithout | 'row' | 'select'>
220
+ <TColName extends keyof TTableDef['sqliteDef']['columns']>(
221
+ col: TColName,
222
+ value: TTableDef['sqliteDef']['columns'][TColName]['schema']['Type'],
223
+ ): QueryBuilder<TResult, TTableDef, TWithout | 'row' | 'select'>
224
+ <TColName extends keyof TTableDef['sqliteDef']['columns']>(
225
+ col: TColName,
226
+ op: QueryBuilder.WhereOps,
227
+ value: TTableDef['sqliteDef']['columns'][TColName]['schema']['Type'],
228
+ ): QueryBuilder<TResult, TTableDef, TWithout | 'row' | 'select'>
229
+ }
230
+
231
+ /**
232
+ * Example:
233
+ * ```ts
234
+ * db.todos.count()
235
+ * db.todos.count().where('completed', true)
236
+ * ```
237
+ */
238
+ readonly count: () => QueryBuilder<
239
+ number,
240
+ TTableDef,
241
+ TWithout | 'row' | 'count' | 'select' | 'orderBy' | 'first' | 'offset' | 'limit' | 'returning' | 'onConflict'
242
+ >
243
+
244
+ /**
245
+ * Example:
246
+ * ```ts
247
+ * db.todos.orderBy('createdAt', 'desc')
248
+ * ```
249
+ */
250
+ readonly orderBy: {
251
+ <TColName extends keyof TTableDef['sqliteDef']['columns'] & string>(
252
+ col: TColName,
253
+ direction: 'asc' | 'desc',
254
+ ): QueryBuilder<TResult, TTableDef, TWithout | 'returning' | 'onConflict'>
255
+ <TParams extends QueryBuilder.OrderByParams<TTableDef>>(
256
+ params: TParams,
257
+ ): QueryBuilder<TResult, TTableDef, TWithout | 'returning' | 'onConflict'>
258
+ }
259
+
260
+ /**
261
+ * Example:
262
+ * ```ts
263
+ * db.todos.offset(10)
264
+ * ```
265
+ */
266
+ readonly offset: (
267
+ offset: number,
268
+ ) => QueryBuilder<TResult, TTableDef, TWithout | 'row' | 'offset' | 'orderBy' | 'returning' | 'onConflict'>
269
+
270
+ /**
271
+ * Example:
272
+ * ```ts
273
+ * db.todos.limit(10)
274
+ * ```
275
+ */
276
+ readonly limit: (
277
+ limit: number,
278
+ ) => QueryBuilder<
279
+ TResult,
280
+ TTableDef,
281
+ TWithout | 'row' | 'limit' | 'offset' | 'first' | 'orderBy' | 'returning' | 'onConflict'
282
+ >
283
+
284
+ /**
285
+ * Example:
286
+ * ```ts
287
+ * db.todos.first()
288
+ * db.todos.where('id', '123').first()
289
+ * ```
290
+ *
291
+ * Query will throw if no rows are returned and no fallback is provided.
292
+ */
293
+ readonly first: <TFallback = never>(options?: {
294
+ /** @default 'throws' */
295
+ fallback?: (() => TFallback | GetSingle<TResult>) | 'throws'
296
+ }) => QueryBuilder<
297
+ TFallback | GetSingle<TResult>,
298
+ TTableDef,
299
+ TWithout | 'row' | 'first' | 'orderBy' | 'select' | 'limit' | 'offset' | 'where' | 'returning' | 'onConflict'
300
+ >
301
+
302
+ /**
303
+ * Insert a new row into the table
304
+ *
305
+ * Example:
306
+ * ```ts
307
+ * db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' })
308
+ * ```
309
+ */
310
+ readonly insert: (
311
+ values: TTableDef['insertSchema']['Type'],
312
+ ) => QueryBuilder<
313
+ TResult,
314
+ TTableDef,
315
+ TWithout | 'row' | 'select' | 'count' | 'orderBy' | 'first' | 'offset' | 'limit' | 'where'
316
+ >
317
+
318
+ /**
319
+ * Example: If the row already exists, it will be ignored.
320
+ * ```ts
321
+ * db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' }).onConflict('id', 'ignore')
322
+ * ```
323
+ *
324
+ * Example: If the row already exists, it will be replaced.
325
+ * ```ts
326
+ * db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' }).onConflict('id', 'replace')
327
+ * ```
328
+ *
329
+ * Example: If the row already exists, it will be updated.
330
+ * ```ts
331
+ * db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' }).onConflict('id', 'update', { text: 'Buy soy milk' })
332
+ * ```
333
+ *
334
+ * NOTE This API doesn't yet support composite primary keys.
335
+ */
336
+ readonly onConflict: {
337
+ <TTarget extends SingleOrReadonlyArray<keyof TTableDef['sqliteDef']['columns']>>(
338
+ target: TTarget,
339
+ action: 'ignore' | 'replace',
340
+ ): QueryBuilder<
341
+ TResult,
342
+ TTableDef,
343
+ TWithout | 'row' | 'select' | 'count' | 'orderBy' | 'first' | 'offset' | 'limit' | 'where'
344
+ >
345
+ <TTarget extends SingleOrReadonlyArray<keyof TTableDef['sqliteDef']['columns']>>(
346
+ target: TTarget,
347
+ action: 'update',
348
+ updateValues: Partial<TTableDef['rowSchema']['Type']>,
349
+ ): QueryBuilder<
350
+ TResult,
351
+ TTableDef,
352
+ TWithout | 'row' | 'select' | 'count' | 'orderBy' | 'first' | 'offset' | 'limit' | 'where'
353
+ >
354
+ }
355
+
356
+ /**
357
+ * Similar to the `.select` API but for write queries (insert, update, delete).
358
+ *
359
+ * Example:
360
+ * ```ts
361
+ * db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' }).returning('id')
362
+ * ```
363
+ */
364
+ readonly returning: <TColumns extends keyof TTableDef['sqliteDef']['columns'] & string>(
365
+ ...columns: TColumns[]
366
+ ) => QueryBuilder<
367
+ ReadonlyArray<{
368
+ readonly [K in TColumns]: TTableDef['sqliteDef']['columns'][K]['schema']['Type']
369
+ }>,
370
+ TTableDef
371
+ >
372
+
373
+ /**
374
+ * Update rows in the table that match the where clause
375
+ *
376
+ * Example:
377
+ * ```ts
378
+ * db.todos.update({ status: 'completed' }).where({ id: '123' })
379
+ * ```
380
+ */
381
+ readonly update: (
382
+ values: Partial<TTableDef['rowSchema']['Type']>,
383
+ ) => QueryBuilder<
384
+ TResult,
385
+ TTableDef,
386
+ TWithout | 'row' | 'select' | 'count' | 'orderBy' | 'first' | 'offset' | 'limit' | 'onConflict'
387
+ >
388
+
389
+ /**
390
+ * Delete rows from the table that match the where clause
391
+ *
392
+ * Example:
393
+ * ```ts
394
+ * db.todos.delete().where({ status: 'completed' })
395
+ * ```
396
+ *
397
+ * Note that it's generally recommended to do soft-deletes for synced apps.
398
+ */
399
+ readonly delete: () => QueryBuilder<
400
+ TResult,
401
+ TTableDef,
402
+ TWithout | 'row' | 'select' | 'count' | 'orderBy' | 'first' | 'offset' | 'limit' | 'onConflict'
403
+ >
404
+ }
405
+ }
406
+
407
+ export namespace RowQuery {
408
+ export type GetOrCreateOptions<TTableDef extends ClientDocumentTableDef.TraitAny> = {
409
+ default: Partial<TTableDef['Value']>
410
+ }
411
+
412
+ // TODO get rid of this
413
+ export type RequiredColumnsOptions<TTableDef extends TableDefBase> = {
414
+ /**
415
+ * Values to be inserted into the row if it doesn't exist yet
416
+ */
417
+ explicitDefaultValues: Pick<
418
+ SqliteDsl.FromColumns.RowDecodedAll<TTableDef['sqliteDef']['columns']>,
419
+ SqliteDsl.FromColumns.RequiredInsertColumnNames<Omit<TTableDef['sqliteDef']['columns'], 'id'>>
420
+ >
421
+ }
422
+
423
+ export type Result<TTableDef extends TableDefBase> = SqliteDsl.FromColumns.RowDecoded<
424
+ TTableDef['sqliteDef']['columns']
425
+ >
426
+
427
+ export type DocumentResult<TTableDef extends ClientDocumentTableDef.Any> = GetValForKey<
428
+ SqliteDsl.FromColumns.RowDecoded<TTableDef['sqliteDef']['columns']>,
429
+ 'value'
430
+ >
431
+
432
+ export type ResultEncoded<TTableDef extends TableDefBase> = TTableDef['options']['isClientDocumentTable'] extends true
433
+ ? GetValForKey<SqliteDsl.FromColumns.RowEncoded<TTableDef['sqliteDef']['columns']>, 'value'>
434
+ : SqliteDsl.FromColumns.RowEncoded<TTableDef['sqliteDef']['columns']>
435
+
436
+ export type GetIdColumnType<TTableDef extends TableDefBase> =
437
+ TTableDef['sqliteDef']['columns']['id']['schema']['Type']
438
+ }
439
+
440
+ type GetSingle<T> = T extends ReadonlyArray<infer U> ? U : never