@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
@@ -1,343 +0,0 @@
1
- import type { Nullable, PrettifyFlat } from '@livestore/db-schema'
2
- import { SqliteDsl } from '@livestore/db-schema'
3
- import { shouldNeverHappen } from '@livestore/utils'
4
- import { ReadonlyRecord, Schema } from '@livestore/utils/effect'
5
-
6
- import type { DerivedMutationHelperFns } from '../derived-mutations.js'
7
- import { makeDerivedMutationDefsForTable } from '../derived-mutations.js'
8
- import type { QueryBuilder } from '../query-builder/mod.js'
9
- import { makeQueryBuilder } from '../query-builder/mod.js'
10
-
11
- export const { blob, boolean, column, datetime, integer, isColumnDefinition, json, real, text } = SqliteDsl
12
-
13
- export { SqliteDsl } from '@livestore/db-schema'
14
-
15
- export type StateType = 'singleton' | 'dynamic'
16
-
17
- export type DefaultSqliteTableDef = SqliteDsl.TableDefinition<string, SqliteDsl.Columns>
18
- export type DefaultSqliteTableDefConstrained = SqliteDsl.TableDefinition<string, SqliteDsl.ConstraintColumns>
19
-
20
- export type TableDefBase<
21
- TSqliteDef extends DefaultSqliteTableDef = DefaultSqliteTableDefConstrained,
22
- TOptions extends TableOptions = TableOptions,
23
- TSchema = SqliteDsl.StructSchemaForColumns<TSqliteDef['columns']>,
24
- > = {
25
- sqliteDef: TSqliteDef
26
- options: TOptions
27
- // Derived from `sqliteDef`, so only exposed for convenience
28
- schema: TSchema
29
- }
30
-
31
- export type TableDef<
32
- TSqliteDef extends DefaultSqliteTableDef = DefaultSqliteTableDefConstrained,
33
- TOptions extends TableOptions = TableOptions,
34
- // NOTE we're not using `SqliteDsl.StructSchemaForColumns<TSqliteDef['columns']>`
35
- // as we don't want the alias type for users to show up, so we're redefining it here
36
- TSchema = Schema.Schema<
37
- SqliteDsl.AnyIfConstained<
38
- TSqliteDef['columns'],
39
- { readonly [K in keyof TSqliteDef['columns']]: TSqliteDef['columns'][K]['schema']['Type'] }
40
- >,
41
- SqliteDsl.AnyIfConstained<
42
- TSqliteDef['columns'],
43
- { readonly [K in keyof TSqliteDef['columns']]: TSqliteDef['columns'][K]['schema']['Encoded'] }
44
- >
45
- >,
46
- > = {
47
- sqliteDef: TSqliteDef
48
- options: TOptions
49
- // Derived from `sqliteDef`, so only exposed for convenience
50
- schema: TSchema
51
- query: QueryBuilder<ReadonlyArray<Schema.Schema.Type<TSchema>>, TableDef<TSqliteDef & {}, TOptions>>
52
- } & (TOptions['deriveMutations']['enabled'] extends true
53
- ? DerivedMutationHelperFns<TSqliteDef['columns'], TOptions>
54
- : {})
55
-
56
- export type TableOptionsInput = Partial<{
57
- indexes: SqliteDsl.Index[]
58
- disableAutomaticIdColumn: boolean
59
- isSingleton: boolean
60
- deriveMutations:
61
- | boolean
62
- | {
63
- enabled: true
64
- localOnly?: boolean
65
- }
66
- }>
67
-
68
- type ToColumns<TColumns extends SqliteDsl.Columns | SqliteDsl.ColumnDefinition<any, any>> =
69
- TColumns extends SqliteDsl.Columns
70
- ? TColumns
71
- : TColumns extends SqliteDsl.ColumnDefinition<any, any>
72
- ? { value: TColumns }
73
- : never
74
-
75
- type ValidateTableOptionsInput<
76
- TColumns extends SqliteDsl.Columns | SqliteDsl.ColumnDefinition<any, any>,
77
- TOptionsInput extends TableOptionsInput,
78
- TPassthroughIfValid,
79
- > =
80
- SqliteDsl.FromColumns.RequiresInsertValues<ToColumns<TColumns>> extends true
81
- ? TOptionsInput['isSingleton'] extends true
82
- ? 'Error: To use `isSingleton: true` with this table, each column must have a default value or be nullable'
83
- : TPassthroughIfValid
84
- : TPassthroughIfValid
85
-
86
- export type TableOptions = {
87
- /**
88
- * Setting this to true will have the following consequences:
89
- * - An `id` column will be added with `primaryKey: true` and `"singleton"` as default value and only allowed value
90
- * - LiveStore will automatically create the singleton row when booting up
91
- * - LiveStore will fail if there is already a column defined with `primaryKey: true`
92
- *
93
- * @default false
94
- */
95
- readonly isSingleton: boolean
96
-
97
- readonly disableAutomaticIdColumn: boolean
98
-
99
- /**
100
- * Setting this to true will automatically derive insert, update and delete mutations for this table. Example:
101
- *
102
- * ```ts
103
- * const todos = table('todos', { ... }, { deriveMutations: true })
104
- * todos.insert({ id: '1', text: 'Hello' })
105
- * ```
106
- *
107
- * This is also a prerequisite for using the `useRow`, `useAtom` and `rowQuery` APIs.
108
- *
109
- * Important: When using this option, make sure you're following the "Rules of mutations" for the table schema.
110
- */
111
- readonly deriveMutations:
112
- | { enabled: false }
113
- | {
114
- enabled: true
115
- /**
116
- * When set to true, the mutations won't be synced over the network
117
- */
118
- localOnly: boolean
119
- }
120
-
121
- /** Derived based on whether the table definition has one or more columns (besides the `id` column) */
122
- readonly isSingleColumn: boolean
123
-
124
- /**
125
- * Derived based on whether the table definition has one or more columns (besides the `id` column) that require
126
- * insert values (i.e. are not nullable and don't have a default value)
127
- *
128
- * `isSingleton` tables always imply `requiresInsertValues: false`
129
- */
130
- readonly requiredInsertColumnNames: string
131
- }
132
-
133
- export const table = <
134
- TName extends string,
135
- TColumns extends SqliteDsl.Columns | SqliteDsl.ColumnDefinition<any, any>,
136
- TOptionsInput extends TableOptionsInput = TableOptionsInput,
137
- >(
138
- name: TName,
139
- columnOrColumns: TColumns,
140
- options?: TOptionsInput,
141
- ): ValidateTableOptionsInput<
142
- TColumns,
143
- TOptionsInput,
144
- TableDef<
145
- SqliteTableDefForInput<TName, TColumns, WithDefaults<TOptionsInput, TColumns>>,
146
- WithDefaults<TOptionsInput, TColumns>
147
- >
148
- > => {
149
- const tablePath = name
150
-
151
- const options_: TableOptions = {
152
- isSingleton: options?.isSingleton ?? false,
153
- disableAutomaticIdColumn: options?.disableAutomaticIdColumn ?? false,
154
- deriveMutations:
155
- options?.deriveMutations === true
156
- ? { enabled: true as const, localOnly: false }
157
- : options?.deriveMutations === false
158
- ? { enabled: false as const }
159
- : options?.deriveMutations === undefined
160
- ? { enabled: false as const }
161
- : { enabled: true as const, localOnly: options.deriveMutations.localOnly ?? false },
162
- isSingleColumn: SqliteDsl.isColumnDefinition(columnOrColumns) === true,
163
- requiredInsertColumnNames: 'type-level-only',
164
- }
165
-
166
- const columns = (
167
- SqliteDsl.isColumnDefinition(columnOrColumns) ? { value: columnOrColumns } : columnOrColumns
168
- ) as SqliteDsl.Columns
169
-
170
- if (options_.disableAutomaticIdColumn === true) {
171
- if (columns.id === undefined && options_.isSingleton === true) {
172
- shouldNeverHappen(
173
- `Cannot create table ${name} with "isSingleton: true" because there is no column with name "id" and "disableAutomaticIdColumn: true" is set`,
174
- )
175
- }
176
- } else if (columns.id === undefined && ReadonlyRecord.some(columns, (_) => _.primaryKey === true) === false) {
177
- if (options_.isSingleton) {
178
- columns.id = SqliteDsl.text({ schema: Schema.Literal('singleton'), primaryKey: true, default: 'singleton' })
179
- } else {
180
- columns.id = SqliteDsl.text({ primaryKey: true })
181
- }
182
- }
183
-
184
- const sqliteDef = SqliteDsl.table(tablePath, columns, options?.indexes ?? [])
185
-
186
- // TODO also enforce this on the type level
187
- if (options_.isSingleton) {
188
- for (const column of sqliteDef.ast.columns) {
189
- if (column.nullable === false && column.default._tag === 'None') {
190
- shouldNeverHappen(
191
- `When creating a singleton table, each column must be either nullable or have a default value. Column '${column.name}' is neither.`,
192
- )
193
- }
194
- }
195
- }
196
-
197
- const isSingleColumn = SqliteDsl.isColumnDefinition(columnOrColumns) === true
198
-
199
- const schema = SqliteDsl.structSchemaForTable(sqliteDef)
200
- const tableDef = { sqliteDef, options: options_, schema } satisfies TableDefBase
201
- const query = makeQueryBuilder(tableDef)
202
- // const tableDef = { ...tableDefBase, query } satisfies TableDef
203
-
204
- // NOTE we're currently patching the existing tableDef object
205
- // as it's being used as part of the query builder API
206
- // @ts-expect-error TODO properly implement this
207
- tableDef.query = query
208
-
209
- if (tableHasDerivedMutations(tableDef)) {
210
- const derivedMutationDefs = makeDerivedMutationDefsForTable(tableDef)
211
-
212
- tableDef.insert = (valuesOrValue: any) => {
213
- if (isSingleColumn && options_.isSingleton) {
214
- return derivedMutationDefs.insert({ id: 'singleton', value: { value: valuesOrValue } })
215
- } else {
216
- return derivedMutationDefs.insert(valuesOrValue as any)
217
- }
218
- }
219
-
220
- tableDef.update = (argsOrValues: any) => {
221
- if (isSingleColumn && options_.isSingleton) {
222
- return derivedMutationDefs.update({ where: { id: 'singleton' }, values: { value: argsOrValues } as any })
223
- } else {
224
- return derivedMutationDefs.update(argsOrValues as any)
225
- }
226
- }
227
-
228
- tableDef.delete = (args: any) => derivedMutationDefs.delete(args)
229
- }
230
-
231
- return tableDef as any
232
- }
233
-
234
- export const tableHasDerivedMutations = <TTableDef extends TableDefBase>(
235
- tableDef: TTableDef,
236
- ): tableDef is TTableDef & {
237
- options: { deriveMutations: { enabled: true; localOnly: boolean } }
238
- } & DerivedMutationHelperFns<TTableDef['sqliteDef']['columns'], TTableDef['options']> =>
239
- tableDef.options.deriveMutations.enabled === true
240
-
241
- export const tableIsSingleton = <TTableDef extends TableDefBase>(
242
- tableDef: TTableDef,
243
- ): tableDef is TTableDef & { options: { isSingleton: true } } => tableDef.options.isSingleton === true
244
-
245
- type SqliteTableDefForInput<
246
- TName extends string,
247
- TColumns extends SqliteDsl.Columns | SqliteDsl.ColumnDefinition<any, any>,
248
- TOptions extends TableOptions,
249
- > = SqliteDsl.TableDefinition<TName, PrettifyFlat<WithId<ToColumns<TColumns>, TOptions>>>
250
-
251
- type WithId<TColumns extends SqliteDsl.Columns, TOptions extends TableOptions> = TColumns &
252
- ('id' extends keyof TColumns
253
- ? {}
254
- : TOptions['disableAutomaticIdColumn'] extends true
255
- ? {}
256
- : TOptions['isSingleton'] extends true
257
- ? {
258
- id: SqliteDsl.ColumnDefinition<'singleton', 'singleton'>
259
- }
260
- : {
261
- id: SqliteDsl.ColumnDefinition<string, string>
262
- })
263
-
264
- type WithDefaults<
265
- TOptionsInput extends TableOptionsInput,
266
- TColumns extends SqliteDsl.Columns | SqliteDsl.ColumnDefinition<any, any>,
267
- > = {
268
- isSingleton: TOptionsInput['isSingleton'] extends true ? true : false
269
- disableAutomaticIdColumn: TOptionsInput['disableAutomaticIdColumn'] extends true ? true : false
270
- deriveMutations: TOptionsInput['deriveMutations'] extends true
271
- ? { enabled: true; localOnly: boolean }
272
- : TOptionsInput['deriveMutations'] extends false
273
- ? { enabled: false }
274
- : TOptionsInput['deriveMutations'] extends { enabled: true; localOnly?: boolean }
275
- ? {
276
- enabled: true
277
- localOnly: TOptionsInput['deriveMutations']['localOnly'] extends true ? true : false
278
- }
279
- : never
280
- isSingleColumn: SqliteDsl.IsSingleColumn<TColumns>
281
- requiredInsertColumnNames: SqliteDsl.FromColumns.RequiredInsertColumnNames<ToColumns<TColumns>>
282
- }
283
-
284
- export namespace FromTable {
285
- // TODO this sometimes doesn't preserve the order of columns
286
- export type RowDecoded<TTableDef extends TableDefBase> = PrettifyFlat<
287
- Nullable<Pick<RowDecodedAll<TTableDef>, NullableColumnNames<TTableDef>>> &
288
- Omit<RowDecodedAll<TTableDef>, NullableColumnNames<TTableDef>>
289
- >
290
-
291
- export type NullableColumnNames<TTableDef extends TableDefBase> = FromColumns.NullableColumnNames<
292
- TTableDef['sqliteDef']['columns']
293
- >
294
-
295
- export type Columns<TTableDef extends TableDefBase> = {
296
- [K in keyof TTableDef['sqliteDef']['columns']]: TTableDef['sqliteDef']['columns'][K]['columnType']
297
- }
298
-
299
- export type RowEncodeNonNullable<TTableDef extends TableDefBase> = {
300
- [K in keyof TTableDef['sqliteDef']['columns']]: Schema.Schema.Encoded<
301
- TTableDef['sqliteDef']['columns'][K]['schema']
302
- >
303
- }
304
-
305
- export type RowEncoded<TTableDef extends TableDefBase> = PrettifyFlat<
306
- Nullable<Pick<RowEncodeNonNullable<TTableDef>, NullableColumnNames<TTableDef>>> &
307
- Omit<RowEncodeNonNullable<TTableDef>, NullableColumnNames<TTableDef>>
308
- >
309
-
310
- export type RowDecodedAll<TTableDef extends TableDefBase> = {
311
- [K in keyof TTableDef['sqliteDef']['columns']]: Schema.Schema.Type<TTableDef['sqliteDef']['columns'][K]['schema']>
312
- }
313
- }
314
-
315
- export namespace FromColumns {
316
- // TODO this sometimes doesn't preserve the order of columns
317
- export type RowDecoded<TColumns extends SqliteDsl.Columns> = PrettifyFlat<
318
- Nullable<Pick<RowDecodedAll<TColumns>, NullableColumnNames<TColumns>>> &
319
- Omit<RowDecodedAll<TColumns>, NullableColumnNames<TColumns>>
320
- >
321
-
322
- export type RowDecodedAll<TColumns extends SqliteDsl.Columns> = {
323
- [K in keyof TColumns]: Schema.Schema.Type<TColumns[K]['schema']>
324
- }
325
-
326
- export type RowEncoded<TColumns extends SqliteDsl.Columns> = PrettifyFlat<
327
- Nullable<Pick<RowEncodeNonNullable<TColumns>, NullableColumnNames<TColumns>>> &
328
- Omit<RowEncodeNonNullable<TColumns>, NullableColumnNames<TColumns>>
329
- >
330
-
331
- export type RowEncodeNonNullable<TColumns extends SqliteDsl.Columns> = {
332
- [K in keyof TColumns]: Schema.Schema.Encoded<TColumns[K]['schema']>
333
- }
334
-
335
- export type NullableColumnNames<TColumns extends SqliteDsl.Columns> = keyof {
336
- [K in keyof TColumns as TColumns[K]['default'] extends true ? K : never]: {}
337
- }
338
-
339
- export type RequiredInsertColumnNames<TColumns extends SqliteDsl.Columns> =
340
- SqliteDsl.FromColumns.RequiredInsertColumnNames<TColumns>
341
-
342
- export type InsertRowDecoded<TColumns extends SqliteDsl.Columns> = SqliteDsl.FromColumns.InsertRowDecoded<TColumns>
343
- }
@@ -1,63 +0,0 @@
1
- import { Effect, Schema } from '@livestore/utils/effect'
2
-
3
- import { UnexpectedError } from '../adapter-types.js'
4
- import type { LiveStoreSchema } from '../schema/mod.js'
5
- import type { MutationDef } from '../schema/mutations.js'
6
- import type { MutationDefInfo, SchemaManager } from './common.js'
7
-
8
- export const validateSchema = (schema: LiveStoreSchema, schemaManager: SchemaManager) =>
9
- Effect.gen(function* () {
10
- // Validate mutation definitions
11
- const registeredMutationDefInfos = schemaManager.getMutationDefInfos()
12
-
13
- const missingMutationDefs = registeredMutationDefInfos.filter(
14
- (registeredMutationDefInfo) => !schema.mutations.has(registeredMutationDefInfo.mutationName),
15
- )
16
-
17
- if (missingMutationDefs.length > 0) {
18
- yield* new UnexpectedError({
19
- cause: `Missing mutation definitions: ${missingMutationDefs.map((info) => info.mutationName).join(', ')}`,
20
- })
21
- }
22
-
23
- for (const [, mutationDef] of schema.mutations) {
24
- const registeredMutationDefInfo = registeredMutationDefInfos.find(
25
- (info) => info.mutationName === mutationDef.name,
26
- )
27
-
28
- validateMutationDef(mutationDef, schemaManager, registeredMutationDefInfo)
29
- }
30
-
31
- // Validate table schemas
32
- })
33
-
34
- export const validateMutationDef = (
35
- mutationDef: MutationDef.Any,
36
- schemaManager: SchemaManager,
37
- registeredMutationDefInfo: MutationDefInfo | undefined,
38
- ) => {
39
- const schemaHash = Schema.hash(mutationDef.schema)
40
-
41
- if (registeredMutationDefInfo === undefined) {
42
- schemaManager.setMutationDefInfo({
43
- schemaHash,
44
- mutationName: mutationDef.name,
45
- })
46
-
47
- return
48
- }
49
-
50
- if (schemaHash === registeredMutationDefInfo.schemaHash) return
51
-
52
- // TODO bring back some form of schema compatibility check (see https://github.com/livestorejs/livestore/issues/69)
53
- // const newSchemaIsCompatibleWithOldSchema = Schema.isSubType(jsonSchemaDefFromMgmtStore, mutationDef.schema)
54
-
55
- // if (!newSchemaIsCompatibleWithOldSchema) {
56
- // shouldNeverHappen(`Schema for mutation ${mutationDef.name} has changed in an incompatible way`)
57
- // }
58
-
59
- schemaManager.setMutationDefInfo({
60
- schemaHash,
61
- mutationName: mutationDef.name,
62
- })
63
- }
@@ -1,224 +0,0 @@
1
- import { Schema } from '@livestore/utils/effect'
2
-
3
- import * as EventId from '../../../schema/EventId.js'
4
- import type { MutationDef } from '../../../schema/mutations.js'
5
- import { defineFacts, defineMutation } from '../../../schema/mutations.js'
6
- import { factsSnapshotForDag, getFactsGroupForMutationArgs } from '../facts.js'
7
- import { historyDagFromNodes } from '../history-dag.js'
8
- import type { HistoryDagNode } from '../history-dag-common.js'
9
- import { rootEventNode } from '../history-dag-common.js'
10
-
11
- /** Used for conflict detection and event history compaction */
12
- export const facts = defineFacts({
13
- todoExists: (id: string) => `todo-exists-${id}`,
14
- todoIsWriteable: (id: string, writeable: boolean) => [`todo-is-writeable-${id}`, writeable],
15
- todoCompleted: (id: string, completed: boolean) => [`todo-completed-${id}`, completed],
16
- todoTextUpdated: (id: string) => `todo-text-updated-${id}`,
17
- inputValue: (id: string) => `input-value-${id}`,
18
- })
19
-
20
- export const mutations = {
21
- createTodo: defineMutation(
22
- 'createTodo',
23
- Schema.Struct({ id: Schema.String, text: Schema.String }),
24
- 'INSERT INTO todos (id, text) VALUES ($id, $text)',
25
- {
26
- facts: ({ id }) => ({
27
- modify: {
28
- set: [facts.todoExists(id), facts.todoIsWriteable(id, true), facts.todoCompleted(id, false)],
29
- },
30
- }),
31
- },
32
- ),
33
- upsertTodo: defineMutation(
34
- 'upsertTodo',
35
- Schema.Struct({ id: Schema.String, text: Schema.optional(Schema.String) }),
36
- 'INSERT INTO todos (id, text) VALUES ($id, $text) ON CONFLICT (id) DO UPDATE SET text = $text',
37
- {
38
- facts: ({ id }, currentFacts) =>
39
- // TODO enable an API along the lines of `map.has(key, value)`
40
- currentFacts.has(facts.todoExists(id)) && currentFacts.get(facts.todoIsWriteable(id, true)[0]) === false
41
- ? { require: [facts.todoExists(id), facts.todoIsWriteable(id, true)] }
42
- : { modify: { set: [facts.todoExists(id), facts.todoIsWriteable(id, true), facts.todoTextUpdated(id)] } },
43
- },
44
- ),
45
- completeTodo: defineMutation(
46
- 'completeTodo',
47
- Schema.Struct({ id: Schema.String }),
48
- // consider `RETURNING` to validate before applying facts
49
- 'UPDATE todos SET completed = true WHERE id = $id',
50
- {
51
- // prewrite assertions from DB
52
- // enables more concurrency
53
- // turning database inside out
54
- // similar to upsert semantics
55
- facts: ({ id }) => ({
56
- require: [facts.todoExists(id), facts.todoIsWriteable(id, true)],
57
- modify: { set: [facts.todoCompleted(id, true)] },
58
- }),
59
- },
60
- ),
61
- uncompleteTodo: defineMutation(
62
- 'uncompleteTodo',
63
- Schema.Struct({ id: Schema.String }),
64
- 'UPDATE todos SET completed = false WHERE id = $id',
65
- {
66
- facts: ({ id }) => ({
67
- require: [facts.todoExists(id), facts.todoIsWriteable(id, true)],
68
- modify: { set: [facts.todoCompleted(id, false)] },
69
- }),
70
- },
71
- ),
72
- completeTodos: defineMutation(
73
- 'completeTodos',
74
- Schema.Struct({ ids: Schema.Array(Schema.String) }),
75
- 'UPDATE todos SET completed = true WHERE id IN ($ids:csv)',
76
- {
77
- facts: ({ ids }) => ({
78
- require: ids.flatMap((id) => [facts.todoExists(id), facts.todoIsWriteable(id, true)]),
79
- modify: { set: ids.map((id) => facts.todoCompleted(id, true)) },
80
- }),
81
- },
82
- ),
83
- toggleTodo: defineMutation(
84
- 'toggleTodo',
85
- Schema.Struct({ id: Schema.String }),
86
- 'UPDATE todos SET completed = NOT completed WHERE id = $id',
87
- {
88
- facts: ({ id }, currentFacts) => {
89
- const currentIsCompleted = currentFacts.get(facts.todoCompleted(id, true)[0]) === true
90
- return {
91
- require: [facts.todoExists(id), facts.todoIsWriteable(id, true)],
92
- modify: {
93
- // remove: [facts.todoCompleted(id, currentIsCompleted)],
94
- set: [facts.todoCompleted(id, !currentIsCompleted)],
95
- },
96
- }
97
- },
98
- },
99
- ),
100
- setReadonlyTodo: defineMutation(
101
- 'setReadonlyTodo',
102
- Schema.Struct({ id: Schema.String, readonly: Schema.Boolean }),
103
- 'UPDATE todos SET readonly = $readonly WHERE id = $id',
104
- {
105
- facts: ({ id, readonly }) => ({
106
- require: [facts.todoExists(id)],
107
- modify: { set: [facts.todoIsWriteable(id, !readonly)] },
108
- }),
109
- },
110
- ),
111
- setTextTodo: defineMutation(
112
- 'setTextTodo',
113
- Schema.Struct({ id: Schema.String, text: Schema.String }),
114
- 'UPDATE todos SET text = $text WHERE id = $id',
115
- {
116
- facts: ({ id }) => ({
117
- require: [facts.todoExists(id), facts.todoIsWriteable(id, true)],
118
- modify: { set: [facts.todoTextUpdated(id)] },
119
- }),
120
- },
121
- ),
122
- setInputValue: defineMutation(
123
- 'setInputValue',
124
- Schema.Struct({ id: Schema.String, text: Schema.String }),
125
- 'UPDATE todos SET text = $text WHERE id = $id',
126
- {
127
- localOnly: true,
128
- facts: ({ id }) => ({ modify: { set: [facts.inputValue(id)] } }),
129
- },
130
- ),
131
- }
132
-
133
- export type PartialEvent = { mutation: string; args: any }
134
-
135
- export const toEventNodes = (
136
- partialEvents: PartialEvent[],
137
- mutationDefs: Record<string, MutationDef.Any>,
138
- ): HistoryDagNode[] => {
139
- const nodesAcc: HistoryDagNode[] = [rootEventNode]
140
-
141
- let currentEventId: EventId.EventId = EventId.ROOT
142
-
143
- const eventNodes = partialEvents.map((partialEvent) => {
144
- const mutationDef = mutationDefs[partialEvent.mutation]!
145
- const eventId = EventId.nextPair(currentEventId, mutationDef.options.localOnly).id
146
- currentEventId = eventId
147
-
148
- const factsSnapshot = factsSnapshotForDag(historyDagFromNodes(nodesAcc, { skipFactsCheck: true }), undefined)
149
- // console.log('factsSnapshot', eventId, factsSnapshot)
150
- // const depRead: MutationEventFactsSnapshot = new Map<string, any>()
151
- // const factsSnapshotProxy = new Proxy(factsSnapshot, {
152
- // get: (target, prop) => {
153
- // if (prop === 'has') {
154
- // return (key: string) => {
155
- // depRead.set(key, EMPTY_FACT_VALUE)
156
- // return target.has(key)
157
- // }
158
- // } else if (prop === 'get') {
159
- // return (key: string) => {
160
- // depRead.set(key, EMPTY_FACT_VALUE)
161
- // return target.get(key)
162
- // }
163
- // }
164
-
165
- // notYetImplemented(`toEventNodes: ${prop.toString()} is not yet implemented`)
166
- // },
167
- // })
168
-
169
- // const factsRes = mutationDef.options.facts?.(partialEvent.args, factsSnapshotProxy)
170
- // console.log('factsRes', factsRes?.modify, factsRes?.require)
171
- // const iterableToMap = (iterable: Iterable<MutationEventFactInput>) => {
172
- // const map = new Map()
173
- // for (const item of iterable) {
174
- // if (typeof item === 'string') {
175
- // map.set(item, EMPTY_FACT_VALUE)
176
- // } else {
177
- // map.set(item[0], item[1])
178
- // }
179
- // }
180
- // return map
181
- // }
182
- // const facts = {
183
- // modifyAdd: factsRes?.modify.add ? iterableToMap(factsRes.modify.add) : new Map(),
184
- // modifyRemove: factsRes?.modify.remove ? iterableToMap(factsRes.modify.remove) : new Map(),
185
- // depRequire: factsRes?.require ? iterableToMap(factsRes.require) : new Map(),
186
- // depRead,
187
- // } satisfies MutationEventFactsGroup
188
-
189
- // applyFactGroup(facts, factsSnapshot)
190
-
191
- const facts = getFactsGroupForMutationArgs({
192
- factsCallback: mutationDef.options.facts,
193
- args: partialEvent.args,
194
- currentFacts: factsSnapshot,
195
- })
196
-
197
- const node = {
198
- id: eventId,
199
- parentId: getParentId(eventId),
200
- mutation: partialEvent.mutation,
201
- args: partialEvent.args,
202
- factsGroup: facts,
203
- } satisfies HistoryDagNode
204
- nodesAcc.push(node)
205
- return node
206
- })
207
-
208
- eventNodes.unshift(rootEventNode as never)
209
-
210
- // console.log('eventNodes', eventNodes)
211
-
212
- return eventNodes
213
- }
214
-
215
- const getParentId = (eventId: EventId.EventId): EventId.EventId => {
216
- const globalParentId = eventId.global
217
- const localParentId = eventId.local - 1
218
-
219
- if (localParentId < 0) {
220
- return EventId.make({ global: globalParentId - 1, local: EventId.localDefault })
221
- }
222
-
223
- return EventId.make({ global: globalParentId, local: localParentId })
224
- }
package/tsconfig.json DELETED
@@ -1,11 +0,0 @@
1
- {
2
- "extends": "../../../tsconfig.base.json",
3
- "compilerOptions": {
4
- "outDir": "./dist",
5
- "rootDir": "./src",
6
- "resolveJsonModule": true,
7
- "tsBuildInfoFile": "./dist/.tsbuildinfo"
8
- },
9
- "include": ["./src"],
10
- "references": [{ "path": "../db-schema" }, { "path": "../utils" }]
11
- }