@livestore/common 0.0.0-snapshot-2b8a9de3ec1a701aca891ebc2c98eb328274ae9e → 0.0.0-snapshot-2c861249e50661661613204300b1fc0d902c2e46

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 (287) 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 +36 -22
  7. package/dist/adapter-types.d.ts.map +1 -1
  8. package/dist/adapter-types.js +20 -8
  9. package/dist/adapter-types.js.map +1 -1
  10. package/dist/debug-info.d.ts.map +1 -1
  11. package/dist/debug-info.js +1 -0
  12. package/dist/debug-info.js.map +1 -1
  13. package/dist/devtools/devtools-messages-client-session.d.ts +21 -21
  14. package/dist/devtools/devtools-messages-common.d.ts +13 -6
  15. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  16. package/dist/devtools/devtools-messages-common.js +6 -0
  17. package/dist/devtools/devtools-messages-common.js.map +1 -1
  18. package/dist/devtools/devtools-messages-leader.d.ts +46 -46
  19. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  20. package/dist/devtools/devtools-messages-leader.js +12 -13
  21. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  22. package/dist/index.d.ts +2 -5
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +2 -5
  25. package/dist/index.js.map +1 -1
  26. package/dist/leader-thread/LeaderSyncProcessor.d.ts +34 -12
  27. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  28. package/dist/leader-thread/LeaderSyncProcessor.js +284 -226
  29. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  30. package/dist/leader-thread/apply-event.d.ts +16 -0
  31. package/dist/leader-thread/apply-event.d.ts.map +1 -0
  32. package/dist/leader-thread/apply-event.js +122 -0
  33. package/dist/leader-thread/apply-event.js.map +1 -0
  34. package/dist/leader-thread/eventlog.d.ts +27 -0
  35. package/dist/leader-thread/eventlog.d.ts.map +1 -0
  36. package/dist/leader-thread/eventlog.js +123 -0
  37. package/dist/leader-thread/eventlog.js.map +1 -0
  38. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  39. package/dist/leader-thread/leader-worker-devtools.js +22 -23
  40. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  41. package/dist/leader-thread/make-leader-thread-layer.d.ts +16 -4
  42. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  43. package/dist/leader-thread/make-leader-thread-layer.js +36 -41
  44. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  45. package/dist/leader-thread/mod.d.ts +1 -1
  46. package/dist/leader-thread/mod.d.ts.map +1 -1
  47. package/dist/leader-thread/mod.js +1 -1
  48. package/dist/leader-thread/mod.js.map +1 -1
  49. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  50. package/dist/leader-thread/recreate-db.js +7 -7
  51. package/dist/leader-thread/recreate-db.js.map +1 -1
  52. package/dist/leader-thread/types.d.ts +40 -25
  53. package/dist/leader-thread/types.d.ts.map +1 -1
  54. package/dist/leader-thread/types.js.map +1 -1
  55. package/dist/materializer-helper.d.ts +23 -0
  56. package/dist/materializer-helper.d.ts.map +1 -0
  57. package/dist/materializer-helper.js +70 -0
  58. package/dist/materializer-helper.js.map +1 -0
  59. package/dist/query-builder/api.d.ts +55 -50
  60. package/dist/query-builder/api.d.ts.map +1 -1
  61. package/dist/query-builder/api.js +3 -5
  62. package/dist/query-builder/api.js.map +1 -1
  63. package/dist/query-builder/astToSql.d.ts.map +1 -1
  64. package/dist/query-builder/astToSql.js +59 -37
  65. package/dist/query-builder/astToSql.js.map +1 -1
  66. package/dist/query-builder/impl.d.ts +2 -3
  67. package/dist/query-builder/impl.d.ts.map +1 -1
  68. package/dist/query-builder/impl.js +47 -43
  69. package/dist/query-builder/impl.js.map +1 -1
  70. package/dist/query-builder/impl.test.d.ts +86 -1
  71. package/dist/query-builder/impl.test.d.ts.map +1 -1
  72. package/dist/query-builder/impl.test.js +223 -36
  73. package/dist/query-builder/impl.test.js.map +1 -1
  74. package/dist/rehydrate-from-eventlog.d.ts +15 -0
  75. package/dist/rehydrate-from-eventlog.d.ts.map +1 -0
  76. package/dist/{rehydrate-from-mutationlog.js → rehydrate-from-eventlog.js} +27 -28
  77. package/dist/rehydrate-from-eventlog.js.map +1 -0
  78. package/dist/schema/EventDef.d.ts +136 -0
  79. package/dist/schema/EventDef.d.ts.map +1 -0
  80. package/dist/schema/EventDef.js +58 -0
  81. package/dist/schema/EventDef.js.map +1 -0
  82. package/dist/schema/EventId.d.ts +10 -1
  83. package/dist/schema/EventId.d.ts.map +1 -1
  84. package/dist/schema/EventId.js +24 -3
  85. package/dist/schema/EventId.js.map +1 -1
  86. package/dist/schema/LiveStoreEvent.d.ts +255 -0
  87. package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
  88. package/dist/schema/LiveStoreEvent.js +118 -0
  89. package/dist/schema/LiveStoreEvent.js.map +1 -0
  90. package/dist/schema/client-document-def.d.ts +223 -0
  91. package/dist/schema/client-document-def.d.ts.map +1 -0
  92. package/dist/schema/client-document-def.js +164 -0
  93. package/dist/schema/client-document-def.js.map +1 -0
  94. package/dist/schema/client-document-def.test.d.ts +2 -0
  95. package/dist/schema/client-document-def.test.d.ts.map +1 -0
  96. package/dist/schema/client-document-def.test.js +161 -0
  97. package/dist/schema/client-document-def.test.js.map +1 -0
  98. package/dist/schema/db-schema/dsl/mod.d.ts.map +1 -1
  99. package/dist/schema/events.d.ts +2 -0
  100. package/dist/schema/events.d.ts.map +1 -0
  101. package/dist/schema/events.js +2 -0
  102. package/dist/schema/events.js.map +1 -0
  103. package/dist/schema/mod.d.ts +4 -3
  104. package/dist/schema/mod.d.ts.map +1 -1
  105. package/dist/schema/mod.js +4 -3
  106. package/dist/schema/mod.js.map +1 -1
  107. package/dist/schema/schema.d.ts +26 -22
  108. package/dist/schema/schema.d.ts.map +1 -1
  109. package/dist/schema/schema.js +45 -43
  110. package/dist/schema/schema.js.map +1 -1
  111. package/dist/schema/sqlite-state.d.ts +12 -0
  112. package/dist/schema/sqlite-state.d.ts.map +1 -0
  113. package/dist/schema/sqlite-state.js +36 -0
  114. package/dist/schema/sqlite-state.js.map +1 -0
  115. package/dist/schema/system-tables.d.ts +121 -85
  116. package/dist/schema/system-tables.d.ts.map +1 -1
  117. package/dist/schema/system-tables.js +68 -43
  118. package/dist/schema/system-tables.js.map +1 -1
  119. package/dist/schema/table-def.d.ts +26 -96
  120. package/dist/schema/table-def.d.ts.map +1 -1
  121. package/dist/schema/table-def.js +14 -64
  122. package/dist/schema/table-def.js.map +1 -1
  123. package/dist/schema/view.d.ts +3 -0
  124. package/dist/schema/view.d.ts.map +1 -0
  125. package/dist/schema/view.js +3 -0
  126. package/dist/schema/view.js.map +1 -0
  127. package/dist/schema-management/common.d.ts +4 -4
  128. package/dist/schema-management/common.d.ts.map +1 -1
  129. package/dist/schema-management/migrations.d.ts.map +1 -1
  130. package/dist/schema-management/migrations.js +6 -6
  131. package/dist/schema-management/migrations.js.map +1 -1
  132. package/dist/schema-management/validate-mutation-defs.d.ts +3 -3
  133. package/dist/schema-management/validate-mutation-defs.d.ts.map +1 -1
  134. package/dist/schema-management/validate-mutation-defs.js +17 -17
  135. package/dist/schema-management/validate-mutation-defs.js.map +1 -1
  136. package/dist/sync/ClientSessionSyncProcessor.d.ts +16 -8
  137. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  138. package/dist/sync/ClientSessionSyncProcessor.js +50 -43
  139. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  140. package/dist/sync/next/facts.d.ts +19 -19
  141. package/dist/sync/next/facts.d.ts.map +1 -1
  142. package/dist/sync/next/facts.js +2 -2
  143. package/dist/sync/next/facts.js.map +1 -1
  144. package/dist/sync/next/history-dag-common.d.ts +3 -3
  145. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  146. package/dist/sync/next/history-dag-common.js +1 -1
  147. package/dist/sync/next/history-dag-common.js.map +1 -1
  148. package/dist/sync/next/history-dag.js +1 -1
  149. package/dist/sync/next/history-dag.js.map +1 -1
  150. package/dist/sync/next/rebase-events.d.ts +7 -7
  151. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  152. package/dist/sync/next/rebase-events.js +5 -5
  153. package/dist/sync/next/rebase-events.js.map +1 -1
  154. package/dist/sync/next/test/compact-events.calculator.test.js +38 -33
  155. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  156. package/dist/sync/next/test/compact-events.test.js +71 -71
  157. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  158. package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +25 -25
  159. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
  160. package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +60 -25
  161. package/dist/sync/next/test/event-fixtures.js.map +1 -0
  162. package/dist/sync/next/test/mod.d.ts +1 -1
  163. package/dist/sync/next/test/mod.d.ts.map +1 -1
  164. package/dist/sync/next/test/mod.js +1 -1
  165. package/dist/sync/next/test/mod.js.map +1 -1
  166. package/dist/sync/sync.d.ts +8 -7
  167. package/dist/sync/sync.d.ts.map +1 -1
  168. package/dist/sync/sync.js.map +1 -1
  169. package/dist/sync/syncstate.d.ts +69 -93
  170. package/dist/sync/syncstate.d.ts.map +1 -1
  171. package/dist/sync/syncstate.js +143 -146
  172. package/dist/sync/syncstate.js.map +1 -1
  173. package/dist/sync/syncstate.test.js +208 -289
  174. package/dist/sync/syncstate.test.js.map +1 -1
  175. package/dist/sync/validate-push-payload.d.ts +2 -2
  176. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  177. package/dist/sync/validate-push-payload.js.map +1 -1
  178. package/dist/version.d.ts +1 -1
  179. package/dist/version.js +1 -1
  180. package/package.json +2 -2
  181. package/src/__tests__/fixture.ts +36 -15
  182. package/src/adapter-types.ts +34 -23
  183. package/src/debug-info.ts +1 -0
  184. package/src/devtools/devtools-messages-common.ts +9 -0
  185. package/src/devtools/devtools-messages-leader.ts +14 -15
  186. package/src/index.ts +2 -5
  187. package/src/leader-thread/LeaderSyncProcessor.ts +485 -389
  188. package/src/leader-thread/apply-event.ts +197 -0
  189. package/src/leader-thread/eventlog.ts +199 -0
  190. package/src/leader-thread/leader-worker-devtools.ts +23 -25
  191. package/src/leader-thread/make-leader-thread-layer.ts +68 -61
  192. package/src/leader-thread/mod.ts +1 -1
  193. package/src/leader-thread/recreate-db.ts +7 -8
  194. package/src/leader-thread/types.ts +39 -29
  195. package/src/materializer-helper.ts +110 -0
  196. package/src/query-builder/api.ts +76 -102
  197. package/src/query-builder/astToSql.ts +68 -39
  198. package/src/query-builder/impl.test.ts +239 -42
  199. package/src/query-builder/impl.ts +66 -54
  200. package/src/{rehydrate-from-mutationlog.ts → rehydrate-from-eventlog.ts} +37 -40
  201. package/src/schema/EventDef.ts +216 -0
  202. package/src/schema/EventId.ts +30 -4
  203. package/src/schema/LiveStoreEvent.ts +239 -0
  204. package/src/schema/client-document-def.test.ts +188 -0
  205. package/src/schema/client-document-def.ts +436 -0
  206. package/src/schema/db-schema/dsl/mod.ts +0 -1
  207. package/src/schema/events.ts +1 -0
  208. package/src/schema/mod.ts +4 -3
  209. package/src/schema/schema.ts +78 -68
  210. package/src/schema/sqlite-state.ts +62 -0
  211. package/src/schema/system-tables.ts +54 -46
  212. package/src/schema/table-def.ts +51 -209
  213. package/src/schema/view.ts +2 -0
  214. package/src/schema-management/common.ts +4 -4
  215. package/src/schema-management/migrations.ts +8 -9
  216. package/src/schema-management/validate-mutation-defs.ts +22 -24
  217. package/src/sync/ClientSessionSyncProcessor.ts +66 -53
  218. package/src/sync/next/facts.ts +31 -32
  219. package/src/sync/next/history-dag-common.ts +4 -4
  220. package/src/sync/next/history-dag.ts +1 -1
  221. package/src/sync/next/rebase-events.ts +13 -13
  222. package/src/sync/next/test/compact-events.calculator.test.ts +45 -45
  223. package/src/sync/next/test/compact-events.test.ts +73 -73
  224. package/src/sync/next/test/event-fixtures.ts +219 -0
  225. package/src/sync/next/test/mod.ts +1 -1
  226. package/src/sync/sync.ts +9 -12
  227. package/src/sync/syncstate.test.ts +236 -323
  228. package/src/sync/syncstate.ts +218 -203
  229. package/src/sync/validate-push-payload.ts +2 -2
  230. package/src/version.ts +1 -1
  231. package/tsconfig.json +1 -0
  232. package/dist/derived-mutations.d.ts +0 -109
  233. package/dist/derived-mutations.d.ts.map +0 -1
  234. package/dist/derived-mutations.js +0 -54
  235. package/dist/derived-mutations.js.map +0 -1
  236. package/dist/derived-mutations.test.d.ts +0 -2
  237. package/dist/derived-mutations.test.d.ts.map +0 -1
  238. package/dist/derived-mutations.test.js +0 -93
  239. package/dist/derived-mutations.test.js.map +0 -1
  240. package/dist/init-singleton-tables.d.ts +0 -4
  241. package/dist/init-singleton-tables.d.ts.map +0 -1
  242. package/dist/init-singleton-tables.js +0 -16
  243. package/dist/init-singleton-tables.js.map +0 -1
  244. package/dist/leader-thread/apply-mutation.d.ts +0 -11
  245. package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
  246. package/dist/leader-thread/apply-mutation.js +0 -115
  247. package/dist/leader-thread/apply-mutation.js.map +0 -1
  248. package/dist/leader-thread/mutationlog.d.ts +0 -11
  249. package/dist/leader-thread/mutationlog.d.ts.map +0 -1
  250. package/dist/leader-thread/mutationlog.js +0 -31
  251. package/dist/leader-thread/mutationlog.js.map +0 -1
  252. package/dist/leader-thread/pull-queue-set.d.ts +0 -7
  253. package/dist/leader-thread/pull-queue-set.d.ts.map +0 -1
  254. package/dist/leader-thread/pull-queue-set.js +0 -48
  255. package/dist/leader-thread/pull-queue-set.js.map +0 -1
  256. package/dist/mutation.d.ts +0 -20
  257. package/dist/mutation.d.ts.map +0 -1
  258. package/dist/mutation.js +0 -68
  259. package/dist/mutation.js.map +0 -1
  260. package/dist/query-info.d.ts +0 -41
  261. package/dist/query-info.d.ts.map +0 -1
  262. package/dist/query-info.js +0 -7
  263. package/dist/query-info.js.map +0 -1
  264. package/dist/rehydrate-from-mutationlog.d.ts +0 -14
  265. package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
  266. package/dist/rehydrate-from-mutationlog.js.map +0 -1
  267. package/dist/schema/MutationEvent.d.ts +0 -202
  268. package/dist/schema/MutationEvent.d.ts.map +0 -1
  269. package/dist/schema/MutationEvent.js +0 -105
  270. package/dist/schema/MutationEvent.js.map +0 -1
  271. package/dist/schema/mutations.d.ts +0 -115
  272. package/dist/schema/mutations.d.ts.map +0 -1
  273. package/dist/schema/mutations.js +0 -42
  274. package/dist/schema/mutations.js.map +0 -1
  275. package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
  276. package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
  277. package/src/derived-mutations.test.ts +0 -101
  278. package/src/derived-mutations.ts +0 -170
  279. package/src/init-singleton-tables.ts +0 -24
  280. package/src/leader-thread/apply-mutation.ts +0 -187
  281. package/src/leader-thread/mutationlog.ts +0 -49
  282. package/src/leader-thread/pull-queue-set.ts +0 -67
  283. package/src/mutation.ts +0 -108
  284. package/src/query-info.ts +0 -83
  285. package/src/schema/MutationEvent.ts +0 -224
  286. package/src/schema/mutations.ts +0 -193
  287. package/src/sync/next/test/mutation-fixtures.ts +0 -228
@@ -1,42 +0,0 @@
1
- import { Schema } from '@livestore/utils/effect';
2
- export const defineFacts = (record) => record;
3
- // TODO possibly also allow for mutation event subsumption behaviour
4
- export const defineMutation = (name, schema, sql, options) => {
5
- const makePartialEvent = (args) => ({ mutation: name, args });
6
- Object.defineProperty(makePartialEvent, 'name', { value: name });
7
- Object.defineProperty(makePartialEvent, 'schema', { value: schema });
8
- Object.defineProperty(makePartialEvent, 'sql', { value: sql });
9
- Object.defineProperty(makePartialEvent, 'options', {
10
- value: {
11
- historyId: options?.historyId ?? 'main',
12
- clientOnly: options?.clientOnly ?? false,
13
- facts: options?.facts
14
- ? (args, currentFacts) => {
15
- const res = options.facts(args, currentFacts);
16
- return {
17
- modify: {
18
- set: res.modify?.set ? new Set(res.modify.set) : new Set(),
19
- unset: res.modify?.unset ? new Set(res.modify.unset) : new Set(),
20
- },
21
- require: res.require ? new Set(res.require) : new Set(),
22
- };
23
- }
24
- : undefined,
25
- },
26
- });
27
- return makePartialEvent;
28
- };
29
- export const makeMutationDefRecord = (inputRecord) => {
30
- const result = {};
31
- for (const [name, def] of Object.entries(inputRecord)) {
32
- result[name] = def;
33
- }
34
- result['livestore.RawSql'] = rawSqlMutation;
35
- return result;
36
- };
37
- export const rawSqlMutation = defineMutation('livestore.RawSql', Schema.Struct({
38
- sql: Schema.String,
39
- bindValues: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),
40
- writeTables: Schema.optional(Schema.ReadonlySet(Schema.String)),
41
- }), ({ sql, bindValues, writeTables }) => ({ sql, bindValues: bindValues ?? {}, writeTables }));
42
- //# sourceMappingURL=mutations.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mutations.js","sourceRoot":"","sources":["../../src/schema/mutations.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mutation-fixtures.d.ts","sourceRoot":"","sources":["../../../../src/sync/next/test/mutation-fixtures.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAI/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAG9D,+DAA+D;AAC/D,eAAO,MAAM,KAAK;qBACC,MAAM;0BACD,MAAM,aAAa,OAAO;wBAC5B,MAAM,aAAa,OAAO;0BACxB,MAAM;qBACX,MAAM;CACvB,CAAA;AAEF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+GrB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,CAAA;AAE1D,eAAO,MAAM,YAAY,GACvB,eAAe,YAAY,EAAE,EAC7B,cAAc,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,EAC7C,UAAU,MAAM,EAChB,WAAW,MAAM,GAAG,SAAS,KAC5B,cAAc,EA6EhB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mutation-fixtures.js","sourceRoot":"","sources":["../../../../src/sync/next/test/mutation-fixtures.ts"],"names":[],"mappings":"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"}
@@ -1,101 +0,0 @@
1
- import { describe, expect, test } from 'vitest'
2
-
3
- import { appConfig, todos } from './__tests__/fixture.js'
4
- import type * as MutationEvent from './schema/MutationEvent.js'
5
-
6
- describe('derived mutations', () => {
7
- test('todos', () => {
8
- expect(patchId(todos.insert({ id: 't1', completed: true, text: 'Task 1' }))).toMatchInlineSnapshot(`
9
- {
10
- "args": {
11
- "completed": true,
12
- "id": "t1",
13
- "text": "Task 1",
14
- },
15
- "id": "00000000-0000-0000-0000-000000000000",
16
- "mutation": "_Derived_Create_todos",
17
- }
18
- `)
19
-
20
- expect(patchId(todos.update({ where: { id: 't1' }, values: { text: 'Task 1 - fixed' } }))).toMatchInlineSnapshot(`
21
- {
22
- "args": {
23
- "values": {
24
- "text": "Task 1 - fixed",
25
- },
26
- "where": {
27
- "id": "t1",
28
- },
29
- },
30
- "id": "00000000-0000-0000-0000-000000000000",
31
- "mutation": "_Derived_Update_todos",
32
- }
33
- `)
34
-
35
- expect(patchId(todos.delete({ where: { id: 't1' } }))).toMatchInlineSnapshot(`
36
- {
37
- "args": {
38
- "where": {
39
- "id": "t1",
40
- },
41
- },
42
- "id": "00000000-0000-0000-0000-000000000000",
43
- "mutation": "_Derived_Delete_todos",
44
- }
45
- `)
46
- })
47
-
48
- test('app_config', () => {
49
- expect(patchId(appConfig.insert())).toMatchInlineSnapshot(`
50
- {
51
- "args": {
52
- "id": "singleton",
53
- "value": {
54
- "value": undefined,
55
- },
56
- },
57
- "id": "00000000-0000-0000-0000-000000000000",
58
- "mutation": "_Derived_Create_app_config",
59
- }
60
- `)
61
-
62
- expect(patchId(appConfig.insert({ fontSize: 12, theme: 'dark' }))).toMatchInlineSnapshot(`
63
- {
64
- "args": {
65
- "id": "singleton",
66
- "value": {
67
- "value": {
68
- "fontSize": 12,
69
- "theme": "dark",
70
- },
71
- },
72
- },
73
- "id": "00000000-0000-0000-0000-000000000000",
74
- "mutation": "_Derived_Create_app_config",
75
- }
76
- `)
77
-
78
- expect(patchId(appConfig.update({ fontSize: 13 }))).toMatchInlineSnapshot(`
79
- {
80
- "args": {
81
- "values": {
82
- "value": {
83
- "fontSize": 13,
84
- },
85
- },
86
- "where": {
87
- "id": "singleton",
88
- },
89
- },
90
- "id": "00000000-0000-0000-0000-000000000000",
91
- "mutation": "_Derived_Update_app_config",
92
- }
93
- `)
94
- })
95
- })
96
-
97
- const patchId = (muationEvent: MutationEvent.PartialAnyDecoded) => {
98
- // TODO use new id paradigm
99
- const id = `00000000-0000-0000-0000-000000000000`
100
- return { ...muationEvent, id }
101
- }
@@ -1,170 +0,0 @@
1
- import type { GetValForKey } from '@livestore/utils'
2
- import { ReadonlyRecord, Schema } from '@livestore/utils/effect'
3
-
4
- import type { SqliteDsl } from './schema/db-schema/mod.js'
5
- import type * as MutationEvent from './schema/MutationEvent.js'
6
- import { defineMutation } from './schema/mutations.js'
7
- import { getDefaultValuesDecoded } from './schema/schema-helpers.js'
8
- import type * as DbSchema from './schema/table-def.js'
9
- import { deleteRows, insertRow, updateRows } from './sql-queries/sql-queries.js'
10
-
11
- export const makeDerivedMutationDefsForTable = <
12
- TTableDef extends DbSchema.TableDefBase<
13
- DbSchema.DefaultSqliteTableDefConstrained,
14
- DbSchema.TableOptions & { deriveMutations: { enabled: true } }
15
- >,
16
- >(
17
- table: TTableDef,
18
- ) => ({
19
- insert: deriveCreateMutationDef(table),
20
- update: deriveUpdateMutationDef(table),
21
- delete: deriveDeleteMutationDef(table),
22
- })
23
-
24
- export const deriveCreateMutationDef = <
25
- TTableDef extends DbSchema.TableDefBase<
26
- DbSchema.DefaultSqliteTableDefConstrained,
27
- DbSchema.TableOptions & { deriveMutations: { enabled: true } }
28
- >,
29
- >(
30
- table: TTableDef,
31
- ) => {
32
- const tableName = table.sqliteDef.name
33
-
34
- const [optionalFields, requiredColumns] = ReadonlyRecord.partition(
35
- (table.sqliteDef as DbSchema.DefaultSqliteTableDef).columns,
36
- (col) => col.nullable === false && col.default._tag === 'None',
37
- )
38
-
39
- const insertSchema = Schema.Struct(ReadonlyRecord.map(requiredColumns, (col) => col.schema))
40
- .pipe(Schema.extend(Schema.partial(Schema.Struct(ReadonlyRecord.map(optionalFields, (col) => col.schema)))))
41
- .annotations({ title: `${tableName}:Insert` })
42
-
43
- return defineMutation(
44
- `_Derived_Create_${tableName}`,
45
- insertSchema,
46
- ({ id, ...explicitDefaultValues }) => {
47
- const defaultValues = getDefaultValuesDecoded(table, explicitDefaultValues)
48
-
49
- const [sql, bindValues] = insertRow({
50
- tableName: table.sqliteDef.name,
51
- columns: table.sqliteDef.columns,
52
- values: { ...defaultValues, id },
53
- })
54
-
55
- return { sql, bindValues, writeTables: new Set([tableName]) }
56
- },
57
- { clientOnly: table.options.deriveMutations.clientOnly },
58
- )
59
- }
60
-
61
- export const deriveUpdateMutationDef = <
62
- TTableDef extends DbSchema.TableDefBase<
63
- DbSchema.DefaultSqliteTableDefConstrained,
64
- DbSchema.TableOptions & { deriveMutations: { enabled: true } }
65
- >,
66
- >(
67
- table: TTableDef,
68
- ) => {
69
- const tableName = table.sqliteDef.name
70
-
71
- return defineMutation(
72
- `_Derived_Update_${tableName}`,
73
- Schema.Struct({
74
- where: Schema.partial(table.schema),
75
- values: Schema.partial(table.schema),
76
- }).annotations({ title: `${tableName}:Update` }),
77
- ({ where, values }) => {
78
- const [sql, bindValues] = updateRows({
79
- tableName: table.sqliteDef.name,
80
- columns: table.sqliteDef.columns,
81
- where,
82
- updateValues: values,
83
- })
84
-
85
- return { sql, bindValues, writeTables: new Set([tableName]) }
86
- },
87
- { clientOnly: table.options.deriveMutations.clientOnly },
88
- )
89
- }
90
-
91
- export const deriveDeleteMutationDef = <
92
- TTableDef extends DbSchema.TableDefBase<
93
- DbSchema.DefaultSqliteTableDefConstrained,
94
- DbSchema.TableOptions & { deriveMutations: { enabled: true } }
95
- >,
96
- >(
97
- table: TTableDef,
98
- ) => {
99
- const tableName = table.sqliteDef.name
100
-
101
- return defineMutation(
102
- `_Derived_Delete_${tableName}`,
103
- Schema.Struct({
104
- where: Schema.partial(table.schema),
105
- }),
106
- ({ where }) => {
107
- const [sql, bindValues] = deleteRows({
108
- tableName: table.sqliteDef.name,
109
- columns: table.sqliteDef.columns,
110
- where,
111
- })
112
-
113
- return { sql, bindValues, writeTables: new Set([tableName]) }
114
- },
115
- { clientOnly: table.options.deriveMutations.clientOnly },
116
- )
117
- }
118
-
119
- /**
120
- * Convenience helper functions on top of the derived mutation definitions.
121
- */
122
- export type DerivedMutationHelperFns<
123
- TColumns extends SqliteDsl.ConstraintColumns,
124
- TOptions extends DbSchema.TableOptions,
125
- > = {
126
- insert: DerivedMutationHelperFns.InsertMutationFn<TColumns, TOptions>
127
- update: DerivedMutationHelperFns.UpdateMutationFn<TColumns, TOptions>
128
- delete: DerivedMutationHelperFns.DeleteMutationFn<TColumns, TOptions>
129
- // TODO also consider adding upsert and deep json mutations (like lenses)
130
- }
131
-
132
- export namespace DerivedMutationHelperFns {
133
- export type InsertMutationFn<
134
- TColumns extends SqliteDsl.ConstraintColumns,
135
- TOptions extends DbSchema.TableOptions,
136
- > = SqliteDsl.AnyIfConstained<
137
- TColumns,
138
- UseShortcut<TOptions> extends true
139
- ? (
140
- values?: GetValForKey<SqliteDsl.FromColumns.InsertRowDecoded<TColumns>, 'value'>,
141
- ) => MutationEvent.PartialAnyDecoded
142
- : (values: SqliteDsl.FromColumns.InsertRowDecoded<TColumns>) => MutationEvent.PartialAnyDecoded
143
- >
144
-
145
- export type UpdateMutationFn<
146
- TColumns extends SqliteDsl.ConstraintColumns,
147
- TOptions extends DbSchema.TableOptions,
148
- > = SqliteDsl.AnyIfConstained<
149
- TColumns,
150
- UseShortcut<TOptions> extends true
151
- ? (
152
- values: Partial<GetValForKey<SqliteDsl.FromColumns.RowDecoded<TColumns>, 'value'>>,
153
- ) => MutationEvent.PartialAnyDecoded
154
- : (args: {
155
- where: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>>
156
- values: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>>
157
- }) => MutationEvent.PartialAnyDecoded
158
- >
159
-
160
- export type DeleteMutationFn<
161
- TColumns extends SqliteDsl.ConstraintColumns,
162
- _TOptions extends DbSchema.TableOptions,
163
- > = (args: { where: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>> }) => MutationEvent.PartialAnyDecoded
164
-
165
- type UseShortcut<TOptions extends DbSchema.TableOptions> = TOptions['isSingleColumn'] extends true
166
- ? TOptions['isSingleton'] extends true
167
- ? true
168
- : false
169
- : false
170
- }
@@ -1,24 +0,0 @@
1
- import type { SqliteDb } from './adapter-types.js'
2
- import type { LiveStoreSchema } from './schema/mod.js'
3
- import { getDefaultValuesEncoded } from './schema/schema-helpers.js'
4
- import { prepareBindValues, sql } from './util.js'
5
-
6
- export const initializeSingletonTables = (schema: LiveStoreSchema, db: SqliteDb) => {
7
- for (const [, tableDef] of schema.tables) {
8
- if (tableDef.options.isSingleton) {
9
- const defaultValues = getDefaultValuesEncoded(tableDef, undefined)
10
-
11
- const defaultColumnNames = [...Object.keys(defaultValues), 'id']
12
- const columnValues = defaultColumnNames.map((name) => `$${name}`).join(', ')
13
-
14
- const tableName = tableDef.sqliteDef.name
15
- const insertQuery = sql`insert into ${tableName} (${defaultColumnNames.join(
16
- ', ',
17
- )}) select ${columnValues} where not exists(select 1 from ${tableName} where id = 'singleton')`
18
-
19
- const bindValues = prepareBindValues({ ...defaultValues, id: 'singleton' }, insertQuery)
20
-
21
- db.execute(insertQuery, bindValues)
22
- }
23
- }
24
- }
@@ -1,187 +0,0 @@
1
- import { LS_DEV, memoizeByRef, shouldNeverHappen } from '@livestore/utils'
2
- import type { Scope } from '@livestore/utils/effect'
3
- import { Effect, Option, Schema } from '@livestore/utils/effect'
4
-
5
- import type { PreparedBindValues, SqliteDb, SqliteError, UnexpectedError } from '../index.js'
6
- import { getExecArgsFromMutation } from '../mutation.js'
7
- import {
8
- EventId,
9
- getMutationDef,
10
- type LiveStoreSchema,
11
- MUTATION_LOG_META_TABLE,
12
- type MutationEvent,
13
- mutationLogMetaTable,
14
- SESSION_CHANGESET_META_TABLE,
15
- sessionChangesetMetaTable,
16
- } from '../schema/mod.js'
17
- import { insertRow } from '../sql-queries/index.js'
18
- import { execSql, execSqlPrepared } from './connection.js'
19
- import { LeaderThreadCtx } from './types.js'
20
-
21
- export type ApplyMutation = (
22
- mutationEventEncoded: MutationEvent.AnyEncoded,
23
- options?: {
24
- /** Needed for rehydrateFromMutationLog */
25
- skipMutationLog?: boolean
26
- },
27
- ) => Effect.Effect<void, SqliteError | UnexpectedError>
28
-
29
- export const makeApplyMutation: Effect.Effect<ApplyMutation, never, Scope.Scope | LeaderThreadCtx> = Effect.gen(
30
- function* () {
31
- const leaderThreadCtx = yield* LeaderThreadCtx
32
- const shouldExcludeMutationFromLog = makeShouldExcludeMutationFromLog(leaderThreadCtx.schema)
33
-
34
- const mutationDefSchemaHashMap = new Map(
35
- // TODO Running `Schema.hash` can be a bottleneck for larger schemas. There is an opportunity to run this
36
- // at build time and lookup the pre-computed hash at runtime.
37
- // Also see https://github.com/Effect-TS/effect/issues/2719
38
- [...leaderThreadCtx.schema.mutations.map.entries()].map(([k, v]) => [k, Schema.hash(v.schema)] as const),
39
- )
40
-
41
- return (mutationEventEncoded, options) =>
42
- Effect.gen(function* () {
43
- const { schema, dbReadModel: db, dbMutationLog } = leaderThreadCtx
44
- const skipMutationLog = options?.skipMutationLog ?? false
45
-
46
- const mutationName = mutationEventEncoded.mutation
47
- const mutationDef = getMutationDef(schema, mutationName)
48
-
49
- const execArgsArr = getExecArgsFromMutation({
50
- mutationDef,
51
- mutationEvent: { decoded: undefined, encoded: mutationEventEncoded },
52
- })
53
-
54
- // NOTE we might want to bring this back if we want to debug no-op mutations
55
- // const makeExecuteOptions = (statementSql: string, bindValues: any) => ({
56
- // onRowsChanged: (rowsChanged: number) => {
57
- // if (rowsChanged === 0) {
58
- // console.warn(`Mutation "${mutationDef.name}" did not affect any rows:`, statementSql, bindValues)
59
- // }
60
- // },
61
- // })
62
-
63
- // console.group('[@livestore/common:leader-thread:applyMutation]', { mutationName })
64
-
65
- const session = db.session()
66
-
67
- for (const { statementSql, bindValues } of execArgsArr) {
68
- // console.debug(mutationName, statementSql, bindValues)
69
- // TODO use cached prepared statements instead of exec
70
- yield* execSqlPrepared(db, statementSql, bindValues)
71
- }
72
-
73
- const changeset = session.changeset()
74
- session.finish()
75
-
76
- // TODO use prepared statements
77
- yield* execSql(
78
- db,
79
- ...insertRow({
80
- tableName: SESSION_CHANGESET_META_TABLE,
81
- columns: sessionChangesetMetaTable.sqliteDef.columns,
82
- values: {
83
- idGlobal: mutationEventEncoded.id.global,
84
- idClient: mutationEventEncoded.id.client,
85
- // NOTE the changeset will be empty (i.e. null) for no-op mutations
86
- changeset: changeset ?? null,
87
- debug: execArgsArr,
88
- },
89
- }),
90
- )
91
-
92
- // console.groupEnd()
93
-
94
- // write to mutation_log
95
- const excludeFromMutationLog = shouldExcludeMutationFromLog(mutationName, mutationEventEncoded)
96
- if (skipMutationLog === false && excludeFromMutationLog === false) {
97
- yield* insertIntoMutationLog(
98
- mutationEventEncoded,
99
- dbMutationLog,
100
- mutationDefSchemaHashMap,
101
- mutationEventEncoded.clientId,
102
- mutationEventEncoded.sessionId,
103
- )
104
- } else {
105
- // console.debug('[@livestore/common:leader-thread] skipping mutation log write', mutation, statementSql, bindValues)
106
- }
107
- }).pipe(
108
- Effect.withSpan(`@livestore/common:leader-thread:applyMutation`, {
109
- attributes: {
110
- mutationName: mutationEventEncoded.mutation,
111
- mutationId: mutationEventEncoded.id,
112
- 'span.label': `(${mutationEventEncoded.id.global},${mutationEventEncoded.id.client}) ${mutationEventEncoded.mutation}`,
113
- },
114
- }),
115
- // Effect.logDuration('@livestore/common:leader-thread:applyMutation'),
116
- )
117
- },
118
- )
119
-
120
- const insertIntoMutationLog = (
121
- mutationEventEncoded: MutationEvent.AnyEncoded,
122
- dbMutationLog: SqliteDb,
123
- mutationDefSchemaHashMap: Map<string, number>,
124
- clientId: string,
125
- sessionId: string,
126
- ) =>
127
- Effect.gen(function* () {
128
- const mutationName = mutationEventEncoded.mutation
129
- const mutationDefSchemaHash =
130
- mutationDefSchemaHashMap.get(mutationName) ?? shouldNeverHappen(`Unknown mutation: ${mutationName}`)
131
-
132
- if (LS_DEV && mutationEventEncoded.parentId.global !== EventId.ROOT.global) {
133
- const parentMutationExists =
134
- dbMutationLog.select<{ count: number }>(
135
- `SELECT COUNT(*) as count FROM ${MUTATION_LOG_META_TABLE} WHERE idGlobal = ? AND idClient = ?`,
136
- [mutationEventEncoded.parentId.global, mutationEventEncoded.parentId.client] as any as PreparedBindValues,
137
- )[0]!.count === 1
138
-
139
- if (parentMutationExists === false) {
140
- shouldNeverHappen(
141
- `Parent mutation ${mutationEventEncoded.parentId.global},${mutationEventEncoded.parentId.client} does not exist`,
142
- )
143
- }
144
- }
145
-
146
- // TODO use prepared statements
147
- yield* execSql(
148
- dbMutationLog,
149
- ...insertRow({
150
- tableName: MUTATION_LOG_META_TABLE,
151
- columns: mutationLogMetaTable.sqliteDef.columns,
152
- values: {
153
- idGlobal: mutationEventEncoded.id.global,
154
- idClient: mutationEventEncoded.id.client,
155
- parentIdGlobal: mutationEventEncoded.parentId.global,
156
- parentIdClient: mutationEventEncoded.parentId.client,
157
- mutation: mutationEventEncoded.mutation,
158
- argsJson: mutationEventEncoded.args ?? {},
159
- clientId,
160
- sessionId,
161
- schemaHash: mutationDefSchemaHash,
162
- syncMetadataJson: Option.none(),
163
- },
164
- }),
165
- )
166
- })
167
-
168
- // TODO let's consider removing this "should exclude" mechanism in favour of log compaction etc
169
- const makeShouldExcludeMutationFromLog = memoizeByRef((schema: LiveStoreSchema) => {
170
- const migrationOptions = schema.migrationOptions
171
- const mutationLogExclude =
172
- migrationOptions.strategy === 'from-mutation-log'
173
- ? (migrationOptions.excludeMutations ?? new Set(['livestore.RawSql']))
174
- : new Set(['livestore.RawSql'])
175
-
176
- return (mutationName: string, mutationEventEncoded: MutationEvent.AnyEncoded): boolean => {
177
- if (mutationLogExclude.has(mutationName)) return true
178
-
179
- const mutationDef = getMutationDef(schema, mutationName)
180
- const execArgsArr = getExecArgsFromMutation({
181
- mutationDef,
182
- mutationEvent: { decoded: undefined, encoded: mutationEventEncoded },
183
- })
184
-
185
- return execArgsArr.some((_) => _.statementSql.includes('__livestore'))
186
- }
187
- })
@@ -1,49 +0,0 @@
1
- import { Effect, Schema } from '@livestore/utils/effect'
2
-
3
- import type { SqliteDb } from '../adapter-types.js'
4
- import * as EventId from '../schema/EventId.js'
5
- import type * as MutationEvent from '../schema/MutationEvent.js'
6
- import { MUTATION_LOG_META_TABLE, mutationLogMetaTable, SYNC_STATUS_TABLE } from '../schema/system-tables.js'
7
- import { prepareBindValues, sql } from '../util.js'
8
- import { LeaderThreadCtx } from './types.js'
9
-
10
- /** Exclusive of the "since event" */
11
- export const getMutationEventsSince = (
12
- since: EventId.EventId,
13
- ): Effect.Effect<ReadonlyArray<MutationEvent.AnyEncoded>, never, LeaderThreadCtx> =>
14
- Effect.gen(function* () {
15
- const { dbMutationLog } = yield* LeaderThreadCtx
16
-
17
- const query = mutationLogMetaTable.query.where('idGlobal', '>=', since.global).asSql()
18
- const pendingMutationEventsRaw = dbMutationLog.select(query.query, prepareBindValues(query.bindValues, query.query))
19
- const pendingMutationEvents = Schema.decodeUnknownSync(mutationLogMetaTable.schema.pipe(Schema.Array))(
20
- pendingMutationEventsRaw,
21
- )
22
-
23
- return pendingMutationEvents
24
- .map((_) => ({
25
- mutation: _.mutation,
26
- args: _.argsJson,
27
- id: { global: _.idGlobal, client: _.idClient },
28
- parentId: { global: _.parentIdGlobal, client: _.parentIdClient },
29
- clientId: _.clientId,
30
- sessionId: _.sessionId,
31
- }))
32
- .filter((_) => EventId.compare(_.id, since) > 0)
33
- })
34
-
35
- export const getClientHeadFromDb = (dbMutationLog: SqliteDb): EventId.EventId => {
36
- const res = dbMutationLog.select<{ idGlobal: EventId.GlobalEventId; idClient: EventId.ClientEventId }>(
37
- sql`select idGlobal, idClient from ${MUTATION_LOG_META_TABLE} order by idGlobal DESC, idClient DESC limit 1`,
38
- )[0]
39
-
40
- return res ? { global: res.idGlobal, client: res.idClient } : EventId.ROOT
41
- }
42
-
43
- export const getBackendHeadFromDb = (dbMutationLog: SqliteDb): EventId.GlobalEventId =>
44
- dbMutationLog.select<{ head: EventId.GlobalEventId }>(sql`select head from ${SYNC_STATUS_TABLE}`)[0]?.head ??
45
- EventId.ROOT.global
46
-
47
- // TODO use prepared statements
48
- export const updateBackendHead = (dbMutationLog: SqliteDb, head: EventId.EventId) =>
49
- dbMutationLog.execute(sql`UPDATE ${SYNC_STATUS_TABLE} SET head = ${head.global}`)
@@ -1,67 +0,0 @@
1
- import { Effect, Queue } from '@livestore/utils/effect'
2
-
3
- import * as MutationEvent from '../schema/MutationEvent.js'
4
- import { getMutationEventsSince } from './mutationlog.js'
5
- import { LeaderThreadCtx, type PullQueueItem, type PullQueueSet } from './types.js'
6
-
7
- export const makePullQueueSet = Effect.gen(function* () {
8
- const set = new Set<Queue.Queue<PullQueueItem>>()
9
-
10
- yield* Effect.addFinalizer(() =>
11
- Effect.gen(function* () {
12
- for (const queue of set) {
13
- yield* Queue.shutdown(queue)
14
- }
15
-
16
- set.clear()
17
- }),
18
- )
19
-
20
- const makeQueue: PullQueueSet['makeQueue'] = (since) =>
21
- Effect.gen(function* () {
22
- const queue = yield* Queue.unbounded<PullQueueItem>().pipe(Effect.acquireRelease(Queue.shutdown))
23
-
24
- yield* Effect.addFinalizer(() => Effect.sync(() => set.delete(queue)))
25
-
26
- const mutationEvents = yield* getMutationEventsSince(since)
27
-
28
- if (mutationEvents.length > 0) {
29
- const newEvents = mutationEvents.map((mutationEvent) => new MutationEvent.EncodedWithMeta(mutationEvent))
30
- yield* queue.offer({ payload: { _tag: 'upstream-advance', newEvents }, remaining: 0 })
31
- }
32
-
33
- set.add(queue)
34
-
35
- return queue
36
- })
37
-
38
- const offer: PullQueueSet['offer'] = (item) =>
39
- Effect.gen(function* () {
40
- // Short-circuit if the payload is an empty upstream advance
41
- if (
42
- item.payload._tag === 'upstream-advance' &&
43
- item.payload.newEvents.length === 0 &&
44
- item.payload.trimRollbackUntil === undefined
45
- ) {
46
- return
47
- }
48
-
49
- const { clientId } = yield* LeaderThreadCtx
50
- if (clientId === 'client-b') {
51
- // console.log(
52
- // 'offer',
53
- // item.payload._tag,
54
- // item.payload.newEvents.map((_) => _.toJSON()),
55
- // )
56
- }
57
-
58
- for (const queue of set) {
59
- yield* Queue.offer(queue, item)
60
- }
61
- })
62
-
63
- return {
64
- makeQueue,
65
- offer,
66
- }
67
- })