@livestore/common 0.3.0-dev.4 → 0.3.0-dev.41

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 (470) 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 +132 -75
  7. package/dist/adapter-types.d.ts.map +1 -1
  8. package/dist/adapter-types.js +36 -7
  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 -592
  28. package/dist/devtools/devtools-messages.d.ts.map +1 -1
  29. package/dist/devtools/devtools-messages.js +3 -171
  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 +593 -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 +165 -134
  58. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  59. package/dist/leader-thread/make-leader-thread-layer.d.ts +26 -12
  60. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  61. package/dist/leader-thread/make-leader-thread-layer.js +76 -48
  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 +105 -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 +89 -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 +21 -0
  84. package/dist/make-client-session.d.ts.map +1 -0
  85. package/dist/make-client-session.js +51 -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 +84 -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 +35 -15
  104. package/dist/schema/EventId.d.ts.map +1 -1
  105. package/dist/schema/EventId.js +57 -11
  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/LiveStoreEvent.d.ts +255 -0
  112. package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
  113. package/dist/schema/LiveStoreEvent.js +118 -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 +7 -5
  120. package/dist/schema/mod.d.ts.map +1 -1
  121. package/dist/schema/mod.js +7 -5
  122. package/dist/schema/mod.js.map +1 -1
  123. package/dist/schema/schema.d.ts +48 -30
  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 +554 -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 +87 -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 +33 -24
  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 +66 -0
  224. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -0
  225. package/dist/sync/ClientSessionSyncProcessor.js +209 -0
  226. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -0
  227. package/dist/sync/index.d.ts +1 -1
  228. package/dist/sync/index.d.ts.map +1 -1
  229. package/dist/sync/index.js +1 -1
  230. package/dist/sync/index.js.map +1 -1
  231. package/dist/sync/next/compact-events.d.ts.map +1 -1
  232. package/dist/sync/next/facts.d.ts +19 -19
  233. package/dist/sync/next/facts.d.ts.map +1 -1
  234. package/dist/sync/next/facts.js +3 -3
  235. package/dist/sync/next/facts.js.map +1 -1
  236. package/dist/sync/next/history-dag-common.d.ts +6 -7
  237. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  238. package/dist/sync/next/history-dag-common.js +4 -2
  239. package/dist/sync/next/history-dag-common.js.map +1 -1
  240. package/dist/sync/next/history-dag.d.ts.map +1 -1
  241. package/dist/sync/next/history-dag.js +2 -2
  242. package/dist/sync/next/history-dag.js.map +1 -1
  243. package/dist/sync/next/rebase-events.d.ts +10 -8
  244. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  245. package/dist/sync/next/rebase-events.js +11 -8
  246. package/dist/sync/next/rebase-events.js.map +1 -1
  247. package/dist/sync/next/test/compact-events.calculator.test.js +38 -33
  248. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  249. package/dist/sync/next/test/compact-events.test.js +76 -76
  250. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  251. package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +25 -25
  252. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
  253. package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +67 -36
  254. package/dist/sync/next/test/event-fixtures.js.map +1 -0
  255. package/dist/sync/next/test/mod.d.ts +1 -1
  256. package/dist/sync/next/test/mod.d.ts.map +1 -1
  257. package/dist/sync/next/test/mod.js +1 -1
  258. package/dist/sync/next/test/mod.js.map +1 -1
  259. package/dist/sync/sync.d.ts +55 -20
  260. package/dist/sync/sync.d.ts.map +1 -1
  261. package/dist/sync/sync.js +7 -3
  262. package/dist/sync/sync.js.map +1 -1
  263. package/dist/sync/syncstate.d.ts +213 -82
  264. package/dist/sync/syncstate.d.ts.map +1 -1
  265. package/dist/sync/syncstate.js +319 -120
  266. package/dist/sync/syncstate.js.map +1 -1
  267. package/dist/sync/syncstate.test.js +295 -275
  268. package/dist/sync/syncstate.test.js.map +1 -1
  269. package/dist/sync/validate-push-payload.d.ts +2 -2
  270. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  271. package/dist/sync/validate-push-payload.js +2 -2
  272. package/dist/sync/validate-push-payload.js.map +1 -1
  273. package/dist/util.d.ts +2 -2
  274. package/dist/util.d.ts.map +1 -1
  275. package/dist/version.d.ts +1 -1
  276. package/dist/version.d.ts.map +1 -1
  277. package/dist/version.js +1 -1
  278. package/dist/version.js.map +1 -1
  279. package/package.json +13 -6
  280. package/src/__tests__/fixture.ts +36 -15
  281. package/src/adapter-types.ts +116 -83
  282. package/src/debug-info.ts +1 -0
  283. package/src/devtools/devtools-messages-client-session.ts +142 -0
  284. package/src/devtools/devtools-messages-common.ts +115 -0
  285. package/src/devtools/devtools-messages-leader.ts +191 -0
  286. package/src/devtools/devtools-messages.ts +3 -243
  287. package/src/devtools/devtools-sessioninfo.ts +101 -0
  288. package/src/devtools/mod.ts +59 -0
  289. package/src/index.ts +7 -15
  290. package/src/leader-thread/LeaderSyncProcessor.ts +933 -0
  291. package/src/leader-thread/connection.ts +54 -9
  292. package/src/leader-thread/eventlog.ts +194 -0
  293. package/src/leader-thread/leader-worker-devtools.ts +235 -191
  294. package/src/leader-thread/make-leader-thread-layer.ts +138 -78
  295. package/src/leader-thread/materialize-event.ts +169 -0
  296. package/src/leader-thread/mod.ts +1 -1
  297. package/src/leader-thread/recreate-db.ts +38 -39
  298. package/src/leader-thread/shutdown-channel.ts +2 -4
  299. package/src/leader-thread/types.ts +98 -53
  300. package/src/make-client-session.ts +119 -0
  301. package/src/materializer-helper.ts +135 -0
  302. package/src/otel.ts +8 -0
  303. package/src/rematerialize-from-eventlog.ts +117 -0
  304. package/src/schema/EventDef.ts +227 -0
  305. package/src/schema/EventId.test.ts +12 -0
  306. package/src/schema/EventId.ts +75 -15
  307. package/src/schema/LiveStoreEvent.ts +239 -0
  308. package/src/schema/events.ts +1 -0
  309. package/src/schema/mod.ts +7 -5
  310. package/src/schema/schema.ts +85 -81
  311. package/src/schema/state/mod.ts +2 -0
  312. package/src/schema/state/sqlite/client-document-def.test.ts +238 -0
  313. package/src/schema/state/sqlite/client-document-def.ts +444 -0
  314. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +142 -0
  315. package/src/schema/state/sqlite/db-schema/ast/validate.ts +13 -0
  316. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +206 -0
  317. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -0
  318. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +242 -0
  319. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +222 -0
  320. package/src/schema/state/sqlite/db-schema/hash.ts +14 -0
  321. package/src/schema/state/sqlite/db-schema/mod.ts +2 -0
  322. package/src/schema/state/sqlite/mod.ts +73 -0
  323. package/src/schema/state/sqlite/query-builder/api.ts +440 -0
  324. package/src/schema/state/sqlite/query-builder/astToSql.ts +232 -0
  325. package/src/schema/state/sqlite/query-builder/impl.test.ts +608 -0
  326. package/src/schema/state/sqlite/query-builder/impl.ts +350 -0
  327. package/src/{query-builder → schema/state/sqlite/query-builder}/mod.ts +7 -0
  328. package/src/schema/{schema-helpers.ts → state/sqlite/schema-helpers.ts} +1 -1
  329. package/src/schema/state/sqlite/system-tables.ts +116 -0
  330. package/src/schema/state/sqlite/table-def.ts +197 -0
  331. package/src/schema-management/common.ts +7 -7
  332. package/src/schema-management/migrations.ts +43 -37
  333. package/src/schema-management/validate-schema.ts +61 -0
  334. package/src/sql-queries/sql-queries.ts +1 -1
  335. package/src/sql-queries/sql-query-builder.ts +1 -2
  336. package/src/sql-queries/types.ts +3 -1
  337. package/src/sync/ClientSessionSyncProcessor.ts +332 -0
  338. package/src/sync/index.ts +1 -1
  339. package/src/sync/next/facts.ts +32 -33
  340. package/src/sync/next/history-dag-common.ts +9 -5
  341. package/src/sync/next/history-dag.ts +2 -2
  342. package/src/sync/next/rebase-events.ts +22 -16
  343. package/src/sync/next/test/compact-events.calculator.test.ts +45 -45
  344. package/src/sync/next/test/compact-events.test.ts +78 -78
  345. package/src/sync/next/test/event-fixtures.ts +219 -0
  346. package/src/sync/next/test/mod.ts +1 -1
  347. package/src/sync/sync.ts +51 -19
  348. package/src/sync/syncstate.test.ts +335 -308
  349. package/src/sync/syncstate.ts +394 -212
  350. package/src/sync/validate-push-payload.ts +7 -4
  351. package/src/version.ts +1 -1
  352. package/dist/derived-mutations.d.ts +0 -109
  353. package/dist/derived-mutations.d.ts.map +0 -1
  354. package/dist/derived-mutations.js +0 -54
  355. package/dist/derived-mutations.js.map +0 -1
  356. package/dist/derived-mutations.test.d.ts +0 -2
  357. package/dist/derived-mutations.test.d.ts.map +0 -1
  358. package/dist/derived-mutations.test.js +0 -93
  359. package/dist/derived-mutations.test.js.map +0 -1
  360. package/dist/devtools/devtools-bridge.d.ts +0 -12
  361. package/dist/devtools/devtools-bridge.d.ts.map +0 -1
  362. package/dist/devtools/devtools-bridge.js +0 -2
  363. package/dist/devtools/devtools-bridge.js.map +0 -1
  364. package/dist/devtools/devtools-window-message.d.ts +0 -29
  365. package/dist/devtools/devtools-window-message.d.ts.map +0 -1
  366. package/dist/devtools/devtools-window-message.js +0 -33
  367. package/dist/devtools/devtools-window-message.js.map +0 -1
  368. package/dist/devtools/index.d.ts +0 -42
  369. package/dist/devtools/index.d.ts.map +0 -1
  370. package/dist/devtools/index.js +0 -48
  371. package/dist/devtools/index.js.map +0 -1
  372. package/dist/init-singleton-tables.d.ts +0 -4
  373. package/dist/init-singleton-tables.d.ts.map +0 -1
  374. package/dist/init-singleton-tables.js +0 -16
  375. package/dist/init-singleton-tables.js.map +0 -1
  376. package/dist/leader-thread/apply-mutation.d.ts +0 -8
  377. package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
  378. package/dist/leader-thread/apply-mutation.js +0 -95
  379. package/dist/leader-thread/apply-mutation.js.map +0 -1
  380. package/dist/leader-thread/leader-sync-processor.d.ts +0 -47
  381. package/dist/leader-thread/leader-sync-processor.d.ts.map +0 -1
  382. package/dist/leader-thread/leader-sync-processor.js +0 -422
  383. package/dist/leader-thread/leader-sync-processor.js.map +0 -1
  384. package/dist/leader-thread/mutationlog.d.ts +0 -23
  385. package/dist/leader-thread/mutationlog.d.ts.map +0 -1
  386. package/dist/leader-thread/mutationlog.js +0 -27
  387. package/dist/leader-thread/mutationlog.js.map +0 -1
  388. package/dist/leader-thread/pull-queue-set.d.ts +0 -7
  389. package/dist/leader-thread/pull-queue-set.d.ts.map +0 -1
  390. package/dist/leader-thread/pull-queue-set.js +0 -39
  391. package/dist/leader-thread/pull-queue-set.js.map +0 -1
  392. package/dist/mutation.d.ts +0 -13
  393. package/dist/mutation.d.ts.map +0 -1
  394. package/dist/mutation.js +0 -57
  395. package/dist/mutation.js.map +0 -1
  396. package/dist/query-builder/api.d.ts +0 -190
  397. package/dist/query-builder/api.d.ts.map +0 -1
  398. package/dist/query-builder/api.js +0 -8
  399. package/dist/query-builder/api.js.map +0 -1
  400. package/dist/query-builder/impl.d.ts +0 -12
  401. package/dist/query-builder/impl.d.ts.map +0 -1
  402. package/dist/query-builder/impl.js +0 -244
  403. package/dist/query-builder/impl.js.map +0 -1
  404. package/dist/query-builder/impl.test.d.ts +0 -2
  405. package/dist/query-builder/impl.test.d.ts.map +0 -1
  406. package/dist/query-builder/impl.test.js +0 -212
  407. package/dist/query-builder/impl.test.js.map +0 -1
  408. package/dist/query-builder/mod.d.ts.map +0 -1
  409. package/dist/query-builder/mod.js.map +0 -1
  410. package/dist/query-info.d.ts +0 -38
  411. package/dist/query-info.d.ts.map +0 -1
  412. package/dist/query-info.js +0 -7
  413. package/dist/query-info.js.map +0 -1
  414. package/dist/rehydrate-from-mutationlog.d.ts +0 -14
  415. package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
  416. package/dist/rehydrate-from-mutationlog.js +0 -72
  417. package/dist/rehydrate-from-mutationlog.js.map +0 -1
  418. package/dist/schema/MutationEvent.d.ts +0 -191
  419. package/dist/schema/MutationEvent.d.ts.map +0 -1
  420. package/dist/schema/MutationEvent.js +0 -56
  421. package/dist/schema/MutationEvent.js.map +0 -1
  422. package/dist/schema/mutations.d.ts +0 -107
  423. package/dist/schema/mutations.d.ts.map +0 -1
  424. package/dist/schema/mutations.js +0 -42
  425. package/dist/schema/mutations.js.map +0 -1
  426. package/dist/schema/schema-helpers.d.ts.map +0 -1
  427. package/dist/schema/schema-helpers.js.map +0 -1
  428. package/dist/schema/system-tables.d.ts +0 -399
  429. package/dist/schema/system-tables.d.ts.map +0 -1
  430. package/dist/schema/system-tables.js +0 -51
  431. package/dist/schema/system-tables.js.map +0 -1
  432. package/dist/schema/table-def.d.ts +0 -156
  433. package/dist/schema/table-def.d.ts.map +0 -1
  434. package/dist/schema/table-def.js +0 -79
  435. package/dist/schema/table-def.js.map +0 -1
  436. package/dist/schema-management/validate-mutation-defs.d.ts +0 -8
  437. package/dist/schema-management/validate-mutation-defs.d.ts.map +0 -1
  438. package/dist/schema-management/validate-mutation-defs.js +0 -39
  439. package/dist/schema-management/validate-mutation-defs.js.map +0 -1
  440. package/dist/sync/client-session-sync-processor.d.ts +0 -45
  441. package/dist/sync/client-session-sync-processor.d.ts.map +0 -1
  442. package/dist/sync/client-session-sync-processor.js +0 -131
  443. package/dist/sync/client-session-sync-processor.js.map +0 -1
  444. package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
  445. package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
  446. package/src/derived-mutations.test.ts +0 -101
  447. package/src/derived-mutations.ts +0 -166
  448. package/src/devtools/devtools-bridge.ts +0 -13
  449. package/src/devtools/devtools-window-message.ts +0 -27
  450. package/src/devtools/index.ts +0 -48
  451. package/src/init-singleton-tables.ts +0 -24
  452. package/src/leader-thread/apply-mutation.ts +0 -143
  453. package/src/leader-thread/leader-sync-processor.ts +0 -666
  454. package/src/leader-thread/mutationlog.ts +0 -42
  455. package/src/leader-thread/pull-queue-set.ts +0 -58
  456. package/src/mutation.ts +0 -81
  457. package/src/query-builder/api.ts +0 -289
  458. package/src/query-builder/impl.test.ts +0 -239
  459. package/src/query-builder/impl.ts +0 -285
  460. package/src/query-info.ts +0 -78
  461. package/src/rehydrate-from-mutationlog.ts +0 -127
  462. package/src/schema/MutationEvent.ts +0 -161
  463. package/src/schema/mutations.ts +0 -192
  464. package/src/schema/system-tables.ts +0 -97
  465. package/src/schema/table-def.ts +0 -343
  466. package/src/schema-management/validate-mutation-defs.ts +0 -63
  467. package/src/sync/client-session-sync-processor.ts +0 -207
  468. package/src/sync/next/test/mutation-fixtures.ts +0 -231
  469. package/tsconfig.json +0 -11
  470. /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
14
  export type LiveStoreSchema<
22
15
  TDbSchema extends SqliteDsl.DbSchema = SqliteDsl.DbSchema,
23
- TMutationsDefRecord extends MutationDefRecord = MutationDefRecord,
16
+ TEventsDefRecord extends EventDefRecord = EventDefRecord,
24
17
  > = {
25
- readonly _Type: LiveStoreSchemaSymbol
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: State
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 type State = {
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
43
  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
44
+ readonly events: ReadonlyArray<EventDef.AnyWithoutFn> | Record<string, EventDef.AnyWithoutFn>
45
+ readonly state: State
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
+ }