@livestore/common 0.3.0-dev.5 → 0.3.0-dev.50

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 (491) 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 -13
  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 +62 -0
  44. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -0
  45. package/dist/leader-thread/LeaderSyncProcessor.js +595 -0
  46. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -0
  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 +1 -1
  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 +23 -11
  60. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  61. package/dist/leader-thread/make-leader-thread-layer.js +72 -47
  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 +33 -31
  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 +87 -40
  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/EventId.d.ts +43 -25
  104. package/dist/schema/EventId.d.ts.map +1 -1
  105. package/dist/schema/EventId.js +56 -18
  106. package/dist/schema/EventId.js.map +1 -1
  107. package/dist/schema/EventId.test.d.ts +2 -0
  108. package/dist/schema/EventId.test.d.ts.map +1 -0
  109. package/dist/schema/EventId.test.js +11 -0
  110. package/dist/schema/EventId.test.js.map +1 -0
  111. package/dist/schema/EventNumber.d.ts +57 -0
  112. package/dist/schema/EventNumber.d.ts.map +1 -0
  113. package/dist/schema/EventNumber.js +82 -0
  114. package/dist/schema/EventNumber.js.map +1 -0
  115. package/dist/schema/EventNumber.test.d.ts +2 -0
  116. package/dist/schema/EventNumber.test.d.ts.map +1 -0
  117. package/dist/schema/EventNumber.test.js +11 -0
  118. package/dist/schema/EventNumber.test.js.map +1 -0
  119. package/dist/schema/EventSequenceNumber.d.ts +57 -0
  120. package/dist/schema/EventSequenceNumber.d.ts.map +1 -0
  121. package/dist/schema/EventSequenceNumber.js +82 -0
  122. package/dist/schema/EventSequenceNumber.js.map +1 -0
  123. package/dist/schema/EventSequenceNumber.test.d.ts +2 -0
  124. package/dist/schema/EventSequenceNumber.test.d.ts.map +1 -0
  125. package/dist/schema/EventSequenceNumber.test.js +11 -0
  126. package/dist/schema/EventSequenceNumber.test.js.map +1 -0
  127. package/dist/schema/LiveStoreEvent.d.ts +257 -0
  128. package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
  129. package/dist/schema/LiveStoreEvent.js +117 -0
  130. package/dist/schema/LiveStoreEvent.js.map +1 -0
  131. package/dist/schema/events.d.ts +2 -0
  132. package/dist/schema/events.d.ts.map +1 -0
  133. package/dist/schema/events.js +2 -0
  134. package/dist/schema/events.js.map +1 -0
  135. package/dist/schema/mod.d.ts +8 -6
  136. package/dist/schema/mod.d.ts.map +1 -1
  137. package/dist/schema/mod.js +8 -6
  138. package/dist/schema/mod.js.map +1 -1
  139. package/dist/schema/schema.d.ts +50 -32
  140. package/dist/schema/schema.d.ts.map +1 -1
  141. package/dist/schema/schema.js +36 -43
  142. package/dist/schema/schema.js.map +1 -1
  143. package/dist/schema/state/mod.d.ts +3 -0
  144. package/dist/schema/state/mod.d.ts.map +1 -0
  145. package/dist/schema/state/mod.js +3 -0
  146. package/dist/schema/state/mod.js.map +1 -0
  147. package/dist/schema/state/sqlite/client-document-def.d.ts +223 -0
  148. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -0
  149. package/dist/schema/state/sqlite/client-document-def.js +170 -0
  150. package/dist/schema/state/sqlite/client-document-def.js.map +1 -0
  151. package/dist/schema/state/sqlite/client-document-def.test.d.ts +2 -0
  152. package/dist/schema/state/sqlite/client-document-def.test.d.ts.map +1 -0
  153. package/dist/schema/state/sqlite/client-document-def.test.js +201 -0
  154. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -0
  155. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +69 -0
  156. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -0
  157. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +71 -0
  158. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -0
  159. package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts +3 -0
  160. package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts.map +1 -0
  161. package/dist/schema/state/sqlite/db-schema/ast/validate.js +12 -0
  162. package/dist/schema/state/sqlite/db-schema/ast/validate.js.map +1 -0
  163. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +90 -0
  164. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -0
  165. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +87 -0
  166. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -0
  167. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.d.ts +2 -0
  168. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.d.ts.map +1 -0
  169. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +29 -0
  170. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -0
  171. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +90 -0
  172. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -0
  173. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +41 -0
  174. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -0
  175. package/dist/schema/state/sqlite/db-schema/hash.d.ts +2 -0
  176. package/dist/schema/state/sqlite/db-schema/hash.d.ts.map +1 -0
  177. package/dist/schema/state/sqlite/db-schema/hash.js +14 -0
  178. package/dist/schema/state/sqlite/db-schema/hash.js.map +1 -0
  179. package/dist/schema/state/sqlite/db-schema/mod.d.ts +3 -0
  180. package/dist/schema/state/sqlite/db-schema/mod.d.ts.map +1 -0
  181. package/dist/schema/state/sqlite/db-schema/mod.js +3 -0
  182. package/dist/schema/state/sqlite/db-schema/mod.js.map +1 -0
  183. package/dist/schema/state/sqlite/mod.d.ts +17 -0
  184. package/dist/schema/state/sqlite/mod.d.ts.map +1 -0
  185. package/dist/schema/state/sqlite/mod.js +41 -0
  186. package/dist/schema/state/sqlite/mod.js.map +1 -0
  187. package/dist/schema/state/sqlite/query-builder/api.d.ts +294 -0
  188. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -0
  189. package/dist/schema/state/sqlite/query-builder/api.js +6 -0
  190. package/dist/schema/state/sqlite/query-builder/api.js.map +1 -0
  191. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts +7 -0
  192. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -0
  193. package/dist/schema/state/sqlite/query-builder/astToSql.js +190 -0
  194. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -0
  195. package/dist/schema/state/sqlite/query-builder/impl.d.ts +7 -0
  196. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -0
  197. package/dist/schema/state/sqlite/query-builder/impl.js +286 -0
  198. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -0
  199. package/dist/schema/state/sqlite/query-builder/impl.test.d.ts +87 -0
  200. package/dist/schema/state/sqlite/query-builder/impl.test.d.ts.map +1 -0
  201. package/dist/schema/state/sqlite/query-builder/impl.test.js +563 -0
  202. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -0
  203. package/dist/{query-builder → schema/state/sqlite/query-builder}/mod.d.ts +7 -0
  204. package/dist/schema/state/sqlite/query-builder/mod.d.ts.map +1 -0
  205. package/dist/{query-builder → schema/state/sqlite/query-builder}/mod.js +7 -0
  206. package/dist/schema/state/sqlite/query-builder/mod.js.map +1 -0
  207. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -0
  208. package/dist/schema/{schema-helpers.js → state/sqlite/schema-helpers.js} +1 -1
  209. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -0
  210. package/dist/schema/state/sqlite/system-tables.d.ts +574 -0
  211. package/dist/schema/state/sqlite/system-tables.d.ts.map +1 -0
  212. package/dist/schema/state/sqlite/system-tables.js +88 -0
  213. package/dist/schema/state/sqlite/system-tables.js.map +1 -0
  214. package/dist/schema/state/sqlite/table-def.d.ts +84 -0
  215. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -0
  216. package/dist/schema/state/sqlite/table-def.js +36 -0
  217. package/dist/schema/state/sqlite/table-def.js.map +1 -0
  218. package/dist/schema-management/common.d.ts +7 -7
  219. package/dist/schema-management/common.d.ts.map +1 -1
  220. package/dist/schema-management/common.js.map +1 -1
  221. package/dist/schema-management/migrations.d.ts +6 -6
  222. package/dist/schema-management/migrations.d.ts.map +1 -1
  223. package/dist/schema-management/migrations.js +27 -18
  224. package/dist/schema-management/migrations.js.map +1 -1
  225. package/dist/schema-management/validate-schema.d.ts +8 -0
  226. package/dist/schema-management/validate-schema.d.ts.map +1 -0
  227. package/dist/schema-management/validate-schema.js +39 -0
  228. package/dist/schema-management/validate-schema.js.map +1 -0
  229. package/dist/sql-queries/misc.d.ts.map +1 -1
  230. package/dist/sql-queries/sql-queries.d.ts +1 -1
  231. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  232. package/dist/sql-queries/sql-queries.js.map +1 -1
  233. package/dist/sql-queries/sql-query-builder.d.ts +1 -1
  234. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  235. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  236. package/dist/sql-queries/types.d.ts +2 -1
  237. package/dist/sql-queries/types.d.ts.map +1 -1
  238. package/dist/sql-queries/types.js.map +1 -1
  239. package/dist/sync/ClientSessionSyncProcessor.d.ts +66 -0
  240. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -0
  241. package/dist/sync/ClientSessionSyncProcessor.js +209 -0
  242. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -0
  243. package/dist/sync/index.d.ts +1 -1
  244. package/dist/sync/index.d.ts.map +1 -1
  245. package/dist/sync/index.js +1 -1
  246. package/dist/sync/index.js.map +1 -1
  247. package/dist/sync/next/compact-events.d.ts.map +1 -1
  248. package/dist/sync/next/compact-events.js +38 -35
  249. package/dist/sync/next/compact-events.js.map +1 -1
  250. package/dist/sync/next/facts.d.ts +21 -21
  251. package/dist/sync/next/facts.d.ts.map +1 -1
  252. package/dist/sync/next/facts.js +11 -11
  253. package/dist/sync/next/facts.js.map +1 -1
  254. package/dist/sync/next/history-dag-common.d.ts +9 -7
  255. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  256. package/dist/sync/next/history-dag-common.js +10 -5
  257. package/dist/sync/next/history-dag-common.js.map +1 -1
  258. package/dist/sync/next/history-dag.d.ts +0 -2
  259. package/dist/sync/next/history-dag.d.ts.map +1 -1
  260. package/dist/sync/next/history-dag.js +16 -14
  261. package/dist/sync/next/history-dag.js.map +1 -1
  262. package/dist/sync/next/rebase-events.d.ts +10 -8
  263. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  264. package/dist/sync/next/rebase-events.js +18 -10
  265. package/dist/sync/next/rebase-events.js.map +1 -1
  266. package/dist/sync/next/test/compact-events.calculator.test.js +39 -34
  267. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  268. package/dist/sync/next/test/compact-events.test.js +77 -77
  269. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  270. package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +38 -28
  271. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
  272. package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +81 -38
  273. package/dist/sync/next/test/event-fixtures.js.map +1 -0
  274. package/dist/sync/next/test/mod.d.ts +1 -1
  275. package/dist/sync/next/test/mod.d.ts.map +1 -1
  276. package/dist/sync/next/test/mod.js +1 -1
  277. package/dist/sync/next/test/mod.js.map +1 -1
  278. package/dist/sync/sync.d.ts +60 -25
  279. package/dist/sync/sync.d.ts.map +1 -1
  280. package/dist/sync/sync.js +10 -6
  281. package/dist/sync/sync.js.map +1 -1
  282. package/dist/sync/syncstate.d.ts +213 -82
  283. package/dist/sync/syncstate.d.ts.map +1 -1
  284. package/dist/sync/syncstate.js +337 -139
  285. package/dist/sync/syncstate.js.map +1 -1
  286. package/dist/sync/syncstate.test.js +310 -286
  287. package/dist/sync/syncstate.test.js.map +1 -1
  288. package/dist/sync/validate-push-payload.d.ts +2 -2
  289. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  290. package/dist/sync/validate-push-payload.js +4 -4
  291. package/dist/sync/validate-push-payload.js.map +1 -1
  292. package/dist/util.d.ts +2 -2
  293. package/dist/util.d.ts.map +1 -1
  294. package/dist/version.d.ts +2 -2
  295. package/dist/version.d.ts.map +1 -1
  296. package/dist/version.js +2 -2
  297. package/dist/version.js.map +1 -1
  298. package/package.json +13 -6
  299. package/src/__tests__/fixture.ts +36 -15
  300. package/src/adapter-types.ts +107 -68
  301. package/src/debug-info.ts +1 -0
  302. package/src/devtools/devtools-messages-client-session.ts +142 -0
  303. package/src/devtools/devtools-messages-common.ts +115 -0
  304. package/src/devtools/devtools-messages-leader.ts +191 -0
  305. package/src/devtools/devtools-messages.ts +3 -246
  306. package/src/devtools/devtools-sessioninfo.ts +101 -0
  307. package/src/devtools/mod.ts +59 -0
  308. package/src/index.ts +7 -15
  309. package/src/leader-thread/LeaderSyncProcessor.ts +940 -0
  310. package/src/leader-thread/connection.ts +54 -9
  311. package/src/leader-thread/eventlog.ts +199 -0
  312. package/src/leader-thread/leader-worker-devtools.ts +227 -104
  313. package/src/leader-thread/make-leader-thread-layer.ts +128 -78
  314. package/src/leader-thread/materialize-event.ts +173 -0
  315. package/src/leader-thread/mod.ts +1 -1
  316. package/src/leader-thread/recreate-db.ts +38 -39
  317. package/src/leader-thread/shutdown-channel.ts +2 -4
  318. package/src/leader-thread/types.ts +96 -50
  319. package/src/make-client-session.ts +136 -0
  320. package/src/materializer-helper.ts +138 -0
  321. package/src/otel.ts +8 -0
  322. package/src/rematerialize-from-eventlog.ts +117 -0
  323. package/src/schema/EventDef.ts +227 -0
  324. package/src/schema/EventSequenceNumber.test.ts +12 -0
  325. package/src/schema/EventSequenceNumber.ts +121 -0
  326. package/src/schema/LiveStoreEvent.ts +240 -0
  327. package/src/schema/events.ts +1 -0
  328. package/src/schema/mod.ts +8 -6
  329. package/src/schema/schema.ts +88 -84
  330. package/src/schema/state/mod.ts +2 -0
  331. package/src/schema/state/sqlite/client-document-def.test.ts +238 -0
  332. package/src/schema/state/sqlite/client-document-def.ts +444 -0
  333. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +142 -0
  334. package/src/schema/state/sqlite/db-schema/ast/validate.ts +13 -0
  335. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +206 -0
  336. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -0
  337. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +242 -0
  338. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +222 -0
  339. package/src/schema/state/sqlite/db-schema/hash.ts +14 -0
  340. package/src/schema/state/sqlite/db-schema/mod.ts +2 -0
  341. package/src/schema/state/sqlite/mod.ts +73 -0
  342. package/src/schema/state/sqlite/query-builder/api.ts +440 -0
  343. package/src/schema/state/sqlite/query-builder/astToSql.ts +232 -0
  344. package/src/schema/state/sqlite/query-builder/impl.test.ts +617 -0
  345. package/src/schema/state/sqlite/query-builder/impl.ts +351 -0
  346. package/src/{query-builder → schema/state/sqlite/query-builder}/mod.ts +7 -0
  347. package/src/schema/{schema-helpers.ts → state/sqlite/schema-helpers.ts} +1 -1
  348. package/src/schema/state/sqlite/system-tables.ts +117 -0
  349. package/src/schema/state/sqlite/table-def.ts +197 -0
  350. package/src/schema-management/common.ts +7 -7
  351. package/src/schema-management/migrations.ts +37 -31
  352. package/src/schema-management/validate-schema.ts +61 -0
  353. package/src/sql-queries/sql-queries.ts +1 -1
  354. package/src/sql-queries/sql-query-builder.ts +1 -2
  355. package/src/sql-queries/types.ts +3 -1
  356. package/src/sync/ClientSessionSyncProcessor.ts +332 -0
  357. package/src/sync/index.ts +1 -1
  358. package/src/sync/next/compact-events.ts +38 -35
  359. package/src/sync/next/facts.ts +43 -41
  360. package/src/sync/next/history-dag-common.ts +17 -10
  361. package/src/sync/next/history-dag.ts +16 -17
  362. package/src/sync/next/rebase-events.ts +29 -17
  363. package/src/sync/next/test/compact-events.calculator.test.ts +46 -46
  364. package/src/sync/next/test/compact-events.test.ts +79 -79
  365. package/src/sync/next/test/event-fixtures.ts +226 -0
  366. package/src/sync/next/test/mod.ts +1 -1
  367. package/src/sync/sync.ts +60 -24
  368. package/src/sync/syncstate.test.ts +347 -320
  369. package/src/sync/syncstate.ts +422 -230
  370. package/src/sync/validate-push-payload.ts +6 -6
  371. package/src/version.ts +2 -2
  372. package/dist/derived-mutations.d.ts +0 -109
  373. package/dist/derived-mutations.d.ts.map +0 -1
  374. package/dist/derived-mutations.js +0 -54
  375. package/dist/derived-mutations.js.map +0 -1
  376. package/dist/derived-mutations.test.d.ts +0 -2
  377. package/dist/derived-mutations.test.d.ts.map +0 -1
  378. package/dist/derived-mutations.test.js +0 -93
  379. package/dist/derived-mutations.test.js.map +0 -1
  380. package/dist/devtools/devtools-bridge.d.ts +0 -13
  381. package/dist/devtools/devtools-bridge.d.ts.map +0 -1
  382. package/dist/devtools/devtools-bridge.js +0 -2
  383. package/dist/devtools/devtools-bridge.js.map +0 -1
  384. package/dist/devtools/devtools-window-message.d.ts +0 -29
  385. package/dist/devtools/devtools-window-message.d.ts.map +0 -1
  386. package/dist/devtools/devtools-window-message.js +0 -33
  387. package/dist/devtools/devtools-window-message.js.map +0 -1
  388. package/dist/devtools/index.d.ts +0 -42
  389. package/dist/devtools/index.d.ts.map +0 -1
  390. package/dist/devtools/index.js +0 -48
  391. package/dist/devtools/index.js.map +0 -1
  392. package/dist/init-singleton-tables.d.ts +0 -4
  393. package/dist/init-singleton-tables.d.ts.map +0 -1
  394. package/dist/init-singleton-tables.js +0 -16
  395. package/dist/init-singleton-tables.js.map +0 -1
  396. package/dist/leader-thread/apply-mutation.d.ts +0 -8
  397. package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
  398. package/dist/leader-thread/apply-mutation.js +0 -95
  399. package/dist/leader-thread/apply-mutation.js.map +0 -1
  400. package/dist/leader-thread/leader-sync-processor.d.ts +0 -47
  401. package/dist/leader-thread/leader-sync-processor.d.ts.map +0 -1
  402. package/dist/leader-thread/leader-sync-processor.js +0 -425
  403. package/dist/leader-thread/leader-sync-processor.js.map +0 -1
  404. package/dist/leader-thread/mutationlog.d.ts +0 -10
  405. package/dist/leader-thread/mutationlog.d.ts.map +0 -1
  406. package/dist/leader-thread/mutationlog.js +0 -28
  407. package/dist/leader-thread/mutationlog.js.map +0 -1
  408. package/dist/leader-thread/pull-queue-set.d.ts +0 -7
  409. package/dist/leader-thread/pull-queue-set.d.ts.map +0 -1
  410. package/dist/leader-thread/pull-queue-set.js +0 -39
  411. package/dist/leader-thread/pull-queue-set.js.map +0 -1
  412. package/dist/mutation.d.ts +0 -13
  413. package/dist/mutation.d.ts.map +0 -1
  414. package/dist/mutation.js +0 -57
  415. package/dist/mutation.js.map +0 -1
  416. package/dist/query-builder/api.d.ts +0 -190
  417. package/dist/query-builder/api.d.ts.map +0 -1
  418. package/dist/query-builder/api.js +0 -8
  419. package/dist/query-builder/api.js.map +0 -1
  420. package/dist/query-builder/impl.d.ts +0 -12
  421. package/dist/query-builder/impl.d.ts.map +0 -1
  422. package/dist/query-builder/impl.js +0 -244
  423. package/dist/query-builder/impl.js.map +0 -1
  424. package/dist/query-builder/impl.test.d.ts +0 -2
  425. package/dist/query-builder/impl.test.d.ts.map +0 -1
  426. package/dist/query-builder/impl.test.js +0 -212
  427. package/dist/query-builder/impl.test.js.map +0 -1
  428. package/dist/query-builder/mod.d.ts.map +0 -1
  429. package/dist/query-builder/mod.js.map +0 -1
  430. package/dist/query-info.d.ts +0 -38
  431. package/dist/query-info.d.ts.map +0 -1
  432. package/dist/query-info.js +0 -7
  433. package/dist/query-info.js.map +0 -1
  434. package/dist/rehydrate-from-mutationlog.d.ts +0 -14
  435. package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
  436. package/dist/rehydrate-from-mutationlog.js +0 -72
  437. package/dist/rehydrate-from-mutationlog.js.map +0 -1
  438. package/dist/schema/MutationEvent.d.ts +0 -166
  439. package/dist/schema/MutationEvent.d.ts.map +0 -1
  440. package/dist/schema/MutationEvent.js +0 -72
  441. package/dist/schema/MutationEvent.js.map +0 -1
  442. package/dist/schema/mutations.d.ts +0 -107
  443. package/dist/schema/mutations.d.ts.map +0 -1
  444. package/dist/schema/mutations.js +0 -42
  445. package/dist/schema/mutations.js.map +0 -1
  446. package/dist/schema/schema-helpers.d.ts.map +0 -1
  447. package/dist/schema/schema-helpers.js.map +0 -1
  448. package/dist/schema/system-tables.d.ts +0 -399
  449. package/dist/schema/system-tables.d.ts.map +0 -1
  450. package/dist/schema/system-tables.js +0 -58
  451. package/dist/schema/system-tables.js.map +0 -1
  452. package/dist/schema/table-def.d.ts +0 -156
  453. package/dist/schema/table-def.d.ts.map +0 -1
  454. package/dist/schema/table-def.js +0 -79
  455. package/dist/schema/table-def.js.map +0 -1
  456. package/dist/schema-management/validate-mutation-defs.d.ts +0 -8
  457. package/dist/schema-management/validate-mutation-defs.d.ts.map +0 -1
  458. package/dist/schema-management/validate-mutation-defs.js +0 -39
  459. package/dist/schema-management/validate-mutation-defs.js.map +0 -1
  460. package/dist/sync/client-session-sync-processor.d.ts +0 -45
  461. package/dist/sync/client-session-sync-processor.d.ts.map +0 -1
  462. package/dist/sync/client-session-sync-processor.js +0 -131
  463. package/dist/sync/client-session-sync-processor.js.map +0 -1
  464. package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
  465. package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
  466. package/src/derived-mutations.test.ts +0 -101
  467. package/src/derived-mutations.ts +0 -166
  468. package/src/devtools/devtools-bridge.ts +0 -14
  469. package/src/devtools/devtools-window-message.ts +0 -27
  470. package/src/devtools/index.ts +0 -48
  471. package/src/init-singleton-tables.ts +0 -24
  472. package/src/leader-thread/apply-mutation.ts +0 -143
  473. package/src/leader-thread/leader-sync-processor.ts +0 -670
  474. package/src/leader-thread/mutationlog.ts +0 -46
  475. package/src/leader-thread/pull-queue-set.ts +0 -58
  476. package/src/mutation.ts +0 -81
  477. package/src/query-builder/api.ts +0 -289
  478. package/src/query-builder/impl.test.ts +0 -239
  479. package/src/query-builder/impl.ts +0 -285
  480. package/src/query-info.ts +0 -78
  481. package/src/rehydrate-from-mutationlog.ts +0 -127
  482. package/src/schema/EventId.ts +0 -60
  483. package/src/schema/MutationEvent.ts +0 -180
  484. package/src/schema/mutations.ts +0 -192
  485. package/src/schema/system-tables.ts +0 -104
  486. package/src/schema/table-def.ts +0 -343
  487. package/src/schema-management/validate-mutation-defs.ts +0 -63
  488. package/src/sync/client-session-sync-processor.ts +0 -207
  489. package/src/sync/next/test/mutation-fixtures.ts +0 -224
  490. package/tsconfig.json +0 -11
  491. /package/dist/schema/{schema-helpers.d.ts → state/sqlite/schema-helpers.d.ts} +0 -0
@@ -1,123 +1,127 @@
1
- import type { SqliteDsl } from '@livestore/db-schema'
2
- import { SqliteAst } from '@livestore/db-schema'
3
1
  import { isReadonlyArray, shouldNeverHappen } from '@livestore/utils'
4
2
 
5
3
  import type { MigrationOptions } from '../adapter-types.js'
6
- import { makeDerivedMutationDefsForTable } from '../derived-mutations.js'
7
- import {
8
- type MutationDef,
9
- type MutationDefMap,
10
- type MutationDefRecord,
11
- type RawSqlMutation,
12
- rawSqlMutation,
13
- } from './mutations.js'
14
- import { systemTables } from './system-tables.js'
15
- import type { TableDef, TableDefBase } from './table-def.js'
16
- import { tableHasDerivedMutations } from './table-def.js'
4
+ import type { EventDef, EventDefRecord, Materializer, RawSqlEvent } from './EventDef.js'
5
+ import { rawSqlEvent } from './EventDef.js'
6
+ import { tableIsClientDocumentTable } from './state/sqlite/client-document-def.js'
7
+ import type { SqliteDsl } from './state/sqlite/db-schema/mod.js'
8
+ import { stateSystemTables } from './state/sqlite/system-tables.js'
9
+ import type { TableDef } from './state/sqlite/table-def.js'
17
10
 
18
11
  export const LiveStoreSchemaSymbol = Symbol.for('livestore.LiveStoreSchema')
19
12
  export type LiveStoreSchemaSymbol = typeof LiveStoreSchemaSymbol
20
13
 
21
- export type LiveStoreSchema<
14
+ export interface LiveStoreSchema<
22
15
  TDbSchema extends SqliteDsl.DbSchema = SqliteDsl.DbSchema,
23
- TMutationsDefRecord extends MutationDefRecord = MutationDefRecord,
24
- > = {
25
- readonly _Type: LiveStoreSchemaSymbol
16
+ TEventsDefRecord extends EventDefRecord = EventDefRecord,
17
+ > {
18
+ readonly LiveStoreSchemaSymbol: LiveStoreSchemaSymbol
26
19
  /** Only used on type-level */
27
20
  readonly _DbSchemaType: TDbSchema
28
21
  /** Only used on type-level */
29
- readonly _MutationDefMapType: TMutationsDefRecord
22
+ readonly _EventDefMapType: TEventsDefRecord
30
23
 
31
- readonly tables: Map<string, TableDef>
32
- readonly mutations: MutationDefMap
33
- /** Compound hash of all table defs etc */
34
- readonly hash: number
24
+ readonly state: InternalState
25
+ readonly eventsDefsMap: Map<string, EventDef.AnyWithoutFn>
26
+ readonly devtools: {
27
+ /** @default 'default' */
28
+ readonly alias: string
29
+ }
30
+ }
35
31
 
36
- migrationOptions: MigrationOptions
32
+ // TODO abstract this further away from sqlite/tables
33
+ export interface InternalState {
34
+ readonly sqlite: {
35
+ readonly tables: Map<string, TableDef.Any>
36
+ readonly migrations: MigrationOptions
37
+ /** Compound hash of all table defs etc */
38
+ readonly hash: number
39
+ }
40
+ readonly materializers: Map<string, Materializer>
37
41
  }
38
42
 
39
- export type InputSchema = {
40
- readonly tables: Record<string, TableDefBase> | ReadonlyArray<TableDefBase>
41
- readonly mutations?: ReadonlyArray<MutationDef.Any> | Record<string, MutationDef.Any>
42
- /**
43
- * Can be used to isolate multiple LiveStore apps running in the same origin
44
- */
45
- // TODO remove this in favour of storeId
46
- readonly key?: string
43
+ export interface InputSchema {
44
+ readonly events: ReadonlyArray<EventDef.AnyWithoutFn> | Record<string, EventDef.AnyWithoutFn>
45
+ readonly state: InternalState
46
+ readonly devtools?: {
47
+ /**
48
+ * This alias value is used to disambiguate between multiple schemas in the devtools.
49
+ * Only needed when an app uses multiple schemas.
50
+ *
51
+ * @default 'default'
52
+ */
53
+ readonly alias?: string
54
+ }
47
55
  }
48
56
 
49
57
  export const makeSchema = <TInputSchema extends InputSchema>(
50
- /** Note when using the object-notation for tables/mutations, the object keys are ignored and not used as table/mutation names */
51
- inputSchema: TInputSchema & {
52
- /** "hard-reset" is currently the default strategy */
53
- migrations?: MigrationOptions<FromInputSchema.DeriveSchema<TInputSchema>>
54
- },
58
+ /** Note when using the object-notation for tables/events, the object keys are ignored and not used as table/mutation names */
59
+ inputSchema: TInputSchema,
55
60
  ): FromInputSchema.DeriveSchema<TInputSchema> => {
56
- const inputTables: ReadonlyArray<TableDef> = Array.isArray(inputSchema.tables)
57
- ? inputSchema.tables
58
- : Object.values(inputSchema.tables)
61
+ const state = inputSchema.state
62
+ const tables = inputSchema.state.sqlite.tables
59
63
 
60
- const tables = new Map<string, TableDef>()
61
-
62
- for (const tableDef of inputTables) {
63
- // TODO validate tables (e.g. index names are unique)
64
- if (tables.has(tableDef.sqliteDef.ast.name)) {
65
- shouldNeverHappen(`Duplicate table name: ${tableDef.sqliteDef.ast.name}. Please use unique names for tables.`)
66
- }
67
- tables.set(tableDef.sqliteDef.ast.name, tableDef)
68
- }
69
-
70
- for (const tableDef of systemTables) {
71
- // @ts-expect-error TODO fix type level issue
64
+ for (const tableDef of stateSystemTables) {
72
65
  tables.set(tableDef.sqliteDef.name, tableDef)
73
66
  }
74
67
 
75
- const mutations: MutationDefMap = new Map()
68
+ const eventsDefsMap = new Map<string, EventDef.AnyWithoutFn>()
76
69
 
77
- if (isReadonlyArray(inputSchema.mutations)) {
78
- for (const mutation of inputSchema.mutations) {
79
- mutations.set(mutation.name, mutation)
70
+ if (isReadonlyArray(inputSchema.events)) {
71
+ for (const eventDef of inputSchema.events) {
72
+ eventsDefsMap.set(eventDef.name, eventDef)
80
73
  }
81
74
  } else {
82
- for (const mutation of Object.values(inputSchema.mutations ?? {})) {
83
- if (mutations.has(mutation.name)) {
84
- shouldNeverHappen(`Duplicate mutation name: ${mutation.name}. Please use unique names for mutations.`)
75
+ for (const eventDef of Object.values(inputSchema.events ?? {})) {
76
+ if (eventsDefsMap.has(eventDef.name)) {
77
+ shouldNeverHappen(`Duplicate event name: ${eventDef.name}. Please use unique names for events.`)
85
78
  }
86
- mutations.set(mutation.name, mutation)
79
+ eventsDefsMap.set(eventDef.name, eventDef)
87
80
  }
88
81
  }
89
82
 
90
- mutations.set(rawSqlMutation.name, rawSqlMutation)
83
+ eventsDefsMap.set(rawSqlEvent.name, rawSqlEvent)
91
84
 
92
85
  for (const tableDef of tables.values()) {
93
- if (tableHasDerivedMutations(tableDef)) {
94
- const derivedMutationDefs = makeDerivedMutationDefsForTable(tableDef)
95
- mutations.set(derivedMutationDefs.insert.name, derivedMutationDefs.insert)
96
- mutations.set(derivedMutationDefs.update.name, derivedMutationDefs.update)
97
- mutations.set(derivedMutationDefs.delete.name, derivedMutationDefs.delete)
86
+ if (tableIsClientDocumentTable(tableDef) && eventsDefsMap.has(tableDef.set.name) === false) {
87
+ eventsDefsMap.set(tableDef.set.name, tableDef.set)
98
88
  }
99
89
  }
100
90
 
101
- const hash = SqliteAst.hash({
102
- _tag: 'dbSchema',
103
- tables: [...tables.values()].map((_) => _.sqliteDef.ast),
104
- })
105
-
106
91
  return {
107
- _Type: LiveStoreSchemaSymbol,
92
+ LiveStoreSchemaSymbol,
108
93
  _DbSchemaType: Symbol.for('livestore.DbSchemaType') as any,
109
- _MutationDefMapType: Symbol.for('livestore.MutationDefMapType') as any,
110
- tables,
111
- mutations,
112
- migrationOptions: inputSchema.migrations ?? { strategy: 'hard-reset' },
113
- hash,
94
+ _EventDefMapType: Symbol.for('livestore.EventDefMapType') as any,
95
+ state,
96
+ eventsDefsMap,
97
+ devtools: {
98
+ alias: inputSchema.devtools?.alias ?? 'default',
99
+ },
114
100
  } satisfies LiveStoreSchema
115
101
  }
116
102
 
103
+ export const getEventDef = <TSchema extends LiveStoreSchema>(
104
+ schema: TSchema,
105
+ eventName: string,
106
+ ): {
107
+ eventDef: EventDef.AnyWithoutFn
108
+ materializer: Materializer
109
+ } => {
110
+ const eventDef = schema.eventsDefsMap.get(eventName)
111
+ if (eventDef === undefined) {
112
+ return shouldNeverHappen(`No mutation definition found for \`${eventName}\`.`)
113
+ }
114
+ const materializer = schema.state.materializers.get(eventName)
115
+ if (materializer === undefined) {
116
+ return shouldNeverHappen(`No materializer found for \`${eventName}\`.`)
117
+ }
118
+ return { eventDef, materializer }
119
+ }
120
+
117
121
  export namespace FromInputSchema {
118
122
  export type DeriveSchema<TInputSchema extends InputSchema> = LiveStoreSchema<
119
- DbSchemaFromInputSchemaTables<TInputSchema['tables']>,
120
- MutationDefRecordFromInputSchemaMutations<TInputSchema['mutations']>
123
+ DbSchemaFromInputSchemaTables<TInputSchema['state']['sqlite']['tables']>,
124
+ EventDefRecordFromInputSchemaEvents<TInputSchema['events']>
121
125
  >
122
126
 
123
127
  /**
@@ -125,17 +129,17 @@ export namespace FromInputSchema {
125
129
  * - array: we use the table name of each array item (= table definition) as the object key
126
130
  * - object: we discard the keys of the input object and use the table name of each object value (= table definition) as the new object key
127
131
  */
128
- type DbSchemaFromInputSchemaTables<TTables extends InputSchema['tables']> =
132
+ type DbSchemaFromInputSchemaTables<TTables extends InputSchema['state']['sqlite']['tables']> =
129
133
  TTables extends ReadonlyArray<TableDef>
130
134
  ? { [K in TTables[number] as K['sqliteDef']['name']]: K['sqliteDef'] }
131
135
  : TTables extends Record<string, TableDef>
132
136
  ? { [K in keyof TTables as TTables[K]['sqliteDef']['name']]: TTables[K]['sqliteDef'] }
133
137
  : never
134
138
 
135
- type MutationDefRecordFromInputSchemaMutations<TMutations extends InputSchema['mutations']> =
136
- TMutations extends ReadonlyArray<MutationDef.Any>
137
- ? { [K in TMutations[number] as K['name']]: K } & { 'livestore.RawSql': RawSqlMutation }
138
- : TMutations extends { [name: string]: MutationDef.Any }
139
- ? { [K in keyof TMutations as TMutations[K]['name']]: TMutations[K] } & { 'livestore.RawSql': RawSqlMutation }
139
+ type EventDefRecordFromInputSchemaEvents<TEvents extends InputSchema['events']> =
140
+ TEvents extends ReadonlyArray<EventDef.Any>
141
+ ? { [K in TEvents[number] as K['name']]: K } & { 'livestore.RawSql': RawSqlEvent }
142
+ : TEvents extends { [name: string]: EventDef.Any }
143
+ ? { [K in keyof TEvents as TEvents[K]['name']]: TEvents[K] } & { 'livestore.RawSql': RawSqlEvent }
140
144
  : never
141
145
  }
@@ -0,0 +1,2 @@
1
+ export * as SQLite from './sqlite/mod.js'
2
+ export { QueryBuilderAstSymbol, QueryBuilderTypeId } from './sqlite/query-builder/mod.js'
@@ -0,0 +1,238 @@
1
+ import { Schema } from '@livestore/utils/effect'
2
+ import { describe, expect, test } from 'vitest'
3
+
4
+ import { tables } from '../../../__tests__/fixture.js'
5
+ import type * as LiveStoreEvent from '../../LiveStoreEvent.js'
6
+ import { clientDocument, ClientDocumentTableDefSymbol } from './client-document-def.js'
7
+
8
+ describe('client document table', () => {
9
+ test('set event', () => {
10
+ expect(patchId(tables.UiState.set({ showSidebar: false }, 'session-1'))).toMatchInlineSnapshot(`
11
+ {
12
+ "args": {
13
+ "id": "session-1",
14
+ "value": {
15
+ "showSidebar": false,
16
+ },
17
+ },
18
+ "id": "00000000-0000-0000-0000-000000000000",
19
+ "name": "UiStateSet",
20
+ }
21
+ `)
22
+
23
+ expect(patchId(tables.appConfig.set({ fontSize: 12, theme: 'dark' }))).toMatchInlineSnapshot(`
24
+ {
25
+ "args": {
26
+ "id": "static",
27
+ "value": {
28
+ "fontSize": 12,
29
+ "theme": "dark",
30
+ },
31
+ },
32
+ "id": "00000000-0000-0000-0000-000000000000",
33
+ "name": "AppConfigSet",
34
+ }
35
+ `)
36
+ })
37
+
38
+ describe('materializer', () => {
39
+ const forSchema = <T>(schema: Schema.Schema<T, any>, value: T, id?: string, options?: { partialSet?: boolean }) => {
40
+ const Doc = clientDocument({
41
+ name: 'test',
42
+ schema,
43
+ default: { value },
44
+ ...options,
45
+ })
46
+
47
+ const materializer = Doc[ClientDocumentTableDefSymbol].derived.setMaterializer
48
+
49
+ return materializer(Doc.set(value, id as any).args, {
50
+ currentFacts: new Map(),
51
+ query: {} as any, // unused
52
+ eventDef: Doc[ClientDocumentTableDefSymbol].derived.setEventDef,
53
+ })
54
+ }
55
+
56
+ test('string value', () => {
57
+ expect(forSchema(Schema.String, 'hello', 'id1')).toMatchInlineSnapshot(`
58
+ {
59
+ "bindValues": [
60
+ "id1",
61
+ ""hello"",
62
+ ""hello"",
63
+ ],
64
+ "sql": "INSERT INTO 'test' (id, value) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET value = ?",
65
+ "writeTables": Set {
66
+ "test",
67
+ },
68
+ }
69
+ `)
70
+ })
71
+
72
+ test('struct value (partial set=true)', () => {
73
+ expect(forSchema(Schema.Struct({ a: Schema.String }), { a: 'hello' }, 'id1', { partialSet: true }))
74
+ .toMatchInlineSnapshot(`
75
+ {
76
+ "bindValues": [
77
+ "id1",
78
+ "{"a":"hello"}",
79
+ "$.a",
80
+ ""hello"",
81
+ ],
82
+ "sql": "
83
+ INSERT INTO 'test' (id, value)
84
+ VALUES (?, ?)
85
+ ON CONFLICT (id) DO UPDATE SET value = json_set(value, ?, json(?))
86
+ ",
87
+ "writeTables": Set {
88
+ "test",
89
+ },
90
+ }
91
+ `)
92
+ })
93
+
94
+ test('struct value (partial set=false)', () => {
95
+ expect(forSchema(Schema.Struct({ a: Schema.String }), { a: 'hello' }, 'id1', { partialSet: false }))
96
+ .toMatchInlineSnapshot(`
97
+ {
98
+ "bindValues": [
99
+ "id1",
100
+ "{"a":"hello"}",
101
+ "{"a":"hello"}",
102
+ ],
103
+ "sql": "INSERT INTO 'test' (id, value) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET value = ?",
104
+ "writeTables": Set {
105
+ "test",
106
+ },
107
+ }
108
+ `)
109
+ })
110
+
111
+ test('struct value (partial set=true) advanced', () => {
112
+ expect(
113
+ forSchema(
114
+ Schema.Struct({ a: Schema.String, b: Schema.String, c: Schema.Number }),
115
+ { a: 'hello', c: 123 } as any,
116
+ 'id1',
117
+ { partialSet: true },
118
+ ),
119
+ ).toMatchInlineSnapshot(`
120
+ {
121
+ "bindValues": [
122
+ "id1",
123
+ "{"a":"hello","c":123}",
124
+ "$.a",
125
+ ""hello"",
126
+ "$.c",
127
+ "123",
128
+ ],
129
+ "sql": "
130
+ INSERT INTO 'test' (id, value)
131
+ VALUES (?, ?)
132
+ ON CONFLICT (id) DO UPDATE SET value = json_set(json_set(value, ?, json(?)), ?, json(?))
133
+ ",
134
+ "writeTables": Set {
135
+ "test",
136
+ },
137
+ }
138
+ `)
139
+ })
140
+
141
+ test('struct value (partial set=true), explicit undefined, filter out undefined values', () => {
142
+ expect(
143
+ forSchema(
144
+ Schema.Struct({ a: Schema.String.pipe(Schema.optional), b: Schema.String }),
145
+ { a: undefined, b: 'hello' },
146
+ 'id1',
147
+ {
148
+ partialSet: true,
149
+ },
150
+ ),
151
+ ).toMatchInlineSnapshot(`
152
+ {
153
+ "bindValues": [
154
+ "id1",
155
+ "{"b":"hello"}",
156
+ "$.b",
157
+ ""hello"",
158
+ ],
159
+ "sql": "
160
+ INSERT INTO 'test' (id, value)
161
+ VALUES (?, ?)
162
+ ON CONFLICT (id) DO UPDATE SET value = json_set(value, ?, json(?))
163
+ ",
164
+ "writeTables": Set {
165
+ "test",
166
+ },
167
+ }
168
+ `)
169
+ })
170
+
171
+ test('struct value (partial set=true), explicit undefined, nothing to update', () => {
172
+ expect(
173
+ forSchema(Schema.Struct({ a: Schema.String.pipe(Schema.optional) }), { a: undefined }, 'id1', {
174
+ partialSet: true,
175
+ }),
176
+ ).toMatchInlineSnapshot(`
177
+ {
178
+ "bindValues": [
179
+ "id1",
180
+ "{}",
181
+ ],
182
+ "sql": "
183
+ INSERT INTO 'test' (id, value)
184
+ VALUES (?, ?)
185
+ ON CONFLICT (id) DO NOTHING
186
+ ",
187
+ "writeTables": Set {
188
+ "test",
189
+ },
190
+ }
191
+ `)
192
+ })
193
+
194
+ test('struct union value', () => {
195
+ expect(
196
+ forSchema(
197
+ Schema.Union(Schema.Struct({ a: Schema.String }), Schema.Struct({ b: Schema.String })),
198
+ { a: 'hello' },
199
+ 'id1',
200
+ ),
201
+ ).toMatchInlineSnapshot(`
202
+ {
203
+ "bindValues": [
204
+ "id1",
205
+ "{"a":"hello"}",
206
+ "{"a":"hello"}",
207
+ ],
208
+ "sql": "INSERT INTO 'test' (id, value) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET value = ?",
209
+ "writeTables": Set {
210
+ "test",
211
+ },
212
+ }
213
+ `)
214
+ })
215
+
216
+ test('array value', () => {
217
+ expect(forSchema(Schema.Array(Schema.String), ['hello', 'world'], 'id1')).toMatchInlineSnapshot(`
218
+ {
219
+ "bindValues": [
220
+ "id1",
221
+ "["hello","world"]",
222
+ "["hello","world"]",
223
+ ],
224
+ "sql": "INSERT INTO 'test' (id, value) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET value = ?",
225
+ "writeTables": Set {
226
+ "test",
227
+ },
228
+ }
229
+ `)
230
+ })
231
+ })
232
+ })
233
+
234
+ const patchId = (muationEvent: LiveStoreEvent.PartialAnyDecoded) => {
235
+ // TODO use new id paradigm
236
+ const id = `00000000-0000-0000-0000-000000000000`
237
+ return { ...muationEvent, id }
238
+ }